ARM 虛擬中斷轉換服務 (ITS)

支援的裝置型別

KVM_DEV_TYPE_ARM_VGIC_ITS ARM 中斷轉換服務控制器

ITS 允許將 MSI(-X) 中斷注入到客戶機中。此擴充套件是可選的。建立虛擬 ITS 控制器還需要主機 GICv3(請參閱 ARM 虛擬通用中斷控制器 v3 及更高版本 (VGICv3)),但不依賴於擁有物理 ITS 控制器。

每個客戶機可以有多個 ITS 控制器,每個控制器都必須具有單獨的、不重疊的 MMIO 區域。

KVM_DEV_ARM_VGIC_GRP_ADDR

屬性
KVM_VGIC_ITS_ADDR_TYPE (rw, 64 位)

GICv3 ITS 控制暫存器幀在客戶機物理地址空間中的基地址。該地址需要 64K 對齊,並且該區域覆蓋 128K。

錯誤

-E2BIG

地址超出可定址 IPA 範圍

-EINVAL

地址未正確對齊

-EEXIST

地址已配置

-EFAULT

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

-ENODEV

屬性不正確或不支援 ITS。

KVM_DEV_ARM_VGIC_GRP_CTRL

屬性
KVM_DEV_ARM_VGIC_CTRL_INIT

請求初始化 ITS,kvm_device_attr.addr 中沒有其他引數。

KVM_DEV_ARM_ITS_CTRL_RESET

重置 ITS,kvm_device_attr.addr 中沒有其他引數。請參閱“ITS 重置狀態”部分。

KVM_DEV_ARM_ITS_SAVE_TABLES

將 ITS 表資料儲存到客戶機 RAM 中,儲存在客戶機在相應暫存器/表條目中提供的位置。如果使用者空間需要某種形式的髒跟蹤來識別儲存過程修改了哪些頁面,即使使用其他機制來跟蹤 vCPU 弄髒的記憶體,也應該使用點陣圖。

客戶機記憶體中表的佈局定義了一個 ABI。條目以小端格式佈局,如最後一段所述。

KVM_DEV_ARM_ITS_RESTORE_TABLES

將 ITS 表從客戶機 RAM 恢復到 ITS 內部結構。

必須在 ITS 之前恢復 GICV3,並且必須在恢復 ITS 表之前恢復所有 ITS 暫存器(GITS_CTLR 除外)。

GITS_IIDR 只讀暫存器也必須在呼叫 KVM_DEV_ARM_ITS_RESTORE_TABLES 之前恢復,因為 IIDR 修訂欄位編碼了 ABI 修訂。

恢復 GICv3/ITS 時的預期順序在“ITS 恢復順序”部分中描述。

錯誤

-ENXIO

ITS 未按照設定此屬性之前的要求正確配置

-ENOMEM

分配 ITS 內部資料時記憶體短缺

-EINVAL

恢復的資料不一致

-EFAULT

無效的客戶機 ram 訪問

-EBUSY

一個或多個 VCPU 正在執行

-EACCES

虛擬 ITS 由物理 GICv4 ITS 提供支援,並且在沒有 GICv4.1 的情況下狀態不可用

KVM_DEV_ARM_VGIC_GRP_ITS_REGS

屬性

kvm_device_attr 的 attr 欄位編碼 ITS 暫存器的偏移量,相對於 ITS 控制幀基地址 (ITS_base)。

無論定址暫存器的寬度(32/64 位)如何,kvm_device_attr.addr 都指向 __u64 值。只能以完整長度訪問 64 位暫存器。

核心忽略對只讀暫存器的寫入,除了

  • GITS_CREADR。必須恢復它,否則佇列中的命令將在恢復 CWRITER 後重新執行。GITS_CREADR 必須在恢復 GITS_CTLR 之前恢復,這可能會啟用 ITS。此外,它必須在 GITS_CBASER 之後恢復,因為寫入 GITS_CBASER 會重置 GITS_CREADR。

  • GITS_IIDR。Revision 欄位編碼了表佈局 ABI 修訂。將來我們可能會實現虛擬 LPI 的直接注入。這將需要升級表佈局和 ABI 的發展。GITS_IIDR 必須在呼叫 KVM_DEV_ARM_ITS_RESTORE_TABLES 之前恢復。

