This is a note to let you know that I've just added the patch titled KVM/VMX: Move VERW closer to VMentry for MDS mitigation to the 5.10-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: kvm-vmx-move-verw-closer-to-vmentry-for-mds-mitigation.patch and it can be found in the queue-5.10 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From stable+bounces-27548-greg=kroah.com@xxxxxxxxxxxxxxx Tue Mar 12 23:41:11 2024 From: Pawan Gupta <pawan.kumar.gupta@xxxxxxxxxxxxxxx> Date: Tue, 12 Mar 2024 15:41:02 -0700 Subject: KVM/VMX: Move VERW closer to VMentry for MDS mitigation To: stable@xxxxxxxxxxxxxxx Cc: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>, Sean Christopherson <seanjc@xxxxxxxxxx> Message-ID: <20240312-delay-verw-backport-5-10-y-v2-7-ad081ccd89ca@xxxxxxxxxxxxxxx> Content-Disposition: inline From: Pawan Gupta <pawan.kumar.gupta@xxxxxxxxxxxxxxx> commit 43fb862de8f628c5db5e96831c915b9aebf62d33 upstream. 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. [ pawan: conflict resolved in backport ] Signed-off-by: Pawan Gupta <pawan.kumar.gupta@xxxxxxxxxxxxxxx> Signed-off-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> Acked-by: Sean Christopherson <seanjc@xxxxxxxxxx> Link: https://lore.kernel.org/all/20240213-delay-verw-v8-6-a6216d83edb7%40linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- arch/x86/kvm/vmx/vmenter.S | 3 +++ arch/x86/kvm/vmx/vmx.c | 12 ++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) --- a/arch/x86/kvm/vmx/vmenter.S +++ b/arch/x86/kvm/vmx/vmenter.S @@ -99,6 +99,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 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -397,7 +397,8 @@ static __always_inline void vmx_enable_f static void vmx_update_fb_clear_dis(struct kvm_vcpu *vcpu, struct vcpu_vmx *vmx) { - vmx->disable_fb_clear = vmx_fb_clear_ctrl_available; + vmx->disable_fb_clear = !cpu_feature_enabled(X86_FEATURE_CLEAR_CPU_BUF) && + vmx_fb_clear_ctrl_available; /* * If guest will not execute VERW, there is no need to set FB_CLEAR_DIS @@ -6792,11 +6793,14 @@ static noinstr void vmx_vcpu_enter_exit( guest_enter_irqoff(); lockdep_hardirqs_on(CALLER_ADDR0); - /* 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 in spite 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)) mds_clear_cpu_buffers(); Patches currently in stable-queue which might be from kroah.com@xxxxxxxxxxxxxxx are queue-5.10/x86-rfds-mitigate-register-file-data-sampling-rfds.patch queue-5.10/x86-entry_32-add-verw-just-before-userspace-transition.patch queue-5.10/x86-bugs-add-asm-helpers-for-executing-verw.patch queue-5.10/kvm-x86-export-rfds_no-and-rfds_clear-to-guests.patch queue-5.10/x86-asm-add-_asm_rip-macro-for-x86-64-rip-suffix.patch queue-5.10/x86-entry_64-add-verw-just-before-userspace-transition.patch queue-5.10/x86-mmio-disable-kvm-mitigation-when-x86_feature_clear_cpu_buf-is-set.patch queue-5.10/x86-bugs-use-alternative-instead-of-mds_user_clear-static-key.patch queue-5.10/documentation-hw-vuln-add-documentation-for-rfds.patch queue-5.10/kvm-vmx-use-bt-jnc-i.e.-eflags.cf-to-select-vmresume-vs.-vmlaunch.patch queue-5.10/kvm-vmx-move-verw-closer-to-vmentry-for-mds-mitigation.patch