您的位置:首页 > 其它

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 */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: