Skip to content

Commit

Permalink
kdb,kgdb: Allow arbitrary kgdb magic knock sequences
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
jwessel committed Aug 1, 2011
1 parent d613d82 commit 37f86b4
Showing 1 changed file with 20 additions and 8 deletions.
28 changes: 20 additions & 8 deletions kernel/debug/kdb/kdb_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,21 @@ char kdb_prompt_str[CMD_BUFLEN];

int kdb_trap_printk;

static void kgdb_transition_check(char *buffer)
static int kgdb_transition_check(char *buffer)
{
int slen = strlen(buffer);
if (strncmp(buffer, "$?#3f", slen) != 0 &&
strncmp(buffer, "$qSupported", slen) != 0 &&
strncmp(buffer, "+$qSupported", slen) != 0) {
if (buffer[0] != '+' && buffer[0] != '$') {
KDB_STATE_SET(KGDB_TRANS);
kdb_printf("%s", buffer);
} else {
int slen = strlen(buffer);
if (slen > 3 && buffer[slen - 3] == '#') {
kdb_gdb_state_pass(buffer);
strcpy(buffer, "kgdb");
KDB_STATE_SET(DOING_KGDB);
return 1;
}
}
return 0;
}

static int kdb_read_get_key(char *buffer, size_t bufsize)
Expand Down Expand Up @@ -251,6 +257,10 @@ static char *kdb_read(char *buffer, size_t bufsize)
case 13: /* enter */
*lastchar++ = '\n';
*lastchar++ = '\0';
if (!KDB_STATE(KGDB_TRANS)) {
KDB_STATE_SET(KGDB_TRANS);
kdb_printf("%s", buffer);
}
kdb_printf("\n");
return buffer;
case 4: /* Del */
Expand Down Expand Up @@ -382,10 +392,12 @@ static char *kdb_read(char *buffer, size_t bufsize)
* printed characters if we think that
* kgdb is connecting, until the check
* fails */
if (!KDB_STATE(KGDB_TRANS))
kgdb_transition_check(buffer);
else
if (!KDB_STATE(KGDB_TRANS)) {
if (kgdb_transition_check(buffer))
return buffer;
} else {
kdb_printf("%c", key);
}
}
/* Special escape to kgdb */
if (lastchar - buffer >= 5 &&
Expand Down

0 comments on commit 37f86b4

Please sign in to comment.