patch-2.1.101 linux/arch/mips/lib/strncpy_user.S

Next file: linux/arch/mips/mm/andes.c
Previous file: linux/arch/mips/lib/strlen_user.S
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.100/linux/arch/mips/lib/strncpy_user.S linux/arch/mips/lib/strncpy_user.S
@@ -6,12 +6,20 @@
  * for more details.
  *
  * Copyright (c) 1996 by Ralf Baechle
+ *
+ * $Id: strncpy_user.S,v 1.2 1998/05/04 09:18:22 ralf Exp $
  */
 #include <linux/errno.h>
-
 #include <asm/asm.h>
+#include <asm/offset.h>
 #include <asm/regdef.h>
 
+#define EX(insn,reg,addr,handler)			\
+9:	insn	reg, addr;				\
+	.section __ex_table,"a";			\
+	PTR	9b, handler;				\
+	.previous
+
 /*
  * Returns: -EFAULT if exception before terminator, N if the entire
  * buffer filled, else strlen.
@@ -19,30 +27,37 @@
 
 /*
  * Ugly special case have to check: we might get passed a user space
- * pointer which wraps into the kernel space ...
+ * pointer which wraps into the kernel space.  We don't deal with that.  If
+ * it happens at most some bytes of the exceptions handlers will be copied.
  */
 
-LEAF(__strncpy_from_user)
-		move		v0,zero
-		move		v1,a1
-		.set		noreorder
-1:		lbu		t0,(v1)
-		LONG_ADDIU	v1,1
-		beqz		t0,2f
-		sb		t0,(a0)		# delay slot
-		LONG_ADDIU	v0,1
-		bne		v0,a2,1b
-		LONG_ADDIU	a0,1		# delay slot
-		.set		reorder
-2:		LONG_ADDU	t0,a1,v0
-		xor		t0,a1
-		bltz		t0,fault
-		jr		ra		# return n
-		END(__strncpy_from_user)
-
-fault:		li		v0,-EFAULT
-		jr		ra
-
-		.section	__ex_table,"a"
-		PTR		1b,fault
-		.previous
+LEAF(__strncpy_from_user_asm)
+	lw	v0, THREAD_CURDS($28)		# pointer ok?
+	subu	v0, zero, v0
+	and	v0, a1
+	nor	v0, zero, v0
+	beqz	v0, fault
+EXPORT(__strncpy_from_user_nocheck_asm)
+	move		v0,zero
+	move		v1,a1
+	.set		noreorder
+1:	EX(lbu,	 t0, (v1), fault)
+	LONG_ADDIU	v1,1
+	beqz		t0,2f
+	 sb		t0,(a0)
+	LONG_ADDIU	v0,1
+	bne		v0,a2,1b
+	 LONG_ADDIU	a0,1
+	.set		reorder
+2:	LONG_ADDU	t0,a1,v0
+	xor		t0,a1
+	bltz		t0,fault
+	jr		ra			# return n
+	END(__strncpy_from_user_asm)
+
+fault:	li		v0,-EFAULT
+	jr		ra
+
+	.section	__ex_table,"a"
+	PTR		1b,fault
+	.previous

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov