[PATCH Dovetail v3 2/6] arm: irq_pipeline: Fix dovetail_fault_{entry,exit} bypass in do_kernel_address_page_fault
Florian Bezdeka <[email protected]> Mon, 22 Jun 2026 10:05:26 +0200
| Newsgroups | dev.linux.lists.xenomai |
|---|---|
| Message-ID | <20260622-wip-flo-v7-1-arm-pipelining-fixes-v3-2-230f03227abb@siemens.com> |
In case do_kernel_address_page_fault() was entered over supervisor mode
the dovetail_fault_{entry,exit} machinery was bypassed. As a result the
inband IRQ mask might have been touched from the oob stage.
There is another problem with interrupts_enabled() in the supervisor
mode code path. That one will be addressed in a separate patch.
Signed-off-by: Florian Bezdeka <[email protected]>
---
arch/arm/mm/fault.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index b6b766652b753ef860d16b153685b0d3b582bffa..08ebc043971000fd8d6245bcbb6c170d801c73b3 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -332,6 +332,7 @@ do_kernel_address_page_fault(struct mm_struct *mm, unsigned long addr,
__do_user_fault(addr, fsr, SIGSEGV, SEGV_MAPERR, regs);
dovetail_fault_exit(ARM_TRAP_ACCESS, regs, irqflags);
} else {
+ irqflags = dovetail_fault_entry(ARM_TRAP_ACCESS, regs);
/*
* Fault from kernel mode. Enable interrupts if they were
* enabled in the parent context. Section (upper page table)
@@ -344,6 +345,8 @@ do_kernel_address_page_fault(struct mm_struct *mm, unsigned long addr,
local_irq_enable();
__do_kernel_fault(mm, addr, fsr, regs);
+
+ dovetail_fault_exit(ARM_TRAP_ACCESS, regs, irqflags);
}
return 0;
--
2.54.0