S3C6410之uboot回炉再造(6)异常中断处理
2013-04-28 23:46
791 查看
这篇是中断向量的存储、注释比较清晰、就不再细讲
/* ************************************************************************* * * 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 ... */ .macro bad_save_user_regs /* carve out a frame on current user stack */ sub sp, sp, #S_FRAME_SIZE /* Save user registers (now in svc mode) r0-r12 */ stmia sp, {r0 - r12} ldr r2, _armboot_start sub r2, r2, #(CONFIG_SYS_MALLOC_LEN) /* set base 2 words into abort stack */ sub r2, r2, #(CONFIG_SYS_GBL_DATA_SIZE+8) /* get values for "aborted" pc and cpsr (into parm regs) */ ldmia r2, {r2 - r3} /* grab pointer to old stack */ add r0, sp, #S_FRAME_SIZE add r5, sp, #S_SP mov r1, lr /* save sp_SVC, lr_SVC, pc, cpsr */ stmia r5, {r0 - r3} /* save current stack into r0 (param register) */ mov r0, sp .endm .macro get_bad_stack /* setup our mode stack (enter in banked mode) */ ldr r13, _armboot_start /* move past malloc pool */ sub r13, r13, #(CONFIG_SYS_MALLOC_LEN) /* move to reserved a couple spots for abort stack */ sub r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE + 8) /* save caller lr in position 0 of saved stack */ str lr, [r13] /* get the spsr */ mrs lr, spsr /* save spsr in position 1 of saved stack */ str lr, [r13, #4] /* prepare SVC-Mode */ mov r13, #MODE_SVC @ msr spsr_c, r13 /* switch modes, make sure moves will execute */ msr spsr, r13 /* capture return pc */ mov lr, pc /* jump to next instruction & switch modes. */ movs pc, lr .endm .macro get_bad_stack_swi /* space on current stack for scratch reg. */ sub r13, r13, #4 /* save R0's value. */ str r0, [r13] /* get data regions start */ ldr r0, _armboot_start /* move past malloc pool */ sub r0, r0, #(CONFIG_SYS_MALLOC_LEN) /* move past gbl and a couple spots for abort stack */ sub r0, r0, #(CONFIG_SYS_GBL_DATA_SIZE + 8) /* save caller lr in position 0 of saved stack */ str lr, [r0] /* get the spsr */ mrs r0, spsr /* save spsr in position 1 of saved stack */ str lr, [r0, #4] /* restore r0 */ ldr r0, [r13] /* pop stack entry */ add r13, r13, #4 .endm /* * exception handlers */ .align 5 undefined_instruction: get_bad_stack bad_save_user_regs bl do_undefined_instruction .align 5 software_interrupt: get_bad_stack_swi bad_save_user_regs bl do_software_interrupt .align 5 prefetch_abort: get_bad_stack bad_save_user_regs bl do_prefetch_abort .align 5 data_abort: get_bad_stack bad_save_user_regs bl do_data_abort .align 5 not_used: get_bad_stack bad_save_user_regs bl do_not_used .align 5 irq: get_bad_stack bad_save_user_regs bl do_irq .align 5 fiq: get_bad_stack bad_save_user_regs bl do_fiq #endif /* CONFIG_NAND_SPL */
相关文章推荐
- 第六章-异常与中断的处理
- MIPS 异常和中断处理(Exception and Interrupt handling)
- 异常和中断处理 ARM系统开发者指南 Chapter9-1
- s3c2410 中断异常处理
- 关于s3c2410 中断异常处理
- ARM基础学习-SWI异常中断处理
- Arm异常中断返回时的处理
- SDE数据编辑过程中异常中断后产生错误的处理
- ARM异常中断处理
- 突如其来的"中断异常",我(Java)该如何处理?
- ARM处理器架构-----异常/中断处理
- 中断机制和中断描述符表、中断和异常的处理
- 异常与中断处理
- ARM中断异常处理的返回
- 中断和异常的处理
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之三--Linux对异常和中断的处理
- 突如其来的“中断异常”,我(Java)该如何处理?
- 中断详解(四) ——异常与异常处理
- ARM处理器异常与中断处理 学习总结
- 深入剖析Linux中断机制之三---Linux对异常和中断的处理