diff options
Diffstat (limited to 'kernel/debug/kdb/kdb_io.c')
| -rw-r--r-- | kernel/debug/kdb/kdb_io.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index 96fdaac46a80..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#37", slen) != 0 && | ||
| 39 | strncmp(buffer, "+$qSupported#37", 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,22 +392,26 @@ 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 && |
| 392 | strcmp(lastchar - 5, "$?#3f") == 0) { | 404 | strcmp(lastchar - 5, "$?#3f") == 0) { |
| 405 | kdb_gdb_state_pass(lastchar - 5); | ||
| 393 | strcpy(buffer, "kgdb"); | 406 | strcpy(buffer, "kgdb"); |
| 394 | KDB_STATE_SET(DOING_KGDB); | 407 | KDB_STATE_SET(DOING_KGDB); |
| 395 | return buffer; | 408 | return buffer; |
| 396 | } | 409 | } |
| 397 | if (lastchar - buffer >= 14 && | 410 | if (lastchar - buffer >= 11 && |
| 398 | strcmp(lastchar - 14, "$qSupported#37") == 0) { | 411 | strcmp(lastchar - 11, "$qSupported") == 0) { |
| 412 | kdb_gdb_state_pass(lastchar - 11); | ||
| 399 | strcpy(buffer, "kgdb"); | 413 | strcpy(buffer, "kgdb"); |
| 400 | KDB_STATE_SET(DOING_KGDB2); | 414 | KDB_STATE_SET(DOING_KGDB); |
| 401 | return buffer; | 415 | return buffer; |
| 402 | } | 416 | } |
| 403 | } | 417 | } |
