[RFC PATCH Dovetail 7.1] x86: irq_pipeline: Allow X86_FRED to be enabled

Florian Bezdeka <[email protected]>
Newsgroups dev.linux.lists.xenomai
Message-ID <[email protected]>
Some low level entry functions, fred_##func were not defined when
FRED has been enabled:

ld: vmlinux.o:(.data..ro_after_init+0x6100): undefined reference to `fred_sysvec_apic_timer_interrupt'
ld: vmlinux.o:(.data..ro_after_init+0x6120): undefined reference to `fred_sysvec_kvm_posted_intr_nested_ipi'
ld: vmlinux.o:(.data..ro_after_init+0x6128): undefined reference to `fred_sysvec_kvm_posted_intr_wakeup_ipi'
ld: vmlinux.o:(.data..ro_after_init+0x6130): undefined reference to `fred_sysvec_kvm_posted_intr_ipi'
ld: vmlinux.o:(.data..ro_after_init+0x6150): undefined reference to `fred_sysvec_irq_work'
ld: vmlinux.o:(.data..ro_after_init+0x6158): undefined reference to `fred_sysvec_x86_platform_ipi'
ld: vmlinux.o:(.data..ro_after_init+0x6160): undefined reference to `fred_sysvec_reboot'
ld: vmlinux.o:(.data..ro_after_init+0x6178): undefined reference to `fred_sysvec_call_function_single'
ld: vmlinux.o:(.data..ro_after_init+0x6180): undefined reference to `fred_sysvec_call_function'
ld: vmlinux.o:(.data..ro_after_init+0x6188): undefined reference to `fred_sysvec_reschedule_ipi'
ld: vmlinux.o:(.data..ro_after_init+0x6198): undefined reference to `fred_sysvec_spurious_apic_interrupt'

Updating the DEFINE_IDTENTRY_SYSVEC_PIPELINED() and
DEFINE_IDTENTRY_SYSVEC_PIPELINED_NORETURN() macros to define those
functions.

FRED entry points for sysvecs will no go through the IRQ pipeline as
we do it for the IDT.

Signed-off-by: Florian Bezdeka <[email protected]>
---

Hi Philippe,

input highly welcome. This allows to build x86 with FRED enabled, which
fixes a compile time issue introduced with 7.1-rc5.

On first glance that seems to do the right thing, but as always I might
miss something.

 arch/x86/Kconfig                |  2 +-
 arch/x86/include/asm/idtentry.h | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 4d40fbb58b1c..fc6500301ff9 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -554,7 +554,7 @@ config X86_CPU_RESCTRL_INTEL_AET
 
 config X86_FRED
 	bool "Flexible Return and Event Delivery"
-	depends on X86_64 && !IRQ_PIPELINE
+	depends on X86_64
 	help
 	  When enabled, use Flexible Return and Event Delivery
 	  instead of the legacy SYSCALL/SYSENTER/IDT architecture for
diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index 0b517059ae9d..bb1df662dc56 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -222,6 +222,11 @@ static __always_inline void __##func(struct pt_regs *regs, u8 vector)
  */
 #define DEFINE_IDTENTRY_SYSVEC_PIPELINED(vector, func)			\
 __visible noinstr void func(struct pt_regs *regs)			\
+{									\
+	arch_pipeline_entry(regs, vector);				\
+}									\
+									\
+void fred_##func(struct pt_regs *regs)					\
 {									\
 	arch_pipeline_entry(regs, vector);				\
 }									\
@@ -233,6 +238,12 @@ __visible noinstr void func(struct pt_regs *regs)			\
 {									\
 	arch_pipeline_entry(regs, vector);				\
 }									\
+									\
+void fred_##func(struct pt_regs *regs)					\
+{									\
+	arch_pipeline_entry(regs, vector);				\
+}									\
+									\
 __visible __noreturn void __##func(struct pt_regs *regs)
 
 #define DEFINE_IDTENTRY_SYSVEC_SIMPLE_PIPELINED(vector, func)		\
-- 
2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.