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 叶的存在。

功能:定义 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

客户机在启用半虚拟化发送 IPI 之前检查此功能位

KVM_FEATURE_POLL_CONTROL

12

可以通过写入 msr 0x4b564d05 来禁用 HLT 上的主机端轮询。

KVM_FEATURE_PV_SCHED_YIELD

13

客户机在使用半虚拟化 sched yield 之前检查此功能位。

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 超调用来通知页面状态更改之前检查此功能位

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