中断术语1——assert、routing、target、target to、target fromtaken
几个重要的概念:assert。routing、target、target to、target fromtaken
1.2 assert
外设发给GIC一个中断信号,GIC发给PE,PE对中断进行assert,断言这个中断是IRQ还是FIQ,这个过程就是assert。
1.3 target
外设发出中断信号给GIC,GIC发给PE,PE首先进行assert,然后下一步,PE对这个中断要进行Target操作,就是target到某一个异常等级,可能是EL1,也可能是EL2也可能是EL3,这个过程就是Target.
1.4 taken
外设发出中断信号给GIC,GIC发给PE,PE首先进行assert,然后PE对这个中断要进行Target,然后下一步在部分场景下PE还会再检查PSTATE的MASK位,,下一步PE准备对这个中断进行处理,就叫做PE taken了这个中断。taken之后就会跳到异常向量表进行中断处理了。
1.5 routing
就是从外设发出中断信号给GIC,GIC发给PE,PE首先assert,判断这个中断是FIQ还是IRQ。然后:
(1)PEtarget到其异常等级
(2)PE先判断处理器状态掩码
(3)PE taken这个中断
最后跳到异常向量表进行中断处理。
中间这个(1)(2)(3)过程就是routing路由的过程。
1.6 小结
路由之后,在部分场景下还会再检查PSTATE的MASK位,如果是unMasked的,此时也就是中断被taken了,也就是PE acknowledge了该中断。然后中断处理的软件中读取gic的寄存器。
2. 中断术语2
掌握中断进入和中断退出时,哪些行为是硬件自动完成的,哪些行为是依靠软件去做的。
2.1 IRQ 和FIQ区别
FIQ不是一个快速中断的意思,在很早的ARM手册中有讲FIQ比IRQ优先级别高,但是在后面的手册中有更正,FIQ 和IRQ优先级没有高低,FIQ更多的是体现了一个要被转发出去的中断,如果这个中断我这边不处理要转发出去,那就是FIQ,我自己要处理就是IRQ
2.2 中断数据流
图中蓝色都是硬件完成,后面跳到中断向量表了才到软件开始处理,
2.3中断entry
中断进来时的硬件的自动行为:
1、将PSTATE保存到SPSR_ELx中
2、将return地址保存到ELR_ELx中:
3、将PSTATE.{D.A,F}全部置为1
4-如果是同步异常或SError,在更新ESR_ELX异常特征寄存器
5、跳转到异常向量表
6、sp选择目标异常级别的sp_elx
2.4中断exit
一旦中断处理程序处理完中断,该处理程序就返回到中断发生前正在运行的代码。
它通过以下操作来实现:恢复所有以前堆叠的可损坏寄存器启动异常返回指令(ERET) ,ERET指令从关联的SPSR和分支中恢复先前的处理器状态到ELR中记录的异常返回地址。返回异常级别是根据SPSR_EL< x>中的值配置的,其中< x>是要返回的级别。SPSR_ELx还包含目标执行状态 。这是中断退出时候的硬件自动行为。
- 在ELx上执行ERET指令时:
(1)用ELR_RLx保存的值恢复PC
(2)通过使用SPSR_ELx的内容来恢复PSTATE
2.5 EL 级别的切换
2.6 svc 也是可以trapped到EL2
- 置上以下比特位,svc将trapped到EL2:
HFGITR_EL2 (Hypervisor Fine-Grained Instruction Trap Register)
SVC_EL1, bit [53]
SVC_ELo, bit [52] - 置上以下比特位eret将trapped到EL2:
ERET, bit [51]