diff options
author | Arve Hjønnevåg <arve@android.com> | 2008-04-14 21:28:42 -0700 |
---|---|---|
committer | Arve Hjønnevåg <arve@android.com> | 2009-04-07 16:43:34 -0700 |
commit | 35e34aeca4946a0cd1ef7052bd6df6c44f957ed8 (patch) | |
tree | b8c35fe1314da64bb7d1ad2bd96bffd0c340200e | |
parent | 74c157f41e288ca89fcb71f8a809e966bd88ba89 (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>
-rw-r--r-- | drivers/misc/kernel_debugger.c | 24 |
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; } |