鐵人賽如同 supervisor level ,AIA 架構允許軟體配置 VS-level major interrupt 的優先順序,以便與 VS-level external interrupt 交流。如前幾天介紹的,supervisor level interrupt 的優先順序,透過 siselect 和 sireg 間接 access iprio array 進行配置。
VS-level 也有自己的 vsiselect 和 vsireg,但與 supervisor level 不同的, vsiselect 地址 0x30~0x3f 沒有暫存器(原本會有 iprio)。當 vsiselect 的值在範圍 0x30~0x3f 時,從 VS mode access 會導致 virtual intruction exception。為了讓虛擬 hart 產生透過 siselect 和 sireg access iprio 暫存器的錯覺,當從 VS mode access sireg 導致 virtual intruction trap 時, hypervisor 必須模擬 VS-level iprio array。
除了 VS-level iprio array 之外,還提供了另種硬體機制,用來配置 VS level interrupt 的優先順序,也就是使用 hypervisor CSR: hviprio1 以及 hviprio2,對於 RV32,還提供高位元位置 hviprio1h 以及 hviprio2h。
可以在硬體中配置 major interrupt 的優先順序如下:
對於 32~48 範圍的 local interrupt ,硬體不支援軟體配置優先順序。
RV32 暫存器 hviprio1、hviprio1h、hviprio2 以及 hviprio2h 他們的格式如下:
RV32 hviprio1:

RV32 hviprio1h:

RV32 hviprio2:

RV32 hviprio2h:

以下是 RV64 暫存器 hviprio1、hbiprio2:
RV64 hviprio1:

RV64 hviprio2:

每個優先順序 number 在 hviprio1/hviprio1h 以及 hviprio2/hviprio2h 是一個 WARL 無符號整數欄位,它要麽是只讀 0 或是實現最小IPRIOLEN bit。實作可以選哪些優先順序 number的欄位為只讀0。
hypervisor 可以透過模擬 siselect、sireg(實際上是 vsiselect、vsireg)間接 aceess superviosro level iprio array 時,可以使用 hviprio1/hviprio1h和hviprio2/hviprio2h。對於不在hviprio1/hviprio1h和hviprio2/hviprio2h 的 interrupt,模擬 iprio array中的優先順序 number為只讀0。
假設虛擬 hart 不須用透過 hviprio1/hviprio1h和hviprio2/hviprio2h 來配置 major interrupt 的優先順序,則 hypervisor 可以使用 hvien和 hvip 向虛擬 hart assert interrupt。
暫存器 hvien/hvienh 和 hvip/hviph 的每一位對應一個 0~63 的 interrupt ID。hvien 的12:0 bit 是保留的,必須只讀0,而hvip 12:0 bit 由 Privileged SPEC 定義。具體來說 hvip的bit 10、6、2 分別為 VS-level external interrupt、VS-level timer interrupt、VS-level software interrupt 的可寫 bit。
以下只是用於 interrupt ID 13~63:
當 hideleg/hidelegh 中的bit 為1時,vsip/vsiph與 sip/siph 中相對應的 bit 別名相同。而當 hideleg/hidelegh 中的 bit 為0 以及 hvien/hvienh相對應的 bit 匹配為1時,hvien/hvienh 與 vsip/vsiph 相對應的 bit 位置相同。當 hideleg/hidelegh 和 hvien/hvienh 中相對應的 bit 皆為0時,vsip/vsiph 中的 bit 為只讀0。
下圖為上面說法的總結圖:
對於 interrupt ID 13~63,只有在 hudeleg/hidelegh或是 hvien/hvienh中舉起相對應的 bit 時,vsie/vsieh中的 bit 才是可寫的。當 interrupt 由 hideleg/hidelegh 委託時,vsie/vsieh 中的可寫 bit 是 sie/sieh中相對應 bit 的別名。
如果 hideleg/hidelegh 的某個 bit 為0,並且 hvien/hvienh中的相對應的bit 從0變為1,則 vsie/vsieh 中匹配到的值變為unspecified。同樣,如果 hvien/hvienh的某個 bit 為1,並且 hideleg/hidelegh 中相對應的 bit 從1變為0,則 vsie/vsieh中匹配到的值變為 unspecified。
對於 interrupt ID 13~63 ,實作可以自由選擇 hvien/hvienh哪些 bit 是可以寫的,哪些 bit 只讀0或1。如果 hvien/hvienh 中的某 bit 表示為只讀0,在 hvip/hviph 同樣bit 位也應該只讀0。
hvictl 提供更進一步的靈活性,可以在至今為止所描述的設施不完全支援下,將 interrupt 送到 VS-level,但需要 hypervisor 更積極參與進行才行, hypervisor 必須將 hvictl 用於以下操作:
hvien/hvienh 和 hvip/hviph 不支援的 major interrupthviprio1/hviprio1h 和 hviprio2/hviprio2h範圍外的 major interrupt。或是hvictl 的格式如下:

其他 hvictl 的 bit 被保留且只讀0
當 VTI(virtual trap interrupt control) 為1時,嘗試從 VS-mode access sip/siph、sie/sieh,會導致 virtual instruction exception。此外,對於任意 CSR ,如果在某些情況下,對暫存器寫入,可能會導致 vsip/vsiph的某個 bit 從 1變為0,則當 VTI = 1時, guest 嘗試寫入此暫存器,也會引起 virtual instruction exception。如果實作了 vstimecmp 那麼當 VTI = 1時,嘗試從 VS-mode寫入 stimecmp 或是 stimecmph會導致 virtual instruction exception。
vstopi 是只可讀的 CSR 格式與 stopi相同,如下所示:

vstopi回傳為 VS-level 最高優先權的 interrupt,可以從下方候選中找到:
hstatus.VGEIN 是一個 guset interrupt file 當中的有效號碼,vsip和 vsie bit 9皆為1,vstopi不為0:
vstopei 表示hstatus.VGEIN 是一個 guset interrupt file 當中的有效號碼,vsip和 vsie bit 9皆為1,vstopi為0:
hstatus.VGEIN = 0以及 hvictl的 IID=9 以及 IPRIO不等於0:
hvictl.IPRIO
hcictl.VTI = 0:
vsip/vsiph 和 vsie/vsieh 負責,優先順序號碼則由 hviprio1/hviprio1h和 hviprio2/hviprio2h 分配hvictl.VTI = 1 以及 IID 不等於9:
上方所列的 supervisor external interrupt 皆是虛擬的,指向 VS-level。
當 interrupt 沒有滿足以上條件,則 vstopi 為0。若有達成條件,vstopi IID 和 IPRIO 由候選者當中最高優先順序的 interrupt 決定。
如果 hvictl IPRIOM 為0,則 vstopi中的 IPRIO為1;反之,如果最高優先順序的號碼在1~255之間,則IPRIO就為該值,若超出此範圍則將 IPRIO 設定為 0或是255。
當 vstopi 的值不為0時,如果當前模式為 VS-mode,並且舉起 vsstatus中的 SIE bit,或是當前特權模式為 VU-mode,則vstopi IID表示的 interrupt 就會 trap 到 VS-mode。
明天我們繼續~終於完成20篇了,加油 ヽ(°▽°)ノ