mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 22:26:12 +00:00 
			
		
		
		
	 a1f98849fd
			
		
	
	
		a1f98849fd
		
	
	
	
	
		
			
			This allows for optional alternative implementations of __copy_to_user and __clear_user, with a possible runtime fallback to the standard version when the alternative provides no gain over that standard version. This is done by making the standard __copy_to_user into a weak alias for the symbol __copy_to_user_std. Same thing for __clear_user. Those two functions are particularly good candidates to have alternative implementations for, since they rely on the STRT instruction which has lower performances than STM instructions on some CPU cores such as the ARM1176 and Marvell Feroceon. Signed-off-by: Nicolas Pitre <nico@marvell.com>
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  *  linux/arch/arm/lib/clear_user.S
 | |
|  *
 | |
|  *  Copyright (C) 1995, 1996,1997,1998 Russell King
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License version 2 as
 | |
|  * published by the Free Software Foundation.
 | |
|  */
 | |
| #include <linux/linkage.h>
 | |
| #include <asm/assembler.h>
 | |
| 
 | |
| 		.text
 | |
| 
 | |
| /* Prototype: int __clear_user(void *addr, size_t sz)
 | |
|  * Purpose  : clear some user memory
 | |
|  * Params   : addr - user memory address to clear
 | |
|  *          : sz   - number of bytes to clear
 | |
|  * Returns  : number of bytes NOT cleared
 | |
|  */
 | |
| ENTRY(__clear_user_std)
 | |
| WEAK(__clear_user)
 | |
| 		stmfd	sp!, {r1, lr}
 | |
| 		mov	r2, #0
 | |
| 		cmp	r1, #4
 | |
| 		blt	2f
 | |
| 		ands	ip, r0, #3
 | |
| 		beq	1f
 | |
| 		cmp	ip, #2
 | |
| USER(		strbt	r2, [r0], #1)
 | |
| USER(		strlebt	r2, [r0], #1)
 | |
| USER(		strltbt	r2, [r0], #1)
 | |
| 		rsb	ip, ip, #4
 | |
| 		sub	r1, r1, ip		@  7  6  5  4  3  2  1
 | |
| 1:		subs	r1, r1, #8		@ -1 -2 -3 -4 -5 -6 -7
 | |
| USER(		strplt	r2, [r0], #4)
 | |
| USER(		strplt	r2, [r0], #4)
 | |
| 		bpl	1b
 | |
| 		adds	r1, r1, #4		@  3  2  1  0 -1 -2 -3
 | |
| USER(		strplt	r2, [r0], #4)
 | |
| 2:		tst	r1, #2			@ 1x 1x 0x 0x 1x 1x 0x
 | |
| USER(		strnebt	r2, [r0], #1)
 | |
| USER(		strnebt	r2, [r0], #1)
 | |
| 		tst	r1, #1			@ x1 x0 x1 x0 x1 x0 x1
 | |
| USER(		strnebt	r2, [r0])
 | |
| 		mov	r0, #0
 | |
| 		ldmfd	sp!, {r1, pc}
 | |
| ENDPROC(__clear_user)
 | |
| 
 | |
| 		.section .fixup,"ax"
 | |
| 		.align	0
 | |
| 9001:		ldmfd	sp!, {r0, pc}
 | |
| 		.previous
 | |
| 
 |