diff options
author | Ian Thompson <ianst@cadence.com> | 2022-08-01 15:47:52 -0700 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2022-08-15 13:22:40 +0000 |
commit | d9b2607ca094898d8d7180085a913e8a5b46ecac (patch) | |
tree | bdc4656760d85b5f61541222ccc54a8b6934a0ca | |
parent | e282d208321ed1661efa894b583cf8922d67ba3f (diff) | |
download | riscv-openocd-d9b2607ca094898d8d7180085a913e8a5b46ecac.zip riscv-openocd-d9b2607ca094898d8d7180085a913e8a5b46ecac.tar.gz riscv-openocd-d9b2607ca094898d8d7180085a913e8a5b46ecac.tar.bz2 |
gdb_server: support sparse register maps
Add additional error handling for targets where gaps may exist in reg_list[]
Signed-off-by: Ian Thompson <ianst@cadence.com>
Change-Id: I65232429e2de08f5d54eeca53aea0db8ce2b58af
Reviewed-on: https://review.openocd.org/c/openocd/+/7103
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
-rw-r--r-- | src/server/gdb_server.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 28833c9..3052d0a 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -1323,6 +1323,8 @@ static int gdb_set_registers_packet(struct connection *connection, packet_p = packet; for (i = 0; i < reg_list_size; i++) { uint8_t *bin_buf; + if (!reg_list[i] || !reg_list[i]->exist || reg_list[i]->hidden) + continue; int chars = (DIV_ROUND_UP(reg_list[i]->size, 8) * 2); if (packet_p + chars > packet + packet_size) @@ -1375,7 +1377,8 @@ static int gdb_get_register_packet(struct connection *connection, if (retval != ERROR_OK) return gdb_error(connection, retval); - if (reg_list_size <= reg_num) { + if ((reg_list_size <= reg_num) || !reg_list[reg_num] || + !reg_list[reg_num]->exist || reg_list[reg_num]->hidden) { LOG_ERROR("gdb requested a non-existing register (reg_num=%d)", reg_num); return ERROR_SERVER_REMOTE_CLOSED; } @@ -1437,7 +1440,8 @@ static int gdb_set_register_packet(struct connection *connection, return gdb_error(connection, retval); } - if (reg_list_size <= reg_num) { + if ((reg_list_size <= reg_num) || !reg_list[reg_num] || + !reg_list[reg_num]->exist || reg_list[reg_num]->hidden) { LOG_ERROR("gdb requested a non-existing register (reg_num=%d)", reg_num); free(bin_buf); free(reg_list); |