summaryrefslogtreecommitdiff
path: root/drivers/misc/kernel_debugger.c
diff options
context:
space:
mode:
authorArve Hjønnevåg <arve@android.com>2008-04-14 21:28:42 -0700
committerArve Hjønnevåg <arve@android.com>2009-04-07 16:43:34 -0700
commit35e34aeca4946a0cd1ef7052bd6df6c44f957ed8 (patch)
treeb8c35fe1314da64bb7d1ad2bd96bffd0c340200e /drivers/misc/kernel_debugger.c
parent74c157f41e288ca89fcb71f8a809e966bd88ba89 (diff)
kernel_debugger_core: Add sysrq command.
sysrq <c> will run the sysrq command <c> and dump what was added to the kernel log while the command ran. Signed-off-by: Brian Swetland <swetland@google.com> Signed-off-by: Arve Hjønnevåg <arve@android.com>
Diffstat (limited to 'drivers/misc/kernel_debugger.c')
-rw-r--r--drivers/misc/kernel_debugger.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/misc/kernel_debugger.c b/drivers/misc/kernel_debugger.c
index 4c479d8af1c0..f10eaa4dfc45 100644
--- a/drivers/misc/kernel_debugger.c
+++ b/drivers/misc/kernel_debugger.c
@@ -20,6 +20,7 @@
#include <linux/device.h>
#include <linux/sched.h>
#include <linux/spinlock.h>
+#include <linux/sysrq.h>
#include <linux/kernel_debugger.h>
#define dprintf(fmt...) (ctxt->printf(ctxt->cookie, fmt))
@@ -45,10 +46,33 @@ static void do_ps(struct kdbg_ctxt *ctxt)
read_unlock(&tasklist_lock);
}
+int log_buf_copy(char *dest, int idx, int len);
+extern int do_syslog(int type, char __user *bug, int count);
+static void do_sysrq(struct kdbg_ctxt *ctxt, char rq)
+{
+ char buf[128];
+ int ret;
+ int idx = 0;
+ do_syslog(5 /* clear */, NULL, 0);
+ __handle_sysrq(rq, NULL, 0);
+ while (1) {
+ ret = log_buf_copy(buf, idx, sizeof(buf) - 1);
+ if (ret <= 0)
+ break;
+ buf[ret] = 0;
+ dprintf("%s", buf);
+ idx += ret;
+ }
+}
+
int kernel_debugger(struct kdbg_ctxt *ctxt, char *cmd)
{
if (!strcmp(cmd, "ps"))
do_ps(ctxt);
+ if (!strcmp(cmd, "sysrq"))
+ do_sysrq(ctxt, 'h');
+ if (!strncmp(cmd, "sysrq ", 6))
+ do_sysrq(ctxt, cmd[6]);
return 0;
}