AIA - APLIC之三(附APLIC处理流程图)
本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。
1 APLIC复位
APLIC复位后,其所有状态都变得有效且一致,但以下情况除外:
- 每个中断域的domaincfg寄存器(spec第 4.5.1 节);
- 可能是machine-level interrupt domain的MSI地址配置寄存器(spec第4.5.3 和4.5.4 节);
- 每个中断域的genmsi寄存器的Busy位(如果存在)(spec第 4.5.15 节)。
以上这几种情况,在APLIC复位后,需要根据这些寄存器的具体定义来确定。
2 对中断pending位的精确影响
尝试通过写入中断域控制区域中的寄存器,来设置或清除中断源的pending位可能会成功,也可能不会成功,具体取决于相应的中断源模式、中断域的中断投递模式,以及中断源校正输入的状态值(spec第4.5.2节中定义)。
下面列举了,针对给定的中断源源模式,设置或清除pending位时的所有情况。
如果源模式为Detached:
- 仅通过对setip或setipnum寄存器,执行相关写入操作,将pending位设置为1。
- 当在APLIC处请求中断或由MSI转发中断,或者通过对in_clrip寄存器或clripnum进行相关写入时,将清除pending位。
如果源模式为Edge1或Edge0:
- 通过校正输入值,从低到高的跳变,或者通过对setip或setipnum寄存器进行相应写入,将pending位设置为1。
- 当在APLIC处请求中断或由MSI转发中断,或者通过对in_clrip寄存器或clripnum进行相关写入时,将清除pending位。
如果源模式为Level1或Level0,并且中断域配置为直接投递模式(domaincfg.DM = 0):
- 只要校正后的输入值为高电平,pending位就会设置为1。无法通过写入setip或setipnum寄存器来设置pending位。
- 只要校正后的输入值为低电平,pending位就会被清除。pending位不能通过 APLIC 处的中断声明来清除,也不能通过写入in_clrip寄存器或clripnum来清除。
如果源模式为Level1或Level0,并且中断域配置为MSI投递模式(domaincfg.DM = 1):
- 通过校正输入值中从低到高的跳变,将pending位设置为1。当经校正的输入值为1时,也可以通过setip或setipnum寄存器的相应写入来设置pending位。
- 只要校正后的输入值为低电平,或者通过对in_clrip寄存器或clripnum进行相关写入,就会清除pending位。
当中断域处于直接投递模式时,电平触发的中断源的pending位,始终只是整流输入值的副本。即使在MSI传送模式下,当校正输入值为0时,电平触发的中断源的pending位,也不会被设置 (= 1)。
除上述规则外,如spec第4.5.2节中所述,对sourcecfg寄存器的写入,还可导致源的中断挂起位设置为1。
3 直接传递模式
当中断域处于直接投递模式 (domaincfg.DM = 0) 时,中断通过每个hart的唯一信号(通常是专用中断线)从APLIC传递到hart。
在这种情况下,中断域的内存映射控制区域,在末尾包含一组中断传送控制 (IDC) 结构,每个hart都会对应一个IDC结构。
第一个IDC结构,是该中断域内索引为0的hart;第二个是该中断域索引为1的hart;依次类推。
3.1 IDC结构
每个IDC结构都是32字节(对齐到 32 字节地址边界),并具有以下定义的寄存器:
如果IDC结构,针对的特定hart,对于中断域中的任何实际hart都无效,则这些寄存器,可以选择全部为只读零。否则,寄存器将在下面单独描述。
特定的APLIC,可能被构建为支持最大数量的hartÿ