 14327c6628
			
		
	
	
	14327c6628
	
	
	
		
			
			BSYM() was invented to allow us to work around a problem with the assembler, where local symbols resolved by the assembler for the 'adr' instruction did not take account of their ISA. Since we don't want BSYM() used elsewhere, replace BSYM() with a new macro 'badr', which is like the 'adr' pseudo-op, but with the BSYM() mechanics integrated into it. This ensures that the BSYM()-ification is only used in conjunction with 'adr'. Acked-by: Dave Martin <Dave.Martin@arm.com> Acked-by: Nicolas Pitre <nico@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
		
			
				
	
	
		
			44 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * arch/arm/lib/call_with_stack.S
 | |
|  *
 | |
|  * Copyright (C) 2011 ARM Ltd.
 | |
|  * Written by Will Deacon <will.deacon@arm.com>
 | |
|  *
 | |
|  * 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.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program; if not, write to the Free Software
 | |
|  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 | |
|  */
 | |
| 
 | |
| #include <linux/linkage.h>
 | |
| #include <asm/assembler.h>
 | |
| 
 | |
| /*
 | |
|  * void call_with_stack(void (*fn)(void *), void *arg, void *sp)
 | |
|  *
 | |
|  * Change the stack to that pointed at by sp, then invoke fn(arg) with
 | |
|  * the new stack.
 | |
|  */
 | |
| ENTRY(call_with_stack)
 | |
| 	str	sp, [r2, #-4]!
 | |
| 	str	lr, [r2, #-4]!
 | |
| 
 | |
| 	mov	sp, r2
 | |
| 	mov	r2, r0
 | |
| 	mov	r0, r1
 | |
| 
 | |
| 	badr	lr, 1f
 | |
| 	ret	r2
 | |
| 
 | |
| 1:	ldr	lr, [sp]
 | |
| 	ldr	sp, [sp, #4]
 | |
| 	ret	lr
 | |
| ENDPROC(call_with_stack)
 |