diff options
Diffstat (limited to 'kernel/debug/gdbstub.c')
| -rw-r--r-- | kernel/debug/gdbstub.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/kernel/debug/gdbstub.c b/kernel/debug/gdbstub.c index ccdf0929f12d..188203a19657 100644 --- a/kernel/debug/gdbstub.c +++ b/kernel/debug/gdbstub.c | |||
| @@ -887,6 +887,13 @@ int gdb_serial_stub(struct kgdb_state *ks) | |||
| 887 | case 'Z': /* Break point set */ | 887 | case 'Z': /* Break point set */ |
| 888 | gdb_cmd_break(ks); | 888 | gdb_cmd_break(ks); |
| 889 | break; | 889 | break; |
| 890 | #ifdef CONFIG_KGDB_KDB | ||
| 891 | case '3': /* Escape into back into kdb */ | ||
| 892 | if (remcom_in_buffer[1] == '\0') { | ||
| 893 | gdb_cmd_detachkill(ks); | ||
| 894 | return DBG_PASS_EVENT; | ||
| 895 | } | ||
| 896 | #endif | ||
| 890 | case 'C': /* Exception passing */ | 897 | case 'C': /* Exception passing */ |
| 891 | tmp = gdb_cmd_exception_pass(ks); | 898 | tmp = gdb_cmd_exception_pass(ks); |
| 892 | if (tmp > 0) | 899 | if (tmp > 0) |
| @@ -932,3 +939,32 @@ kgdb_exit: | |||
| 932 | error = 1; | 939 | error = 1; |
| 933 | return error; | 940 | return error; |
| 934 | } | 941 | } |
| 942 | |||
| 943 | int gdbstub_state(struct kgdb_state *ks, char *cmd) | ||
| 944 | { | ||
| 945 | int error; | ||
| 946 | |||
| 947 | switch (cmd[0]) { | ||
| 948 | case 'e': | ||
| 949 | error = kgdb_arch_handle_exception(ks->ex_vector, | ||
| 950 | ks->signo, | ||
| 951 | ks->err_code, | ||
| 952 | remcom_in_buffer, | ||
| 953 | remcom_out_buffer, | ||
| 954 | ks->linux_regs); | ||
| 955 | return error; | ||
| 956 | case 's': | ||
| 957 | case 'c': | ||
| 958 | strcpy(remcom_in_buffer, cmd); | ||
| 959 | return 0; | ||
| 960 | case '?': | ||
| 961 | gdb_cmd_status(ks); | ||
| 962 | break; | ||
| 963 | case '\0': | ||
| 964 | strcpy(remcom_out_buffer, ""); | ||
| 965 | break; | ||
| 966 | } | ||
| 967 | dbg_io_ops->write_char('+'); | ||
| 968 | put_packet(remcom_out_buffer); | ||
| 969 | return 0; | ||
| 970 | } | ||
