lkml.org 
[lkml]   [2018]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 059/410] KVM/x86: Remove indirect MSR op calls from SPEC_CTRL
    3.16.57-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Paolo Bonzini <pbonzini@redhat.com>

    commit ecb586bd29c99fb4de599dec388658e74388daad upstream.

    Having a paravirt indirect call in the IBRS restore path is not a
    good idea, since we are trying to protect from speculative execution
    of bogus indirect branch targets. It is also slower, so use
    native_wrmsrl() on the vmentry path too.

    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: Jim Mattson <jmattson@google.com>
    Cc: David Woodhouse <dwmw@amazon.co.uk>
    Cc: KarimAllah Ahmed <karahmed@amazon.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: kvm@vger.kernel.org
    Fixes: d28b387fb74da95d69d2615732f50cceb38e9a4d
    Link: http://lkml.kernel.org/r/20180222154318.20361-2-pbonzini@redhat.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [bwh: Backported to 3.16: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    arch/x86/kvm/svm.c | 7 ++++---
    arch/x86/kvm/vmx.c | 7 ++++---
    2 files changed, 8 insertions(+), 6 deletions(-)

    --- a/arch/x86/kvm/svm.c
    +++ b/arch/x86/kvm/svm.c
    @@ -36,6 +36,7 @@
    #include <asm/desc.h>
    #include <asm/debugreg.h>
    #include <asm/kvm_para.h>
    +#include <asm/microcode.h>
    #include <asm/nospec-branch.h>

    #include <asm/virtext.h>
    @@ -3967,7 +3968,7 @@ static void svm_vcpu_run(struct kvm_vcpu
    * being speculatively taken.
    */
    if (svm->spec_ctrl)
    - wrmsrl(MSR_IA32_SPEC_CTRL, svm->spec_ctrl);
    + native_wrmsrl(MSR_IA32_SPEC_CTRL, svm->spec_ctrl);

    asm volatile (
    "push %%" _ASM_BP "; \n\t"
    @@ -4077,10 +4078,10 @@ static void svm_vcpu_run(struct kvm_vcpu
    * save it.
    */
    if (!msr_write_intercepted(vcpu, MSR_IA32_SPEC_CTRL))
    - rdmsrl(MSR_IA32_SPEC_CTRL, svm->spec_ctrl);
    + svm->spec_ctrl = native_read_msr(MSR_IA32_SPEC_CTRL);

    if (svm->spec_ctrl)
    - wrmsrl(MSR_IA32_SPEC_CTRL, 0);
    + native_wrmsrl(MSR_IA32_SPEC_CTRL, 0);

    /* Eliminate branch target predictions from guest mode */
    vmexit_fill_RSB();
    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -46,6 +46,7 @@
    #include <asm/perf_event.h>
    #include <asm/debugreg.h>
    #include <asm/kexec.h>
    +#include <asm/microcode.h>
    #include <asm/nospec-branch.h>

    #include "trace.h"
    @@ -7542,7 +7543,7 @@ static void __noclone vmx_vcpu_run(struc
    * being speculatively taken.
    */
    if (vmx->spec_ctrl)
    - wrmsrl(MSR_IA32_SPEC_CTRL, vmx->spec_ctrl);
    + native_wrmsrl(MSR_IA32_SPEC_CTRL, vmx->spec_ctrl);

    vmx->__launched = vmx->loaded_vmcs->launched;
    asm(
    @@ -7673,10 +7674,10 @@ static void __noclone vmx_vcpu_run(struc
    * save it.
    */
    if (!msr_write_intercepted_l01(vcpu, MSR_IA32_SPEC_CTRL))
    - rdmsrl(MSR_IA32_SPEC_CTRL, vmx->spec_ctrl);
    + vmx->spec_ctrl = native_read_msr(MSR_IA32_SPEC_CTRL);

    if (vmx->spec_ctrl)
    - wrmsrl(MSR_IA32_SPEC_CTRL, 0);
    + native_wrmsrl(MSR_IA32_SPEC_CTRL, 0);

    /* Eliminate branch target predictions from guest mode */
    vmexit_fill_RSB();
    \
     
     \ /
      Last update: 2018-06-07 16:34    [W:5.202 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site