diff options
Diffstat (limited to 'arch/mips/lib/strncpy_user.S')
| -rw-r--r-- | arch/mips/lib/strncpy_user.S | 63 | 
1 files changed, 44 insertions, 19 deletions
diff --git a/arch/mips/lib/strncpy_user.S b/arch/mips/lib/strncpy_user.S index 7201b2ff08c..3c32baf8b49 100644 --- a/arch/mips/lib/strncpy_user.S +++ b/arch/mips/lib/strncpy_user.S @@ -3,7 +3,8 @@   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * Copyright (c) 1996, 1999 by Ralf Baechle + * Copyright (C) 1996, 1999 by Ralf Baechle + * Copyright (C) 2011 MIPS Technologies, Inc.   */  #include <linux/errno.h>  #include <asm/asm.h> @@ -23,37 +24,61 @@  /*   * Ugly special case have to check: we might get passed a user space - * pointer which wraps into the kernel space.  We don't deal with that.  If + * 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_asm) +	.macro __BUILD_STRNCPY_ASM func +LEAF(__strncpy_from_\func\()_asm)  	LONG_L		v0, TI_ADDR_LIMIT($28)	# pointer ok?  	and		v0, a1 -	bnez		v0, .Lfault +	bnez		v0, .Lfault\@ -FEXPORT(__strncpy_from_user_nocheck_asm) -	move		v0, zero +FEXPORT(__strncpy_from_\func\()_nocheck_asm) +	move		t0, zero  	move		v1, a1 -	.set		noreorder -1:	EX(lbu, t0, (v1), .Lfault) +.ifeqs "\func","kernel" +1:	EX(lbu, v0, (v1), .Lfault\@) +.else +1:	EX(lbue, v0, (v1), .Lfault\@) +.endif  	PTR_ADDIU	v1, 1  	R10KCBARRIER(0(ra)) -	beqz		t0, 2f -	 sb		t0, (a0) -	PTR_ADDIU	v0, 1 -	.set		reorder +	sb		v0, (a0) +	beqz		v0, 2f +	PTR_ADDIU	t0, 1  	PTR_ADDIU	a0, 1 -	bne		v0, a2, 1b -2:	PTR_ADDU	t0, a1, v0 -	xor		t0, a1 -	bltz		t0, .Lfault +	bne		t0, a2, 1b +2:	PTR_ADDU	v0, a1, t0 +	xor		v0, a1 +	bltz		v0, .Lfault\@ +	move		v0, t0  	jr		ra			# return n -	END(__strncpy_from_user_asm) +	END(__strncpy_from_\func\()_asm) -.Lfault:	li		v0, -EFAULT +.Lfault\@: +	li		v0, -EFAULT  	jr		ra  	.section	__ex_table,"a" -	PTR		1b, .Lfault +	PTR		1b, .Lfault\@  	.previous + +	.endm + +#ifndef CONFIG_EVA +	/* Set aliases */ +	.global __strncpy_from_user_asm +	.global __strncpy_from_user_nocheck_asm +	.set __strncpy_from_user_asm, __strncpy_from_kernel_asm +	.set __strncpy_from_user_nocheck_asm, __strncpy_from_kernel_nocheck_asm +#endif + +__BUILD_STRNCPY_ASM kernel + +#ifdef CONFIG_EVA +	.set push +	.set eva +__BUILD_STRNCPY_ASM user +	.set pop +#endif  | 
