[PATCH Dovetail v4 2/8] arm: irq_pipeline: Fix dovetail_fault_{entry,exit} bypass in do_kernel_address_page_fault
Florian Bezdeka <[email protected]> Tue, 07 Jul 2026 11:50:18 +0200
| Newsgroups | dev.linux.lists.xenomai |
|---|---|
| Message-ID | <20260707-wip-flo-v7-1-arm-pipelining-fixes-v4-2-057b8af5a2ca@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.55.0