1dfa3b1
From: Andy Lutomirski <luto@amacapital.net>
1dfa3b1
Date: Fri, 5 Dec 2014 19:03:28 -0800
1dfa3b1
Subject: [PATCH] x86, kvm: Clear paravirt_enabled on KVM guests for espfix32's
1dfa3b1
 benefit
1dfa3b1
1dfa3b1
paravirt_enabled has the following effects:
1dfa3b1
1dfa3b1
 - Disables the F00F bug workaround warning.  There is no F00F bug
1dfa3b1
   workaround any more because Linux's standard IDT handling already
1dfa3b1
   works around the F00F bug, but the warning still exists.  This
1dfa3b1
   is only cosmetic, and, in any event, there is no such thing as
1dfa3b1
   KVM on a CPU with the F00F bug.
1dfa3b1
1dfa3b1
 - Disables 32-bit APM BIOS detection.  On a KVM paravirt system,
1dfa3b1
   there should be no APM BIOS anyway.
1dfa3b1
1dfa3b1
 - Disables tboot.  I think that the tboot code should check the
1dfa3b1
   CPUID hypervisor bit directly if it matters.
1dfa3b1
1dfa3b1
 - paravirt_enabled disables espfix32.  espfix32 should *not* be
1dfa3b1
   disabled under KVM paravirt.
1dfa3b1
1dfa3b1
The last point is the purpose of this patch.  It fixes a leak of the
1dfa3b1
high 16 bits of the kernel stack address on 32-bit KVM paravirt
1dfa3b1
guests.
1dfa3b1
1dfa3b1
While I'm at it, this removes pv_info setup from kvmclock.  That
1dfa3b1
code seems to serve no purpose.
1dfa3b1
1dfa3b1
Cc: stable@vger.kernel.org
1dfa3b1
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
1dfa3b1
---
1dfa3b1
 arch/x86/kernel/kvm.c      | 9 ++++++++-
1dfa3b1
 arch/x86/kernel/kvmclock.c | 2 --
1dfa3b1
 2 files changed, 8 insertions(+), 3 deletions(-)
1dfa3b1
1dfa3b1
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
1dfa3b1
index 3dd8e2c4d74a..07de51f66deb 100644
1dfa3b1
--- a/arch/x86/kernel/kvm.c
1dfa3b1
+++ b/arch/x86/kernel/kvm.c
1dfa3b1
@@ -282,7 +282,14 @@ NOKPROBE_SYMBOL(do_async_page_fault);
1dfa3b1
 static void __init paravirt_ops_setup(void)
1dfa3b1
 {
1dfa3b1
 	pv_info.name = "KVM";
1dfa3b1
-	pv_info.paravirt_enabled = 1;
1dfa3b1
+
1dfa3b1
+	/*
1dfa3b1
+	 * KVM isn't paravirt in the sense of paravirt_enabled.  A KVM
1dfa3b1
+	 * guest kernel works like a bare metal kernel with additional
1dfa3b1
+	 * features, and paravirt_enabled is about features that are
1dfa3b1
+	 * missing.
1dfa3b1
+	 */
1dfa3b1
+	pv_info.paravirt_enabled = 0;
1dfa3b1
 
1dfa3b1
 	if (kvm_para_has_feature(KVM_FEATURE_NOP_IO_DELAY))
1dfa3b1
 		pv_cpu_ops.io_delay = kvm_io_delay;
1dfa3b1
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
1dfa3b1
index d9156ceecdff..d4d9a8ad7893 100644
1dfa3b1
--- a/arch/x86/kernel/kvmclock.c
1dfa3b1
+++ b/arch/x86/kernel/kvmclock.c
1dfa3b1
@@ -263,8 +263,6 @@ void __init kvmclock_init(void)
1dfa3b1
 #endif
1dfa3b1
 	kvm_get_preset_lpj();
1dfa3b1
 	clocksource_register_hz(&kvm_clock, NSEC_PER_SEC);
1dfa3b1
-	pv_info.paravirt_enabled = 1;
1dfa3b1
-	pv_info.name = "KVM";
1dfa3b1
 
1dfa3b1
 	if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT))
1dfa3b1
 		pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT);
1dfa3b1
-- 
1dfa3b1
2.1.0
1dfa3b1