鐵人賽
如同 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篇了,加油 ヽ(°▽°)ノ