Commit 2d1435b7 authored by Sean Christopherson's avatar Sean Christopherson Committed by Peter Zijlstra
Browse files

x86/fred: Install system vector handlers even if FRED isn't fully enabled



Install the system vector IRQ handlers for FRED even if FRED isn't fully
enabled in hardware.  This will allow KVM to use the FRED IRQ path even
on non-FRED hardware, which in turn will eliminate a non-CFI indirect CALL
(KVM currently invokes the IRQ handler via an IDT lookup on the vector).

[sean: extract from diff, drop stub, write changelog]
Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20250714103441.121251108@infradead.org
parent c8ed0812
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -460,17 +460,12 @@ __visible noinstr void func(struct pt_regs *regs, \
#endif

void idt_install_sysvec(unsigned int n, const void *function);

#ifdef CONFIG_X86_FRED
void fred_install_sysvec(unsigned int vector, const idtentry_t function);
#else
static inline void fred_install_sysvec(unsigned int vector, const idtentry_t function) { }
#endif

#define sysvec_install(vector, function) {				\
	if (cpu_feature_enabled(X86_FEATURE_FRED))			\
	if (IS_ENABLED(CONFIG_X86_FRED))				\
		fred_install_sysvec(vector, function);			\
	else								\
	if (!cpu_feature_enabled(X86_FEATURE_FRED))			\
		idt_install_sysvec(vector, asm_##function);		\
}

+4 −2
Original line number Diff line number Diff line
@@ -97,9 +97,11 @@ void __init native_init_IRQ(void)
	/* Execute any quirks before the call gates are initialised: */
	x86_init.irqs.pre_vector_init();

	if (cpu_feature_enabled(X86_FEATURE_FRED))
	/* FRED's IRQ path may be used even if FRED isn't fully enabled. */
	if (IS_ENABLED(CONFIG_X86_FRED))
		fred_complete_exception_setup();
	else

	if (!cpu_feature_enabled(X86_FEATURE_FRED))
		idt_setup_apic_and_irq_gates();

	lapic_assign_system_vectors();