On 5/14/2025 7:15 AM, Sean Christopherson wrote: > On Tue, May 13, 2025, Sohil Mehta wrote: >> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c >> index 5c5766467a61..1d43d4a2f6b6 100644 >> --- a/arch/x86/kvm/vmx/vmx.c >> +++ b/arch/x86/kvm/vmx/vmx.c >> @@ -7079,7 +7079,7 @@ static void handle_external_interrupt_irqoff(struct kvm_vcpu *vcpu, >> >> kvm_before_interrupt(vcpu, KVM_HANDLING_IRQ); >> if (cpu_feature_enabled(X86_FEATURE_FRED)) >> - fred_entry_from_kvm(EVENT_TYPE_EXTINT, vector); >> + fred_entry_from_kvm(EVENT_TYPE_EXTINT, vector, 0); >> else >> vmx_do_interrupt_irqoff(gate_offset((gate_desc *)host_idt_base + vector)); >> kvm_after_interrupt(vcpu); >> @@ -7393,7 +7393,8 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu, >> is_nmi(vmx_get_intr_info(vcpu))) { >> kvm_before_interrupt(vcpu, KVM_HANDLING_NMI); >> if (cpu_feature_enabled(X86_FEATURE_FRED)) >> - fred_entry_from_kvm(EVENT_TYPE_NMI, NMI_VECTOR); >> + fred_entry_from_kvm(EVENT_TYPE_NMI, NMI_VECTOR, >> + vmx_get_exit_qual(vcpu)); >> else >> vmx_do_nmi_irqoff(); >> kvm_after_interrupt(vcpu); > > As a prep patch, what if we provide separate wrappers for IRQ vs. NMI? That way > KVM doesn't need to shove a '0' literal for the IRQ case. There isn't that much > code that's actually shared between the two, once you account for KVM having to > hardcode the NMI information. > Seems reasonable to me. I don't see the IRQ side using the Event data anytime soon (or ever). We still need to pass 0 to asm_fred_entry_from_kvm() for the IRQ case but that would be contained in asm/fred.h and would not affect KVM. > Compile tested only... > No worries. I'll test it out. I am assuming you want this patch to go as part of this series. > -- > From: Sean Christopherson <seanjc@xxxxxxxxxx> > Date: Wed, 14 May 2025 07:07:55 -0700 > Subject: [PATCH] x86/fred: Provide separate IRQ vs. NMI wrappers for "entry" > from KVM > > Provide separate wrappers for forwarding IRQs vs NMIs from KVM in > anticipation of adding support for NMI source reporting, which will add > an NMI-only parameter, i.e. will further pollute the current API with a > param that is a hardcoded for one of the two call sites. > > Opportunistically tag the non-FRED NMI wrapper __always_inline, as the > compiler could theoretically generate a function call and trigger and a > (completely benign) "leaving noinstr" warning. > If this is really a concern, wouldn't there be similar semantics in other places as well? > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > --- > arch/x86/include/asm/fred.h | 24 +++++++++++++++++++----- > arch/x86/kvm/vmx/vmx.c | 4 ++-- > 2 files changed, 21 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/include/asm/fred.h b/arch/x86/include/asm/fred.h > index 2a29e5216881..dfb4f5e6a37a 100644 > --- a/arch/x86/include/asm/fred.h > +++ b/arch/x86/include/asm/fred.h > @@ -10,6 +10,7 @@ > > #include <asm/asm.h> > #include <asm/trapnr.h> > +#include <asm/irq_vectors.h> > I'll move the header insertion to keep it alphabetically ordered. > /* > * FRED event return instruction opcodes for ERET{S,U}; supported in > @@ -70,14 +71,26 @@ __visible void fred_entry_from_user(struct pt_regs *regs); > __visible void fred_entry_from_kernel(struct pt_regs *regs); > __visible void __fred_entry_from_kvm(struct pt_regs *regs); > > -/* Can be called from noinstr code, thus __always_inline */ > -static __always_inline void fred_entry_from_kvm(unsigned int type, unsigned int vector) > +/* Must be called from noinstr code, thus __always_inline */ > +static __always_inline void fred_nmi_from_kvm(void) > { > struct fred_ss ss = { > .ss =__KERNEL_DS, > - .type = type, > + .type = EVENT_TYPE_NMI, > + .vector = NMI_VECTOR, > + .nmi = true, > + .lm = 1, > + }; > + > + asm_fred_entry_from_kvm(ss); > +} > + The original code uses spaces for alignment. Since we are modifying it, I am thinking of changing it to tabs. > +static inline void fred_irq_from_kvm(unsigned int vector) > +{ > + struct fred_ss ss = { > + .ss =__KERNEL_DS, > + .type = EVENT_TYPE_EXTINT, > .vector = vector, > - .nmi = type == EVENT_TYPE_NMI, > .lm = 1, > }; > Thanks, Sohil