[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 02/15] gdbstub: add multiprocess support to '
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-devel] [PATCH v2 02/15] gdbstub: add multiprocess support to '?' packets |
Date: |
Mon, 1 Oct 2018 17:20:06 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0 |
On 01/10/2018 13:56, Luc Michel wrote:
> The gdb_get_cpu_pid() function does the PID lookup for the given CPU. It
> checks if the CPU is in a QOM container named after the
> GDB_CPU_GROUP_NAME macro. If found, it returns the correponding PID,
> which is the group ID plus one (group IDs start at 0, GDB PIDs at 1).
> When the CPU is not a child of such a container, PID 1 is returned.
>
> The gdb_fmt_thread_id() function generates the string to be used to identify
> a given thread, in a response packet for the peer. This function
> supports generating thread IDs when multiprocess mode is enabled (in the
> form `p<pid>.<tid>').
>
> Use it in the reply to a '?' request.
>
> Signed-off-by: Luc Michel <address@hidden>
>
No need to separate tags with empty line.
> Reviewed-by: Alistair Francis <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
> ---
> gdbstub.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 43 insertions(+), 2 deletions(-)
>
> diff --git a/gdbstub.c b/gdbstub.c
> index 5c86218f49..ac9d540fda 100644
> --- a/gdbstub.c
> +++ b/gdbstub.c
> @@ -640,10 +640,37 @@ static int memtox(char *buf, const char *mem, int len)
> }
> }
> return p - buf;
> }
>
> +static uint32_t gdb_get_cpu_pid(const GDBState *s, CPUState *cpu)
> +{
> + gchar *path;
> + gchar *cont;
> + const char *left;
> + unsigned long pid;
> +
> + if (!s->multiprocess || (s->process_num == 1)) {
> + return 1;
> + }
> +
> + path = object_get_canonical_path(OBJECT(cpu));
> + cont = g_strrstr(path, "/" GDB_CPU_GROUP_NAME "[");
> +
> + if (cont == NULL) {
> + return 1;
> + }
> +
> + cont += strlen("/" GDB_CPU_GROUP_NAME "[");
> +
> + if (qemu_strtoul(cont, &left, 10, &pid)) {
> + return 1;
> + }
> +
> + return pid + 1;
> +}
> +
> static const char *get_feature_xml(const char *p, const char **newp,
> CPUClass *cc)
> {
> size_t len;
> int i;
> @@ -909,10 +936,23 @@ static CPUState *find_cpu(uint32_t thread_id)
> }
>
> return NULL;
> }
>
> +static char *gdb_fmt_thread_id(const GDBState *s, CPUState *cpu,
> + char *buf, size_t buf_size)
> +{
> + if (s->multiprocess) {
> + snprintf(buf, buf_size, "p%02x.%02x",
> + gdb_get_cpu_pid(s, cpu), cpu_gdb_index(cpu));
> + } else {
> + snprintf(buf, buf_size, "%02x", cpu_gdb_index(cpu));
> + }
> +
> + return buf;
> +}
> +
> static int is_query_packet(const char *p, const char *query, char separator)
> {
> unsigned int query_len = strlen(query);
>
> return strncmp(p, query, query_len) == 0 &&
> @@ -1020,22 +1060,23 @@ static int gdb_handle_packet(GDBState *s, const char
> *line_buf)
> const char *p;
> uint32_t thread;
> 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];
> uint8_t *registers;
> target_ulong addr, len;
>
> trace_gdbstub_io_command(line_buf);
>
> p = line_buf;
> ch = *p++;
> switch(ch) {
> case '?':
> /* TODO: Make this return the correct value for user-mode. */
> - snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
> - cpu_gdb_index(s->c_cpu));
> + snprintf(buf, sizeof(buf), "T%02xthread:%s;", GDB_SIGNAL_TRAP,
> + gdb_fmt_thread_id(s, s->c_cpu, thread_id,
> sizeof(thread_id)));
> put_packet(s, buf);
> /* Remove all the breakpoints when this query is issued,
> * because gdb is doing and initial connect and the state
> * should be cleaned up.
> */
>
- [Qemu-devel] [PATCH v2 04/15] gdbstub: add multiprocess support to vCont packets, (continued)
- [Qemu-devel] [PATCH v2 04/15] gdbstub: add multiprocess support to vCont packets, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 05/15] gdbstub: add multiprocess support to 'sC' packets, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 09/15] gdbstub: add multiprocess support to 'D' packets, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 06/15] gdbstub: add multiprocess support to (f|s)ThreadInfo and ThreadExtraInfo, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 08/15] gdbstub: add multiprocess support to gdb_vm_state_change(), Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 02/15] gdbstub: add multiprocess support to '?' packets, Luc Michel, 2018/10/01
- Re: [Qemu-devel] [PATCH v2 02/15] gdbstub: add multiprocess support to '?' packets,
Philippe Mathieu-Daudé <=
- [Qemu-devel] [PATCH v2 01/15] gdbstub: introduce GDB processes, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 07/15] gdbstub: add multiprocess support to Xfer:features:read:, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 14/15] gdbstub: add multiprocess extension support, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 11/15] gdbstub: add support for vAttach packets, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 13/15] gdbstub: gdb_set_stop_cpu: ignore request when process is not attached, Luc Michel, 2018/10/01
- [Qemu-devel] [PATCH v2 15/15] arm/xlnx-zynqmp: put APUs and RPUs in separate GDB groups, Luc Michel, 2018/10/01