aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@amd.com>2009-06-25 00:08:04 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-06-29 13:52:12 -0500
commit6c0d7ee8951a330c0885b0ebcd4c9596661900a9 (patch)
tree6c63fa52bb7744be9555f68042ec244da27a6e65
parent671e4676076fb62860986decd44440d97bcc872d (diff)
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 <andre.przywara@amd.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--target-i386/cpu.h1
-rw-r--r--target-i386/kvm.c4
2 files changed, 5 insertions, 0 deletions
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index a50f0594b0..4a8608e0ce 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 70a9b45588..4a3f598e4f 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,