本文屬于《 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內部實際寄存器的訪問。