Index: arm/at91/uart_dev_at91usart.c =================================================================== RCS file: /home/ncvs/src/sys/arm/at91/uart_dev_at91usart.c,v retrieving revision 1.13 diff -c -r1.13 uart_dev_at91usart.c *** arm/at91/uart_dev_at91usart.c 25 Dec 2007 17:51:55 -0000 1.13 --- arm/at91/uart_dev_at91usart.c 4 May 2008 23:14:01 -0000 *************** *** 506,514 **** at91_rx_put(struct uart_softc *sc, int key) { #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) { ! if (kdb_alt_break(key, &sc->sc_altbrk)) ! kdb_enter(KDB_WHY_BREAK, "Break sequence to console"); } #endif uart_rx_put(sc, key); --- 506,525 ---- at91_rx_put(struct uart_softc *sc, int key) { #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) + int kdb_brk; + if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) { ! if ((kdb_brk = kdb_alt_break(key, &sc->sc_altbrk)) != 0) { ! case KDB_REQ_DEBUGGER: ! kdb_enter(KDB_WHY_BREAK, "Break sequence on console"); ! break; ! case KDB_REQ_PANIC: ! kdb_panic("Panic sequence on console"); ! break; ! case KDB_REQ_REBOOT: ! kdb_reboot(); ! break; ! } } #endif uart_rx_put(sc, key); Index: dev/dcons/dcons_os.c =================================================================== RCS file: /home/ncvs/src/sys/dev/dcons/dcons_os.c,v retrieving revision 1.20 diff -c -r1.20 dcons_os.c *** dev/dcons/dcons_os.c 25 Dec 2007 17:51:56 -0000 1.20 --- dev/dcons/dcons_os.c 4 May 2008 23:14:17 -0000 *************** *** 198,219 **** static int dcons_check_break(struct dcons_softc *dc, int c) { if (c < 0) return (c); #if __FreeBSD_version >= 502122 ! if (kdb_alt_break(c, &dc->brk_state)) { ! if ((dc->flags & DC_GDB) != 0) { #ifdef GDB ! if (gdb_cur == &dcons_gdb_dbgport) { ! kdb_dbbe_select("gdb"); ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on dcons gdb port"); ! } #endif ! } else ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on dcons console port"); } #else switch (dc->brk_state) { --- 198,233 ---- static int dcons_check_break(struct dcons_softc *dc, int c) { + #if __FreeBSD_version >= 502122 + int kdb_brk; + #endif if (c < 0) return (c); #if __FreeBSD_version >= 502122 ! if ((kdb_brk = kdb_alt_break(c, &dc->brk_state)) != 0) { ! switch (kdb_brk) { ! case KDB_REQ_DEBUGGER: ! ! if ((dc->flags & DC_GDB) != 0) { #ifdef GDB ! if (gdb_cur == &dcons_gdb_dbgport) { ! kdb_dbbe_select("gdb"); ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on dcons gdb port"); ! } #endif ! } else ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on dcons console port"); ! break; ! case KDB_REQ_PANIC: ! kdb_panic("Panic sequence on dcons console port"); ! break; ! case KDB_REQ_BREAK: ! kdb_reboot(); ! break; ! } } #else switch (dc->brk_state) { Index: dev/ofw/ofw_console.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ofw/ofw_console.c,v retrieving revision 1.38 diff -c -r1.38 ofw_console.c *** dev/ofw/ofw_console.c 16 Mar 2008 10:58:03 -0000 1.38 --- dev/ofw/ofw_console.c 4 May 2008 23:14:34 -0000 *************** *** 281,288 **** if (OF_read(stdin, &ch, 1) > 0) { #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) ! if (kdb_alt_break(ch, &alt_break_state)) ! kdb_enter(KDB_WHY_BREAK, "Break sequence on console"); #endif return (ch); } --- 281,303 ---- if (OF_read(stdin, &ch, 1) > 0) { #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) ! int kdb_brk; ! ! if ((kdb_brk = kdb_alt_break(ch, &alt_break_state)) != 0) { ! switch (kdb_brk) { ! case KDB_REQ_DEBUGGER: ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on console"); ! break; ! case KDB_REQ_PANIC: ! kdb_panic("Panic sequence on console"); ! break; ! case KDB_REQ_REBOOT: ! kdb_reboot(); ! break; ! ! } ! } #endif return (ch); } Index: dev/sio/sio.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sio/sio.c,v retrieving revision 1.473 diff -c -r1.473 sio.c *** dev/sio/sio.c 25 Dec 2007 17:51:57 -0000 1.473 --- dev/sio/sio.c 4 May 2008 23:15:36 -0000 *************** *** 1469,1474 **** --- 1469,1479 ---- u_char modem_status; u_char *ioptr; u_char recv_data; + #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) + int kdb_brk; + + again: + #endif if (COM_IIR_TXRDYBUG(com->flags)) { int_ctl = inb(com->int_ctl_port); *************** *** 1501,1509 **** #ifdef KDB #ifdef ALT_BREAK_TO_DEBUGGER if (com->unit == comconsole && ! kdb_alt_break(recv_data, &com->alt_brk_state) != 0) ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on console"); #endif /* ALT_BREAK_TO_DEBUGGER */ #endif /* KDB */ if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { --- 1506,1529 ---- #ifdef KDB #ifdef ALT_BREAK_TO_DEBUGGER if (com->unit == comconsole && ! (kdb_brk = kdb_alt_break(recv_data, ! &com->alt_brk_state)) != 0) { ! mtx_unlock_spin(&sio_lock); ! switch (kdb_brk) { ! case KDB_REQ_DEBUGGER: ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on console"); ! break; ! case KDB_REQ_PANIC: ! kdb_panic("panic on console"); ! break; ! case KDB_REQ_REBOOT: ! kdb_reboot(); ! break; ! } ! mtx_lock_spin(&sio_lock); ! goto again; ! } #endif /* ALT_BREAK_TO_DEBUGGER */ #endif /* KDB */ if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { Index: dev/uart/uart_core.c =================================================================== RCS file: /home/ncvs/src/sys/dev/uart/uart_core.c,v retrieving revision 1.23 diff -c -r1.23 uart_core.c *** dev/uart/uart_core.c 25 Dec 2007 17:51:57 -0000 1.23 --- dev/uart/uart_core.c 4 May 2008 23:14:48 -0000 *************** *** 175,183 **** #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) { while (rxp != sc->sc_rxput) { ! if (kdb_alt_break(sc->sc_rxbuf[rxp++], &sc->sc_altbrk)) ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on console"); if (rxp == sc->sc_rxbufsz) rxp = 0; } --- 175,197 ---- #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) { while (rxp != sc->sc_rxput) { ! int kdb_brk; ! ! if ((kdb_brk = kdb_alt_break(sc->sc_rxbuf[rxp++], ! &sc->sc_altbrk)) != 0) { ! switch (kdb_brk) { ! case KDB_REQ_DEBUGGER: ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on console"); ! break; ! case KDB_REQ_PANIC: ! kdb_panic("Panic sequence on console"); ! break; ! case KDB_REQ_REBOOT: ! kdb_reboot(); ! break; ! } ! } if (rxp == sc->sc_rxbufsz) rxp = 0; } Index: kern/subr_kdb.c =================================================================== RCS file: /home/ncvs/src/sys/kern/subr_kdb.c,v retrieving revision 1.25 diff -c -r1.25 subr_kdb.c *** kern/subr_kdb.c 25 Dec 2007 17:51:59 -0000 1.25 --- kern/subr_kdb.c 4 May 2008 21:49:21 -0000 *************** *** 221,226 **** --- 221,245 ---- return (0); } + void + kdb_panic(const char *msg) + { + + #ifdef SMP + stop_cpus(PCPU_GET(other_cpus)); + #endif + printf("KDB: panic\n"); + panic(msg); + } + + void + kdb_reboot(void) + { + + printf("KDB: reboot initiated\n"); + shutdown_nice(0); + } + /* * Solaris implements a new BREAK which is initiated by a character sequence * CR ~ ^b which is similar to a familiar pattern used on Sun servers by the *************** *** 235,240 **** --- 254,261 ---- #define KEY_CR 13 /* CR '\r' */ #define KEY_TILDE 126 /* ~ */ #define KEY_CRTLB 2 /* ^B */ + #define KEY_CRTLP 16 /* ^P */ + #define KEY_CRTLR 18 /* ^R */ int kdb_alt_break(int key, int *state) *************** *** 242,261 **** int brk; brk = 0; ! switch (key) { ! case KEY_CR: ! *state = KEY_TILDE; break; ! case KEY_TILDE: ! *state = (*state == KEY_TILDE) ? KEY_CRTLB : 0; break; ! case KEY_CRTLB: ! if (*state == KEY_CRTLB) brk = 1; ! /* FALLTHROUGH */ ! default: *state = 0; - break; } return (brk); } --- 263,285 ---- int brk; brk = 0; ! switch (*state) { ! case 0: ! if (key == KEY_CR) ! *state = 1; break; ! case 1: ! if (key == KEY_TILDE) ! *state = 2; break; ! case 2: ! if (key == KEY_CRTLB) brk = 1; ! else if (key == KEY_CRTLP) ! brk = 2; ! else if (key == KEY_CRTLR) ! brk = 3; *state = 0; } return (brk); } Index: pc98/cbus/sio.c =================================================================== RCS file: /home/ncvs/src/sys/pc98/cbus/sio.c,v retrieving revision 1.248 diff -c -r1.248 sio.c *** pc98/cbus/sio.c 29 Feb 2008 05:09:15 -0000 1.248 --- pc98/cbus/sio.c 4 May 2008 23:15:03 -0000 *************** *** 2268,2279 **** u_char modem_status; u_char *ioptr; u_char recv_data; - #ifdef PC98 u_char tmp = 0; u_char rsa_buf_status = 0; int rsa_tx_fifo_size = 0; #endif /* PC98 */ if (COM_IIR_TXRDYBUG(com->flags)) { int_ctl = inb(com->int_ctl_port); --- 2268,2283 ---- u_char modem_status; u_char *ioptr; u_char recv_data; #ifdef PC98 u_char tmp = 0; u_char rsa_buf_status = 0; int rsa_tx_fifo_size = 0; #endif /* PC98 */ + #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) + int kdb_brk; + + again: + #endif if (COM_IIR_TXRDYBUG(com->flags)) { int_ctl = inb(com->int_ctl_port); *************** *** 2368,2376 **** #ifdef KDB #ifdef ALT_BREAK_TO_DEBUGGER if (com->unit == comconsole && ! kdb_alt_break(recv_data, &com->alt_brk_state) != 0) ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on console"); #endif /* ALT_BREAK_TO_DEBUGGER */ #endif /* KDB */ if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { --- 2372,2395 ---- #ifdef KDB #ifdef ALT_BREAK_TO_DEBUGGER if (com->unit == comconsole && ! (kdb_brk = kdb_alt_break(recv_data, ! &com->alt_brk_state)) != 0) { ! mtx_unlock_spin(&sio_lock); ! switch (kdb_brk) { ! case KDB_REQ_DEBUGGER: ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on console"); ! break; ! case KDB_REQ_PANIC: ! kdb_panic("panic on console"); ! break; ! case KDB_REQ_REBOOT: ! kdb_reboot(); ! break; ! } ! mtx_lock_spin(&sio_lock); ! goto again; ! } #endif /* ALT_BREAK_TO_DEBUGGER */ #endif /* KDB */ if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { Index: sun4v/sun4v/hvcons.c =================================================================== RCS file: /home/ncvs/src/sys/sun4v/sun4v/hvcons.c,v retrieving revision 1.7 diff -c -r1.7 hvcons.c *** sun4v/sun4v/hvcons.c 25 Dec 2007 17:52:01 -0000 1.7 --- sun4v/sun4v/hvcons.c 4 May 2008 23:15:22 -0000 *************** *** 223,233 **** while ((l = hv_cons_getchar(&ch)) != H_EOK) { #if defined(KDB) if (l == H_BREAK || l == H_HUP) kdb_enter(KDB_WHY_BREAK, "Break sequence on console"); ! if (kdb_alt_break(ch, &alt_break_state)) ! kdb_enter(KDB_WHY_BREAK, "Break sequence on console"); #endif if (l != -2 && l != 0) { return (-1); --- 223,247 ---- while ((l = hv_cons_getchar(&ch)) != H_EOK) { #if defined(KDB) + int kdb_brk; + if (l == H_BREAK || l == H_HUP) kdb_enter(KDB_WHY_BREAK, "Break sequence on console"); ! if ((kdb_brk = kdb_alt_break(ch, &alt_break_state)) != 0) { ! switch (kdb_brk) { ! case KDB_REQ_DEBUGGER: ! kdb_enter(KDB_WHY_BREAK, ! "Break sequence on console"); ! break; ! case KDB_REQ_PANIC: ! kdb_panic("Panic sequence on console"); ! break; ! case KDB_REQ_REBOOT: ! kdb_reboot(); ! break; ! } ! } #endif if (l != -2 && l != 0) { return (-1); Index: sys/kdb.h =================================================================== RCS file: /home/ncvs/src/sys/sys/kdb.h,v retrieving revision 1.6 diff -c -r1.6 kdb.h *** sys/kdb.h 25 Dec 2007 17:52:02 -0000 1.6 --- sys/kdb.h 4 May 2008 23:13:21 -0000 *************** *** 69,74 **** --- 69,76 ---- void kdb_enter(const char *, const char *); void kdb_init(void); void * kdb_jmpbuf(jmp_buf); + void kdb_panic(const char *); + void kdb_reboot(void); void kdb_reenter(void); struct pcb *kdb_thr_ctx(struct thread *); struct thread *kdb_thr_first(void); *************** *** 105,108 **** --- 107,115 ---- #define KDB_WHY_POWERPC "powerpc" /* Unhandled powerpc intr. */ #define KDB_WHY_UNIONFS "unionfs" /* Unionfs bug. */ + /* Return values for kdb_alt_break */ + #define KDB_REQ_DEBUGGER 1 /* User requested Debugger */ + #define KDB_REQ_PANIC 2 /* User requested a panic */ + #define KDB_REQ_REBOOT 3 /* User requested a clean reboot */ + #endif /* !_SYS_KDB_H_ */