Loading drivers/staging/android/fiq_debugger/fiq_debugger.c +54 −32 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <linux/sched.h> #include <linux/slab.h> #include <linux/smp.h> #include <linux/sysrq.h> #include <linux/timer.h> #include <linux/tty.h> #include <linux/tty_flip.h> Loading Loading @@ -395,7 +396,7 @@ static void fiq_debugger_work(struct work_struct *work) cmd += 6; while (*cmd == ' ') cmd++; if (cmd != '\0') if ((cmd != '\0') && sysrq_on()) kernel_restart(cmd); else kernel_restart(NULL); Loading Loading @@ -425,27 +426,37 @@ static void fiq_debugger_irq_exec(struct fiq_debugger_state *state, char *cmd) static void fiq_debugger_help(struct fiq_debugger_state *state) { fiq_debugger_printf(&state->output, "FIQ Debugger commands:\n" "FIQ Debugger commands:\n"); if (sysrq_on()) { fiq_debugger_printf(&state->output, " pc PC status\n" " regs Register dump\n" " allregs Extended Register dump\n" " bt Stack trace\n" " bt Stack trace\n"); fiq_debugger_printf(&state->output, " reboot [<c>] Reboot with command <c>\n" " reset [<c>] Hard reset with command <c>\n" " irqs Interupt status\n" " irqs Interrupt status\n" " kmsg Kernel log\n" " version Kernel version\n"); fiq_debugger_printf(&state->output, " sleep Allow sleep while in FIQ\n" " nosleep Disable sleep while in FIQ\n" " console Switch terminal to console\n" " cpu Current CPU\n" " cpu <number> Switch to CPU<number>\n"); fiq_debugger_printf(&state->output, " ps Process list\n" " cpu <number> Switch to CPU<number>\n" " sysrq sysrq options\n" " sysrq <param> Execute sysrq with <param>\n"); } else { fiq_debugger_printf(&state->output, " reboot Reboot\n" " reset Hard reset\n" " irqs Interrupt status\n"); } fiq_debugger_printf(&state->output, " sleep Allow sleep while in FIQ\n" " nosleep Disable sleep while in FIQ\n" " console Switch terminal to console\n" " ps Process list\n"); #ifdef CONFIG_KGDB if (fiq_kgdb_enable) { fiq_debugger_printf(&state->output, " kgdb Enter kernel debugger\n"); #endif Loading Loading @@ -479,18 +490,23 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, if (!strcmp(cmd, "help") || !strcmp(cmd, "?")) { fiq_debugger_help(state); } else if (!strcmp(cmd, "pc")) { if (sysrq_on()) fiq_debugger_dump_pc(&state->output, regs); } else if (!strcmp(cmd, "regs")) { if (sysrq_on()) fiq_debugger_dump_regs(&state->output, regs); } else if (!strcmp(cmd, "allregs")) { if (sysrq_on()) fiq_debugger_dump_allregs(&state->output, regs); } else if (!strcmp(cmd, "bt")) { fiq_debugger_dump_stacktrace(&state->output, regs, 100, svc_sp); if (sysrq_on()) fiq_debugger_dump_stacktrace(&state->output, regs, 100, svc_sp); } else if (!strncmp(cmd, "reset", 5)) { cmd += 5; while (*cmd == ' ') cmd++; if (*cmd) { if (*cmd && sysrq_on()) { char tmp_cmd[32]; strlcpy(tmp_cmd, cmd, sizeof(tmp_cmd)); machine_restart(tmp_cmd); Loading @@ -500,9 +516,12 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, } else if (!strcmp(cmd, "irqs")) { fiq_debugger_dump_irqs(state); } else if (!strcmp(cmd, "kmsg")) { if (sysrq_on()) fiq_debugger_dump_kernel_log(state); } else if (!strcmp(cmd, "version")) { fiq_debugger_printf(&state->output, "%s\n", linux_banner); if (sysrq_on()) fiq_debugger_printf(&state->output, "%s\n", linux_banner); } else if (!strcmp(cmd, "sleep")) { state->no_sleep = false; fiq_debugger_printf(&state->output, "enabling sleep\n"); Loading @@ -514,14 +533,17 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, fiq_debugger_uart_flush(state); state->console_enable = true; } else if (!strcmp(cmd, "cpu")) { fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); } else if (!strncmp(cmd, "cpu ", 4)) { if (sysrq_on()) fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); } else if (!strncmp(cmd, "cpu ", 4) && sysrq_on()) { unsigned long cpu = 0; if (kstrtoul(cmd + 4, 10, &cpu) == 0) fiq_debugger_switch_cpu(state, cpu); else fiq_debugger_printf(&state->output, "invalid cpu\n"); fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); } else { if (state->debug_busy) { fiq_debugger_printf(&state->output, Loading drivers/tty/sysrq.c +2 −1 Original line number Diff line number Diff line Loading @@ -58,10 +58,11 @@ static bool __read_mostly sysrq_always_enabled; unsigned short platform_sysrq_reset_seq[] __weak = { KEY_RESERVED }; int sysrq_reset_downtime_ms __weak; static bool sysrq_on(void) bool sysrq_on(void) { return sysrq_enabled || sysrq_always_enabled; } EXPORT_SYMBOL(sysrq_on); /* * A value of 1 means 'all', other nonzero values are an op mask: Loading include/linux/sysrq.h +1 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ struct sysrq_key_op { * are available -- else NULL's). */ bool sysrq_on(void); void handle_sysrq(int key); void __handle_sysrq(int key, bool check_mask); int register_sysrq_key(int key, struct sysrq_key_op *op); Loading Loading
drivers/staging/android/fiq_debugger/fiq_debugger.c +54 −32 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <linux/sched.h> #include <linux/slab.h> #include <linux/smp.h> #include <linux/sysrq.h> #include <linux/timer.h> #include <linux/tty.h> #include <linux/tty_flip.h> Loading Loading @@ -395,7 +396,7 @@ static void fiq_debugger_work(struct work_struct *work) cmd += 6; while (*cmd == ' ') cmd++; if (cmd != '\0') if ((cmd != '\0') && sysrq_on()) kernel_restart(cmd); else kernel_restart(NULL); Loading Loading @@ -425,27 +426,37 @@ static void fiq_debugger_irq_exec(struct fiq_debugger_state *state, char *cmd) static void fiq_debugger_help(struct fiq_debugger_state *state) { fiq_debugger_printf(&state->output, "FIQ Debugger commands:\n" "FIQ Debugger commands:\n"); if (sysrq_on()) { fiq_debugger_printf(&state->output, " pc PC status\n" " regs Register dump\n" " allregs Extended Register dump\n" " bt Stack trace\n" " bt Stack trace\n"); fiq_debugger_printf(&state->output, " reboot [<c>] Reboot with command <c>\n" " reset [<c>] Hard reset with command <c>\n" " irqs Interupt status\n" " irqs Interrupt status\n" " kmsg Kernel log\n" " version Kernel version\n"); fiq_debugger_printf(&state->output, " sleep Allow sleep while in FIQ\n" " nosleep Disable sleep while in FIQ\n" " console Switch terminal to console\n" " cpu Current CPU\n" " cpu <number> Switch to CPU<number>\n"); fiq_debugger_printf(&state->output, " ps Process list\n" " cpu <number> Switch to CPU<number>\n" " sysrq sysrq options\n" " sysrq <param> Execute sysrq with <param>\n"); } else { fiq_debugger_printf(&state->output, " reboot Reboot\n" " reset Hard reset\n" " irqs Interrupt status\n"); } fiq_debugger_printf(&state->output, " sleep Allow sleep while in FIQ\n" " nosleep Disable sleep while in FIQ\n" " console Switch terminal to console\n" " ps Process list\n"); #ifdef CONFIG_KGDB if (fiq_kgdb_enable) { fiq_debugger_printf(&state->output, " kgdb Enter kernel debugger\n"); #endif Loading Loading @@ -479,18 +490,23 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, if (!strcmp(cmd, "help") || !strcmp(cmd, "?")) { fiq_debugger_help(state); } else if (!strcmp(cmd, "pc")) { if (sysrq_on()) fiq_debugger_dump_pc(&state->output, regs); } else if (!strcmp(cmd, "regs")) { if (sysrq_on()) fiq_debugger_dump_regs(&state->output, regs); } else if (!strcmp(cmd, "allregs")) { if (sysrq_on()) fiq_debugger_dump_allregs(&state->output, regs); } else if (!strcmp(cmd, "bt")) { fiq_debugger_dump_stacktrace(&state->output, regs, 100, svc_sp); if (sysrq_on()) fiq_debugger_dump_stacktrace(&state->output, regs, 100, svc_sp); } else if (!strncmp(cmd, "reset", 5)) { cmd += 5; while (*cmd == ' ') cmd++; if (*cmd) { if (*cmd && sysrq_on()) { char tmp_cmd[32]; strlcpy(tmp_cmd, cmd, sizeof(tmp_cmd)); machine_restart(tmp_cmd); Loading @@ -500,9 +516,12 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, } else if (!strcmp(cmd, "irqs")) { fiq_debugger_dump_irqs(state); } else if (!strcmp(cmd, "kmsg")) { if (sysrq_on()) fiq_debugger_dump_kernel_log(state); } else if (!strcmp(cmd, "version")) { fiq_debugger_printf(&state->output, "%s\n", linux_banner); if (sysrq_on()) fiq_debugger_printf(&state->output, "%s\n", linux_banner); } else if (!strcmp(cmd, "sleep")) { state->no_sleep = false; fiq_debugger_printf(&state->output, "enabling sleep\n"); Loading @@ -514,14 +533,17 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, fiq_debugger_uart_flush(state); state->console_enable = true; } else if (!strcmp(cmd, "cpu")) { fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); } else if (!strncmp(cmd, "cpu ", 4)) { if (sysrq_on()) fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); } else if (!strncmp(cmd, "cpu ", 4) && sysrq_on()) { unsigned long cpu = 0; if (kstrtoul(cmd + 4, 10, &cpu) == 0) fiq_debugger_switch_cpu(state, cpu); else fiq_debugger_printf(&state->output, "invalid cpu\n"); fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); } else { if (state->debug_busy) { fiq_debugger_printf(&state->output, Loading
drivers/tty/sysrq.c +2 −1 Original line number Diff line number Diff line Loading @@ -58,10 +58,11 @@ static bool __read_mostly sysrq_always_enabled; unsigned short platform_sysrq_reset_seq[] __weak = { KEY_RESERVED }; int sysrq_reset_downtime_ms __weak; static bool sysrq_on(void) bool sysrq_on(void) { return sysrq_enabled || sysrq_always_enabled; } EXPORT_SYMBOL(sysrq_on); /* * A value of 1 means 'all', other nonzero values are an op mask: Loading
include/linux/sysrq.h +1 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ struct sysrq_key_op { * are available -- else NULL's). */ bool sysrq_on(void); void handle_sysrq(int key); void __handle_sysrq(int key, bool check_mask); int register_sysrq_key(int key, struct sysrq_key_op *op); Loading