Skip to content

Commit 70d0fe5

Browse files
xinli-intelbp3tk0v
authored andcommitted
KVM: VMX: Call fred_entry_from_kvm() for IRQ/NMI handling
When FRED is enabled, call fred_entry_from_kvm() to handle IRQ/NMI in IRQ/NMI induced VM exits. Signed-off-by: Xin Li <xin3.li@intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Tested-by: Shan Kang <shan.kang@intel.com> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Link: https://lore.kernel.org/r/20231205105030.8698-33-xin3.li@intel.com
1 parent 2e67035 commit 70d0fe5

1 file changed

Lines changed: 9 additions & 3 deletions

File tree

arch/x86/kvm/vmx/vmx.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <asm/desc.h>
3939
#include <asm/fpu/api.h>
4040
#include <asm/fpu/xstate.h>
41+
#include <asm/fred.h>
4142
#include <asm/idtentry.h>
4243
#include <asm/io.h>
4344
#include <asm/irq_remapping.h>
@@ -6960,14 +6961,16 @@ static void handle_external_interrupt_irqoff(struct kvm_vcpu *vcpu)
69606961
{
69616962
u32 intr_info = vmx_get_intr_info(vcpu);
69626963
unsigned int vector = intr_info & INTR_INFO_VECTOR_MASK;
6963-
gate_desc *desc = (gate_desc *)host_idt_base + vector;
69646964

69656965
if (KVM_BUG(!is_external_intr(intr_info), vcpu->kvm,
69666966
"unexpected VM-Exit interrupt info: 0x%x", intr_info))
69676967
return;
69686968

69696969
kvm_before_interrupt(vcpu, KVM_HANDLING_IRQ);
6970-
vmx_do_interrupt_irqoff(gate_offset(desc));
6970+
if (cpu_feature_enabled(X86_FEATURE_FRED))
6971+
fred_entry_from_kvm(EVENT_TYPE_EXTINT, vector);
6972+
else
6973+
vmx_do_interrupt_irqoff(gate_offset((gate_desc *)host_idt_base + vector));
69716974
kvm_after_interrupt(vcpu);
69726975

69736976
vcpu->arch.at_instruction_boundary = true;
@@ -7260,7 +7263,10 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,
72607263
if ((u16)vmx->exit_reason.basic == EXIT_REASON_EXCEPTION_NMI &&
72617264
is_nmi(vmx_get_intr_info(vcpu))) {
72627265
kvm_before_interrupt(vcpu, KVM_HANDLING_NMI);
7263-
vmx_do_nmi_irqoff();
7266+
if (cpu_feature_enabled(X86_FEATURE_FRED))
7267+
fred_entry_from_kvm(EVENT_TYPE_NMI, NMI_VECTOR);
7268+
else
7269+
vmx_do_nmi_irqoff();
72647270
kvm_after_interrupt(vcpu);
72657271
}
72667272

0 commit comments

Comments
 (0)