aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@amacapital.net>2014-12-05 22:03:28 -0500
committerPaolo Bonzini <pbonzini@redhat.com>2014-12-10 06:49:39 -0500
commit29fa6825463c97e5157284db80107d1bfac5d77b (patch)
treebb0d1cb44bea9cfed3c3d57185219e1249558b1c
parente08e833616f7eefebdacfd1d743d80ff3c3b2585 (diff)
x86, kvm: Clear paravirt_enabled on KVM guests for espfix32's benefit
paravirt_enabled has the following effects: - Disables the F00F bug workaround warning. There is no F00F bug workaround any more because Linux's standard IDT handling already works around the F00F bug, but the warning still exists. This is only cosmetic, and, in any event, there is no such thing as KVM on a CPU with the F00F bug. - Disables 32-bit APM BIOS detection. On a KVM paravirt system, there should be no APM BIOS anyway. - Disables tboot. I think that the tboot code should check the CPUID hypervisor bit directly if it matters. - paravirt_enabled disables espfix32. espfix32 should *not* be disabled under KVM paravirt. The last point is the purpose of this patch. It fixes a leak of the high 16 bits of the kernel stack address on 32-bit KVM paravirt guests. Fixes CVE-2014-8134. Cc: stable@vger.kernel.org Suggested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Signed-off-by: Andy Lutomirski <luto@amacapital.net> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kernel/kvm.c9
-rw-r--r--arch/x86/kernel/kvmclock.c1
2 files changed, 8 insertions, 2 deletions
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index f6945bef2cd1..94f643484300 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -283,7 +283,14 @@ NOKPROBE_SYMBOL(do_async_page_fault);
283static void __init paravirt_ops_setup(void) 283static void __init paravirt_ops_setup(void)
284{ 284{
285 pv_info.name = "KVM"; 285 pv_info.name = "KVM";
286 pv_info.paravirt_enabled = 1; 286
287 /*
288 * KVM isn't paravirt in the sense of paravirt_enabled. A KVM
289 * guest kernel works like a bare metal kernel with additional
290 * features, and paravirt_enabled is about features that are
291 * missing.
292 */
293 pv_info.paravirt_enabled = 0;
287 294
288 if (kvm_para_has_feature(KVM_FEATURE_NOP_IO_DELAY)) 295 if (kvm_para_has_feature(KVM_FEATURE_NOP_IO_DELAY))
289 pv_cpu_ops.io_delay = kvm_io_delay; 296 pv_cpu_ops.io_delay = kvm_io_delay;
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
index 0bf3467d7f30..42caaef897c8 100644
--- a/arch/x86/kernel/kvmclock.c
+++ b/arch/x86/kernel/kvmclock.c
@@ -261,7 +261,6 @@ void __init kvmclock_init(void)
261#endif 261#endif
262 kvm_get_preset_lpj(); 262 kvm_get_preset_lpj();
263 clocksource_register_hz(&kvm_clock, NSEC_PER_SEC); 263 clocksource_register_hz(&kvm_clock, NSEC_PER_SEC);
264 pv_info.paravirt_enabled = 1;
265 pv_info.name = "KVM"; 264 pv_info.name = "KVM";
266 265
267 if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT)) 266 if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT))