qemu/gdbstub/gdbstub.c
<<
>>
Prefs
   1/*
   2 * gdb server stub
   3 *
   4 * This implements a subset of the remote protocol as described in:
   5 *
   6 *   https://sourceware.org/gdb/onlinedocs/gdb/Remote-Protocol.html
   7 *
   8 * Copyright (c) 2003-2005 Fabrice Bellard
   9 *
  10 * This library is free software; you can redistribute it and/or
  11 * modify it under the terms of the GNU Lesser General Public
  12 * License as published by the Free Software Foundation; either
  13 * version 2 of the License, or (at your option) any later version.
  14 *
  15 * This library is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  18 * Lesser General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU Lesser General Public
  21 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  22 *
  23 * SPDX-License-Identifier: LGPL-2.0+
  24 */
  25
  26#include "qemu/osdep.h"
  27#include "qemu/ctype.h"
  28#include "qemu/cutils.h"
  29#include "qemu/module.h"
  30#include "qemu/error-report.h"
  31#include "trace.h"
  32#include "exec/gdbstub.h"
  33#include "gdbstub/syscalls.h"
  34#ifdef CONFIG_USER_ONLY
  35#include "gdbstub/user.h"
  36#else
  37#include "hw/cpu/cluster.h"
  38#include "hw/boards.h"
  39#endif
  40
  41#include "sysemu/hw_accel.h"
  42#include "sysemu/runstate.h"
  43#include "exec/replay-core.h"
  44#include "exec/hwaddr.h"
  45
  46#include "internals.h"
  47
  48typedef struct GDBRegisterState {
  49    int base_reg;
  50    int num_regs;
  51    gdb_get_reg_cb get_reg;
  52    gdb_set_reg_cb set_reg;
  53    const char *xml;
  54    struct GDBRegisterState *next;
  55} GDBRegisterState;
  56
  57GDBState gdbserver_state;
  58
  59void gdb_init_gdbserver_state(void)
  60{
  61    g_assert(!gdbserver_state.init);
  62    memset(&gdbserver_state, 0, sizeof(GDBState));
  63    gdbserver_state.init = true;
  64    gdbserver_state.str_buf = g_string_new(NULL);
  65    gdbserver_state.mem_buf = g_byte_array_sized_new(MAX_PACKET_LENGTH);
  66    gdbserver_state.last_packet = g_byte_array_sized_new(MAX_PACKET_LENGTH + 4);
  67
  68    /*
  69     * What single-step modes are supported is accelerator dependent.
  70     * By default try to use no IRQs and no timers while single
  71     * stepping so as to make single stepping like a typical ICE HW step.
  72     */
  73    gdbserver_state.supported_sstep_flags = accel_supported_gdbstub_sstep_flags();
  74    gdbserver_state.sstep_flags = SSTEP_ENABLE | SSTEP_NOIRQ | SSTEP_NOTIMER;
  75    gdbserver_state.sstep_flags &= gdbserver_state.supported_sstep_flags;
  76}
  77
  78bool gdb_has_xml;
  79
  80/* writes 2*len+1 bytes in buf */
  81void gdb_memtohex(GString *buf, const uint8_t *mem, int len)
  82{
  83    int i, c;
  84    for(i = 0; i < len; i++) {
  85        c = mem[i];
  86        g_string_append_c(buf, tohex(c >> 4));
  87        g_string_append_c(buf, tohex(c & 0xf));
  88    }
  89    g_string_append_c(buf, '\0');
  90}
  91
  92void gdb_hextomem(GByteArray *mem, const char *buf, int len)
  93{
  94    int i;
  95
  96    for(i = 0; i < len; i++) {
  97        guint8 byte = fromhex(buf[0]) << 4 | fromhex(buf[1]);
  98        g_byte_array_append(mem, &byte, 1);
  99        buf += 2;
 100    }
 101}
 102
 103static void hexdump(const char *buf, int len,
 104                    void (*trace_fn)(size_t ofs, char const *text))
 105{
 106    char line_buffer[3 * 16 + 4 + 16 + 1];
 107
 108    size_t i;
 109    for (i = 0; i < len || (i & 0xF); ++i) {
 110        size_t byte_ofs = i & 15;
 111
 112        if (byte_ofs == 0) {
 113            memset(line_buffer, ' ', 3 * 16 + 4 + 16);
 114            line_buffer[3 * 16 + 4 + 16] = 0;
 115        }
 116
 117        size_t col_group = (i >> 2) & 3;
 118        size_t hex_col = byte_ofs * 3 + col_group;
 119        size_t txt_col = 3 * 16 + 4 + byte_ofs;
 120
 121        if (i < len) {
 122            char value = buf[i];
 123
 124            line_buffer[hex_col + 0] = tohex((value >> 4) & 0xF);
 125            line_buffer[hex_col + 1] = tohex((value >> 0) & 0xF);
 126            line_buffer[txt_col + 0] = (value >= ' ' && value < 127)
 127                    ? value
 128                    : '.';
 129        }
 130
 131        if (byte_ofs == 0xF)
 132            trace_fn(i & -16, line_buffer);
 133    }
 134}
 135
 136/* return -1 if error, 0 if OK */
 137int gdb_put_packet_binary(const char *buf, int len, bool dump)
 138{
 139    int csum, i;
 140    uint8_t footer[3];
 141
 142    if (dump && trace_event_get_state_backends(TRACE_GDBSTUB_IO_BINARYREPLY)) {
 143        hexdump(buf, len, trace_gdbstub_io_binaryreply);
 144    }
 145
 146    for(;;) {
 147        g_byte_array_set_size(gdbserver_state.last_packet, 0);
 148        g_byte_array_append(gdbserver_state.last_packet,
 149                            (const uint8_t *) "$", 1);
 150        g_byte_array_append(gdbserver_state.last_packet,
 151                            (const uint8_t *) buf, len);
 152        csum = 0;
 153        for(i = 0; i < len; i++) {
 154            csum += buf[i];
 155        }
 156        footer[0] = '#';
 157        footer[1] = tohex((csum >> 4) & 0xf);
 158        footer[2] = tohex((csum) & 0xf);
 159        g_byte_array_append(gdbserver_state.last_packet, footer, 3);
 160
 161        gdb_put_buffer(gdbserver_state.last_packet->data,
 162                   gdbserver_state.last_packet->len);
 163
 164        if (gdb_got_immediate_ack()) {
 165            break;
 166        }
 167    }
 168    return 0;
 169}
 170
 171/* return -1 if error, 0 if OK */
 172int gdb_put_packet(const char *buf)
 173{
 174    trace_gdbstub_io_reply(buf);
 175
 176    return gdb_put_packet_binary(buf, strlen(buf), false);
 177}
 178
 179void gdb_put_strbuf(void)
 180{
 181    gdb_put_packet(gdbserver_state.str_buf->str);
 182}
 183
 184/* Encode data using the encoding for 'x' packets.  */
 185void gdb_memtox(GString *buf, const char *mem, int len)
 186{
 187    char c;
 188
 189    while (len--) {
 190        c = *(mem++);
 191        switch (c) {
 192        case '#': case '$': case '*': case '}':
 193            g_string_append_c(buf, '}');
 194            g_string_append_c(buf, c ^ 0x20);
 195            break;
 196        default:
 197            g_string_append_c(buf, c);
 198            break;
 199        }
 200    }
 201}
 202
 203static uint32_t gdb_get_cpu_pid(CPUState *cpu)
 204{
 205    /* TODO: In user mode, we should use the task state PID */
 206    if (cpu->cluster_index == UNASSIGNED_CLUSTER_INDEX) {
 207        /* Return the default process' PID */
 208        int index = gdbserver_state.process_num - 1;
 209        return gdbserver_state.processes[index].pid;
 210    }
 211    return cpu->cluster_index + 1;
 212}
 213
 214static GDBProcess *gdb_get_process(uint32_t pid)
 215{
 216    int i;
 217
 218    if (!pid) {
 219        /* 0 means any process, we take the first one */
 220        return &gdbserver_state.processes[0];
 221    }
 222
 223    for (i = 0; i < gdbserver_state.process_num; i++) {
 224        if (gdbserver_state.processes[i].pid == pid) {
 225            return &gdbserver_state.processes[i];
 226        }
 227    }
 228
 229    return NULL;
 230}
 231
 232static GDBProcess *gdb_get_cpu_process(CPUState *cpu)
 233{
 234    return gdb_get_process(gdb_get_cpu_pid(cpu));
 235}
 236
 237static CPUState *find_cpu(uint32_t thread_id)
 238{
 239    CPUState *cpu;
 240
 241    CPU_FOREACH(cpu) {
 242        if (gdb_get_cpu_index(cpu) == thread_id) {
 243            return cpu;
 244        }
 245    }
 246
 247    return NULL;
 248}
 249
 250static CPUState *get_first_cpu_in_process(GDBProcess *process)
 251{
 252    CPUState *cpu;
 253
 254    CPU_FOREACH(cpu) {
 255        if (gdb_get_cpu_pid(cpu) == process->pid) {
 256            return cpu;
 257        }
 258    }
 259
 260    return NULL;
 261}
 262
 263static CPUState *gdb_next_cpu_in_process(CPUState *cpu)
 264{
 265    uint32_t pid = gdb_get_cpu_pid(cpu);
 266    cpu = CPU_NEXT(cpu);
 267
 268    while (cpu) {
 269        if (gdb_get_cpu_pid(cpu) == pid) {
 270            break;
 271        }
 272
 273        cpu = CPU_NEXT(cpu);
 274    }
 275
 276    return cpu;
 277}
 278
 279/* Return the cpu following @cpu, while ignoring unattached processes. */
 280static CPUState *gdb_next_attached_cpu(CPUState *cpu)
 281{
 282    cpu = CPU_NEXT(cpu);
 283
 284    while (cpu) {
 285        if (gdb_get_cpu_process(cpu)->attached) {
 286            break;
 287        }
 288
 289        cpu = CPU_NEXT(cpu);
 290    }
 291
 292    return cpu;
 293}
 294
 295/* Return the first attached cpu */
 296CPUState *gdb_first_attached_cpu(void)
 297{
 298    CPUState *cpu = first_cpu;
 299    GDBProcess *process = gdb_get_cpu_process(cpu);
 300
 301    if (!process->attached) {
 302        return gdb_next_attached_cpu(cpu);
 303    }
 304
 305    return cpu;
 306}
 307
 308static CPUState *gdb_get_cpu(uint32_t pid, uint32_t tid)
 309{
 310    GDBProcess *process;
 311    CPUState *cpu;
 312
 313    if (!pid && !tid) {
 314        /* 0 means any process/thread, we take the first attached one */
 315        return gdb_first_attached_cpu();
 316    } else if (pid && !tid) {
 317        /* any thread in a specific process */
 318        process = gdb_get_process(pid);
 319
 320        if (process == NULL) {
 321            return NULL;
 322        }
 323
 324        if (!process->attached) {
 325            return NULL;
 326        }
 327
 328        return get_first_cpu_in_process(process);
 329    } else {
 330        /* a specific thread */
 331        cpu = find_cpu(tid);
 332
 333        if (cpu == NULL) {
 334            return NULL;
 335        }
 336
 337        process = gdb_get_cpu_process(cpu);
 338
 339        if (pid && process->pid != pid) {
 340            return NULL;
 341        }
 342
 343        if (!process->attached) {
 344            return NULL;
 345        }
 346
 347        return cpu;
 348    }
 349}
 350
 351static const char *get_feature_xml(const char *p, const char **newp,
 352                                   GDBProcess *process)
 353{
 354    size_t len;
 355    int i;
 356    const char *name;
 357    CPUState *cpu = get_first_cpu_in_process(process);
 358    CPUClass *cc = CPU_GET_CLASS(cpu);
 359
 360    len = 0;
 361    while (p[len] && p[len] != ':')
 362        len++;
 363    *newp = p + len;
 364
 365    name = NULL;
 366    if (strncmp(p, "target.xml", len) == 0) {
 367        char *buf = process->target_xml;
 368        const size_t buf_sz = sizeof(process->target_xml);
 369
 370        /* Generate the XML description for this CPU.  */
 371        if (!buf[0]) {
 372            GDBRegisterState *r;
 373
 374            pstrcat(buf, buf_sz,
 375                    "<?xml version=\"1.0\"?>"
 376                    "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
 377                    "<target>");
 378            if (cc->gdb_arch_name) {
 379                gchar *arch = cc->gdb_arch_name(cpu);
 380                pstrcat(buf, buf_sz, "<architecture>");
 381                pstrcat(buf, buf_sz, arch);
 382                pstrcat(buf, buf_sz, "</architecture>");
 383                g_free(arch);
 384            }
 385            pstrcat(buf, buf_sz, "<xi:include href=\"");
 386            pstrcat(buf, buf_sz, cc->gdb_core_xml_file);
 387            pstrcat(buf, buf_sz, "\"/>");
 388            for (r = cpu->gdb_regs; r; r = r->next) {
 389                pstrcat(buf, buf_sz, "<xi:include href=\"");
 390                pstrcat(buf, buf_sz, r->xml);
 391                pstrcat(buf, buf_sz, "\"/>");
 392            }
 393            pstrcat(buf, buf_sz, "</target>");
 394        }
 395        return buf;
 396    }
 397    if (cc->gdb_get_dynamic_xml) {
 398        char *xmlname = g_strndup(p, len);
 399        const char *xml = cc->gdb_get_dynamic_xml(cpu, xmlname);
 400
 401        g_free(xmlname);
 402        if (xml) {
 403            return xml;
 404        }
 405    }
 406    for (i = 0; ; i++) {
 407        name = xml_builtin[i][0];
 408        if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
 409            break;
 410    }
 411    return name ? xml_builtin[i][1] : NULL;
 412}
 413
 414static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
 415{
 416    CPUClass *cc = CPU_GET_CLASS(cpu);
 417    CPUArchState *env = cpu->env_ptr;
 418    GDBRegisterState *r;
 419
 420    if (reg < cc->gdb_num_core_regs) {
 421        return cc->gdb_read_register(cpu, buf, reg);
 422    }
 423
 424    for (r = cpu->gdb_regs; r; r = r->next) {
 425        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
 426            return r->get_reg(env, buf, reg - r->base_reg);
 427        }
 428    }
 429    return 0;
 430}
 431
 432static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
 433{
 434    CPUClass *cc = CPU_GET_CLASS(cpu);
 435    CPUArchState *env = cpu->env_ptr;
 436    GDBRegisterState *r;
 437
 438    if (reg < cc->gdb_num_core_regs) {
 439        return cc->gdb_write_register(cpu, mem_buf, reg);
 440    }
 441
 442    for (r = cpu->gdb_regs; r; r = r->next) {
 443        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
 444            return r->set_reg(env, mem_buf, reg - r->base_reg);
 445        }
 446    }
 447    return 0;
 448}
 449
 450/* Register a supplemental set of CPU registers.  If g_pos is nonzero it
 451   specifies the first register number and these registers are included in
 452   a standard "g" packet.  Direction is relative to gdb, i.e. get_reg is
 453   gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
 454 */
 455
 456void gdb_register_coprocessor(CPUState *cpu,
 457                              gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
 458                              int num_regs, const char *xml, int g_pos)
 459{
 460    GDBRegisterState *s;
 461    GDBRegisterState **p;
 462
 463    p = &cpu->gdb_regs;
 464    while (*p) {
 465        /* Check for duplicates.  */
 466        if (strcmp((*p)->xml, xml) == 0)
 467            return;
 468        p = &(*p)->next;
 469    }
 470
 471    s = g_new0(GDBRegisterState, 1);
 472    s->base_reg = cpu->gdb_num_regs;
 473    s->num_regs = num_regs;
 474    s->get_reg = get_reg;
 475    s->set_reg = set_reg;
 476    s->xml = xml;
 477
 478    /* Add to end of list.  */
 479    cpu->gdb_num_regs += num_regs;
 480    *p = s;
 481    if (g_pos) {
 482        if (g_pos != s->base_reg) {
 483            error_report("Error: Bad gdb register numbering for '%s', "
 484                         "expected %d got %d", xml, g_pos, s->base_reg);
 485        } else {
 486            cpu->gdb_num_g_regs = cpu->gdb_num_regs;
 487        }
 488    }
 489}
 490
 491static void gdb_process_breakpoint_remove_all(GDBProcess *p)
 492{
 493    CPUState *cpu = get_first_cpu_in_process(p);
 494
 495    while (cpu) {
 496        gdb_breakpoint_remove_all(cpu);
 497        cpu = gdb_next_cpu_in_process(cpu);
 498    }
 499}
 500
 501
 502static void gdb_set_cpu_pc(vaddr pc)
 503{
 504    CPUState *cpu = gdbserver_state.c_cpu;
 505
 506    cpu_synchronize_state(cpu);
 507    cpu_set_pc(cpu, pc);
 508}
 509
 510void gdb_append_thread_id(CPUState *cpu, GString *buf)
 511{
 512    if (gdbserver_state.multiprocess) {
 513        g_string_append_printf(buf, "p%02x.%02x",
 514                               gdb_get_cpu_pid(cpu), gdb_get_cpu_index(cpu));
 515    } else {
 516        g_string_append_printf(buf, "%02x", gdb_get_cpu_index(cpu));
 517    }
 518}
 519
 520static GDBThreadIdKind read_thread_id(const char *buf, const char **end_buf,
 521                                      uint32_t *pid, uint32_t *tid)
 522{
 523    unsigned long p, t;
 524    int ret;
 525
 526    if (*buf == 'p') {
 527        buf++;
 528        ret = qemu_strtoul(buf, &buf, 16, &p);
 529
 530        if (ret) {
 531            return GDB_READ_THREAD_ERR;
 532        }
 533
 534        /* Skip '.' */
 535        buf++;
 536    } else {
 537        p = 1;
 538    }
 539
 540    ret = qemu_strtoul(buf, &buf, 16, &t);
 541
 542    if (ret) {
 543        return GDB_READ_THREAD_ERR;
 544    }
 545
 546    *end_buf = buf;
 547
 548    if (p == -1) {
 549        return GDB_ALL_PROCESSES;
 550    }
 551
 552    if (pid) {
 553        *pid = p;
 554    }
 555
 556    if (t == -1) {
 557        return GDB_ALL_THREADS;
 558    }
 559
 560    if (tid) {
 561        *tid = t;
 562    }
 563
 564    return GDB_ONE_THREAD;
 565}
 566
 567/**
 568 * gdb_handle_vcont - Parses and handles a vCont packet.
 569 * returns -ENOTSUP if a command is unsupported, -EINVAL or -ERANGE if there is
 570 *         a format error, 0 on success.
 571 */
 572static int gdb_handle_vcont(const char *p)
 573{
 574    int res, signal = 0;
 575    char cur_action;
 576    char *newstates;
 577    unsigned long tmp;
 578    uint32_t pid, tid;
 579    GDBProcess *process;
 580    CPUState *cpu;
 581    GDBThreadIdKind kind;
 582    unsigned int max_cpus = gdb_get_max_cpus();
 583    /* uninitialised CPUs stay 0 */
 584    newstates = g_new0(char, max_cpus);
 585
 586    /* mark valid CPUs with 1 */
 587    CPU_FOREACH(cpu) {
 588        newstates[cpu->cpu_index] = 1;
 589    }
 590
 591    /*
 592     * res keeps track of what error we are returning, with -ENOTSUP meaning
 593     * that the command is unknown or unsupported, thus returning an empty
 594     * packet, while -EINVAL and -ERANGE cause an E22 packet, due to invalid,
 595     *  or incorrect parameters passed.
 596     */
 597    res = 0;
 598    while (*p) {
 599        if (*p++ != ';') {
 600            res = -ENOTSUP;
 601            goto out;
 602        }
 603
 604        cur_action = *p++;
 605        if (cur_action == 'C' || cur_action == 'S') {
 606            cur_action = qemu_tolower(cur_action);
 607            res = qemu_strtoul(p, &p, 16, &tmp);
 608            if (res) {
 609                goto out;
 610            }
 611            signal = gdb_signal_to_target(tmp);
 612        } else if (cur_action != 'c' && cur_action != 's') {
 613            /* unknown/invalid/unsupported command */
 614            res = -ENOTSUP;
 615            goto out;
 616        }
 617
 618        if (*p == '\0' || *p == ';') {
 619            /*
 620             * No thread specifier, action is on "all threads". The
 621             * specification is unclear regarding the process to act on. We
 622             * choose all processes.
 623             */
 624            kind = GDB_ALL_PROCESSES;
 625        } else if (*p++ == ':') {
 626            kind = read_thread_id(p, &p, &pid, &tid);
 627        } else {
 628            res = -ENOTSUP;
 629            goto out;
 630        }
 631
 632        switch (kind) {
 633        case GDB_READ_THREAD_ERR:
 634            res = -EINVAL;
 635            goto out;
 636
 637        case GDB_ALL_PROCESSES:
 638            cpu = gdb_first_attached_cpu();
 639            while (cpu) {
 640                if (newstates[cpu->cpu_index] == 1) {
 641                    newstates[cpu->cpu_index] = cur_action;
 642                }
 643
 644                cpu = gdb_next_attached_cpu(cpu);
 645            }
 646            break;
 647
 648        case GDB_ALL_THREADS:
 649            process = gdb_get_process(pid);
 650
 651            if (!process->attached) {
 652                res = -EINVAL;
 653                goto out;
 654            }
 655
 656            cpu = get_first_cpu_in_process(process);
 657            while (cpu) {
 658                if (newstates[cpu->cpu_index] == 1) {
 659                    newstates[cpu->cpu_index] = cur_action;
 660                }
 661
 662                cpu = gdb_next_cpu_in_process(cpu);
 663            }
 664            break;
 665
 666        case GDB_ONE_THREAD:
 667            cpu = gdb_get_cpu(pid, tid);
 668
 669            /* invalid CPU/thread specified */
 670            if (!cpu) {
 671                res = -EINVAL;
 672                goto out;
 673            }
 674
 675            /* only use if no previous match occourred */
 676            if (newstates[cpu->cpu_index] == 1) {
 677                newstates[cpu->cpu_index] = cur_action;
 678            }
 679            break;
 680        }
 681    }
 682    gdbserver_state.signal = signal;
 683    gdb_continue_partial(newstates);
 684
 685out:
 686    g_free(newstates);
 687
 688    return res;
 689}
 690
 691static const char *cmd_next_param(const char *param, const char delimiter)
 692{
 693    static const char all_delimiters[] = ",;:=";
 694    char curr_delimiters[2] = {0};
 695    const char *delimiters;
 696
 697    if (delimiter == '?') {
 698        delimiters = all_delimiters;
 699    } else if (delimiter == '0') {
 700        return strchr(param, '\0');
 701    } else if (delimiter == '.' && *param) {
 702        return param + 1;
 703    } else {
 704        curr_delimiters[0] = delimiter;
 705        delimiters = curr_delimiters;
 706    }
 707
 708    param += strcspn(param, delimiters);
 709    if (*param) {
 710        param++;
 711    }
 712    return param;
 713}
 714
 715static int cmd_parse_params(const char *data, const char *schema,
 716                            GArray *params)
 717{
 718    const char *curr_schema, *curr_data;
 719
 720    g_assert(schema);
 721    g_assert(params->len == 0);
 722
 723    curr_schema = schema;
 724    curr_data = data;
 725    while (curr_schema[0] && curr_schema[1] && *curr_data) {
 726        GdbCmdVariant this_param;
 727
 728        switch (curr_schema[0]) {
 729        case 'l':
 730            if (qemu_strtoul(curr_data, &curr_data, 16,
 731                             &this_param.val_ul)) {
 732                return -EINVAL;
 733            }
 734            curr_data = cmd_next_param(curr_data, curr_schema[1]);
 735            g_array_append_val(params, this_param);
 736            break;
 737        case 'L':
 738            if (qemu_strtou64(curr_data, &curr_data, 16,
 739                              (uint64_t *)&this_param.val_ull)) {
 740                return -EINVAL;
 741            }
 742            curr_data = cmd_next_param(curr_data, curr_schema[1]);
 743            g_array_append_val(params, this_param);
 744            break;
 745        case 's':
 746            this_param.data = curr_data;
 747            curr_data = cmd_next_param(curr_data, curr_schema[1]);
 748            g_array_append_val(params, this_param);
 749            break;
 750        case 'o':
 751            this_param.opcode = *(uint8_t *)curr_data;
 752            curr_data = cmd_next_param(curr_data, curr_schema[1]);
 753            g_array_append_val(params, this_param);
 754            break;
 755        case 't':
 756            this_param.thread_id.kind =
 757                read_thread_id(curr_data, &curr_data,
 758                               &this_param.thread_id.pid,
 759                               &this_param.thread_id.tid);
 760            curr_data = cmd_next_param(curr_data, curr_schema[1]);
 761            g_array_append_val(params, this_param);
 762            break;
 763        case '?':
 764            curr_data = cmd_next_param(curr_data, curr_schema[1]);
 765            break;
 766        default:
 767            return -EINVAL;
 768        }
 769        curr_schema += 2;
 770    }
 771
 772    return 0;
 773}
 774
 775typedef void (*GdbCmdHandler)(GArray *params, void *user_ctx);
 776
 777/*
 778 * cmd_startswith -> cmd is compared using startswith
 779 *
 780 *
 781 * schema definitions:
 782 * Each schema parameter entry consists of 2 chars,
 783 * the first char represents the parameter type handling
 784 * the second char represents the delimiter for the next parameter
 785 *
 786 * Currently supported schema types:
 787 * 'l' -> unsigned long (stored in .val_ul)
 788 * 'L' -> unsigned long long (stored in .val_ull)
 789 * 's' -> string (stored in .data)
 790 * 'o' -> single char (stored in .opcode)
 791 * 't' -> thread id (stored in .thread_id)
 792 * '?' -> skip according to delimiter
 793 *
 794 * Currently supported delimiters:
 795 * '?' -> Stop at any delimiter (",;:=\0")
 796 * '0' -> Stop at "\0"
 797 * '.' -> Skip 1 char unless reached "\0"
 798 * Any other value is treated as the delimiter value itself
 799 */
 800typedef struct GdbCmdParseEntry {
 801    GdbCmdHandler handler;
 802    const char *cmd;
 803    bool cmd_startswith;
 804    const char *schema;
 805} GdbCmdParseEntry;
 806
 807static inline int startswith(const char *string, const char *pattern)
 808{
 809  return !strncmp(string, pattern, strlen(pattern));
 810}
 811
 812static int process_string_cmd(void *user_ctx, const char *data,
 813                              const GdbCmdParseEntry *cmds, int num_cmds)
 814{
 815    int i;
 816    g_autoptr(GArray) params = g_array_new(false, true, sizeof(GdbCmdVariant));
 817
 818    if (!cmds) {
 819        return -1;
 820    }
 821
 822    for (i = 0; i < num_cmds; i++) {
 823        const GdbCmdParseEntry *cmd = &cmds[i];
 824        g_assert(cmd->handler && cmd->cmd);
 825
 826        if ((cmd->cmd_startswith && !startswith(data, cmd->cmd)) ||
 827            (!cmd->cmd_startswith && strcmp(cmd->cmd, data))) {
 828            continue;
 829        }
 830
 831        if (cmd->schema) {
 832            if (cmd_parse_params(&data[strlen(cmd->cmd)],
 833                                 cmd->schema, params)) {
 834                return -1;
 835            }
 836        }
 837
 838        cmd->handler(params, user_ctx);
 839        return 0;
 840    }
 841
 842    return -1;
 843}
 844
 845static void run_cmd_parser(const char *data, const GdbCmdParseEntry *cmd)
 846{
 847    if (!data) {
 848        return;
 849    }
 850
 851    g_string_set_size(gdbserver_state.str_buf, 0);
 852    g_byte_array_set_size(gdbserver_state.mem_buf, 0);
 853
 854    /* In case there was an error during the command parsing we must
 855    * send a NULL packet to indicate the command is not supported */
 856    if (process_string_cmd(NULL, data, cmd, 1)) {
 857        gdb_put_packet("");
 858    }
 859}
 860
 861static void handle_detach(GArray *params, void *user_ctx)
 862{
 863    GDBProcess *process;
 864    uint32_t pid = 1;
 865
 866    if (gdbserver_state.multiprocess) {
 867        if (!params->len) {
 868            gdb_put_packet("E22");
 869            return;
 870        }
 871
 872        pid = get_param(params, 0)->val_ul;
 873    }
 874
 875    process = gdb_get_process(pid);
 876    gdb_process_breakpoint_remove_all(process);
 877    process->attached = false;
 878
 879    if (pid == gdb_get_cpu_pid(gdbserver_state.c_cpu)) {
 880        gdbserver_state.c_cpu = gdb_first_attached_cpu();
 881    }
 882
 883    if (pid == gdb_get_cpu_pid(gdbserver_state.g_cpu)) {
 884        gdbserver_state.g_cpu = gdb_first_attached_cpu();
 885    }
 886
 887    if (!gdbserver_state.c_cpu) {
 888        /* No more process attached */
 889        gdb_disable_syscalls();
 890        gdb_continue();
 891    }
 892    gdb_put_packet("OK");
 893}
 894
 895static void handle_thread_alive(GArray *params, void *user_ctx)
 896{
 897    CPUState *cpu;
 898
 899    if (!params->len) {
 900        gdb_put_packet("E22");
 901        return;
 902    }
 903
 904    if (get_param(params, 0)->thread_id.kind == GDB_READ_THREAD_ERR) {
 905        gdb_put_packet("E22");
 906        return;
 907    }
 908
 909    cpu = gdb_get_cpu(get_param(params, 0)->thread_id.pid,
 910                      get_param(params, 0)->thread_id.tid);
 911    if (!cpu) {
 912        gdb_put_packet("E22");
 913        return;
 914    }
 915
 916    gdb_put_packet("OK");
 917}
 918
 919static void handle_continue(GArray *params, void *user_ctx)
 920{
 921    if (params->len) {
 922        gdb_set_cpu_pc(get_param(params, 0)->val_ull);
 923    }
 924
 925    gdbserver_state.signal = 0;
 926    gdb_continue();
 927}
 928
 929static void handle_cont_with_sig(GArray *params, void *user_ctx)
 930{
 931    unsigned long signal = 0;
 932
 933    /*
 934     * Note: C sig;[addr] is currently unsupported and we simply
 935     *       omit the addr parameter
 936     */
 937    if (params->len) {
 938        signal = get_param(params, 0)->val_ul;
 939    }
 940
 941    gdbserver_state.signal = gdb_signal_to_target(signal);
 942    if (gdbserver_state.signal == -1) {
 943        gdbserver_state.signal = 0;
 944    }
 945    gdb_continue();
 946}
 947
 948static void handle_set_thread(GArray *params, void *user_ctx)
 949{
 950    CPUState *cpu;
 951
 952    if (params->len != 2) {
 953        gdb_put_packet("E22");
 954        return;
 955    }
 956
 957    if (get_param(params, 1)->thread_id.kind == GDB_READ_THREAD_ERR) {
 958        gdb_put_packet("E22");
 959        return;
 960    }
 961
 962    if (get_param(params, 1)->thread_id.kind != GDB_ONE_THREAD) {
 963        gdb_put_packet("OK");
 964        return;
 965    }
 966
 967    cpu = gdb_get_cpu(get_param(params, 1)->thread_id.pid,
 968                      get_param(params, 1)->thread_id.tid);
 969    if (!cpu) {
 970        gdb_put_packet("E22");
 971        return;
 972    }
 973
 974    /*
 975     * Note: This command is deprecated and modern gdb's will be using the
 976     *       vCont command instead.
 977     */
 978    switch (get_param(params, 0)->opcode) {
 979    case 'c':
 980        gdbserver_state.c_cpu = cpu;
 981        gdb_put_packet("OK");
 982        break;
 983    case 'g':
 984        gdbserver_state.g_cpu = cpu;
 985        gdb_put_packet("OK");
 986        break;
 987    default:
 988        gdb_put_packet("E22");
 989        break;
 990    }
 991}
 992
 993static void handle_insert_bp(GArray *params, void *user_ctx)
 994{
 995    int res;
 996
 997    if (params->len != 3) {
 998        gdb_put_packet("E22");
 999        return;
1000    }
1001
1002    res = gdb_breakpoint_insert(gdbserver_state.c_cpu,
1003                                get_param(params, 0)->val_ul,
1004                                get_param(params, 1)->val_ull,
1005                                get_param(params, 2)->val_ull);
1006    if (res >= 0) {
1007        gdb_put_packet("OK");
1008        return;
1009    } else if (res == -ENOSYS) {
1010        gdb_put_packet("");
1011        return;
1012    }
1013
1014    gdb_put_packet("E22");
1015}
1016
1017static void handle_remove_bp(GArray *params, void *user_ctx)
1018{
1019    int res;
1020
1021    if (params->len != 3) {
1022        gdb_put_packet("E22");
1023        return;
1024    }
1025
1026    res = gdb_breakpoint_remove(gdbserver_state.c_cpu,
1027                                get_param(params, 0)->val_ul,
1028                                get_param(params, 1)->val_ull,
1029                                get_param(params, 2)->val_ull);
1030    if (res >= 0) {
1031        gdb_put_packet("OK");
1032        return;
1033    } else if (res == -ENOSYS) {
1034        gdb_put_packet("");
1035        return;
1036    }
1037
1038    gdb_put_packet("E22");
1039}
1040
1041/*
1042 * handle_set/get_reg
1043 *
1044 * Older gdb are really dumb, and don't use 'G/g' if 'P/p' is available.
1045 * This works, but can be very slow. Anything new enough to understand
1046 * XML also knows how to use this properly. However to use this we
1047 * need to define a local XML file as well as be talking to a
1048 * reasonably modern gdb. Responding with an empty packet will cause
1049 * the remote gdb to fallback to older methods.
1050 */
1051
1052static void handle_set_reg(GArray *params, void *user_ctx)
1053{
1054    int reg_size;
1055
1056    if (!gdb_has_xml) {
1057        gdb_put_packet("");
1058        return;
1059    }
1060
1061    if (params->len != 2) {
1062        gdb_put_packet("E22");
1063        return;
1064    }
1065
1066    reg_size = strlen(get_param(params, 1)->data) / 2;
1067    gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 1)->data, reg_size);
1068    gdb_write_register(gdbserver_state.g_cpu, gdbserver_state.mem_buf->data,
1069                       get_param(params, 0)->val_ull);
1070    gdb_put_packet("OK");
1071}
1072
1073static void handle_get_reg(GArray *params, void *user_ctx)
1074{
1075    int reg_size;
1076
1077    if (!gdb_has_xml) {
1078        gdb_put_packet("");
1079        return;
1080    }
1081
1082    if (!params->len) {
1083        gdb_put_packet("E14");
1084        return;
1085    }
1086
1087    reg_size = gdb_read_register(gdbserver_state.g_cpu,
1088                                 gdbserver_state.mem_buf,
1089                                 get_param(params, 0)->val_ull);
1090    if (!reg_size) {
1091        gdb_put_packet("E14");
1092        return;
1093    } else {
1094        g_byte_array_set_size(gdbserver_state.mem_buf, reg_size);
1095    }
1096
1097    gdb_memtohex(gdbserver_state.str_buf,
1098                 gdbserver_state.mem_buf->data, reg_size);
1099    gdb_put_strbuf();
1100}
1101
1102static void handle_write_mem(GArray *params, void *user_ctx)
1103{
1104    if (params->len != 3) {
1105        gdb_put_packet("E22");
1106        return;
1107    }
1108
1109    /* gdb_hextomem() reads 2*len bytes */
1110    if (get_param(params, 1)->val_ull >
1111        strlen(get_param(params, 2)->data) / 2) {
1112        gdb_put_packet("E22");
1113        return;
1114    }
1115
1116    gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 2)->data,
1117                 get_param(params, 1)->val_ull);
1118    if (gdb_target_memory_rw_debug(gdbserver_state.g_cpu,
1119                                   get_param(params, 0)->val_ull,
1120                                   gdbserver_state.mem_buf->data,
1121                                   gdbserver_state.mem_buf->len, true)) {
1122        gdb_put_packet("E14");
1123        return;
1124    }
1125
1126    gdb_put_packet("OK");
1127}
1128
1129static void handle_read_mem(GArray *params, void *user_ctx)
1130{
1131    if (params->len != 2) {
1132        gdb_put_packet("E22");
1133        return;
1134    }
1135
1136    /* gdb_memtohex() doubles the required space */
1137    if (get_param(params, 1)->val_ull > MAX_PACKET_LENGTH / 2) {
1138        gdb_put_packet("E22");
1139        return;
1140    }
1141
1142    g_byte_array_set_size(gdbserver_state.mem_buf,
1143                          get_param(params, 1)->val_ull);
1144
1145    if (gdb_target_memory_rw_debug(gdbserver_state.g_cpu,
1146                                   get_param(params, 0)->val_ull,
1147                                   gdbserver_state.mem_buf->data,
1148                                   gdbserver_state.mem_buf->len, false)) {
1149        gdb_put_packet("E14");
1150        return;
1151    }
1152
1153    gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data,
1154             gdbserver_state.mem_buf->len);
1155    gdb_put_strbuf();
1156}
1157
1158static void handle_write_all_regs(GArray *params, void *user_ctx)
1159{
1160    int reg_id;
1161    size_t len;
1162    uint8_t *registers;
1163    int reg_size;
1164
1165    if (!params->len) {
1166        return;
1167    }
1168
1169    cpu_synchronize_state(gdbserver_state.g_cpu);
1170    len = strlen(get_param(params, 0)->data) / 2;
1171    gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 0)->data, len);
1172    registers = gdbserver_state.mem_buf->data;
1173    for (reg_id = 0;
1174         reg_id < gdbserver_state.g_cpu->gdb_num_g_regs && len > 0;
1175         reg_id++) {
1176        reg_size = gdb_write_register(gdbserver_state.g_cpu, registers, reg_id);
1177        len -= reg_size;
1178        registers += reg_size;
1179    }
1180    gdb_put_packet("OK");
1181}
1182
1183static void handle_read_all_regs(GArray *params, void *user_ctx)
1184{
1185    int reg_id;
1186    size_t len;
1187
1188    cpu_synchronize_state(gdbserver_state.g_cpu);
1189    g_byte_array_set_size(gdbserver_state.mem_buf, 0);
1190    len = 0;
1191    for (reg_id = 0; reg_id < gdbserver_state.g_cpu->gdb_num_g_regs; reg_id++) {
1192        len += gdb_read_register(gdbserver_state.g_cpu,
1193                                 gdbserver_state.mem_buf,
1194                                 reg_id);
1195    }
1196    g_assert(len == gdbserver_state.mem_buf->len);
1197
1198    gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, len);
1199    gdb_put_strbuf();
1200}
1201
1202
1203static void handle_step(GArray *params, void *user_ctx)
1204{
1205    if (params->len) {
1206        gdb_set_cpu_pc(get_param(params, 0)->val_ull);
1207    }
1208
1209    cpu_single_step(gdbserver_state.c_cpu, gdbserver_state.sstep_flags);
1210    gdb_continue();
1211}
1212
1213static void handle_backward(GArray *params, void *user_ctx)
1214{
1215    if (!gdb_can_reverse()) {
1216        gdb_put_packet("E22");
1217    }
1218    if (params->len == 1) {
1219        switch (get_param(params, 0)->opcode) {
1220        case 's':
1221            if (replay_reverse_step()) {
1222                gdb_continue();
1223            } else {
1224                gdb_put_packet("E14");
1225            }
1226            return;
1227        case 'c':
1228            if (replay_reverse_continue()) {
1229                gdb_continue();
1230            } else {
1231                gdb_put_packet("E14");
1232            }
1233            return;
1234        }
1235    }
1236
1237    /* Default invalid command */
1238    gdb_put_packet("");
1239}
1240
1241static void handle_v_cont_query(GArray *params, void *user_ctx)
1242{
1243    gdb_put_packet("vCont;c;C;s;S");
1244}
1245
1246static void handle_v_cont(GArray *params, void *user_ctx)
1247{
1248    int res;
1249
1250    if (!params->len) {
1251        return;
1252    }
1253
1254    res = gdb_handle_vcont(get_param(params, 0)->data);
1255    if ((res == -EINVAL) || (res == -ERANGE)) {
1256        gdb_put_packet("E22");
1257    } else if (res) {
1258        gdb_put_packet("");
1259    }
1260}
1261
1262static void handle_v_attach(GArray *params, void *user_ctx)
1263{
1264    GDBProcess *process;
1265    CPUState *cpu;
1266
1267    g_string_assign(gdbserver_state.str_buf, "E22");
1268    if (!params->len) {
1269        goto cleanup;
1270    }
1271
1272    process = gdb_get_process(get_param(params, 0)->val_ul);
1273    if (!process) {
1274        goto cleanup;
1275    }
1276
1277    cpu = get_first_cpu_in_process(process);
1278    if (!cpu) {
1279        goto cleanup;
1280    }
1281
1282    process->attached = true;
1283    gdbserver_state.g_cpu = cpu;
1284    gdbserver_state.c_cpu = cpu;
1285
1286    g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TRAP);
1287    gdb_append_thread_id(cpu, gdbserver_state.str_buf);
1288    g_string_append_c(gdbserver_state.str_buf, ';');
1289cleanup:
1290    gdb_put_strbuf();
1291}
1292
1293static void handle_v_kill(GArray *params, void *user_ctx)
1294{
1295    /* Kill the target */
1296    gdb_put_packet("OK");
1297    error_report("QEMU: Terminated via GDBstub");
1298    gdb_exit(0);
1299    exit(0);
1300}
1301
1302static const GdbCmdParseEntry gdb_v_commands_table[] = {
1303    /* Order is important if has same prefix */
1304    {
1305        .handler = handle_v_cont_query,
1306        .cmd = "Cont?",
1307        .cmd_startswith = 1
1308    },
1309    {
1310        .handler = handle_v_cont,
1311        .cmd = "Cont",
1312        .cmd_startswith = 1,
1313        .schema = "s0"
1314    },
1315    {
1316        .handler = handle_v_attach,
1317        .cmd = "Attach;",
1318        .cmd_startswith = 1,
1319        .schema = "l0"
1320    },
1321    {
1322        .handler = handle_v_kill,
1323        .cmd = "Kill;",
1324        .cmd_startswith = 1
1325    },
1326};
1327
1328static void handle_v_commands(GArray *params, void *user_ctx)
1329{
1330    if (!params->len) {
1331        return;
1332    }
1333
1334    if (process_string_cmd(NULL, get_param(params, 0)->data,
1335                           gdb_v_commands_table,
1336                           ARRAY_SIZE(gdb_v_commands_table))) {
1337        gdb_put_packet("");
1338    }
1339}
1340
1341static void handle_query_qemu_sstepbits(GArray *params, void *user_ctx)
1342{
1343    g_string_printf(gdbserver_state.str_buf, "ENABLE=%x", SSTEP_ENABLE);
1344
1345    if (gdbserver_state.supported_sstep_flags & SSTEP_NOIRQ) {
1346        g_string_append_printf(gdbserver_state.str_buf, ",NOIRQ=%x",
1347                               SSTEP_NOIRQ);
1348    }
1349
1350    if (gdbserver_state.supported_sstep_flags & SSTEP_NOTIMER) {
1351        g_string_append_printf(gdbserver_state.str_buf, ",NOTIMER=%x",
1352                               SSTEP_NOTIMER);
1353    }
1354
1355    gdb_put_strbuf();
1356}
1357
1358static void handle_set_qemu_sstep(GArray *params, void *user_ctx)
1359{
1360    int new_sstep_flags;
1361
1362    if (!params->len) {
1363        return;
1364    }
1365
1366    new_sstep_flags = get_param(params, 0)->val_ul;
1367
1368    if (new_sstep_flags  & ~gdbserver_state.supported_sstep_flags) {
1369        gdb_put_packet("E22");
1370        return;
1371    }
1372
1373    gdbserver_state.sstep_flags = new_sstep_flags;
1374    gdb_put_packet("OK");
1375}
1376
1377static void handle_query_qemu_sstep(GArray *params, void *user_ctx)
1378{
1379    g_string_printf(gdbserver_state.str_buf, "0x%x",
1380                    gdbserver_state.sstep_flags);
1381    gdb_put_strbuf();
1382}
1383
1384static void handle_query_curr_tid(GArray *params, void *user_ctx)
1385{
1386    CPUState *cpu;
1387    GDBProcess *process;
1388
1389    /*
1390     * "Current thread" remains vague in the spec, so always return
1391     * the first thread of the current process (gdb returns the
1392     * first thread).
1393     */
1394    process = gdb_get_cpu_process(gdbserver_state.g_cpu);
1395    cpu = get_first_cpu_in_process(process);
1396    g_string_assign(gdbserver_state.str_buf, "QC");
1397    gdb_append_thread_id(cpu, gdbserver_state.str_buf);
1398    gdb_put_strbuf();
1399}
1400
1401static void handle_query_threads(GArray *params, void *user_ctx)
1402{
1403    if (!gdbserver_state.query_cpu) {
1404        gdb_put_packet("l");
1405        return;
1406    }
1407
1408    g_string_assign(gdbserver_state.str_buf, "m");
1409    gdb_append_thread_id(gdbserver_state.query_cpu, gdbserver_state.str_buf);
1410    gdb_put_strbuf();
1411    gdbserver_state.query_cpu = gdb_next_attached_cpu(gdbserver_state.query_cpu);
1412}
1413
1414static void handle_query_first_threads(GArray *params, void *user_ctx)
1415{
1416    gdbserver_state.query_cpu = gdb_first_attached_cpu();
1417    handle_query_threads(params, user_ctx);
1418}
1419
1420static void handle_query_thread_extra(GArray *params, void *user_ctx)
1421{
1422    g_autoptr(GString) rs = g_string_new(NULL);
1423    CPUState *cpu;
1424
1425    if (!params->len ||
1426        get_param(params, 0)->thread_id.kind == GDB_READ_THREAD_ERR) {
1427        gdb_put_packet("E22");
1428        return;
1429    }
1430
1431    cpu = gdb_get_cpu(get_param(params, 0)->thread_id.pid,
1432                      get_param(params, 0)->thread_id.tid);
1433    if (!cpu) {
1434        return;
1435    }
1436
1437    cpu_synchronize_state(cpu);
1438
1439    if (gdbserver_state.multiprocess && (gdbserver_state.process_num > 1)) {
1440        /* Print the CPU model and name in multiprocess mode */
1441        ObjectClass *oc = object_get_class(OBJECT(cpu));
1442        const char *cpu_model = object_class_get_name(oc);
1443        const char *cpu_name =
1444            object_get_canonical_path_component(OBJECT(cpu));
1445        g_string_printf(rs, "%s %s [%s]", cpu_model, cpu_name,
1446                        cpu->halted ? "halted " : "running");
1447    } else {
1448        g_string_printf(rs, "CPU#%d [%s]", cpu->cpu_index,
1449                        cpu->halted ? "halted " : "running");
1450    }
1451    trace_gdbstub_op_extra_info(rs->str);
1452    gdb_memtohex(gdbserver_state.str_buf, (uint8_t *)rs->str, rs->len);
1453    gdb_put_strbuf();
1454}
1455
1456static void handle_query_supported(GArray *params, void *user_ctx)
1457{
1458    CPUClass *cc;
1459
1460    g_string_printf(gdbserver_state.str_buf, "PacketSize=%x", MAX_PACKET_LENGTH);
1461    cc = CPU_GET_CLASS(first_cpu);
1462    if (cc->gdb_core_xml_file) {
1463        g_string_append(gdbserver_state.str_buf, ";qXfer:features:read+");
1464    }
1465
1466    if (gdb_can_reverse()) {
1467        g_string_append(gdbserver_state.str_buf,
1468            ";ReverseStep+;ReverseContinue+");
1469    }
1470
1471#if defined(CONFIG_USER_ONLY) && defined(CONFIG_LINUX)
1472    if (gdbserver_state.c_cpu->opaque) {
1473        g_string_append(gdbserver_state.str_buf, ";qXfer:auxv:read+");
1474    }
1475#endif
1476
1477    if (params->len &&
1478        strstr(get_param(params, 0)->data, "multiprocess+")) {
1479        gdbserver_state.multiprocess = true;
1480    }
1481
1482    g_string_append(gdbserver_state.str_buf, ";vContSupported+;multiprocess+");
1483    gdb_put_strbuf();
1484}
1485
1486static void handle_query_xfer_features(GArray *params, void *user_ctx)
1487{
1488    GDBProcess *process;
1489    CPUClass *cc;
1490    unsigned long len, total_len, addr;
1491    const char *xml;
1492    const char *p;
1493
1494    if (params->len < 3) {
1495        gdb_put_packet("E22");
1496        return;
1497    }
1498
1499    process = gdb_get_cpu_process(gdbserver_state.g_cpu);
1500    cc = CPU_GET_CLASS(gdbserver_state.g_cpu);
1501    if (!cc->gdb_core_xml_file) {
1502        gdb_put_packet("");
1503        return;
1504    }
1505
1506    gdb_has_xml = true;
1507    p = get_param(params, 0)->data;
1508    xml = get_feature_xml(p, &p, process);
1509    if (!xml) {
1510        gdb_put_packet("E00");
1511        return;
1512    }
1513
1514    addr = get_param(params, 1)->val_ul;
1515    len = get_param(params, 2)->val_ul;
1516    total_len = strlen(xml);
1517    if (addr > total_len) {
1518        gdb_put_packet("E00");
1519        return;
1520    }
1521
1522    if (len > (MAX_PACKET_LENGTH - 5) / 2) {
1523        len = (MAX_PACKET_LENGTH - 5) / 2;
1524    }
1525
1526    if (len < total_len - addr) {
1527        g_string_assign(gdbserver_state.str_buf, "m");
1528        gdb_memtox(gdbserver_state.str_buf, xml + addr, len);
1529    } else {
1530        g_string_assign(gdbserver_state.str_buf, "l");
1531        gdb_memtox(gdbserver_state.str_buf, xml + addr, total_len - addr);
1532    }
1533
1534    gdb_put_packet_binary(gdbserver_state.str_buf->str,
1535                      gdbserver_state.str_buf->len, true);
1536}
1537
1538static void handle_query_qemu_supported(GArray *params, void *user_ctx)
1539{
1540    g_string_printf(gdbserver_state.str_buf, "sstepbits;sstep");
1541#ifndef CONFIG_USER_ONLY
1542    g_string_append(gdbserver_state.str_buf, ";PhyMemMode");
1543#endif
1544    gdb_put_strbuf();
1545}
1546
1547static const GdbCmdParseEntry gdb_gen_query_set_common_table[] = {
1548    /* Order is important if has same prefix */
1549    {
1550        .handler = handle_query_qemu_sstepbits,
1551        .cmd = "qemu.sstepbits",
1552    },
1553    {
1554        .handler = handle_query_qemu_sstep,
1555        .cmd = "qemu.sstep",
1556    },
1557    {
1558        .handler = handle_set_qemu_sstep,
1559        .cmd = "qemu.sstep=",
1560        .cmd_startswith = 1,
1561        .schema = "l0"
1562    },
1563};
1564
1565static const GdbCmdParseEntry gdb_gen_query_table[] = {
1566    {
1567        .handler = handle_query_curr_tid,
1568        .cmd = "C",
1569    },
1570    {
1571        .handler = handle_query_threads,
1572        .cmd = "sThreadInfo",
1573    },
1574    {
1575        .handler = handle_query_first_threads,
1576        .cmd = "fThreadInfo",
1577    },
1578    {
1579        .handler = handle_query_thread_extra,
1580        .cmd = "ThreadExtraInfo,",
1581        .cmd_startswith = 1,
1582        .schema = "t0"
1583    },
1584#ifdef CONFIG_USER_ONLY
1585    {
1586        .handler = gdb_handle_query_offsets,
1587        .cmd = "Offsets",
1588    },
1589#else
1590    {
1591        .handler = gdb_handle_query_rcmd,
1592        .cmd = "Rcmd,",
1593        .cmd_startswith = 1,
1594        .schema = "s0"
1595    },
1596#endif
1597    {
1598        .handler = handle_query_supported,
1599        .cmd = "Supported:",
1600        .cmd_startswith = 1,
1601        .schema = "s0"
1602    },
1603    {
1604        .handler = handle_query_supported,
1605        .cmd = "Supported",
1606        .schema = "s0"
1607    },
1608    {
1609        .handler = handle_query_xfer_features,
1610        .cmd = "Xfer:features:read:",
1611        .cmd_startswith = 1,
1612        .schema = "s:l,l0"
1613    },
1614#if defined(CONFIG_USER_ONLY) && defined(CONFIG_LINUX)
1615    {
1616        .handler = gdb_handle_query_xfer_auxv,
1617        .cmd = "Xfer:auxv:read::",
1618        .cmd_startswith = 1,
1619        .schema = "l,l0"
1620    },
1621#endif
1622    {
1623        .handler = gdb_handle_query_attached,
1624        .cmd = "Attached:",
1625        .cmd_startswith = 1
1626    },
1627    {
1628        .handler = gdb_handle_query_attached,
1629        .cmd = "Attached",
1630    },
1631    {
1632        .handler = handle_query_qemu_supported,
1633        .cmd = "qemu.Supported",
1634    },
1635#ifndef CONFIG_USER_ONLY
1636    {
1637        .handler = gdb_handle_query_qemu_phy_mem_mode,
1638        .cmd = "qemu.PhyMemMode",
1639    },
1640#endif
1641};
1642
1643static const GdbCmdParseEntry gdb_gen_set_table[] = {
1644    /* Order is important if has same prefix */
1645    {
1646        .handler = handle_set_qemu_sstep,
1647        .cmd = "qemu.sstep:",
1648        .cmd_startswith = 1,
1649        .schema = "l0"
1650    },
1651#ifndef CONFIG_USER_ONLY
1652    {
1653        .handler = gdb_handle_set_qemu_phy_mem_mode,
1654        .cmd = "qemu.PhyMemMode:",
1655        .cmd_startswith = 1,
1656        .schema = "l0"
1657    },
1658#endif
1659};
1660
1661static void handle_gen_query(GArray *params, void *user_ctx)
1662{
1663    if (!params->len) {
1664        return;
1665    }
1666
1667    if (!process_string_cmd(NULL, get_param(params, 0)->data,
1668                            gdb_gen_query_set_common_table,
1669                            ARRAY_SIZE(gdb_gen_query_set_common_table))) {
1670        return;
1671    }
1672
1673    if (process_string_cmd(NULL, get_param(params, 0)->data,
1674                           gdb_gen_query_table,
1675                           ARRAY_SIZE(gdb_gen_query_table))) {
1676        gdb_put_packet("");
1677    }
1678}
1679
1680static void handle_gen_set(GArray *params, void *user_ctx)
1681{
1682    if (!params->len) {
1683        return;
1684    }
1685
1686    if (!process_string_cmd(NULL, get_param(params, 0)->data,
1687                            gdb_gen_query_set_common_table,
1688                            ARRAY_SIZE(gdb_gen_query_set_common_table))) {
1689        return;
1690    }
1691
1692    if (process_string_cmd(NULL, get_param(params, 0)->data,
1693                           gdb_gen_set_table,
1694                           ARRAY_SIZE(gdb_gen_set_table))) {
1695        gdb_put_packet("");
1696    }
1697}
1698
1699static void handle_target_halt(GArray *params, void *user_ctx)
1700{
1701    g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TRAP);
1702    gdb_append_thread_id(gdbserver_state.c_cpu, gdbserver_state.str_buf);
1703    g_string_append_c(gdbserver_state.str_buf, ';');
1704    gdb_put_strbuf();
1705    /*
1706     * Remove all the breakpoints when this query is issued,
1707     * because gdb is doing an initial connect and the state
1708     * should be cleaned up.
1709     */
1710    gdb_breakpoint_remove_all(gdbserver_state.c_cpu);
1711}
1712
1713static int gdb_handle_packet(const char *line_buf)
1714{
1715    const GdbCmdParseEntry *cmd_parser = NULL;
1716
1717    trace_gdbstub_io_command(line_buf);
1718
1719    switch (line_buf[0]) {
1720    case '!':
1721        gdb_put_packet("OK");
1722        break;
1723    case '?':
1724        {
1725            static const GdbCmdParseEntry target_halted_cmd_desc = {
1726                .handler = handle_target_halt,
1727                .cmd = "?",
1728                .cmd_startswith = 1
1729            };
1730            cmd_parser = &target_halted_cmd_desc;
1731        }
1732        break;
1733    case 'c':
1734        {
1735            static const GdbCmdParseEntry continue_cmd_desc = {
1736                .handler = handle_continue,
1737                .cmd = "c",
1738                .cmd_startswith = 1,
1739                .schema = "L0"
1740            };
1741            cmd_parser = &continue_cmd_desc;
1742        }
1743        break;
1744    case 'C':
1745        {
1746            static const GdbCmdParseEntry cont_with_sig_cmd_desc = {
1747                .handler = handle_cont_with_sig,
1748                .cmd = "C",
1749                .cmd_startswith = 1,
1750                .schema = "l0"
1751            };
1752            cmd_parser = &cont_with_sig_cmd_desc;
1753        }
1754        break;
1755    case 'v':
1756        {
1757            static const GdbCmdParseEntry v_cmd_desc = {
1758                .handler = handle_v_commands,
1759                .cmd = "v",
1760                .cmd_startswith = 1,
1761                .schema = "s0"
1762            };
1763            cmd_parser = &v_cmd_desc;
1764        }
1765        break;
1766    case 'k':
1767        /* Kill the target */
1768        error_report("QEMU: Terminated via GDBstub");
1769        gdb_exit(0);
1770        exit(0);
1771    case 'D':
1772        {
1773            static const GdbCmdParseEntry detach_cmd_desc = {
1774                .handler = handle_detach,
1775                .cmd = "D",
1776                .cmd_startswith = 1,
1777                .schema = "?.l0"
1778            };
1779            cmd_parser = &detach_cmd_desc;
1780        }
1781        break;
1782    case 's':
1783        {
1784            static const GdbCmdParseEntry step_cmd_desc = {
1785                .handler = handle_step,
1786                .cmd = "s",
1787                .cmd_startswith = 1,
1788                .schema = "L0"
1789            };
1790            cmd_parser = &step_cmd_desc;
1791        }
1792        break;
1793    case 'b':
1794        {
1795            static const GdbCmdParseEntry backward_cmd_desc = {
1796                .handler = handle_backward,
1797                .cmd = "b",
1798                .cmd_startswith = 1,
1799                .schema = "o0"
1800            };
1801            cmd_parser = &backward_cmd_desc;
1802        }
1803        break;
1804    case 'F':
1805        {
1806            static const GdbCmdParseEntry file_io_cmd_desc = {
1807                .handler = gdb_handle_file_io,
1808                .cmd = "F",
1809                .cmd_startswith = 1,
1810                .schema = "L,L,o0"
1811            };
1812            cmd_parser = &file_io_cmd_desc;
1813        }
1814        break;
1815    case 'g':
1816        {
1817            static const GdbCmdParseEntry read_all_regs_cmd_desc = {
1818                .handler = handle_read_all_regs,
1819                .cmd = "g",
1820                .cmd_startswith = 1
1821            };
1822            cmd_parser = &read_all_regs_cmd_desc;
1823        }
1824        break;
1825    case 'G':
1826        {
1827            static const GdbCmdParseEntry write_all_regs_cmd_desc = {
1828                .handler = handle_write_all_regs,
1829                .cmd = "G",
1830                .cmd_startswith = 1,
1831                .schema = "s0"
1832            };
1833            cmd_parser = &write_all_regs_cmd_desc;
1834        }
1835        break;
1836    case 'm':
1837        {
1838            static const GdbCmdParseEntry read_mem_cmd_desc = {
1839                .handler = handle_read_mem,
1840                .cmd = "m",
1841                .cmd_startswith = 1,
1842                .schema = "L,L0"
1843            };
1844            cmd_parser = &read_mem_cmd_desc;
1845        }
1846        break;
1847    case 'M':
1848        {
1849            static const GdbCmdParseEntry write_mem_cmd_desc = {
1850                .handler = handle_write_mem,
1851                .cmd = "M",
1852                .cmd_startswith = 1,
1853                .schema = "L,L:s0"
1854            };
1855            cmd_parser = &write_mem_cmd_desc;
1856        }
1857        break;
1858    case 'p':
1859        {
1860            static const GdbCmdParseEntry get_reg_cmd_desc = {
1861                .handler = handle_get_reg,
1862                .cmd = "p",
1863                .cmd_startswith = 1,
1864                .schema = "L0"
1865            };
1866            cmd_parser = &get_reg_cmd_desc;
1867        }
1868        break;
1869    case 'P':
1870        {
1871            static const GdbCmdParseEntry set_reg_cmd_desc = {
1872                .handler = handle_set_reg,
1873                .cmd = "P",
1874                .cmd_startswith = 1,
1875                .schema = "L?s0"
1876            };
1877            cmd_parser = &set_reg_cmd_desc;
1878        }
1879        break;
1880    case 'Z':
1881        {
1882            static const GdbCmdParseEntry insert_bp_cmd_desc = {
1883                .handler = handle_insert_bp,
1884                .cmd = "Z",
1885                .cmd_startswith = 1,
1886                .schema = "l?L?L0"
1887            };
1888            cmd_parser = &insert_bp_cmd_desc;
1889        }
1890        break;
1891    case 'z':
1892        {
1893            static const GdbCmdParseEntry remove_bp_cmd_desc = {
1894                .handler = handle_remove_bp,
1895                .cmd = "z",
1896                .cmd_startswith = 1,
1897                .schema = "l?L?L0"
1898            };
1899            cmd_parser = &remove_bp_cmd_desc;
1900        }
1901        break;
1902    case 'H':
1903        {
1904            static const GdbCmdParseEntry set_thread_cmd_desc = {
1905                .handler = handle_set_thread,
1906                .cmd = "H",
1907                .cmd_startswith = 1,
1908                .schema = "o.t0"
1909            };
1910            cmd_parser = &set_thread_cmd_desc;
1911        }
1912        break;
1913    case 'T':
1914        {
1915            static const GdbCmdParseEntry thread_alive_cmd_desc = {
1916                .handler = handle_thread_alive,
1917                .cmd = "T",
1918                .cmd_startswith = 1,
1919                .schema = "t0"
1920            };
1921            cmd_parser = &thread_alive_cmd_desc;
1922        }
1923        break;
1924    case 'q':
1925        {
1926            static const GdbCmdParseEntry gen_query_cmd_desc = {
1927                .handler = handle_gen_query,
1928                .cmd = "q",
1929                .cmd_startswith = 1,
1930                .schema = "s0"
1931            };
1932            cmd_parser = &gen_query_cmd_desc;
1933        }
1934        break;
1935    case 'Q':
1936        {
1937            static const GdbCmdParseEntry gen_set_cmd_desc = {
1938                .handler = handle_gen_set,
1939                .cmd = "Q",
1940                .cmd_startswith = 1,
1941                .schema = "s0"
1942            };
1943            cmd_parser = &gen_set_cmd_desc;
1944        }
1945        break;
1946    default:
1947        /* put empty packet */
1948        gdb_put_packet("");
1949        break;
1950    }
1951
1952    if (cmd_parser) {
1953        run_cmd_parser(line_buf, cmd_parser);
1954    }
1955
1956    return RS_IDLE;
1957}
1958
1959void gdb_set_stop_cpu(CPUState *cpu)
1960{
1961    GDBProcess *p = gdb_get_cpu_process(cpu);
1962
1963    if (!p->attached) {
1964        /*
1965         * Having a stop CPU corresponding to a process that is not attached
1966         * confuses GDB. So we ignore the request.
1967         */
1968        return;
1969    }
1970
1971    gdbserver_state.c_cpu = cpu;
1972    gdbserver_state.g_cpu = cpu;
1973}
1974
1975void gdb_read_byte(uint8_t ch)
1976{
1977    uint8_t reply;
1978
1979#ifndef CONFIG_USER_ONLY
1980    if (gdbserver_state.last_packet->len) {
1981        /* Waiting for a response to the last packet.  If we see the start
1982           of a new command then abandon the previous response.  */
1983        if (ch == '-') {
1984            trace_gdbstub_err_got_nack();
1985            gdb_put_buffer(gdbserver_state.last_packet->data,
1986                       gdbserver_state.last_packet->len);
1987        } else if (ch == '+') {
1988            trace_gdbstub_io_got_ack();
1989        } else {
1990            trace_gdbstub_io_got_unexpected(ch);
1991        }
1992
1993        if (ch == '+' || ch == '$') {
1994            g_byte_array_set_size(gdbserver_state.last_packet, 0);
1995        }
1996        if (ch != '$')
1997            return;
1998    }
1999    if (runstate_is_running()) {
2000        /* when the CPU is running, we cannot do anything except stop
2001           it when receiving a char */
2002        vm_stop(RUN_STATE_PAUSED);
2003    } else
2004#endif
2005    {
2006        switch(gdbserver_state.state) {
2007        case RS_IDLE:
2008            if (ch == '$') {
2009                /* start of command packet */
2010                gdbserver_state.line_buf_index = 0;
2011                gdbserver_state.line_sum = 0;
2012                gdbserver_state.state = RS_GETLINE;
2013            } else {
2014                trace_gdbstub_err_garbage(ch);
2015            }
2016            break;
2017        case RS_GETLINE:
2018            if (ch == '}') {
2019                /* start escape sequence */
2020                gdbserver_state.state = RS_GETLINE_ESC;
2021                gdbserver_state.line_sum += ch;
2022            } else if (ch == '*') {
2023                /* start run length encoding sequence */
2024                gdbserver_state.state = RS_GETLINE_RLE;
2025                gdbserver_state.line_sum += ch;
2026            } else if (ch == '#') {
2027                /* end of command, start of checksum*/
2028                gdbserver_state.state = RS_CHKSUM1;
2029            } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) {
2030                trace_gdbstub_err_overrun();
2031                gdbserver_state.state = RS_IDLE;
2032            } else {
2033                /* unescaped command character */
2034                gdbserver_state.line_buf[gdbserver_state.line_buf_index++] = ch;
2035                gdbserver_state.line_sum += ch;
2036            }
2037            break;
2038        case RS_GETLINE_ESC:
2039            if (ch == '#') {
2040                /* unexpected end of command in escape sequence */
2041                gdbserver_state.state = RS_CHKSUM1;
2042            } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) {
2043                /* command buffer overrun */
2044                trace_gdbstub_err_overrun();
2045                gdbserver_state.state = RS_IDLE;
2046            } else {
2047                /* parse escaped character and leave escape state */
2048                gdbserver_state.line_buf[gdbserver_state.line_buf_index++] = ch ^ 0x20;
2049                gdbserver_state.line_sum += ch;
2050                gdbserver_state.state = RS_GETLINE;
2051            }
2052            break;
2053        case RS_GETLINE_RLE:
2054            /*
2055             * Run-length encoding is explained in "Debugging with GDB /
2056             * Appendix E GDB Remote Serial Protocol / Overview".
2057             */
2058            if (ch < ' ' || ch == '#' || ch == '$' || ch > 126) {
2059                /* invalid RLE count encoding */
2060                trace_gdbstub_err_invalid_repeat(ch);
2061                gdbserver_state.state = RS_GETLINE;
2062            } else {
2063                /* decode repeat length */
2064                int repeat = ch - ' ' + 3;
2065                if (gdbserver_state.line_buf_index + repeat >= sizeof(gdbserver_state.line_buf) - 1) {
2066                    /* that many repeats would overrun the command buffer */
2067                    trace_gdbstub_err_overrun();
2068                    gdbserver_state.state = RS_IDLE;
2069                } else if (gdbserver_state.line_buf_index < 1) {
2070                    /* got a repeat but we have nothing to repeat */
2071                    trace_gdbstub_err_invalid_rle();
2072                    gdbserver_state.state = RS_GETLINE;
2073                } else {
2074                    /* repeat the last character */
2075                    memset(gdbserver_state.line_buf + gdbserver_state.line_buf_index,
2076                           gdbserver_state.line_buf[gdbserver_state.line_buf_index - 1], repeat);
2077                    gdbserver_state.line_buf_index += repeat;
2078                    gdbserver_state.line_sum += ch;
2079                    gdbserver_state.state = RS_GETLINE;
2080                }
2081            }
2082            break;
2083        case RS_CHKSUM1:
2084            /* get high hex digit of checksum */
2085            if (!isxdigit(ch)) {
2086                trace_gdbstub_err_checksum_invalid(ch);
2087                gdbserver_state.state = RS_GETLINE;
2088                break;
2089            }
2090            gdbserver_state.line_buf[gdbserver_state.line_buf_index] = '\0';
2091            gdbserver_state.line_csum = fromhex(ch) << 4;
2092            gdbserver_state.state = RS_CHKSUM2;
2093            break;
2094        case RS_CHKSUM2:
2095            /* get low hex digit of checksum */
2096            if (!isxdigit(ch)) {
2097                trace_gdbstub_err_checksum_invalid(ch);
2098                gdbserver_state.state = RS_GETLINE;
2099                break;
2100            }
2101            gdbserver_state.line_csum |= fromhex(ch);
2102
2103            if (gdbserver_state.line_csum != (gdbserver_state.line_sum & 0xff)) {
2104                trace_gdbstub_err_checksum_incorrect(gdbserver_state.line_sum, gdbserver_state.line_csum);
2105                /* send NAK reply */
2106                reply = '-';
2107                gdb_put_buffer(&reply, 1);
2108                gdbserver_state.state = RS_IDLE;
2109            } else {
2110                /* send ACK reply */
2111                reply = '+';
2112                gdb_put_buffer(&reply, 1);
2113                gdbserver_state.state = gdb_handle_packet(gdbserver_state.line_buf);
2114            }
2115            break;
2116        default:
2117            abort();
2118        }
2119    }
2120}
2121
2122/*
2123 * Create the process that will contain all the "orphan" CPUs (that are not
2124 * part of a CPU cluster). Note that if this process contains no CPUs, it won't
2125 * be attachable and thus will be invisible to the user.
2126 */
2127void gdb_create_default_process(GDBState *s)
2128{
2129    GDBProcess *process;
2130    int max_pid = 0;
2131
2132    if (gdbserver_state.process_num) {
2133        max_pid = s->processes[s->process_num - 1].pid;
2134    }
2135
2136    s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
2137    process = &s->processes[s->process_num - 1];
2138
2139    /* We need an available PID slot for this process */
2140    assert(max_pid < UINT32_MAX);
2141
2142    process->pid = max_pid + 1;
2143    process->attached = false;
2144    process->target_xml[0] = '\0';
2145}
2146
2147