diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1998-05-04 09:12:48 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1998-05-04 09:12:48 +0000 |
commit | 2e0f55e79c49509b7ff70ff1a10e1e9e90a3dfd4 (patch) | |
tree | 9ff1a23dd500f1c70eb99fcd688d47d38abb0253 /arch/mips/lib/strncpy_user.S | |
parent | bbc6b4b59f51131f040a752cbe20a1805db08b0b (diff) |
o New memset. Fastest in town for size > 6 bytes.
o New clear_user.
o Memcpy now efficiently copies the (src^dest)&3 != 0.
o Memmove new correctly deals with overlaps
o Rewrite csum_partial in assembler.
o Rewrte csum_partial_from_user in assembler.
o __copy_user is now integrated with memcpy.
o get_user now returns a zero value on error.
o copy_from_user now clears the destination buffer on error.
o strncpy_user now has a more efficient caller routine.
o strlen_user now has a more efficient caller routines and is faster.
o The unaligned handler is now much cleaner. It's now also save from
interrupt. Some more esotheric bugs fixed as well.
o Don't export bcopy anymore, it's now a inline function.
o Delete ancient junk from the first days of Linux/MIPS.
o Delete dead code in indy_sc.c.
o Including the IDE driver doesn't crash an Indy anymore.
o Eleminate active_ds. We now use current_ds directly in the thread
structure which is faster and threadsafe. Saves almost 2kb on the
kernel.
o Serial console should work again.
Diffstat (limited to 'arch/mips/lib/strncpy_user.S')
-rw-r--r-- | arch/mips/lib/strncpy_user.S | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/arch/mips/lib/strncpy_user.S b/arch/mips/lib/strncpy_user.S index f942740e6..f3240475a 100644 --- a/arch/mips/lib/strncpy_user.S +++ b/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.3 1998/05/03 11:13:45 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) +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 +fault: li v0,-EFAULT + jr ra - .section __ex_table,"a" - PTR 1b,fault - .previous + .section __ex_table,"a" + PTR 1b,fault + .previous |