]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
kvm: x86: zero EFER on INIT
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 19 Oct 2015 09:30:19 +0000 (11:30 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 9 Dec 2015 19:31:11 +0000 (14:31 -0500)
commit 5690891bcec5fcfda38da974ffa5488e36a59811 upstream.

Not zeroing EFER means that a 32-bit firmware cannot enter paging mode
without clearing EFER.LME first (which it should not know about).
Yang Zhang from Intel confirmed that the manual is wrong and EFER is
cleared to zero on INIT.

Fixes: d28bc9dd25ce023270d2e039e7c98d38ecbf7758
Cc: Yang Z Zhang <yang.z.zhang@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kvm/svm.c
arch/x86/kvm/vmx.c

index 2d32b67a1043490c6307284f64f2905586f3d006..74d6cfe3610b1f9f5f307d228fc203094b2815ed 100644 (file)
@@ -1085,7 +1085,7 @@ static u64 svm_compute_tsc_offset(struct kvm_vcpu *vcpu, u64 target_tsc)
        return target_tsc - tsc;
 }
 
-static void init_vmcb(struct vcpu_svm *svm, bool init_event)
+static void init_vmcb(struct vcpu_svm *svm)
 {
        struct vmcb_control_area *control = &svm->vmcb->control;
        struct vmcb_save_area *save = &svm->vmcb->save;
@@ -1156,8 +1156,7 @@ static void init_vmcb(struct vcpu_svm *svm, bool init_event)
        init_sys_seg(&save->ldtr, SEG_TYPE_LDT);
        init_sys_seg(&save->tr, SEG_TYPE_BUSY_TSS16);
 
-       if (!init_event)
-               svm_set_efer(&svm->vcpu, 0);
+       svm_set_efer(&svm->vcpu, 0);
        save->dr6 = 0xffff0ff0;
        kvm_set_rflags(&svm->vcpu, 2);
        save->rip = 0x0000fff0;
@@ -1211,7 +1210,7 @@ static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
                if (kvm_vcpu_is_reset_bsp(&svm->vcpu))
                        svm->vcpu.arch.apic_base |= MSR_IA32_APICBASE_BSP;
        }
-       init_vmcb(svm, init_event);
+       init_vmcb(svm);
 
        kvm_cpuid(vcpu, &eax, &dummy, &dummy, &dummy);
        kvm_register_write(vcpu, VCPU_REGS_RDX, eax);
@@ -1267,7 +1266,7 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)
        clear_page(svm->vmcb);
        svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT;
        svm->asid_generation = 0;
-       init_vmcb(svm, false);
+       init_vmcb(svm);
 
        svm_init_osvw(&svm->vcpu);
 
@@ -1889,7 +1888,7 @@ static int shutdown_interception(struct vcpu_svm *svm)
         * so reinitialize it.
         */
        clear_page(svm->vmcb);
-       init_vmcb(svm, false);
+       init_vmcb(svm);
 
        kvm_run->exit_reason = KVM_EXIT_SHUTDOWN;
        return 0;
index aa9e8229571d30428d05dfd3384bd59f6402c5f1..a809fed0f1aefe2c713630df00ad27e2f10627de 100644 (file)
@@ -4780,8 +4780,7 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
        vmx_set_cr0(vcpu, cr0); /* enter rmode */
        vmx->vcpu.arch.cr0 = cr0;
        vmx_set_cr4(vcpu, 0);
-       if (!init_event)
-               vmx_set_efer(vcpu, 0);
+       vmx_set_efer(vcpu, 0);
        vmx_fpu_activate(vcpu);
        update_exception_bitmap(vcpu);