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 永遠不會無限期地被搶佔,從而允許最佳化