[PATCH Dovetail v2 4/6] arm: irq_pipeline: Fix ordering problem in alignment trap handling
Florian Bezdeka <[email protected]>
| Newsgroups | dev.linux.lists.xenomai |
|---|---|
| Message-ID | <20260610-wip-flo-v7-1-arm-pipelining-fixes-v2-4-62c9c477f8f2@siemens.com> |
mark_trap_entry() will migrate to the inband stage and enable hard IRQs. With that the IRQ pipelining is active, allowing hard IRQs to arrive but keeping the inband stage stalled. Moving the mark_trap_entry() above the - still wrong - interrupts_enabled() to follow the same pattern as in other trap handlers. As we are inband after the call we can now enable inband IRQs if the parent context allows that. Signed-off-by: Florian Bezdeka <[email protected]> --- arch/arm/mm/alignment.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index 76f2716635b73a0001efc3308777fc6a3bd712ca..1d457f22a3e7db8b71006b673dd20646847de3c1 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c @@ -815,11 +815,11 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) if (addr >= TASK_SIZE && user_mode(regs)) harden_branch_predictor(); - if (interrupts_enabled(regs)) - hard_local_irq_enable(); - mark_trap_entry(ARM_TRAP_ALIGNMENT, regs); + if (interrupts_enabled(regs)) + local_irq_enable(); + instrptr = instruction_pointer(regs); if (thumb_mode(regs)) { @@ -1001,7 +1001,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) * entry-common.S) and disable the alignment trap only if * there is no work pending for this thread. */ - hard_local_irq_disable(); + local_irq_disable(); if (!(read_thread_flags() & _TIF_WORK_MASK)) set_cr(cr_no_alignment); } -- 2.54.0