参考文档:DDI0487J_a_a-profile_architecture_reference_manual.pdf D1
当CPU发生异常后,CPU硬件会自动完成如下几件事:
- 保存PSTATE到SPSR,然后重新设置PSTATE
- 保存异常返回地址到ELR
- 对于同步异常和SError,需要更新ESR,记录异常发生的原因
- 跳转到异常向量表的入口
那么这里的异常返回地址ELR的值具体是如何规定的呢?
编号 | 异常类型 | 返回地址 |
---|---|---|
1 | 异步异常 | 中断发生时最近尚未执行的那条指令的地址 |
2 | 除了系统调用之外的同步异常 | 触发异常的那条指令的地址 |
3 | 系统调用 | 紧跟在系统调用指令后面的那条指令的的地址 |
4 | 对于因为权限不足或者指令没有定义的系统调用异常 | 触发异常的那条指令的地址 |
针对第3和第4做个说明:
以EL0为例,正常情况下执行SVC系统调用指令可以陷入EL1,此时ELR_EL1中记录的时SVC指令后面的那条指令的地址。但是如果EL0上直接调用HVC或者SMC,因为EL0上没有权限使用HVC和SMC,那么返回地址就是HVC或者SMC指令的地址。