在U-Boot 的FIQ中断处理中有如下压栈程序:
01 .macro irq_save_user_regs
02 sub sp, sp, #S_FRAME_SIZE
03 stmia sp, {r0 - r12} @ Calling r0-r12
04 add r8, sp, #S_PC
05 stmdb r8, {sp, lr}^ @ Calling SP, LR
06 str lr, [r8, #0] @ Save calling PC
07 mrs r6, spsr
08 str r6, [r8, #4] @ Save CPSR
09 str r0, [r8, #8] @ Save OLD_R0
10 mov r0, sp
11 .endm
而对应的出栈程序如下:
12 .macro irq_restore_user_regs
13 ldmia sp, {r0 - lr}^ @ Calling r0 - lr
14 mov r0, r0
15 ldr lr, [sp, #S_PC] @ Get PC
16 add sp, sp, #S_FRAME_SIZE
17 subs pc, lr, #4 @ return & move spsr_svc into cpsr
18 .endm
其中第03行在FIQ中断中, 则导致将FIQ的R8..R14入栈.
而第13行时, 直接将R8..R14恢复到User模式的R8..R14中,
这是否会破坏User模式下的堆栈啊???? |