xref: /openbmc/qemu/gdbstub/gdbstub.c (revision 1141159c)
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  *
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  */
800 typedef struct GdbCmdParseEntry {
801     GdbCmdHandler handler;
802     const char *cmd;
803     bool cmd_startswith;
804     const char *schema;
805 } GdbCmdParseEntry;
806 
807 static inline int startswith(const char *string, const char *pattern)
808 {
809   return !strncmp(string, pattern, strlen(pattern));
810 }
811 
812 static 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 
845 static 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 
861 static 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 
895 static 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 
919 static 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 
929 static 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 
948 static 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 
993 static 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 
1017 static 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 
1052 static 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 
1073 static 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 
1102 static 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 
1129 static 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 
1158 static 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 
1183 static 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 
1203 static 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 
1213 static 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 
1241 static void handle_v_cont_query(GArray *params, void *user_ctx)
1242 {
1243     gdb_put_packet("vCont;c;C;s;S");
1244 }
1245 
1246 static 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 
1262 static 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, ';');
1289 cleanup:
1290     gdb_put_strbuf();
1291 }
1292 
1293 static 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 
1302 static 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 
1328 static 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 
1341 static 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 
1358 static 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 
1377 static 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 
1384 static 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 
1401 static 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 
1414 static 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 
1420 static 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 
1456 static 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 
1486 static 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 
1538 static 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 
1547 static 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 
1565 static 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 
1643 static 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 
1661 static 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 
1680 static 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 
1699 static 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 
1713 static 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 
1959 void 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 
1975 void 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  */
2127 void 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