對於其他暫存器,獲取或設定暫存器與在真實硬體上讀取/寫入暫存器具有相同的效果。

錯誤

-ENXIO

偏移量不對應於任何支援的暫存器

-EFAULT

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

-EINVAL

偏移量未 64 位對齊

-EBUSY

一個或多個 VCPU 正在執行

ITS 恢復順序:

在恢復 GIC、ITS 和 KVM_IRQFD 分配時,必須遵循以下順序

  1. 恢復所有客戶機記憶體並建立 vcpu

  2. 恢復所有重新分發器

  3. 提供 ITS 基地址 (KVM_DEV_ARM_VGIC_GRP_ADDR)

  4. 按以下順序恢復 ITS

    1. 恢復 GITS_CBASER

    2. 恢復所有其他 GITS_ 暫存器,除了 GITS_CTLR!

    3. 載入 ITS 表資料 (KVM_DEV_ARM_ITS_RESTORE_TABLES)

    4. 恢復 GITS_CTLR

  5. 恢復 MSI 的 KVM_IRQFD 分配

然後可以啟動 vcpu。

ITS 表 ABI REV0:

ABI 的修訂版 0 僅支援虛擬 GICv3 的功能,不支援虛擬 GICv4,該虛擬 GICv4 支援直接注入巢狀虛擬機器管理程式的虛擬中斷。

裝置表和 ITT 分別按 DeviceID 和 EventID 索引。集合表不按 CollectionID 索引,集合中的條目以不特定的順序排列。所有條目都是 8 個位元組。

裝置表條目 (DTE)

bits:     | 63| 62 ... 49 | 48 ... 5 | 4 ... 0 |
values:   | V |   next    | ITT_addr |  Size   |

其中

  • V 指示條目是否有效。如果不是,則其他欄位沒有意義。

  • next:如果此條目是最後一個條目,則等於 0;否則,它對應於到下一個 DTE 的 DeviceID 偏移量,上限為 2^14 -1。

  • ITT_addr 匹配 ITT 地址的位 [51:8](256 位元組對齊)。

  • Size 指定 EventID 支援的位數,減一

集合表條目 (CTE)

bits:     | 63| 62 ..  52  | 51 ... 16 | 15  ...   0 |
values:   | V |    RES0    |  RDBase   |    ICID     |

其中

  • V 指示條目是否有效。如果不是,則其他欄位沒有意義。

  • RES0:保留欄位,具有應為零或保留行為。

  • RDBase 是 PE 編號 (GICR_TYPER.Processor_Number 語義),

  • ICID 是集合 ID

中斷轉換條目 (ITE)

bits:     | 63 ... 48 | 47 ... 16 | 15 ... 0 |
values:   |    next   |   pINTID  |  ICID    |

其中

  • next:如果此條目是最後一個條目,則等於 0;否則,它對應於到下一個 ITE 的 EventID 偏移量,上限為 2^16 -1。

  • pINTID 是物理 LPI ID;如果為零,則表示條目無效,其他欄位沒有意義。

  • ICID 是集合 ID

ITS 重置狀態:

RESET 將 ITS 返回到首次建立和初始化時的狀態。當 RESET 命令返回時,保證以下事項

  • ITS 未啟用且靜態 GITS_CTLR.Enabled = 0 .Quiescent=1

  • 沒有內部快取的狀態

  • 未使用任何集合或裝置表 GITS_BASER.Valid = 0

  • GITS_CBASER = 0, GITS_CREADR = 0, GITS_CWRITER = 0

  • ABI 版本未更改,並且保持首次建立 ITS 裝置時設定的版本。