aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorIan Thompson <ianst@cadence.com>2022-08-01 15:47:52 -0700
committerAntonio Borneo <borneo.antonio@gmail.com>2022-08-15 13:22:40 +0000
commitd9b2607ca094898d8d7180085a913e8a5b46ecac (patch)
treebdc4656760d85b5f61541222ccc54a8b6934a0ca /src/server
parente282d208321ed1661efa894b583cf8922d67ba3f (diff)
downloadriscv-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>
Diffstat (limited to 'src/server')
-rw-r--r--src/server/gdb_server.c8
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);