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