Module Name: src
Committed By: chs
Date: Wed Jul 7 01:21:47 UTC 2010
Modified Files:
src/sys/arch/mips/mips: copy.S
Log Message:
set error return value for user addresses in kernel space.
(this fixes a bug in my previous checkin here.)
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/mips/mips/copy.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/mips/copy.S
diff -u src/sys/arch/mips/mips/copy.S:1.9 src/sys/arch/mips/mips/copy.S:1.10
--- src/sys/arch/mips/mips/copy.S:1.9 Sat Mar 20 23:31:29 2010
+++ src/sys/arch/mips/mips/copy.S Wed Jul 7 01:21:47 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: copy.S,v 1.9 2010/03/20 23:31:29 chs Exp $ */
+/* $NetBSD: copy.S,v 1.10 2010/07/07 01:21:47 chs Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -100,7 +100,7 @@
LEAF(copyinstr)
PTR_L v1, L_PCB(MIPS_CURLWP)
PTR_LA v0, _C_LABEL(copystrerr)
- blt a0, zero, _C_LABEL(copystrerr)
+ blt a0, zero, _C_LABEL(copystrefault)
PTR_S v0, PCB_ONFAULT(v1)
move t0, a2
beq a2, zero, 4f
@@ -134,7 +134,7 @@
LEAF(copyoutstr)
PTR_L v1, L_PCB(MIPS_CURLWP)
PTR_LA v0, _C_LABEL(copystrerr)
- blt a1, zero, _C_LABEL(copystrerr)
+ blt a1, zero, _C_LABEL(copystrefault)
PTR_S v0, PCB_ONFAULT(v1)
move t0, a2
beq a2, zero, 4f
@@ -163,6 +163,11 @@
PTR_S zero, PCB_ONFAULT(v1)
END(copystrerr)
+LEAF(copystrefault)
+ b copystrerr
+ li v0, EFAULT
+END(copystrefault)
+
/*
* kcopy(const void *src, void *dst, size_t len);
*
@@ -216,7 +221,7 @@
PTR_SUBU sp, sp, CALLFRAME_SIZ
.mask 0x80000000, -4
REG_S ra, CALLFRAME_RA(sp)
- blt a0, zero, _C_LABEL(copyerr)
+ blt a0, zero, _C_LABEL(copyefault)
move v0, a0 # swap a0, a1 for call to memcpy
move a0, a1
move a1, v0
@@ -243,7 +248,7 @@
PTR_SUBU sp, sp, CALLFRAME_SIZ
.mask 0x80000000, -4
REG_S ra, CALLFRAME_RA(sp)
- blt a1, zero, _C_LABEL(copyerr)
+ blt a1, zero, _C_LABEL(copyefault)
move v0, a0 # swap a0, a1 for call to memcpy
move a0, a1
move a1, v0
@@ -268,6 +273,11 @@
PTR_S zero, PCB_ONFAULT(v1)
END(copyerr)
+LEAF(copyefault)
+ b copyerr
+ li v0, EFAULT
+END(copyefault)
+
/*
* int fuswintr(void *)
* Fetches a short word of data from the user-space address.