gdb_server: support sparse register maps
[fw/openocd] / src / server / gdb_server.c
index 28833c9ce35f6f85361ea7ef5ec5b9bbb5b78e98..3052d0a0e1c364ff5dae1fe36bf4fa8b5d4d9858 100644 (file)
@@ -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);