0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/linkage.h>
0010 #include <asm/assembler.h>
0011 #include <asm/unwind.h>
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 ENTRY(call_with_stack)
0025 #if defined(CONFIG_UNWINDER_FRAME_POINTER) && defined(CONFIG_CC_IS_GCC)
0026 mov ip, sp
0027 push {fp, ip, lr, pc}
0028 sub fp, ip, #4
0029 #else
0030 UNWIND( .fnstart )
0031 UNWIND( .save {fpreg, lr} )
0032 push {fpreg, lr}
0033 UNWIND( .setfp fpreg, sp )
0034 mov fpreg, sp
0035 #endif
0036 mov sp, r2
0037 mov r2, r0
0038 mov r0, r1
0039
0040 bl_r r2
0041
0042 #if defined(CONFIG_UNWINDER_FRAME_POINTER) && defined(CONFIG_CC_IS_GCC)
0043 ldmdb fp, {fp, sp, pc}
0044 #else
0045 mov sp, fpreg
0046 pop {fpreg, pc}
0047 UNWIND( .fnend )
0048 #endif
0049 ENDPROC(call_with_stack)