通用虛擬機器介面¶
虛擬機器“裝置”也接受 ioctl KVM_SET_DEVICE_ATTR、KVM_GET_DEVICE_ATTR 和 KVM_HAS_DEVICE_ATTR。該介面使用與其他裝置相同的 struct kvm_device_attr 結構體,但針對的是虛擬機器範圍的設定和控制。
每個虛擬機器的組和屬性(如果有)都是架構特定的。
1. 組:KVM_S390_VM_MEM_CTRL¶
- 架構:
s390
1.1. 屬性:KVM_S390_VM_MEM_ENABLE_CMMA¶
- 引數:
無
- 返回值:
如果 vcpu 已定義,則返回 -EBUSY,否則返回 0
為虛擬機器啟用協同記憶體管理輔助 (CMMA)。
1.2. 屬性:KVM_S390_VM_MEM_CLR_CMMA¶
- 引數:
無
- 返回值:
如果 CMMA 未啟用,則返回 -EINVAL;否則返回 0
清除所有客戶機頁面的 CMMA 狀態,以便客戶機標記為未使用的任何頁面再次被使用,並且可能不會被主機回收。
1.3. 屬性 KVM_S390_VM_MEM_LIMIT_SIZE¶
- 引數:
在 attr->addr 中,是客戶機記憶體新限制的地址
- 返回值:
如果給定地址不可訪問,則返回 -EFAULT;如果虛擬機器型別為 UCONTROL,則返回 -EINVAL;如果給定的客戶機記憶體對該機器來說過大,則返回 -E2BIG;如果 vcpu 已定義,則返回 -EBUSY;如果新影子客戶機對映沒有足夠的記憶體,則返回 -ENOMEM;否則返回 0。
允許使用者空間查詢實際限制併為最大客戶機記憶體大小設定新限制。該限制將分別向上取整到 2048 MB、4096 GB、8192 TB,因為此限制受頁表級別數量的控制。如果沒有限制,我們將把限制設定為 KVM_S390_NO_MEM_LIMIT (U64_MAX)。
2. 組:KVM_S390_VM_CPU_MODEL¶
- 架構:
s390
2.1. 屬性:KVM_S390_VM_CPU_MACHINE (只讀)¶
允許使用者空間檢索機器和 KVM 特定的 CPU 相關資訊
struct kvm_s390_vm_cpu_machine {
__u64 cpuid; # CPUID of host
__u32 ibc; # IBC level range offered by host
__u8 pad[4];
__u64 fac_mask[256]; # set of cpu facilities enabled by KVM
__u64 fac_list[256]; # set of cpu facilities offered by host
}
- 引數:
用於儲存 struct kvm_s390_vm_cpu_machine* 型別的機器相關 CPU 資料的緩衝區地址
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;如果沒有足夠的記憶體來處理 ioctl,則返回 -ENOMEM;成功時返回 0。
2.2. 屬性:KVM_S390_VM_CPU_PROCESSOR (讀/寫)¶
允許使用者空間檢索或請求更改 vcpu 的 CPU 相關資訊
struct kvm_s390_vm_cpu_processor {
__u64 cpuid; # CPUID currently (to be) used by this vcpu
__u16 ibc; # IBC level currently (to be) used by this vcpu
__u8 pad[6];
__u64 fac_list[256]; # set of cpu facilities currently (to be) used
# by this vcpu
}
KVM 不以任何形式強制或限制 CPU 模型資料。將透過 KVM_S390_VM_CPU_MACHINE 檢索到的資訊作為合理配置設定的提示。由額外設定的、KVM 未處理的特性位觸發的指令攔截需要在虛擬機器驅動程式碼中實現。
- 引數:
用於儲存/設定 struct kvm_s390_vm_cpu_processor* 型別的處理器相關 CPU 資料的緩衝區地址。
- 返回值:
如果一個或多個 vcpu 已啟用,則返回 -EBUSY(僅在寫入情況下);如果給定地址無法從核心空間訪問,則返回 -EFAULT;如果沒有足夠的記憶體來處理 ioctl,則返回 -ENOMEM;成功時返回 0。
2.3. 屬性:KVM_S390_VM_CPU_MACHINE_FEAT (只讀)¶
允許使用者空間檢索可用的 CPU 功能。如果功能由硬體提供並受 KVM 支援,則該功能可用。理論上,CPU 功能甚至可以完全由 KVM 模擬。
struct kvm_s390_vm_cpu_feat {
__u64 feat[16]; # Bitmap (1 = feature available), MSB 0 bit numbering
};
- 引數:
用於從中載入功能列表的緩衝區地址。
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;成功時返回 0。
2.4. 屬性:KVM_S390_VM_CPU_PROCESSOR_FEAT (讀/寫)¶
允許使用者空間檢索或更改虛擬機器所有 VCPU 已啟用的 CPU 功能。不可用的功能無法啟用。
有關引數結構的描述,請參見 2.3. 屬性:KVM_S390_VM_CPU_MACHINE_FEAT (只讀)。
- 引數:
用於儲存/載入功能列表的緩衝區地址。
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;如果要啟用不可用的 CPU 功能,則返回 -EINVAL;如果至少一個 VCPU 已定義,則返回 -EBUSY;成功時返回 0。
2.5. 屬性:KVM_S390_VM_CPU_MACHINE_SUBFUNC (只讀)¶
允許使用者空間檢索可用的 CPU 子功能,而無需透過設定 IBC 進行任何過濾。這些子功能透過查詢或“測試位”子功能指示給客戶機 VCPU,並由例如 cpacf 函式、plo 和 ptff 使用。
子功能塊僅在 KVM_S390_VM_CPU_MACHINE 包含引入受影響指令的 STFL(E) 位時才有效。如果受影響的指令透過“查詢子功能”指示子功能,則響應塊包含在返回的結構體中。如果受影響的指令透過“測試位”機制指示子功能,則子功能程式碼包含在返回的結構體中,採用 MSB 0 位編號。
struct kvm_s390_vm_cpu_subfunc {
u8 plo[32]; # always valid (ESA/390 feature)
u8 ptff[16]; # valid with TOD-clock steering
u8 kmac[16]; # valid with Message-Security-Assist
u8 kmc[16]; # valid with Message-Security-Assist
u8 km[16]; # valid with Message-Security-Assist
u8 kimd[16]; # valid with Message-Security-Assist
u8 klmd[16]; # valid with Message-Security-Assist
u8 pckmo[16]; # valid with Message-Security-Assist-Extension 3
u8 kmctr[16]; # valid with Message-Security-Assist-Extension 4
u8 kmf[16]; # valid with Message-Security-Assist-Extension 4
u8 kmo[16]; # valid with Message-Security-Assist-Extension 4
u8 pcc[16]; # valid with Message-Security-Assist-Extension 4
u8 ppno[16]; # valid with Message-Security-Assist-Extension 5
u8 kma[16]; # valid with Message-Security-Assist-Extension 8
u8 kdsa[16]; # valid with Message-Security-Assist-Extension 9
u8 reserved[1792]; # reserved for future instructions
};
- 引數:
用於從中載入子功能塊的緩衝區地址。
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;成功時返回 0。
2.6. 屬性:KVM_S390_VM_CPU_PROCESSOR_SUBFUNC (讀/寫)¶
允許使用者空間檢索或更改要為虛擬機器所有 VCPU 指示的 CPU 子功能。此屬性僅在核心和硬體支援到位時才可用。
核心使用配置的子功能塊向客戶機指示。子功能塊僅在使用者空間未停用相關聯的 STFL(E) 位時才會被使用(因此要查詢的指令實際上可用於客戶機)。
只要沒有寫入資料,讀取就會失敗。在這種情況下,IBC 將用於確定可用的子功能,這將保證向後相容性。
有關引數結構的描述,請參見 2.5. 屬性:KVM_S390_VM_CPU_MACHINE_SUBFUNC (只讀)。
- 引數:
用於儲存/載入子功能塊的緩衝區地址。
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;讀取時,如果尚未寫入,則返回 -EINVAL;如果至少一個 VCPU 已定義,則返回 -EBUSY;成功時返回 0。
3. 組:KVM_S390_VM_TOD¶
- 架構:
s390
3.1. 屬性:KVM_S390_VM_TOD_HIGH¶
允許使用者空間設定/獲取 TOD 時鐘擴充套件 (u8)(已被 KVM_S390_VM_TOD_EXT 取代)。
- 引數:
使用者空間中用於儲存資料 (u8) 的緩衝區地址
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;如果設定 TOD 時鐘擴充套件為非 0 值不受支援,則返回 -EINVAL;對於 PV 客戶機(TOD 由 ultravisor 管理),則返回 -EOPNOTSUPP
3.2. 屬性:KVM_S390_VM_TOD_LOW¶
允許使用者空間設定/獲取 POP (u64) 中定義的 TOD 時鐘暫存器的 0-63 位。
- 引數:
使用者空間中用於儲存資料 (u64) 的緩衝區地址
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;對於 PV 客戶機(TOD 由 ultravisor 管理),則返回 -EOPNOTSUPP
3.3. 屬性:KVM_S390_VM_TOD_EXT¶
允許使用者空間設定/獲取 POP (u64) 中定義的 TOD 時鐘暫存器的 0-63 位。如果客戶機 CPU 模型支援 TOD 時鐘擴充套件 (u8),它也允許使用者空間獲取/設定它。如果客戶機 CPU 模型不支援,它將儲存為 0,並且不允許設定為非 0 值。
- 引數:
使用者空間中用於儲存資料 (kvm_s390_vm_tod_clock) 的緩衝區地址
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;如果設定 TOD 時鐘擴充套件為非 0 值不受支援,則返回 -EINVAL;對於 PV 客戶機(TOD 由 ultravisor 管理),則返回 -EOPNOTSUPP
4. 組:KVM_S390_VM_CRYPTO¶
- 架構:
s390
4.1. 屬性:KVM_S390_VM_CRYPTO_ENABLE_AES_KW (只寫)¶
允許使用者空間啟用 AES 金鑰封裝,包括生成新的封裝金鑰。
- 引數:
無
- 返回值:
0
4.2. 屬性:KVM_S390_VM_CRYPTO_ENABLE_DEA_KW (只寫)¶
允許使用者空間啟用 DEA 金鑰封裝,包括生成新的封裝金鑰。
- 引數:
無
- 返回值:
0
4.3. 屬性:KVM_S390_VM_CRYPTO_DISABLE_AES_KW (只寫)¶
允許使用者空間停用 AES 金鑰封裝,清除封裝金鑰。
- 引數:
無
- 返回值:
0
4.4. 屬性:KVM_S390_VM_CRYPTO_DISABLE_DEA_KW (只寫)¶
允許使用者空間停用 DEA 金鑰封裝,清除封裝金鑰。
- 引數:
無
- 返回值:
0
5. 組:KVM_S390_VM_MIGRATION¶
- 架構:
s390
5.1. 屬性:KVM_S390_VM_MIGRATION_STOP (只寫)¶
允許使用者空間停止遷移模式,PGSTE 遷移需要此功能。當遷移模式未啟用時設定此屬性將不起作用。
- 引數:
無
- 返回值:
0
5.2. 屬性:KVM_S390_VM_MIGRATION_START (只寫)¶
允許使用者空間啟動遷移模式,PGSTE 遷移需要此功能。當遷移模式已啟用時設定此屬性將不起作用。
必須在所有記憶體槽上啟用髒頁跟蹤,否則返回 -EINVAL。當任何記憶體槽上的髒頁跟蹤被停用時,遷移模式會自動停止。
- 引數:
無
- 返回值:
如果沒有足夠的可用記憶體來啟動遷移模式,則返回 -ENOMEM;如果虛擬機器狀態無效(例如未定義記憶體),則返回 -EINVAL;成功時返回 0。
5.3. 屬性:KVM_S390_VM_MIGRATION_STATUS (只讀)¶
允許使用者空間查詢遷移模式的狀態。
- 引數:
使用者空間中用於儲存資料 (u64) 的緩衝區地址;資料本身為 0 表示遷移模式已停用,為 1 表示已啟用
- 返回值:
如果給定地址無法從核心空間訪問,則返回 -EFAULT;成功時返回 0。
6. 組:KVM_ARM_VM_SMCCC_CTRL¶
- 架構:
arm64
6.1. 屬性:KVM_ARM_VM_SMCCC_FILTER (只寫)¶
- 引數:
指向
struct kvm_smccc_filter的指標- 返回值:
EEXIST
範圍與之前插入或保留的範圍重疊
EBUSY
虛擬機器中的 vCPU 已執行
EINVAL
無效的過濾器配置
ENOMEM
無法為 SMCCC 過濾器的核心表示分配記憶體
請求安裝 SMCCC 呼叫過濾器,描述如下
enum kvm_smccc_filter_action {
KVM_SMCCC_FILTER_HANDLE = 0,
KVM_SMCCC_FILTER_DENY,
KVM_SMCCC_FILTER_FWD_TO_USER,
};
struct kvm_smccc_filter {
__u32 base;
__u32 nr_functions;
__u8 action;
__u8 pad[15];
};
過濾器定義為一組不重疊的範圍。每個範圍定義了應用於該範圍內 SMCCC 呼叫的操作。使用者空間可以透過連續呼叫此屬性來向過濾器插入多個範圍。
KVM 的預設配置是允許所有已實現的 SMCCC 呼叫。因此,使用者空間可以稀疏地定義 SMCCC 過濾器,只描述修改預設行為的範圍。
由 struct kvm_smccc_filter 表示的範圍是 [base, base + nr_functions)。不允許範圍迴繞,即使用者空間不能依賴 base + nr_functions 溢位。
SMCCC 過濾器適用於客戶機發起的 SMC 和 HVC 呼叫。SMCCC 過濾器控制 SMCCC 呼叫的核心模擬,因此在與其他 SMCCC 呼叫互動的介面(例如 hypercall 點陣圖暫存器)之前生效。
操作
KVM_SMCCC_FILTER_HANDLE: 允許客戶機 SMCCC 呼叫在核心中處理。強烈建議使用者空間不要顯式描述允許的 SMCCC 呼叫範圍。
KVM_SMCCC_FILTER_DENY: 拒絕核心中的客戶機 SMCCC 呼叫並返回給客戶機。
KVM_SMCCC_FILTER_FWD_TO_USER: 客戶機 SMCCC 呼叫以KVM_EXIT_HYPERCALL的退出原因轉發到使用者空間。
pad 欄位保留供將來使用,並且必須為零。如果該欄位為非零,KVM 可能會返回 -EINVAL。
KVM 保留了“Arm 架構呼叫”的功能 ID 範圍,並將拒絕為這些範圍的任何部分定義過濾器的嘗試
起始
結束(包含)
0x8000_0000
0x8000_FFFF
0xC000_0000
0xC000_FFFF