/* SPDX-License-Identifier: GPL-2.0-only */ | |
/* | |
* arch/arm/lib/call_with_stack.S | |
* | |
* Copyright (C) 2011 ARM Ltd. | |
* Written by Will Deacon <will.deacon@arm.com> | |
*/ | |
#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) |