异常返回有3类,我这只解释两类,第三类我没有理解,后续会看看linux kernel怎么做的。
1)从swi和未定义指令返回
ARM
SWI pc-8 ;异常发生处
指令1 pc-4 ; 程序返回的地方, LR=下一条指令
指令2 pc ;pc当前值
异常是由指令本身引起的,PC、LR的值没有更新,CPSR模式就已经更改了,而当前执行的产生异常的执行是不希望再次执行的,所以返回指令为
MOVS PC,LR
2)从fiq,irq中断和预取异常返回
ARM
指令1 pc-12 ;异常发生在这条指令执行期间
指令2 pc-8 ;异常返回后需要回到执行的指令
指令3 pc-4 ;arm LR=下一条指令
指令4 pc ;
异常在当前指令执行完毕后响应,此时pc的值已经更新了,而lr也跟着为pc的decode阶段指令(三级流水线),所以为了异常执行完毕后返回现场
MOVS PC,LR,#4
3)从数据异常返回
这个我仍然有疑惑,不写先,谁有答案或者研究的文档提供欢迎留言。