|
@@ -41,6 +41,7 @@
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/sched.h>
|
|
|
#include <linux/sysrq.h>
|
|
|
+#include <linux/reboot.h>
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/kgdb.h>
|
|
|
#include <linux/kdb.h>
|
|
@@ -784,6 +785,20 @@ void __init dbg_late_init(void)
|
|
|
kdb_init(KDB_INIT_FULL);
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+dbg_notify_reboot(struct notifier_block *this, unsigned long code, void *x)
|
|
|
+{
|
|
|
+ if (!dbg_kdb_mode)
|
|
|
+ gdbstub_exit(code);
|
|
|
+ return NOTIFY_DONE;
|
|
|
+}
|
|
|
+
|
|
|
+static struct notifier_block dbg_reboot_notifier = {
|
|
|
+ .notifier_call = dbg_notify_reboot,
|
|
|
+ .next = NULL,
|
|
|
+ .priority = INT_MAX,
|
|
|
+};
|
|
|
+
|
|
|
static void kgdb_register_callbacks(void)
|
|
|
{
|
|
|
if (!kgdb_io_module_registered) {
|
|
@@ -791,6 +806,7 @@ static void kgdb_register_callbacks(void)
|
|
|
kgdb_arch_init();
|
|
|
if (!dbg_is_early)
|
|
|
kgdb_arch_late();
|
|
|
+ register_reboot_notifier(&dbg_reboot_notifier);
|
|
|
atomic_notifier_chain_register(&panic_notifier_list,
|
|
|
&kgdb_panic_event_nb);
|
|
|
#ifdef CONFIG_MAGIC_SYSRQ
|
|
@@ -812,6 +828,7 @@ static void kgdb_unregister_callbacks(void)
|
|
|
*/
|
|
|
if (kgdb_io_module_registered) {
|
|
|
kgdb_io_module_registered = 0;
|
|
|
+ unregister_reboot_notifier(&dbg_reboot_notifier);
|
|
|
atomic_notifier_chain_unregister(&panic_notifier_list,
|
|
|
&kgdb_panic_event_nb);
|
|
|
kgdb_arch_exit();
|