KVMにおけるcpuid命令の取り扱い

前提

x86/Intelの話です.AMDでも多分同様.

cpuid命令の取り扱い

cpuid命令はKVM内で処理されます.

具体的には arch/x86/kvm/vmx.c:handle_cpuid() => arch/x86/kvm/cpuid.c:kvm_emulate_cpuid() => arch/x86/kvm/cpuid.c:kvm_cpuid() => arch/x86/kvm/cpuid.c:kvm_find_cpuid_entry()

ここで,kvm_find_cpuid_entry()で対応するcpuidのエントリがあるか探し,あれば それを返します.

このcpuidのエントリはKVM_SET_CPUIDあるいはKVM_SET_CPUID2 ioctlによって登録します.

KVM_SET_CPUID2はデータを連結リストの形で受け取るので,一回のioctlで複数の cpuidエントリが登録できます.

また,KVM_GET_SUPPORTED_CPUID iotclにより,KVMが実際にサポートするcpuidを取得できます.

QEMUでの取り扱い

target/i386/kvm.c:kvm_arch_init_vcpu()内でcpuidの設定をしています.

例えば,cpu->expose_kvmのとき (-cpu kvm=onのとき) 0x40000000にのクエリに対して"KVMKVMKVM"を返すように設定しています.

本来この領域はcpuid的にはreserved領域です.KVMはゲストにKVMの存在を伝えるために利用しています.