From: Sean Christopherson <sea...@google.com>

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: Sean Christopherson <sea...@google.com>
Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
---
 arch/x86/include/asm/idtentry.h |    9 ++-------
 arch/x86/kernel/irqinit.c       |    6 ++++--
 2 files changed, 6 insertions(+), 9 deletions(-)

--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -460,17 +460,12 @@ __visible noinstr void func(struct pt_re
 #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);             \
 }
 
--- a/arch/x86/kernel/irqinit.c
+++ b/arch/x86/kernel/irqinit.c
@@ -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();



Reply via email to