diff options
Diffstat (limited to 'arch/mips/lib/strncpy_user.S')
| -rw-r--r-- | arch/mips/lib/strncpy_user.S | 51 | 
1 files changed, 37 insertions, 14 deletions
diff --git a/arch/mips/lib/strncpy_user.S b/arch/mips/lib/strncpy_user.S index 92870b6b53e..3c32baf8b49 100644 --- a/arch/mips/lib/strncpy_user.S +++ b/arch/mips/lib/strncpy_user.S @@ -28,34 +28,57 @@   * 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) -	.set		noreorder +FEXPORT(__strncpy_from_\func\()_nocheck_asm)  	move		t0, zero  	move		v1, a1 -1:	EX(lbu, v0, (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)) +	sb		v0, (a0)  	beqz		v0, 2f -	 sb		v0, (a0)  	PTR_ADDIU	t0, 1 +	PTR_ADDIU	a0, 1  	bne		t0, a2, 1b -	 PTR_ADDIU	a0, 1  2:	PTR_ADDU	v0, a1, t0  	xor		v0, a1 -	bltz		v0, .Lfault -	 nop +	bltz		v0, .Lfault\@ +	move		v0, t0  	jr		ra			# return n -	 move		v0, t0 -	END(__strncpy_from_user_asm) +	END(__strncpy_from_\func\()_asm) -.Lfault: jr		ra -	  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  | 
