linux-mips
[Top] [All Lists]

[PATCH 4/4] invoke kgdb via magic sysrq

To: ralf@linux-mips.org, linux-mips@linux-mips.org
Subject: [PATCH 4/4] invoke kgdb via magic sysrq
From: Frank Rowand <frank.rowand@am.sony.com>
Date: Tue, 15 Jan 2008 14:34:54 -0800
In-reply-to: <1200436139.4092.30.camel@bx740>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <1200436139.4092.30.camel@bx740>
Reply-to: frank.rowand@am.sony.com
Sender: linux-mips-bounce@linux-mips.org
From: Frank Rowand <frank.rowand@am.sony.com>

Add hooks so that the host can connect to KGDB or asynchronously invoke an
already connected KGDB via a magic sysrq.  This should work for most MIPS
targets that support KGDB, though it has only been tested on the Toshiba
RBTX4927.  This can be useful to invoke an already connected KGDB for some
types of system hang.  It also allows normally booting without connecting
to KGDB, then later connecting to KGDB if kernel debugging is desired.

This functionality exists for PowerPC and sh.

Signed-off-by: Frank Rowand <frank.rowand@am.sony.com>
---
 arch/mips/kernel/gdb-stub.c |   26     26 +    0 -     0 !
 1 files changed, 26 insertions(+)

Index: linux-2.6.24-rc7/arch/mips/kernel/gdb-stub.c
===================================================================
--- linux-2.6.24-rc7.orig/arch/mips/kernel/gdb-stub.c
+++ linux-2.6.24-rc7/arch/mips/kernel/gdb-stub.c
@@ -131,6 +131,7 @@
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/reboot.h>
+#include <linux/sysrq.h>
 
 #include <asm/asm.h>
 #include <asm/cacheflush.h>
@@ -1154,3 +1155,28 @@ static int __init register_gdb_console(v
 console_initcall(register_gdb_console);
 
 #endif
+
+#ifdef CONFIG_MAGIC_SYSRQ
+static void sysrq_handle_gdb(int key, struct tty_struct *tty)
+{
+       if (!initialized) {
+               printk(KERN_ALERT "Wait for gdb client connection ...\n");
+               set_debug_traps();
+       }
+
+       breakpoint();
+}
+static struct sysrq_key_op sysrq_gdb_op = {
+       .handler        = sysrq_handle_gdb,
+       .help_msg       = "Gdb",
+       .action_msg     = "GDB",
+};
+
+static int gdb_register_sysrq(void)
+{
+       printk(KERN_INFO "Registering GDB sysrq handler\n");
+       register_sysrq_key('g', &sysrq_gdb_op);
+       return 0;
+}
+module_init(gdb_register_sysrq);
+#endif




<Prev in Thread] Current Thread [Next in Thread>