KVM CPUID 位¶
- 作者:
Glauber Costa <glommer@gmail.com>
執行在 KVM 主機上的客戶機可以使用 CPUID 檢查其某些功能。但這並非總能保證奏效,因為使用者空間在啟動客戶機之前可能會遮蔽掉部分甚至所有與 KVM 相關的 CPUID 功能。
KVM CPUID 函式包括:
函式: KVM_CPUID_SIGNATURE (0x40000000)
返回值
eax = 0x40000001
ebx = 0x4b4d564b
ecx = 0x564b4d56
edx = 0x4d
請注意,ebx、ecx 和 edx 中的此值對應於字串“KVMKVMKVM”。eax 中的值對應於此葉子中存在的最大 CPUID 函式,如果將來新增更多函式,此值將會更新。另請注意,舊主機將 eax 值設定為 0x0。這應解釋為該值為 0x40000001。此函式查詢 KVM CPUID 葉子的存在。
函式: define KVM_CPUID_FEATURES (0x40000001)
返回值
ebx, ecx
eax = an OR'ed group of (1 << flag)
其中 flag 定義如下:
標誌 |
值 |
含義 |
|---|---|---|
KVM_FEATURE_CLOCKSOURCE |
0 |
kvmclock 可在 MSRs 0x11 和 0x12 處使用 |
KVM_FEATURE_NOP_IO_DELAY |
1 |
PIO 操作無需執行延遲 |
KVM_FEATURE_MMU_OP |
2 |
已棄用 |
KVM_FEATURE_CLOCKSOURCE2 |
3 |
kvmclock 可在 MSRs 0x4b564d00 和 0x4b564d01 處使用 |
KVM_FEATURE_ASYNC_PF |
4 |
透過寫入 MSR 0x4b564d02 可以啟用非同步 PF |
KVM_FEATURE_STEAL_TIME |
5 |
透過寫入 MSR 0x4b564d03 可以啟用竊取時間 |
KVM_FEATURE_PV_EOI |
6 |
透過寫入 MSR 0x4b564d04 可以啟用半虛擬化中斷結束處理程式 |
KVM_FEATURE_PV_UNHALT |
7 |
客戶機在啟用半虛擬化自旋鎖支援之前檢查此功能位 |
KVM_FEATURE_PV_TLB_FLUSH |
9 |
客戶機在啟用半虛擬化 TLB 重新整理之前檢查此功能位 |
KVM_FEATURE_ASYNC_PF_VMEXIT |
10 |
透過在寫入 MSR 0x4b564d02 時設定位 2 可以啟用半虛擬化非同步 PF VM EXIT |
KVM_FEATURE_PV_SEND_IPI |
11 |
客戶機在啟用半虛擬化傳送 IPIs 之前檢查此功能位 |
KVM_FEATURE_POLL_CONTROL |
12 |
透過寫入 MSR 0x4b564d05 可以停用 HLT 上的主機端輪詢。 |
KVM_FEATURE_PV_SCHED_YIELD |
13 |
客戶機在使用半虛擬化排程讓步之前檢查此功能位。 |
KVM_FEATURE_ASYNC_PF_INT |
14 |
客戶機在使用第二個非同步 PF 控制 MSR 0x4b564d06 和非同步 PF 確認 MSR 0x4b564d07 之前檢查此功能位。 |
KVM_FEATURE_MSI_EXT_DEST_ID |
15 |
客戶機在使用 MSI 地址位 11-5 中的擴充套件目標 ID 位之前檢查此功能位。 |
KVM_FEATURE_HC_MAP_GPA_RANGE |
16 |
客戶機在使用 map gpa range hypercall 通知頁面狀態更改之前檢查此功能位 |
KVM_FEATURE_MIGRATION_CONTROL |
17 |
客戶機在使用 MSR_KVM_MIGRATION_CONTROL 之前檢查此功能位 |
KVM_FEATURE_CLOCKSOURCE_STABLE_BIT |
24 |
如果 kvmclock 中預期不會發生客戶機端每 CPU 扭曲,主機將發出警告 |
edx = an OR'ed group of (1 << flag)
其中 flag 在此定義如下:
標誌 |
值 |
含義 |
|---|---|---|
KVM_HINTS_REALTIME |
0 |
客戶機檢查此功能位以確定 vCPU 永遠不會無限期地被搶佔,從而允許最佳化 |