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 永远不会无限期地被抢占,从而允许优化 |