From 2f529f9b558ca1c1bd74be7437a84e4711743404 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 01 Nov 2024 02:11:33 +0000
Subject: [PATCH] add xenomai
---
kernel/arch/arm64/kernel/process.c | 36 ++++++++++++++++++++++++++++++++++++
1 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/kernel/arch/arm64/kernel/process.c b/kernel/arch/arm64/kernel/process.c
index c38a5ab..c2b328f 100644
--- a/kernel/arch/arm64/kernel/process.c
+++ b/kernel/arch/arm64/kernel/process.c
@@ -125,6 +125,7 @@
* tricks
*/
cpu_do_idle();
+ hard_cond_local_irq_enable();
raw_local_irq_enable();
}
@@ -824,8 +825,41 @@
core_initcall(tagged_addr_init);
#endif /* CONFIG_ARM64_TAGGED_ADDR_ABI */
+#ifdef CONFIG_IRQ_PIPELINE
+
+/*
+ * When pipelining interrupts, we have to reconcile the hardware and
+ * the virtual states. Hard irqs are off on entry while the current
+ * stage has to be unstalled: fix this up by stalling the in-band
+ * stage on entry, unstalling on exit.
+ */
+static inline void arm64_preempt_irq_enter(void)
+{
+ WARN_ON_ONCE(irq_pipeline_debug() && test_inband_stall());
+ stall_inband();
+ trace_hardirqs_off();
+}
+
+static inline void arm64_preempt_irq_exit(void)
+{
+ trace_hardirqs_on();
+ unstall_inband();
+}
+
+#else
+
+static inline void arm64_preempt_irq_enter(void)
+{ }
+
+static inline void arm64_preempt_irq_exit(void)
+{ }
+
+#endif
+
asmlinkage void __sched arm64_preempt_schedule_irq(void)
{
+ arm64_preempt_irq_enter();
+
lockdep_assert_irqs_disabled();
/*
@@ -838,6 +872,8 @@
*/
if (system_capabilities_finalized())
preempt_schedule_irq();
+
+ arm64_preempt_irq_exit();
}
#ifdef CONFIG_BINFMT_ELF
--
Gitblit v1.6.2