On Fri, Nov 23, 2018 at 10:17:20AM +0100, Luc Michel wrote: > Change the thread info related packets handling to support multiprocess > extension. > > Add the CPUs class name in the extra info to help differentiate > them in multiprocess mode.
Reviewed-by: Edgar E. Iglesias <edgar.igles...@xilinx.com> > > Signed-off-by: Luc Michel <luc.mic...@greensocs.com> > Reviewed-by: Philippe Mathieu-Daudé <phi...@redhat.com> > --- > gdbstub.c | 37 +++++++++++++++++++++++++++---------- > 1 file changed, 27 insertions(+), 10 deletions(-) > > diff --git a/gdbstub.c b/gdbstub.c > index 728efdabee..12d4e33c40 100644 > --- a/gdbstub.c > +++ b/gdbstub.c > @@ -1262,11 +1262,10 @@ out: > static int gdb_handle_packet(GDBState *s, const char *line_buf) > { > CPUState *cpu; > CPUClass *cc; > const char *p; > - uint32_t thread; > uint32_t pid, tid; > int ch, reg_size, type, res; > uint8_t mem_buf[MAX_PACKET_LENGTH]; > char buf[sizeof(mem_buf) + 1 /* trailing NUL */]; > char thread_id[16]; > @@ -1558,30 +1557,48 @@ static int gdb_handle_packet(GDBState *s, const char > *line_buf) > snprintf(buf, sizeof(buf), "QC%s", > gdb_fmt_thread_id(s, cpu, thread_id, > sizeof(thread_id))); > put_packet(s, buf); > break; > } else if (strcmp(p,"fThreadInfo") == 0) { > - s->query_cpu = first_cpu; > + s->query_cpu = gdb_first_attached_cpu(s); > goto report_cpuinfo; > } else if (strcmp(p,"sThreadInfo") == 0) { > report_cpuinfo: > if (s->query_cpu) { > - snprintf(buf, sizeof(buf), "m%x", > cpu_gdb_index(s->query_cpu)); > + snprintf(buf, sizeof(buf), "m%s", > + gdb_fmt_thread_id(s, s->query_cpu, > + thread_id, sizeof(thread_id))); > put_packet(s, buf); > - s->query_cpu = CPU_NEXT(s->query_cpu); > + s->query_cpu = gdb_next_attached_cpu(s, s->query_cpu); > } else > put_packet(s, "l"); > break; > } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) { > - thread = strtoull(p+16, (char **)&p, 16); > - cpu = find_cpu(thread); > + if (read_thread_id(p + 16, &p, &pid, &tid) == > GDB_READ_THREAD_ERR) { > + put_packet(s, "E22"); > + break; > + } > + cpu = gdb_get_cpu(s, pid, tid); > if (cpu != NULL) { > cpu_synchronize_state(cpu); > - /* memtohex() doubles the required space */ > - len = snprintf((char *)mem_buf, sizeof(buf) / 2, > - "CPU#%d [%s]", cpu->cpu_index, > - cpu->halted ? "halted " : "running"); > + > + if (s->multiprocess && (s->process_num > 1)) { > + /* Print the CPU model and name in multiprocess mode */ > + ObjectClass *oc = object_get_class(OBJECT(cpu)); > + const char *cpu_model = object_class_get_name(oc); > + char *cpu_name = > + object_get_canonical_path_component(OBJECT(cpu)); > + len = snprintf((char *)mem_buf, sizeof(buf) / 2, > + "%s %s [%s]", cpu_model, cpu_name, > + cpu->halted ? "halted " : "running"); > + g_free(cpu_name); > + } else { > + /* memtohex() doubles the required space */ > + len = snprintf((char *)mem_buf, sizeof(buf) / 2, > + "CPU#%d [%s]", cpu->cpu_index, > + cpu->halted ? "halted " : "running"); > + } > trace_gdbstub_op_extra_info((char *)mem_buf); > memtohex(buf, mem_buf, len); > put_packet(s, buf); > } > break; > -- > 2.19.1 >