diff options
Diffstat (limited to 'arch/mips/lib/strnlen_user.S')
| -rw-r--r-- | arch/mips/lib/strnlen_user.S | 36 | 
1 files changed, 30 insertions, 6 deletions
diff --git a/arch/mips/lib/strnlen_user.S b/arch/mips/lib/strnlen_user.S index fcacea5e61f..f3af6995e2a 100644 --- a/arch/mips/lib/strnlen_user.S +++ b/arch/mips/lib/strnlen_user.S @@ -25,22 +25,46 @@   *	 bytes.	 There's nothing secret there.	On 64-bit accessing beyond   *	 the maximum is a tad hairier ...   */ -LEAF(__strnlen_user_asm) +	.macro __BUILD_STRNLEN_ASM func +LEAF(__strnlen_\func\()_asm)  	LONG_L		v0, TI_ADDR_LIMIT($28)	# pointer ok?  	and		v0, a0 -	bnez		v0, .Lfault +	bnez		v0, .Lfault\@ -FEXPORT(__strnlen_user_nocheck_asm) +FEXPORT(__strnlen_\func\()_nocheck_asm)  	move		v0, a0  	PTR_ADDU	a1, a0			# stop pointer  1:	beq		v0, a1, 1f		# limit reached? -	EX(lb, t0, (v0), .Lfault) +.ifeqs "\func", "kernel" +	EX(lb, t0, (v0), .Lfault\@) +.else +	EX(lbe, t0, (v0), .Lfault\@) +.endif  	PTR_ADDIU	v0, 1  	bnez		t0, 1b  1:	PTR_SUBU	v0, a0  	jr		ra -	END(__strnlen_user_asm) +	END(__strnlen_\func\()_asm) -.Lfault: +.Lfault\@:  	move		v0, zero  	jr		ra +	.endm + +#ifndef CONFIG_EVA +	/* Set aliases */ +	.global __strnlen_user_asm +	.global __strnlen_user_nocheck_asm +	.set __strnlen_user_asm, __strnlen_kernel_asm +	.set __strnlen_user_nocheck_asm, __strnlen_kernel_nocheck_asm +#endif + +__BUILD_STRNLEN_ASM kernel + +#ifdef CONFIG_EVA + +	.set push +	.set eva +__BUILD_STRNLEN_ASM user +	.set pop +#endif  | 
