Message ID | 20200507130644.v4.5.I22067ad43e77ddfd4b64c2d49030628480f9e8d9@changeid (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | kgdb: Support late serial drivers; enable early debug w/ boot consoles | expand |
Hi, On Thu, May 7, 2020 at 1:09 PM Douglas Anderson <dianders@chromium.org> wrote: > > In order to make early kgdb work properly we need early_brk64() to be > able to call into it. This is as easy as adding a call into > call_break_hook() just like we do later in the normal brk_handler(). > > Once we do this we can let kgdb know that it can break into the > debugger a little earlier (specifically when parsing early_param's). > > NOTE: without this patch it turns out that arm64 can't do breakpoints > even at dbg_late_init(), so if we decide something about this patch is > wrong we might need to move dbg_late_init() a little later. > > Signed-off-by: Douglas Anderson <dianders@chromium.org> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Will Deacon <will@kernel.org> > Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> > --- > > Changes in v4: > - Add "if KGDB" to "select ARCH_HAS_EARLY_DEBUG" in Kconfig. > > Changes in v3: > - Change boolean weak function to KConfig. > > Changes in v2: None > > arch/arm64/Kconfig | 1 + > arch/arm64/include/asm/debug-monitors.h | 2 ++ > arch/arm64/kernel/debug-monitors.c | 2 +- > arch/arm64/kernel/traps.c | 3 +++ > 4 files changed, 7 insertions(+), 1 deletion(-) As discussed in the replies to the v3 version of this patch [1], I have posted a replacement patch for this one [2]. After the cut in the replacement patch I talk about different ways it could land. Hopefully that's not too confusing. I can also re-spam everyone with a v5 of the whole series if that makes it clearer. [1] https://lore.kernel.org/r/20200428141218.v3.5.I22067ad43e77ddfd4b64c2d49030628480f9e8d9@changeid [2] https://lore.kernel.org/r/20200513160501.1.I0b5edf030cc6ebef6ab4829f8867cdaea42485d8@changeid -Doug
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 40fb05d96c60..3d78f581269c 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -13,6 +13,7 @@ config ARM64 select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI + select ARCH_HAS_EARLY_DEBUG if KGDB select ARCH_HAS_FAST_MULTIPLIER select ARCH_HAS_FORTIFY_SOURCE select ARCH_HAS_GCOV_PROFILE_ALL diff --git a/arch/arm64/include/asm/debug-monitors.h b/arch/arm64/include/asm/debug-monitors.h index 7619f473155f..2d82a0314d29 100644 --- a/arch/arm64/include/asm/debug-monitors.h +++ b/arch/arm64/include/asm/debug-monitors.h @@ -97,6 +97,8 @@ void unregister_user_break_hook(struct break_hook *hook); void register_kernel_break_hook(struct break_hook *hook); void unregister_kernel_break_hook(struct break_hook *hook); +int call_break_hook(struct pt_regs *regs, unsigned int esr); + u8 debug_monitors_arch(void); enum dbg_active_el { diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c index 48222a4760c2..59c353dfc8e9 100644 --- a/arch/arm64/kernel/debug-monitors.c +++ b/arch/arm64/kernel/debug-monitors.c @@ -297,7 +297,7 @@ void unregister_kernel_break_hook(struct break_hook *hook) unregister_debug_hook(&hook->node); } -static int call_break_hook(struct pt_regs *regs, unsigned int esr) +int call_break_hook(struct pt_regs *regs, unsigned int esr) { struct break_hook *hook; struct list_head *list; diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index cf402be5c573..a8173f0c1774 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -1044,6 +1044,9 @@ int __init early_brk64(unsigned long addr, unsigned int esr, if ((comment & ~KASAN_BRK_MASK) == KASAN_BRK_IMM) return kasan_handler(regs, esr) != DBG_HOOK_HANDLED; #endif + if (call_break_hook(regs, esr) == DBG_HOOK_HANDLED) + return 0; + return bug_handler(regs, esr) != DBG_HOOK_HANDLED; }