1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include "qemu/osdep.h"
27#include "qemu-common.h"
28#include "qapi/error.h"
29#include "qemu/error-report.h"
30#include "qemu/ctype.h"
31#include "qemu/cutils.h"
32#include "qemu/module.h"
33#include "trace-root.h"
34#ifdef CONFIG_USER_ONLY
35#include "qemu.h"
36#else
37#include "monitor/monitor.h"
38#include "chardev/char.h"
39#include "chardev/char-fe.h"
40#include "sysemu/sysemu.h"
41#include "exec/gdbstub.h"
42#include "hw/cpu/cluster.h"
43#include "hw/boards.h"
44#endif
45
46#define MAX_PACKET_LENGTH 4096
47
48#include "qemu/sockets.h"
49#include "sysemu/hw_accel.h"
50#include "sysemu/kvm.h"
51#include "sysemu/runstate.h"
52#include "hw/semihosting/semihost.h"
53#include "exec/exec-all.h"
54
55#ifdef CONFIG_USER_ONLY
56#define GDB_ATTACHED "0"
57#else
58#define GDB_ATTACHED "1"
59#endif
60
61#ifndef CONFIG_USER_ONLY
62static int phy_memory_mode;
63#endif
64
65static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
66 uint8_t *buf, int len, bool is_write)
67{
68 CPUClass *cc;
69
70#ifndef CONFIG_USER_ONLY
71 if (phy_memory_mode) {
72 if (is_write) {
73 cpu_physical_memory_write(addr, buf, len);
74 } else {
75 cpu_physical_memory_read(addr, buf, len);
76 }
77 return 0;
78 }
79#endif
80
81 cc = CPU_GET_CLASS(cpu);
82 if (cc->memory_rw_debug) {
83 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
84 }
85 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
86}
87
88
89
90
91
92
93static inline int cpu_gdb_index(CPUState *cpu)
94{
95#if defined(CONFIG_USER_ONLY)
96 TaskState *ts = (TaskState *) cpu->opaque;
97 return ts->ts_tid;
98#else
99 return cpu->cpu_index + 1;
100#endif
101}
102
103enum {
104 GDB_SIGNAL_0 = 0,
105 GDB_SIGNAL_INT = 2,
106 GDB_SIGNAL_QUIT = 3,
107 GDB_SIGNAL_TRAP = 5,
108 GDB_SIGNAL_ABRT = 6,
109 GDB_SIGNAL_ALRM = 14,
110 GDB_SIGNAL_IO = 23,
111 GDB_SIGNAL_XCPU = 24,
112 GDB_SIGNAL_UNKNOWN = 143
113};
114
115#ifdef CONFIG_USER_ONLY
116
117
118
119
120
121
122static int gdb_signal_table[] = {
123 0,
124 TARGET_SIGHUP,
125 TARGET_SIGINT,
126 TARGET_SIGQUIT,
127 TARGET_SIGILL,
128 TARGET_SIGTRAP,
129 TARGET_SIGABRT,
130 -1,
131 TARGET_SIGFPE,
132 TARGET_SIGKILL,
133 TARGET_SIGBUS,
134 TARGET_SIGSEGV,
135 TARGET_SIGSYS,
136 TARGET_SIGPIPE,
137 TARGET_SIGALRM,
138 TARGET_SIGTERM,
139 TARGET_SIGURG,
140 TARGET_SIGSTOP,
141 TARGET_SIGTSTP,
142 TARGET_SIGCONT,
143 TARGET_SIGCHLD,
144 TARGET_SIGTTIN,
145 TARGET_SIGTTOU,
146 TARGET_SIGIO,
147 TARGET_SIGXCPU,
148 TARGET_SIGXFSZ,
149 TARGET_SIGVTALRM,
150 TARGET_SIGPROF,
151 TARGET_SIGWINCH,
152 -1,
153 TARGET_SIGUSR1,
154 TARGET_SIGUSR2,
155#ifdef TARGET_SIGPWR
156 TARGET_SIGPWR,
157#else
158 -1,
159#endif
160 -1,
161 -1,
162 -1,
163 -1,
164 -1,
165 -1,
166 -1,
167 -1,
168 -1,
169 -1,
170 -1,
171 -1,
172#ifdef __SIGRTMIN
173 __SIGRTMIN + 1,
174 __SIGRTMIN + 2,
175 __SIGRTMIN + 3,
176 __SIGRTMIN + 4,
177 __SIGRTMIN + 5,
178 __SIGRTMIN + 6,
179 __SIGRTMIN + 7,
180 __SIGRTMIN + 8,
181 __SIGRTMIN + 9,
182 __SIGRTMIN + 10,
183 __SIGRTMIN + 11,
184 __SIGRTMIN + 12,
185 __SIGRTMIN + 13,
186 __SIGRTMIN + 14,
187 __SIGRTMIN + 15,
188 __SIGRTMIN + 16,
189 __SIGRTMIN + 17,
190 __SIGRTMIN + 18,
191 __SIGRTMIN + 19,
192 __SIGRTMIN + 20,
193 __SIGRTMIN + 21,
194 __SIGRTMIN + 22,
195 __SIGRTMIN + 23,
196 __SIGRTMIN + 24,
197 __SIGRTMIN + 25,
198 __SIGRTMIN + 26,
199 __SIGRTMIN + 27,
200 __SIGRTMIN + 28,
201 __SIGRTMIN + 29,
202 __SIGRTMIN + 30,
203 __SIGRTMIN + 31,
204 -1,
205 __SIGRTMIN,
206 __SIGRTMIN + 32,
207 __SIGRTMIN + 33,
208 __SIGRTMIN + 34,
209 __SIGRTMIN + 35,
210 __SIGRTMIN + 36,
211 __SIGRTMIN + 37,
212 __SIGRTMIN + 38,
213 __SIGRTMIN + 39,
214 __SIGRTMIN + 40,
215 __SIGRTMIN + 41,
216 __SIGRTMIN + 42,
217 __SIGRTMIN + 43,
218 __SIGRTMIN + 44,
219 __SIGRTMIN + 45,
220 __SIGRTMIN + 46,
221 __SIGRTMIN + 47,
222 __SIGRTMIN + 48,
223 __SIGRTMIN + 49,
224 __SIGRTMIN + 50,
225 __SIGRTMIN + 51,
226 __SIGRTMIN + 52,
227 __SIGRTMIN + 53,
228 __SIGRTMIN + 54,
229 __SIGRTMIN + 55,
230 __SIGRTMIN + 56,
231 __SIGRTMIN + 57,
232 __SIGRTMIN + 58,
233 __SIGRTMIN + 59,
234 __SIGRTMIN + 60,
235 __SIGRTMIN + 61,
236 __SIGRTMIN + 62,
237 __SIGRTMIN + 63,
238 __SIGRTMIN + 64,
239 __SIGRTMIN + 65,
240 __SIGRTMIN + 66,
241 __SIGRTMIN + 67,
242 __SIGRTMIN + 68,
243 __SIGRTMIN + 69,
244 __SIGRTMIN + 70,
245 __SIGRTMIN + 71,
246 __SIGRTMIN + 72,
247 __SIGRTMIN + 73,
248 __SIGRTMIN + 74,
249 __SIGRTMIN + 75,
250 __SIGRTMIN + 76,
251 __SIGRTMIN + 77,
252 __SIGRTMIN + 78,
253 __SIGRTMIN + 79,
254 __SIGRTMIN + 80,
255 __SIGRTMIN + 81,
256 __SIGRTMIN + 82,
257 __SIGRTMIN + 83,
258 __SIGRTMIN + 84,
259 __SIGRTMIN + 85,
260 __SIGRTMIN + 86,
261 __SIGRTMIN + 87,
262 __SIGRTMIN + 88,
263 __SIGRTMIN + 89,
264 __SIGRTMIN + 90,
265 __SIGRTMIN + 91,
266 __SIGRTMIN + 92,
267 __SIGRTMIN + 93,
268 __SIGRTMIN + 94,
269 __SIGRTMIN + 95,
270 -1,
271 -1,
272 -1,
273 -1,
274 -1,
275 -1,
276 -1,
277 -1,
278 -1
279#endif
280};
281#else
282
283
284
285enum {
286 TARGET_SIGINT = 2,
287 TARGET_SIGTRAP = 5
288};
289
290static int gdb_signal_table[] = {
291 -1,
292 -1,
293 TARGET_SIGINT,
294 -1,
295 -1,
296 TARGET_SIGTRAP
297};
298#endif
299
300#ifdef CONFIG_USER_ONLY
301static int target_signal_to_gdb (int sig)
302{
303 int i;
304 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
305 if (gdb_signal_table[i] == sig)
306 return i;
307 return GDB_SIGNAL_UNKNOWN;
308}
309#endif
310
311static int gdb_signal_to_target (int sig)
312{
313 if (sig < ARRAY_SIZE (gdb_signal_table))
314 return gdb_signal_table[sig];
315 else
316 return -1;
317}
318
319typedef struct GDBRegisterState {
320 int base_reg;
321 int num_regs;
322 gdb_get_reg_cb get_reg;
323 gdb_set_reg_cb set_reg;
324 const char *xml;
325 struct GDBRegisterState *next;
326} GDBRegisterState;
327
328typedef struct GDBProcess {
329 uint32_t pid;
330 bool attached;
331
332 char target_xml[1024];
333} GDBProcess;
334
335enum RSState {
336 RS_INACTIVE,
337 RS_IDLE,
338 RS_GETLINE,
339 RS_GETLINE_ESC,
340 RS_GETLINE_RLE,
341 RS_CHKSUM1,
342 RS_CHKSUM2,
343};
344typedef struct GDBState {
345 bool init;
346 CPUState *c_cpu;
347 CPUState *g_cpu;
348 CPUState *query_cpu;
349 enum RSState state;
350 char line_buf[MAX_PACKET_LENGTH];
351 int line_buf_index;
352 int line_sum;
353 int line_csum;
354 GByteArray *last_packet;
355 int signal;
356#ifdef CONFIG_USER_ONLY
357 int fd;
358 int running_state;
359#else
360 CharBackend chr;
361 Chardev *mon_chr;
362#endif
363 bool multiprocess;
364 GDBProcess *processes;
365 int process_num;
366 char syscall_buf[256];
367 gdb_syscall_complete_cb current_syscall_cb;
368 GString *str_buf;
369 GByteArray *mem_buf;
370} GDBState;
371
372
373
374
375static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
376
377static GDBState gdbserver_state;
378
379static void init_gdbserver_state(void)
380{
381 g_assert(!gdbserver_state.init);
382 memset(&gdbserver_state, 0, sizeof(GDBState));
383 gdbserver_state.init = true;
384 gdbserver_state.str_buf = g_string_new(NULL);
385 gdbserver_state.mem_buf = g_byte_array_sized_new(MAX_PACKET_LENGTH);
386 gdbserver_state.last_packet = g_byte_array_sized_new(MAX_PACKET_LENGTH + 4);
387}
388
389#ifndef CONFIG_USER_ONLY
390static void reset_gdbserver_state(void)
391{
392 g_free(gdbserver_state.processes);
393 gdbserver_state.processes = NULL;
394 gdbserver_state.process_num = 0;
395}
396#endif
397
398bool gdb_has_xml;
399
400#ifdef CONFIG_USER_ONLY
401
402static int gdbserver_fd = -1;
403
404static int get_char(void)
405{
406 uint8_t ch;
407 int ret;
408
409 for(;;) {
410 ret = qemu_recv(gdbserver_state.fd, &ch, 1, 0);
411 if (ret < 0) {
412 if (errno == ECONNRESET)
413 gdbserver_state.fd = -1;
414 if (errno != EINTR)
415 return -1;
416 } else if (ret == 0) {
417 close(gdbserver_state.fd);
418 gdbserver_state.fd = -1;
419 return -1;
420 } else {
421 break;
422 }
423 }
424 return ch;
425}
426#endif
427
428static enum {
429 GDB_SYS_UNKNOWN,
430 GDB_SYS_ENABLED,
431 GDB_SYS_DISABLED,
432} gdb_syscall_mode;
433
434
435int use_gdb_syscalls(void)
436{
437 SemihostingTarget target = semihosting_get_target();
438 if (target == SEMIHOSTING_TARGET_NATIVE) {
439
440 return false;
441 } else if (target == SEMIHOSTING_TARGET_GDB) {
442
443 return true;
444 }
445
446
447
448 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
449 gdb_syscall_mode = gdbserver_state.init ?
450 GDB_SYS_ENABLED : GDB_SYS_DISABLED;
451 }
452 return gdb_syscall_mode == GDB_SYS_ENABLED;
453}
454
455
456static inline void gdb_continue(void)
457{
458
459#ifdef CONFIG_USER_ONLY
460 gdbserver_state.running_state = 1;
461 trace_gdbstub_op_continue();
462#else
463 if (!runstate_needs_reset()) {
464 trace_gdbstub_op_continue();
465 vm_start();
466 }
467#endif
468}
469
470
471
472
473
474static int gdb_continue_partial(char *newstates)
475{
476 CPUState *cpu;
477 int res = 0;
478#ifdef CONFIG_USER_ONLY
479
480
481
482
483 CPU_FOREACH(cpu) {
484 if (newstates[cpu->cpu_index] == 's') {
485 trace_gdbstub_op_stepping(cpu->cpu_index);
486 cpu_single_step(cpu, sstep_flags);
487 }
488 }
489 gdbserver_state.running_state = 1;
490#else
491 int flag = 0;
492
493 if (!runstate_needs_reset()) {
494 if (vm_prepare_start()) {
495 return 0;
496 }
497
498 CPU_FOREACH(cpu) {
499 switch (newstates[cpu->cpu_index]) {
500 case 0:
501 case 1:
502 break;
503 case 's':
504 trace_gdbstub_op_stepping(cpu->cpu_index);
505 cpu_single_step(cpu, sstep_flags);
506 cpu_resume(cpu);
507 flag = 1;
508 break;
509 case 'c':
510 trace_gdbstub_op_continue_cpu(cpu->cpu_index);
511 cpu_resume(cpu);
512 flag = 1;
513 break;
514 default:
515 res = -1;
516 break;
517 }
518 }
519 }
520 if (flag) {
521 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
522 }
523#endif
524 return res;
525}
526
527static void put_buffer(const uint8_t *buf, int len)
528{
529#ifdef CONFIG_USER_ONLY
530 int ret;
531
532 while (len > 0) {
533 ret = send(gdbserver_state.fd, buf, len, 0);
534 if (ret < 0) {
535 if (errno != EINTR)
536 return;
537 } else {
538 buf += ret;
539 len -= ret;
540 }
541 }
542#else
543
544
545 qemu_chr_fe_write_all(&gdbserver_state.chr, buf, len);
546#endif
547}
548
549static inline int fromhex(int v)
550{
551 if (v >= '0' && v <= '9')
552 return v - '0';
553 else if (v >= 'A' && v <= 'F')
554 return v - 'A' + 10;
555 else if (v >= 'a' && v <= 'f')
556 return v - 'a' + 10;
557 else
558 return 0;
559}
560
561static inline int tohex(int v)
562{
563 if (v < 10)
564 return v + '0';
565 else
566 return v - 10 + 'a';
567}
568
569
570static void memtohex(GString *buf, const uint8_t *mem, int len)
571{
572 int i, c;
573 for(i = 0; i < len; i++) {
574 c = mem[i];
575 g_string_append_c(buf, tohex(c >> 4));
576 g_string_append_c(buf, tohex(c & 0xf));
577 }
578 g_string_append_c(buf, '\0');
579}
580
581static void hextomem(GByteArray *mem, const char *buf, int len)
582{
583 int i;
584
585 for(i = 0; i < len; i++) {
586 guint8 byte = fromhex(buf[0]) << 4 | fromhex(buf[1]);
587 g_byte_array_append(mem, &byte, 1);
588 buf += 2;
589 }
590}
591
592static void hexdump(const char *buf, int len,
593 void (*trace_fn)(size_t ofs, char const *text))
594{
595 char line_buffer[3 * 16 + 4 + 16 + 1];
596
597 size_t i;
598 for (i = 0; i < len || (i & 0xF); ++i) {
599 size_t byte_ofs = i & 15;
600
601 if (byte_ofs == 0) {
602 memset(line_buffer, ' ', 3 * 16 + 4 + 16);
603 line_buffer[3 * 16 + 4 + 16] = 0;
604 }
605
606 size_t col_group = (i >> 2) & 3;
607 size_t hex_col = byte_ofs * 3 + col_group;
608 size_t txt_col = 3 * 16 + 4 + byte_ofs;
609
610 if (i < len) {
611 char value = buf[i];
612
613 line_buffer[hex_col + 0] = tohex((value >> 4) & 0xF);
614 line_buffer[hex_col + 1] = tohex((value >> 0) & 0xF);
615 line_buffer[txt_col + 0] = (value >= ' ' && value < 127)
616 ? value
617 : '.';
618 }
619
620 if (byte_ofs == 0xF)
621 trace_fn(i & -16, line_buffer);
622 }
623}
624
625
626static int put_packet_binary(const char *buf, int len, bool dump)
627{
628 int csum, i;
629 uint8_t footer[3];
630
631 if (dump && trace_event_get_state_backends(TRACE_GDBSTUB_IO_BINARYREPLY)) {
632 hexdump(buf, len, trace_gdbstub_io_binaryreply);
633 }
634
635 for(;;) {
636 g_byte_array_set_size(gdbserver_state.last_packet, 0);
637 g_byte_array_append(gdbserver_state.last_packet,
638 (const uint8_t *) "$", 1);
639 g_byte_array_append(gdbserver_state.last_packet,
640 (const uint8_t *) buf, len);
641 csum = 0;
642 for(i = 0; i < len; i++) {
643 csum += buf[i];
644 }
645 footer[0] = '#';
646 footer[1] = tohex((csum >> 4) & 0xf);
647 footer[2] = tohex((csum) & 0xf);
648 g_byte_array_append(gdbserver_state.last_packet, footer, 3);
649
650 put_buffer(gdbserver_state.last_packet->data,
651 gdbserver_state.last_packet->len);
652
653#ifdef CONFIG_USER_ONLY
654 i = get_char();
655 if (i < 0)
656 return -1;
657 if (i == '+')
658 break;
659#else
660 break;
661#endif
662 }
663 return 0;
664}
665
666
667static int put_packet(const char *buf)
668{
669 trace_gdbstub_io_reply(buf);
670
671 return put_packet_binary(buf, strlen(buf), false);
672}
673
674static void put_strbuf(void)
675{
676 put_packet(gdbserver_state.str_buf->str);
677}
678
679
680static void memtox(GString *buf, const char *mem, int len)
681{
682 char c;
683
684 while (len--) {
685 c = *(mem++);
686 switch (c) {
687 case '#': case '$': case '*': case '}':
688 g_string_append_c(buf, '}');
689 g_string_append_c(buf, c ^ 0x20);
690 break;
691 default:
692 g_string_append_c(buf, c);
693 break;
694 }
695 }
696}
697
698static uint32_t gdb_get_cpu_pid(CPUState *cpu)
699{
700
701 if (cpu->cluster_index == UNASSIGNED_CLUSTER_INDEX) {
702
703 int index = gdbserver_state.process_num - 1;
704 return gdbserver_state.processes[index].pid;
705 }
706 return cpu->cluster_index + 1;
707}
708
709static GDBProcess *gdb_get_process(uint32_t pid)
710{
711 int i;
712
713 if (!pid) {
714
715 return &gdbserver_state.processes[0];
716 }
717
718 for (i = 0; i < gdbserver_state.process_num; i++) {
719 if (gdbserver_state.processes[i].pid == pid) {
720 return &gdbserver_state.processes[i];
721 }
722 }
723
724 return NULL;
725}
726
727static GDBProcess *gdb_get_cpu_process(CPUState *cpu)
728{
729 return gdb_get_process(gdb_get_cpu_pid(cpu));
730}
731
732static CPUState *find_cpu(uint32_t thread_id)
733{
734 CPUState *cpu;
735
736 CPU_FOREACH(cpu) {
737 if (cpu_gdb_index(cpu) == thread_id) {
738 return cpu;
739 }
740 }
741
742 return NULL;
743}
744
745static CPUState *get_first_cpu_in_process(GDBProcess *process)
746{
747 CPUState *cpu;
748
749 CPU_FOREACH(cpu) {
750 if (gdb_get_cpu_pid(cpu) == process->pid) {
751 return cpu;
752 }
753 }
754
755 return NULL;
756}
757
758static CPUState *gdb_next_cpu_in_process(CPUState *cpu)
759{
760 uint32_t pid = gdb_get_cpu_pid(cpu);
761 cpu = CPU_NEXT(cpu);
762
763 while (cpu) {
764 if (gdb_get_cpu_pid(cpu) == pid) {
765 break;
766 }
767
768 cpu = CPU_NEXT(cpu);
769 }
770
771 return cpu;
772}
773
774
775static CPUState *gdb_next_attached_cpu(CPUState *cpu)
776{
777 cpu = CPU_NEXT(cpu);
778
779 while (cpu) {
780 if (gdb_get_cpu_process(cpu)->attached) {
781 break;
782 }
783
784 cpu = CPU_NEXT(cpu);
785 }
786
787 return cpu;
788}
789
790
791static CPUState *gdb_first_attached_cpu(void)
792{
793 CPUState *cpu = first_cpu;
794 GDBProcess *process = gdb_get_cpu_process(cpu);
795
796 if (!process->attached) {
797 return gdb_next_attached_cpu(cpu);
798 }
799
800 return cpu;
801}
802
803static CPUState *gdb_get_cpu(uint32_t pid, uint32_t tid)
804{
805 GDBProcess *process;
806 CPUState *cpu;
807
808 if (!pid && !tid) {
809
810 return gdb_first_attached_cpu();
811 } else if (pid && !tid) {
812
813 process = gdb_get_process(pid);
814
815 if (process == NULL) {
816 return NULL;
817 }
818
819 if (!process->attached) {
820 return NULL;
821 }
822
823 return get_first_cpu_in_process(process);
824 } else {
825
826 cpu = find_cpu(tid);
827
828 if (cpu == NULL) {
829 return NULL;
830 }
831
832 process = gdb_get_cpu_process(cpu);
833
834 if (pid && process->pid != pid) {
835 return NULL;
836 }
837
838 if (!process->attached) {
839 return NULL;
840 }
841
842 return cpu;
843 }
844}
845
846static const char *get_feature_xml(const char *p, const char **newp,
847 GDBProcess *process)
848{
849 size_t len;
850 int i;
851 const char *name;
852 CPUState *cpu = get_first_cpu_in_process(process);
853 CPUClass *cc = CPU_GET_CLASS(cpu);
854
855 len = 0;
856 while (p[len] && p[len] != ':')
857 len++;
858 *newp = p + len;
859
860 name = NULL;
861 if (strncmp(p, "target.xml", len) == 0) {
862 char *buf = process->target_xml;
863 const size_t buf_sz = sizeof(process->target_xml);
864
865
866 if (!buf[0]) {
867 GDBRegisterState *r;
868
869 pstrcat(buf, buf_sz,
870 "<?xml version=\"1.0\"?>"
871 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
872 "<target>");
873 if (cc->gdb_arch_name) {
874 gchar *arch = cc->gdb_arch_name(cpu);
875 pstrcat(buf, buf_sz, "<architecture>");
876 pstrcat(buf, buf_sz, arch);
877 pstrcat(buf, buf_sz, "</architecture>");
878 g_free(arch);
879 }
880 pstrcat(buf, buf_sz, "<xi:include href=\"");
881 pstrcat(buf, buf_sz, cc->gdb_core_xml_file);
882 pstrcat(buf, buf_sz, "\"/>");
883 for (r = cpu->gdb_regs; r; r = r->next) {
884 pstrcat(buf, buf_sz, "<xi:include href=\"");
885 pstrcat(buf, buf_sz, r->xml);
886 pstrcat(buf, buf_sz, "\"/>");
887 }
888 pstrcat(buf, buf_sz, "</target>");
889 }
890 return buf;
891 }
892 if (cc->gdb_get_dynamic_xml) {
893 char *xmlname = g_strndup(p, len);
894 const char *xml = cc->gdb_get_dynamic_xml(cpu, xmlname);
895
896 g_free(xmlname);
897 if (xml) {
898 return xml;
899 }
900 }
901 for (i = 0; ; i++) {
902 name = xml_builtin[i][0];
903 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
904 break;
905 }
906 return name ? xml_builtin[i][1] : NULL;
907}
908
909static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
910{
911 CPUClass *cc = CPU_GET_CLASS(cpu);
912 CPUArchState *env = cpu->env_ptr;
913 GDBRegisterState *r;
914
915 if (reg < cc->gdb_num_core_regs) {
916 return cc->gdb_read_register(cpu, buf, reg);
917 }
918
919 for (r = cpu->gdb_regs; r; r = r->next) {
920 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
921 return r->get_reg(env, buf, reg - r->base_reg);
922 }
923 }
924 return 0;
925}
926
927static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
928{
929 CPUClass *cc = CPU_GET_CLASS(cpu);
930 CPUArchState *env = cpu->env_ptr;
931 GDBRegisterState *r;
932
933 if (reg < cc->gdb_num_core_regs) {
934 return cc->gdb_write_register(cpu, mem_buf, reg);
935 }
936
937 for (r = cpu->gdb_regs; r; r = r->next) {
938 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
939 return r->set_reg(env, mem_buf, reg - r->base_reg);
940 }
941 }
942 return 0;
943}
944
945
946
947
948
949
950
951void gdb_register_coprocessor(CPUState *cpu,
952 gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
953 int num_regs, const char *xml, int g_pos)
954{
955 GDBRegisterState *s;
956 GDBRegisterState **p;
957
958 p = &cpu->gdb_regs;
959 while (*p) {
960
961 if (strcmp((*p)->xml, xml) == 0)
962 return;
963 p = &(*p)->next;
964 }
965
966 s = g_new0(GDBRegisterState, 1);
967 s->base_reg = cpu->gdb_num_regs;
968 s->num_regs = num_regs;
969 s->get_reg = get_reg;
970 s->set_reg = set_reg;
971 s->xml = xml;
972
973
974 cpu->gdb_num_regs += num_regs;
975 *p = s;
976 if (g_pos) {
977 if (g_pos != s->base_reg) {
978 error_report("Error: Bad gdb register numbering for '%s', "
979 "expected %d got %d", xml, g_pos, s->base_reg);
980 } else {
981 cpu->gdb_num_g_regs = cpu->gdb_num_regs;
982 }
983 }
984}
985
986#ifndef CONFIG_USER_ONLY
987
988static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
989{
990 static const int xlat[] = {
991 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
992 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
993 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
994 };
995
996 CPUClass *cc = CPU_GET_CLASS(cpu);
997 int cputype = xlat[gdbtype];
998
999 if (cc->gdb_stop_before_watchpoint) {
1000 cputype |= BP_STOP_BEFORE_ACCESS;
1001 }
1002 return cputype;
1003}
1004#endif
1005
1006static int gdb_breakpoint_insert(int type, target_ulong addr, target_ulong len)
1007{
1008 CPUState *cpu;
1009 int err = 0;
1010
1011 if (kvm_enabled()) {
1012 return kvm_insert_breakpoint(gdbserver_state.c_cpu, addr, len, type);
1013 }
1014
1015 switch (type) {
1016 case GDB_BREAKPOINT_SW:
1017 case GDB_BREAKPOINT_HW:
1018 CPU_FOREACH(cpu) {
1019 err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
1020 if (err) {
1021 break;
1022 }
1023 }
1024 return err;
1025#ifndef CONFIG_USER_ONLY
1026 case GDB_WATCHPOINT_WRITE:
1027 case GDB_WATCHPOINT_READ:
1028 case GDB_WATCHPOINT_ACCESS:
1029 CPU_FOREACH(cpu) {
1030 err = cpu_watchpoint_insert(cpu, addr, len,
1031 xlat_gdb_type(cpu, type), NULL);
1032 if (err) {
1033 break;
1034 }
1035 }
1036 return err;
1037#endif
1038 default:
1039 return -ENOSYS;
1040 }
1041}
1042
1043static int gdb_breakpoint_remove(int type, target_ulong addr, target_ulong len)
1044{
1045 CPUState *cpu;
1046 int err = 0;
1047
1048 if (kvm_enabled()) {
1049 return kvm_remove_breakpoint(gdbserver_state.c_cpu, addr, len, type);
1050 }
1051
1052 switch (type) {
1053 case GDB_BREAKPOINT_SW:
1054 case GDB_BREAKPOINT_HW:
1055 CPU_FOREACH(cpu) {
1056 err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
1057 if (err) {
1058 break;
1059 }
1060 }
1061 return err;
1062#ifndef CONFIG_USER_ONLY
1063 case GDB_WATCHPOINT_WRITE:
1064 case GDB_WATCHPOINT_READ:
1065 case GDB_WATCHPOINT_ACCESS:
1066 CPU_FOREACH(cpu) {
1067 err = cpu_watchpoint_remove(cpu, addr, len,
1068 xlat_gdb_type(cpu, type));
1069 if (err)
1070 break;
1071 }
1072 return err;
1073#endif
1074 default:
1075 return -ENOSYS;
1076 }
1077}
1078
1079static inline void gdb_cpu_breakpoint_remove_all(CPUState *cpu)
1080{
1081 cpu_breakpoint_remove_all(cpu, BP_GDB);
1082#ifndef CONFIG_USER_ONLY
1083 cpu_watchpoint_remove_all(cpu, BP_GDB);
1084#endif
1085}
1086
1087static void gdb_process_breakpoint_remove_all(GDBProcess *p)
1088{
1089 CPUState *cpu = get_first_cpu_in_process(p);
1090
1091 while (cpu) {
1092 gdb_cpu_breakpoint_remove_all(cpu);
1093 cpu = gdb_next_cpu_in_process(cpu);
1094 }
1095}
1096
1097static void gdb_breakpoint_remove_all(void)
1098{
1099 CPUState *cpu;
1100
1101 if (kvm_enabled()) {
1102 kvm_remove_all_breakpoints(gdbserver_state.c_cpu);
1103 return;
1104 }
1105
1106 CPU_FOREACH(cpu) {
1107 gdb_cpu_breakpoint_remove_all(cpu);
1108 }
1109}
1110
1111static void gdb_set_cpu_pc(target_ulong pc)
1112{
1113 CPUState *cpu = gdbserver_state.c_cpu;
1114
1115 cpu_synchronize_state(cpu);
1116 cpu_set_pc(cpu, pc);
1117}
1118
1119static void gdb_append_thread_id(CPUState *cpu, GString *buf)
1120{
1121 if (gdbserver_state.multiprocess) {
1122 g_string_append_printf(buf, "p%02x.%02x",
1123 gdb_get_cpu_pid(cpu), cpu_gdb_index(cpu));
1124 } else {
1125 g_string_append_printf(buf, "%02x", cpu_gdb_index(cpu));
1126 }
1127}
1128
1129typedef enum GDBThreadIdKind {
1130 GDB_ONE_THREAD = 0,
1131 GDB_ALL_THREADS,
1132 GDB_ALL_PROCESSES,
1133 GDB_READ_THREAD_ERR
1134} GDBThreadIdKind;
1135
1136static GDBThreadIdKind read_thread_id(const char *buf, const char **end_buf,
1137 uint32_t *pid, uint32_t *tid)
1138{
1139 unsigned long p, t;
1140 int ret;
1141
1142 if (*buf == 'p') {
1143 buf++;
1144 ret = qemu_strtoul(buf, &buf, 16, &p);
1145
1146 if (ret) {
1147 return GDB_READ_THREAD_ERR;
1148 }
1149
1150
1151 buf++;
1152 } else {
1153 p = 1;
1154 }
1155
1156 ret = qemu_strtoul(buf, &buf, 16, &t);
1157
1158 if (ret) {
1159 return GDB_READ_THREAD_ERR;
1160 }
1161
1162 *end_buf = buf;
1163
1164 if (p == -1) {
1165 return GDB_ALL_PROCESSES;
1166 }
1167
1168 if (pid) {
1169 *pid = p;
1170 }
1171
1172 if (t == -1) {
1173 return GDB_ALL_THREADS;
1174 }
1175
1176 if (tid) {
1177 *tid = t;
1178 }
1179
1180 return GDB_ONE_THREAD;
1181}
1182
1183
1184
1185
1186
1187
1188static int gdb_handle_vcont(const char *p)
1189{
1190 int res, signal = 0;
1191 char cur_action;
1192 char *newstates;
1193 unsigned long tmp;
1194 uint32_t pid, tid;
1195 GDBProcess *process;
1196 CPUState *cpu;
1197 GDBThreadIdKind kind;
1198#ifdef CONFIG_USER_ONLY
1199 int max_cpus = 1;
1200
1201 CPU_FOREACH(cpu) {
1202 max_cpus = max_cpus <= cpu->cpu_index ? cpu->cpu_index + 1 : max_cpus;
1203 }
1204#else
1205 MachineState *ms = MACHINE(qdev_get_machine());
1206 unsigned int max_cpus = ms->smp.max_cpus;
1207#endif
1208
1209 newstates = g_new0(char, max_cpus);
1210
1211
1212 CPU_FOREACH(cpu) {
1213 newstates[cpu->cpu_index] = 1;
1214 }
1215
1216
1217
1218
1219
1220
1221
1222 res = 0;
1223 while (*p) {
1224 if (*p++ != ';') {
1225 res = -ENOTSUP;
1226 goto out;
1227 }
1228
1229 cur_action = *p++;
1230 if (cur_action == 'C' || cur_action == 'S') {
1231 cur_action = qemu_tolower(cur_action);
1232 res = qemu_strtoul(p + 1, &p, 16, &tmp);
1233 if (res) {
1234 goto out;
1235 }
1236 signal = gdb_signal_to_target(tmp);
1237 } else if (cur_action != 'c' && cur_action != 's') {
1238
1239 res = -ENOTSUP;
1240 goto out;
1241 }
1242
1243 if (*p == '\0' || *p == ';') {
1244
1245
1246
1247
1248
1249 kind = GDB_ALL_PROCESSES;
1250 } else if (*p++ == ':') {
1251 kind = read_thread_id(p, &p, &pid, &tid);
1252 } else {
1253 res = -ENOTSUP;
1254 goto out;
1255 }
1256
1257 switch (kind) {
1258 case GDB_READ_THREAD_ERR:
1259 res = -EINVAL;
1260 goto out;
1261
1262 case GDB_ALL_PROCESSES:
1263 cpu = gdb_first_attached_cpu();
1264 while (cpu) {
1265 if (newstates[cpu->cpu_index] == 1) {
1266 newstates[cpu->cpu_index] = cur_action;
1267 }
1268
1269 cpu = gdb_next_attached_cpu(cpu);
1270 }
1271 break;
1272
1273 case GDB_ALL_THREADS:
1274 process = gdb_get_process(pid);
1275
1276 if (!process->attached) {
1277 res = -EINVAL;
1278 goto out;
1279 }
1280
1281 cpu = get_first_cpu_in_process(process);
1282 while (cpu) {
1283 if (newstates[cpu->cpu_index] == 1) {
1284 newstates[cpu->cpu_index] = cur_action;
1285 }
1286
1287 cpu = gdb_next_cpu_in_process(cpu);
1288 }
1289 break;
1290
1291 case GDB_ONE_THREAD:
1292 cpu = gdb_get_cpu(pid, tid);
1293
1294
1295 if (!cpu) {
1296 res = -EINVAL;
1297 goto out;
1298 }
1299
1300
1301 if (newstates[cpu->cpu_index] == 1) {
1302 newstates[cpu->cpu_index] = cur_action;
1303 }
1304 break;
1305 }
1306 }
1307 gdbserver_state.signal = signal;
1308 gdb_continue_partial(newstates);
1309
1310out:
1311 g_free(newstates);
1312
1313 return res;
1314}
1315
1316typedef union GdbCmdVariant {
1317 const char *data;
1318 uint8_t opcode;
1319 unsigned long val_ul;
1320 unsigned long long val_ull;
1321 struct {
1322 GDBThreadIdKind kind;
1323 uint32_t pid;
1324 uint32_t tid;
1325 } thread_id;
1326} GdbCmdVariant;
1327
1328static const char *cmd_next_param(const char *param, const char delimiter)
1329{
1330 static const char all_delimiters[] = ",;:=";
1331 char curr_delimiters[2] = {0};
1332 const char *delimiters;
1333
1334 if (delimiter == '?') {
1335 delimiters = all_delimiters;
1336 } else if (delimiter == '0') {
1337 return strchr(param, '\0');
1338 } else if (delimiter == '.' && *param) {
1339 return param + 1;
1340 } else {
1341 curr_delimiters[0] = delimiter;
1342 delimiters = curr_delimiters;
1343 }
1344
1345 param += strcspn(param, delimiters);
1346 if (*param) {
1347 param++;
1348 }
1349 return param;
1350}
1351
1352static int cmd_parse_params(const char *data, const char *schema,
1353 GdbCmdVariant *params, int *num_params)
1354{
1355 int curr_param;
1356 const char *curr_schema, *curr_data;
1357
1358 *num_params = 0;
1359
1360 if (!schema) {
1361 return 0;
1362 }
1363
1364 curr_schema = schema;
1365 curr_param = 0;
1366 curr_data = data;
1367 while (curr_schema[0] && curr_schema[1] && *curr_data) {
1368 switch (curr_schema[0]) {
1369 case 'l':
1370 if (qemu_strtoul(curr_data, &curr_data, 16,
1371 ¶ms[curr_param].val_ul)) {
1372 return -EINVAL;
1373 }
1374 curr_param++;
1375 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1376 break;
1377 case 'L':
1378 if (qemu_strtou64(curr_data, &curr_data, 16,
1379 (uint64_t *)¶ms[curr_param].val_ull)) {
1380 return -EINVAL;
1381 }
1382 curr_param++;
1383 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1384 break;
1385 case 's':
1386 params[curr_param].data = curr_data;
1387 curr_param++;
1388 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1389 break;
1390 case 'o':
1391 params[curr_param].opcode = *(uint8_t *)curr_data;
1392 curr_param++;
1393 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1394 break;
1395 case 't':
1396 params[curr_param].thread_id.kind =
1397 read_thread_id(curr_data, &curr_data,
1398 ¶ms[curr_param].thread_id.pid,
1399 ¶ms[curr_param].thread_id.tid);
1400 curr_param++;
1401 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1402 break;
1403 case '?':
1404 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1405 break;
1406 default:
1407 return -EINVAL;
1408 }
1409 curr_schema += 2;
1410 }
1411
1412 *num_params = curr_param;
1413 return 0;
1414}
1415
1416typedef struct GdbCmdContext {
1417 GdbCmdVariant *params;
1418 int num_params;
1419} GdbCmdContext;
1420
1421typedef void (*GdbCmdHandler)(GdbCmdContext *gdb_ctx, void *user_ctx);
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446typedef struct GdbCmdParseEntry {
1447 GdbCmdHandler handler;
1448 const char *cmd;
1449 bool cmd_startswith;
1450 const char *schema;
1451} GdbCmdParseEntry;
1452
1453static inline int startswith(const char *string, const char *pattern)
1454{
1455 return !strncmp(string, pattern, strlen(pattern));
1456}
1457
1458static int process_string_cmd(void *user_ctx, const char *data,
1459 const GdbCmdParseEntry *cmds, int num_cmds)
1460{
1461 int i, schema_len, max_num_params = 0;
1462 GdbCmdContext gdb_ctx;
1463
1464 if (!cmds) {
1465 return -1;
1466 }
1467
1468 for (i = 0; i < num_cmds; i++) {
1469 const GdbCmdParseEntry *cmd = &cmds[i];
1470 g_assert(cmd->handler && cmd->cmd);
1471
1472 if ((cmd->cmd_startswith && !startswith(data, cmd->cmd)) ||
1473 (!cmd->cmd_startswith && strcmp(cmd->cmd, data))) {
1474 continue;
1475 }
1476
1477 if (cmd->schema) {
1478 schema_len = strlen(cmd->schema);
1479 if (schema_len % 2) {
1480 return -2;
1481 }
1482
1483 max_num_params = schema_len / 2;
1484 }
1485
1486 gdb_ctx.params =
1487 (GdbCmdVariant *)alloca(sizeof(*gdb_ctx.params) * max_num_params);
1488 memset(gdb_ctx.params, 0, sizeof(*gdb_ctx.params) * max_num_params);
1489
1490 if (cmd_parse_params(&data[strlen(cmd->cmd)], cmd->schema,
1491 gdb_ctx.params, &gdb_ctx.num_params)) {
1492 return -1;
1493 }
1494
1495 cmd->handler(&gdb_ctx, user_ctx);
1496 return 0;
1497 }
1498
1499 return -1;
1500}
1501
1502static void run_cmd_parser(const char *data, const GdbCmdParseEntry *cmd)
1503{
1504 if (!data) {
1505 return;
1506 }
1507
1508 g_string_set_size(gdbserver_state.str_buf, 0);
1509 g_byte_array_set_size(gdbserver_state.mem_buf, 0);
1510
1511
1512
1513 if (process_string_cmd(NULL, data, cmd, 1)) {
1514 put_packet("");
1515 }
1516}
1517
1518static void handle_detach(GdbCmdContext *gdb_ctx, void *user_ctx)
1519{
1520 GDBProcess *process;
1521 uint32_t pid = 1;
1522
1523 if (gdbserver_state.multiprocess) {
1524 if (!gdb_ctx->num_params) {
1525 put_packet("E22");
1526 return;
1527 }
1528
1529 pid = gdb_ctx->params[0].val_ul;
1530 }
1531
1532 process = gdb_get_process(pid);
1533 gdb_process_breakpoint_remove_all(process);
1534 process->attached = false;
1535
1536 if (pid == gdb_get_cpu_pid(gdbserver_state.c_cpu)) {
1537 gdbserver_state.c_cpu = gdb_first_attached_cpu();
1538 }
1539
1540 if (pid == gdb_get_cpu_pid(gdbserver_state.g_cpu)) {
1541 gdbserver_state.g_cpu = gdb_first_attached_cpu();
1542 }
1543
1544 if (!gdbserver_state.c_cpu) {
1545
1546 gdb_syscall_mode = GDB_SYS_DISABLED;
1547 gdb_continue();
1548 }
1549 put_packet("OK");
1550}
1551
1552static void handle_thread_alive(GdbCmdContext *gdb_ctx, void *user_ctx)
1553{
1554 CPUState *cpu;
1555
1556 if (!gdb_ctx->num_params) {
1557 put_packet("E22");
1558 return;
1559 }
1560
1561 if (gdb_ctx->params[0].thread_id.kind == GDB_READ_THREAD_ERR) {
1562 put_packet("E22");
1563 return;
1564 }
1565
1566 cpu = gdb_get_cpu(gdb_ctx->params[0].thread_id.pid,
1567 gdb_ctx->params[0].thread_id.tid);
1568 if (!cpu) {
1569 put_packet("E22");
1570 return;
1571 }
1572
1573 put_packet("OK");
1574}
1575
1576static void handle_continue(GdbCmdContext *gdb_ctx, void *user_ctx)
1577{
1578 if (gdb_ctx->num_params) {
1579 gdb_set_cpu_pc(gdb_ctx->params[0].val_ull);
1580 }
1581
1582 gdbserver_state.signal = 0;
1583 gdb_continue();
1584}
1585
1586static void handle_cont_with_sig(GdbCmdContext *gdb_ctx, void *user_ctx)
1587{
1588 unsigned long signal = 0;
1589
1590
1591
1592
1593
1594 if (gdb_ctx->num_params) {
1595 signal = gdb_ctx->params[0].val_ul;
1596 }
1597
1598 gdbserver_state.signal = gdb_signal_to_target(signal);
1599 if (gdbserver_state.signal == -1) {
1600 gdbserver_state.signal = 0;
1601 }
1602 gdb_continue();
1603}
1604
1605static void handle_set_thread(GdbCmdContext *gdb_ctx, void *user_ctx)
1606{
1607 CPUState *cpu;
1608
1609 if (gdb_ctx->num_params != 2) {
1610 put_packet("E22");
1611 return;
1612 }
1613
1614 if (gdb_ctx->params[1].thread_id.kind == GDB_READ_THREAD_ERR) {
1615 put_packet("E22");
1616 return;
1617 }
1618
1619 if (gdb_ctx->params[1].thread_id.kind != GDB_ONE_THREAD) {
1620 put_packet("OK");
1621 return;
1622 }
1623
1624 cpu = gdb_get_cpu(gdb_ctx->params[1].thread_id.pid,
1625 gdb_ctx->params[1].thread_id.tid);
1626 if (!cpu) {
1627 put_packet("E22");
1628 return;
1629 }
1630
1631
1632
1633
1634
1635 switch (gdb_ctx->params[0].opcode) {
1636 case 'c':
1637 gdbserver_state.c_cpu = cpu;
1638 put_packet("OK");
1639 break;
1640 case 'g':
1641 gdbserver_state.g_cpu = cpu;
1642 put_packet("OK");
1643 break;
1644 default:
1645 put_packet("E22");
1646 break;
1647 }
1648}
1649
1650static void handle_insert_bp(GdbCmdContext *gdb_ctx, void *user_ctx)
1651{
1652 int res;
1653
1654 if (gdb_ctx->num_params != 3) {
1655 put_packet("E22");
1656 return;
1657 }
1658
1659 res = gdb_breakpoint_insert(gdb_ctx->params[0].val_ul,
1660 gdb_ctx->params[1].val_ull,
1661 gdb_ctx->params[2].val_ull);
1662 if (res >= 0) {
1663 put_packet("OK");
1664 return;
1665 } else if (res == -ENOSYS) {
1666 put_packet("");
1667 return;
1668 }
1669
1670 put_packet("E22");
1671}
1672
1673static void handle_remove_bp(GdbCmdContext *gdb_ctx, void *user_ctx)
1674{
1675 int res;
1676
1677 if (gdb_ctx->num_params != 3) {
1678 put_packet("E22");
1679 return;
1680 }
1681
1682 res = gdb_breakpoint_remove(gdb_ctx->params[0].val_ul,
1683 gdb_ctx->params[1].val_ull,
1684 gdb_ctx->params[2].val_ull);
1685 if (res >= 0) {
1686 put_packet("OK");
1687 return;
1688 } else if (res == -ENOSYS) {
1689 put_packet("");
1690 return;
1691 }
1692
1693 put_packet("E22");
1694}
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707static void handle_set_reg(GdbCmdContext *gdb_ctx, void *user_ctx)
1708{
1709 int reg_size;
1710
1711 if (!gdb_has_xml) {
1712 put_packet("");
1713 return;
1714 }
1715
1716 if (gdb_ctx->num_params != 2) {
1717 put_packet("E22");
1718 return;
1719 }
1720
1721 reg_size = strlen(gdb_ctx->params[1].data) / 2;
1722 hextomem(gdbserver_state.mem_buf, gdb_ctx->params[1].data, reg_size);
1723 gdb_write_register(gdbserver_state.g_cpu, gdbserver_state.mem_buf->data,
1724 gdb_ctx->params[0].val_ull);
1725 put_packet("OK");
1726}
1727
1728static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx)
1729{
1730 int reg_size;
1731
1732 if (!gdb_has_xml) {
1733 put_packet("");
1734 return;
1735 }
1736
1737 if (!gdb_ctx->num_params) {
1738 put_packet("E14");
1739 return;
1740 }
1741
1742 reg_size = gdb_read_register(gdbserver_state.g_cpu,
1743 gdbserver_state.mem_buf,
1744 gdb_ctx->params[0].val_ull);
1745 if (!reg_size) {
1746 put_packet("E14");
1747 return;
1748 } else {
1749 g_byte_array_set_size(gdbserver_state.mem_buf, reg_size);
1750 }
1751
1752 memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, reg_size);
1753 put_strbuf();
1754}
1755
1756static void handle_write_mem(GdbCmdContext *gdb_ctx, void *user_ctx)
1757{
1758 if (gdb_ctx->num_params != 3) {
1759 put_packet("E22");
1760 return;
1761 }
1762
1763
1764 if (gdb_ctx->params[1].val_ull > strlen(gdb_ctx->params[2].data) / 2) {
1765 put_packet("E22");
1766 return;
1767 }
1768
1769 hextomem(gdbserver_state.mem_buf, gdb_ctx->params[2].data,
1770 gdb_ctx->params[1].val_ull);
1771 if (target_memory_rw_debug(gdbserver_state.g_cpu, gdb_ctx->params[0].val_ull,
1772 gdbserver_state.mem_buf->data,
1773 gdbserver_state.mem_buf->len, true)) {
1774 put_packet("E14");
1775 return;
1776 }
1777
1778 put_packet("OK");
1779}
1780
1781static void handle_read_mem(GdbCmdContext *gdb_ctx, void *user_ctx)
1782{
1783 if (gdb_ctx->num_params != 2) {
1784 put_packet("E22");
1785 return;
1786 }
1787
1788
1789 if (gdb_ctx->params[1].val_ull > MAX_PACKET_LENGTH / 2) {
1790 put_packet("E22");
1791 return;
1792 }
1793
1794 g_byte_array_set_size(gdbserver_state.mem_buf, gdb_ctx->params[1].val_ull);
1795
1796 if (target_memory_rw_debug(gdbserver_state.g_cpu, gdb_ctx->params[0].val_ull,
1797 gdbserver_state.mem_buf->data,
1798 gdbserver_state.mem_buf->len, false)) {
1799 put_packet("E14");
1800 return;
1801 }
1802
1803 memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data,
1804 gdbserver_state.mem_buf->len);
1805 put_strbuf();
1806}
1807
1808static void handle_write_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx)
1809{
1810 target_ulong addr, len;
1811 uint8_t *registers;
1812 int reg_size;
1813
1814 if (!gdb_ctx->num_params) {
1815 return;
1816 }
1817
1818 cpu_synchronize_state(gdbserver_state.g_cpu);
1819 len = strlen(gdb_ctx->params[0].data) / 2;
1820 hextomem(gdbserver_state.mem_buf, gdb_ctx->params[0].data, len);
1821 registers = gdbserver_state.mem_buf->data;
1822 for (addr = 0; addr < gdbserver_state.g_cpu->gdb_num_g_regs && len > 0;
1823 addr++) {
1824 reg_size = gdb_write_register(gdbserver_state.g_cpu, registers, addr);
1825 len -= reg_size;
1826 registers += reg_size;
1827 }
1828 put_packet("OK");
1829}
1830
1831static void handle_read_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx)
1832{
1833 target_ulong addr, len;
1834
1835 cpu_synchronize_state(gdbserver_state.g_cpu);
1836 g_byte_array_set_size(gdbserver_state.mem_buf, 0);
1837 len = 0;
1838 for (addr = 0; addr < gdbserver_state.g_cpu->gdb_num_g_regs; addr++) {
1839 len += gdb_read_register(gdbserver_state.g_cpu,
1840 gdbserver_state.mem_buf,
1841 addr);
1842 }
1843 g_assert(len == gdbserver_state.mem_buf->len);
1844
1845 memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, len);
1846 put_strbuf();
1847}
1848
1849static void handle_file_io(GdbCmdContext *gdb_ctx, void *user_ctx)
1850{
1851 if (gdb_ctx->num_params >= 1 && gdbserver_state.current_syscall_cb) {
1852 target_ulong ret, err;
1853
1854 ret = (target_ulong)gdb_ctx->params[0].val_ull;
1855 if (gdb_ctx->num_params >= 2) {
1856 err = (target_ulong)gdb_ctx->params[1].val_ull;
1857 } else {
1858 err = 0;
1859 }
1860 gdbserver_state.current_syscall_cb(gdbserver_state.c_cpu, ret, err);
1861 gdbserver_state.current_syscall_cb = NULL;
1862 }
1863
1864 if (gdb_ctx->num_params >= 3 && gdb_ctx->params[2].opcode == (uint8_t)'C') {
1865 put_packet("T02");
1866 return;
1867 }
1868
1869 gdb_continue();
1870}
1871
1872static void handle_step(GdbCmdContext *gdb_ctx, void *user_ctx)
1873{
1874 if (gdb_ctx->num_params) {
1875 gdb_set_cpu_pc((target_ulong)gdb_ctx->params[0].val_ull);
1876 }
1877
1878 cpu_single_step(gdbserver_state.c_cpu, sstep_flags);
1879 gdb_continue();
1880}
1881
1882static void handle_v_cont_query(GdbCmdContext *gdb_ctx, void *user_ctx)
1883{
1884 put_packet("vCont;c;C;s;S");
1885}
1886
1887static void handle_v_cont(GdbCmdContext *gdb_ctx, void *user_ctx)
1888{
1889 int res;
1890
1891 if (!gdb_ctx->num_params) {
1892 return;
1893 }
1894
1895 res = gdb_handle_vcont(gdb_ctx->params[0].data);
1896 if ((res == -EINVAL) || (res == -ERANGE)) {
1897 put_packet("E22");
1898 } else if (res) {
1899 put_packet("");
1900 }
1901}
1902
1903static void handle_v_attach(GdbCmdContext *gdb_ctx, void *user_ctx)
1904{
1905 GDBProcess *process;
1906 CPUState *cpu;
1907
1908 g_string_assign(gdbserver_state.str_buf, "E22");
1909 if (!gdb_ctx->num_params) {
1910 goto cleanup;
1911 }
1912
1913 process = gdb_get_process(gdb_ctx->params[0].val_ul);
1914 if (!process) {
1915 goto cleanup;
1916 }
1917
1918 cpu = get_first_cpu_in_process(process);
1919 if (!cpu) {
1920 goto cleanup;
1921 }
1922
1923 process->attached = true;
1924 gdbserver_state.g_cpu = cpu;
1925 gdbserver_state.c_cpu = cpu;
1926
1927 g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TRAP);
1928 gdb_append_thread_id(cpu, gdbserver_state.str_buf);
1929 g_string_append_c(gdbserver_state.str_buf, ';');
1930cleanup:
1931 put_strbuf();
1932}
1933
1934static void handle_v_kill(GdbCmdContext *gdb_ctx, void *user_ctx)
1935{
1936
1937 put_packet("OK");
1938 error_report("QEMU: Terminated via GDBstub");
1939 exit(0);
1940}
1941
1942static GdbCmdParseEntry gdb_v_commands_table[] = {
1943
1944 {
1945 .handler = handle_v_cont_query,
1946 .cmd = "Cont?",
1947 .cmd_startswith = 1
1948 },
1949 {
1950 .handler = handle_v_cont,
1951 .cmd = "Cont",
1952 .cmd_startswith = 1,
1953 .schema = "s0"
1954 },
1955 {
1956 .handler = handle_v_attach,
1957 .cmd = "Attach;",
1958 .cmd_startswith = 1,
1959 .schema = "l0"
1960 },
1961 {
1962 .handler = handle_v_kill,
1963 .cmd = "Kill;",
1964 .cmd_startswith = 1
1965 },
1966};
1967
1968static void handle_v_commands(GdbCmdContext *gdb_ctx, void *user_ctx)
1969{
1970 if (!gdb_ctx->num_params) {
1971 return;
1972 }
1973
1974 if (process_string_cmd(NULL, gdb_ctx->params[0].data,
1975 gdb_v_commands_table,
1976 ARRAY_SIZE(gdb_v_commands_table))) {
1977 put_packet("");
1978 }
1979}
1980
1981static void handle_query_qemu_sstepbits(GdbCmdContext *gdb_ctx, void *user_ctx)
1982{
1983 g_string_printf(gdbserver_state.str_buf, "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1984 SSTEP_ENABLE, SSTEP_NOIRQ, SSTEP_NOTIMER);
1985 put_strbuf();
1986}
1987
1988static void handle_set_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx)
1989{
1990 if (!gdb_ctx->num_params) {
1991 return;
1992 }
1993
1994 sstep_flags = gdb_ctx->params[0].val_ul;
1995 put_packet("OK");
1996}
1997
1998static void handle_query_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx)
1999{
2000 g_string_printf(gdbserver_state.str_buf, "0x%x", sstep_flags);
2001 put_strbuf();
2002}
2003
2004static void handle_query_curr_tid(GdbCmdContext *gdb_ctx, void *user_ctx)
2005{
2006 CPUState *cpu;
2007 GDBProcess *process;
2008
2009
2010
2011
2012
2013
2014 process = gdb_get_cpu_process(gdbserver_state.g_cpu);
2015 cpu = get_first_cpu_in_process(process);
2016 g_string_assign(gdbserver_state.str_buf, "QC");
2017 gdb_append_thread_id(cpu, gdbserver_state.str_buf);
2018 put_strbuf();
2019}
2020
2021static void handle_query_threads(GdbCmdContext *gdb_ctx, void *user_ctx)
2022{
2023 if (!gdbserver_state.query_cpu) {
2024 put_packet("l");
2025 return;
2026 }
2027
2028 g_string_assign(gdbserver_state.str_buf, "m");
2029 gdb_append_thread_id(gdbserver_state.query_cpu, gdbserver_state.str_buf);
2030 put_strbuf();
2031 gdbserver_state.query_cpu = gdb_next_attached_cpu(gdbserver_state.query_cpu);
2032}
2033
2034static void handle_query_first_threads(GdbCmdContext *gdb_ctx, void *user_ctx)
2035{
2036 gdbserver_state.query_cpu = gdb_first_attached_cpu();
2037 handle_query_threads(gdb_ctx, user_ctx);
2038}
2039
2040static void handle_query_thread_extra(GdbCmdContext *gdb_ctx, void *user_ctx)
2041{
2042 g_autoptr(GString) rs = g_string_new(NULL);
2043 CPUState *cpu;
2044
2045 if (!gdb_ctx->num_params ||
2046 gdb_ctx->params[0].thread_id.kind == GDB_READ_THREAD_ERR) {
2047 put_packet("E22");
2048 return;
2049 }
2050
2051 cpu = gdb_get_cpu(gdb_ctx->params[0].thread_id.pid,
2052 gdb_ctx->params[0].thread_id.tid);
2053 if (!cpu) {
2054 return;
2055 }
2056
2057 cpu_synchronize_state(cpu);
2058
2059 if (gdbserver_state.multiprocess && (gdbserver_state.process_num > 1)) {
2060
2061 ObjectClass *oc = object_get_class(OBJECT(cpu));
2062 const char *cpu_model = object_class_get_name(oc);
2063 g_autofree char *cpu_name =
2064 object_get_canonical_path_component(OBJECT(cpu));
2065 g_string_printf(rs, "%s %s [%s]", cpu_model, cpu_name,
2066 cpu->halted ? "halted " : "running");
2067 } else {
2068 g_string_printf(rs, "CPU#%d [%s]", cpu->cpu_index,
2069 cpu->halted ? "halted " : "running");
2070 }
2071 trace_gdbstub_op_extra_info(rs->str);
2072 memtohex(gdbserver_state.str_buf, (uint8_t *)rs->str, rs->len);
2073 put_strbuf();
2074}
2075
2076#ifdef CONFIG_USER_ONLY
2077static void handle_query_offsets(GdbCmdContext *gdb_ctx, void *user_ctx)
2078{
2079 TaskState *ts;
2080
2081 ts = gdbserver_state.c_cpu->opaque;
2082 g_string_printf(gdbserver_state.str_buf,
2083 "Text=" TARGET_ABI_FMT_lx
2084 ";Data=" TARGET_ABI_FMT_lx
2085 ";Bss=" TARGET_ABI_FMT_lx,
2086 ts->info->code_offset,
2087 ts->info->data_offset,
2088 ts->info->data_offset);
2089 put_strbuf();
2090}
2091#else
2092static void handle_query_rcmd(GdbCmdContext *gdb_ctx, void *user_ctx)
2093{
2094 const guint8 zero = 0;
2095 int len;
2096
2097 if (!gdb_ctx->num_params) {
2098 put_packet("E22");
2099 return;
2100 }
2101
2102 len = strlen(gdb_ctx->params[0].data);
2103 if (len % 2) {
2104 put_packet("E01");
2105 return;
2106 }
2107
2108 g_assert(gdbserver_state.mem_buf->len == 0);
2109 len = len / 2;
2110 hextomem(gdbserver_state.mem_buf, gdb_ctx->params[0].data, len);
2111 g_byte_array_append(gdbserver_state.mem_buf, &zero, 1);
2112 qemu_chr_be_write(gdbserver_state.mon_chr, gdbserver_state.mem_buf->data,
2113 gdbserver_state.mem_buf->len);
2114 put_packet("OK");
2115}
2116#endif
2117
2118static void handle_query_supported(GdbCmdContext *gdb_ctx, void *user_ctx)
2119{
2120 CPUClass *cc;
2121
2122 g_string_printf(gdbserver_state.str_buf, "PacketSize=%x", MAX_PACKET_LENGTH);
2123 cc = CPU_GET_CLASS(first_cpu);
2124 if (cc->gdb_core_xml_file) {
2125 g_string_append(gdbserver_state.str_buf, ";qXfer:features:read+");
2126 }
2127
2128 if (gdb_ctx->num_params &&
2129 strstr(gdb_ctx->params[0].data, "multiprocess+")) {
2130 gdbserver_state.multiprocess = true;
2131 }
2132
2133 g_string_append(gdbserver_state.str_buf, ";vContSupported+;multiprocess+");
2134 put_strbuf();
2135}
2136
2137static void handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx)
2138{
2139 GDBProcess *process;
2140 CPUClass *cc;
2141 unsigned long len, total_len, addr;
2142 const char *xml;
2143 const char *p;
2144
2145 if (gdb_ctx->num_params < 3) {
2146 put_packet("E22");
2147 return;
2148 }
2149
2150 process = gdb_get_cpu_process(gdbserver_state.g_cpu);
2151 cc = CPU_GET_CLASS(gdbserver_state.g_cpu);
2152 if (!cc->gdb_core_xml_file) {
2153 put_packet("");
2154 return;
2155 }
2156
2157 gdb_has_xml = true;
2158 p = gdb_ctx->params[0].data;
2159 xml = get_feature_xml(p, &p, process);
2160 if (!xml) {
2161 put_packet("E00");
2162 return;
2163 }
2164
2165 addr = gdb_ctx->params[1].val_ul;
2166 len = gdb_ctx->params[2].val_ul;
2167 total_len = strlen(xml);
2168 if (addr > total_len) {
2169 put_packet("E00");
2170 return;
2171 }
2172
2173 if (len > (MAX_PACKET_LENGTH - 5) / 2) {
2174 len = (MAX_PACKET_LENGTH - 5) / 2;
2175 }
2176
2177 if (len < total_len - addr) {
2178 g_string_assign(gdbserver_state.str_buf, "m");
2179 memtox(gdbserver_state.str_buf, xml + addr, len);
2180 } else {
2181 g_string_assign(gdbserver_state.str_buf, "l");
2182 memtox(gdbserver_state.str_buf, xml + addr, total_len - addr);
2183 }
2184
2185 put_packet_binary(gdbserver_state.str_buf->str,
2186 gdbserver_state.str_buf->len, true);
2187}
2188
2189static void handle_query_attached(GdbCmdContext *gdb_ctx, void *user_ctx)
2190{
2191 put_packet(GDB_ATTACHED);
2192}
2193
2194static void handle_query_qemu_supported(GdbCmdContext *gdb_ctx, void *user_ctx)
2195{
2196 g_string_printf(gdbserver_state.str_buf, "sstepbits;sstep");
2197#ifndef CONFIG_USER_ONLY
2198 g_string_append(gdbserver_state.str_buf, ";PhyMemMode");
2199#endif
2200 put_strbuf();
2201}
2202
2203#ifndef CONFIG_USER_ONLY
2204static void handle_query_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx,
2205 void *user_ctx)
2206{
2207 g_string_printf(gdbserver_state.str_buf, "%d", phy_memory_mode);
2208 put_strbuf();
2209}
2210
2211static void handle_set_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx, void *user_ctx)
2212{
2213 if (!gdb_ctx->num_params) {
2214 put_packet("E22");
2215 return;
2216 }
2217
2218 if (!gdb_ctx->params[0].val_ul) {
2219 phy_memory_mode = 0;
2220 } else {
2221 phy_memory_mode = 1;
2222 }
2223 put_packet("OK");
2224}
2225#endif
2226
2227static GdbCmdParseEntry gdb_gen_query_set_common_table[] = {
2228
2229 {
2230 .handler = handle_query_qemu_sstepbits,
2231 .cmd = "qemu.sstepbits",
2232 },
2233 {
2234 .handler = handle_query_qemu_sstep,
2235 .cmd = "qemu.sstep",
2236 },
2237 {
2238 .handler = handle_set_qemu_sstep,
2239 .cmd = "qemu.sstep=",
2240 .cmd_startswith = 1,
2241 .schema = "l0"
2242 },
2243};
2244
2245static GdbCmdParseEntry gdb_gen_query_table[] = {
2246 {
2247 .handler = handle_query_curr_tid,
2248 .cmd = "C",
2249 },
2250 {
2251 .handler = handle_query_threads,
2252 .cmd = "sThreadInfo",
2253 },
2254 {
2255 .handler = handle_query_first_threads,
2256 .cmd = "fThreadInfo",
2257 },
2258 {
2259 .handler = handle_query_thread_extra,
2260 .cmd = "ThreadExtraInfo,",
2261 .cmd_startswith = 1,
2262 .schema = "t0"
2263 },
2264#ifdef CONFIG_USER_ONLY
2265 {
2266 .handler = handle_query_offsets,
2267 .cmd = "Offsets",
2268 },
2269#else
2270 {
2271 .handler = handle_query_rcmd,
2272 .cmd = "Rcmd,",
2273 .cmd_startswith = 1,
2274 .schema = "s0"
2275 },
2276#endif
2277 {
2278 .handler = handle_query_supported,
2279 .cmd = "Supported:",
2280 .cmd_startswith = 1,
2281 .schema = "s0"
2282 },
2283 {
2284 .handler = handle_query_supported,
2285 .cmd = "Supported",
2286 .schema = "s0"
2287 },
2288 {
2289 .handler = handle_query_xfer_features,
2290 .cmd = "Xfer:features:read:",
2291 .cmd_startswith = 1,
2292 .schema = "s:l,l0"
2293 },
2294 {
2295 .handler = handle_query_attached,
2296 .cmd = "Attached:",
2297 .cmd_startswith = 1
2298 },
2299 {
2300 .handler = handle_query_attached,
2301 .cmd = "Attached",
2302 },
2303 {
2304 .handler = handle_query_qemu_supported,
2305 .cmd = "qemu.Supported",
2306 },
2307#ifndef CONFIG_USER_ONLY
2308 {
2309 .handler = handle_query_qemu_phy_mem_mode,
2310 .cmd = "qemu.PhyMemMode",
2311 },
2312#endif
2313};
2314
2315static GdbCmdParseEntry gdb_gen_set_table[] = {
2316
2317 {
2318 .handler = handle_set_qemu_sstep,
2319 .cmd = "qemu.sstep:",
2320 .cmd_startswith = 1,
2321 .schema = "l0"
2322 },
2323#ifndef CONFIG_USER_ONLY
2324 {
2325 .handler = handle_set_qemu_phy_mem_mode,
2326 .cmd = "qemu.PhyMemMode:",
2327 .cmd_startswith = 1,
2328 .schema = "l0"
2329 },
2330#endif
2331};
2332
2333static void handle_gen_query(GdbCmdContext *gdb_ctx, void *user_ctx)
2334{
2335 if (!gdb_ctx->num_params) {
2336 return;
2337 }
2338
2339 if (!process_string_cmd(NULL, gdb_ctx->params[0].data,
2340 gdb_gen_query_set_common_table,
2341 ARRAY_SIZE(gdb_gen_query_set_common_table))) {
2342 return;
2343 }
2344
2345 if (process_string_cmd(NULL, gdb_ctx->params[0].data,
2346 gdb_gen_query_table,
2347 ARRAY_SIZE(gdb_gen_query_table))) {
2348 put_packet("");
2349 }
2350}
2351
2352static void handle_gen_set(GdbCmdContext *gdb_ctx, void *user_ctx)
2353{
2354 if (!gdb_ctx->num_params) {
2355 return;
2356 }
2357
2358 if (!process_string_cmd(NULL, gdb_ctx->params[0].data,
2359 gdb_gen_query_set_common_table,
2360 ARRAY_SIZE(gdb_gen_query_set_common_table))) {
2361 return;
2362 }
2363
2364 if (process_string_cmd(NULL, gdb_ctx->params[0].data,
2365 gdb_gen_set_table,
2366 ARRAY_SIZE(gdb_gen_set_table))) {
2367 put_packet("");
2368 }
2369}
2370
2371static void handle_target_halt(GdbCmdContext *gdb_ctx, void *user_ctx)
2372{
2373 g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TRAP);
2374 gdb_append_thread_id(gdbserver_state.c_cpu, gdbserver_state.str_buf);
2375 g_string_append_c(gdbserver_state.str_buf, ';');
2376 put_strbuf();
2377
2378
2379
2380
2381
2382 gdb_breakpoint_remove_all();
2383}
2384
2385static int gdb_handle_packet(const char *line_buf)
2386{
2387 const GdbCmdParseEntry *cmd_parser = NULL;
2388
2389 trace_gdbstub_io_command(line_buf);
2390
2391 switch (line_buf[0]) {
2392 case '!':
2393 put_packet("OK");
2394 break;
2395 case '?':
2396 {
2397 static const GdbCmdParseEntry target_halted_cmd_desc = {
2398 .handler = handle_target_halt,
2399 .cmd = "?",
2400 .cmd_startswith = 1
2401 };
2402 cmd_parser = &target_halted_cmd_desc;
2403 }
2404 break;
2405 case 'c':
2406 {
2407 static const GdbCmdParseEntry continue_cmd_desc = {
2408 .handler = handle_continue,
2409 .cmd = "c",
2410 .cmd_startswith = 1,
2411 .schema = "L0"
2412 };
2413 cmd_parser = &continue_cmd_desc;
2414 }
2415 break;
2416 case 'C':
2417 {
2418 static const GdbCmdParseEntry cont_with_sig_cmd_desc = {
2419 .handler = handle_cont_with_sig,
2420 .cmd = "C",
2421 .cmd_startswith = 1,
2422 .schema = "l0"
2423 };
2424 cmd_parser = &cont_with_sig_cmd_desc;
2425 }
2426 break;
2427 case 'v':
2428 {
2429 static const GdbCmdParseEntry v_cmd_desc = {
2430 .handler = handle_v_commands,
2431 .cmd = "v",
2432 .cmd_startswith = 1,
2433 .schema = "s0"
2434 };
2435 cmd_parser = &v_cmd_desc;
2436 }
2437 break;
2438 case 'k':
2439
2440 error_report("QEMU: Terminated via GDBstub");
2441 exit(0);
2442 case 'D':
2443 {
2444 static const GdbCmdParseEntry detach_cmd_desc = {
2445 .handler = handle_detach,
2446 .cmd = "D",
2447 .cmd_startswith = 1,
2448 .schema = "?.l0"
2449 };
2450 cmd_parser = &detach_cmd_desc;
2451 }
2452 break;
2453 case 's':
2454 {
2455 static const GdbCmdParseEntry step_cmd_desc = {
2456 .handler = handle_step,
2457 .cmd = "s",
2458 .cmd_startswith = 1,
2459 .schema = "L0"
2460 };
2461 cmd_parser = &step_cmd_desc;
2462 }
2463 break;
2464 case 'F':
2465 {
2466 static const GdbCmdParseEntry file_io_cmd_desc = {
2467 .handler = handle_file_io,
2468 .cmd = "F",
2469 .cmd_startswith = 1,
2470 .schema = "L,L,o0"
2471 };
2472 cmd_parser = &file_io_cmd_desc;
2473 }
2474 break;
2475 case 'g':
2476 {
2477 static const GdbCmdParseEntry read_all_regs_cmd_desc = {
2478 .handler = handle_read_all_regs,
2479 .cmd = "g",
2480 .cmd_startswith = 1
2481 };
2482 cmd_parser = &read_all_regs_cmd_desc;
2483 }
2484 break;
2485 case 'G':
2486 {
2487 static const GdbCmdParseEntry write_all_regs_cmd_desc = {
2488 .handler = handle_write_all_regs,
2489 .cmd = "G",
2490 .cmd_startswith = 1,
2491 .schema = "s0"
2492 };
2493 cmd_parser = &write_all_regs_cmd_desc;
2494 }
2495 break;
2496 case 'm':
2497 {
2498 static const GdbCmdParseEntry read_mem_cmd_desc = {
2499 .handler = handle_read_mem,
2500 .cmd = "m",
2501 .cmd_startswith = 1,
2502 .schema = "L,L0"
2503 };
2504 cmd_parser = &read_mem_cmd_desc;
2505 }
2506 break;
2507 case 'M':
2508 {
2509 static const GdbCmdParseEntry write_mem_cmd_desc = {
2510 .handler = handle_write_mem,
2511 .cmd = "M",
2512 .cmd_startswith = 1,
2513 .schema = "L,L:s0"
2514 };
2515 cmd_parser = &write_mem_cmd_desc;
2516 }
2517 break;
2518 case 'p':
2519 {
2520 static const GdbCmdParseEntry get_reg_cmd_desc = {
2521 .handler = handle_get_reg,
2522 .cmd = "p",
2523 .cmd_startswith = 1,
2524 .schema = "L0"
2525 };
2526 cmd_parser = &get_reg_cmd_desc;
2527 }
2528 break;
2529 case 'P':
2530 {
2531 static const GdbCmdParseEntry set_reg_cmd_desc = {
2532 .handler = handle_set_reg,
2533 .cmd = "P",
2534 .cmd_startswith = 1,
2535 .schema = "L?s0"
2536 };
2537 cmd_parser = &set_reg_cmd_desc;
2538 }
2539 break;
2540 case 'Z':
2541 {
2542 static const GdbCmdParseEntry insert_bp_cmd_desc = {
2543 .handler = handle_insert_bp,
2544 .cmd = "Z",
2545 .cmd_startswith = 1,
2546 .schema = "l?L?L0"
2547 };
2548 cmd_parser = &insert_bp_cmd_desc;
2549 }
2550 break;
2551 case 'z':
2552 {
2553 static const GdbCmdParseEntry remove_bp_cmd_desc = {
2554 .handler = handle_remove_bp,
2555 .cmd = "z",
2556 .cmd_startswith = 1,
2557 .schema = "l?L?L0"
2558 };
2559 cmd_parser = &remove_bp_cmd_desc;
2560 }
2561 break;
2562 case 'H':
2563 {
2564 static const GdbCmdParseEntry set_thread_cmd_desc = {
2565 .handler = handle_set_thread,
2566 .cmd = "H",
2567 .cmd_startswith = 1,
2568 .schema = "o.t0"
2569 };
2570 cmd_parser = &set_thread_cmd_desc;
2571 }
2572 break;
2573 case 'T':
2574 {
2575 static const GdbCmdParseEntry thread_alive_cmd_desc = {
2576 .handler = handle_thread_alive,
2577 .cmd = "T",
2578 .cmd_startswith = 1,
2579 .schema = "t0"
2580 };
2581 cmd_parser = &thread_alive_cmd_desc;
2582 }
2583 break;
2584 case 'q':
2585 {
2586 static const GdbCmdParseEntry gen_query_cmd_desc = {
2587 .handler = handle_gen_query,
2588 .cmd = "q",
2589 .cmd_startswith = 1,
2590 .schema = "s0"
2591 };
2592 cmd_parser = &gen_query_cmd_desc;
2593 }
2594 break;
2595 case 'Q':
2596 {
2597 static const GdbCmdParseEntry gen_set_cmd_desc = {
2598 .handler = handle_gen_set,
2599 .cmd = "Q",
2600 .cmd_startswith = 1,
2601 .schema = "s0"
2602 };
2603 cmd_parser = &gen_set_cmd_desc;
2604 }
2605 break;
2606 default:
2607
2608 put_packet("");
2609 break;
2610 }
2611
2612 if (cmd_parser) {
2613 run_cmd_parser(line_buf, cmd_parser);
2614 }
2615
2616 return RS_IDLE;
2617}
2618
2619void gdb_set_stop_cpu(CPUState *cpu)
2620{
2621 GDBProcess *p = gdb_get_cpu_process(cpu);
2622
2623 if (!p->attached) {
2624
2625
2626
2627
2628 return;
2629 }
2630
2631 gdbserver_state.c_cpu = cpu;
2632 gdbserver_state.g_cpu = cpu;
2633}
2634
2635#ifndef CONFIG_USER_ONLY
2636static void gdb_vm_state_change(void *opaque, int running, RunState state)
2637{
2638 CPUState *cpu = gdbserver_state.c_cpu;
2639 g_autoptr(GString) buf = g_string_new(NULL);
2640 g_autoptr(GString) tid = g_string_new(NULL);
2641 const char *type;
2642 int ret;
2643
2644 if (running || gdbserver_state.state == RS_INACTIVE) {
2645 return;
2646 }
2647
2648 if (gdbserver_state.current_syscall_cb) {
2649 put_packet(gdbserver_state.syscall_buf);
2650 return;
2651 }
2652
2653 if (cpu == NULL) {
2654
2655 return;
2656 }
2657
2658 gdb_append_thread_id(cpu, tid);
2659
2660 switch (state) {
2661 case RUN_STATE_DEBUG:
2662 if (cpu->watchpoint_hit) {
2663 switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
2664 case BP_MEM_READ:
2665 type = "r";
2666 break;
2667 case BP_MEM_ACCESS:
2668 type = "a";
2669 break;
2670 default:
2671 type = "";
2672 break;
2673 }
2674 trace_gdbstub_hit_watchpoint(type, cpu_gdb_index(cpu),
2675 (target_ulong)cpu->watchpoint_hit->vaddr);
2676 g_string_printf(buf, "T%02xthread:%s;%swatch:" TARGET_FMT_lx ";",
2677 GDB_SIGNAL_TRAP, tid->str, type,
2678 (target_ulong)cpu->watchpoint_hit->vaddr);
2679 cpu->watchpoint_hit = NULL;
2680 goto send_packet;
2681 } else {
2682 trace_gdbstub_hit_break();
2683 }
2684 tb_flush(cpu);
2685 ret = GDB_SIGNAL_TRAP;
2686 break;
2687 case RUN_STATE_PAUSED:
2688 trace_gdbstub_hit_paused();
2689 ret = GDB_SIGNAL_INT;
2690 break;
2691 case RUN_STATE_SHUTDOWN:
2692 trace_gdbstub_hit_shutdown();
2693 ret = GDB_SIGNAL_QUIT;
2694 break;
2695 case RUN_STATE_IO_ERROR:
2696 trace_gdbstub_hit_io_error();
2697 ret = GDB_SIGNAL_IO;
2698 break;
2699 case RUN_STATE_WATCHDOG:
2700 trace_gdbstub_hit_watchdog();
2701 ret = GDB_SIGNAL_ALRM;
2702 break;
2703 case RUN_STATE_INTERNAL_ERROR:
2704 trace_gdbstub_hit_internal_error();
2705 ret = GDB_SIGNAL_ABRT;
2706 break;
2707 case RUN_STATE_SAVE_VM:
2708 case RUN_STATE_RESTORE_VM:
2709 return;
2710 case RUN_STATE_FINISH_MIGRATE:
2711 ret = GDB_SIGNAL_XCPU;
2712 break;
2713 default:
2714 trace_gdbstub_hit_unknown(state);
2715 ret = GDB_SIGNAL_UNKNOWN;
2716 break;
2717 }
2718 gdb_set_stop_cpu(cpu);
2719 g_string_printf(buf, "T%02xthread:%s;", ret, tid->str);
2720
2721send_packet:
2722 put_packet(buf->str);
2723
2724
2725 cpu_single_step(cpu, 0);
2726}
2727#endif
2728
2729
2730
2731
2732
2733
2734void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
2735{
2736 char *p;
2737 char *p_end;
2738 target_ulong addr;
2739 uint64_t i64;
2740
2741 if (!gdbserver_state.init) {
2742 return;
2743 }
2744
2745 gdbserver_state.current_syscall_cb = cb;
2746#ifndef CONFIG_USER_ONLY
2747 vm_stop(RUN_STATE_DEBUG);
2748#endif
2749 p = &gdbserver_state.syscall_buf[0];
2750 p_end = &gdbserver_state.syscall_buf[sizeof(gdbserver_state.syscall_buf)];
2751 *(p++) = 'F';
2752 while (*fmt) {
2753 if (*fmt == '%') {
2754 fmt++;
2755 switch (*fmt++) {
2756 case 'x':
2757 addr = va_arg(va, target_ulong);
2758 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
2759 break;
2760 case 'l':
2761 if (*(fmt++) != 'x')
2762 goto bad_format;
2763 i64 = va_arg(va, uint64_t);
2764 p += snprintf(p, p_end - p, "%" PRIx64, i64);
2765 break;
2766 case 's':
2767 addr = va_arg(va, target_ulong);
2768 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
2769 addr, va_arg(va, int));
2770 break;
2771 default:
2772 bad_format:
2773 error_report("gdbstub: Bad syscall format string '%s'",
2774 fmt - 1);
2775 break;
2776 }
2777 } else {
2778 *(p++) = *(fmt++);
2779 }
2780 }
2781 *p = 0;
2782#ifdef CONFIG_USER_ONLY
2783 put_packet(gdbserver_state.syscall_buf);
2784
2785
2786
2787
2788
2789
2790 gdb_handlesig(gdbserver_state.c_cpu, 0);
2791#else
2792
2793
2794
2795
2796
2797
2798 qemu_cpu_kick(gdbserver_state.c_cpu);
2799#endif
2800}
2801
2802void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
2803{
2804 va_list va;
2805
2806 va_start(va, fmt);
2807 gdb_do_syscallv(cb, fmt, va);
2808 va_end(va);
2809}
2810
2811static void gdb_read_byte(uint8_t ch)
2812{
2813 uint8_t reply;
2814
2815#ifndef CONFIG_USER_ONLY
2816 if (gdbserver_state.last_packet->len) {
2817
2818
2819 if (ch == '-') {
2820 trace_gdbstub_err_got_nack();
2821 put_buffer(gdbserver_state.last_packet->data,
2822 gdbserver_state.last_packet->len);
2823 } else if (ch == '+') {
2824 trace_gdbstub_io_got_ack();
2825 } else {
2826 trace_gdbstub_io_got_unexpected(ch);
2827 }
2828
2829 if (ch == '+' || ch == '$') {
2830 g_byte_array_set_size(gdbserver_state.last_packet, 0);
2831 }
2832 if (ch != '$')
2833 return;
2834 }
2835 if (runstate_is_running()) {
2836
2837
2838 vm_stop(RUN_STATE_PAUSED);
2839 } else
2840#endif
2841 {
2842 switch(gdbserver_state.state) {
2843 case RS_IDLE:
2844 if (ch == '$') {
2845
2846 gdbserver_state.line_buf_index = 0;
2847 gdbserver_state.line_sum = 0;
2848 gdbserver_state.state = RS_GETLINE;
2849 } else {
2850 trace_gdbstub_err_garbage(ch);
2851 }
2852 break;
2853 case RS_GETLINE:
2854 if (ch == '}') {
2855
2856 gdbserver_state.state = RS_GETLINE_ESC;
2857 gdbserver_state.line_sum += ch;
2858 } else if (ch == '*') {
2859
2860 gdbserver_state.state = RS_GETLINE_RLE;
2861 gdbserver_state.line_sum += ch;
2862 } else if (ch == '#') {
2863
2864 gdbserver_state.state = RS_CHKSUM1;
2865 } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) {
2866 trace_gdbstub_err_overrun();
2867 gdbserver_state.state = RS_IDLE;
2868 } else {
2869
2870 gdbserver_state.line_buf[gdbserver_state.line_buf_index++] = ch;
2871 gdbserver_state.line_sum += ch;
2872 }
2873 break;
2874 case RS_GETLINE_ESC:
2875 if (ch == '#') {
2876
2877 gdbserver_state.state = RS_CHKSUM1;
2878 } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) {
2879
2880 trace_gdbstub_err_overrun();
2881 gdbserver_state.state = RS_IDLE;
2882 } else {
2883
2884 gdbserver_state.line_buf[gdbserver_state.line_buf_index++] = ch ^ 0x20;
2885 gdbserver_state.line_sum += ch;
2886 gdbserver_state.state = RS_GETLINE;
2887 }
2888 break;
2889 case RS_GETLINE_RLE:
2890
2891
2892
2893
2894 if (ch < ' ' || ch == '#' || ch == '$' || ch > 126) {
2895
2896 trace_gdbstub_err_invalid_repeat(ch);
2897 gdbserver_state.state = RS_GETLINE;
2898 } else {
2899
2900 int repeat = ch - ' ' + 3;
2901 if (gdbserver_state.line_buf_index + repeat >= sizeof(gdbserver_state.line_buf) - 1) {
2902
2903 trace_gdbstub_err_overrun();
2904 gdbserver_state.state = RS_IDLE;
2905 } else if (gdbserver_state.line_buf_index < 1) {
2906
2907 trace_gdbstub_err_invalid_rle();
2908 gdbserver_state.state = RS_GETLINE;
2909 } else {
2910
2911 memset(gdbserver_state.line_buf + gdbserver_state.line_buf_index,
2912 gdbserver_state.line_buf[gdbserver_state.line_buf_index - 1], repeat);
2913 gdbserver_state.line_buf_index += repeat;
2914 gdbserver_state.line_sum += ch;
2915 gdbserver_state.state = RS_GETLINE;
2916 }
2917 }
2918 break;
2919 case RS_CHKSUM1:
2920
2921 if (!isxdigit(ch)) {
2922 trace_gdbstub_err_checksum_invalid(ch);
2923 gdbserver_state.state = RS_GETLINE;
2924 break;
2925 }
2926 gdbserver_state.line_buf[gdbserver_state.line_buf_index] = '\0';
2927 gdbserver_state.line_csum = fromhex(ch) << 4;
2928 gdbserver_state.state = RS_CHKSUM2;
2929 break;
2930 case RS_CHKSUM2:
2931
2932 if (!isxdigit(ch)) {
2933 trace_gdbstub_err_checksum_invalid(ch);
2934 gdbserver_state.state = RS_GETLINE;
2935 break;
2936 }
2937 gdbserver_state.line_csum |= fromhex(ch);
2938
2939 if (gdbserver_state.line_csum != (gdbserver_state.line_sum & 0xff)) {
2940 trace_gdbstub_err_checksum_incorrect(gdbserver_state.line_sum, gdbserver_state.line_csum);
2941
2942 reply = '-';
2943 put_buffer(&reply, 1);
2944 gdbserver_state.state = RS_IDLE;
2945 } else {
2946
2947 reply = '+';
2948 put_buffer(&reply, 1);
2949 gdbserver_state.state = gdb_handle_packet(gdbserver_state.line_buf);
2950 }
2951 break;
2952 default:
2953 abort();
2954 }
2955 }
2956}
2957
2958
2959void gdb_exit(CPUArchState *env, int code)
2960{
2961 char buf[4];
2962
2963 if (!gdbserver_state.init) {
2964 return;
2965 }
2966#ifdef CONFIG_USER_ONLY
2967 if (gdbserver_fd < 0 || gdbserver_state.fd < 0) {
2968 return;
2969 }
2970#endif
2971
2972 trace_gdbstub_op_exiting((uint8_t)code);
2973
2974 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2975 put_packet(buf);
2976
2977#ifndef CONFIG_USER_ONLY
2978 qemu_chr_fe_deinit(&gdbserver_state.chr, true);
2979#endif
2980}
2981
2982
2983
2984
2985
2986
2987static void create_default_process(GDBState *s)
2988{
2989 GDBProcess *process;
2990 int max_pid = 0;
2991
2992 if (gdbserver_state.process_num) {
2993 max_pid = s->processes[s->process_num - 1].pid;
2994 }
2995
2996 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
2997 process = &s->processes[s->process_num - 1];
2998
2999
3000 assert(max_pid < UINT32_MAX);
3001
3002 process->pid = max_pid + 1;
3003 process->attached = false;
3004 process->target_xml[0] = '\0';
3005}
3006
3007#ifdef CONFIG_USER_ONLY
3008int
3009gdb_handlesig(CPUState *cpu, int sig)
3010{
3011 char buf[256];
3012 int n;
3013
3014 if (gdbserver_fd < 0 || gdbserver_state.fd < 0) {
3015 return sig;
3016 }
3017
3018
3019 cpu_single_step(cpu, 0);
3020 tb_flush(cpu);
3021
3022 if (sig != 0) {
3023 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
3024 put_packet(buf);
3025 }
3026
3027
3028 if (gdbserver_state.fd < 0) {
3029 return sig;
3030 }
3031
3032 sig = 0;
3033 gdbserver_state.state = RS_IDLE;
3034 gdbserver_state.running_state = 0;
3035 while (gdbserver_state.running_state == 0) {
3036 n = read(gdbserver_state.fd, buf, 256);
3037 if (n > 0) {
3038 int i;
3039
3040 for (i = 0; i < n; i++) {
3041 gdb_read_byte(buf[i]);
3042 }
3043 } else {
3044
3045
3046 if (n == 0) {
3047 close(gdbserver_state.fd);
3048 }
3049 gdbserver_state.fd = -1;
3050 return sig;
3051 }
3052 }
3053 sig = gdbserver_state.signal;
3054 gdbserver_state.signal = 0;
3055 return sig;
3056}
3057
3058
3059void gdb_signalled(CPUArchState *env, int sig)
3060{
3061 char buf[4];
3062
3063 if (gdbserver_fd < 0 || gdbserver_state.fd < 0) {
3064 return;
3065 }
3066
3067 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
3068 put_packet(buf);
3069}
3070
3071static bool gdb_accept(void)
3072{
3073 struct sockaddr_in sockaddr;
3074 socklen_t len;
3075 int fd;
3076
3077 for(;;) {
3078 len = sizeof(sockaddr);
3079 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
3080 if (fd < 0 && errno != EINTR) {
3081 perror("accept");
3082 return false;
3083 } else if (fd >= 0) {
3084 qemu_set_cloexec(fd);
3085 break;
3086 }
3087 }
3088
3089
3090 if (socket_set_nodelay(fd)) {
3091 perror("setsockopt");
3092 close(fd);
3093 return false;
3094 }
3095
3096 init_gdbserver_state();
3097 create_default_process(&gdbserver_state);
3098 gdbserver_state.processes[0].attached = true;
3099 gdbserver_state.c_cpu = gdb_first_attached_cpu();
3100 gdbserver_state.g_cpu = gdbserver_state.c_cpu;
3101 gdbserver_state.fd = fd;
3102 gdb_has_xml = false;
3103 return true;
3104}
3105
3106static int gdbserver_open(int port)
3107{
3108 struct sockaddr_in sockaddr;
3109 int fd, ret;
3110
3111 fd = socket(PF_INET, SOCK_STREAM, 0);
3112 if (fd < 0) {
3113 perror("socket");
3114 return -1;
3115 }
3116 qemu_set_cloexec(fd);
3117
3118 socket_set_fast_reuse(fd);
3119
3120 sockaddr.sin_family = AF_INET;
3121 sockaddr.sin_port = htons(port);
3122 sockaddr.sin_addr.s_addr = 0;
3123 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
3124 if (ret < 0) {
3125 perror("bind");
3126 close(fd);
3127 return -1;
3128 }
3129 ret = listen(fd, 1);
3130 if (ret < 0) {
3131 perror("listen");
3132 close(fd);
3133 return -1;
3134 }
3135 return fd;
3136}
3137
3138int gdbserver_start(int port)
3139{
3140 gdbserver_fd = gdbserver_open(port);
3141 if (gdbserver_fd < 0)
3142 return -1;
3143
3144 if (!gdb_accept()) {
3145 close(gdbserver_fd);
3146 gdbserver_fd = -1;
3147 return -1;
3148 }
3149 return 0;
3150}
3151
3152
3153void gdbserver_fork(CPUState *cpu)
3154{
3155 if (gdbserver_fd < 0 || gdbserver_state.fd < 0) {
3156 return;
3157 }
3158 close(gdbserver_state.fd);
3159 gdbserver_state.fd = -1;
3160 cpu_breakpoint_remove_all(cpu, BP_GDB);
3161 cpu_watchpoint_remove_all(cpu, BP_GDB);
3162}
3163#else
3164static int gdb_chr_can_receive(void *opaque)
3165{
3166
3167
3168 return MAX_PACKET_LENGTH;
3169}
3170
3171static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
3172{
3173 int i;
3174
3175 for (i = 0; i < size; i++) {
3176 gdb_read_byte(buf[i]);
3177 }
3178}
3179
3180static void gdb_chr_event(void *opaque, QEMUChrEvent event)
3181{
3182 int i;
3183 GDBState *s = (GDBState *) opaque;
3184
3185 switch (event) {
3186 case CHR_EVENT_OPENED:
3187
3188 for (i = 0; i < s->process_num; i++) {
3189 s->processes[i].attached = !i;
3190 }
3191
3192 s->c_cpu = gdb_first_attached_cpu();
3193 s->g_cpu = s->c_cpu;
3194
3195 vm_stop(RUN_STATE_PAUSED);
3196 gdb_has_xml = false;
3197 break;
3198 default:
3199 break;
3200 }
3201}
3202
3203static int gdb_monitor_write(Chardev *chr, const uint8_t *buf, int len)
3204{
3205 g_autoptr(GString) hex_buf = g_string_new("O");
3206 memtohex(hex_buf, buf, len);
3207 put_packet(hex_buf->str);
3208 return len;
3209}
3210
3211#ifndef _WIN32
3212static void gdb_sigterm_handler(int signal)
3213{
3214 if (runstate_is_running()) {
3215 vm_stop(RUN_STATE_PAUSED);
3216 }
3217}
3218#endif
3219
3220static void gdb_monitor_open(Chardev *chr, ChardevBackend *backend,
3221 bool *be_opened, Error **errp)
3222{
3223 *be_opened = false;
3224}
3225
3226static void char_gdb_class_init(ObjectClass *oc, void *data)
3227{
3228 ChardevClass *cc = CHARDEV_CLASS(oc);
3229
3230 cc->internal = true;
3231 cc->open = gdb_monitor_open;
3232 cc->chr_write = gdb_monitor_write;
3233}
3234
3235#define TYPE_CHARDEV_GDB "chardev-gdb"
3236
3237static const TypeInfo char_gdb_type_info = {
3238 .name = TYPE_CHARDEV_GDB,
3239 .parent = TYPE_CHARDEV,
3240 .class_init = char_gdb_class_init,
3241};
3242
3243static int find_cpu_clusters(Object *child, void *opaque)
3244{
3245 if (object_dynamic_cast(child, TYPE_CPU_CLUSTER)) {
3246 GDBState *s = (GDBState *) opaque;
3247 CPUClusterState *cluster = CPU_CLUSTER(child);
3248 GDBProcess *process;
3249
3250 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
3251
3252 process = &s->processes[s->process_num - 1];
3253
3254
3255
3256
3257
3258
3259 assert(cluster->cluster_id != UINT32_MAX);
3260 process->pid = cluster->cluster_id + 1;
3261 process->attached = false;
3262 process->target_xml[0] = '\0';
3263
3264 return 0;
3265 }
3266
3267 return object_child_foreach(child, find_cpu_clusters, opaque);
3268}
3269
3270static int pid_order(const void *a, const void *b)
3271{
3272 GDBProcess *pa = (GDBProcess *) a;
3273 GDBProcess *pb = (GDBProcess *) b;
3274
3275 if (pa->pid < pb->pid) {
3276 return -1;
3277 } else if (pa->pid > pb->pid) {
3278 return 1;
3279 } else {
3280 return 0;
3281 }
3282}
3283
3284static void create_processes(GDBState *s)
3285{
3286 object_child_foreach(object_get_root(), find_cpu_clusters, s);
3287
3288 if (gdbserver_state.processes) {
3289
3290 qsort(gdbserver_state.processes, gdbserver_state.process_num, sizeof(gdbserver_state.processes[0]), pid_order);
3291 }
3292
3293 create_default_process(s);
3294}
3295
3296int gdbserver_start(const char *device)
3297{
3298 trace_gdbstub_op_start(device);
3299
3300 char gdbstub_device_name[128];
3301 Chardev *chr = NULL;
3302 Chardev *mon_chr;
3303
3304 if (!first_cpu) {
3305 error_report("gdbstub: meaningless to attach gdb to a "
3306 "machine without any CPU.");
3307 return -1;
3308 }
3309
3310 if (!device)
3311 return -1;
3312 if (strcmp(device, "none") != 0) {
3313 if (strstart(device, "tcp:", NULL)) {
3314
3315 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
3316 "%s,nowait,nodelay,server", device);
3317 device = gdbstub_device_name;
3318 }
3319#ifndef _WIN32
3320 else if (strcmp(device, "stdio") == 0) {
3321 struct sigaction act;
3322
3323 memset(&act, 0, sizeof(act));
3324 act.sa_handler = gdb_sigterm_handler;
3325 sigaction(SIGINT, &act, NULL);
3326 }
3327#endif
3328
3329
3330
3331
3332 chr = qemu_chr_new_noreplay("gdb", device, true, NULL);
3333 if (!chr)
3334 return -1;
3335 }
3336
3337 if (!gdbserver_state.init) {
3338 init_gdbserver_state();
3339
3340 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3341
3342
3343 mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
3344 NULL, NULL, &error_abort);
3345 monitor_init_hmp(mon_chr, false, &error_abort);
3346 } else {
3347 qemu_chr_fe_deinit(&gdbserver_state.chr, true);
3348 mon_chr = gdbserver_state.mon_chr;
3349 reset_gdbserver_state();
3350 }
3351
3352 create_processes(&gdbserver_state);
3353
3354 if (chr) {
3355 qemu_chr_fe_init(&gdbserver_state.chr, chr, &error_abort);
3356 qemu_chr_fe_set_handlers(&gdbserver_state.chr, gdb_chr_can_receive,
3357 gdb_chr_receive, gdb_chr_event,
3358 NULL, &gdbserver_state, NULL, true);
3359 }
3360 gdbserver_state.state = chr ? RS_IDLE : RS_INACTIVE;
3361 gdbserver_state.mon_chr = mon_chr;
3362 gdbserver_state.current_syscall_cb = NULL;
3363
3364 return 0;
3365}
3366
3367void gdbserver_cleanup(void)
3368{
3369 if (gdbserver_state.init) {
3370 put_packet("W00");
3371 }
3372}
3373
3374static void register_types(void)
3375{
3376 type_register_static(&char_gdb_type_info);
3377}
3378
3379type_init(register_types);
3380#endif
3381