Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm/lib/call_with_stack.S
26292 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* arch/arm/lib/call_with_stack.S
4
*
5
* Copyright (C) 2011 ARM Ltd.
6
* Written by Will Deacon <[email protected]>
7
*/
8
9
#include <linux/linkage.h>
10
#include <asm/assembler.h>
11
#include <asm/unwind.h>
12
13
/*
14
* void call_with_stack(void (*fn)(void *), void *arg, void *sp)
15
*
16
* Change the stack to that pointed at by sp, then invoke fn(arg) with
17
* the new stack.
18
*
19
* The sequence below follows the APCS frame convention for frame pointer
20
* unwinding, and implements the unwinder annotations needed by the EABI
21
* unwinder.
22
*/
23
24
ENTRY(call_with_stack)
25
#if defined(CONFIG_UNWINDER_FRAME_POINTER) && defined(CONFIG_CC_IS_GCC)
26
mov ip, sp
27
push {fp, ip, lr, pc}
28
sub fp, ip, #4
29
#else
30
UNWIND( .fnstart )
31
UNWIND( .save {fpreg, lr} )
32
push {fpreg, lr}
33
UNWIND( .setfp fpreg, sp )
34
mov fpreg, sp
35
#endif
36
mov sp, r2
37
mov r2, r0
38
mov r0, r1
39
40
bl_r r2
41
42
#if defined(CONFIG_UNWINDER_FRAME_POINTER) && defined(CONFIG_CC_IS_GCC)
43
ldmdb fp, {fp, sp, pc}
44
#else
45
mov sp, fpreg
46
pop {fpreg, pc}
47
UNWIND( .fnend )
48
#endif
49
.globl call_with_stack_end
50
call_with_stack_end:
51
ENDPROC(call_with_stack)
52
53