Commit 37f86b469d73fc2f2a925536fb99b8f513f641b7

Authored by Jason Wessel
1 parent d613d828e8

kdb,kgdb: Allow arbitrary kgdb magic knock sequences

The first packet that gdb sends when the kernel is in kdb mode seems
to change with every release of gdb.  Instead of continuing to add
many different gdb packets, change kdb to automatically look for any
thing that looks like a gdb packet.

Example 1 cold start test:
echo g > /proc/sysrq-trigger
$D#44+

Example 2 cold start test:
echo g > /proc/sysrq-trigger
$3#33

The second one should re-enter kdb's shell right away and is purely a
test.

Signed-off-by: Jason Wessel <jason.wessel@windriver.com>

Showing 1 changed file with 20 additions and 8 deletions Side-by-side Diff

kernel/debug/kdb/kdb_io.c
... ... @@ -31,15 +31,21 @@
31 31  
32 32 int kdb_trap_printk;
33 33  
34   -static void kgdb_transition_check(char *buffer)
  34 +static int kgdb_transition_check(char *buffer)
35 35 {
36   - int slen = strlen(buffer);
37   - if (strncmp(buffer, "$?#3f", slen) != 0 &&
38   - strncmp(buffer, "$qSupported", slen) != 0 &&
39   - strncmp(buffer, "+$qSupported", slen) != 0) {
  36 + if (buffer[0] != '+' && buffer[0] != '$') {
40 37 KDB_STATE_SET(KGDB_TRANS);
41 38 kdb_printf("%s", buffer);
  39 + } else {
  40 + int slen = strlen(buffer);
  41 + if (slen > 3 && buffer[slen - 3] == '#') {
  42 + kdb_gdb_state_pass(buffer);
  43 + strcpy(buffer, "kgdb");
  44 + KDB_STATE_SET(DOING_KGDB);
  45 + return 1;
  46 + }
42 47 }
  48 + return 0;
43 49 }
44 50  
45 51 static int kdb_read_get_key(char *buffer, size_t bufsize)
... ... @@ -251,6 +257,10 @@
251 257 case 13: /* enter */
252 258 *lastchar++ = '\n';
253 259 *lastchar++ = '\0';
  260 + if (!KDB_STATE(KGDB_TRANS)) {
  261 + KDB_STATE_SET(KGDB_TRANS);
  262 + kdb_printf("%s", buffer);
  263 + }
254 264 kdb_printf("\n");
255 265 return buffer;
256 266 case 4: /* Del */
257 267  
... ... @@ -382,10 +392,12 @@
382 392 * printed characters if we think that
383 393 * kgdb is connecting, until the check
384 394 * fails */
385   - if (!KDB_STATE(KGDB_TRANS))
386   - kgdb_transition_check(buffer);
387   - else
  395 + if (!KDB_STATE(KGDB_TRANS)) {
  396 + if (kgdb_transition_check(buffer))
  397 + return buffer;
  398 + } else {
388 399 kdb_printf("%c", key);
  400 + }
389 401 }
390 402 /* Special escape to kgdb */
391 403 if (lastchar - buffer >= 5 &&