]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/bugs: Rename MDS machinery to something more generic
authorBorislav Petkov <bp@kernel.org>
Tue, 15 Jul 2025 12:37:45 +0000 (14:37 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Jul 2025 16:28:00 +0000 (18:28 +0200)
From: "Borislav Petkov (AMD)" <bp@alien8.de>

Commit f9af88a3d384c8b55beb5dc5483e5da0135fadbd upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.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 c98fd11907cc8754878ea89f371f5e753d9e0269..e916dc232b0f0c22699ccdf5f99313eeaa87512a 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 bda217961172ba8cf06a24247a0fb29c2b0ba190..057eeb4eda4e72662a7056e40a10f598f34a141c 100644 (file)
@@ -31,20 +31,20 @@ EXPORT_SYMBOL_GPL(entry_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_EMPTY
        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 e585a4705b8ddc298333cf4bf35f0471cacace93..62b29995e51c81949ec5ee251703ca116d39605c 100644 (file)
@@ -56,13 +56,13 @@ static __always_inline void native_irq_enable(void)
 
 static inline __cpuidle void native_safe_halt(void)
 {
-       mds_idle_clear_cpu_buffers();
+       x86_idle_clear_cpu_buffers();
        asm volatile("sti; hlt": : :"memory");
 }
 
 static inline __cpuidle void native_halt(void)
 {
-       mds_idle_clear_cpu_buffers();
+       x86_idle_clear_cpu_buffers();
        asm volatile("hlt": : :"memory");
 }
 
index 29dd27b5a339db16cfb1b40aa68004cf7b2bac0c..35e20e8a7cc655dfc836394f6e7687b33bb9c77c 100644 (file)
@@ -43,7 +43,7 @@ static inline void __monitorx(const void *eax, unsigned long ecx,
 
 static inline void __mwait(unsigned long eax, unsigned long ecx)
 {
-       mds_idle_clear_cpu_buffers();
+       x86_idle_clear_cpu_buffers();
 
        /* "mwait %eax, %ecx;" */
        asm volatile(".byte 0x0f, 0x01, 0xc9;"
@@ -88,7 +88,8 @@ static inline void __mwaitx(unsigned long eax, unsigned long ebx,
 
 static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
 {
-       mds_idle_clear_cpu_buffers();
+       x86_idle_clear_cpu_buffers();
+
        /* "mwait %eax, %ecx;" */
        asm volatile("sti; .byte 0x0f, 0x01, 0xc9;"
                     :: "a" (eax), "c" (ecx));
index 7ccaefaa16a683110e58c58c7a22926e2191965f..4dd7a89bce4718ae7d572e983e215a84c44a9518 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
        ALTERNATIVE "jmp .Lskip_verw_\@", "", X86_FEATURE_CLEAR_CPU_BUF
 #ifdef CONFIG_X86_64
-       verw mds_verw_sel(%rip)
+       verw x86_verw_sel(%rip)
 #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).
         */
-       verw %cs:mds_verw_sel
+       verw %cs:x86_verw_sel
 #endif
 .Lskip_verw_\@:
 .endm
@@ -398,22 +398,22 @@ DECLARE_STATIC_KEY_FALSE(switch_to_cond_stibp);
 DECLARE_STATIC_KEY_FALSE(switch_mm_cond_ibpb);
 DECLARE_STATIC_KEY_FALSE(switch_mm_always_ibpb);
 
-DECLARE_STATIC_KEY_FALSE(mds_idle_clear);
+DECLARE_STATIC_KEY_FALSE(cpu_buf_idle_clear);
 
 DECLARE_STATIC_KEY_FALSE(mmio_stale_data_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;
 
@@ -430,14 +430,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 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 /* __ASSEMBLY__ */
index 195dc9993a88e986ed5e1881cc5838c483d19a54..b0115af384577c0c6a7132a962981c5a4213edee 100644 (file)
@@ -118,9 +118,9 @@ DEFINE_STATIC_KEY_FALSE(switch_mm_cond_ibpb);
 /* Control unconditional IBPB in switch_mm() */
 DEFINE_STATIC_KEY_FALSE(switch_mm_always_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 CPU Fill buffer clear before KVM guest MMIO accesses */
 DEFINE_STATIC_KEY_FALSE(mmio_stale_data_clear);
@@ -445,7 +445,7 @@ static void __init mmio_select_mitigation(void)
         * is required irrespective of SMT state.
         */
        if (!(ia32_cap & ARCH_CAP_FBSDP_NO))
-               static_branch_enable(&mds_idle_clear);
+               static_branch_enable(&cpu_buf_idle_clear);
 
        /*
         * Check if the system has the right microcode.
@@ -1922,10 +1922,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 ||
                   (ia32_cap & ARCH_CAP_FBSDP_NO)) {
-               static_branch_disable(&mds_idle_clear);
+               static_branch_disable(&cpu_buf_idle_clear);
        }
 }
 
index 1908f2aae9fa243b3dac7435e4ac8cc4b201a0cd..795bbaf89d94e10cbf807102260c0ff355b782f6 100644 (file)
@@ -6810,7 +6810,7 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,
                vmx_l1d_flush(vcpu);
        else if (static_branch_unlikely(&mmio_stale_data_clear) &&
                 kvm_arch_has_assigned_device(vcpu->kvm))
-               mds_clear_cpu_buffers();
+               x86_clear_cpu_buffers();
 
        vmx_disable_fb_clear(vmx);