Skip to content

Commit 37f86b4

Browse files
committed
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>
1 parent d613d82 commit 37f86b4

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

kernel/debug/kdb/kdb_io.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,21 @@ char kdb_prompt_str[CMD_BUFLEN];
3131

3232
int kdb_trap_printk;
3333

34-
static void kgdb_transition_check(char *buffer)
34+
static int kgdb_transition_check(char *buffer)
3535
{
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] != '$') {
4037
KDB_STATE_SET(KGDB_TRANS);
4138
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+
}
4247
}
48+
return 0;
4349
}
4450

4551
static int kdb_read_get_key(char *buffer, size_t bufsize)
@@ -251,6 +257,10 @@ static char *kdb_read(char *buffer, size_t bufsize)
251257
case 13: /* enter */
252258
*lastchar++ = '\n';
253259
*lastchar++ = '\0';
260+
if (!KDB_STATE(KGDB_TRANS)) {
261+
KDB_STATE_SET(KGDB_TRANS);
262+
kdb_printf("%s", buffer);
263+
}
254264
kdb_printf("\n");
255265
return buffer;
256266
case 4: /* Del */
@@ -382,10 +392,12 @@ static char *kdb_read(char *buffer, size_t bufsize)
382392
* printed characters if we think that
383393
* kgdb is connecting, until the check
384394
* 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 {
388399
kdb_printf("%c", key);
400+
}
389401
}
390402
/* Special escape to kgdb */
391403
if (lastchar - buffer >= 5 &&

0 commit comments

Comments
 (0)