KVM の CPUID ビット

Author:

Glauber Costa <glommer@gmail.com>

kvm ホスト上で動くゲストは、cpuid を使って自分の機能の一部を調べられる。 ただし、これは常に機能するとは限らない。ユーザ空間が、ゲストを起動する前に KVM 関連の cpuid 機能の一部、あるいは全部をマスクできるためである。

KVM の cpuid ファンクションは次のとおりである:

function: KVM_CPUID_SIGNATURE (0x40000000)

returns:

eax = 0x40000001
ebx = 0x4b4d564b
ecx = 0x564b4d56
edx = 0x4d

ebx、ecx、edx の値は文字列 "KVMKVMKVM" に対応する点に注意する。eax の値は、 このリーフに存在する最大の cpuid ファンクションに対応し、将来さらに ファンクションが追加されれば更新される。古いホストは eax の値を 0x0 に 設定する点にも注意する。これは値が 0x40000001 であるかのように解釈しなければ ならない。このファンクションは KVM cpuid リーフの存在を問い合わせる。

function: define KVM_CPUID_FEATURES (0x40000001)

returns:

ebx, ecx
eax = an OR'ed group of (1 << flag)

ここで flag は次のように定義される:

flag

value

meaning

KVM_FEATURE_CLOCKSOURCE

0

kvmclock が msr 0x11 と 0x12 で利用できる

KVM_FEATURE_NOP_IO_DELAY

1

PIO 操作での遅延を行う必要がない

KVM_FEATURE_MMU_OP

2

非推奨

KVM_FEATURE_CLOCKSOURCE2

3

kvmclock が msr 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 エグジットを有効にできる

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

ゲストは 2 つ目の非同期 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 ごとのクロック変動(warp)が想定されない とき、ホストは警告を出す

edx = an OR'ed group of (1 << flag)

ここで flag は次のように定義される:

flag

value

meaning

KVM_HINTS_REALTIME

0

ゲストはこの機能ビットを確認して、vCPU が無期限にプリエンプトされない と判断し、最適化を可能にする