Commit f6106d41 authored by Sean Christopherson's avatar Sean Christopherson
Browse files

x86/bugs: Use an x86 feature to track the MMIO Stale Data mitigation



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: default avatarPawan Gupta <pawan.kumar.gupta@linux.intel.com>
Reviewed-by: default avatarBrendan Jackman <jackmanb@google.com>
Link: https://patch.msgid.link/20251113233746.1703361-5-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent afb99ffb
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -499,6 +499,11 @@
#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)
+0 −2
Original line number Diff line number Diff line
@@ -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>
+1 −10
Original line number Diff line number Diff line
@@ -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);
	}

	/*
+1 −1
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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();