]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
KVM: SVM: Move spec control call after restore of GS
authorThomas Gleixner <tglx@linutronix.de>
Fri, 11 May 2018 13:21:01 +0000 (15:21 +0200)
committerBrian Maly <brian.maly@oracle.com>
Mon, 21 May 2018 22:06:56 +0000 (18:06 -0400)
svm_vcpu_run() invokes x86_spec_ctrl_restore_host() after VMEXIT, but
before the host GS is restored. x86_spec_ctrl_restore_host() uses 'current'
to determine the host SSBD state of the thread. 'current' is GS based, but
host GS is not yet restored and the access causes a triple fault.

Move the call after the host GS restore.

OraBug: 28041771
CVE: CVE-2018-3639

Fixes: 885f82bfbc6f x86/process: Allow runtime control of Speculative Store Bypass
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit 15e6c22fd8e5a42c5ed6d487b7c9fe44c2517765)
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Conflicts:
arch/x86/kvm/svm.c

Signed-off-by: Brian Maly <brian.maly@oracle.com>
arch/x86/kvm/svm.c

index 1f6b962449695d0fe8d17ed084f054a82198b146..51a54cfe6d083c912bafff35918d16fd89a6db30 100644 (file)
@@ -4022,12 +4022,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
 #endif
                );
 
-       if (ibrs_supported) {
-               rdmsrl(MSR_IA32_SPEC_CTRL, svm->spec_ctrl);
-
-               x86_spec_ctrl_restore_host(svm->spec_ctrl);
-       }
-
        /* Eliminate branch target predictions from guest mode */
        vmexit_fill_RSB();
 
@@ -4040,6 +4034,12 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
 #endif
 #endif
 
+       if (ibrs_supported) {
+               rdmsrl(MSR_IA32_SPEC_CTRL, svm->spec_ctrl);
+
+               x86_spec_ctrl_restore_host(svm->spec_ctrl);
+       }
+
        reload_tss(vcpu);
 
        local_irq_disable();