summaryrefslogtreecommitdiffstats
path: root/sys/dev/sio
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2011-08-26 21:46:36 +0000
committerrwatson <rwatson@FreeBSD.org>2011-08-26 21:46:36 +0000
commit3f14675cff336d6d19e9cffbd2f4d4a28beb7dca (patch)
tree2ae73feb05cbeb7e5e297fdfc6fab07cf2db82b5 /sys/dev/sio
parentdd0f1f95e294fe6290b1864612f81cf29a594aac (diff)
downloadFreeBSD-src-3f14675cff336d6d19e9cffbd2f4d4a28beb7dca.zip
FreeBSD-src-3f14675cff336d6d19e9cffbd2f4d4a28beb7dca.tar.gz
Attempt to make break-to-debugger and alternative break-to-debugger more
accessible: (1) Always compile in support for breaking into the debugger if options KDB is present in the kernel. (2) Disable both by default, but allow them to be enabled via tunables and sysctls debug.kdb.break_to_debugger and debug.kdb.alt_break_to_debugger. (3) options BREAK_TO_DEBUGGER and options ALT_BREAK_TO_DEBUGGER continue to behave as before -- only now instead of compiling in break-to-debugger support, they change the default values of the above sysctls to enable those features by default. Current kernel configurations should, therefore, continue to behave as expected. (4) Migrate alternative break-to-debugger state machine logic out of individual device drivers into centralised KDB code. This has a number of upsides, but also one downside: it's now tricky to release sio spin locks when entering the debugger, so we don't. However, similar logic does not exist in other device drivers, including uart. (5) dcons requires some special handling; unlike other console types, it allows overriding KDB's own debugger selection, so we need a new interface to KDB to allow that to work. GENERIC kernels in -CURRENT will now support break-to-debugger as long as appropriate boot/run-time options are set, which should improve the debuggability of BETA kernels significantly. MFC after: 3 weeks Reviewed by: kib, nwhitehorn Approved by: re (bz)
Diffstat (limited to 'sys/dev/sio')
-rw-r--r--sys/dev/sio/sio.c36
1 files changed, 7 insertions, 29 deletions
diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c
index f1348c4..1f2590f 100644
--- a/sys/dev/sio/sio.c
+++ b/sys/dev/sio/sio.c
@@ -228,7 +228,7 @@ struct com_s {
struct pps_state pps;
int pps_bit;
-#ifdef ALT_BREAK_TO_DEBUGGER
+#ifdef KDB
int alt_brk_state;
#endif
@@ -1102,8 +1102,7 @@ determined_type: ;
}
if (ret)
device_printf(dev, "could not activate interrupt\n");
-#if defined(KDB) && (defined(BREAK_TO_DEBUGGER) || \
- defined(ALT_BREAK_TO_DEBUGGER))
+#if defined(KDB)
/*
* Enable interrupts for early break-to-debugger support
* on the console.
@@ -1196,8 +1195,7 @@ comclose(tp)
com->poll_output = FALSE;
sio_setreg(com, com_cfcr, com->cfcr_image &= ~CFCR_SBREAK);
-#if defined(KDB) && (defined(BREAK_TO_DEBUGGER) || \
- defined(ALT_BREAK_TO_DEBUGGER))
+#if defined(KDB)
/*
* Leave interrupts enabled and don't clear DTR if this is the
* console. This allows us to detect break-to-debugger events
@@ -1483,9 +1481,8 @@ siointr1(com)
u_char modem_status;
u_char *ioptr;
u_char recv_data;
-#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER)
- int kdb_brk;
+#ifdef KDB
again:
#endif
@@ -1518,27 +1515,9 @@ again:
else
recv_data = inb(com->data_port);
#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);
+ kdb_alt_break(recv_data, &com->alt_brk_state) != 0)
goto again;
- }
-#endif /* ALT_BREAK_TO_DEBUGGER */
#endif /* KDB */
if (line_status & (LSR_BI | LSR_FE | LSR_PE)) {
/*
@@ -1554,10 +1533,9 @@ again:
* Note: BI together with FE/PE means just BI.
*/
if (line_status & LSR_BI) {
-#if defined(KDB) && defined(BREAK_TO_DEBUGGER)
+#if defined(KDB)
if (com->unit == comconsole) {
- kdb_enter(KDB_WHY_BREAK,
- "Line break on console");
+ kdb_break();
goto cont;
}
#endif
OpenPOWER on IntegriCloud