1. 执行优先级&抢占
PMR设置中断发给某个PE的最小优先级。GICv3架构存在执行优先级的概念。当PE应答一个中断时,它的执行优先级变成中断的。当PE写EOI寄存器时执行优先级返回之前的值。
在CPU接口中执行优先级寄存器ICC_RPR_EL1报告当前执行优先级。当考虑抢占时执行优先级的概念非常重要。当更高优先级发送给已经在处理较低优先级中断的PE时,抢占产生。抢占增加了软件的复杂度,但低优先级的中断不能阻塞高优先级的中断。
抢占图显示了一级抢占。但有可能存在多级抢占。在一些情况下不要求抢占。GICv3架构通过二进制点寄存器ICC_BPRn_EL1允许控制不同的优先级给不同的抢占。
二进制点寄存器将优先级切分成两部分:group优先级和子优先级
对于抢占,仅考虑Group优先级。子优先级域忽略。
比如,考虑如下三个中断:
INTID A优先级为0x10
INTID B优先级为0x20
INTID C优先级为0x30
在本场景下它决定:
- A可以抢占B或C;
- B不能抢占C,因为B和C有类似的优先级
为完成这个场景Group域和子优先级域可以将N=4:
这种切分,B和C可以认为在抢占情况下存在相同的优先级。但A仍是更高优先级,因此可以抢占B或C。
NOTE: 抢占要求中断处理支持nesting。本文档不再描述更多的细节。
2. 中断的结束
当中断被处理时,软件需要通知中断控制器中断已经被处理,这样状态机可以转换到下一个状态。GICv3架构认为可分为两个任务:
(1)降低优先级
这意味着将运行优先级降到中断处理之前的值。
(2)未激活
这意味着更新当前正处理的中断的状态机。通常从active状态转换为inactive状态。
在GICv3架构中降低会优先级和未激活可以同时产生或分开产生。由ICC_CTLR.EOImode决定。
(1)EOImode = 0
对Group0中断写ICC_EIOR0_EL1,或对Group1中断写ICC_EIOR1_EL1,会同时发送降低优先级和未激活。这是通常对裸设备上使用的模式。
(2)EOImode = 1
对Group0中断写ICC_EIOR_EL0,或对Group1中断写ICC_EIOR1_EL1,会导致优先级降低。A若要求deactivate,需要单独写ICC_DIR_EL1。这种模式通常在虚拟化中使用。
在写这些寄存器时,软件必须写INTID。
3. 检查系统当前状态
3.1 最高优先级pending中断和运行优先级
最高优先级pending中断寄存器ICC_HPRIR0_EL1&ICC_HPRIR1_EL1为PE报告最高优先级pending中断的INTID。在不同的PE上可能存在差异,比如由于SPI的不同路由设置。
之前章节介绍运行优先级,由运行优先级ICC_RPR_EL1报告。
3.2 独立INTID的状态
Distributor提供寄存器指明每个SPI的当前状态。类似的Redistributor也提供寄存器指明PPI和SGI的状态。
这些寄存器也能够将中断移到某个状态。这非常有用,比如,在不要求外设发送中断情况下可以测试配置是否正确。
这里用单独的寄存器来报告active状态和pending状态。下表列出active状态寄存器。pending状态寄存器也是相同格式。
Register | 描述 |
GICD_ISACTIVERn | 设置SPI的active状态。每个INTID一个bit。读该bit返回INTID的当前状态:1 - INTID为active 0 - INTID为非active 写1到该bit可以激活当前INTID。写0没有效果。 |
GICD_ICACTIVERn | 清除SPI的active状态。每个INTID一个bit。读该bit返回INTID的当前状态:1 - INTID为active 0 - INTID为非active 写1到该bit可以deactive当前INTID。写0没有效果。 |
GICR_ISACTIVER0 | 设置SGI和PPI的active状态。每个INTID一个bit。读该bit返回INTID的当前状态:1 - INTID为active 0 - INTID为非active 写1到该bit可以激活当前INTID。写0没有效果。 |
GICR_ICACTIVER0 | 清除SGI和PPI的active状态。每个INTID一个bit。读该bit返回INTID的当前状态:1 - INTID为active 0 - INTID为非active 写1到该bit可以deactive当前INTID。写0没有效果。 |
NOTE: 在使能亲和路由时GICD_ISACTIVER0和GICD_ICACTIVER0被当作保留。这是因为GICD_ISACTIVER0和GICD_ICACTIVER0与INTID0~31相关,而它们是基于PE的,且由PE的Redistributor上报。
NOTE: 执行在非安全状态的软件不能看到Group0或安全状态Group1中断,若访问没有被GICD_NASCRn或GICR_NASCRn允许。