x86/bugs: Rename MDS machinery to something more generic
authorBorislav Petkov (AMD) <bp@alien8.de>
Wed, 11 Sep 2024 03:13:46 +0000 (05:13 +0200)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 16 Jun 2025 16:45:18 +0000 (18:45 +0200)
It will be used by other x86 mitigations.

No functional changes.

Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst
Documentation/arch/x86/mds.rst
arch/x86/entry/entry.S
arch/x86/include/asm/irqflags.h
arch/x86/include/asm/mwait.h
arch/x86/include/asm/nospec-branch.h
arch/x86/kernel/cpu/bugs.c
arch/x86/kvm/vmx/vmx.c

index 1302fd1b55e83c5500406b22fa3c8937591eb6d4..6dba18dbb9abc856aae7dfdf18f35f856f506cca 100644 (file)
@@ -157,9 +157,7 @@ This is achieved by using the otherwise unused and obsolete VERW instruction in
 combination with a microcode update. The microcode clears the affected CPU
 buffers when the VERW instruction is executed.
 
-Kernel reuses the MDS function to invoke the buffer clearing:
-
-       mds_clear_cpu_buffers()
+Kernel does the buffer clearing with x86_clear_cpu_buffers().
 
 On MDS affected CPUs, the kernel already invokes CPU buffer clear on
 kernel/userspace, hypervisor/guest and C-state (idle) transitions. No
index 5a2e6c0ef04a53dc1d311da828880c4006b5a6c7..3518671e1a850313580a365a86a7f81c00d7b96a 100644 (file)
@@ -93,7 +93,7 @@ enters a C-state.
 
 The kernel provides a function to invoke the buffer clearing:
 
-    mds_clear_cpu_buffers()
+    x86_clear_cpu_buffers()
 
 Also macro CLEAR_CPU_BUFFERS can be used in ASM late in exit-to-user path.
 Other than CFLAGS.ZF, this macro doesn't clobber any registers.
@@ -185,9 +185,9 @@ Mitigation points
    idle clearing would be a window dressing exercise and is therefore not
    activated.
 
-   The invocation is controlled by the static key mds_idle_clear which is
-   switched depending on the chosen mitigation mode and the SMT state of
-   the system.
+   The invocation is controlled by the static key cpu_buf_idle_clear which is
+   switched depending on the chosen mitigation mode and the SMT state of the
+   system.
 
    The buffer clear is only invoked before entering the C-State to prevent
    that stale data from the idling CPU from spilling to the Hyper-Thread
index 175958b02f2bfd517ff9a6b1fb480a79559990dd..8e9a0cc20a4ab7f7511170d0ecfec7d7c91c7992 100644 (file)
@@ -36,20 +36,20 @@ EXPORT_SYMBOL_GPL(write_ibpb);
 
 /*
  * Define the VERW operand that is disguised as entry code so that
- * it can be referenced with KPTI enabled. This ensure VERW can be
+ * it can be referenced with KPTI enabled. This ensures VERW can be
  * used late in exit-to-user path after page tables are switched.
  */
 .pushsection .entry.text, "ax"
 
 .align L1_CACHE_BYTES, 0xcc
-SYM_CODE_START_NOALIGN(mds_verw_sel)
+SYM_CODE_START_NOALIGN(x86_verw_sel)
        UNWIND_HINT_UNDEFINED
        ANNOTATE_NOENDBR
        .word __KERNEL_DS
 .align L1_CACHE_BYTES, 0xcc
-SYM_CODE_END(mds_verw_sel);
+SYM_CODE_END(x86_verw_sel);
 /* For KVM */
-EXPORT_SYMBOL_GPL(mds_verw_sel);
+EXPORT_SYMBOL_GPL(x86_verw_sel);
 
 .popsection
 
index 9a9b21b78905a6b6ffe9a8fd57ddeba19ef267b8..b30e5474c18e1be63b7c69354c26ae6a6cb02731 100644 (file)
@@ -44,13 +44,13 @@ static __always_inline void native_irq_enable(void)
 
 static __always_inline void native_safe_halt(void)
 {
-       mds_idle_clear_cpu_buffers();
+       x86_idle_clear_cpu_buffers();
        asm volatile("sti; hlt": : :"memory");
 }
 
 static __always_inline void native_halt(void)
 {
-       mds_idle_clear_cpu_buffers();
+       x86_idle_clear_cpu_buffers();
        asm volatile("hlt": : :"memory");
 }
 
