本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。
1 通过IMSIC接收外部中断的CSR
软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。
- machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;
- 而 supervisor level 的 CSR 也能与 IMSIC 的 supervisor level interrupt file 可相互互动;
- 同样地当 IMSIC 有 guest interrupt file,VS CSR 可与 guest interrupt file 相互互动。
machine level 相关的CSR有以下:miselect、mireg、mtopei。
supervisor level 相关的 CSR 有以下:siselect、sireg、stopei。
当 hypervisor extension 实现时,与 VS CSR 相关的有以下:vsiselect、vsireg、vstopei。
miselect 和 mireg通过间接的方式,访问machine level的附带寄存器。
同样的,supervispr level的siselect 和 sireg,以及 VS level 的 vsiselect 和 vsireg,也可以间接访问各自 level 的附带寄存器。
需要注意的是:
这些附带寄存器既不是CSR,也不是memory-mapped的寄存器,它们在interrupt file中。
不同level的interrupt file的寄存器组相同,*iselect表示这些寄存器的地址,它的范围在 0x70~0xFF ,会选择相对应在 IMSIC 中 interrupt file的寄存器,interrupt file结构如下:
寄存器0x71 和 0x73~0x7F 目前被保留。
当 *iselect CSR 具有这些值之一(0x71和0x73~0x7f)时:
- 从匹配的 *ireg CSR读取,会返回0;
- 并且会忽略向 *ireg CSR 的写入行为。
eip0 到 eip63 对应所有实现 interrupt ID 的 pending bit,统称之为 eip array;
同样的 eie0 到 eie63 所对应 enabled bit 统称之为 eie array。
每个寄存器32bit,eip0/eie0的bit0无效,因此interrupt ID的有效范围为1-2047,对应这些寄存器组的bit位置。
1.1 interrupt file交互示意图
根据前面章节描述,我们可以得到machine level的CSR 与 IMSIC 的 machine level interrupt file交互,其结构如下所示:
- seteipnum_le与seteipnum_be位于内存映射空间中,基址为4KB对齐,这2个寄存器在映射空间中的偏移为0x000和0x004。
- 向seteipnum_le或seteipnum_be写入Interrupt ID,可将Interrupt ID对应的eip array中某bit置位。
- 向miselect中写入0x70~0xff任一地址,然后读写mireg,可实现对Interrupt File内部实际寄存器的访问。