• 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 */
  • 相关阅读:
    java泛型详解
    一条sql语句搞定基于mysql的sql执行顺序的基本理解
    java深拷贝和浅拷贝
    Intelligent idea高效实用总结
    git工具的使用总结
    java注解详解
    实现业务系统中的用户权限管理设计篇
    有创业兴趣的来看看
    System.Web.HttpRequestValidationException:解决方法
    XMLHttpRequest 对象
  • 原文地址:https://www.cnblogs.com/plinx/p/3050206.html
Copyright © 2020-2023  润新知