/* ************************************************************************* * * Interrupt handling * ************************************************************************* */ @ @ IRQ stack frame. @ #define S_FRAME_SIZE 72 #define S_OLD_R0 68 #define S_PSR 64 #define S_PC 60 #define S_LR 56 #define S_SP 52 #define S_IP 48 #define S_FP 44 #define S_R10 40 #define S_R9 36 #define S_R8 32 #define S_R7 28 #define S_R6 24 #define S_R5 20 #define S_R4 16 #define S_R3 12 #define S_R2 8 #define S_R1 4 #define S_R0 0 #define MODE_SVC 0x13 #define I_BIT 0x80 /* * use bad_save_user_regs for abort/prefetch/undef/swi ... * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling */ .macro bad_save_user_regs sub sp, sp, #S_FRAME_SIZE stmia sp, {r0 - r12} @ Calling r0-r12 ldr r2, _armboot_start
此处很简单,只是一些宏定义而已。 后面用到的时候再解释。 | |
.macro和后面的.endm相对应,其语法是: 所以,此处就相当于一个无参数的宏bad_save_user_regs,也就相当于一个函数了。 | |
即 sp = sp- S_FRAME_SIZE = sp - 72 | |
stmia的语法为: 其中,条件域的具体含义如下: 更具体的含义:
所以,此行的含义是, 将r0到r12的值,一个个地传送到对应的地址上,基地址是sp的值,传完一个,sp的值加4,一直到传送完为止。 此处,可见,前面那行代码: sp = sp - 72 就是为此处传送r0到r12,共13个寄存器,地址空间需要13*4=72个字节, 即前面sp减去72,就是为了腾出空间,留此处将r0到r12的值,放到对应的位置的。 | |
此处的含义就是,将_armboot_start中的值,参考前面内容,即为_start, 而_start的值: 从 Nor Flash启动时:_stat=0 relocate代码之后为:_start=TEXT_BASE=0x33D00000 此处是已经relocate代码了,所以应该理解为后者,即_start=0x33D00000 所以: r2=0x33D00000 |