ARM: common: fiq_debugger: dump sysrq directly to console if enabled
authorDima Zavin <dima@android.com>
Thu, 10 Nov 2011 00:48:00 +0000 (16:48 -0800)
committerDima Zavin <dima@android.com>
Mon, 14 Nov 2011 18:27:10 +0000 (10:27 -0800)
If the fiq console is enabled, then don't filter the console output
while sysrq command is in progress.

Change-Id: I9389d757373a5fdca5cbf61f0723667510d3ae88

arch/arm/common/fiq_debugger.c

index 68e7265cc68d26c50f9d99f850bb4d05dbc7e1a1..3ed18ae2ed80c13292005fd9cadf6eaddc030183 100644 (file)
@@ -86,6 +86,7 @@ struct fiq_debugger_state {
        struct tty_struct *tty;
        int tty_open_count;
        struct fiq_debugger_ringbuf *tty_rbuf;
+       bool syslog_dumping;
 #endif
 
        unsigned int last_irqs[NR_IRQS];
@@ -496,14 +497,29 @@ static void do_ps(struct fiq_debugger_state *state)
        read_unlock(&tasklist_lock);
 }
 
+#ifdef CONFIG_FIQ_DEBUGGER_CONSOLE
+static void begin_syslog_dump(struct fiq_debugger_state *state)
+{
+       state->syslog_dumping = true;
+}
+
+static void end_syslog_dump(struct fiq_debugger_state *state)
+{
+       state->syslog_dumping = false;
+}
+#else
 extern int do_syslog(int type, char __user *bug, int count);
-static void do_sysrq(struct fiq_debugger_state *state, char rq)
+static void begin_syslog_dump(struct fiq_debugger_state *state)
+{
+       do_syslog(5 /* clear */, NULL, 0);
+}
+
+static void end_syslog_dump(struct fiq_debugger_state *state)
 {
        char buf[128];
        int ret;
        int idx = 0;
-       do_syslog(5 /* clear */, NULL, 0);
-       handle_sysrq(rq);
+
        while (1) {
                ret = log_buf_copy(buf, idx, sizeof(buf) - 1);
                if (ret <= 0)
@@ -513,6 +529,14 @@ static void do_sysrq(struct fiq_debugger_state *state, char rq)
                idx += ret;
        }
 }
+#endif
+
+static void do_sysrq(struct fiq_debugger_state *state, char rq)
+{
+       begin_syslog_dump(state);
+       handle_sysrq(rq);
+       end_syslog_dump(state);
+}
 
 /* This function CANNOT be called in FIQ context */
 static void debug_irq_exec(struct fiq_debugger_state *state, char *cmd)
@@ -871,7 +895,7 @@ static void debug_console_write(struct console *co,
 
        state = container_of(co, struct fiq_debugger_state, console);
 
-       if (!state->console_enable)
+       if (!state->console_enable && !state->syslog_dumping)
                return;
 
        debug_uart_enable(state);