Messages in this thread Patch in this message | | | From | (Miquel van Smoorenburg) | Subject | PATCH: magic sysrq for serial console | Date | 18 Aug 1999 01:27:17 +0200 |
| |
Hopefully this is useful for someone. I made the sysrq stuff work on a serial console, since we have some trouble with a machine which is on a remote location and has a serial console (see my other message about the oopsen on that machine).
You just send a BREAK and then within 5 seconds a command key. You need to enable both serial console support and magic sysrq support in the kernel to use this.
You do need a getty or anything else running on the serial device, since the serial driver only sees interrupts and BREAKs if the port is actually opened!
Patch is against 2.2.12-pre7, I think it will patch against the real 2.2.12 as well when it gets released.
diff -ruN linux-2.2.12-pre7.orig/Documentation/Configure.help linux-2.2.12-pre7.new/Documentation/Configure.help --- linux-2.2.12-pre7.orig/Documentation/Configure.help Tue Aug 17 22:39:01 1999 +++ linux-2.2.12-pre7.new/Documentation/Configure.help Tue Aug 17 22:16:07 1999 @@ -9975,9 +9975,11 @@ if the system crashes for example during kernel debugging (e.g., you will be able to flush the buffer cache to disk, reboot the system immediately or dump some status information). This is accomplished - by pressing various keys while holding SysRq (Alt+PrintScreen). The - keys are documented in Documentation/sysrq.txt. Don't say Y unless - you really know what this hack does. + by pressing various keys while holding SysRq (Alt+PrintScreen). It + also works on a serial console, if you send a BREAK and then within 5 + seconds a command keypress. The keys are documented in + Documentation/sysrq.txt. Don't say Y unless you really know what + this hack does. ISDN subsystem CONFIG_ISDN diff -ruN linux-2.2.12-pre7.orig/Documentation/sysrq.txt linux-2.2.12-pre7.new/Documentation/sysrq.txt --- linux-2.2.12-pre7.orig/Documentation/sysrq.txt Tue Aug 17 22:39:01 1999 +++ linux-2.2.12-pre7.new/Documentation/sysrq.txt Tue Aug 17 22:18:05 1999 @@ -23,6 +23,10 @@ On PowerPC - You press 'ALT-Print Screen-<command key>'. +On the serial console (x86 standard serial ports only) - + You send a BREAK, then within 5 seconds a command key. Sending + BREAK twice is interpreted as a normal BREAK. + On other - If you know of the key combos for other architectures, please let me know so I can add them to this section. diff -ruN linux-2.2.12-pre7.orig/drivers/char/serial.c linux-2.2.12-pre7.new/drivers/char/serial.c --- linux-2.2.12-pre7.orig/drivers/char/serial.c Tue Aug 17 18:14:12 1999 +++ linux-2.2.12-pre7.new/drivers/char/serial.c Tue Aug 17 22:33:26 1999 @@ -141,6 +141,7 @@ #include <linux/delay.h> #ifdef CONFIG_SERIAL_CONSOLE #include <linux/console.h> +#include <linux/sysrq.h> #endif #include <asm/system.h> @@ -177,6 +178,9 @@ static int IRQ_timeout[NR_IRQS]; #ifdef CONFIG_SERIAL_CONSOLE static struct console sercons; +# ifdef CONFIG_MAGIC_SYSRQ + static int sysrq_pressed; /* break, really ... */ +# endif #endif static unsigned detect_uart_irq (struct serial_state * state); @@ -376,7 +380,7 @@ } static _INLINE_ void receive_chars(struct async_struct *info, - int *status) + int *status, struct pt_regs * regs) { struct tty_struct *tty = info->tty; unsigned char ch; @@ -401,6 +405,15 @@ * For statistics only */ if (*status & UART_LSR_BI) { +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) + if (info->line == sercons.index) { + if (!sysrq_pressed) { + sysrq_pressed = jiffies; + goto ignore_char; + } + sysrq_pressed = 0; + } +#endif *status &= ~(UART_LSR_FE | UART_LSR_PE); icount->brk++; } else if (*status & UART_LSR_PE) @@ -447,6 +460,17 @@ } } } +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) + if (sysrq_pressed && info->line == sercons.index) { + if (ch != 0 && + time_before(jiffies, sysrq_pressed + HZ*5)) { + handle_sysrq(ch, regs, NULL, NULL); + sysrq_pressed = 0; + goto ignore_char; + } + sysrq_pressed = 0; + } +#endif tty->flip.flag_buf_ptr++; tty->flip.char_buf_ptr++; tty->flip.count++; @@ -612,7 +636,7 @@ printk("status = %x...", status); #endif if (status & UART_LSR_DR) - receive_chars(info, &status); + receive_chars(info, &status, regs); check_modem_status(info); if (status & UART_LSR_THRE) transmit_chars(info, 0); @@ -676,7 +700,7 @@ printk("status = %x...", status); #endif if (status & UART_LSR_DR) - receive_chars(info, &status); + receive_chars(info, &status, regs); check_modem_status(info); if (status & UART_LSR_THRE) transmit_chars(info, 0); @@ -739,7 +763,7 @@ printk("status = %x...", status); #endif if (status & UART_LSR_DR) - receive_chars(info, &status); + receive_chars(info, &status, regs); check_modem_status(info); if (status & UART_LSR_THRE) transmit_chars(info, 0); @@ -1351,6 +1375,10 @@ if (I_BRKINT(info->tty) || I_PARMRK(info->tty)) info->read_status_mask |= UART_LSR_BI; +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) + if (info->line == sercons.index) + info->read_status_mask |= UART_LSR_BI; +#endif /* * Characters to ignore */ -- ... somehow I have a feeling the hurting hasn't even begun yet -- Bill, "The Terrible Thunderlizards" - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |