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