Message ID | 20181001115704.701-9-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: > Add support for multiprocess extension in gdb_vm_state_change() > function. > > Signed-off-by: Luc Michel <luc.michel@greensocs.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > --- > gdbstub.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/gdbstub.c b/gdbstub.c > index 9065e8e140..c1a02c34cd 100644 > --- a/gdbstub.c > +++ b/gdbstub.c > @@ -1692,10 +1692,11 @@ void gdb_set_stop_cpu(CPUState *cpu) > static void gdb_vm_state_change(void *opaque, int running, RunState state) > { > GDBState *s = gdbserver_state; > CPUState *cpu = s->c_cpu; > char buf[256]; > + char thread_id[16]; > const char *type; > int ret; > > if (running || s->state == RS_INACTIVE) { > return; > @@ -1703,10 +1704,18 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) > /* Is there a GDB syscall waiting to be sent? */ > if (s->current_syscall_cb) { > put_packet(s, s->syscall_buf); > return; > } > + > + if (cpu == NULL) { > + /* No process attached */ > + return; > + } > + > + gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)); > + > switch (state) { > case RUN_STATE_DEBUG: > if (cpu->watchpoint_hit) { > switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) { > case BP_MEM_READ: > @@ -1720,12 +1729,12 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) > break; > } > trace_gdbstub_hit_watchpoint(type, cpu_gdb_index(cpu), > (target_ulong)cpu->watchpoint_hit->vaddr); > snprintf(buf, sizeof(buf), > - "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";", > - GDB_SIGNAL_TRAP, cpu_gdb_index(cpu), type, > + "T%02xthread:%s;%swatch:" TARGET_FMT_lx ";", > + GDB_SIGNAL_TRAP, thread_id, type, > (target_ulong)cpu->watchpoint_hit->vaddr); > cpu->watchpoint_hit = NULL; > goto send_packet; > } else { > trace_gdbstub_hit_break(); > @@ -1763,11 +1772,11 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) > trace_gdbstub_hit_unknown(state); > ret = GDB_SIGNAL_UNKNOWN; > break; > } > gdb_set_stop_cpu(cpu); > - snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_gdb_index(cpu)); > + snprintf(buf, sizeof(buf), "T%02xthread:%s;", ret, thread_id); > > send_packet: > put_packet(s, buf); > > /* disable single step if it was enabled */ >
diff --git a/gdbstub.c b/gdbstub.c index 9065e8e140..c1a02c34cd 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -1692,10 +1692,11 @@ void gdb_set_stop_cpu(CPUState *cpu) static void gdb_vm_state_change(void *opaque, int running, RunState state) { GDBState *s = gdbserver_state; CPUState *cpu = s->c_cpu; char buf[256]; + char thread_id[16]; const char *type; int ret; if (running || s->state == RS_INACTIVE) { return; @@ -1703,10 +1704,18 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) /* Is there a GDB syscall waiting to be sent? */ if (s->current_syscall_cb) { put_packet(s, s->syscall_buf); return; } + + if (cpu == NULL) { + /* No process attached */ + return; + } + + gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)); + switch (state) { case RUN_STATE_DEBUG: if (cpu->watchpoint_hit) { switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) { case BP_MEM_READ: @@ -1720,12 +1729,12 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) break; } trace_gdbstub_hit_watchpoint(type, cpu_gdb_index(cpu), (target_ulong)cpu->watchpoint_hit->vaddr); snprintf(buf, sizeof(buf), - "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";", - GDB_SIGNAL_TRAP, cpu_gdb_index(cpu), type, + "T%02xthread:%s;%swatch:" TARGET_FMT_lx ";", + GDB_SIGNAL_TRAP, thread_id, type, (target_ulong)cpu->watchpoint_hit->vaddr); cpu->watchpoint_hit = NULL; goto send_packet; } else { trace_gdbstub_hit_break(); @@ -1763,11 +1772,11 @@ static void gdb_vm_state_change(void *opaque, int running, RunState state) trace_gdbstub_hit_unknown(state); ret = GDB_SIGNAL_UNKNOWN; break; } gdb_set_stop_cpu(cpu); - snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_gdb_index(cpu)); + snprintf(buf, sizeof(buf), "T%02xthread:%s;", ret, thread_id); send_packet: put_packet(s, buf); /* disable single step if it was enabled */
Add support for multiprocess extension in gdb_vm_state_change() function. Signed-off-by: Luc Michel <luc.michel@greensocs.com> --- gdbstub.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)