Message ID | 20181001115704.701-7-luc.michel@greensocs.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | gdbstub: support for the multiprocess extension | expand |
On 01/10/2018 13:56, 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. > > Signed-off-by: Luc Michel <luc.michel@greensocs.com> > --- > gdbstub.c | 32 ++++++++++++++++++++++---------- > 1 file changed, 22 insertions(+), 10 deletions(-) > > diff --git a/gdbstub.c b/gdbstub.c > index 3242f0d261..63d7913269 100644 > --- a/gdbstub.c > +++ b/gdbstub.c > @@ -1248,11 +1248,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]; > @@ -1540,30 +1539,43 @@ 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_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_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); > + read_thread_id(p + 16, &p, &pid, &tid); Check similar to patch #3: if (read_thread_id(p, &p, &pid, &tid) == GDB_READ_THREAD_ERR) { put_packet(s, "E22"); break; } With equivalent change: Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > + 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 in multiprocess mode */ > + ObjectClass *oc = object_get_class(OBJECT(cpu)); > + const char *cpu_model = object_class_get_name(oc); > + len = snprintf((char *)mem_buf, sizeof(buf) / 2, > + "CPU#%d %s [%s]", cpu->cpu_index, > + cpu_model, > + cpu->halted ? "halted " : "running"); > + } 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; >
diff --git a/gdbstub.c b/gdbstub.c index 3242f0d261..63d7913269 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -1248,11 +1248,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]; @@ -1540,30 +1539,43 @@ 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_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_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); + read_thread_id(p + 16, &p, &pid, &tid); + 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 in multiprocess mode */ + ObjectClass *oc = object_get_class(OBJECT(cpu)); + const char *cpu_model = object_class_get_name(oc); + len = snprintf((char *)mem_buf, sizeof(buf) / 2, + "CPU#%d %s [%s]", cpu->cpu_index, + cpu_model, + cpu->halted ? "halted " : "running"); + } 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;
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. Signed-off-by: Luc Michel <luc.michel@greensocs.com> --- gdbstub.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-)