KVMにおけるcpuid命令の取り扱い
前提
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"を返すように設定しています.