aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2019-09-27 12:27:01 +0200
committerTomas Vanek <vanekt@fbl.cz>2019-12-19 20:41:18 +0000
commit964c4db9cec3e619545490ccb525be210e8008d5 (patch)
tree55c607aff327aa7373bb09e30eafb50738c597a8
parentf476c9eec42d551bc9015089abc47b09058f06b5 (diff)
downloadriscv-openocd-964c4db9cec3e619545490ccb525be210e8008d5.zip
riscv-openocd-964c4db9cec3e619545490ccb525be210e8008d5.tar.gz
riscv-openocd-964c4db9cec3e619545490ccb525be210e8008d5.tar.bz2
gdb_server: fix extended_protocol for multi-target
The flag extended_protocol is currently a single static variable thus, in case of multiple targets, it is shared among all the gdb connections. This is an issue if the gdb connections are not all using extended protocol, but also when one connection get closed because the code sets the flag to zero impacting the other connections still open. Move the flag extended_protocol in the per-connection struct gdb_connection. Change-Id: I19d565f925df6a31767fd8d392242f60867109f2 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5310 Tested-by: jenkins Reviewed-by: Moritz Fischer <moritzf@google.com> Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
-rw-r--r--src/server/gdb_server.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 12c03a5..9f1cb7b 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -91,6 +91,8 @@ struct gdb_connection {
* normally we reply with a S reply via gdb_last_signal_packet.
* as a side note this behaviour only effects gdb > 6.8 */
bool attached;
+ /* set when extended protocol is used */
+ bool extended_protocol;
/* temporarily used for target description support */
struct target_desc_format target_desc;
/* temporarily used for thread list support */
@@ -949,6 +951,7 @@ static int gdb_new_connection(struct connection *connection)
gdb_connection->sync = false;
gdb_connection->mem_write_error = false;
gdb_connection->attached = true;
+ gdb_connection->extended_protocol = false;
gdb_connection->target_desc.tdesc = NULL;
gdb_connection->target_desc.tdesc_length = 0;
gdb_connection->thread_list = NULL;
@@ -3228,7 +3231,6 @@ static int gdb_input_inner(struct connection *connection)
int packet_size;
int retval;
struct gdb_connection *gdb_con = connection->priv;
- static int extended_protocol;
target = get_target_from_connection(connection);
@@ -3380,7 +3382,6 @@ static int gdb_input_inner(struct connection *connection)
break;
case 'D':
retval = gdb_detach(connection);
- extended_protocol = 0;
break;
case 'X':
retval = gdb_write_memory_binary_packet(connection, packet, packet_size);
@@ -3388,7 +3389,7 @@ static int gdb_input_inner(struct connection *connection)
return retval;
break;
case 'k':
- if (extended_protocol != 0) {
+ if (gdb_con->extended_protocol) {
gdb_con->attached = false;
break;
}
@@ -3396,7 +3397,7 @@ static int gdb_input_inner(struct connection *connection)
return ERROR_SERVER_REMOTE_CLOSED;
case '!':
/* handle extended remote protocol */
- extended_protocol = 1;
+ gdb_con->extended_protocol = true;
gdb_put_packet(connection, "OK", 2);
break;
case 'R':