[PATCH Dovetail 2/2] arm64: irq_pipeline: Fix the demotion checks for el0 and el1 IRQs
Florian Bezdeka <[email protected]>
| Newsgroups | dev.linux.lists.xenomai |
|---|---|
| Message-ID | <20260216-wip-flo-v6-19-dovetail-rebase-v1-2-5c36863cba17@siemens.com> |
While reviewing some of the low level pipeline code I realized that
the checks for task demotion are wrong on arm64.
el0: The demotion check was missing in the oob case. We have to check
for running_inband() only as user_mode(regs) will always be true.
We are serving an IRQ over el0, so application / user mode.
el1: The demotion check was unnecessary and "inactive" as
user_mode(regs) is never true on el1, we are serving an IRQ over
kernel mode.
Signed-off-by: Florian Bezdeka <[email protected]>
---
arch/arm64/kernel/entry-common.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
index 07fa70713ce04eaf3df9223354babcecde923280..9c99eb3d18c459a90e1f7ce4e4c307e235e457a2 100644
--- a/arch/arm64/kernel/entry-common.c
+++ b/arch/arm64/kernel/entry-common.c
@@ -73,6 +73,10 @@ static noinstr void arm64_pipeline_el0_irq(struct pt_regs *regs,
do_interrupt_handler(regs, handler);
/* Done, unwind now. */
handle_irq_pipelined_finish(prevd, regs);
+ if (running_inband()) {
+ stall_inband_nocheck();
+ irqentry_exit_to_user_mode(regs);
+ }
instrumentation_end();
arm64_exit_to_user_mode(regs);
}
@@ -90,10 +94,6 @@ static noinstr void arm64_pipeline_el1_irq(struct pt_regs *regs,
prevd = handle_irq_pipelined_prepare(regs);
do_interrupt_handler(regs, handler);
handle_irq_pipelined_finish(prevd, regs);
- if (running_inband() && user_mode(regs)) {
- stall_inband_nocheck();
- irqentry_exit_to_user_mode(regs);
- }
instrumentation_end();
mte_check_tfsr_exit();
return;
--
2.53.0