diff mbox

qemu-kvm: preserve the hypervisor bit while KVM trims the CPUID bits

Message ID 1246541255-15103-1-git-send-email-andre.przywara@amd.com (mailing list archive)
State New, archived
Headers show

Commit Message

Andre Przywara July 2, 2009, 1:27 p.m. UTC
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.
This is similar to commit 6c0d7ee8, but since qemu-kvm uses another code
path it has to be inserted in qemu-kvm-x86.c, too.

Signed-off-by: Andre Przywara <andre.przywara@amd.com>
---
 qemu-kvm-x86.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
diff mbox

Patch

diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index d6735c1..b02e604 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -1211,8 +1211,13 @@  int kvm_arch_qemu_init_env(CPUState *cenv)
 
     kvm_trim_features(&cenv->cpuid_features,
                       kvm_arch_get_supported_cpuid(cenv, 1, R_EDX));
+
+    /* prevent the hypervisor bit from being cleared by the kernel */
+    i = env->cpuid_ext_features & CPUID_EXT_HYPERVISOR;
     kvm_trim_features(&cenv->cpuid_ext_features,
                       kvm_arch_get_supported_cpuid(cenv, 1, R_ECX));
+    env->cpuid_ext_features |= i;
+
     kvm_trim_features(&cenv->cpuid_ext2_features,
                       kvm_arch_get_supported_cpuid(cenv, 0x80000001, R_EDX));
     kvm_trim_features(&cenv->cpuid_ext3_features,