S3C6410之uboot回炉再造(6)异常中断处理

  这篇是中断向量的存储、注释比较清晰、就不再细讲

  1 /*

  2  *************************************************************************

  3  *

  4  * Interrupt handling

  5  *

  6  *************************************************************************

  7  */

  8 @

  9 @ IRQ stack frame.

 10 @

 11 #define S_FRAME_SIZE    72

 12 

 13 #define S_OLD_R0    68

 14 #define S_PSR        64

 15 #define S_PC        60

 16 #define S_LR        56

 17 #define S_SP        52

 18 

 19 #define S_IP        48

 20 #define S_FP        44

 21 #define S_R10        40

 22 #define S_R9        36

 23 #define S_R8        32

 24 #define S_R7        28

 25 #define S_R6        24

 26 #define S_R5        20

 27 #define S_R4        16

 28 #define S_R3        12

 29 #define S_R2        8

 30 #define S_R1        4

 31 #define S_R0        0

 32 

 33 #define MODE_SVC 0x13

 34 #define I_BIT     0x80

 35 

 36 /*

 37  * use bad_save_user_regs for abort/prefetch/undef/swi ...

 38  */

 39 

 40     .macro    bad_save_user_regs

 41     /* carve out a frame on current user stack */

 42     sub    sp, sp, #S_FRAME_SIZE

 43     /* Save user registers (now in svc mode) r0-r12 */

 44     stmia    sp, {r0 - r12}

 45 

 46     ldr    r2, _armboot_start

 47     sub    r2, r2, #(CONFIG_SYS_MALLOC_LEN)

 48     /* set base 2 words into abort stack */

 49     sub    r2, r2, #(CONFIG_SYS_GBL_DATA_SIZE+8)

 50     /* get values for "aborted" pc and cpsr (into parm regs) */

 51     ldmia    r2, {r2 - r3}

 52     /* grab pointer to old stack */

 53     add    r0, sp, #S_FRAME_SIZE

 54 

 55     add    r5, sp, #S_SP

 56     mov    r1, lr

 57     /* save sp_SVC, lr_SVC, pc, cpsr */

 58     stmia    r5, {r0 - r3}

 59     /* save current stack into r0 (param register) */

 60     mov    r0, sp

 61     .endm

 62 

 63     .macro get_bad_stack

 64     /* setup our mode stack (enter in banked mode) */

 65     ldr    r13, _armboot_start

 66     /* move past malloc pool */

 67     sub    r13, r13, #(CONFIG_SYS_MALLOC_LEN)

 68     /* move to reserved a couple spots for abort stack */

 69     sub    r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE + 8)

 70 

 71     /* save caller lr in position 0 of saved stack */

 72     str    lr, [r13]

 73     /* get the spsr */

 74     mrs    lr, spsr

 75     /* save spsr in position 1 of saved stack */

 76     str    lr, [r13, #4]

 77 

 78     /* prepare SVC-Mode */

 79     mov    r13, #MODE_SVC

 80     @ msr    spsr_c, r13

 81     /* switch modes, make sure moves will execute */

 82     msr    spsr, r13

 83     /* capture return pc */

 84     mov    lr, pc

 85     /* jump to next instruction & switch modes. */

 86     movs    pc, lr

 87     .endm

 88 

 89     .macro get_bad_stack_swi

 90     /* space on current stack for scratch reg. */

 91     sub    r13, r13, #4

 92     /* save R0's value. */

 93     str    r0, [r13]

 94     /* get data regions start */

 95     ldr    r0, _armboot_start

 96     /* move past malloc pool */

 97     sub    r0, r0, #(CONFIG_SYS_MALLOC_LEN)

 98     /* move past gbl and a couple spots for abort stack */

 99     sub    r0, r0, #(CONFIG_SYS_GBL_DATA_SIZE + 8)

100     /* save caller lr in position 0 of saved stack */

101     str    lr, [r0]

102     /* get the spsr */

103     mrs    r0, spsr

104     /* save spsr in position 1 of saved stack */

105     str    lr, [r0, #4]

106     /* restore r0 */

107     ldr    r0, [r13]

108     /* pop stack entry */

109     add    r13, r13, #4

110     .endm

111 

112 /*

113  * exception handlers

114  */

115     .align    5

116 undefined_instruction:

117     get_bad_stack

118     bad_save_user_regs

119     bl    do_undefined_instruction

120 

121     .align    5

122 software_interrupt:

123     get_bad_stack_swi

124     bad_save_user_regs

125     bl    do_software_interrupt

126 

127     .align    5

128 prefetch_abort:

129     get_bad_stack

130     bad_save_user_regs

131     bl    do_prefetch_abort

132 

133     .align    5

134 data_abort:

135     get_bad_stack

136     bad_save_user_regs

137     bl    do_data_abort

138 

139     .align    5

140 not_used:

141     get_bad_stack

142     bad_save_user_regs

143     bl    do_not_used

144 

145     .align    5

146 irq:

147     get_bad_stack

148     bad_save_user_regs

149     bl    do_irq

150 

151     .align    5

152 fiq:

153     get_bad_stack

154     bad_save_user_regs

155     bl    do_fiq

156 #endif /* CONFIG_NAND_SPL */

 

你可能感兴趣的:(Boot)