index dd2b129b0418e79f9517e1c38ff390f9e75d7e1d..cc34c3fd197b5381fe1418d8231e80d22619edb2 100644 (file)
@@ -43,7 +43,7 @@ static __always_inline void __monitorx(const void *eax, u32 ecx, u32 edx)
 
 static __always_inline void __mwait(u32 eax, u32 ecx)
 {
-       mds_idle_clear_cpu_buffers();
+       x86_idle_clear_cpu_buffers();
 
        /*
         * Use the instruction mnemonic with implicit operands, as the LLVM
@@ -98,7 +98,7 @@ static __always_inline void __mwaitx(u32 eax, u32 ebx, u32 ecx)
  */
 static __always_inline void __sti_mwait(u32 eax, u32 ecx)
 {
-       mds_idle_clear_cpu_buffers();
+       x86_idle_clear_cpu_buffers();
 
        asm volatile("sti; mwait" :: "a" (eax), "c" (ecx));
 }
index 20d754b98f3fc2a8bad3dd2f3d1be10d033a62bf..5dcd75bb5e0ddc1a011ae29dd201890f5ac20780 100644 (file)
 .endm
 
 /*
- * Macro to execute VERW instruction that mitigate transient data sampling
- * attacks such as MDS. On affected systems a microcode update overloaded VERW
- * instruction to also clear the CPU buffers. VERW clobbers CFLAGS.ZF.
- *
+ * Macro to execute VERW insns that mitigate transient data sampling
+ * attacks such as MDS or TSA. On affected systems a microcode update
+ * overloaded VERW insns to also clear the CPU buffers. VERW clobbers
+ * CFLAGS.ZF.
  * Note: Only the memory operand variant of VERW clears the CPU buffers.
  */
 .macro CLEAR_CPU_BUFFERS
 #ifdef CONFIG_X86_64
-       ALTERNATIVE "", "verw mds_verw_sel(%rip)", X86_FEATURE_CLEAR_CPU_BUF
+       ALTERNATIVE "", "verw x86_verw_sel(%rip)", X86_FEATURE_CLEAR_CPU_BUF
 #else
        /*
         * In 32bit mode, the memory operand must be a %cs reference. The data
         * segments may not be usable (vm86 mode), and the stack segment may not
         * be flat (ESPFIX32).
         */
-       ALTERNATIVE "", "verw %cs:mds_verw_sel", X86_FEATURE_CLEAR_CPU_BUF
+       ALTERNATIVE "", "verw %cs:x86_verw_sel", X86_FEATURE_CLEAR_CPU_BUF
 #endif
 .endm
 
@@ -567,24 +567,24 @@ DECLARE_STATIC_KEY_FALSE(switch_mm_always_ibpb);
 
 DECLARE_STATIC_KEY_FALSE(switch_vcpu_ibpb);
 
-DECLARE_STATIC_KEY_FALSE(mds_idle_clear);
+DECLARE_STATIC_KEY_FALSE(cpu_buf_idle_clear);
 
 DECLARE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush);
 
 DECLARE_STATIC_KEY_FALSE(cpu_buf_vm_clear);
 
-extern u16 mds_verw_sel;
+extern u16 x86_verw_sel;
 
 #include <asm/segment.h>
 
 /**
- * mds_clear_cpu_buffers - Mitigation for MDS and TAA vulnerability
+ * x86_clear_cpu_buffers - Buffer clearing support for different x86 CPU vulns
  *
  * This uses the otherwise unused and obsolete VERW instruction in
  * combination with microcode which triggers a CPU buffer flush when the
  * instruction is executed.
  */
-static __always_inline void mds_clear_cpu_buffers(void)
+static __always_inline void x86_clear_cpu_buffers(void)
 {
        static const u16 ds = __KERNEL_DS;
 
@@ -601,14 +601,15 @@ static __always_inline void mds_clear_cpu_buffers(void)
 }
 
 /**
- * mds_idle_clear_cpu_buffers - Mitigation for MDS vulnerability
+ * x86_idle_clear_cpu_buffers - Buffer clearing support in idle for the MDS
+ * vulnerability
  *
  * Clear CPU buffers if the corresponding static key is enabled
  */
-static __always_inline void mds_idle_clear_cpu_buffers(void)
+static __always_inline void x86_idle_clear_cpu_buffers(void)
 {
-       if (static_branch_likely(&mds_idle_clear))
-               mds_clear_cpu_buffers();
+       if (static_branch_likely(&cpu_buf_idle_clear))
+               x86_clear_cpu_buffers();
 }
 
 #endif /* __ASSEMBLER__ */
index 7f94e6a5497d9a2d312a76095e48d6b364565777..258ed3d2b6a9730d96f78ed07e5b8931ebd51a0b 100644 (file)
@@ -169,9 +169,9 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_always_ibpb);
 DEFINE_STATIC_KEY_FALSE(switch_vcpu_ibpb);
 EXPORT_SYMBOL_GPL(switch_vcpu_ibpb);
 
-/* Control MDS CPU buffer clear before idling (halt, mwait) */
-DEFINE_STATIC_KEY_FALSE(mds_idle_clear);
-EXPORT_SYMBOL_GPL(mds_idle_clear);
+/* Control CPU buffer clear before idling (halt, mwait) */
+DEFINE_STATIC_KEY_FALSE(cpu_buf_idle_clear);
+EXPORT_SYMBOL_GPL(cpu_buf_idle_clear);
 
 /*
  * Controls whether l1d flush based mitigations are enabled,
@@ -637,7 +637,7 @@ static void __init mmio_apply_mitigation(void)
         * is required irrespective of SMT state.
         */
        if (!(x86_arch_cap_msr & ARCH_CAP_FBSDP_NO))
-               static_branch_enable(&mds_idle_clear);
+               static_branch_enable(&cpu_buf_idle_clear);
 
        if (mmio_nosmt || cpu_mitigations_auto_nosmt())
                cpu_smt_disable(false);
@@ -2249,10 +2249,10 @@ static void update_mds_branch_idle(void)
                return;
 
        if (sched_smt_active()) {
-               static_branch_enable(&mds_idle_clear);
+               static_branch_enable(&cpu_buf_idle_clear);
        } else if (mmio_mitigation == MMIO_MITIGATION_OFF ||
                   (x86_arch_cap_msr & ARCH_CAP_FBSDP_NO)) {
-               static_branch_disable(&mds_idle_clear);
+               static_branch_disable(&cpu_buf_idle_clear);
        }
 }
 
index 4953846cb30d1758f2eda294796c5a50ddb9408c..191a9ed0da22719579ab043c30971037a8c32966 100644 (file)
@@ -7291,7 +7291,7 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,
                vmx_l1d_flush(vcpu);
        else if (static_branch_unlikely(&cpu_buf_vm_clear) &&
                 kvm_arch_has_assigned_device(vcpu->kvm))
-               mds_clear_cpu_buffers();
+               x86_clear_cpu_buffers();
 
        vmx_disable_fb_clear(vmx);