PERFORCE change 140999 for review
Peter Wemm
peter at FreeBSD.org
Thu May 1 18:23:09 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=140999
Change 140999 by peter at peter_overcee on 2008/05/01 18:22:59
adapt & merge y! extensions for enter ~ ctrl-b
ctrl-p = panic
ctrl-r = reboot (actually shutdown_nice())
Affected files ...
.. //depot/projects/hammer/sys/dev/sio/sio.c#59 edit
.. //depot/projects/hammer/sys/kern/subr_kdb.c#22 edit
.. //depot/projects/hammer/sys/sys/kdb.h#6 edit
Differences ...
==== //depot/projects/hammer/sys/dev/sio/sio.c#59 (text+ko) ====
@@ -1469,7 +1469,12 @@
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);
int_ctl_new = int_ctl;
@@ -1501,9 +1506,23 @@
#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");
+ (kbd_brk = kdb_alt_break(recv_data, &com->alt_brk_state)) != 0) {
+ mtx_unlock_spin(&sio_lock);
+ switch (kdb_brk) {
+ case 1:
+ kdb_enter_why(KDB_WHY_BREAK,
+ "Break sequence on console");
+ break;
+ case 2:
+ kdb_panic("panic on console");
+ break;
+ case 3:
+ 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)) {
==== //depot/projects/hammer/sys/kern/subr_kdb.c#22 (text+ko) ====
@@ -221,6 +221,27 @@
return (0);
}
+void
+kdb_panic(const char *msg)
+{
+
+ if (kdb_dbbe != NULL && kdb_dbbe->dbbe_panic != NULL) {
+#ifdef SMP
+ stop_cpus(PCPU_GET(other_cpus));
+#endif
+ printf("KDB: panic\n");
+ kdb_dbbe->dbbe_panic(msg);
+ }
+}
+
+void
+kdb_reboot(void)
+{
+
+ printf("KDB: reboot initiated\n");
+ shutdown_nice();
+}
+
/*
* 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
@@ -234,7 +255,11 @@
#define KEY_CR 13 /* CR '\r' */
#define KEY_TILDE 126 /* ~ */
-#define KEY_CRTLB 2 /* ^B */
+#define CTRL(x) (x&037)
+#define KEY_CRTLB CTRL('b')
+#define KEY_CRTLP CTRL('p')
+#define KEY_CRTLR CTRL('r')
+#undef CTRL
int
kdb_alt_break(int key, int *state)
@@ -244,15 +269,26 @@
brk = 0;
switch (key) {
case KEY_CR:
- *state = KEY_TILDE;
+ *state = 1;
break;
case KEY_TILDE:
- *state = (*state == KEY_TILDE) ? KEY_CRTLB : 0;
+ *state = (*state == 1) ? 2 : 0;
break;
case KEY_CRTLB:
- if (*state == KEY_CRTLB)
+ if (*state == 2)
brk = 1;
- /* FALLTHROUGH */
+ *state = 0;
+ break;
+ case KEY_CRTLP:
+ if (*state == 2)
+ brk = 2;
+ *state = 0;
+ break;
+ case KEY_CRTLR:
+ if (*state == 2)
+ brk = 3;
+ *state = 0;
+ break;
default:
*state = 0;
break;
==== //depot/projects/hammer/sys/sys/kdb.h#6 (text+ko) ====
@@ -69,6 +69,8 @@
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);
More information about the p4-projects
mailing list