kdb serial entry sequence

Keith Owens kaos at melbourne.sgi.com
Mon May 14 23:19:46 PDT 2001


Thanks to a suggestion by William Kucharski (like all good ideas, this
one is obviously correct), the kdb serial console sequence is now
tweakable.  The patch below is incremental on kdb-v1.8-2.4.5-pre1 and
will be included in the next kdb patch set.

Index: 5-pre1.2/drivers/char/serial.c
--- 5-pre1.2/drivers/char/serial.c Thu, 26 Apr 2001 16:48:50 +1000 kaos (linux-2.4/b/c/22_serial.c 1.4.1.2 644)
+++ 5-pre1.2(w)/drivers/char/serial.c Tue, 15 May 2001 16:17:03 +1000 kaos (linux-2.4/b/c/22_serial.c 1.4.1.2 644)
@@ -212,16 +212,25 @@ static char *serial_revdate = "2001-03-2
 #if defined(CONFIG_KDB)
 #include <linux/kdb.h>
 /*
- * kdb_serial_line records the serial line number of the
- * first serial console.  kdb_info will be set upon receipt
- * of the first ^A (which cannot happen until the port is
- * opened and the interrupt handler attached).  To enter
- * kdb before this on a serial console-only system, you must
- * use the 'kdb=early' flag to lilo and set the appropriate
- * breakpoints.
+ * kdb_serial_line records the serial line number of the first serial console.
+ * NOTE: The kernel ignores characters on the serial line unless a user space
+ * program has opened the line first.  To enter kdb before user space has opened
+ * the serial line, you can use the 'kdb=early' flag to lilo and set the
+ * appropriate breakpoints.
+ *
+ * kdb_serial_str[] is the sequence that the user must enter on the serial
+ * console to invoke kdb.  It can be a single character such as "\001"
+ * (control-A) or multiple characters such as "\eKdB".  NOTE: All except the
+ * last character are passed through to the application reading from the serial
+ * console.
+ *
+ * I tried to make the sequence a CONFIG_ option but most of CML1 cannot cope
+ * with '\' in strings, CML2 should be able to do it.  KAO.
  */
 
 static int  kdb_serial_line = -1;
+static char kdb_serial_str[] = "\001";
+static char *kdb_serial_ptr = kdb_serial_str;
 #endif	/* CONFIG_KDB */
 /*
  * All of the compatibilty code so we can compile serial.c against
@@ -581,11 +590,15 @@ static _INLINE_ void receive_chars(struc
 	do {
 		ch = serial_inp(info, UART_RX);
 #if defined(CONFIG_KDB)
-		if ((info->line == kdb_serial_line)
-		 && (ch == 1)  	/* CNTRL-A */
-		 && kdb_on) {
-			kdb(KDB_REASON_KEYBOARD, 0, (kdb_eframe_t)regs);
-			break;
+		if ((info->line == kdb_serial_line) && kdb_on) {
+		    if (ch == *kdb_serial_ptr) {
+			if (!(*++kdb_serial_ptr)) {
+			    kdb(KDB_REASON_KEYBOARD, 0, (kdb_eframe_t)regs);
+			    kdb_serial_ptr = kdb_serial_str;
+			    break;
+			}
+		    } else
+			kdb_serial_ptr = kdb_serial_str;
 		}
 #endif	/* CONFIG_KDB */
 		if (tty->flip.count >= TTY_FLIPBUF_SIZE)




More information about the kdb mailing list