lkml.org 
[lkml]   [2020]   [Apr]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 5/9] arm64: Add call_break_hook() to early_brk64() for early kgdb
    Date
    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>
    ---

    Changes in v2: None

    arch/arm64/include/asm/debug-monitors.h | 2 ++
    arch/arm64/kernel/debug-monitors.c | 2 +-
    arch/arm64/kernel/kgdb.c | 5 +++++
    arch/arm64/kernel/traps.c | 3 +++
    4 files changed, 11 insertions(+), 1 deletion(-)

    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/kgdb.c b/arch/arm64/kernel/kgdb.c
    index 43119922341f..96a47af870bc 100644
    --- a/arch/arm64/kernel/kgdb.c
    +++ b/arch/arm64/kernel/kgdb.c
    @@ -301,6 +301,11 @@ static struct notifier_block kgdb_notifier = {
    .priority = -INT_MAX,
    };

    +extern bool kgdb_arch_can_debug_early(void)
    +{
    + return true;
    +}
    +
    /*
    * kgdb_arch_init - Perform any architecture specific initialization.
    * This function will handle the initialization of any architecture
    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;
    }

    --
    2.26.1.301.g55bc3eb7cb9-goog
    \
     
     \ /
      Last update: 2020-04-21 23:16    [W:2.772 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site