From: Andre Przywara Date: Wed, 24 Jun 2009 22:08:04 +0000 (+0200) Subject: preserve the hypervisor bit while KVM trims the CPUID bits X-Git-Tag: v0.11.0-rc0~220 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=6c0d7ee8951a330c0885b0ebcd4c9596661900a9;p=qemu.git preserve the hypervisor bit while KVM trims the CPUID bits The KVM kernel will disable all bits in CPUID which are not present in the host. As this is mostly true for the hypervisor bit (1.ecx), preserve its value before the trim and restore it afterwards. Signed-off-by: Andre Przywara Signed-off-by: Anthony Liguori --- diff --git a/target-i386/cpu.h b/target-i386/cpu.h index a50f0594b..4a8608e0c 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -362,6 +362,7 @@ #define CPUID_EXT_POPCNT (1 << 23) #define CPUID_EXT_XSAVE (1 << 26) #define CPUID_EXT_OSXSAVE (1 << 27) +#define CPUID_EXT_HYPERVISOR (1 << 31) #define CPUID_EXT2_SYSCALL (1 << 11) #define CPUID_EXT2_MP (1 << 19) diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 70a9b4558..4a3f598e4 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -143,8 +143,12 @@ int kvm_arch_init_vcpu(CPUState *env) kvm_trim_features(&env->cpuid_features, kvm_arch_get_supported_cpuid(env, 1, R_EDX)); + + i = env->cpuid_ext_features & CPUID_EXT_HYPERVISOR; kvm_trim_features(&env->cpuid_ext_features, kvm_arch_get_supported_cpuid(env, 1, R_ECX)); + env->cpuid_ext_features |= i; + kvm_trim_features(&env->cpuid_ext2_features, kvm_arch_get_supported_cpuid(env, 0x80000001, R_EDX)); kvm_trim_features(&env->cpuid_ext3_features,