在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模式下的堆栈啊???? |