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

发布时间:2024-09-02  

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


  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 */


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>