summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@amd.com>2009-07-02 16:45:43 +0200
committerAvi Kivity <avi@redhat.com>2009-07-07 14:36:20 +0300
commit9af4aed6c749786edb780e5de1795377f515e8f7 (patch)
tree17237c0a0ffd66751def73af9f2182a7d0713f44 /qemu-kvm-x86.c
parentEnable msi with kvm irqchip (diff)
downloadqemu-kvm-9af4aed6c749786edb780e5de1795377f515e8f7.tar.gz
qemu-kvm-9af4aed6c749786edb780e5de1795377f515e8f7.tar.bz2
qemu-kvm-9af4aed6c749786edb780e5de1795377f515e8f7.zip
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. 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> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'qemu-kvm-x86.c')
-rw-r--r--qemu-kvm-x86.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 0620c1444..8ba3b6e32 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -1215,8 +1215,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 = cenv->cpuid_ext_features & CPUID_EXT_HYPERVISOR;
kvm_trim_features(&cenv->cpuid_ext_features,
kvm_arch_get_supported_cpuid(cenv, 1, R_ECX));
+ cenv->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,