ARMv8 异常处理之el1_sync

1.el1_sync

SYM_CODE_START_LOCAL_NOALIGN(el1_sync)
	kernel_entry 1 //寄存器信息压栈
	mov	x0, sp  将当前的栈指针保存在寄存器 x0 中
	bl	el1_sync_handler //调跳转arch\arm64\kernel\entry-common.c
	kernel_exit 1//寄存器信息出栈
SYM_CODE_END(el1_sync)

2.el1_sync_handler

asmlinkage void noinstr el1_sync_handler(struct pt_regs *regs)
{
	unsigned long esr = read_sysreg(esr_el1);//esr_el1是异常状态寄存器
//#define ESR_ELx_EC(esr)         (((esr) & ESR_ELx_EC_MASK) >> ESR_ELx_EC_SHIFT)
//#define ESR_ELx_EC_SHIFT        (26)
//#define ESR_ELx_EC_MASK         (UL(0x3F) << ESR_ELx_EC_SHIFT)
	switch (ESR_ELx_EC(esr)) {//取esr的[26,31]位,这个寄存器的[26,31]位代表异常类。
	case ESR_ELx_EC_DABT_CUR://当前异常等级的数据异常
	case ESR_ELx_EC_IABT_CUR://当前异常等级的指令异常
		el1_abort(regs, esr);
		break;
	/*
	 * We don't handle ESR_ELx_EC_SP_ALIGN, since we will have hit a
	 * recursive exception when trying to push the initial pt_regs.
	
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值