]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/bugs: Use an x86 feature to track the MMIO Stale Data mitigation
authorSean Christopherson <seanjc@google.com>
Thu, 13 Nov 2025 23:37:41 +0000 (15:37 -0800)
committerSean Christopherson <seanjc@google.com>
Wed, 19 Nov 2025 00:22:42 +0000 (16:22 -0800)
Convert the MMIO Stale Data mitigation tracking from a static branch into
an x86 feature flag so that it can be used via ALTERNATIVE_2 in KVM.

No functional change intended.

Reviewed-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Reviewed-by: Brendan Jackman <jackmanb@google.com>
Link: https://patch.msgid.link/20251113233746.1703361-5-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/include/asm/cpufeatures.h
arch/x86/include/asm/nospec-branch.h
arch/x86/kernel/cpu/bugs.c
arch/x86/kvm/mmu/spte.c
arch/x86/kvm/vmx/vmx.c

index 4091a776e37aaed67ca93b0a0cd23cc25dbc33d4..fc5698844a0bf99005e02337c6b8838acf472fcc 100644 (file)
 #define X86_FEATURE_IBPB_EXIT_TO_USER  (21*32+14) /* Use IBPB on exit-to-userspace, see VMSCAPE bug */
 #define X86_FEATURE_ABMC               (21*32+15) /* Assignable Bandwidth Monitoring Counters */
 #define X86_FEATURE_MSR_IMM            (21*32+16) /* MSR immediate form instructions */
+#define X86_FEATURE_CLEAR_CPU_BUF_VM_MMIO (21*32+17) /*
+                                                     * Clear CPU buffers before VM-Enter if the vCPU
+                                                     * can access host MMIO (ignored for all intents
+                                                     * and purposes if CLEAR_CPU_BUF_VM is set).
+                                                     */
 
 /*
  * BUG word(s)
index cb36a8ea00d337919dcd3adad097d05a2c0520b5..afdcdf40e4143516cae3a769d09c5b7c5e574522 100644 (file)
@@ -585,8 +585,6 @@ 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 x86_verw_sel;
 
 #include <asm/segment.h>
index 2847e11fbab52e2b061d3ac8928e43939dc7bf38..8391a20fe5a8c2efa90707dcee47b69bd3ce4b33 100644 (file)
@@ -192,14 +192,6 @@ EXPORT_SYMBOL_GPL(cpu_buf_idle_clear);
  */
 DEFINE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush);
 
-/*
- * Controls CPU Fill buffer clear before VMenter. This is a subset of
- * X86_FEATURE_CLEAR_CPU_BUF_VM, and should only be enabled when KVM-only
- * mitigation is required.
- */
-DEFINE_STATIC_KEY_FALSE(cpu_buf_vm_clear);
-EXPORT_SYMBOL_GPL(cpu_buf_vm_clear);
-
 #undef pr_fmt
 #define pr_fmt(fmt)    "mitigations: " fmt
 
@@ -751,9 +743,8 @@ static void __init mmio_apply_mitigation(void)
        if (verw_clear_cpu_buf_mitigation_selected) {
                setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF);
                setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM);
-               static_branch_disable(&cpu_buf_vm_clear);
        } else {
-               static_branch_enable(&cpu_buf_vm_clear);
+               setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM_MMIO);
        }
 
        /*
index 37647afde7d3acfa1301a771ac44792eab879495..85a0473809b0ec6e9e190fb69666285bc84701d8 100644 (file)
@@ -292,7 +292,7 @@ bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
                mark_page_dirty_in_slot(vcpu->kvm, slot, gfn);
        }
 
-       if (static_branch_unlikely(&cpu_buf_vm_clear) &&
+       if (cpu_feature_enabled(X86_FEATURE_CLEAR_CPU_BUF_VM_MMIO) &&
            !kvm_vcpu_can_access_host_mmio(vcpu) &&
            kvm_is_mmio_pfn(pfn, &is_host_mmio))
                kvm_track_host_mmio_mapping(vcpu);
index d98107a7bdaa4e4f8cc6e7dc03337e9fceec0dcd..67702609f68e3cbe522d14b73e37046c61b83947 100644 (file)
@@ -903,7 +903,7 @@ unsigned int __vmx_vcpu_run_flags(struct vcpu_vmx *vmx)
        if (!msr_write_intercepted(vmx, MSR_IA32_SPEC_CTRL))
                flags |= VMX_RUN_SAVE_SPEC_CTRL;
 
-       if (static_branch_unlikely(&cpu_buf_vm_clear) &&
+       if (cpu_feature_enabled(X86_FEATURE_CLEAR_CPU_BUF_VM_MMIO) &&
            kvm_vcpu_can_access_host_mmio(&vmx->vcpu))
                flags |= VMX_RUN_CLEAR_CPU_BUFFERS_FOR_MMIO;
 
@@ -7325,7 +7325,7 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,
         */
        if (static_branch_unlikely(&vmx_l1d_should_flush))
                vmx_l1d_flush(vcpu);
-       else if (static_branch_unlikely(&cpu_buf_vm_clear) &&
+       else if (cpu_feature_enabled(X86_FEATURE_CLEAR_CPU_BUF_VM_MMIO) &&
                 (flags & VMX_RUN_CLEAR_CPU_BUFFERS_FOR_MMIO))
                x86_clear_cpu_buffers();