lkml.org 
[lkml]   [2023]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3 6/6] KVM: VMX: Move VERW closer to VMentry for MDS mitigation
    During VMentry VERW is executed to mitigate MDS. After VERW, any memory
    access like register push onto stack may put host data in MDS affected
    CPU buffers. A guest can then use MDS to sample host data.

    Although likelihood of secrets surviving in registers at current VERW
    callsite is less, but it can't be ruled out. Harden the MDS mitigation
    by moving the VERW mitigation late in VMentry path.

    Note that VERW for MMIO Stale Data mitigation is unchanged because of
    the complexity of per-guest conditional VERW which is not easy to handle
    that late in asm with no GPRs available. If the CPU is also affected by
    MDS, VERW is unconditionally executed late in asm regardless of guest
    having MMIO access.

    Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
    ---
    arch/x86/kvm/vmx/vmenter.S | 3 +++
    arch/x86/kvm/vmx/vmx.c | 10 +++++++---
    2 files changed, 10 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/kvm/vmx/vmenter.S b/arch/x86/kvm/vmx/vmenter.S
    index b3b13ec04bac..139960deb736 100644
    --- a/arch/x86/kvm/vmx/vmenter.S
    +++ b/arch/x86/kvm/vmx/vmenter.S
    @@ -161,6 +161,9 @@ SYM_FUNC_START(__vmx_vcpu_run)
    /* Load guest RAX. This kills the @regs pointer! */
    mov VCPU_RAX(%_ASM_AX), %_ASM_AX

    + /* Clobbers EFLAGS.ZF */
    + CLEAR_CPU_BUFFERS
    +
    /* Check EFLAGS.CF from the VMX_RUN_VMRESUME bit test above. */
    jnc .Lvmlaunch

    diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
    index 24e8694b83fc..2d149589cf5b 100644
    --- a/arch/x86/kvm/vmx/vmx.c
    +++ b/arch/x86/kvm/vmx/vmx.c
    @@ -7226,13 +7226,17 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,

    guest_state_enter_irqoff();

    - /* L1D Flush includes CPU buffer clear to mitigate MDS */
    + /*
    + * L1D Flush includes CPU buffer clear to mitigate MDS, but VERW
    + * mitigation for MDS is done late in VMentry and is still
    + * executed inspite of L1D Flush. This is because an extra VERW
    + * should not matter much after the big hammer L1D Flush.
    + */
    if (static_branch_unlikely(&vmx_l1d_should_flush))
    vmx_l1d_flush(vcpu);
    - else if (cpu_feature_enabled(X86_FEATURE_CLEAR_CPU_BUF))
    - mds_clear_cpu_buffers();
    else if (static_branch_unlikely(&mmio_stale_data_clear) &&
    kvm_arch_has_assigned_device(vcpu->kvm))
    + /* MMIO mitigation is mutually exclusive with MDS mitigation later in asm */
    mds_clear_cpu_buffers();

    vmx_disable_fb_clear(vmx);
    --
    2.34.1


    \
     
     \ /
      Last update: 2023-10-25 22:55    [W:3.788 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site