 465ca5d6a0
			
		
	
	
	465ca5d6a0
	
	
	
		
			
			This corrects assembler warnings and broken code generated in __strncpy_from_user_asm: arch/mips/lib/strncpy_user.S: Assembler messages: arch/mips/lib/strncpy_user.S:52: Warning: Macro instruction expanded into multiple instructions in a branch delay slot with the CPU_DADDI_WORKAROUNDS option set. The function schedules delay slots manually where there is really no need to as GAS is happy to do it all itself, so undo it all and remove `.set noreorder'. Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/6685/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
		
			
				
	
	
		
			84 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * This file is subject to the terms and conditions of the GNU General Public
 | |
|  * License.  See the file "COPYING" in the main directory of this archive
 | |
|  * for more details.
 | |
|  *
 | |
|  * Copyright (C) 1996, 1999 by Ralf Baechle
 | |
|  * Copyright (C) 2011 MIPS Technologies, Inc.
 | |
|  */
 | |
| #include <linux/errno.h>
 | |
| #include <asm/asm.h>
 | |
| #include <asm/asm-offsets.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.
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * 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
 | |
|  * it happens at most some bytes of the exceptions handlers will be copied.
 | |
|  */
 | |
| 
 | |
| 	.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\@
 | |
| 
 | |
| FEXPORT(__strncpy_from_\func\()_nocheck_asm)
 | |
| 	move		t0, zero
 | |
| 	move		v1, a1
 | |
| .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
 | |
| 	PTR_ADDIU	t0, 1
 | |
| 	PTR_ADDIU	a0, 1
 | |
| 	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_\func\()_asm)
 | |
| 
 | |
| .Lfault\@:
 | |
| 	li		v0, -EFAULT
 | |
| 	jr		ra
 | |
| 
 | |
| 	.section	__ex_table,"a"
 | |
| 	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
 |