Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 May 2008 18:23:08 GMT
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 140999 for review
Message-ID:  <200805011823.m41IN8Lw041007@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=140999

Change 140999 by peter@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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200805011823.m41IN8Lw041007>