mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 07:02:06 +00:00 
			
		
		
		
	 e814d826dc
			
		
	
	
		e814d826dc
		
	
	
	
	
		
			
			The patch adds the ENDPROC declarations for the __copy_to_user_std and __clear_user_std functions. Without these, the compiler generates BXL to ARM when compiling the kernel in Thumb-2 mode. Reported-by: Kyungmin Park <kmpark@infradead.org> Tested-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Acked-by: Nicolas Pitre <nico@fluxnic.net> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  *  linux/arch/arm/lib/copy_to_user.S
 | |
|  *
 | |
|  *  Author:	Nicolas Pitre
 | |
|  *  Created:	Sep 29, 2005
 | |
|  *  Copyright:	MontaVista Software, Inc.
 | |
|  *
 | |
|  *  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>
 | |
| 
 | |
| /*
 | |
|  * Prototype:
 | |
|  *
 | |
|  *	size_t __copy_to_user(void *to, const void *from, size_t n)
 | |
|  *
 | |
|  * Purpose:
 | |
|  *
 | |
|  *	copy a block to user memory from kernel memory
 | |
|  *
 | |
|  * Params:
 | |
|  *
 | |
|  *	to = user memory
 | |
|  *	from = kernel memory
 | |
|  *	n = number of bytes to copy
 | |
|  *
 | |
|  * Return value:
 | |
|  *
 | |
|  *	Number of bytes NOT copied.
 | |
|  */
 | |
| 
 | |
| #define LDR1W_SHIFT	0
 | |
| #ifndef CONFIG_THUMB2_KERNEL
 | |
| #define STR1W_SHIFT	0
 | |
| #else
 | |
| #define STR1W_SHIFT	1
 | |
| #endif
 | |
| 
 | |
| 	.macro ldr1w ptr reg abort
 | |
| 	W(ldr) \reg, [\ptr], #4
 | |
| 	.endm
 | |
| 
 | |
| 	.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
 | |
| 	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
 | |
| 	.endm
 | |
| 
 | |
| 	.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 | |
| 	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
 | |
| 	.endm
 | |
| 
 | |
| 	.macro ldr1b ptr reg cond=al abort
 | |
| 	ldr\cond\()b \reg, [\ptr], #1
 | |
| 	.endm
 | |
| 
 | |
| 	.macro str1w ptr reg abort
 | |
| 	strusr	\reg, \ptr, 4, abort=\abort
 | |
| 	.endm
 | |
| 
 | |
| 	.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
 | |
| 	str1w \ptr, \reg1, \abort
 | |
| 	str1w \ptr, \reg2, \abort
 | |
| 	str1w \ptr, \reg3, \abort
 | |
| 	str1w \ptr, \reg4, \abort
 | |
| 	str1w \ptr, \reg5, \abort
 | |
| 	str1w \ptr, \reg6, \abort
 | |
| 	str1w \ptr, \reg7, \abort
 | |
| 	str1w \ptr, \reg8, \abort
 | |
| 	.endm
 | |
| 
 | |
| 	.macro str1b ptr reg cond=al abort
 | |
| 	strusr	\reg, \ptr, 1, \cond, abort=\abort
 | |
| 	.endm
 | |
| 
 | |
| 	.macro enter reg1 reg2
 | |
| 	mov	r3, #0
 | |
| 	stmdb	sp!, {r0, r2, r3, \reg1, \reg2}
 | |
| 	.endm
 | |
| 
 | |
| 	.macro exit reg1 reg2
 | |
| 	add	sp, sp, #8
 | |
| 	ldmfd	sp!, {r0, \reg1, \reg2}
 | |
| 	.endm
 | |
| 
 | |
| 	.text
 | |
| 
 | |
| ENTRY(__copy_to_user_std)
 | |
| WEAK(__copy_to_user)
 | |
| 
 | |
| #include "copy_template.S"
 | |
| 
 | |
| ENDPROC(__copy_to_user)
 | |
| ENDPROC(__copy_to_user_std)
 | |
| 
 | |
| 	.pushsection .fixup,"ax"
 | |
| 	.align 0
 | |
| 	copy_abort_preamble
 | |
| 	ldmfd	sp!, {r1, r2, r3}
 | |
| 	sub	r0, r0, r1
 | |
| 	rsb	r0, r0, r2
 | |
| 	copy_abort_end
 | |
| 	.popsection
 | |
| 
 |