Commit ea0d55a
arm64: debug: always unmask interrupts in el0_softstp()
We intend that EL0 exception handlers unmask all DAIF exceptions
before calling exit_to_user_mode().
When completing single-step of a suspended breakpoint, we do not call
local_daif_restore(DAIF_PROCCTX) before calling exit_to_user_mode(),
leaving all DAIF exceptions masked.
When pseudo-NMIs are not in use this is benign.
When pseudo-NMIs are in use, this is unsound. At this point interrupts
are masked by both DAIF.IF and PMR_EL1, and subsequent irq flag
manipulation may not work correctly. For example, a subsequent
local_irq_enable() within exit_to_user_mode_loop() will only unmask
interrupts via PMR_EL1 (leaving those masked via DAIF.IF), and
anything depending on interrupts being unmasked (e.g. delivery of
signals) will not work correctly.
This was detected by CONFIG_ARM64_DEBUG_PRIORITY_MASKING.
Move the call to `try_step_suspended_breakpoints()` outside of the check
so that interrupts can be unmasked even if we don't call the step handler.
Fixes: 0ac7584 ("arm64: debug: split single stepping exception entry")
Cc: <[email protected]> # 6.17
Signed-off-by: Ada Couprie Diaz <[email protected]>
Acked-by: Mark Rutland <[email protected]>
[[email protected]: added Mark's rewritten commit log and some whitespace]
Signed-off-by: Catalin Marinas <[email protected]>1 parent e9ad390 commit ea0d55a
1 file changed
+5
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
697 | 697 | | |
698 | 698 | | |
699 | 699 | | |
| 700 | + | |
| 701 | + | |
700 | 702 | | |
701 | 703 | | |
702 | 704 | | |
| |||
707 | 709 | | |
708 | 710 | | |
709 | 711 | | |
710 | | - | |
711 | | - | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
712 | 715 | | |
713 | | - | |
714 | 716 | | |
715 | 717 | | |
716 | 718 | | |
| |||
0 commit comments