iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Software Development

RISC-V: 深入淺出從入門到放棄系列 第 21

DAY21: RISC-V: VS level 的 interrupt

  • 分享至 

  • xImage
  •  
tags: 鐵人賽

正文開始!

Configuring priorities of major interrupts at VS level

如同 supervisor level ,AIA 架構允許軟體配置 VS-level major interrupt 的優先順序,以便與 VS-level external interrupt 交流。如前幾天介紹的,supervisor level interrupt 的優先順序,透過 siselectsireg 間接 access iprio array 進行配置。

VS-level 也有自己的 vsiselectvsireg,但與 supervisor level 不同的, vsiselect 地址 0x30~0x3f 沒有暫存器(原本會有 iprio)。當 vsiselect 的值在範圍 0x30~0x3f 時,從 VS mode access 會導致 virtual intruction exception。為了讓虛擬 hart 產生透過 siselectsireg 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/hviprio1hhviprio2/hviprio2h。對於不在hviprio1/hviprio1hhviprio2/hviprio2h 的 interrupt,模擬 iprio array中的優先順序 number為只讀0。

Virtual interrupts for VS level

假設虛擬 hart 不須用透過 hviprio1/hviprio1hhviprio2/hviprio2h 來配置 major interrupt 的優先順序,則 hypervisor 可以使用 hvienhvip 向虛擬 hart assert interrupt。

暫存器 hvien/hvienhhvip/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/vsiphsip/siph 中相對應的 bit 別名相同。而當 hideleg/hidelegh 中的 bit 為0 以及 hvien/hvienh相對應的 bit 匹配為1時,hvien/hvienhvsip/vsiph 相對應的 bit 位置相同。當 hideleg/hideleghhvien/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 用於以下操作:

  • 為 VS-level assert hvien/hvienhhvip/hviph 不支援的 major interrupt
  • 在 VS-level 實作優先順序的配置性,用來支援 hviprio1/hviprio1hhviprio2/hviprio2h範圍外的 major interrupt。或是
  • 在不使用 IMSIC guest interrupt file 的情況下,模擬 external interrupt controller,同時還支援可配置的優先順序的 external interrupt 和 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。

Virtual supervisor top interrupt CSR (vstopi)

vstopi 是只可讀的 CSR 格式與 stopi相同,如下所示:

vstopi回傳為 VS-level 最高優先權的 interrupt,可以從下方候選中找到:

  • 如果 hstatus.VGEIN 是一個 guset interrupt file 當中的有效號碼,vsip和 vsie bit 9皆為1,vstopi不為0:
    • supervisor external interrupt 其優先順序號碼由 vstopei 表示
  • 如果 hstatus.VGEIN 是一個 guset interrupt file 當中的有效號碼,vsip和 vsie bit 9皆為1,vstopi為0:
    • supervisor external interrupt 優先順序號碼為 256
  • 如果 hstatus.VGEIN = 0以及 hvictl的 IID=9 以及 IPRIO不等於0:
    • supervisor external interrupt 優先順序號碼為 hvictl.IPRIO
  • 如果 hcictl.VTI = 0:
    • 所有 major interrupt pending 和 enable bit 由 vsip/vsiphvsie/vsieh 負責,優先順序號碼則由 hviprio1/hviprio1hhviprio2/hviprio2h 分配
  • 如果 hvictl.VTI = 1 以及 IID 不等於9:
    • major interrupt 由 IID 和 IPRIO 指定

上方所列的 supervisor external interrupt 皆是虛擬的,指向 VS-level。

當 interrupt 沒有滿足以上條件,則 vstopi 為0。若有達成條件,vstopi IID 和 IPRIO 由候選者當中最高優先順序的 interrupt 決定。

如果 hvictl IPRIOM 為0,則 vstopi中的 IPRIO為1;反之,如果最高優先順序的號碼在1~255之間,則IPRIO就為該值,若超出此範圍則將 IPRIO 設定為 0或是255。

Interrupt traps to VS-mode

vstopi 的值不為0時,如果當前模式為 VS-mode,並且舉起 vsstatus中的 SIE bit,或是當前特權模式為 VU-mode,則vstopi IID表示的 interrupt 就會 trap 到 VS-mode。

後記

明天我們繼續~終於完成20篇了,加油 ヽ(°▽°)ノ


上一篇
DAY20: RISC-V: Virtual Machines 的 interrupt
下一篇
DAY22: RISC-V:AIA 之 IPI(Interprocessor Interrupts)
系列文
RISC-V: 深入淺出從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言