@@ -578,6 +578,13 @@ int kvm_arch_qemu_init_env(CPUState *cenv)
if (i == 0xd && copy.regs[R_EAX] == 0)
break;
}
+ } else if (i == 1) {
+ do_cpuid_ent(&cpuid_ent[cpuid_nent], i, 0, ©);
+ kvm_trim_features(&cpuid_ent[cpuid_nent].edx,
+ kvm_arch_get_supported_cpuid(cenv, 1, R_EDX));
+ kvm_trim_features(&cpuid_ent[cpuid_nent].ecx,
+ kvm_arch_get_supported_cpuid(cenv, 1, R_ECX));
+ cpuid_nent++;
} else
do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, ©);
}
@@ -586,20 +593,19 @@ int kvm_arch_qemu_init_env(CPUState *cenv)
qemu_kvm_cpuid_on_env(©);
limit = copy.regs[R_EAX];
- for (i = 0x80000000; i <= limit; ++i)
- do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, ©);
+ for (i = 0x80000000; i <= limit; ++i) {
+ do_cpuid_ent(&cpuid_ent[cpuid_nent], i, 0, ©);
+ if (i == 0x80000001) {
+ kvm_trim_features(&cpuid_ent[cpuid_nent].edx,
+ kvm_arch_get_supported_cpuid(cenv, 0x80000001, R_EDX));
+ kvm_trim_features(&cpuid_ent[cpuid_nent].ecx,
+ kvm_arch_get_supported_cpuid(cenv, 0x80000001, R_ECX));
+ }
+ ++cpuid_nent;
+ }
kvm_setup_cpuid2(cenv->kvm_cpu_state.vcpu_ctx, cpuid_nent, cpuid_ent);
- kvm_trim_features(&cenv->cpuid_features,
- kvm_arch_get_supported_cpuid(cenv, 1, R_EDX));
- kvm_trim_features(&cenv->cpuid_ext_features,
- kvm_arch_get_supported_cpuid(cenv, 1, R_ECX));
- kvm_trim_features(&cenv->cpuid_ext2_features,
- kvm_arch_get_supported_cpuid(cenv, 0x80000001, R_EDX));
- kvm_trim_features(&cenv->cpuid_ext3_features,
- kvm_arch_get_supported_cpuid(cenv, 0x80000001, R_ECX));
-
return 0;
}
The cpuid features exposed to the guest are currently not aligned with the bits returned by the supported_cpuid ioctl. This patch fixes it. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> --- qemu-kvm-x86.c | 28 +++++++++++++++++----------- 1 files changed, 17 insertions(+), 11 deletions(-)