I agree but I guess to really fix it we need to change gdb_read_register implementation to support returning the size of the register for mem_buffer = NULL Let's leave it for another patchset?
On Wed, May 15, 2019 at 7:10 PM Alex Bennée <alex.ben...@linaro.org> wrote: > > > Jon Doron <ari...@gmail.com> writes: > > > Signed-off-by: Jon Doron <ari...@gmail.com> > > --- > > gdbstub.c | 31 +++++++++++++++++++++++-------- > > 1 file changed, 23 insertions(+), 8 deletions(-) > > > > diff --git a/gdbstub.c b/gdbstub.c > > index adfe39b3a3..3478ac778d 100644 > > --- a/gdbstub.c > > +++ b/gdbstub.c > > @@ -1757,6 +1757,21 @@ static void handle_write_all_regs(GdbCmdContext > > *gdb_ctx, void *user_ctx) > > put_packet(gdb_ctx->s, "OK"); > > } > > > > +static void handle_read_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx) > > +{ > > + target_ulong addr, len; > > + > > + cpu_synchronize_state(gdb_ctx->s->g_cpu); > > + len = 0; > > + for (addr = 0; addr < gdb_ctx->s->g_cpu->gdb_num_g_regs; addr++) { > > + len += gdb_read_register(gdb_ctx->s->g_cpu, gdb_ctx->mem_buf + len, > > + addr); > > + } > > Again no bounds checking - we get away with it because for hppa: > > (* 8 128 2) = 2048 > > Anyway: > > Reviewed-by: Alex Bennée <alex.ben...@linaro.org> > > > + > > + memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, len); > > + put_packet(gdb_ctx->s, gdb_ctx->str_buf); > > +} > > + > > static int gdb_handle_packet(GDBState *s, const char *line_buf) > > { > > CPUState *cpu; > > @@ -1764,7 +1779,7 @@ static int gdb_handle_packet(GDBState *s, const char > > *line_buf) > > CPUClass *cc; > > const char *p; > > uint32_t pid, tid; > > - int ch, reg_size, type, res; > > + int ch, type, res; > > uint8_t mem_buf[MAX_PACKET_LENGTH]; > > char buf[sizeof(mem_buf) + 1 /* trailing NUL */]; > > char thread_id[16]; > > @@ -1923,14 +1938,14 @@ static int gdb_handle_packet(GDBState *s, const > > char *line_buf) > > } > > break; > > case 'g': > > - cpu_synchronize_state(s->g_cpu); > > - len = 0; > > - for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) { > > - reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr); > > - len += reg_size; > > + { > > + static const GdbCmdParseEntry read_all_regs_cmd_desc = { > > + .handler = handle_read_all_regs, > > + .cmd = "g", > > + .cmd_startswith = 1 > > + }; > > + cmd_parser = &read_all_regs_cmd_desc; > > } > > - memtohex(buf, mem_buf, len); > > - put_packet(s, buf); > > break; > > case 'G': > > { > > > -- > Alex Bennée