xref: /openbmc/qemu/gdbstub/gdbstub.c (revision cdd684b8)
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 
48 typedef 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 
57 GDBState gdbserver_state;
58 
59 void 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 
78 bool gdb_has_xml;
79 
80 /* writes 2*len+1 bytes in buf */
81 void 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 
92 void 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 
103 static 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 */
137 int 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 */
172 int 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 
179 void 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.  */
185 void 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 
203 static 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 
214 static 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 
232 static GDBProcess *gdb_get_cpu_process(CPUState *cpu)
233 {
234     return gdb_get_process(gdb_get_cpu_pid(cpu));
235 }
236 
237 static 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 
250 static 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 
263 static 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. */
280 static 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 */
296 CPUState *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 
308 static 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 
351 static 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 
414 static 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 
432 static 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 
456 void 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 
491 static 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 
502 static 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 
510 void 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 
520 static 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  */
572 static 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 
685 out:
686     g_free(newstates);
687 
688     return res;
689 }
690 
691 static 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 
715 static 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 
775 typedef void (*GdbCmdHandler)(GArray *params, void *user_ctx);
776 
777 /*
778  * cmd_startswith -> cmd is compared using startswith
779  *
780  * allow_stop_reply -> true iff the gdbstub can respond to this command with a
781  *   "stop reply" packet. The list of commands that accept such response is
782  *   defined at the GDB Remote Serial Protocol documentation. see:
783  *   https://sourceware.org/gdb/onlinedocs/gdb/Stop-Reply-Packets.html#Stop-Reply-Packets.
784  *
785  * schema definitions:
786  * Each schema parameter entry consists of 2 chars,
787  * the first char represents the parameter type handling
788  * the second char represents the delimiter for the next parameter
789  *
790  * Currently supported schema types:
791  * 'l' -> unsigned long (stored in .val_ul)
792  * 'L' -> unsigned long long (stored in .val_ull)
793  * 's' -> string (stored in .data)
794  * 'o' -> single char (stored in .opcode)
795  * 't' -> thread id (stored in .thread_id)
796  * '?' -> skip according to delimiter
797  *
798  * Currently supported delimiters:
799  * '?' -> Stop at any delimiter (",;:=\0")
800  * '0' -> Stop at "\0"
801  * '.' -> Skip 1 char unless reached "\0"
802  * Any other value is treated as the delimiter value itself
803  */
804 typedef struct GdbCmdParseEntry {
805     GdbCmdHandler handler;
806     const char *cmd;
807     bool cmd_startswith;
808     const char *schema;
809     bool allow_stop_reply;
810 } GdbCmdParseEntry;
811 
812 static inline int startswith(const char *string, const char *pattern)
813 {
814   return !strncmp(string, pattern, strlen(pattern));
815 }
816 
817 static int process_string_cmd(void *user_ctx, const char *data,
818                               const GdbCmdParseEntry *cmds, int num_cmds)
819 {
820     int i;
821     g_autoptr(GArray) params = g_array_new(false, true, sizeof(GdbCmdVariant));
822 
823     if (!cmds) {
824         return -1;
825     }
826 
827     for (i = 0; i < num_cmds; i++) {
828         const GdbCmdParseEntry *cmd = &cmds[i];
829         g_assert(cmd->handler && cmd->cmd);
830 
831         if ((cmd->cmd_startswith && !startswith(data, cmd->cmd)) ||
832             (!cmd->cmd_startswith && strcmp(cmd->cmd, data))) {
833             continue;
834         }
835 
836         if (cmd->schema) {
837             if (cmd_parse_params(&data[strlen(cmd->cmd)],
838                                  cmd->schema, params)) {
839                 return -1;
840             }
841         }
842 
843         gdbserver_state.allow_stop_reply = cmd->allow_stop_reply;
844         cmd->handler(params, user_ctx);
845         return 0;
846     }
847 
848     return -1;
849 }
850 
851 static void run_cmd_parser(const char *data, const GdbCmdParseEntry *cmd)
852 {
853     if (!data) {
854         return;
855     }
856 
857     g_string_set_size(gdbserver_state.str_buf, 0);
858     g_byte_array_set_size(gdbserver_state.mem_buf, 0);
859 
860     /* In case there was an error during the command parsing we must
861     * send a NULL packet to indicate the command is not supported */
862     if (process_string_cmd(NULL, data, cmd, 1)) {
863         gdb_put_packet("");
864     }
865 }
866 
867 static void handle_detach(GArray *params, void *user_ctx)
868 {
869     GDBProcess *process;
870     uint32_t pid = 1;
871 
872     if (gdbserver_state.multiprocess) {
873         if (!params->len) {
874             gdb_put_packet("E22");
875             return;
876         }
877 
878         pid = get_param(params, 0)->val_ul;
879     }
880 
881     process = gdb_get_process(pid);
882     gdb_process_breakpoint_remove_all(process);
883     process->attached = false;
884 
885     if (pid == gdb_get_cpu_pid(gdbserver_state.c_cpu)) {
886         gdbserver_state.c_cpu = gdb_first_attached_cpu();
887     }
888 
889     if (pid == gdb_get_cpu_pid(gdbserver_state.g_cpu)) {
890         gdbserver_state.g_cpu = gdb_first_attached_cpu();
891     }
892 
893     if (!gdbserver_state.c_cpu) {
894         /* No more process attached */
895         gdb_disable_syscalls();
896         gdb_continue();
897     }
898     gdb_put_packet("OK");
899 }
900 
901 static void handle_thread_alive(GArray *params, void *user_ctx)
902 {
903     CPUState *cpu;
904 
905     if (!params->len) {
906         gdb_put_packet("E22");
907         return;
908     }
909 
910     if (get_param(params, 0)->thread_id.kind == GDB_READ_THREAD_ERR) {
911         gdb_put_packet("E22");
912         return;
913     }
914 
915     cpu = gdb_get_cpu(get_param(params, 0)->thread_id.pid,
916                       get_param(params, 0)->thread_id.tid);
917     if (!cpu) {
918         gdb_put_packet("E22");
919         return;
920     }
921 
922     gdb_put_packet("OK");
923 }
924 
925 static void handle_continue(GArray *params, void *user_ctx)
926 {
927     if (params->len) {
928         gdb_set_cpu_pc(get_param(params, 0)->val_ull);
929     }
930 
931     gdbserver_state.signal = 0;
932     gdb_continue();
933 }
934 
935 static void handle_cont_with_sig(GArray *params, void *user_ctx)
936 {
937     unsigned long signal = 0;
938 
939     /*
940      * Note: C sig;[addr] is currently unsupported and we simply
941      *       omit the addr parameter
942      */
943     if (params->len) {
944         signal = get_param(params, 0)->val_ul;
945     }
946 
947     gdbserver_state.signal = gdb_signal_to_target(signal);
948     if (gdbserver_state.signal == -1) {
949         gdbserver_state.signal = 0;
950     }
951     gdb_continue();
952 }
953 
954 static void handle_set_thread(GArray *params, void *user_ctx)
955 {
956     CPUState *cpu;
957 
958     if (params->len != 2) {
959         gdb_put_packet("E22");
960         return;
961     }
962 
963     if (get_param(params, 1)->thread_id.kind == GDB_READ_THREAD_ERR) {
964         gdb_put_packet("E22");
965         return;
966     }
967 
968     if (get_param(params, 1)->thread_id.kind != GDB_ONE_THREAD) {
969         gdb_put_packet("OK");
970         return;
971     }
972 
973     cpu = gdb_get_cpu(get_param(params, 1)->thread_id.pid,
974                       get_param(params, 1)->thread_id.tid);
975     if (!cpu) {
976         gdb_put_packet("E22");
977         return;
978     }
979 
980     /*
981      * Note: This command is deprecated and modern gdb's will be using the
982      *       vCont command instead.
983      */
984     switch (get_param(params, 0)->opcode) {
985     case 'c':
986         gdbserver_state.c_cpu = cpu;
987         gdb_put_packet("OK");
988         break;
989     case 'g':
990         gdbserver_state.g_cpu = cpu;
991         gdb_put_packet("OK");
992         break;
993     default:
994         gdb_put_packet("E22");
995         break;
996     }
997 }
998 
999 static void handle_insert_bp(GArray *params, void *user_ctx)
1000 {
1001     int res;
1002 
1003     if (params->len != 3) {
1004         gdb_put_packet("E22");
1005         return;
1006     }
1007 
1008     res = gdb_breakpoint_insert(gdbserver_state.c_cpu,
1009                                 get_param(params, 0)->val_ul,
1010                                 get_param(params, 1)->val_ull,
1011                                 get_param(params, 2)->val_ull);
1012     if (res >= 0) {
1013         gdb_put_packet("OK");
1014         return;
1015     } else if (res == -ENOSYS) {
1016         gdb_put_packet("");
1017         return;
1018     }
1019 
1020     gdb_put_packet("E22");
1021 }
1022 
1023 static void handle_remove_bp(GArray *params, void *user_ctx)
1024 {
1025     int res;
1026 
1027     if (params->len != 3) {
1028         gdb_put_packet("E22");
1029         return;
1030     }
1031 
1032     res = gdb_breakpoint_remove(gdbserver_state.c_cpu,
1033                                 get_param(params, 0)->val_ul,
1034                                 get_param(params, 1)->val_ull,
1035                                 get_param(params, 2)->val_ull);
1036     if (res >= 0) {
1037         gdb_put_packet("OK");
1038         return;
1039     } else if (res == -ENOSYS) {
1040         gdb_put_packet("");
1041         return;
1042     }
1043 
1044     gdb_put_packet("E22");
1045 }
1046 
1047 /*
1048  * handle_set/get_reg
1049  *
1050  * Older gdb are really dumb, and don't use 'G/g' if 'P/p' is available.
1051  * This works, but can be very slow. Anything new enough to understand
1052  * XML also knows how to use this properly. However to use this we
1053  * need to define a local XML file as well as be talking to a
1054  * reasonably modern gdb. Responding with an empty packet will cause
1055  * the remote gdb to fallback to older methods.
1056  */
1057 
1058 static void handle_set_reg(GArray *params, void *user_ctx)
1059 {
1060     int reg_size;
1061 
1062     if (!gdb_has_xml) {
1063         gdb_put_packet("");
1064         return;
1065     }
1066 
1067     if (params->len != 2) {
1068         gdb_put_packet("E22");
1069         return;
1070     }
1071 
1072     reg_size = strlen(get_param(params, 1)->data) / 2;
1073     gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 1)->data, reg_size);
1074     gdb_write_register(gdbserver_state.g_cpu, gdbserver_state.mem_buf->data,
1075                        get_param(params, 0)->val_ull);
1076     gdb_put_packet("OK");
1077 }
1078 
1079 static void handle_get_reg(GArray *params, void *user_ctx)
1080 {
1081     int reg_size;
1082 
1083     if (!gdb_has_xml) {
1084         gdb_put_packet("");
1085         return;
1086     }
1087 
1088     if (!params->len) {
1089         gdb_put_packet("E14");
1090         return;
1091     }
1092 
1093     reg_size = gdb_read_register(gdbserver_state.g_cpu,
1094                                  gdbserver_state.mem_buf,
1095                                  get_param(params, 0)->val_ull);
1096     if (!reg_size) {
1097         gdb_put_packet("E14");
1098         return;
1099     } else {
1100         g_byte_array_set_size(gdbserver_state.mem_buf, reg_size);
1101     }
1102 
1103     gdb_memtohex(gdbserver_state.str_buf,
1104                  gdbserver_state.mem_buf->data, reg_size);
1105     gdb_put_strbuf();
1106 }
1107 
1108 static void handle_write_mem(GArray *params, void *user_ctx)
1109 {
1110     if (params->len != 3) {
1111         gdb_put_packet("E22");
1112         return;
1113     }
1114 
1115     /* gdb_hextomem() reads 2*len bytes */
1116     if (get_param(params, 1)->val_ull >
1117         strlen(get_param(params, 2)->data) / 2) {
1118         gdb_put_packet("E22");
1119         return;
1120     }
1121 
1122     gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 2)->data,
1123                  get_param(params, 1)->val_ull);
1124     if (gdb_target_memory_rw_debug(gdbserver_state.g_cpu,
1125                                    get_param(params, 0)->val_ull,
1126                                    gdbserver_state.mem_buf->data,
1127                                    gdbserver_state.mem_buf->len, true)) {
1128         gdb_put_packet("E14");
1129         return;
1130     }
1131 
1132     gdb_put_packet("OK");
1133 }
1134 
1135 static void handle_read_mem(GArray *params, void *user_ctx)
1136 {
1137     if (params->len != 2) {
1138         gdb_put_packet("E22");
1139         return;
1140     }
1141 
1142     /* gdb_memtohex() doubles the required space */
1143     if (get_param(params, 1)->val_ull > MAX_PACKET_LENGTH / 2) {
1144         gdb_put_packet("E22");
1145         return;
1146     }
1147 
1148     g_byte_array_set_size(gdbserver_state.mem_buf,
1149                           get_param(params, 1)->val_ull);
1150 
1151     if (gdb_target_memory_rw_debug(gdbserver_state.g_cpu,
1152                                    get_param(params, 0)->val_ull,
1153                                    gdbserver_state.mem_buf->data,
1154                                    gdbserver_state.mem_buf->len, false)) {
1155         gdb_put_packet("E14");
1156         return;
1157     }
1158 
1159     gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data,
1160              gdbserver_state.mem_buf->len);
1161     gdb_put_strbuf();
1162 }
1163 
1164 static void handle_write_all_regs(GArray *params, void *user_ctx)
1165 {
1166     int reg_id;
1167     size_t len;
1168     uint8_t *registers;
1169     int reg_size;
1170 
1171     if (!params->len) {
1172         return;
1173     }
1174 
1175     cpu_synchronize_state(gdbserver_state.g_cpu);
1176     len = strlen(get_param(params, 0)->data) / 2;
1177     gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 0)->data, len);
1178     registers = gdbserver_state.mem_buf->data;
1179     for (reg_id = 0;
1180          reg_id < gdbserver_state.g_cpu->gdb_num_g_regs && len > 0;
1181          reg_id++) {
1182         reg_size = gdb_write_register(gdbserver_state.g_cpu, registers, reg_id);
1183         len -= reg_size;
1184         registers += reg_size;
1185     }
1186     gdb_put_packet("OK");
1187 }
1188 
1189 static void handle_read_all_regs(GArray *params, void *user_ctx)
1190 {
1191     int reg_id;
1192     size_t len;
1193 
1194     cpu_synchronize_state(gdbserver_state.g_cpu);
1195     g_byte_array_set_size(gdbserver_state.mem_buf, 0);
1196     len = 0;
1197     for (reg_id = 0; reg_id < gdbserver_state.g_cpu->gdb_num_g_regs; reg_id++) {
1198         len += gdb_read_register(gdbserver_state.g_cpu,
1199                                  gdbserver_state.mem_buf,
1200                                  reg_id);
1201     }
1202     g_assert(len == gdbserver_state.mem_buf->len);
1203 
1204     gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, len);
1205     gdb_put_strbuf();
1206 }
1207 
1208 
1209 static void handle_step(GArray *params, void *user_ctx)
1210 {
1211     if (params->len) {
1212         gdb_set_cpu_pc(get_param(params, 0)->val_ull);
1213     }
1214 
1215     cpu_single_step(gdbserver_state.c_cpu, gdbserver_state.sstep_flags);
1216     gdb_continue();
1217 }
1218 
1219 static void handle_backward(GArray *params, void *user_ctx)
1220 {
1221     if (!gdb_can_reverse()) {
1222         gdb_put_packet("E22");
1223     }
1224     if (params->len == 1) {
1225         switch (get_param(params, 0)->opcode) {
1226         case 's':
1227             if (replay_reverse_step()) {
1228                 gdb_continue();
1229             } else {
1230                 gdb_put_packet("E14");
1231             }
1232             return;
1233         case 'c':
1234             if (replay_reverse_continue()) {
1235                 gdb_continue();
1236             } else {
1237                 gdb_put_packet("E14");
1238             }
1239             return;
1240         }
1241     }
1242 
1243     /* Default invalid command */
1244     gdb_put_packet("");
1245 }
1246 
1247 static void handle_v_cont_query(GArray *params, void *user_ctx)
1248 {
1249     gdb_put_packet("vCont;c;C;s;S");
1250 }
1251 
1252 static void handle_v_cont(GArray *params, void *user_ctx)
1253 {
1254     int res;
1255 
1256     if (!params->len) {
1257         return;
1258     }
1259 
1260     res = gdb_handle_vcont(get_param(params, 0)->data);
1261     if ((res == -EINVAL) || (res == -ERANGE)) {
1262         gdb_put_packet("E22");
1263     } else if (res) {
1264         gdb_put_packet("");
1265     }
1266 }
1267 
1268 static void handle_v_attach(GArray *params, void *user_ctx)
1269 {
1270     GDBProcess *process;
1271     CPUState *cpu;
1272 
1273     g_string_assign(gdbserver_state.str_buf, "E22");
1274     if (!params->len) {
1275         goto cleanup;
1276     }
1277 
1278     process = gdb_get_process(get_param(params, 0)->val_ul);
1279     if (!process) {
1280         goto cleanup;
1281     }
1282 
1283     cpu = get_first_cpu_in_process(process);
1284     if (!cpu) {
1285         goto cleanup;
1286     }
1287 
1288     process->attached = true;
1289     gdbserver_state.g_cpu = cpu;
1290     gdbserver_state.c_cpu = cpu;
1291 
1292     if (gdbserver_state.allow_stop_reply) {
1293         g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TRAP);
1294         gdb_append_thread_id(cpu, gdbserver_state.str_buf);
1295         g_string_append_c(gdbserver_state.str_buf, ';');
1296         gdbserver_state.allow_stop_reply = false;
1297 cleanup:
1298         gdb_put_strbuf();
1299     }
1300 }
1301 
1302 static void handle_v_kill(GArray *params, void *user_ctx)
1303 {
1304     /* Kill the target */
1305     gdb_put_packet("OK");
1306     error_report("QEMU: Terminated via GDBstub");
1307     gdb_exit(0);
1308     exit(0);
1309 }
1310 
1311 static const GdbCmdParseEntry gdb_v_commands_table[] = {
1312     /* Order is important if has same prefix */
1313     {
1314         .handler = handle_v_cont_query,
1315         .cmd = "Cont?",
1316         .cmd_startswith = 1
1317     },
1318     {
1319         .handler = handle_v_cont,
1320         .cmd = "Cont",
1321         .cmd_startswith = 1,
1322         .allow_stop_reply = true,
1323         .schema = "s0"
1324     },
1325     {
1326         .handler = handle_v_attach,
1327         .cmd = "Attach;",
1328         .cmd_startswith = 1,
1329         .allow_stop_reply = true,
1330         .schema = "l0"
1331     },
1332     {
1333         .handler = handle_v_kill,
1334         .cmd = "Kill;",
1335         .cmd_startswith = 1
1336     },
1337 };
1338 
1339 static void handle_v_commands(GArray *params, void *user_ctx)
1340 {
1341     if (!params->len) {
1342         return;
1343     }
1344 
1345     if (process_string_cmd(NULL, get_param(params, 0)->data,
1346                            gdb_v_commands_table,
1347                            ARRAY_SIZE(gdb_v_commands_table))) {
1348         gdb_put_packet("");
1349     }
1350 }
1351 
1352 static void handle_query_qemu_sstepbits(GArray *params, void *user_ctx)
1353 {
1354     g_string_printf(gdbserver_state.str_buf, "ENABLE=%x", SSTEP_ENABLE);
1355 
1356     if (gdbserver_state.supported_sstep_flags & SSTEP_NOIRQ) {
1357         g_string_append_printf(gdbserver_state.str_buf, ",NOIRQ=%x",
1358                                SSTEP_NOIRQ);
1359     }
1360 
1361     if (gdbserver_state.supported_sstep_flags & SSTEP_NOTIMER) {
1362         g_string_append_printf(gdbserver_state.str_buf, ",NOTIMER=%x",
1363                                SSTEP_NOTIMER);
1364     }
1365 
1366     gdb_put_strbuf();
1367 }
1368 
1369 static void handle_set_qemu_sstep(GArray *params, void *user_ctx)
1370 {
1371     int new_sstep_flags;
1372 
1373     if (!params->len) {
1374         return;
1375     }
1376 
1377     new_sstep_flags = get_param(params, 0)->val_ul;
1378 
1379     if (new_sstep_flags  & ~gdbserver_state.supported_sstep_flags) {
1380         gdb_put_packet("E22");
1381         return;
1382     }
1383 
1384     gdbserver_state.sstep_flags = new_sstep_flags;
1385     gdb_put_packet("OK");
1386 }
1387 
1388 static void handle_query_qemu_sstep(GArray *params, void *user_ctx)
1389 {
1390     g_string_printf(gdbserver_state.str_buf, "0x%x",
1391                     gdbserver_state.sstep_flags);
1392     gdb_put_strbuf();
1393 }
1394 
1395 static void handle_query_curr_tid(GArray *params, void *user_ctx)
1396 {
1397     CPUState *cpu;
1398     GDBProcess *process;
1399 
1400     /*
1401      * "Current thread" remains vague in the spec, so always return
1402      * the first thread of the current process (gdb returns the
1403      * first thread).
1404      */
1405     process = gdb_get_cpu_process(gdbserver_state.g_cpu);
1406     cpu = get_first_cpu_in_process(process);
1407     g_string_assign(gdbserver_state.str_buf, "QC");
1408     gdb_append_thread_id(cpu, gdbserver_state.str_buf);
1409     gdb_put_strbuf();
1410 }
1411 
1412 static void handle_query_threads(GArray *params, void *user_ctx)
1413 {
1414     if (!gdbserver_state.query_cpu) {
1415         gdb_put_packet("l");
1416         return;
1417     }
1418 
1419     g_string_assign(gdbserver_state.str_buf, "m");
1420     gdb_append_thread_id(gdbserver_state.query_cpu, gdbserver_state.str_buf);
1421     gdb_put_strbuf();
1422     gdbserver_state.query_cpu = gdb_next_attached_cpu(gdbserver_state.query_cpu);
1423 }
1424 
1425 static void handle_query_first_threads(GArray *params, void *user_ctx)
1426 {
1427     gdbserver_state.query_cpu = gdb_first_attached_cpu();
1428     handle_query_threads(params, user_ctx);
1429 }
1430 
1431 static void handle_query_thread_extra(GArray *params, void *user_ctx)
1432 {
1433     g_autoptr(GString) rs = g_string_new(NULL);
1434     CPUState *cpu;
1435 
1436     if (!params->len ||
1437         get_param(params, 0)->thread_id.kind == GDB_READ_THREAD_ERR) {
1438         gdb_put_packet("E22");
1439         return;
1440     }
1441 
1442     cpu = gdb_get_cpu(get_param(params, 0)->thread_id.pid,
1443                       get_param(params, 0)->thread_id.tid);
1444     if (!cpu) {
1445         return;
1446     }
1447 
1448     cpu_synchronize_state(cpu);
1449 
1450     if (gdbserver_state.multiprocess && (gdbserver_state.process_num > 1)) {
1451         /* Print the CPU model and name in multiprocess mode */
1452         ObjectClass *oc = object_get_class(OBJECT(cpu));
1453         const char *cpu_model = object_class_get_name(oc);
1454         const char *cpu_name =
1455             object_get_canonical_path_component(OBJECT(cpu));
1456         g_string_printf(rs, "%s %s [%s]", cpu_model, cpu_name,
1457                         cpu->halted ? "halted " : "running");
1458     } else {
1459         g_string_printf(rs, "CPU#%d [%s]", cpu->cpu_index,
1460                         cpu->halted ? "halted " : "running");
1461     }
1462     trace_gdbstub_op_extra_info(rs->str);
1463     gdb_memtohex(gdbserver_state.str_buf, (uint8_t *)rs->str, rs->len);
1464     gdb_put_strbuf();
1465 }
1466 
1467 static void handle_query_supported(GArray *params, void *user_ctx)
1468 {
1469     CPUClass *cc;
1470 
1471     g_string_printf(gdbserver_state.str_buf, "PacketSize=%x", MAX_PACKET_LENGTH);
1472     cc = CPU_GET_CLASS(first_cpu);
1473     if (cc->gdb_core_xml_file) {
1474         g_string_append(gdbserver_state.str_buf, ";qXfer:features:read+");
1475     }
1476 
1477     if (gdb_can_reverse()) {
1478         g_string_append(gdbserver_state.str_buf,
1479             ";ReverseStep+;ReverseContinue+");
1480     }
1481 
1482 #if defined(CONFIG_USER_ONLY) && defined(CONFIG_LINUX)
1483     if (gdbserver_state.c_cpu->opaque) {
1484         g_string_append(gdbserver_state.str_buf, ";qXfer:auxv:read+");
1485     }
1486 #endif
1487 
1488     if (params->len &&
1489         strstr(get_param(params, 0)->data, "multiprocess+")) {
1490         gdbserver_state.multiprocess = true;
1491     }
1492 
1493     g_string_append(gdbserver_state.str_buf, ";vContSupported+;multiprocess+");
1494     gdb_put_strbuf();
1495 }
1496 
1497 static void handle_query_xfer_features(GArray *params, void *user_ctx)
1498 {
1499     GDBProcess *process;
1500     CPUClass *cc;
1501     unsigned long len, total_len, addr;
1502     const char *xml;
1503     const char *p;
1504 
1505     if (params->len < 3) {
1506         gdb_put_packet("E22");
1507         return;
1508     }
1509 
1510     process = gdb_get_cpu_process(gdbserver_state.g_cpu);
1511     cc = CPU_GET_CLASS(gdbserver_state.g_cpu);
1512     if (!cc->gdb_core_xml_file) {
1513         gdb_put_packet("");
1514         return;
1515     }
1516 
1517     gdb_has_xml = true;
1518     p = get_param(params, 0)->data;
1519     xml = get_feature_xml(p, &p, process);
1520     if (!xml) {
1521         gdb_put_packet("E00");
1522         return;
1523     }
1524 
1525     addr = get_param(params, 1)->val_ul;
1526     len = get_param(params, 2)->val_ul;
1527     total_len = strlen(xml);
1528     if (addr > total_len) {
1529         gdb_put_packet("E00");
1530         return;
1531     }
1532 
1533     if (len > (MAX_PACKET_LENGTH - 5) / 2) {
1534         len = (MAX_PACKET_LENGTH - 5) / 2;
1535     }
1536 
1537     if (len < total_len - addr) {
1538         g_string_assign(gdbserver_state.str_buf, "m");
1539         gdb_memtox(gdbserver_state.str_buf, xml + addr, len);
1540     } else {
1541         g_string_assign(gdbserver_state.str_buf, "l");
1542         gdb_memtox(gdbserver_state.str_buf, xml + addr, total_len - addr);
1543     }
1544 
1545     gdb_put_packet_binary(gdbserver_state.str_buf->str,
1546                       gdbserver_state.str_buf->len, true);
1547 }
1548 
1549 static void handle_query_qemu_supported(GArray *params, void *user_ctx)
1550 {
1551     g_string_printf(gdbserver_state.str_buf, "sstepbits;sstep");
1552 #ifndef CONFIG_USER_ONLY
1553     g_string_append(gdbserver_state.str_buf, ";PhyMemMode");
1554 #endif
1555     gdb_put_strbuf();
1556 }
1557 
1558 static const GdbCmdParseEntry gdb_gen_query_set_common_table[] = {
1559     /* Order is important if has same prefix */
1560     {
1561         .handler = handle_query_qemu_sstepbits,
1562         .cmd = "qemu.sstepbits",
1563     },
1564     {
1565         .handler = handle_query_qemu_sstep,
1566         .cmd = "qemu.sstep",
1567     },
1568     {
1569         .handler = handle_set_qemu_sstep,
1570         .cmd = "qemu.sstep=",
1571         .cmd_startswith = 1,
1572         .schema = "l0"
1573     },
1574 };
1575 
1576 static const GdbCmdParseEntry gdb_gen_query_table[] = {
1577     {
1578         .handler = handle_query_curr_tid,
1579         .cmd = "C",
1580     },
1581     {
1582         .handler = handle_query_threads,
1583         .cmd = "sThreadInfo",
1584     },
1585     {
1586         .handler = handle_query_first_threads,
1587         .cmd = "fThreadInfo",
1588     },
1589     {
1590         .handler = handle_query_thread_extra,
1591         .cmd = "ThreadExtraInfo,",
1592         .cmd_startswith = 1,
1593         .schema = "t0"
1594     },
1595 #ifdef CONFIG_USER_ONLY
1596     {
1597         .handler = gdb_handle_query_offsets,
1598         .cmd = "Offsets",
1599     },
1600 #else
1601     {
1602         .handler = gdb_handle_query_rcmd,
1603         .cmd = "Rcmd,",
1604         .cmd_startswith = 1,
1605         .schema = "s0"
1606     },
1607 #endif
1608     {
1609         .handler = handle_query_supported,
1610         .cmd = "Supported:",
1611         .cmd_startswith = 1,
1612         .schema = "s0"
1613     },
1614     {
1615         .handler = handle_query_supported,
1616         .cmd = "Supported",
1617         .schema = "s0"
1618     },
1619     {
1620         .handler = handle_query_xfer_features,
1621         .cmd = "Xfer:features:read:",
1622         .cmd_startswith = 1,
1623         .schema = "s:l,l0"
1624     },
1625 #if defined(CONFIG_USER_ONLY) && defined(CONFIG_LINUX)
1626     {
1627         .handler = gdb_handle_query_xfer_auxv,
1628         .cmd = "Xfer:auxv:read::",
1629         .cmd_startswith = 1,
1630         .schema = "l,l0"
1631     },
1632 #endif
1633     {
1634         .handler = gdb_handle_query_attached,
1635         .cmd = "Attached:",
1636         .cmd_startswith = 1
1637     },
1638     {
1639         .handler = gdb_handle_query_attached,
1640         .cmd = "Attached",
1641     },
1642     {
1643         .handler = handle_query_qemu_supported,
1644         .cmd = "qemu.Supported",
1645     },
1646 #ifndef CONFIG_USER_ONLY
1647     {
1648         .handler = gdb_handle_query_qemu_phy_mem_mode,
1649         .cmd = "qemu.PhyMemMode",
1650     },
1651 #endif
1652 };
1653 
1654 static const GdbCmdParseEntry gdb_gen_set_table[] = {
1655     /* Order is important if has same prefix */
1656     {
1657         .handler = handle_set_qemu_sstep,
1658         .cmd = "qemu.sstep:",
1659         .cmd_startswith = 1,
1660         .schema = "l0"
1661     },
1662 #ifndef CONFIG_USER_ONLY
1663     {
1664         .handler = gdb_handle_set_qemu_phy_mem_mode,
1665         .cmd = "qemu.PhyMemMode:",
1666         .cmd_startswith = 1,
1667         .schema = "l0"
1668     },
1669 #endif
1670 };
1671 
1672 static void handle_gen_query(GArray *params, void *user_ctx)
1673 {
1674     if (!params->len) {
1675         return;
1676     }
1677 
1678     if (!process_string_cmd(NULL, get_param(params, 0)->data,
1679                             gdb_gen_query_set_common_table,
1680                             ARRAY_SIZE(gdb_gen_query_set_common_table))) {
1681         return;
1682     }
1683 
1684     if (process_string_cmd(NULL, get_param(params, 0)->data,
1685                            gdb_gen_query_table,
1686                            ARRAY_SIZE(gdb_gen_query_table))) {
1687         gdb_put_packet("");
1688     }
1689 }
1690 
1691 static void handle_gen_set(GArray *params, void *user_ctx)
1692 {
1693     if (!params->len) {
1694         return;
1695     }
1696 
1697     if (!process_string_cmd(NULL, get_param(params, 0)->data,
1698                             gdb_gen_query_set_common_table,
1699                             ARRAY_SIZE(gdb_gen_query_set_common_table))) {
1700         return;
1701     }
1702 
1703     if (process_string_cmd(NULL, get_param(params, 0)->data,
1704                            gdb_gen_set_table,
1705                            ARRAY_SIZE(gdb_gen_set_table))) {
1706         gdb_put_packet("");
1707     }
1708 }
1709 
1710 static void handle_target_halt(GArray *params, void *user_ctx)
1711 {
1712     if (gdbserver_state.allow_stop_reply) {
1713         g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TRAP);
1714         gdb_append_thread_id(gdbserver_state.c_cpu, gdbserver_state.str_buf);
1715         g_string_append_c(gdbserver_state.str_buf, ';');
1716         gdb_put_strbuf();
1717         gdbserver_state.allow_stop_reply = false;
1718     }
1719     /*
1720      * Remove all the breakpoints when this query is issued,
1721      * because gdb is doing an initial connect and the state
1722      * should be cleaned up.
1723      */
1724     gdb_breakpoint_remove_all(gdbserver_state.c_cpu);
1725 }
1726 
1727 static int gdb_handle_packet(const char *line_buf)
1728 {
1729     const GdbCmdParseEntry *cmd_parser = NULL;
1730 
1731     trace_gdbstub_io_command(line_buf);
1732 
1733     switch (line_buf[0]) {
1734     case '!':
1735         gdb_put_packet("OK");
1736         break;
1737     case '?':
1738         {
1739             static const GdbCmdParseEntry target_halted_cmd_desc = {
1740                 .handler = handle_target_halt,
1741                 .cmd = "?",
1742                 .cmd_startswith = 1,
1743                 .allow_stop_reply = true,
1744             };
1745             cmd_parser = &target_halted_cmd_desc;
1746         }
1747         break;
1748     case 'c':
1749         {
1750             static const GdbCmdParseEntry continue_cmd_desc = {
1751                 .handler = handle_continue,
1752                 .cmd = "c",
1753                 .cmd_startswith = 1,
1754                 .allow_stop_reply = true,
1755                 .schema = "L0"
1756             };
1757             cmd_parser = &continue_cmd_desc;
1758         }
1759         break;
1760     case 'C':
1761         {
1762             static const GdbCmdParseEntry cont_with_sig_cmd_desc = {
1763                 .handler = handle_cont_with_sig,
1764                 .cmd = "C",
1765                 .cmd_startswith = 1,
1766                 .allow_stop_reply = true,
1767                 .schema = "l0"
1768             };
1769             cmd_parser = &cont_with_sig_cmd_desc;
1770         }
1771         break;
1772     case 'v':
1773         {
1774             static const GdbCmdParseEntry v_cmd_desc = {
1775                 .handler = handle_v_commands,
1776                 .cmd = "v",
1777                 .cmd_startswith = 1,
1778                 .schema = "s0"
1779             };
1780             cmd_parser = &v_cmd_desc;
1781         }
1782         break;
1783     case 'k':
1784         /* Kill the target */
1785         error_report("QEMU: Terminated via GDBstub");
1786         gdb_exit(0);
1787         exit(0);
1788     case 'D':
1789         {
1790             static const GdbCmdParseEntry detach_cmd_desc = {
1791                 .handler = handle_detach,
1792                 .cmd = "D",
1793                 .cmd_startswith = 1,
1794                 .schema = "?.l0"
1795             };
1796             cmd_parser = &detach_cmd_desc;
1797         }
1798         break;
1799     case 's':
1800         {
1801             static const GdbCmdParseEntry step_cmd_desc = {
1802                 .handler = handle_step,
1803                 .cmd = "s",
1804                 .cmd_startswith = 1,
1805                 .allow_stop_reply = true,
1806                 .schema = "L0"
1807             };
1808             cmd_parser = &step_cmd_desc;
1809         }
1810         break;
1811     case 'b':
1812         {
1813             static const GdbCmdParseEntry backward_cmd_desc = {
1814                 .handler = handle_backward,
1815                 .cmd = "b",
1816                 .cmd_startswith = 1,
1817                 .schema = "o0"
1818             };
1819             cmd_parser = &backward_cmd_desc;
1820         }
1821         break;
1822     case 'F':
1823         {
1824             static const GdbCmdParseEntry file_io_cmd_desc = {
1825                 .handler = gdb_handle_file_io,
1826                 .cmd = "F",
1827                 .cmd_startswith = 1,
1828                 .schema = "L,L,o0"
1829             };
1830             cmd_parser = &file_io_cmd_desc;
1831         }
1832         break;
1833     case 'g':
1834         {
1835             static const GdbCmdParseEntry read_all_regs_cmd_desc = {
1836                 .handler = handle_read_all_regs,
1837                 .cmd = "g",
1838                 .cmd_startswith = 1
1839             };
1840             cmd_parser = &read_all_regs_cmd_desc;
1841         }
1842         break;
1843     case 'G':
1844         {
1845             static const GdbCmdParseEntry write_all_regs_cmd_desc = {
1846                 .handler = handle_write_all_regs,
1847                 .cmd = "G",
1848                 .cmd_startswith = 1,
1849                 .schema = "s0"
1850             };
1851             cmd_parser = &write_all_regs_cmd_desc;
1852         }
1853         break;
1854     case 'm':
1855         {
1856             static const GdbCmdParseEntry read_mem_cmd_desc = {
1857                 .handler = handle_read_mem,
1858                 .cmd = "m",
1859                 .cmd_startswith = 1,
1860                 .schema = "L,L0"
1861             };
1862             cmd_parser = &read_mem_cmd_desc;
1863         }
1864         break;
1865     case 'M':
1866         {
1867             static const GdbCmdParseEntry write_mem_cmd_desc = {
1868                 .handler = handle_write_mem,
1869                 .cmd = "M",
1870                 .cmd_startswith = 1,
1871                 .schema = "L,L:s0"
1872             };
1873             cmd_parser = &write_mem_cmd_desc;
1874         }
1875         break;
1876     case 'p':
1877         {
1878             static const GdbCmdParseEntry get_reg_cmd_desc = {
1879                 .handler = handle_get_reg,
1880                 .cmd = "p",
1881                 .cmd_startswith = 1,
1882                 .schema = "L0"
1883             };
1884             cmd_parser = &get_reg_cmd_desc;
1885         }
1886         break;
1887     case 'P':
1888         {
1889             static const GdbCmdParseEntry set_reg_cmd_desc = {
1890                 .handler = handle_set_reg,
1891                 .cmd = "P",
1892                 .cmd_startswith = 1,
1893                 .schema = "L?s0"
1894             };
1895             cmd_parser = &set_reg_cmd_desc;
1896         }
1897         break;
1898     case 'Z':
1899         {
1900             static const GdbCmdParseEntry insert_bp_cmd_desc = {
1901                 .handler = handle_insert_bp,
1902                 .cmd = "Z",
1903                 .cmd_startswith = 1,
1904                 .schema = "l?L?L0"
1905             };
1906             cmd_parser = &insert_bp_cmd_desc;
1907         }
1908         break;
1909     case 'z':
1910         {
1911             static const GdbCmdParseEntry remove_bp_cmd_desc = {
1912                 .handler = handle_remove_bp,
1913                 .cmd = "z",
1914                 .cmd_startswith = 1,
1915                 .schema = "l?L?L0"
1916             };
1917             cmd_parser = &remove_bp_cmd_desc;
1918         }
1919         break;
1920     case 'H':
1921         {
1922             static const GdbCmdParseEntry set_thread_cmd_desc = {
1923                 .handler = handle_set_thread,
1924                 .cmd = "H",
1925                 .cmd_startswith = 1,
1926                 .schema = "o.t0"
1927             };
1928             cmd_parser = &set_thread_cmd_desc;
1929         }
1930         break;
1931     case 'T':
1932         {
1933             static const GdbCmdParseEntry thread_alive_cmd_desc = {
1934                 .handler = handle_thread_alive,
1935                 .cmd = "T",
1936                 .cmd_startswith = 1,
1937                 .schema = "t0"
1938             };
1939             cmd_parser = &thread_alive_cmd_desc;
1940         }
1941         break;
1942     case 'q':
1943         {
1944             static const GdbCmdParseEntry gen_query_cmd_desc = {
1945                 .handler = handle_gen_query,
1946                 .cmd = "q",
1947                 .cmd_startswith = 1,
1948                 .schema = "s0"
1949             };
1950             cmd_parser = &gen_query_cmd_desc;
1951         }
1952         break;
1953     case 'Q':
1954         {
1955             static const GdbCmdParseEntry gen_set_cmd_desc = {
1956                 .handler = handle_gen_set,
1957                 .cmd = "Q",
1958                 .cmd_startswith = 1,
1959                 .schema = "s0"
1960             };
1961             cmd_parser = &gen_set_cmd_desc;
1962         }
1963         break;
1964     default:
1965         /* put empty packet */
1966         gdb_put_packet("");
1967         break;
1968     }
1969 
1970     if (cmd_parser) {
1971         run_cmd_parser(line_buf, cmd_parser);
1972     }
1973 
1974     return RS_IDLE;
1975 }
1976 
1977 void gdb_set_stop_cpu(CPUState *cpu)
1978 {
1979     GDBProcess *p = gdb_get_cpu_process(cpu);
1980 
1981     if (!p->attached) {
1982         /*
1983          * Having a stop CPU corresponding to a process that is not attached
1984          * confuses GDB. So we ignore the request.
1985          */
1986         return;
1987     }
1988 
1989     gdbserver_state.c_cpu = cpu;
1990     gdbserver_state.g_cpu = cpu;
1991 }
1992 
1993 void gdb_read_byte(uint8_t ch)
1994 {
1995     uint8_t reply;
1996 
1997     gdbserver_state.allow_stop_reply = false;
1998 #ifndef CONFIG_USER_ONLY
1999     if (gdbserver_state.last_packet->len) {
2000         /* Waiting for a response to the last packet.  If we see the start
2001            of a new command then abandon the previous response.  */
2002         if (ch == '-') {
2003             trace_gdbstub_err_got_nack();
2004             gdb_put_buffer(gdbserver_state.last_packet->data,
2005                        gdbserver_state.last_packet->len);
2006         } else if (ch == '+') {
2007             trace_gdbstub_io_got_ack();
2008         } else {
2009             trace_gdbstub_io_got_unexpected(ch);
2010         }
2011 
2012         if (ch == '+' || ch == '$') {
2013             g_byte_array_set_size(gdbserver_state.last_packet, 0);
2014         }
2015         if (ch != '$')
2016             return;
2017     }
2018     if (runstate_is_running()) {
2019         /* when the CPU is running, we cannot do anything except stop
2020            it when receiving a char */
2021         vm_stop(RUN_STATE_PAUSED);
2022     } else
2023 #endif
2024     {
2025         switch(gdbserver_state.state) {
2026         case RS_IDLE:
2027             if (ch == '$') {
2028                 /* start of command packet */
2029                 gdbserver_state.line_buf_index = 0;
2030                 gdbserver_state.line_sum = 0;
2031                 gdbserver_state.state = RS_GETLINE;
2032             } else {
2033                 trace_gdbstub_err_garbage(ch);
2034             }
2035             break;
2036         case RS_GETLINE:
2037             if (ch == '}') {
2038                 /* start escape sequence */
2039                 gdbserver_state.state = RS_GETLINE_ESC;
2040                 gdbserver_state.line_sum += ch;
2041             } else if (ch == '*') {
2042                 /* start run length encoding sequence */
2043                 gdbserver_state.state = RS_GETLINE_RLE;
2044                 gdbserver_state.line_sum += ch;
2045             } else if (ch == '#') {
2046                 /* end of command, start of checksum*/
2047                 gdbserver_state.state = RS_CHKSUM1;
2048             } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) {
2049                 trace_gdbstub_err_overrun();
2050                 gdbserver_state.state = RS_IDLE;
2051             } else {
2052                 /* unescaped command character */
2053                 gdbserver_state.line_buf[gdbserver_state.line_buf_index++] = ch;
2054                 gdbserver_state.line_sum += ch;
2055             }
2056             break;
2057         case RS_GETLINE_ESC:
2058             if (ch == '#') {
2059                 /* unexpected end of command in escape sequence */
2060                 gdbserver_state.state = RS_CHKSUM1;
2061             } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) {
2062                 /* command buffer overrun */
2063                 trace_gdbstub_err_overrun();
2064                 gdbserver_state.state = RS_IDLE;
2065             } else {
2066                 /* parse escaped character and leave escape state */
2067                 gdbserver_state.line_buf[gdbserver_state.line_buf_index++] = ch ^ 0x20;
2068                 gdbserver_state.line_sum += ch;
2069                 gdbserver_state.state = RS_GETLINE;
2070             }
2071             break;
2072         case RS_GETLINE_RLE:
2073             /*
2074              * Run-length encoding is explained in "Debugging with GDB /
2075              * Appendix E GDB Remote Serial Protocol / Overview".
2076              */
2077             if (ch < ' ' || ch == '#' || ch == '$' || ch > 126) {
2078                 /* invalid RLE count encoding */
2079                 trace_gdbstub_err_invalid_repeat(ch);
2080                 gdbserver_state.state = RS_GETLINE;
2081             } else {
2082                 /* decode repeat length */
2083                 int repeat = ch - ' ' + 3;
2084                 if (gdbserver_state.line_buf_index + repeat >= sizeof(gdbserver_state.line_buf) - 1) {
2085                     /* that many repeats would overrun the command buffer */
2086                     trace_gdbstub_err_overrun();
2087                     gdbserver_state.state = RS_IDLE;
2088                 } else if (gdbserver_state.line_buf_index < 1) {
2089                     /* got a repeat but we have nothing to repeat */
2090                     trace_gdbstub_err_invalid_rle();
2091                     gdbserver_state.state = RS_GETLINE;
2092                 } else {
2093                     /* repeat the last character */
2094                     memset(gdbserver_state.line_buf + gdbserver_state.line_buf_index,
2095                            gdbserver_state.line_buf[gdbserver_state.line_buf_index - 1], repeat);
2096                     gdbserver_state.line_buf_index += repeat;
2097                     gdbserver_state.line_sum += ch;
2098                     gdbserver_state.state = RS_GETLINE;
2099                 }
2100             }
2101             break;
2102         case RS_CHKSUM1:
2103             /* get high hex digit of checksum */
2104             if (!isxdigit(ch)) {
2105                 trace_gdbstub_err_checksum_invalid(ch);
2106                 gdbserver_state.state = RS_GETLINE;
2107                 break;
2108             }
2109             gdbserver_state.line_buf[gdbserver_state.line_buf_index] = '\0';
2110             gdbserver_state.line_csum = fromhex(ch) << 4;
2111             gdbserver_state.state = RS_CHKSUM2;
2112             break;
2113         case RS_CHKSUM2:
2114             /* get low hex digit of checksum */
2115             if (!isxdigit(ch)) {
2116                 trace_gdbstub_err_checksum_invalid(ch);
2117                 gdbserver_state.state = RS_GETLINE;
2118                 break;
2119             }
2120             gdbserver_state.line_csum |= fromhex(ch);
2121 
2122             if (gdbserver_state.line_csum != (gdbserver_state.line_sum & 0xff)) {
2123                 trace_gdbstub_err_checksum_incorrect(gdbserver_state.line_sum, gdbserver_state.line_csum);
2124                 /* send NAK reply */
2125                 reply = '-';
2126                 gdb_put_buffer(&reply, 1);
2127                 gdbserver_state.state = RS_IDLE;
2128             } else {
2129                 /* send ACK reply */
2130                 reply = '+';
2131                 gdb_put_buffer(&reply, 1);
2132                 gdbserver_state.state = gdb_handle_packet(gdbserver_state.line_buf);
2133             }
2134             break;
2135         default:
2136             abort();
2137         }
2138     }
2139 }
2140 
2141 /*
2142  * Create the process that will contain all the "orphan" CPUs (that are not
2143  * part of a CPU cluster). Note that if this process contains no CPUs, it won't
2144  * be attachable and thus will be invisible to the user.
2145  */
2146 void gdb_create_default_process(GDBState *s)
2147 {
2148     GDBProcess *process;
2149     int max_pid = 0;
2150 
2151     if (gdbserver_state.process_num) {
2152         max_pid = s->processes[s->process_num - 1].pid;
2153     }
2154 
2155     s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
2156     process = &s->processes[s->process_num - 1];
2157 
2158     /* We need an available PID slot for this process */
2159     assert(max_pid < UINT32_MAX);
2160 
2161     process->pid = max_pid + 1;
2162     process->attached = false;
2163     process->target_xml[0] = '\0';
2164 }
2165 
2166