CPU的自我控制之(5)-回头路ELR_ELx 与 指示器ESR_ELx

——————————————————————异常第二步 准备活动——————————————————————

(下面一句为了承上启下,没什么卵用)

SPSR搞好后,CPU状态可以保障了,开始可以做一些准备活动了

把异常返回地址设好。

首选的返回地址保存在ELR_ELx,x对应异常等级。

啥叫首选的返回地址呢,异常一不小心或故意的发生了,

PE二二虎虎的把SPSR_ELx套到PSTATE上,抓起SP_ELx,瞄准了PC就开始执行,

然后很快异常就被处理完了,

当然,也可能就崩溃了什么的。

不过一般的异常是不会崩溃的,比如syscall,hypercall之类;

当PE执行到ERET指令(后续详述)的时候(就好像傻驴跑着跑着突然想家了),

就是要返回的时候,有些会返回原先的指令流继续执行(hypercall syscall),

有些会走上崩溃之路(傻驴回头结果大陆板块分裂,驴掉进去了)。

于是就需要一个返回的地址,这个地址就存在ELR_ELx中,

有没有觉着把返回地址的设置放的这么靠前(这驴挺关注自己的后路啊)。。。。

其实想想当异常发生的时刻,发生异常的兄弟首先要改了对应目标异常等级的SPSR,

才能算把异常传递过去了,就是上面说的异常第一步。

然后呢,然后发生异常的兄弟考虑的肯定是处理完异常以后把指令流拉回来呀,

毕竟发生异常的兄弟现在还没仔细考虑这个异常该怎么处理。

然后对于那ELR_ELx是怎么放得?放得又是谁?

ELR_ELx中存放的返回地址是取决于异常的,

对于异步异常,ELR_ELx存放的是中断发生时的指令边界的后续指令的指令地址(意思就是下一个要执行的指令的地址吧?!)

对于同步异常,ELR_ELx存放的是产生这个异常的指令的地址。

对于异常生成指令,ELR_ELx存放的是异常生成指令后的指令的地址。

ELR_ELx后面还有用,先说这些(废话,用脚趾头想想异常退出的时候也得用啊)。

在确定退路之后,在做一些寄存器标志位的修改:

PSTATE.UAO置零,恩。。没有更多要说的了,我也没仔细研究原因,因为后面有更多重要问题待解。

将D, A, I, F位置1,这个简单,关掉其他异常,以防止处理异常时被打断了,

亲们,知道为啥网络数据包无论如何丢包率也很难0了吧,这狗日的把中断关了!!

——————————————————————异常第三步 对同步异常——————————————————————

在同步异常或SError中断异常,ESR负责给出异常发生的原因。

ESR_ELx这个指令我用一整天才看完的,如果我把所有内容罗列出来。。。

相信会勇士站出来屠了我的。恩,对,就像现在我想去血洗ARM总部一样,虽然我不知道在哪儿。

所以,我猜我可以继续拣两样重要的说是合理的了。

ESR_ELx寄存器同样是3个特权异常等级都有的,

其实ESR_ELx寄存器只有三段标志位,是不是略松一口气,但是很明显,三段!与三位!是不一样的!快把这口气吸回去。

ESR_ELx寄存器的第一段是EC,bits[31:26],标志了39个异常原因。但是考虑到我不准备一一列出,我就给它们归归类吧。

第一类是WFI/WFE(wait for interrupt/event,停止时钟但不断电)指令的异常。

第二类是MCR/MRC/MCRR/MRRC/LDC/STC等指令产生的异常,这些一般都是在搬数据。

第三类是其他SVE(可扩展向量??不太清楚) SIMD(单次执行多操作数) VMRS(浮点计算结果相关)产生的异常。

第三类是Illegal Execution state的异常,PSTATE.IL置位后还执行了命令。

第四类是SVC HVC SMC异常,就是对syscall、hypercall、EL3切换的支持了。

第五类是ERET(异常返回指令) ERETAA ERETAB指令执行的异常。

第六类是指令中止、数据中止类异常,包含从低EL级向高EL级以及同EL级的异常。

第七类是PC SP对齐异常。

第八类是debug相关的异常。

按不精确的分类来说都这么多,然后还涉及到这么多不认识的指令。。。我感觉捅了一个马蜂窝。

ESR_ELx寄存器的第二段IL bit[25]就比较好说话了,这个位指示同步异常的指令长度,0对应16bit,1为32bit,

请不要把16bit的问题问出来,因为我感觉到有一只手枪在试图对准了我的心脏。

当抓到32bit指令的异常,这个值还会在如下异常用到:

SError中断异常

指令中止异常

PC、SP对齐失败异常

数据中止异常

Illegal Execution state异常

debug异常

未知异常

ESR_ELx寄存器的第三段ISS Instruction specific syndrome field, bit[24:0]

是在EC段指定异常后的一些附带信息,

这一区域对于不同类型的异常可以被独立定义,

但是实际使用中,一些ISS编码被用于不止一种异常类型

知道为啥这段有25bit,但只写这么一句吗,

因为这些附带信息在ARM手册中有30页的描述,

我反反复复看过之后,决定承认我傻。

放过ESR吧,虽然我几乎没写细节,

但是用屁股想想也知道,

能够给清楚异常发生原因的寄存器怎么可能是好相与的。。。

以后有时间再仔细分析分析。

发布了24 篇原创文章 · 获赞 3 · 访问量 2348

猜你喜欢

转载自blog.csdn.net/ytfy339784578/article/details/103946140