ARM 虛擬通用中斷控制器 v2 (VGIC)

支援的裝置型別

  • KVM_DEV_TYPE_ARM_VGIC_V2 ARM 通用中斷控制器 v2.0

只能透過此 API 或傳統的 KVM_CREATE_IRQCHIP API 例項化一個 VGIC 例項。建立的 VGIC 將充當 VM 中斷控制器,要求模擬的使用者空間裝置將中斷注入 VGIC,而不是直接注入 CPU。

支援硬體相容性的 GICv3 實現允許透過此介面建立客戶 GICv2。有關建立客戶 GICv3 裝置和客戶 ITS 裝置的資訊,請參閱 ARM 虛擬通用中斷控制器 v3 及更高版本 (VGICv3)。不能在同一 VM 上同時建立 GICv3 和 GICv2 裝置。

KVM_DEV_ARM_VGIC_GRP_ADDR

屬性

KVM_VGIC_V2_ADDR_TYPE_DIST (讀寫, 64 位)

GIC 分發器暫存器對映在客戶物理地址空間中的基地址。僅適用於 KVM_DEV_TYPE_ARM_VGIC_V2。此地址需要 4K 對齊,並且區域覆蓋 4 KByte。

KVM_VGIC_V2_ADDR_TYPE_CPU (讀寫, 64 位)

GIC 虛擬 CPU 介面暫存器對映在客戶物理地址空間中的基地址。僅適用於 KVM_DEV_TYPE_ARM_VGIC_V2。此地址需要 4K 對齊,並且區域覆蓋 8 KByte。

錯誤

-E2BIG

地址超出可定址 IPA 範圍

-EINVAL

地址未正確對齊

-EEXIST

地址已配置

-ENXIO

該組或屬性對於此裝置是未知/不受支援的,或者缺少硬體支援。

-EFAULT

attr->addr 的使用者指標無效。

KVM_DEV_ARM_VGIC_GRP_DIST_REGS

屬性

kvm_device_attr 的 attr 欄位編碼兩個值

bits:     | 63   ....  40 | 39 ..  32  |  31   ....    0 |
values:   |    reserved   | vcpu_index |      offset     |

所有分發器暫存器都是 (讀寫, 32 位)

偏移量是相對於 GICv2 規範中定義的“分發器基地址”的。獲取或設定此類暫存器與從 vcpu_index 欄位指定的 CPU 在實際硬體上讀取或寫入該暫存器具有相同的效果。請注意,大多數分發器欄位不是分割槽的,但無論用於訪問暫存器的 vcpu_index 是什麼,都返回相同的值。

當模擬 GICv2 的 KVM 實現以客戶或使用者空間可以直接觀察到的方式更改時,GICD_IIDR.Revision 會更新。使用者空間應從 KVM 讀取 GICD_IIDR 並將讀取的值寫回,以確認其預期行為與 KVM 實現保持一致。使用者空間應在設定任何其他暫存器(包括 KVM_DEV_ARM_VGIC_GRP_DIST_REGS 和 KVM_DEV_ARM_VGIC_GRP_CPU_REGS)之前設定 GICD_IIDR,以確保預期行為。除非已從使用者空間設定 GICD_IIDR,否則對中斷組暫存器 (GICD_IGROUPR) 的寫入將被忽略。

錯誤

-ENXIO

獲取或設定此暫存器尚不支援

-EBUSY

一個或多個 VCPU 正在執行

-EINVAL

提供了無效的 vcpu_index

KVM_DEV_ARM_VGIC_GRP_CPU_REGS

屬性

kvm_device_attr 的 attr 欄位編碼兩個值

bits:     | 63   ....  40 | 39 ..  32  |  31   ....    0 |
values:   |    reserved   | vcpu_index |      offset     |

所有 CPU 介面暫存器都是 (讀寫, 32 位)

偏移量指定了相對於 GICv2 規範中定義的“CPU 介面基地址”的偏移量。獲取或設定此類暫存器與在實際硬體上讀取或寫入該暫存器具有相同的效果。

活動優先順序暫存器 APRn 是實現定義的,因此我們為我們的實現設定了一個固定格式,以符合我們向客戶呈現的“沒有安全擴充套件的 GICv2 實現”模型。此介面始終公開四個暫存器 APR[0-3],描述最大可能的 128 個搶佔級別。暫存器的語義透過設定相應的位來指示給定搶佔級別中是否有任何中斷處於活動狀態。

因此,當且僅當滿足以下條件時,搶佔級別 X 具有一個或多個活動中斷:

APRn[X mod 32] == 0b1, 其中 n = X / 32

未定義搶佔級別的位是 RAZ/WI。

請注意,這與 CPU 在硬體上對 APR 的看法不同,在硬體上,沒有安全擴充套件的 GIC 會在單獨的暫存器組中公開組 0 和組 1 的活動優先順序,而我們則顯示類似於 GICv2 的 GICH_APR 的組合檢視。

出於歷史原因併為了提供與使用者空間的 ABI 相容性,我們以 GICH_VMCR.VMPriMask 欄位的格式匯出 GICC_PMR 暫存器,該欄位位於一個字的低 5 位中,這意味著使用者空間必須始終使用低 5 位與 KVM 裝置通訊,並且必須將值左移 3 位以獲得實際的優先順序掩碼級別。

錯誤

-ENXIO

獲取或設定此暫存器尚不支援

-EBUSY

一個或多個 VCPU 正在執行

-EINVAL

提供了無效的 vcpu_index

KVM_DEV_ARM_VGIC_GRP_NR_IRQS

屬性

一個描述此 GIC 例項中斷(SGI、PPI 和 SPI)數量的值,範圍從 64 到 1024,以 32 為增量。

錯誤

-EINVAL

設定的值超出預期範圍

-EBUSY

值已設定,或 GIC 已用預設值初始化。

KVM_DEV_ARM_VGIC_GRP_CTRL

屬性

KVM_DEV_ARM_VGIC_CTRL_INIT

請求初始化 VGIC 或 ITS,kvm_device_attr.addr 中無額外引數。

錯誤

-ENXIO

VGIC 在呼叫此屬性之前未按要求正確配置

-ENODEV

沒有線上 VCPU

-ENOMEM

分配 vgic 內部資料時記憶體不足