U-boot中IRQ的处理程序如下: 1 ldr sp , IRQ_STACK_START 2 sub sp, sp, #S_FRAME_SIZE 3 stmia sp, {r0 - r12} ;@ Calling r0-r12 4 add r8, sp, #S_PC 5 stmdb r8, {sp, lr}^ ; @ Calling SP, LR 6 str lr, [r8, #0] ; @ Save calling PC 7 mrs r6, spsr 8 str r6, [r8, #4] ; @ Save CPSR 9 str r0, [r8, #8] ; @ Save OLD_R0 10 mov r0, sp 11 bl do_irq
12 ldmia sp, {r0 - lr}^ ;@ Calling r0 - lr 13 mov r0, r0 14 ldr lr, [sp, #S_PC] ;@ Get PC 15 add sp, sp, #S_FRAME_SZ 16 subs pc, lr, #4
其中: S_FRAME_SIZE=72, S_PC=60. do_irq为一C函数,函数原型为:void do_irq(struct pt_reg *pt_regs)
仔细看了看,有几个问题百思不得其解,向大家讨教:
1. 第10句,为什么要保存IRQ模式下的SP?而保存之后似乎又没有使用这个保存量。至于后面第13句的mov ro ro就更不能理解了,不知何意?
2. 为什么要用第5句保存用户模式下的SP和LR?是为了利于在中断中返回用户模式进行中断嵌套么?
3. 第7和8句保存了SPSR入栈,但是后面的程序并没有使用到这个栈内的SPSR,依然是直接利用SUBS从SPSR来返回用户模式,不知怎么理解?
谢谢~ |