Skip to content

Commit

Permalink
sh: kgdb: Rework breakpoint handling on top of notifier chain.
Browse files Browse the repository at this point in the history
This kills off kgdb's breakpoint handler and ties in to the notifier
chain instead.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Dec 22, 2009
1 parent b74ab70 commit 2264873
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
1 change: 0 additions & 1 deletion arch/sh/kernel/debugtraps.S
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
#include <linux/linkage.h>

#if !defined(CONFIG_KGDB)
#define breakpoint_trap_handler debug_trap_handler
#define singlestep_trap_handler debug_trap_handler
#endif

Expand Down
46 changes: 41 additions & 5 deletions arch/sh/kernel/kgdb.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* SuperH KGDB support
*
* Copyright (C) 2008 Paul Mundt
* Copyright (C) 2008 - 2009 Paul Mundt
*
* Single stepping taken from the old stub by Henry Bell and Jeremy Siegel.
*
Expand Down Expand Up @@ -251,24 +251,60 @@ BUILD_TRAP_HANDLER(singlestep)
local_irq_restore(flags);
}

static int __kgdb_notify(struct die_args *args, unsigned long cmd)
{
int ret;

switch (cmd) {
case DIE_BREAKPOINT:
/*
* This means a user thread is single stepping
* a system call which should be ignored
*/
if (test_thread_flag(TIF_SINGLESTEP))
return NOTIFY_DONE;

ret = kgdb_handle_exception(args->trapnr & 0xff, args->signr,
args->err, args->regs);
if (ret)
return NOTIFY_DONE;

break;
}

BUILD_TRAP_HANDLER(breakpoint)
return NOTIFY_STOP;
}

static int
kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr)
{
unsigned long flags;
TRAP_HANDLER_DECL;
int ret;

local_irq_save(flags);
kgdb_handle_exception(vec >> 2, SIGTRAP, 0, regs);
ret = __kgdb_notify(ptr, cmd);
local_irq_restore(flags);

return ret;
}

static struct notifier_block kgdb_notifier = {
.notifier_call = kgdb_notify,

/*
* Lowest-prio notifier priority, we want to be notified last:
*/
.priority = -INT_MAX,
};

int kgdb_arch_init(void)
{
return 0;
return register_die_notifier(&kgdb_notifier);
}

void kgdb_arch_exit(void)
{
unregister_die_notifier(&kgdb_notifier);
}

struct kgdb_arch arch_kgdb_ops = {
Expand Down

0 comments on commit 2264873

Please sign in to comment.