diff options
| -rw-r--r-- | arch/arm/kernel/kgdb.c | 34 | 
1 files changed, 34 insertions, 0 deletions
diff --git a/arch/arm/kernel/kgdb.c b/arch/arm/kernel/kgdb.c index cf846cade35..778c2f7024f 100644 --- a/arch/arm/kernel/kgdb.c +++ b/arch/arm/kernel/kgdb.c @@ -10,6 +10,7 @@   *           Deepak Saxena <dsaxena@plexity.net>   */  #include <linux/irq.h> +#include <linux/kdebug.h>  #include <linux/kgdb.h>  #include <asm/traps.h> @@ -180,6 +181,33 @@ void kgdb_roundup_cpus(unsigned long flags)         local_irq_disable();  } +static int __kgdb_notify(struct die_args *args, unsigned long cmd) +{ +	struct pt_regs *regs = args->regs; + +	if (kgdb_handle_exception(1, args->signr, cmd, regs)) +		return NOTIFY_DONE; +	return NOTIFY_STOP; +} +static int +kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr) +{ +	unsigned long flags; +	int ret; + +	local_irq_save(flags); +	ret = __kgdb_notify(ptr, cmd); +	local_irq_restore(flags); + +	return ret; +} + +static struct notifier_block kgdb_notifier = { +	.notifier_call	= kgdb_notify, +	.priority	= -INT_MAX, +}; + +  /**   *	kgdb_arch_init - Perform any architecture specific initalization.   * @@ -188,6 +216,11 @@ void kgdb_roundup_cpus(unsigned long flags)   */  int kgdb_arch_init(void)  { +	int ret = register_die_notifier(&kgdb_notifier); + +	if (ret != 0) +		return ret; +  	register_undef_hook(&kgdb_brkpt_hook);  	register_undef_hook(&kgdb_compiled_brkpt_hook); @@ -204,6 +237,7 @@ void kgdb_arch_exit(void)  {  	unregister_undef_hook(&kgdb_brkpt_hook);  	unregister_undef_hook(&kgdb_compiled_brkpt_hook); +	unregister_die_notifier(&kgdb_notifier);  }  /*  |