本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。
对于APLIC实现的每一个中断域,都存在一个独享的内存映射的控制区域,用来处理该中断域的中断。
该控制区域大小是由4KB的倍数,并与4KB地址边界对齐,最小的有效控制区域是16KB。
接下来,本文将详细讲解,APLIC中断域的内存映射空间。
1 中断域的内存映射空间 - 示意图
一个中断域的控制区域,由一组32bit位宽的寄存器组成,前16KB的寄存器如下图所示:
从偏移量 0x4000 开始,interrupt domain 的控制区域可以选择具有interrupt delivery control (IDC) 结构,每个hart都对应一个IDC 结构。
IDC 结构,只有在直接向 harts 传递 interrupt 时使用,而由 MSI 转发interrupt时不会使用。
每个 IDC 结构为 32 字节,并定义如下:
从 interrupt domain 控制区域的开头到其第二个 IDC 结构(hart index=1)的偏移量为 0x4020;第三个 IDC 结构(hart index=2)的偏移量为 0x4040 以此类推。
除了前16 KB中的缓存器和上面列出的用于 IDC 结构的缓存器外,interrupt domain 控制区域中的其他 byte 都被保留的,并且为 read only 0。中断域的控制区域只支持32bit对齐的访问。
根据本小节描述,中断域的内存映射空间,其寄存器分布情况,可整理为如下图所示:
中断域的内存映射空间中,所有寄存器的含义描述,如下文所示。
2 中断域的内存映射空间 - 寄存器含义
2.1 domaincfg
Domain configuration (domaincfg),定义如下:
-
IE(Interrupt Eable)位
指示所在中断域的所有有效中断源的全局使能标志。
只有IE=1时,pending和enable同时置位的中断,才会投递到目标hart。 -
DM(Delivery Mode)位
表示中断的投递方式,其定义如下:
- 直接投递方式,是指中断按优先级排列,并由APLIC本身直接向Hart发出信号。如果中断域中的hart具有IMSIC,除非其对应IMSIC中interrupt file的eidelivery支持0x4000_0000,否则将DM置0的效果,等同于对IE置0。也就是说,如果eidelivery不支持0x4000_0000,即便将DM置0,欲使用直接投递,也无法实际投递到Hart。
- MSI投递方式,是指APLIC将中断以MSI的方式发送到hart,由hart中的IMSIC进一步处理。
-
BE (big-Endian)位
它确定 interrupt domain 的寄存器byte的顺序。(在现今主流的 CPU 中,最常见的字节顺序有两种,分别是 Big-Endian 与 Little-Endian。Big-Endian 是指数据放进内存中的时候,最高位的字节会放在最低的内存地址上;而 Little-Endian 则是刚好相反,它会把最高位的字节放在最高的内存地址上。)- 如果BE = 0,表示byte顺序为little-endian
- 如果 BE = 1,表示为big-endian。
在系统重置时,domaincfg 中的所有可写位,都被初始化为零,包括 IE。
2.2 sourcecfg[1]–sourcecfg[1023]
Source configurations (sourcecfg[1]–sourcecfg[1023])。
对于每个可能的中断源i,sourcecfg[i]控制源i在该interrupt domain中的源模式,以及源i到child domain的任何委托。
当源i未被实现,或出现在不被实现的域中时,sourcecfg[i]为只读零。
如果源i没有被委托到这个域,然后(在父域)被更改为被委托到这个域,sourcecfg[i]将保持为零,直到成功写入一个非零值。
sourcecfg[i]的第10位,是一个名为D(Delegate)的1位字段。sourcecfg[i]其余部分的解释,取决于字段D。
- 如果D=1,表示源i被委托给子域。
当中断源i,被委托给子域时,sourcecfg[i]有这样的格式: