arm64: Call debug_traps_init() from trap_init() to help early kgdb
A new kgdb feature will soon land (kgdb_earlycon) that lets us run kgdb much earlier. In order for everything to work properly it's important that the break hook is setup by the time we process "kgdbwait". Right now the break hook is setup in debug_traps_init() and that's called from arch_initcall(). That's a bit too late since kgdb_earlycon really needs things to be setup by the time the system calls dbg_late_init(). We could fix this by adding call_break_hook() into early_brk64() and that works fine. However, it's a little ugly. Instead, let's just add a call to debug_traps_init() straight from trap_init(). There's already a documented dependency between trap_init() and debug_traps_init() and this makes the dependency more obvious rather than just relying on a comment. NOTE: this solution isn't early enough to let us select the "ARCH_HAS_EARLY_DEBUG" KConfig option that is introduced by the kgdb_earlycon patch series. That would only be set if we could do breakpoints when early params are parsed. This patch only enables "late early" breakpoints, AKA breakpoints when dbg_late_init() is called. It's expected that this should be fine for most people. It should also be noted that if you crash you can still end up in kgdb earlier than debug_traps_init(). Since you don't need breakpoints to debug a crash that's fine. Suggested-by: Will Deacon <will@kernel.org> Signed-off-by: Douglas Anderson <dianders@chromium.org> Acked-by: Will Deacon <will@kernel.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/r/20200513160501.1.I0b5edf030cc6ebef6ab4829f8867cdaea42485d8@changeid Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
Родитель
ab8ad279ce
Коммит
b322c65f8c
|
@ -125,5 +125,7 @@ static inline int reinstall_suspended_bps(struct pt_regs *regs)
|
||||||
|
|
||||||
int aarch32_break_handler(struct pt_regs *regs);
|
int aarch32_break_handler(struct pt_regs *regs);
|
||||||
|
|
||||||
|
void debug_traps_init(void);
|
||||||
|
|
||||||
#endif /* __ASSEMBLY */
|
#endif /* __ASSEMBLY */
|
||||||
#endif /* __ASM_DEBUG_MONITORS_H */
|
#endif /* __ASM_DEBUG_MONITORS_H */
|
||||||
|
|
|
@ -376,15 +376,13 @@ int aarch32_break_handler(struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
NOKPROBE_SYMBOL(aarch32_break_handler);
|
NOKPROBE_SYMBOL(aarch32_break_handler);
|
||||||
|
|
||||||
static int __init debug_traps_init(void)
|
void __init debug_traps_init(void)
|
||||||
{
|
{
|
||||||
hook_debug_fault_code(DBG_ESR_EVT_HWSS, single_step_handler, SIGTRAP,
|
hook_debug_fault_code(DBG_ESR_EVT_HWSS, single_step_handler, SIGTRAP,
|
||||||
TRAP_TRACE, "single-step handler");
|
TRAP_TRACE, "single-step handler");
|
||||||
hook_debug_fault_code(DBG_ESR_EVT_BRK, brk_handler, SIGTRAP,
|
hook_debug_fault_code(DBG_ESR_EVT_BRK, brk_handler, SIGTRAP,
|
||||||
TRAP_BRKPT, "ptrace BRK handler");
|
TRAP_BRKPT, "ptrace BRK handler");
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
arch_initcall(debug_traps_init);
|
|
||||||
|
|
||||||
/* Re-enable single step for syscall restarting. */
|
/* Re-enable single step for syscall restarting. */
|
||||||
void user_rewind_single_step(struct task_struct *task)
|
void user_rewind_single_step(struct task_struct *task)
|
||||||
|
|
|
@ -1047,11 +1047,11 @@ int __init early_brk64(unsigned long addr, unsigned int esr,
|
||||||
return bug_handler(regs, esr) != DBG_HOOK_HANDLED;
|
return bug_handler(regs, esr) != DBG_HOOK_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This registration must happen early, before debug_traps_init(). */
|
|
||||||
void __init trap_init(void)
|
void __init trap_init(void)
|
||||||
{
|
{
|
||||||
register_kernel_break_hook(&bug_break_hook);
|
register_kernel_break_hook(&bug_break_hook);
|
||||||
#ifdef CONFIG_KASAN_SW_TAGS
|
#ifdef CONFIG_KASAN_SW_TAGS
|
||||||
register_kernel_break_hook(&kasan_break_hook);
|
register_kernel_break_hook(&kasan_break_hook);
|
||||||
#endif
|
#endif
|
||||||
|
debug_traps_init();
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче