diff options
Diffstat (limited to 'arch/mips/lib/strlen_user.S')
| -rw-r--r-- | arch/mips/lib/strlen_user.S | 36 | 
1 files changed, 30 insertions, 6 deletions
diff --git a/arch/mips/lib/strlen_user.S b/arch/mips/lib/strlen_user.S index e362dcdc69d..bef65c98df5 100644 --- a/arch/mips/lib/strlen_user.S +++ b/arch/mips/lib/strlen_user.S @@ -22,19 +22,43 @@   *   * Return 0 for error   */ -LEAF(__strlen_user_asm) +	.macro __BUILD_STRLEN_ASM func +LEAF(__strlen_\func\()_asm)  	LONG_L		v0, TI_ADDR_LIMIT($28)	# pointer ok?  	and		v0, a0 -	bnez		v0, .Lfault +	bnez		v0, .Lfault\@ -FEXPORT(__strlen_user_nocheck_asm) +FEXPORT(__strlen_\func\()_nocheck_asm)  	move		v0, a0 -1:	EX(lbu, v1, (v0), .Lfault) +.ifeqs "\func", "kernel" +1:	EX(lbu, v1, (v0), .Lfault\@) +.else +1:	EX(lbue, v1, (v0), .Lfault\@) +.endif  	PTR_ADDIU	v0, 1  	bnez		v1, 1b  	PTR_SUBU	v0, a0  	jr		ra -	END(__strlen_user_asm) +	END(__strlen_\func\()_asm) -.Lfault:	move		v0, zero +.Lfault\@:	move		v0, zero  	jr		ra +	.endm + +#ifndef CONFIG_EVA +	/* Set aliases */ +	.global __strlen_user_asm +	.global __strlen_user_nocheck_asm +	.set __strlen_user_asm, __strlen_kernel_asm +	.set __strlen_user_nocheck_asm, __strlen_kernel_nocheck_asm +#endif + +__BUILD_STRLEN_ASM kernel + +#ifdef CONFIG_EVA + +	.set push +	.set eva +__BUILD_STRLEN_ASM user +	.set pop +#endif  | 
