LK源码解析 8 exceptions.S

  1. arm异常模式。

#define FUNCTION(x) .global x; x:

FUNCTION(arm_undefined) // 未定义指令异常
    stmfd     sp!, { r0-r12, r14 } // 批量数据存储指令,用于将r0-r12及r14压入堆栈,stmfd指令的寻址方式为事前递减方式(DB),后缀“!”表示更新sp的值,即sp = sp - 14*4
    sub        sp, sp, #12 // sp = sp - 12
    mov        r0, sp
    mrs        r1, spsr // spsr保存的用户模式的cpsr
    stmia    r0, { r1, r13-r14 }^ // 将spsr,sp,lr入栈,后缀“^”表示sp,lr是用户模式的寄存器
    b        arm_undefined_handler
    b        .

FUNCTION(arm_syscall) // 系统调用模式
    stmfd     sp!, { r0-r12, r14 }
    sub        sp, sp, #12
    mov        r0, sp
    mrs        r1, spsr
    stmia    r0, { r1, r13-r14 }^
    b        arm_syscall_handler
    b        .

FUNCTION(arm_prefetch_abort) // 预取指令异常模式
    stmfd     sp!, { r0-r12, r14 }
    sub        sp, sp, #12
    mov        r0, sp
    mrs        r1, spsr
    stmia    r0, { r1, r13-r14 }^
    b        arm_prefetch_abort_handler
    b        .

FUNCTION(arm_data_abort) // 数据访问终止模式
    stmfd     sp!, { r0-r12, r14 }
    sub        sp, sp, #12
    mov        r0, sp
    mrs        r1, spsr
    stmia    r0, { r1, r13-r14 }^
    b        arm_data_abort_handler
    b        .

FUNCTION(arm_reserved)
    b    .

FUNCTION(arm_irq) // 普通中断模式
    /* XXX only deals with interrupting supervisor mode */

    /* save r4-r6 and use as a temporary place to save while we switch into supervisor mode */
    stmia    r13, { r4-r6 } //  r4-r6入栈,使用用户模式的堆栈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值