mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 11:03:43 +02:00
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: 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>
This commit is contained in:
parent
afb99ffbd5
commit
f6106d41ec
|
|
@ -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_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_ABMC (21*32+15) /* Assignable Bandwidth Monitoring Counters */
|
||||||
#define X86_FEATURE_MSR_IMM (21*32+16) /* MSR immediate form instructions */
|
#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)
|
* BUG word(s)
|
||||||
|
|
|
||||||
|
|
@ -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(switch_mm_cond_l1d_flush);
|
||||||
|
|
||||||
DECLARE_STATIC_KEY_FALSE(cpu_buf_vm_clear);
|
|
||||||
|
|
||||||
extern u16 x86_verw_sel;
|
extern u16 x86_verw_sel;
|
||||||
|
|
||||||
#include <asm/segment.h>
|
#include <asm/segment.h>
|
||||||
|
|
|
||||||
|
|
@ -192,14 +192,6 @@ EXPORT_SYMBOL_GPL(cpu_buf_idle_clear);
|
||||||
*/
|
*/
|
||||||
DEFINE_STATIC_KEY_FALSE(switch_mm_cond_l1d_flush);
|
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
|
#undef pr_fmt
|
||||||
#define pr_fmt(fmt) "mitigations: " 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) {
|
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);
|
||||||
setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM);
|
setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM);
|
||||||
static_branch_disable(&cpu_buf_vm_clear);
|
|
||||||
} else {
|
} else {
|
||||||
static_branch_enable(&cpu_buf_vm_clear);
|
setup_force_cpu_cap(X86_FEATURE_CLEAR_CPU_BUF_VM_MMIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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_vcpu_can_access_host_mmio(vcpu) &&
|
||||||
kvm_is_mmio_pfn(pfn, &is_host_mmio))
|
kvm_is_mmio_pfn(pfn, &is_host_mmio))
|
||||||
kvm_track_host_mmio_mapping(vcpu);
|
kvm_track_host_mmio_mapping(vcpu);
|
||||||
|
|
|
||||||
|
|
@ -903,7 +903,7 @@ unsigned int __vmx_vcpu_run_flags(struct vcpu_vmx *vmx)
|
||||||
if (!msr_write_intercepted(vmx, MSR_IA32_SPEC_CTRL))
|
if (!msr_write_intercepted(vmx, MSR_IA32_SPEC_CTRL))
|
||||||
flags |= VMX_RUN_SAVE_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))
|
kvm_vcpu_can_access_host_mmio(&vmx->vcpu))
|
||||||
flags |= VMX_RUN_CLEAR_CPU_BUFFERS_FOR_MMIO;
|
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))
|
if (static_branch_unlikely(&vmx_l1d_should_flush))
|
||||||
vmx_l1d_flush(vcpu);
|
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))
|
(flags & VMX_RUN_CLEAR_CPU_BUFFERS_FOR_MMIO))
|
||||||
x86_clear_cpu_buffers();
|
x86_clear_cpu_buffers();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user