diff options
Diffstat (limited to 'kernel/debug/gdbstub.c')
-rw-r--r-- | kernel/debug/gdbstub.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/kernel/debug/gdbstub.c b/kernel/debug/gdbstub.c index a11db956dd62..34872482315e 100644 --- a/kernel/debug/gdbstub.c +++ b/kernel/debug/gdbstub.c | |||
@@ -42,6 +42,8 @@ | |||
42 | /* Our I/O buffers. */ | 42 | /* Our I/O buffers. */ |
43 | static char remcom_in_buffer[BUFMAX]; | 43 | static char remcom_in_buffer[BUFMAX]; |
44 | static char remcom_out_buffer[BUFMAX]; | 44 | static char remcom_out_buffer[BUFMAX]; |
45 | static int gdbstub_use_prev_in_buf; | ||
46 | static int gdbstub_prev_in_buf_pos; | ||
45 | 47 | ||
46 | /* Storage for the registers, in GDB format. */ | 48 | /* Storage for the registers, in GDB format. */ |
47 | static unsigned long gdb_regs[(NUMREGBYTES + | 49 | static unsigned long gdb_regs[(NUMREGBYTES + |
@@ -58,6 +60,13 @@ static int gdbstub_read_wait(void) | |||
58 | int ret = -1; | 60 | int ret = -1; |
59 | int i; | 61 | int i; |
60 | 62 | ||
63 | if (unlikely(gdbstub_use_prev_in_buf)) { | ||
64 | if (gdbstub_prev_in_buf_pos < gdbstub_use_prev_in_buf) | ||
65 | return remcom_in_buffer[gdbstub_prev_in_buf_pos++]; | ||
66 | else | ||
67 | gdbstub_use_prev_in_buf = 0; | ||
68 | } | ||
69 | |||
61 | /* poll any additional I/O interfaces that are defined */ | 70 | /* poll any additional I/O interfaces that are defined */ |
62 | while (ret < 0) | 71 | while (ret < 0) |
63 | for (i = 0; kdb_poll_funcs[i] != NULL; i++) { | 72 | for (i = 0; kdb_poll_funcs[i] != NULL; i++) { |
@@ -109,7 +118,6 @@ static void get_packet(char *buffer) | |||
109 | buffer[count] = ch; | 118 | buffer[count] = ch; |
110 | count = count + 1; | 119 | count = count + 1; |
111 | } | 120 | } |
112 | buffer[count] = 0; | ||
113 | 121 | ||
114 | if (ch == '#') { | 122 | if (ch == '#') { |
115 | xmitcsum = hex_to_bin(gdbstub_read_wait()) << 4; | 123 | xmitcsum = hex_to_bin(gdbstub_read_wait()) << 4; |
@@ -124,6 +132,7 @@ static void get_packet(char *buffer) | |||
124 | if (dbg_io_ops->flush) | 132 | if (dbg_io_ops->flush) |
125 | dbg_io_ops->flush(); | 133 | dbg_io_ops->flush(); |
126 | } | 134 | } |
135 | buffer[count] = 0; | ||
127 | } while (checksum != xmitcsum); | 136 | } while (checksum != xmitcsum); |
128 | } | 137 | } |
129 | 138 | ||
@@ -1082,12 +1091,11 @@ int gdbstub_state(struct kgdb_state *ks, char *cmd) | |||
1082 | case 'c': | 1091 | case 'c': |
1083 | strcpy(remcom_in_buffer, cmd); | 1092 | strcpy(remcom_in_buffer, cmd); |
1084 | return 0; | 1093 | return 0; |
1085 | case '?': | 1094 | case '$': |
1086 | gdb_cmd_status(ks); | 1095 | strcpy(remcom_in_buffer, cmd); |
1087 | break; | 1096 | gdbstub_use_prev_in_buf = strlen(remcom_in_buffer); |
1088 | case '\0': | 1097 | gdbstub_prev_in_buf_pos = 0; |
1089 | strcpy(remcom_out_buffer, ""); | 1098 | return 0; |
1090 | break; | ||
1091 | } | 1099 | } |
1092 | dbg_io_ops->write_char('+'); | 1100 | dbg_io_ops->write_char('+'); |
1093 | put_packet(remcom_out_buffer); | 1101 | put_packet(remcom_out_buffer); |