summaryrefslogtreecommitdiff
path: root/sys/dev/sio
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>2008-05-04 23:29:38 +0000
committerPeter Wemm <peter@FreeBSD.org>2008-05-04 23:29:38 +0000
commit43d7128c1450d36af259094b7cf39c0c4d17908c (patch)
treedec162871c2e0c2defef809d28858069fac12065 /sys/dev/sio
parent228d330b1a327345e2e1a7dbb9c6122b19604547 (diff)
Notes
Diffstat (limited to 'sys/dev/sio')
-rw-r--r--sys/dev/sio/sio.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c
index a62b411da578..a4cca4d86e56 100644
--- a/sys/dev/sio/sio.c
+++ b/sys/dev/sio/sio.c
@@ -1469,6 +1469,11 @@ siointr1(com)
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,9 +1506,24 @@ siointr1(com)
#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");
+ (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)) {