All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
To: Luc Michel <luc.michel@greensocs.com>
Cc: qemu-devel@nongnu.org, qemu-arm@nongnu.org,
	"Peter Maydell" <peter.maydell@linaro.org>,
	saipava@xilinx.com, edgari@xilinx.com, alistair@alistair23.me,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
	mark.burton@greensocs.com,
	"Eduardo Habkost" <ehabkost@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v6 07/16] gdbstub: add multiprocess support to (f|s)ThreadInfo and ThreadExtraInfo
Date: Mon, 19 Nov 2018 17:44:55 +0100	[thread overview]
Message-ID: <20181119164455.GB7447@toto> (raw)
In-Reply-To: <d4fc764e-f23f-0154-f6f5-29b509422b7b@greensocs.com>

On Mon, Nov 19, 2018 at 11:12:45AM +0100, Luc Michel wrote:
> 
> 
> On 11/16/18 11:04 AM, Edgar E. Iglesias wrote:
> > On Thu, Nov 15, 2018 at 10:41:58AM +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.
> >>
> >> Signed-off-by: Luc Michel <luc.michel@greensocs.com>
> >> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> >> ---
> >>  gdbstub.c | 35 +++++++++++++++++++++++++----------
> >>  1 file changed, 25 insertions(+), 10 deletions(-)
> >>
> >> diff --git a/gdbstub.c b/gdbstub.c
> >> index d19b0137e8..292dee8914 100644
> >> --- a/gdbstub.c
> >> +++ b/gdbstub.c
> >> @@ -1260,11 +1260,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];
> >> @@ -1556,30 +1555,46 @@ 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);
> >> +            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 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");
> > 
> > 
> > 
> > I wonder if we could also print a friendly name here deducted from QOM?
> > In some of our use-cases we have an array of MicroBlazes that all live
> > in different HW subsystems and are named differently (e.g CSU, PMU, PMC,
> > PSM etc).
> > 
> > Instead of just seeing a list of MicroBlaze cores it may be more useful
> > to see the actual core name of some sort, e.g:
> > 
> > Instead of:
> > CPU#0 MicroBlaze [running]
> > CPU#1 MicroBlaze [running]
> > CPU#2 MicroBlaze [running]
> > CPU#3 MicroBlaze [running]
> > 
> > Perhaps something like:
> > CPU#0 MicroBlaze PMU [running]
> > CPU#1 MicroBlaze PMC-PPU0 [running]
> > CPU#2 MicroBlaze PMC-PPU1 [running]
> > CPU#3 MicroBlaze PSM [running]
> > 
> > Any thoughts on that?
> I wanted to avoid the ThreadExtraInfo packet to become too much cluttered.
> 
> Here are some tests adding the component part of the CPU canonical name:
> 
> (gdb) info threads
>   Id   Target Id         Frame
>   1.1  Thread 1.1 (CPU#0 cortex-a53-arm-cpu apu-cpu[0] [running])
> 0x0000000000000000 in ?? ()
>   1.2  Thread 1.2 (CPU#1 cortex-a53-arm-cpu apu-cpu[1] [halted ])
> 0x0000000000000000 in ?? ()
>   1.3  Thread 1.3 (CPU#2 cortex-a53-arm-cpu apu-cpu[2] [halted ])
> 0x0000000000000000 in ?? ()
>   1.4  Thread 1.4 (CPU#3 cortex-a53-arm-cpu apu-cpu[3] [halted ])
> 0x0000000000000000 in ?? ()
> * 2.1  Thread 2.5 (CPU#4 cortex-r5f-arm-cpu rpu-cpu[0] [halted ])
> 0xffff0000 in ?? ()
>   2.2  Thread 2.6 (CPU#5 cortex-r5f-arm-cpu rpu-cpu[1] [halted ])
> 0xffff0000 in ?? ()
> 
> The model name takes quite some room. The interesting info are `arm` and
> `cortex-xxx`, but AFAIK there is no way of extracting that for a CPU
> generically.
> 
> In this case, having the component part of the canonical name is ok
> because self-explanatory. However we could encounter cases where the
> parent name would be necessary to discriminate the CPUs, something like:
>   cluster[0]/cpu[0]
>             /cpu[1]
>   cluster[1]/cpu[0]
>             /cpu[1]
>   ...
> 
> The "safest" way would be to have the whole path:
> 
> (gdb) info threads
>   Id   Target Id         Frame
>   1.1  Thread 1.1 (CPU#0 cortex-a53-arm-cpu
> /machine/soc/apu-cluster/apu-cpu[0] [running]) 0x0000000000000000 in ?? ()
>   1.2  Thread 1.2 (CPU#1 cortex-a53-arm-cpu
> /machine/soc/apu-cluster/apu-cpu[1] [halted ]) 0x0000000000000000 in ?? ()
>   1.3  Thread 1.3 (CPU#2 cortex-a53-arm-cpu
> /machine/soc/apu-cluster/apu-cpu[2] [halted ]) 0x0000000000000000 in ?? ()
>   1.4  Thread 1.4 (CPU#3 cortex-a53-arm-cpu
> /machine/soc/apu-cluster/apu-cpu[3] [halted ]) 0x0000000000000000 in ?? ()
> * 2.1  Thread 2.5 (CPU#4 cortex-r5f-arm-cpu
> /machine/soc/rpu-cluster/rpu-cpu[0] [halted ]) 0xffff0000 in ?? ()
>   2.2  Thread 2.6 (CPU#5 cortex-r5f-arm-cpu
> /machine/soc/rpu-cluster/rpu-cpu[1] [halted ]) 0xffff0000 in ?? ()
> 
> But that becomes really cluttered... We could also remove the CPU model
> completely.
> 
> What are your thoughts?

Thanks Luc,

Not sure...

(CPU#0 cortex-a53-arm-cpu apu-cpu[0] [running])

Looks a little long but I think still the better option here. Would be interesting to hear others opinion.

Also, would it make sense to remove the CPU#X alltogether here?
It's not of much use in GDB since we controll things by process and thread anyway...

Cheers,
Edgar



> 
> Thanks,
> Luc
> 
> > 
> > Thanks,
> > Edgar
> > 
> >> +                } 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
> >>

  reply	other threads:[~2018-11-19 16:52 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-15  9:41 [Qemu-devel] [PATCH v6 00/16] gdbstub: support for the multiprocess extension Luc Michel
2018-11-15  9:41 ` [Qemu-devel] [PATCH v6 01/16] hw/cpu: introduce CPU clusters Luc Michel
2018-11-15  9:41 ` [Qemu-devel] [PATCH v6 02/16] gdbstub: introduce GDB processes Luc Michel
2018-11-15  9:41 ` [Qemu-devel] [PATCH v6 03/16] gdbstub: add multiprocess support to '?' packets Luc Michel
2018-11-15  9:41 ` [Qemu-devel] [PATCH v6 04/16] gdbstub: add multiprocess support to 'H' and 'T' packets Luc Michel
2018-11-16  9:51   ` Edgar E. Iglesias
2018-11-19  8:17     ` Luc Michel
2018-11-15  9:41 ` [Qemu-devel] [PATCH v6 05/16] gdbstub: add multiprocess support to vCont packets Luc Michel
2018-11-16  9:57   ` Edgar E. Iglesias
2018-11-16 21:51   ` Alistair Francis
2018-11-15  9:41 ` [Qemu-devel] [PATCH v6 06/16] gdbstub: add multiprocess support to 'sC' packets Luc Michel
2018-11-16  9:57   ` Edgar E. Iglesias
2018-11-15  9:41 ` [Qemu-devel] [PATCH v6 07/16] gdbstub: add multiprocess support to (f|s)ThreadInfo and ThreadExtraInfo Luc Michel
2018-11-16 10:04   ` Edgar E. Iglesias
2018-11-19 10:12     ` Luc Michel
2018-11-19 16:44       ` Edgar E. Iglesias [this message]
2018-11-15  9:41 ` [Qemu-devel] [PATCH v6 08/16] gdbstub: add multiprocess support to Xfer:features:read: Luc Michel
2018-11-16 10:06   ` Edgar E. Iglesias
2018-11-16 21:54   ` Alistair Francis
2018-11-15  9:42 ` [Qemu-devel] [PATCH v6 09/16] gdbstub: add multiprocess support to gdb_vm_state_change() Luc Michel
2018-11-16 10:09   ` Edgar E. Iglesias
2018-11-16 21:56   ` Alistair Francis
2018-11-15  9:42 ` [Qemu-devel] [PATCH v6 10/16] gdbstub: add multiprocess support to 'D' packets Luc Michel
2018-11-16 10:10   ` Edgar E. Iglesias
2018-11-16 22:00   ` Alistair Francis
2018-11-15  9:42 ` [Qemu-devel] [PATCH v6 11/16] gdbstub: add support for extended mode packet Luc Michel
2018-11-16 10:10   ` Edgar E. Iglesias
2018-11-16 22:00   ` Alistair Francis
2018-11-15  9:42 ` [Qemu-devel] [PATCH v6 12/16] gdbstub: add support for vAttach packets Luc Michel
2018-11-16 10:11   ` Edgar E. Iglesias
2018-11-16 22:03   ` Alistair Francis
2018-11-15  9:42 ` [Qemu-devel] [PATCH v6 13/16] gdbstub: processes initialization on new peer connection Luc Michel
2018-11-16 10:13   ` Edgar E. Iglesias
2018-11-15  9:42 ` [Qemu-devel] [PATCH v6 14/16] gdbstub: gdb_set_stop_cpu: ignore request when process is not attached Luc Michel
2018-11-16 10:14   ` Edgar E. Iglesias
2018-11-15  9:42 ` [Qemu-devel] [PATCH v6 15/16] gdbstub: add multiprocess extension support Luc Michel
2018-11-16 10:14   ` Edgar E. Iglesias
2018-11-15  9:42 ` [Qemu-devel] [PATCH v6 16/16] arm/xlnx-zynqmp: put APUs and RPUs in separate CPU clusters Luc Michel
2018-11-16 10:15 ` [Qemu-devel] [PATCH v6 00/16] gdbstub: support for the multiprocess extension Edgar E. Iglesias

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181119164455.GB7447@toto \
    --to=edgar.iglesias@xilinx.com \
    --cc=alistair@alistair23.me \
    --cc=edgari@xilinx.com \
    --cc=ehabkost@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=luc.michel@greensocs.com \
    --cc=mark.burton@greensocs.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=saipava@xilinx.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.