diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/debug/kdb/kdb_io.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index 0dbcdfbb6fd0..4802eb5840e1 100644 --- a/kernel/debug/kdb/kdb_io.c +++ b/kernel/debug/kdb/kdb_io.c | |||
@@ -31,15 +31,21 @@ char kdb_prompt_str[CMD_BUFLEN]; | |||
31 | 31 | ||
32 | int kdb_trap_printk; | 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); | 36 | if (buffer[0] != '+' && buffer[0] != '$') { |
37 | if (strncmp(buffer, "$?#3f", slen) != 0 && | ||
38 | strncmp(buffer, "$qSupported", slen) != 0 && | ||
39 | strncmp(buffer, "+$qSupported", slen) != 0) { | ||
40 | KDB_STATE_SET(KGDB_TRANS); | 37 | KDB_STATE_SET(KGDB_TRANS); |
41 | kdb_printf("%s", buffer); | 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 | static int kdb_read_get_key(char *buffer, size_t bufsize) | 51 | static int kdb_read_get_key(char *buffer, size_t bufsize) |
@@ -251,6 +257,10 @@ poll_again: | |||
251 | case 13: /* enter */ | 257 | case 13: /* enter */ |
252 | *lastchar++ = '\n'; | 258 | *lastchar++ = '\n'; |
253 | *lastchar++ = '\0'; | 259 | *lastchar++ = '\0'; |
260 | if (!KDB_STATE(KGDB_TRANS)) { | ||
261 | KDB_STATE_SET(KGDB_TRANS); | ||
262 | kdb_printf("%s", buffer); | ||
263 | } | ||
254 | kdb_printf("\n"); | 264 | kdb_printf("\n"); |
255 | return buffer; | 265 | return buffer; |
256 | case 4: /* Del */ | 266 | case 4: /* Del */ |
@@ -382,10 +392,12 @@ poll_again: | |||
382 | * printed characters if we think that | 392 | * printed characters if we think that |
383 | * kgdb is connecting, until the check | 393 | * kgdb is connecting, until the check |
384 | * fails */ | 394 | * fails */ |
385 | if (!KDB_STATE(KGDB_TRANS)) | 395 | if (!KDB_STATE(KGDB_TRANS)) { |
386 | kgdb_transition_check(buffer); | 396 | if (kgdb_transition_check(buffer)) |
387 | else | 397 | return buffer; |
398 | } else { | ||
388 | kdb_printf("%c", key); | 399 | kdb_printf("%c", key); |
400 | } | ||
389 | } | 401 | } |
390 | /* Special escape to kgdb */ | 402 | /* Special escape to kgdb */ |
391 | if (lastchar - buffer >= 5 && | 403 | if (lastchar - buffer >= 5 && |