提交 4402c153 编写于 作者: J Jason Wessel

kdb,debug_core: Allow the debug core to receive a panic notification

It is highly desirable to trap into kdb on panic.  The debug core will
attempt to register as the first in line for the panic notifier.

CC: Ingo Molnar <mingo@elte.hu>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: NJason Wessel <jason.wessel@windriver.com>
上级 5b778dad
...@@ -762,11 +762,28 @@ static struct sysrq_key_op sysrq_dbg_op = { ...@@ -762,11 +762,28 @@ static struct sysrq_key_op sysrq_dbg_op = {
}; };
#endif #endif
static int kgdb_panic_event(struct notifier_block *self,
unsigned long val,
void *data)
{
if (dbg_kdb_mode)
kdb_printf("PANIC: %s\n", (char *)data);
kgdb_breakpoint();
return NOTIFY_DONE;
}
static struct notifier_block kgdb_panic_event_nb = {
.notifier_call = kgdb_panic_event,
.priority = INT_MAX,
};
static void kgdb_register_callbacks(void) static void kgdb_register_callbacks(void)
{ {
if (!kgdb_io_module_registered) { if (!kgdb_io_module_registered) {
kgdb_io_module_registered = 1; kgdb_io_module_registered = 1;
kgdb_arch_init(); kgdb_arch_init();
atomic_notifier_chain_register(&panic_notifier_list,
&kgdb_panic_event_nb);
#ifdef CONFIG_MAGIC_SYSRQ #ifdef CONFIG_MAGIC_SYSRQ
register_sysrq_key('g', &sysrq_dbg_op); register_sysrq_key('g', &sysrq_dbg_op);
#endif #endif
...@@ -786,6 +803,8 @@ static void kgdb_unregister_callbacks(void) ...@@ -786,6 +803,8 @@ static void kgdb_unregister_callbacks(void)
*/ */
if (kgdb_io_module_registered) { if (kgdb_io_module_registered) {
kgdb_io_module_registered = 0; kgdb_io_module_registered = 0;
atomic_notifier_chain_unregister(&panic_notifier_list,
&kgdb_panic_event_nb);
kgdb_arch_exit(); kgdb_arch_exit();
#ifdef CONFIG_MAGIC_SYSRQ #ifdef CONFIG_MAGIC_SYSRQ
unregister_sysrq_key('g', &sysrq_dbg_op); unregister_sysrq_key('g', &sysrq_dbg_op);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册