[PATCH v3 00/13] arm64: debug: remove hook registration, split exception entry
Luis Claudio R. Goncalves
lgoncalv at redhat.com
Thu Jun 12 11:18:18 PDT 2025
On Mon, Jun 09, 2025 at 06:34:00PM +0100, Ada Couprie Diaz wrote:
> Hi,
>
> This series simplifies the debug exception entry path by removing handler
> registration mechanisms for the debug exception handlers, a holdover from
> the arm kernel, as well as the break and stepping handlers.
> This moves much of the code related to debug exceptions outside of
> `mm/fault.c` where it didn't make much sense.
> This allows us to split the debug exception entries: going from one common
> path per EL for all debug exceptions to a unique one per exception and EL.
>
> The result is a much simpler and fully static exception entry path, which
> we tailor to the different exceptions and their constraints.
>
> The series is structured as such :
> 1 : related clean-up in the signle step handler
> 2 : related refactor of `aarch32_break_handler()`
> 3-5 : software breakpoints and single step handlers registration removal
> 6: preparatory function move that is made internal in patch 13
> 8: preparatory refactor of `reinstall_suspended_bps()`
> 7, 9-13 : debug exception splitting and handler registration removal
>
> * Patch 3 copies and extends the `early_brk64` break handling for the
> normal path, byassing the dynamic registration.
> * Patch 4 does something similar for the single stepping handlers.
> * Patches 7, and 9 through 13 split each individual debug exception from
> the unified path by creating specific handlers, adapting them to
> their constraints and calling into them, bypassing the dynamically
> registered handlers used before.
> * Patch 8 refactors `reinstall_suspended_bps()` in preparation for the
> single-step exception entry split, as it is moved out of the handler.
> This could be squashed in patch 9 (the single-step exception split), but
> I opted to separate it for clarity (and because the commit message
> for patch 9 is already 45 lines long !).
> * Patches 5 and 13 are clean-ups removing the code that has been replaced
> and made redundant by the preceding patches.
>
> PREEMPT_RT
> ===
>
> Of note, this allows us to make the single exception handling mostly
> preemptible coming from EL0 in patch 9, fixing an issue with PREEMPT_RT[0].
> The commit message details the reasoning on why this should be safe.
> It is *definitely* not preemptible at EL1 in the current state, given
> that the EL1 software step exception is handled by KGDB.
>
> CC-ing Luis as he did a lot of testing on v2 and originally
> reported the issue.
>
> Cc: "Luis Claudio R. Goncalves" <lgoncalv at redhat.com>
>
> We can do the same for the software break exception coming from EL0,
> which works in a very similar way.
>
> However, the hardware breakpoint and watchpoint exceptions also have
> a sleeping while non-preemptible issue with PREEMPT_RT, but this is
> much trickier to fix, so this won't be fixed in this series.
> A bit more details in [1].
>
> I hesitated to add comments within the BRK64 and single-step handlers,
> on the EL0 paths, to highlight that they would be preemptible and to be
> wary if modifying or adding to them, but I opted not to in the end.
> (Partly as I didn't find a satisfactory way to do it !)
> I would be happy to add some if anyone finds it would be beneficial.
Tested-by: Luis Claudio R. Goncalves <lgoncalv at redhat.com>
Works as advertised, fixes the reported RT problem, fails on the specific
case Ada described above. :)
Best regards,
Luis
More information about the linux-arm-kernel
mailing list