鐵人賽
今日來介紹 VM(virtual machine) 的 interrupt
當實作 hypervisor extension 時,hart 的特權模式包含 virtual supvisor(VS)以及 virtual user(VU) 用來管理虛擬的 hart。新增了幾個 hypervisor 與 VS 相關的 CSR,前幾日有所介紹,像是:hvien, hvictl, hviprio1, hviprio2, vsiselect, vsireg, vstopei, 以及 vstopi
。對於 RV32 還新增了以下 CSR:hidelegh, hvienh, hviph, hviprio1h, hviprio2h, vsiph,以及 vsieh
。
當 hart 實現 hypervisor extension 時,建議 hart 也有 IMSIC 當中包含 interrupt file。假設 guest interrupt file 可以使用,每個guest interrupt file 可以被分配到 虛擬 hart 上,以充當 虛擬 hart 的 supervisor interrupt file。如果有 N 個 guest interrupt file,則 N 個虛擬 hart 在實體 hart 上,每個 guest interrupt file 都當作一個 虛擬 supervisor level file。當前 虛擬 hart 的 guest interrupt file 由 CSR hstatus
的 VGEIN 所指示。當 VGEIN 不是有效的數值時,當前虛擬 hart 沒有 guset interrupt file 當作其 supervisor level interrupt file。
當 VEGIN 是有效值時,vsiselect
的值在 0x70~0xff ,選擇範圍內該 guest interrupt file 的暫存器,就像 siselect
在範圍內選擇 IMSIC 的 sueprvisor level interrup file 的暫存器。透過 vsuselect
、 vsireg
和 vstopei
間接 access interrupt file 的暫存器。因為所有的 IMSIC interrupt file 的行為相同,所以虛擬 hart 透過 siselect
、sireg
和 stopei
來 access guest interrupt file, 是無法區分真正的 sueprvisor level interrupt file。
除了每個 hart 的 IMSIC 之外,VM可能含需要查看 PLIC 或是 APLIC。然而,與 IMSIC 為虛擬 hart 提供 guest interupt file 的能力不同,hypervisor 需要為 VM 模擬 PLIC 或 APLIC。
當虛擬 hart 具有 IMSIC 時,因為 guest interrupt file 被分配給它 ,無論是虛擬或是真實的 external interrupt 所有的 external interrupt 都須通過 IMSIC。
hypervisor 可以輕鬆地將模擬的 external interrupt inject 到由 hstatus
的 VGEIN選擇的 guest interrupt file 。當虛擬 hart 具有 guest interrupt file 時,通常不期望 hypervisor 在 hvip
設置 VSEIP。
在VM,模擬 APLIC 具有等同於真實 APLIC 的 wire interrupt source特殊情況下,如果此VM運行的軟體將虛擬 APLIC 配置為將 interrupt 轉成 MSI 到指定的虛擬 hart,則 hypervisor 可以配置真正 APLIC 將 interupt 轉為 MSI 發送到虛擬 hart 的guest interrupt file。通過這種方式,雖然 hypervisor 必須trap 和模擬 VM的 memory access,在虛擬 APLIC 上配置 interrutp 的轉發,但 interrupt 本身可以自動轉換為 guest interrupt file 的 真實 MSI,而無須為每個 interrupt 調動 hypervisor。
為了確保正確的支援 interrupt,必須滿足以下兩種條件, hypervisor 才能允許在VM當中運行 guest OS 直接控制實際設備發送 MSI:
如果 guest OS 能夠控制發送 MSI 的設備,它會使用 OS 為其虛擬 hart 的 IMSIC 看到 guest address 在設備上配置 MSI,而不知道這些地址只是虛擬的。當設備為 MSI 進行 memory 寫入時,IOMMU 必須使用 hypervisor 提供的轉換錶,將該寫入的目標地址從 guest OS 分配的 guest 地址,轉換為目標 guest interrupt file 的真實實際地址。
每個虛擬 hart 都分配了一個 guest interrutp file ,該 file 與真正的 supervisor level 的 interrupt file 沒有區別,因此 MSI 寫入 data 時不須用轉換。
當虛擬 hart 從一個實體 hart 轉移到另一個新的實體 hart 時,如果虛擬 hart 正使用 guest interrupt file ,則分配給他的 guest interrupt file 必須從舊的實體 hart 更改為另一個實體 hart。因為各個 guest interrupt file 與各個 實體 hart 綁定,因此虛擬 hart 在轉移時,無法帶著 guest interrupt file 轉移。
將虛擬 hart 從一個 guest interrupt file 遷移到另一個的過程,比移動虛擬 hart 的大多數狀態更複雜,在新的實體 hart 中選擇目標的 guest interrupt file 之後,建議執行以下步驟:
雖然建議實作的 hypervisor extension 的 hart 帶有 guset interrupt file 的 IMSIC,但這並不是必需的。假設 guest interupt file 存在,但實際 hart 上的虛擬 hart 也可能比 guest interrupt 多,從而導致一些虛擬 hart 沒有被分配到。在任何一種情況下, hypervisor 都必須為虛擬 hart 模擬external interrupt controller。
當為虛擬 hart 模擬 external interrupt controller 時,如果虛擬 hart 無法配置 interrupt 的優先順序,則 external interrupt 可以透過 hvip
的 VSEIP 舉起,表示為 VS level。為了模擬 external interrupt controller 以及 non-exterrnal interrupt 的優先順序,hypervisor 可以使用 hvictl
。
明天繼續~~