forked from Minki/linux
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>
45 lines
1.2 KiB
ArmAsm
45 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)
|