blob: d54abd17cc29ea9f6d7a7a9952aa12217e33463c [file] [log] [blame]
bellardb4608c02003-06-27 17:34:32 +00001/*
2 * gdb server stub
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard34751872005-07-02 14:31:34 +00004 * Copyright (c) 2003-2005 Fabrice Bellard
bellardb4608c02003-06-27 17:34:32 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
Blue Swirl8167ee82009-07-16 20:47:01 +000017 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
bellardb4608c02003-06-27 17:34:32 +000018 */
Peter Maydelld38ea872016-01-29 17:50:05 +000019#include "qemu/osdep.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010020#include "qapi/error.h"
Ziyue Yang508b4ec2017-01-18 16:02:41 +080021#include "qemu/error-report.h"
Veronia Bahaaf348b6d2016-03-20 19:16:19 +020022#include "qemu/cutils.h"
Doug Gale5c9522b2017-12-02 20:30:37 -050023#include "trace-root.h"
Veronia Bahaaf348b6d2016-03-20 19:16:19 +020024#ifdef CONFIG_USER_ONLY
bellard1fddef42005-04-17 19:16:13 +000025#include "qemu.h"
26#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010027#include "monitor/monitor.h"
Marc-André Lureau8228e352017-01-26 17:19:46 +040028#include "chardev/char.h"
Marc-André Lureau4d43a602017-01-26 18:26:44 +040029#include "chardev/char-fe.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010030#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010031#include "exec/gdbstub.h"
Luc Michel8f468632019-01-07 15:23:45 +000032#include "hw/cpu/cluster.h"
bellard1fddef42005-04-17 19:16:13 +000033#endif
bellard67b915a2004-03-31 23:37:16 +000034
pbrook56aebc82008-10-11 17:55:29 +000035#define MAX_PACKET_LENGTH 4096
36
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010037#include "qemu/sockets.h"
Vincent Palatinb3946622017-01-10 11:59:55 +010038#include "sysemu/hw_accel.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010039#include "sysemu/kvm.h"
Leon Alraecfe67ce2015-06-19 14:17:45 +010040#include "exec/semihost.h"
Paolo Bonzini63c91552016-03-15 13:18:37 +010041#include "exec/exec-all.h"
aurel32ca587a82008-12-18 22:44:13 +000042
Jan Kiszkaa3919382015-02-07 09:38:44 +010043#ifdef CONFIG_USER_ONLY
44#define GDB_ATTACHED "0"
45#else
46#define GDB_ATTACHED "1"
47#endif
48
Andreas Färberf3659ee2013-06-27 19:09:09 +020049static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
50 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020051{
Andreas Färberf3659ee2013-06-27 19:09:09 +020052 CPUClass *cc = CPU_GET_CLASS(cpu);
53
54 if (cc->memory_rw_debug) {
55 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
56 }
57 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020058}
aurel32ca587a82008-12-18 22:44:13 +000059
Alex Bennéed2a6c852017-07-12 11:52:14 +010060/* Return the GDB index for a given vCPU state.
61 *
62 * For user mode this is simply the thread id. In system mode GDB
63 * numbers CPUs from 1 as 0 is reserved as an "any cpu" index.
64 */
65static inline int cpu_gdb_index(CPUState *cpu)
66{
67#if defined(CONFIG_USER_ONLY)
Alex Bennéebd88c782017-07-12 11:52:15 +010068 TaskState *ts = (TaskState *) cpu->opaque;
69 return ts->ts_tid;
Alex Bennéed2a6c852017-07-12 11:52:14 +010070#else
71 return cpu->cpu_index + 1;
72#endif
73}
74
aurel32ca587a82008-12-18 22:44:13 +000075enum {
76 GDB_SIGNAL_0 = 0,
77 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010078 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000079 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010080 GDB_SIGNAL_ABRT = 6,
81 GDB_SIGNAL_ALRM = 14,
82 GDB_SIGNAL_IO = 23,
83 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000084 GDB_SIGNAL_UNKNOWN = 143
85};
86
87#ifdef CONFIG_USER_ONLY
88
89/* Map target signal numbers to GDB protocol signal numbers and vice
90 * versa. For user emulation's currently supported systems, we can
91 * assume most signals are defined.
92 */
93
94static int gdb_signal_table[] = {
95 0,
96 TARGET_SIGHUP,
97 TARGET_SIGINT,
98 TARGET_SIGQUIT,
99 TARGET_SIGILL,
100 TARGET_SIGTRAP,
101 TARGET_SIGABRT,
102 -1, /* SIGEMT */
103 TARGET_SIGFPE,
104 TARGET_SIGKILL,
105 TARGET_SIGBUS,
106 TARGET_SIGSEGV,
107 TARGET_SIGSYS,
108 TARGET_SIGPIPE,
109 TARGET_SIGALRM,
110 TARGET_SIGTERM,
111 TARGET_SIGURG,
112 TARGET_SIGSTOP,
113 TARGET_SIGTSTP,
114 TARGET_SIGCONT,
115 TARGET_SIGCHLD,
116 TARGET_SIGTTIN,
117 TARGET_SIGTTOU,
118 TARGET_SIGIO,
119 TARGET_SIGXCPU,
120 TARGET_SIGXFSZ,
121 TARGET_SIGVTALRM,
122 TARGET_SIGPROF,
123 TARGET_SIGWINCH,
124 -1, /* SIGLOST */
125 TARGET_SIGUSR1,
126 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000127#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000128 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000129#else
130 -1,
131#endif
aurel32ca587a82008-12-18 22:44:13 +0000132 -1, /* SIGPOLL */
133 -1,
134 -1,
135 -1,
136 -1,
137 -1,
138 -1,
139 -1,
140 -1,
141 -1,
142 -1,
143 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000144#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000145 __SIGRTMIN + 1,
146 __SIGRTMIN + 2,
147 __SIGRTMIN + 3,
148 __SIGRTMIN + 4,
149 __SIGRTMIN + 5,
150 __SIGRTMIN + 6,
151 __SIGRTMIN + 7,
152 __SIGRTMIN + 8,
153 __SIGRTMIN + 9,
154 __SIGRTMIN + 10,
155 __SIGRTMIN + 11,
156 __SIGRTMIN + 12,
157 __SIGRTMIN + 13,
158 __SIGRTMIN + 14,
159 __SIGRTMIN + 15,
160 __SIGRTMIN + 16,
161 __SIGRTMIN + 17,
162 __SIGRTMIN + 18,
163 __SIGRTMIN + 19,
164 __SIGRTMIN + 20,
165 __SIGRTMIN + 21,
166 __SIGRTMIN + 22,
167 __SIGRTMIN + 23,
168 __SIGRTMIN + 24,
169 __SIGRTMIN + 25,
170 __SIGRTMIN + 26,
171 __SIGRTMIN + 27,
172 __SIGRTMIN + 28,
173 __SIGRTMIN + 29,
174 __SIGRTMIN + 30,
175 __SIGRTMIN + 31,
176 -1, /* SIGCANCEL */
177 __SIGRTMIN,
178 __SIGRTMIN + 32,
179 __SIGRTMIN + 33,
180 __SIGRTMIN + 34,
181 __SIGRTMIN + 35,
182 __SIGRTMIN + 36,
183 __SIGRTMIN + 37,
184 __SIGRTMIN + 38,
185 __SIGRTMIN + 39,
186 __SIGRTMIN + 40,
187 __SIGRTMIN + 41,
188 __SIGRTMIN + 42,
189 __SIGRTMIN + 43,
190 __SIGRTMIN + 44,
191 __SIGRTMIN + 45,
192 __SIGRTMIN + 46,
193 __SIGRTMIN + 47,
194 __SIGRTMIN + 48,
195 __SIGRTMIN + 49,
196 __SIGRTMIN + 50,
197 __SIGRTMIN + 51,
198 __SIGRTMIN + 52,
199 __SIGRTMIN + 53,
200 __SIGRTMIN + 54,
201 __SIGRTMIN + 55,
202 __SIGRTMIN + 56,
203 __SIGRTMIN + 57,
204 __SIGRTMIN + 58,
205 __SIGRTMIN + 59,
206 __SIGRTMIN + 60,
207 __SIGRTMIN + 61,
208 __SIGRTMIN + 62,
209 __SIGRTMIN + 63,
210 __SIGRTMIN + 64,
211 __SIGRTMIN + 65,
212 __SIGRTMIN + 66,
213 __SIGRTMIN + 67,
214 __SIGRTMIN + 68,
215 __SIGRTMIN + 69,
216 __SIGRTMIN + 70,
217 __SIGRTMIN + 71,
218 __SIGRTMIN + 72,
219 __SIGRTMIN + 73,
220 __SIGRTMIN + 74,
221 __SIGRTMIN + 75,
222 __SIGRTMIN + 76,
223 __SIGRTMIN + 77,
224 __SIGRTMIN + 78,
225 __SIGRTMIN + 79,
226 __SIGRTMIN + 80,
227 __SIGRTMIN + 81,
228 __SIGRTMIN + 82,
229 __SIGRTMIN + 83,
230 __SIGRTMIN + 84,
231 __SIGRTMIN + 85,
232 __SIGRTMIN + 86,
233 __SIGRTMIN + 87,
234 __SIGRTMIN + 88,
235 __SIGRTMIN + 89,
236 __SIGRTMIN + 90,
237 __SIGRTMIN + 91,
238 __SIGRTMIN + 92,
239 __SIGRTMIN + 93,
240 __SIGRTMIN + 94,
241 __SIGRTMIN + 95,
242 -1, /* SIGINFO */
243 -1, /* UNKNOWN */
244 -1, /* DEFAULT */
245 -1,
246 -1,
247 -1,
248 -1,
249 -1,
250 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000251#endif
aurel32ca587a82008-12-18 22:44:13 +0000252};
bellard8f447cc2006-06-14 15:21:14 +0000253#else
aurel32ca587a82008-12-18 22:44:13 +0000254/* In system mode we only need SIGINT and SIGTRAP; other signals
255 are not yet supported. */
256
257enum {
258 TARGET_SIGINT = 2,
259 TARGET_SIGTRAP = 5
260};
261
262static int gdb_signal_table[] = {
263 -1,
264 -1,
265 TARGET_SIGINT,
266 -1,
267 -1,
268 TARGET_SIGTRAP
269};
bellard8f447cc2006-06-14 15:21:14 +0000270#endif
bellardb4608c02003-06-27 17:34:32 +0000271
aurel32ca587a82008-12-18 22:44:13 +0000272#ifdef CONFIG_USER_ONLY
273static int target_signal_to_gdb (int sig)
274{
275 int i;
276 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
277 if (gdb_signal_table[i] == sig)
278 return i;
279 return GDB_SIGNAL_UNKNOWN;
280}
281#endif
282
283static int gdb_signal_to_target (int sig)
284{
285 if (sig < ARRAY_SIZE (gdb_signal_table))
286 return gdb_signal_table[sig];
287 else
288 return -1;
289}
290
pbrook56aebc82008-10-11 17:55:29 +0000291typedef struct GDBRegisterState {
292 int base_reg;
293 int num_regs;
294 gdb_reg_cb get_reg;
295 gdb_reg_cb set_reg;
296 const char *xml;
297 struct GDBRegisterState *next;
298} GDBRegisterState;
299
Luc Michel8f468632019-01-07 15:23:45 +0000300typedef struct GDBProcess {
301 uint32_t pid;
302 bool attached;
Luc Michelc145eea2019-01-07 15:23:46 +0000303
304 char target_xml[1024];
Luc Michel8f468632019-01-07 15:23:45 +0000305} GDBProcess;
306
bellard858693c2004-03-31 18:52:07 +0000307enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000308 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000309 RS_IDLE,
310 RS_GETLINE,
Doug Gale4bf43122017-05-01 12:22:10 -0400311 RS_GETLINE_ESC,
312 RS_GETLINE_RLE,
bellard858693c2004-03-31 18:52:07 +0000313 RS_CHKSUM1,
314 RS_CHKSUM2,
315};
bellard858693c2004-03-31 18:52:07 +0000316typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200317 CPUState *c_cpu; /* current CPU for step/continue ops */
318 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200319 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000320 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000321 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000322 int line_buf_index;
Doug Gale4bf43122017-05-01 12:22:10 -0400323 int line_sum; /* running checksum */
324 int line_csum; /* checksum at the end of the packet */
pbrook56aebc82008-10-11 17:55:29 +0000325 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000326 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000327 int signal;
bellard41625032005-04-24 10:07:11 +0000328#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000329 int fd;
bellard41625032005-04-24 10:07:11 +0000330 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000331#else
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +0300332 CharBackend chr;
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +0300333 Chardev *mon_chr;
bellard41625032005-04-24 10:07:11 +0000334#endif
Luc Michel8f468632019-01-07 15:23:45 +0000335 bool multiprocess;
336 GDBProcess *processes;
337 int process_num;
Meador Ingecdb432b2012-03-15 17:49:45 +0000338 char syscall_buf[256];
339 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000340} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000341
edgar_igl60897d32008-05-09 08:25:14 +0000342/* By default use no IRQs and no timers while single stepping so as to
343 * make single stepping like an ICE HW step.
344 */
345static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
346
aliguori880a7572008-11-18 20:30:24 +0000347static GDBState *gdbserver_state;
348
Andreas Färber5b50e792013-06-29 04:18:45 +0200349bool gdb_has_xml;
pbrook56aebc82008-10-11 17:55:29 +0000350
bellard1fddef42005-04-17 19:16:13 +0000351#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000352/* XXX: This is not thread safe. Do we care? */
353static int gdbserver_fd = -1;
354
bellard858693c2004-03-31 18:52:07 +0000355static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000356{
357 uint8_t ch;
358 int ret;
359
360 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000361 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000362 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000363 if (errno == ECONNRESET)
364 s->fd = -1;
Peter Wu5819e3e2016-06-05 16:35:48 +0200365 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000366 return -1;
367 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000368 close(s->fd);
369 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000370 return -1;
371 } else {
372 break;
373 }
374 }
375 return ch;
376}
pbrook4046d912007-01-28 01:53:16 +0000377#endif
bellardb4608c02003-06-27 17:34:32 +0000378
blueswir1654efcf2009-04-18 07:29:59 +0000379static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000380 GDB_SYS_UNKNOWN,
381 GDB_SYS_ENABLED,
382 GDB_SYS_DISABLED,
383} gdb_syscall_mode;
384
Liviu Ionescua38bb072014-12-11 12:07:48 +0000385/* Decide if either remote gdb syscalls or native file IO should be used. */
pbrooka2d1eba2007-01-28 03:10:55 +0000386int use_gdb_syscalls(void)
387{
Leon Alraecfe67ce2015-06-19 14:17:45 +0100388 SemihostingTarget target = semihosting_get_target();
389 if (target == SEMIHOSTING_TARGET_NATIVE) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000390 /* -semihosting-config target=native */
391 return false;
Leon Alraecfe67ce2015-06-19 14:17:45 +0100392 } else if (target == SEMIHOSTING_TARGET_GDB) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000393 /* -semihosting-config target=gdb */
394 return true;
395 }
396
397 /* -semihosting-config target=auto */
398 /* On the first call check if gdb is connected and remember. */
pbrooka2d1eba2007-01-28 03:10:55 +0000399 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000400 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
401 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000402 }
403 return gdb_syscall_mode == GDB_SYS_ENABLED;
404}
405
edgar_iglba70a622008-03-14 06:10:42 +0000406/* Resume execution. */
407static inline void gdb_continue(GDBState *s)
408{
Doug Gale5c9522b2017-12-02 20:30:37 -0500409
edgar_iglba70a622008-03-14 06:10:42 +0000410#ifdef CONFIG_USER_ONLY
411 s->running_state = 1;
Doug Gale5c9522b2017-12-02 20:30:37 -0500412 trace_gdbstub_op_continue();
edgar_iglba70a622008-03-14 06:10:42 +0000413#else
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200414 if (!runstate_needs_reset()) {
Doug Gale5c9522b2017-12-02 20:30:37 -0500415 trace_gdbstub_op_continue();
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200416 vm_start();
417 }
edgar_iglba70a622008-03-14 06:10:42 +0000418#endif
419}
420
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100421/*
422 * Resume execution, per CPU actions. For user-mode emulation it's
423 * equivalent to gdb_continue.
424 */
425static int gdb_continue_partial(GDBState *s, char *newstates)
426{
427 CPUState *cpu;
428 int res = 0;
429#ifdef CONFIG_USER_ONLY
430 /*
431 * This is not exactly accurate, but it's an improvement compared to the
432 * previous situation, where only one CPU would be single-stepped.
433 */
434 CPU_FOREACH(cpu) {
435 if (newstates[cpu->cpu_index] == 's') {
Doug Gale5c9522b2017-12-02 20:30:37 -0500436 trace_gdbstub_op_stepping(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100437 cpu_single_step(cpu, sstep_flags);
438 }
439 }
440 s->running_state = 1;
441#else
442 int flag = 0;
443
444 if (!runstate_needs_reset()) {
445 if (vm_prepare_start()) {
446 return 0;
447 }
448
449 CPU_FOREACH(cpu) {
450 switch (newstates[cpu->cpu_index]) {
451 case 0:
452 case 1:
453 break; /* nothing to do here */
454 case 's':
Doug Gale5c9522b2017-12-02 20:30:37 -0500455 trace_gdbstub_op_stepping(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100456 cpu_single_step(cpu, sstep_flags);
457 cpu_resume(cpu);
458 flag = 1;
459 break;
460 case 'c':
Doug Gale5c9522b2017-12-02 20:30:37 -0500461 trace_gdbstub_op_continue_cpu(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100462 cpu_resume(cpu);
463 flag = 1;
464 break;
465 default:
466 res = -1;
467 break;
468 }
469 }
470 }
471 if (flag) {
472 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
473 }
474#endif
475 return res;
476}
477
bellard858693c2004-03-31 18:52:07 +0000478static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000479{
pbrook4046d912007-01-28 01:53:16 +0000480#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000481 int ret;
482
483 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000484 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000485 if (ret < 0) {
Peter Wu5819e3e2016-06-05 16:35:48 +0200486 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000487 return;
488 } else {
489 buf += ret;
490 len -= ret;
491 }
492 }
pbrook4046d912007-01-28 01:53:16 +0000493#else
Daniel P. Berrange6ab3fc32016-09-06 14:56:04 +0100494 /* XXX this blocks entire thread. Rewrite to use
495 * qemu_chr_fe_write and background I/O callbacks */
Marc-André Lureau5345fdb2016-10-22 12:52:55 +0300496 qemu_chr_fe_write_all(&s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000497#endif
bellardb4608c02003-06-27 17:34:32 +0000498}
499
500static inline int fromhex(int v)
501{
502 if (v >= '0' && v <= '9')
503 return v - '0';
504 else if (v >= 'A' && v <= 'F')
505 return v - 'A' + 10;
506 else if (v >= 'a' && v <= 'f')
507 return v - 'a' + 10;
508 else
509 return 0;
510}
511
512static inline int tohex(int v)
513{
514 if (v < 10)
515 return v + '0';
516 else
517 return v - 10 + 'a';
518}
519
Philippe Mathieu-Daudé90057742018-04-08 11:59:33 -0300520/* writes 2*len+1 bytes in buf */
bellardb4608c02003-06-27 17:34:32 +0000521static void memtohex(char *buf, const uint8_t *mem, int len)
522{
523 int i, c;
524 char *q;
525 q = buf;
526 for(i = 0; i < len; i++) {
527 c = mem[i];
528 *q++ = tohex(c >> 4);
529 *q++ = tohex(c & 0xf);
530 }
531 *q = '\0';
532}
533
534static void hextomem(uint8_t *mem, const char *buf, int len)
535{
536 int i;
537
538 for(i = 0; i < len; i++) {
539 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
540 buf += 2;
541 }
542}
543
Doug Gale5c9522b2017-12-02 20:30:37 -0500544static void hexdump(const char *buf, int len,
545 void (*trace_fn)(size_t ofs, char const *text))
546{
547 char line_buffer[3 * 16 + 4 + 16 + 1];
548
549 size_t i;
550 for (i = 0; i < len || (i & 0xF); ++i) {
551 size_t byte_ofs = i & 15;
552
553 if (byte_ofs == 0) {
554 memset(line_buffer, ' ', 3 * 16 + 4 + 16);
555 line_buffer[3 * 16 + 4 + 16] = 0;
556 }
557
558 size_t col_group = (i >> 2) & 3;
559 size_t hex_col = byte_ofs * 3 + col_group;
560 size_t txt_col = 3 * 16 + 4 + byte_ofs;
561
562 if (i < len) {
563 char value = buf[i];
564
565 line_buffer[hex_col + 0] = tohex((value >> 4) & 0xF);
566 line_buffer[hex_col + 1] = tohex((value >> 0) & 0xF);
567 line_buffer[txt_col + 0] = (value >= ' ' && value < 127)
568 ? value
569 : '.';
570 }
571
572 if (byte_ofs == 0xF)
573 trace_fn(i & -16, line_buffer);
574 }
575}
576
bellardb4608c02003-06-27 17:34:32 +0000577/* return -1 if error, 0 if OK */
Doug Gale5c9522b2017-12-02 20:30:37 -0500578static int put_packet_binary(GDBState *s, const char *buf, int len, bool dump)
bellardb4608c02003-06-27 17:34:32 +0000579{
pbrook56aebc82008-10-11 17:55:29 +0000580 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000581 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000582
Doug Gale5c9522b2017-12-02 20:30:37 -0500583 if (dump && trace_event_get_state_backends(TRACE_GDBSTUB_IO_BINARYREPLY)) {
584 hexdump(buf, len, trace_gdbstub_io_binaryreply);
585 }
586
bellardb4608c02003-06-27 17:34:32 +0000587 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000588 p = s->last_packet;
589 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000590 memcpy(p, buf, len);
591 p += len;
bellardb4608c02003-06-27 17:34:32 +0000592 csum = 0;
593 for(i = 0; i < len; i++) {
594 csum += buf[i];
595 }
pbrook4046d912007-01-28 01:53:16 +0000596 *(p++) = '#';
597 *(p++) = tohex((csum >> 4) & 0xf);
598 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000599
pbrook4046d912007-01-28 01:53:16 +0000600 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000601 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000602
pbrook4046d912007-01-28 01:53:16 +0000603#ifdef CONFIG_USER_ONLY
604 i = get_char(s);
605 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000606 return -1;
pbrook4046d912007-01-28 01:53:16 +0000607 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000608 break;
pbrook4046d912007-01-28 01:53:16 +0000609#else
610 break;
611#endif
bellardb4608c02003-06-27 17:34:32 +0000612 }
613 return 0;
614}
615
pbrook56aebc82008-10-11 17:55:29 +0000616/* return -1 if error, 0 if OK */
617static int put_packet(GDBState *s, const char *buf)
618{
Doug Gale5c9522b2017-12-02 20:30:37 -0500619 trace_gdbstub_io_reply(buf);
pbrook56aebc82008-10-11 17:55:29 +0000620
Doug Gale5c9522b2017-12-02 20:30:37 -0500621 return put_packet_binary(s, buf, strlen(buf), false);
pbrook56aebc82008-10-11 17:55:29 +0000622}
623
pbrook56aebc82008-10-11 17:55:29 +0000624/* Encode data using the encoding for 'x' packets. */
625static int memtox(char *buf, const char *mem, int len)
626{
627 char *p = buf;
628 char c;
629
630 while (len--) {
631 c = *(mem++);
632 switch (c) {
633 case '#': case '$': case '*': case '}':
634 *(p++) = '}';
635 *(p++) = c ^ 0x20;
636 break;
637 default:
638 *(p++) = c;
639 break;
640 }
641 }
642 return p - buf;
643}
644
Luc Michel1a227332019-01-07 15:23:45 +0000645static uint32_t gdb_get_cpu_pid(const GDBState *s, CPUState *cpu)
646{
Luc Michel1a227332019-01-07 15:23:45 +0000647 /* TODO: In user mode, we should use the task state PID */
Peter Maydell46f5abc2019-01-29 11:46:06 +0000648 if (cpu->cluster_index == UNASSIGNED_CLUSTER_INDEX) {
649 /* Return the default process' PID */
650 return s->processes[s->process_num - 1].pid;
651 }
652 return cpu->cluster_index + 1;
Luc Michel1a227332019-01-07 15:23:45 +0000653}
654
Luc Michel7d8c87d2019-01-07 15:23:45 +0000655static GDBProcess *gdb_get_process(const GDBState *s, uint32_t pid)
656{
657 int i;
658
659 if (!pid) {
660 /* 0 means any process, we take the first one */
661 return &s->processes[0];
662 }
663
664 for (i = 0; i < s->process_num; i++) {
665 if (s->processes[i].pid == pid) {
666 return &s->processes[i];
667 }
668 }
669
670 return NULL;
671}
672
673static GDBProcess *gdb_get_cpu_process(const GDBState *s, CPUState *cpu)
674{
675 return gdb_get_process(s, gdb_get_cpu_pid(s, cpu));
676}
677
678static CPUState *find_cpu(uint32_t thread_id)
679{
680 CPUState *cpu;
681
682 CPU_FOREACH(cpu) {
683 if (cpu_gdb_index(cpu) == thread_id) {
684 return cpu;
685 }
686 }
687
688 return NULL;
689}
690
Luc Michele40e5202019-01-07 15:23:46 +0000691static CPUState *get_first_cpu_in_process(const GDBState *s,
692 GDBProcess *process)
693{
694 CPUState *cpu;
695
696 CPU_FOREACH(cpu) {
697 if (gdb_get_cpu_pid(s, cpu) == process->pid) {
698 return cpu;
699 }
700 }
701
702 return NULL;
703}
704
705static CPUState *gdb_next_cpu_in_process(const GDBState *s, CPUState *cpu)
706{
707 uint32_t pid = gdb_get_cpu_pid(s, cpu);
708 cpu = CPU_NEXT(cpu);
709
710 while (cpu) {
711 if (gdb_get_cpu_pid(s, cpu) == pid) {
712 break;
713 }
714
715 cpu = CPU_NEXT(cpu);
716 }
717
718 return cpu;
719}
720
Luc Michele40e5202019-01-07 15:23:46 +0000721/* Return the cpu following @cpu, while ignoring unattached processes. */
722static CPUState *gdb_next_attached_cpu(const GDBState *s, CPUState *cpu)
723{
724 cpu = CPU_NEXT(cpu);
725
726 while (cpu) {
727 if (gdb_get_cpu_process(s, cpu)->attached) {
728 break;
729 }
730
731 cpu = CPU_NEXT(cpu);
732 }
733
734 return cpu;
735}
736
737/* Return the first attached cpu */
738static CPUState *gdb_first_attached_cpu(const GDBState *s)
739{
740 CPUState *cpu = first_cpu;
741 GDBProcess *process = gdb_get_cpu_process(s, cpu);
742
743 if (!process->attached) {
744 return gdb_next_attached_cpu(s, cpu);
745 }
746
747 return cpu;
748}
749
Luc Michelab65eed2019-01-29 11:46:03 +0000750static CPUState *gdb_get_cpu(const GDBState *s, uint32_t pid, uint32_t tid)
751{
752 GDBProcess *process;
753 CPUState *cpu;
754
755 if (!pid && !tid) {
756 /* 0 means any process/thread, we take the first attached one */
757 return gdb_first_attached_cpu(s);
758 } else if (pid && !tid) {
759 /* any thread in a specific process */
760 process = gdb_get_process(s, pid);
761
762 if (process == NULL) {
763 return NULL;
764 }
765
766 if (!process->attached) {
767 return NULL;
768 }
769
770 return get_first_cpu_in_process(s, process);
771 } else {
772 /* a specific thread */
773 cpu = find_cpu(tid);
774
775 if (cpu == NULL) {
776 return NULL;
777 }
778
779 process = gdb_get_cpu_process(s, cpu);
780
781 if (pid && process->pid != pid) {
782 return NULL;
783 }
784
785 if (!process->attached) {
786 return NULL;
787 }
788
789 return cpu;
790 }
791}
792
Luc Michelc145eea2019-01-07 15:23:46 +0000793static const char *get_feature_xml(const GDBState *s, const char *p,
794 const char **newp, GDBProcess *process)
pbrook56aebc82008-10-11 17:55:29 +0000795{
pbrook56aebc82008-10-11 17:55:29 +0000796 size_t len;
797 int i;
798 const char *name;
Luc Michelc145eea2019-01-07 15:23:46 +0000799 CPUState *cpu = get_first_cpu_in_process(s, process);
800 CPUClass *cc = CPU_GET_CLASS(cpu);
pbrook56aebc82008-10-11 17:55:29 +0000801
802 len = 0;
803 while (p[len] && p[len] != ':')
804 len++;
805 *newp = p + len;
806
807 name = NULL;
808 if (strncmp(p, "target.xml", len) == 0) {
Luc Michelc145eea2019-01-07 15:23:46 +0000809 char *buf = process->target_xml;
810 const size_t buf_sz = sizeof(process->target_xml);
pbrook56aebc82008-10-11 17:55:29 +0000811
Luc Michelc145eea2019-01-07 15:23:46 +0000812 /* Generate the XML description for this CPU. */
813 if (!buf[0]) {
814 GDBRegisterState *r;
815
816 pstrcat(buf, buf_sz,
David Hildenbrandb3820e62015-12-03 13:14:41 +0100817 "<?xml version=\"1.0\"?>"
818 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
819 "<target>");
820 if (cc->gdb_arch_name) {
821 gchar *arch = cc->gdb_arch_name(cpu);
Luc Michelc145eea2019-01-07 15:23:46 +0000822 pstrcat(buf, buf_sz, "<architecture>");
823 pstrcat(buf, buf_sz, arch);
824 pstrcat(buf, buf_sz, "</architecture>");
David Hildenbrandb3820e62015-12-03 13:14:41 +0100825 g_free(arch);
826 }
Luc Michelc145eea2019-01-07 15:23:46 +0000827 pstrcat(buf, buf_sz, "<xi:include href=\"");
828 pstrcat(buf, buf_sz, cc->gdb_core_xml_file);
829 pstrcat(buf, buf_sz, "\"/>");
Andreas Färbereac8b352013-06-28 21:11:37 +0200830 for (r = cpu->gdb_regs; r; r = r->next) {
Luc Michelc145eea2019-01-07 15:23:46 +0000831 pstrcat(buf, buf_sz, "<xi:include href=\"");
832 pstrcat(buf, buf_sz, r->xml);
833 pstrcat(buf, buf_sz, "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000834 }
Luc Michelc145eea2019-01-07 15:23:46 +0000835 pstrcat(buf, buf_sz, "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000836 }
Luc Michelc145eea2019-01-07 15:23:46 +0000837 return buf;
pbrook56aebc82008-10-11 17:55:29 +0000838 }
Abdallah Bouassida200bf5b2018-05-18 17:48:07 +0100839 if (cc->gdb_get_dynamic_xml) {
Abdallah Bouassida200bf5b2018-05-18 17:48:07 +0100840 char *xmlname = g_strndup(p, len);
841 const char *xml = cc->gdb_get_dynamic_xml(cpu, xmlname);
842
843 g_free(xmlname);
844 if (xml) {
845 return xml;
846 }
847 }
pbrook56aebc82008-10-11 17:55:29 +0000848 for (i = 0; ; i++) {
849 name = xml_builtin[i][0];
850 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
851 break;
852 }
853 return name ? xml_builtin[i][1] : NULL;
854}
pbrook56aebc82008-10-11 17:55:29 +0000855
Andreas Färber385b9f02013-06-27 18:25:36 +0200856static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000857{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200858 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200859 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000860 GDBRegisterState *r;
861
Andreas Färbera0e372f2013-06-28 23:18:47 +0200862 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200863 return cc->gdb_read_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200864 }
pbrook56aebc82008-10-11 17:55:29 +0000865
Andreas Färbereac8b352013-06-28 21:11:37 +0200866 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000867 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
868 return r->get_reg(env, mem_buf, reg - r->base_reg);
869 }
870 }
871 return 0;
872}
873
Andreas Färber385b9f02013-06-27 18:25:36 +0200874static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000875{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200876 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200877 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000878 GDBRegisterState *r;
879
Andreas Färbera0e372f2013-06-28 23:18:47 +0200880 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200881 return cc->gdb_write_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200882 }
pbrook56aebc82008-10-11 17:55:29 +0000883
Andreas Färbereac8b352013-06-28 21:11:37 +0200884 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000885 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
886 return r->set_reg(env, mem_buf, reg - r->base_reg);
887 }
888 }
889 return 0;
890}
891
892/* Register a supplemental set of CPU registers. If g_pos is nonzero it
893 specifies the first register number and these registers are included in
894 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
895 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
896 */
897
Andreas Färber22169d42013-06-28 21:27:39 +0200898void gdb_register_coprocessor(CPUState *cpu,
899 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
900 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000901{
902 GDBRegisterState *s;
903 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000904
Andreas Färbereac8b352013-06-28 21:11:37 +0200905 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000906 while (*p) {
907 /* Check for duplicates. */
908 if (strcmp((*p)->xml, xml) == 0)
909 return;
910 p = &(*p)->next;
911 }
Stefan Weil9643c252011-10-18 22:25:38 +0200912
913 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200914 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200915 s->num_regs = num_regs;
916 s->get_reg = get_reg;
917 s->set_reg = set_reg;
918 s->xml = xml;
919
pbrook56aebc82008-10-11 17:55:29 +0000920 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200921 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000922 *p = s;
923 if (g_pos) {
924 if (g_pos != s->base_reg) {
Ziyue Yang7ae6c572017-01-18 16:03:29 +0800925 error_report("Error: Bad gdb register numbering for '%s', "
926 "expected %d got %d", xml, g_pos, s->base_reg);
Andreas Färber35143f02013-08-12 18:09:47 +0200927 } else {
928 cpu->gdb_num_g_regs = cpu->gdb_num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000929 }
930 }
931}
932
aliguoria1d1bb32008-11-18 20:07:32 +0000933#ifndef CONFIG_USER_ONLY
Peter Maydell2472b6c2014-09-12 19:04:17 +0100934/* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
935static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
936{
937 static const int xlat[] = {
938 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
939 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
940 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
941 };
942
943 CPUClass *cc = CPU_GET_CLASS(cpu);
944 int cputype = xlat[gdbtype];
945
946 if (cc->gdb_stop_before_watchpoint) {
947 cputype |= BP_STOP_BEFORE_ACCESS;
948 }
949 return cputype;
950}
aliguoria1d1bb32008-11-18 20:07:32 +0000951#endif
952
aliguori880a7572008-11-18 20:30:24 +0000953static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000954{
Andreas Färber182735e2013-05-29 22:29:20 +0200955 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000956 int err = 0;
957
Andreas Färber62278812013-06-27 17:12:06 +0200958 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200959 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200960 }
aliguorie22a25c2009-03-12 20:12:48 +0000961
aliguoria1d1bb32008-11-18 20:07:32 +0000962 switch (type) {
963 case GDB_BREAKPOINT_SW:
964 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200965 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200966 err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
967 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000968 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200969 }
aliguori880a7572008-11-18 20:30:24 +0000970 }
971 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000972#ifndef CONFIG_USER_ONLY
973 case GDB_WATCHPOINT_WRITE:
974 case GDB_WATCHPOINT_READ:
975 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200976 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100977 err = cpu_watchpoint_insert(cpu, addr, len,
978 xlat_gdb_type(cpu, type), NULL);
979 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000980 break;
Peter Maydell2472b6c2014-09-12 19:04:17 +0100981 }
aliguori880a7572008-11-18 20:30:24 +0000982 }
983 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000984#endif
985 default:
986 return -ENOSYS;
987 }
988}
989
aliguori880a7572008-11-18 20:30:24 +0000990static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000991{
Andreas Färber182735e2013-05-29 22:29:20 +0200992 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000993 int err = 0;
994
Andreas Färber62278812013-06-27 17:12:06 +0200995 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200996 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200997 }
aliguorie22a25c2009-03-12 20:12:48 +0000998
aliguoria1d1bb32008-11-18 20:07:32 +0000999 switch (type) {
1000 case GDB_BREAKPOINT_SW:
1001 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +02001002 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +02001003 err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
1004 if (err) {
aliguori880a7572008-11-18 20:30:24 +00001005 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +02001006 }
aliguori880a7572008-11-18 20:30:24 +00001007 }
1008 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001009#ifndef CONFIG_USER_ONLY
1010 case GDB_WATCHPOINT_WRITE:
1011 case GDB_WATCHPOINT_READ:
1012 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +02001013 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +01001014 err = cpu_watchpoint_remove(cpu, addr, len,
1015 xlat_gdb_type(cpu, type));
aliguori880a7572008-11-18 20:30:24 +00001016 if (err)
1017 break;
1018 }
1019 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001020#endif
1021 default:
1022 return -ENOSYS;
1023 }
1024}
1025
Luc Michel546f3c62019-01-07 15:23:46 +00001026static inline void gdb_cpu_breakpoint_remove_all(CPUState *cpu)
1027{
1028 cpu_breakpoint_remove_all(cpu, BP_GDB);
1029#ifndef CONFIG_USER_ONLY
1030 cpu_watchpoint_remove_all(cpu, BP_GDB);
1031#endif
1032}
1033
1034static void gdb_process_breakpoint_remove_all(const GDBState *s, GDBProcess *p)
1035{
1036 CPUState *cpu = get_first_cpu_in_process(s, p);
1037
1038 while (cpu) {
1039 gdb_cpu_breakpoint_remove_all(cpu);
1040 cpu = gdb_next_cpu_in_process(s, cpu);
1041 }
1042}
1043
aliguori880a7572008-11-18 20:30:24 +00001044static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001045{
Andreas Färber182735e2013-05-29 22:29:20 +02001046 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +00001047
aliguorie22a25c2009-03-12 20:12:48 +00001048 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001049 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001050 return;
1051 }
1052
Andreas Färberbdc44642013-06-24 23:50:24 +02001053 CPU_FOREACH(cpu) {
Luc Michel546f3c62019-01-07 15:23:46 +00001054 gdb_cpu_breakpoint_remove_all(cpu);
aliguori880a7572008-11-18 20:30:24 +00001055 }
aliguoria1d1bb32008-11-18 20:07:32 +00001056}
1057
aurel32fab9d282009-04-08 21:29:37 +00001058static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1059{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001060 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001061
1062 cpu_synchronize_state(cpu);
Peter Crosthwaite4a2b24e2015-06-23 20:19:21 -07001063 cpu_set_pc(cpu, pc);
aurel32fab9d282009-04-08 21:29:37 +00001064}
1065
Luc Michel1a227332019-01-07 15:23:45 +00001066static char *gdb_fmt_thread_id(const GDBState *s, CPUState *cpu,
1067 char *buf, size_t buf_size)
1068{
1069 if (s->multiprocess) {
1070 snprintf(buf, buf_size, "p%02x.%02x",
1071 gdb_get_cpu_pid(s, cpu), cpu_gdb_index(cpu));
1072 } else {
1073 snprintf(buf, buf_size, "%02x", cpu_gdb_index(cpu));
1074 }
1075
1076 return buf;
1077}
1078
Luc Michel7d8c87d2019-01-07 15:23:45 +00001079typedef enum GDBThreadIdKind {
1080 GDB_ONE_THREAD = 0,
1081 GDB_ALL_THREADS, /* One process, all threads */
1082 GDB_ALL_PROCESSES,
1083 GDB_READ_THREAD_ERR
1084} GDBThreadIdKind;
1085
1086static GDBThreadIdKind read_thread_id(const char *buf, const char **end_buf,
1087 uint32_t *pid, uint32_t *tid)
1088{
1089 unsigned long p, t;
1090 int ret;
1091
1092 if (*buf == 'p') {
1093 buf++;
1094 ret = qemu_strtoul(buf, &buf, 16, &p);
1095
1096 if (ret) {
1097 return GDB_READ_THREAD_ERR;
1098 }
1099
1100 /* Skip '.' */
1101 buf++;
1102 } else {
1103 p = 1;
1104 }
1105
1106 ret = qemu_strtoul(buf, &buf, 16, &t);
1107
1108 if (ret) {
1109 return GDB_READ_THREAD_ERR;
1110 }
1111
1112 *end_buf = buf;
1113
1114 if (p == -1) {
1115 return GDB_ALL_PROCESSES;
1116 }
1117
1118 if (pid) {
1119 *pid = p;
1120 }
1121
1122 if (t == -1) {
1123 return GDB_ALL_THREADS;
1124 }
1125
1126 if (tid) {
1127 *tid = t;
1128 }
1129
1130 return GDB_ONE_THREAD;
1131}
1132
Jan Kiszka4dabe742015-02-07 09:38:43 +01001133static int is_query_packet(const char *p, const char *query, char separator)
1134{
1135 unsigned int query_len = strlen(query);
1136
1137 return strncmp(p, query, query_len) == 0 &&
1138 (p[query_len] == '\0' || p[query_len] == separator);
1139}
1140
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001141/**
1142 * gdb_handle_vcont - Parses and handles a vCont packet.
1143 * returns -ENOTSUP if a command is unsupported, -EINVAL or -ERANGE if there is
1144 * a format error, 0 on success.
1145 */
1146static int gdb_handle_vcont(GDBState *s, const char *p)
1147{
Luc Michele40e5202019-01-07 15:23:46 +00001148 int res, signal = 0;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001149 char cur_action;
1150 char *newstates;
1151 unsigned long tmp;
Luc Michele40e5202019-01-07 15:23:46 +00001152 uint32_t pid, tid;
1153 GDBProcess *process;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001154 CPUState *cpu;
Luc Michelc99ef792019-03-26 12:53:26 +00001155 GDBThreadIdKind kind;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001156#ifdef CONFIG_USER_ONLY
1157 int max_cpus = 1; /* global variable max_cpus exists only in system mode */
1158
1159 CPU_FOREACH(cpu) {
1160 max_cpus = max_cpus <= cpu->cpu_index ? cpu->cpu_index + 1 : max_cpus;
1161 }
1162#endif
1163 /* uninitialised CPUs stay 0 */
1164 newstates = g_new0(char, max_cpus);
1165
1166 /* mark valid CPUs with 1 */
1167 CPU_FOREACH(cpu) {
1168 newstates[cpu->cpu_index] = 1;
1169 }
1170
1171 /*
1172 * res keeps track of what error we are returning, with -ENOTSUP meaning
1173 * that the command is unknown or unsupported, thus returning an empty
1174 * packet, while -EINVAL and -ERANGE cause an E22 packet, due to invalid,
1175 * or incorrect parameters passed.
1176 */
1177 res = 0;
1178 while (*p) {
1179 if (*p++ != ';') {
1180 res = -ENOTSUP;
1181 goto out;
1182 }
1183
1184 cur_action = *p++;
1185 if (cur_action == 'C' || cur_action == 'S') {
Peter Maydell95a5bef2017-07-20 17:31:30 +01001186 cur_action = qemu_tolower(cur_action);
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001187 res = qemu_strtoul(p + 1, &p, 16, &tmp);
1188 if (res) {
1189 goto out;
1190 }
1191 signal = gdb_signal_to_target(tmp);
1192 } else if (cur_action != 'c' && cur_action != 's') {
1193 /* unknown/invalid/unsupported command */
1194 res = -ENOTSUP;
1195 goto out;
1196 }
Luc Michele40e5202019-01-07 15:23:46 +00001197
Luc Michelc99ef792019-03-26 12:53:26 +00001198 if (*p == '\0' || *p == ';') {
1199 /*
1200 * No thread specifier, action is on "all threads". The
1201 * specification is unclear regarding the process to act on. We
1202 * choose all processes.
1203 */
1204 kind = GDB_ALL_PROCESSES;
1205 } else if (*p++ == ':') {
1206 kind = read_thread_id(p, &p, &pid, &tid);
1207 } else {
Luc Michele40e5202019-01-07 15:23:46 +00001208 res = -ENOTSUP;
1209 goto out;
1210 }
1211
Luc Michelc99ef792019-03-26 12:53:26 +00001212 switch (kind) {
Luc Michele40e5202019-01-07 15:23:46 +00001213 case GDB_READ_THREAD_ERR:
1214 res = -EINVAL;
1215 goto out;
1216
1217 case GDB_ALL_PROCESSES:
1218 cpu = gdb_first_attached_cpu(s);
1219 while (cpu) {
1220 if (newstates[cpu->cpu_index] == 1) {
1221 newstates[cpu->cpu_index] = cur_action;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001222 }
Luc Michele40e5202019-01-07 15:23:46 +00001223
1224 cpu = gdb_next_attached_cpu(s, cpu);
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001225 }
Luc Michele40e5202019-01-07 15:23:46 +00001226 break;
1227
1228 case GDB_ALL_THREADS:
1229 process = gdb_get_process(s, pid);
1230
1231 if (!process->attached) {
1232 res = -EINVAL;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001233 goto out;
1234 }
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001235
Luc Michele40e5202019-01-07 15:23:46 +00001236 cpu = get_first_cpu_in_process(s, process);
1237 while (cpu) {
1238 if (newstates[cpu->cpu_index] == 1) {
1239 newstates[cpu->cpu_index] = cur_action;
1240 }
1241
1242 cpu = gdb_next_cpu_in_process(s, cpu);
1243 }
1244 break;
1245
1246 case GDB_ONE_THREAD:
1247 cpu = gdb_get_cpu(s, pid, tid);
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001248
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001249 /* invalid CPU/thread specified */
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001250 if (!cpu) {
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001251 res = -EINVAL;
1252 goto out;
1253 }
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001254
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001255 /* only use if no previous match occourred */
1256 if (newstates[cpu->cpu_index] == 1) {
1257 newstates[cpu->cpu_index] = cur_action;
1258 }
Luc Michele40e5202019-01-07 15:23:46 +00001259 break;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001260 }
1261 }
1262 s->signal = signal;
1263 gdb_continue_partial(s, newstates);
1264
1265out:
1266 g_free(newstates);
1267
1268 return res;
1269}
1270
aliguori880a7572008-11-18 20:30:24 +00001271static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001272{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001273 CPUState *cpu;
Luc Michelc145eea2019-01-07 15:23:46 +00001274 GDBProcess *process;
Andreas Färber5b24c642013-07-07 15:08:22 +02001275 CPUClass *cc;
bellardb4608c02003-06-27 17:34:32 +00001276 const char *p;
Luc Michel7d8c87d2019-01-07 15:23:45 +00001277 uint32_t pid, tid;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001278 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001279 uint8_t mem_buf[MAX_PACKET_LENGTH];
Philippe Mathieu-Daudé90057742018-04-08 11:59:33 -03001280 char buf[sizeof(mem_buf) + 1 /* trailing NUL */];
Luc Michel1a227332019-01-07 15:23:45 +00001281 char thread_id[16];
pbrook56aebc82008-10-11 17:55:29 +00001282 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001283 target_ulong addr, len;
Luc Michel7d8c87d2019-01-07 15:23:45 +00001284 GDBThreadIdKind thread_kind;
ths3b46e622007-09-17 08:09:54 +00001285
Doug Gale5c9522b2017-12-02 20:30:37 -05001286 trace_gdbstub_io_command(line_buf);
Alex Bennée118e2262017-07-12 11:52:13 +01001287
bellard858693c2004-03-31 18:52:07 +00001288 p = line_buf;
1289 ch = *p++;
1290 switch(ch) {
Luc Michel53fd6552019-01-07 15:23:46 +00001291 case '!':
1292 put_packet(s, "OK");
1293 break;
bellard858693c2004-03-31 18:52:07 +00001294 case '?':
bellard1fddef42005-04-17 19:16:13 +00001295 /* TODO: Make this return the correct value for user-mode. */
Luc Michel1a227332019-01-07 15:23:45 +00001296 snprintf(buf, sizeof(buf), "T%02xthread:%s;", GDB_SIGNAL_TRAP,
1297 gdb_fmt_thread_id(s, s->c_cpu, thread_id, sizeof(thread_id)));
bellard858693c2004-03-31 18:52:07 +00001298 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001299 /* Remove all the breakpoints when this query is issued,
1300 * because gdb is doing and initial connect and the state
1301 * should be cleaned up.
1302 */
aliguori880a7572008-11-18 20:30:24 +00001303 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001304 break;
1305 case 'c':
1306 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001307 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001308 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001309 }
aurel32ca587a82008-12-18 22:44:13 +00001310 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001311 gdb_continue(s);
Doug Gale5c9522b2017-12-02 20:30:37 -05001312 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001313 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001314 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1315 if (s->signal == -1)
1316 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001317 gdb_continue(s);
1318 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001319 case 'v':
1320 if (strncmp(p, "Cont", 4) == 0) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001321 p += 4;
1322 if (*p == '?') {
1323 put_packet(s, "vCont;c;C;s;S");
1324 break;
1325 }
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001326
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001327 res = gdb_handle_vcont(s, p);
1328
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001329 if (res) {
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001330 if ((res == -EINVAL) || (res == -ERANGE)) {
1331 put_packet(s, "E22");
1332 break;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001333 }
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001334 goto unknown_command;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001335 }
1336 break;
Luc Michel3f940dc2019-01-07 15:23:46 +00001337 } else if (strncmp(p, "Attach;", 7) == 0) {
1338 unsigned long pid;
1339
1340 p += 7;
1341
1342 if (qemu_strtoul(p, &p, 16, &pid)) {
1343 put_packet(s, "E22");
1344 break;
1345 }
1346
1347 process = gdb_get_process(s, pid);
1348
1349 if (process == NULL) {
1350 put_packet(s, "E22");
1351 break;
1352 }
1353
1354 cpu = get_first_cpu_in_process(s, process);
1355
1356 if (cpu == NULL) {
1357 /* Refuse to attach an empty process */
1358 put_packet(s, "E22");
1359 break;
1360 }
1361
1362 process->attached = true;
1363
1364 s->g_cpu = cpu;
1365 s->c_cpu = cpu;
1366
1367 snprintf(buf, sizeof(buf), "T%02xthread:%s;", GDB_SIGNAL_TRAP,
1368 gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)));
1369
1370 put_packet(s, buf);
1371 break;
Max Filippov45a4de22019-02-05 16:52:41 +00001372 } else if (strncmp(p, "Kill;", 5) == 0) {
1373 /* Kill the target */
Sandra Loosemore0f8b09b2019-02-15 09:56:41 +00001374 put_packet(s, "OK");
Max Filippov45a4de22019-02-05 16:52:41 +00001375 error_report("QEMU: Terminated via GDBstub");
1376 exit(0);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001377 } else {
1378 goto unknown_command;
1379 }
edgar_igl7d03f822008-05-17 18:58:29 +00001380 case 'k':
1381 /* Kill the target */
Ziyue Yang7ae6c572017-01-18 16:03:29 +08001382 error_report("QEMU: Terminated via GDBstub");
edgar_igl7d03f822008-05-17 18:58:29 +00001383 exit(0);
1384 case 'D':
1385 /* Detach packet */
Luc Michel546f3c62019-01-07 15:23:46 +00001386 pid = 1;
1387
1388 if (s->multiprocess) {
1389 unsigned long lpid;
1390 if (*p != ';') {
1391 put_packet(s, "E22");
1392 break;
1393 }
1394
1395 if (qemu_strtoul(p + 1, &p, 16, &lpid)) {
1396 put_packet(s, "E22");
1397 break;
1398 }
1399
1400 pid = lpid;
1401 }
1402
1403 process = gdb_get_process(s, pid);
1404 gdb_process_breakpoint_remove_all(s, process);
1405 process->attached = false;
1406
1407 if (pid == gdb_get_cpu_pid(s, s->c_cpu)) {
1408 s->c_cpu = gdb_first_attached_cpu(s);
1409 }
1410
1411 if (pid == gdb_get_cpu_pid(s, s->g_cpu)) {
1412 s->g_cpu = gdb_first_attached_cpu(s);
1413 }
1414
1415 if (s->c_cpu == NULL) {
1416 /* No more process attached */
1417 gdb_syscall_mode = GDB_SYS_DISABLED;
1418 gdb_continue(s);
1419 }
edgar_igl7d03f822008-05-17 18:58:29 +00001420 put_packet(s, "OK");
1421 break;
bellard858693c2004-03-31 18:52:07 +00001422 case 's':
1423 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001424 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001425 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001426 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001427 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001428 gdb_continue(s);
Doug Gale5c9522b2017-12-02 20:30:37 -05001429 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001430 case 'F':
1431 {
1432 target_ulong ret;
1433 target_ulong err;
1434
1435 ret = strtoull(p, (char **)&p, 16);
1436 if (*p == ',') {
1437 p++;
1438 err = strtoull(p, (char **)&p, 16);
1439 } else {
1440 err = 0;
1441 }
1442 if (*p == ',')
1443 p++;
1444 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001445 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001446 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001447 s->current_syscall_cb = NULL;
1448 }
pbrooka2d1eba2007-01-28 03:10:55 +00001449 if (type == 'C') {
1450 put_packet(s, "T02");
1451 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001452 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001453 }
1454 }
1455 break;
bellard858693c2004-03-31 18:52:07 +00001456 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001457 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001458 len = 0;
Andreas Färber35143f02013-08-12 18:09:47 +02001459 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001460 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001461 len += reg_size;
1462 }
1463 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001464 put_packet(s, buf);
1465 break;
1466 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001467 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001468 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001469 len = strlen(p) / 2;
1470 hextomem((uint8_t *)registers, p, len);
Andreas Färber35143f02013-08-12 18:09:47 +02001471 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001472 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001473 len -= reg_size;
1474 registers += reg_size;
1475 }
bellard858693c2004-03-31 18:52:07 +00001476 put_packet(s, "OK");
1477 break;
1478 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001479 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001480 if (*p == ',')
1481 p++;
bellard9d9754a2006-06-25 15:32:37 +00001482 len = strtoull(p, NULL, 16);
Kevin Wolf5accecb2015-10-13 09:38:50 +02001483
1484 /* memtohex() doubles the required space */
1485 if (len > MAX_PACKET_LENGTH / 2) {
1486 put_packet (s, "E22");
1487 break;
1488 }
1489
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001490 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001491 put_packet (s, "E14");
1492 } else {
1493 memtohex(buf, mem_buf, len);
1494 put_packet(s, buf);
1495 }
bellard858693c2004-03-31 18:52:07 +00001496 break;
1497 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001498 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001499 if (*p == ',')
1500 p++;
bellard9d9754a2006-06-25 15:32:37 +00001501 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001502 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001503 p++;
Kevin Wolf5accecb2015-10-13 09:38:50 +02001504
1505 /* hextomem() reads 2*len bytes */
1506 if (len > strlen(p) / 2) {
1507 put_packet (s, "E22");
1508 break;
1509 }
bellard858693c2004-03-31 18:52:07 +00001510 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001511 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001512 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001513 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001514 } else {
bellard858693c2004-03-31 18:52:07 +00001515 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001516 }
bellard858693c2004-03-31 18:52:07 +00001517 break;
pbrook56aebc82008-10-11 17:55:29 +00001518 case 'p':
1519 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1520 This works, but can be very slow. Anything new enough to
1521 understand XML also knows how to use this properly. */
1522 if (!gdb_has_xml)
1523 goto unknown_command;
1524 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001525 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001526 if (reg_size) {
1527 memtohex(buf, mem_buf, reg_size);
1528 put_packet(s, buf);
1529 } else {
1530 put_packet(s, "E14");
1531 }
1532 break;
1533 case 'P':
1534 if (!gdb_has_xml)
1535 goto unknown_command;
1536 addr = strtoull(p, (char **)&p, 16);
1537 if (*p == '=')
1538 p++;
1539 reg_size = strlen(p) / 2;
1540 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001541 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001542 put_packet(s, "OK");
1543 break;
bellard858693c2004-03-31 18:52:07 +00001544 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001545 case 'z':
1546 type = strtoul(p, (char **)&p, 16);
1547 if (*p == ',')
1548 p++;
bellard9d9754a2006-06-25 15:32:37 +00001549 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001550 if (*p == ',')
1551 p++;
bellard9d9754a2006-06-25 15:32:37 +00001552 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001553 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001554 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001555 else
aliguori880a7572008-11-18 20:30:24 +00001556 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001557 if (res >= 0)
1558 put_packet(s, "OK");
1559 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001560 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001561 else
1562 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001563 break;
aliguori880a7572008-11-18 20:30:24 +00001564 case 'H':
1565 type = *p++;
Luc Michel7d8c87d2019-01-07 15:23:45 +00001566
1567 thread_kind = read_thread_id(p, &p, &pid, &tid);
1568 if (thread_kind == GDB_READ_THREAD_ERR) {
1569 put_packet(s, "E22");
1570 break;
1571 }
1572
1573 if (thread_kind != GDB_ONE_THREAD) {
aliguori880a7572008-11-18 20:30:24 +00001574 put_packet(s, "OK");
1575 break;
1576 }
Luc Michel7d8c87d2019-01-07 15:23:45 +00001577 cpu = gdb_get_cpu(s, pid, tid);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001578 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001579 put_packet(s, "E22");
1580 break;
1581 }
1582 switch (type) {
1583 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001584 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001585 put_packet(s, "OK");
1586 break;
1587 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001588 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001589 put_packet(s, "OK");
1590 break;
1591 default:
1592 put_packet(s, "E22");
1593 break;
1594 }
1595 break;
1596 case 'T':
Luc Michel7d8c87d2019-01-07 15:23:45 +00001597 thread_kind = read_thread_id(p, &p, &pid, &tid);
1598 if (thread_kind == GDB_READ_THREAD_ERR) {
1599 put_packet(s, "E22");
1600 break;
1601 }
1602 cpu = gdb_get_cpu(s, pid, tid);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001603
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001604 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001605 put_packet(s, "OK");
1606 } else {
aliguori880a7572008-11-18 20:30:24 +00001607 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001608 }
aliguori880a7572008-11-18 20:30:24 +00001609 break;
pbrook978efd62006-06-17 18:30:42 +00001610 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001611 case 'Q':
1612 /* parse any 'q' packets here */
1613 if (!strcmp(p,"qemu.sstepbits")) {
1614 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001615 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1616 SSTEP_ENABLE,
1617 SSTEP_NOIRQ,
1618 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001619 put_packet(s, buf);
1620 break;
Jan Kiszka4dabe742015-02-07 09:38:43 +01001621 } else if (is_query_packet(p, "qemu.sstep", '=')) {
edgar_igl60897d32008-05-09 08:25:14 +00001622 /* Display or change the sstep_flags */
1623 p += 10;
1624 if (*p != '=') {
1625 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001626 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001627 put_packet(s, buf);
1628 break;
1629 }
1630 p++;
1631 type = strtoul(p, (char **)&p, 16);
1632 sstep_flags = type;
1633 put_packet(s, "OK");
1634 break;
aliguori880a7572008-11-18 20:30:24 +00001635 } else if (strcmp(p,"C") == 0) {
Luc Michel8dbbe9a2019-01-07 15:23:46 +00001636 /*
1637 * "Current thread" remains vague in the spec, so always return
1638 * the first thread of the current process (gdb returns the
1639 * first thread).
1640 */
1641 cpu = get_first_cpu_in_process(s, gdb_get_cpu_process(s, s->g_cpu));
1642 snprintf(buf, sizeof(buf), "QC%s",
1643 gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id)));
1644 put_packet(s, buf);
aliguori880a7572008-11-18 20:30:24 +00001645 break;
1646 } else if (strcmp(p,"fThreadInfo") == 0) {
Luc Michel7cf48f62019-01-07 15:23:46 +00001647 s->query_cpu = gdb_first_attached_cpu(s);
aliguori880a7572008-11-18 20:30:24 +00001648 goto report_cpuinfo;
1649 } else if (strcmp(p,"sThreadInfo") == 0) {
1650 report_cpuinfo:
1651 if (s->query_cpu) {
Luc Michel7cf48f62019-01-07 15:23:46 +00001652 snprintf(buf, sizeof(buf), "m%s",
1653 gdb_fmt_thread_id(s, s->query_cpu,
1654 thread_id, sizeof(thread_id)));
aliguori880a7572008-11-18 20:30:24 +00001655 put_packet(s, buf);
Luc Michel7cf48f62019-01-07 15:23:46 +00001656 s->query_cpu = gdb_next_attached_cpu(s, s->query_cpu);
aliguori880a7572008-11-18 20:30:24 +00001657 } else
1658 put_packet(s, "l");
1659 break;
1660 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
Luc Michel7cf48f62019-01-07 15:23:46 +00001661 if (read_thread_id(p + 16, &p, &pid, &tid) == GDB_READ_THREAD_ERR) {
1662 put_packet(s, "E22");
1663 break;
1664 }
1665 cpu = gdb_get_cpu(s, pid, tid);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001666 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001667 cpu_synchronize_state(cpu);
Luc Michel7cf48f62019-01-07 15:23:46 +00001668
1669 if (s->multiprocess && (s->process_num > 1)) {
1670 /* Print the CPU model and name in multiprocess mode */
1671 ObjectClass *oc = object_get_class(OBJECT(cpu));
1672 const char *cpu_model = object_class_get_name(oc);
1673 char *cpu_name =
1674 object_get_canonical_path_component(OBJECT(cpu));
1675 len = snprintf((char *)mem_buf, sizeof(buf) / 2,
1676 "%s %s [%s]", cpu_model, cpu_name,
1677 cpu->halted ? "halted " : "running");
1678 g_free(cpu_name);
1679 } else {
1680 /* memtohex() doubles the required space */
1681 len = snprintf((char *)mem_buf, sizeof(buf) / 2,
1682 "CPU#%d [%s]", cpu->cpu_index,
1683 cpu->halted ? "halted " : "running");
1684 }
Doug Gale5c9522b2017-12-02 20:30:37 -05001685 trace_gdbstub_op_extra_info((char *)mem_buf);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001686 memtohex(buf, mem_buf, len);
1687 put_packet(s, buf);
1688 }
aliguori880a7572008-11-18 20:30:24 +00001689 break;
edgar_igl60897d32008-05-09 08:25:14 +00001690 }
blueswir10b8a9882009-03-07 10:51:36 +00001691#ifdef CONFIG_USER_ONLY
Jan Kiszka070949f2015-02-07 09:38:42 +01001692 else if (strcmp(p, "Offsets") == 0) {
Andreas Färber0429a972013-08-26 18:14:44 +02001693 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00001694
blueswir1363a37d2008-08-21 17:58:08 +00001695 snprintf(buf, sizeof(buf),
1696 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1697 ";Bss=" TARGET_ABI_FMT_lx,
1698 ts->info->code_offset,
1699 ts->info->data_offset,
1700 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001701 put_packet(s, buf);
1702 break;
1703 }
blueswir10b8a9882009-03-07 10:51:36 +00001704#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001705 else if (strncmp(p, "Rcmd,", 5) == 0) {
1706 int len = strlen(p + 5);
1707
1708 if ((len % 2) != 0) {
1709 put_packet(s, "E01");
1710 break;
1711 }
aliguori8a34a0f2009-03-05 23:01:55 +00001712 len = len / 2;
Kevin Wolf5accecb2015-10-13 09:38:50 +02001713 hextomem(mem_buf, p + 5, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001714 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001715 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001716 put_packet(s, "OK");
1717 break;
1718 }
blueswir10b8a9882009-03-07 10:51:36 +00001719#endif /* !CONFIG_USER_ONLY */
Jan Kiszka4dabe742015-02-07 09:38:43 +01001720 if (is_query_packet(p, "Supported", ':')) {
blueswir15b3715b2008-10-25 11:18:12 +00001721 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
Andreas Färber5b24c642013-07-07 15:08:22 +02001722 cc = CPU_GET_CLASS(first_cpu);
1723 if (cc->gdb_core_xml_file != NULL) {
1724 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
1725 }
Luc Michel364fce62019-01-07 15:23:46 +00001726
1727 if (strstr(p, "multiprocess+")) {
1728 s->multiprocess = true;
1729 }
1730 pstrcat(buf, sizeof(buf), ";multiprocess+");
1731
pbrook56aebc82008-10-11 17:55:29 +00001732 put_packet(s, buf);
1733 break;
1734 }
pbrook56aebc82008-10-11 17:55:29 +00001735 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1736 const char *xml;
1737 target_ulong total_len;
1738
Luc Michelc145eea2019-01-07 15:23:46 +00001739 process = gdb_get_cpu_process(s, s->g_cpu);
1740 cc = CPU_GET_CLASS(s->g_cpu);
Andreas Färber5b24c642013-07-07 15:08:22 +02001741 if (cc->gdb_core_xml_file == NULL) {
1742 goto unknown_command;
1743 }
1744
Andreas Färber5b50e792013-06-29 04:18:45 +02001745 gdb_has_xml = true;
pbrook56aebc82008-10-11 17:55:29 +00001746 p += 19;
Luc Michelc145eea2019-01-07 15:23:46 +00001747 xml = get_feature_xml(s, p, &p, process);
pbrook56aebc82008-10-11 17:55:29 +00001748 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001749 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001750 put_packet(s, buf);
1751 break;
1752 }
1753
1754 if (*p == ':')
1755 p++;
1756 addr = strtoul(p, (char **)&p, 16);
1757 if (*p == ',')
1758 p++;
1759 len = strtoul(p, (char **)&p, 16);
1760
1761 total_len = strlen(xml);
1762 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001763 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001764 put_packet(s, buf);
1765 break;
1766 }
1767 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1768 len = (MAX_PACKET_LENGTH - 5) / 2;
1769 if (len < total_len - addr) {
1770 buf[0] = 'm';
1771 len = memtox(buf + 1, xml + addr, len);
1772 } else {
1773 buf[0] = 'l';
1774 len = memtox(buf + 1, xml + addr, total_len - addr);
1775 }
Doug Gale5c9522b2017-12-02 20:30:37 -05001776 put_packet_binary(s, buf, len + 1, true);
pbrook56aebc82008-10-11 17:55:29 +00001777 break;
1778 }
Jan Kiszkaa3919382015-02-07 09:38:44 +01001779 if (is_query_packet(p, "Attached", ':')) {
1780 put_packet(s, GDB_ATTACHED);
1781 break;
1782 }
pbrook56aebc82008-10-11 17:55:29 +00001783 /* Unrecognised 'q' command. */
1784 goto unknown_command;
1785
bellard858693c2004-03-31 18:52:07 +00001786 default:
pbrook56aebc82008-10-11 17:55:29 +00001787 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001788 /* put empty packet */
1789 buf[0] = '\0';
1790 put_packet(s, buf);
1791 break;
1792 }
1793 return RS_IDLE;
1794}
1795
Andreas Färber64f6b342013-05-27 02:06:09 +02001796void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001797{
Luc Michel160d8582019-01-07 15:23:46 +00001798 GDBProcess *p = gdb_get_cpu_process(gdbserver_state, cpu);
1799
1800 if (!p->attached) {
1801 /*
1802 * Having a stop CPU corresponding to a process that is not attached
1803 * confuses GDB. So we ignore the request.
1804 */
1805 return;
1806 }
1807
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001808 gdbserver_state->c_cpu = cpu;
1809 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001810}
1811
bellard1fddef42005-04-17 19:16:13 +00001812#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001813static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001814{
aliguori880a7572008-11-18 20:30:24 +00001815 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001816 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001817 char buf[256];
Luc Michel95567c22019-01-07 15:23:46 +00001818 char thread_id[16];
aliguorid6fc1b32008-11-18 19:55:44 +00001819 const char *type;
bellard858693c2004-03-31 18:52:07 +00001820 int ret;
1821
Meador Ingecdb432b2012-03-15 17:49:45 +00001822 if (running || s->state == RS_INACTIVE) {
1823 return;
1824 }
1825 /* Is there a GDB syscall waiting to be sent? */
1826 if (s->current_syscall_cb) {
1827 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001828 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001829 }
Luc Michel95567c22019-01-07 15:23:46 +00001830
1831 if (cpu == NULL) {
1832 /* No process attached */
1833 return;
1834 }
1835
1836 gdb_fmt_thread_id(s, cpu, thread_id, sizeof(thread_id));
1837
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001838 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001839 case RUN_STATE_DEBUG:
Andreas Färberff4700b2013-08-26 18:23:18 +02001840 if (cpu->watchpoint_hit) {
1841 switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001842 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001843 type = "r";
1844 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001845 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001846 type = "a";
1847 break;
1848 default:
1849 type = "";
1850 break;
1851 }
Doug Gale5c9522b2017-12-02 20:30:37 -05001852 trace_gdbstub_hit_watchpoint(type, cpu_gdb_index(cpu),
1853 (target_ulong)cpu->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001854 snprintf(buf, sizeof(buf),
Luc Michel95567c22019-01-07 15:23:46 +00001855 "T%02xthread:%s;%swatch:" TARGET_FMT_lx ";",
1856 GDB_SIGNAL_TRAP, thread_id, type,
Andreas Färberff4700b2013-08-26 18:23:18 +02001857 (target_ulong)cpu->watchpoint_hit->vaddr);
1858 cpu->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001859 goto send_packet;
Doug Gale5c9522b2017-12-02 20:30:37 -05001860 } else {
1861 trace_gdbstub_hit_break();
pbrook6658ffb2007-03-16 23:58:11 +00001862 }
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001863 tb_flush(cpu);
aurel32ca587a82008-12-18 22:44:13 +00001864 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001865 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001866 case RUN_STATE_PAUSED:
Doug Gale5c9522b2017-12-02 20:30:37 -05001867 trace_gdbstub_hit_paused();
aliguori9781e042009-01-22 17:15:29 +00001868 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001869 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001870 case RUN_STATE_SHUTDOWN:
Doug Gale5c9522b2017-12-02 20:30:37 -05001871 trace_gdbstub_hit_shutdown();
Jan Kiszka425189a2011-03-22 11:02:09 +01001872 ret = GDB_SIGNAL_QUIT;
1873 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001874 case RUN_STATE_IO_ERROR:
Doug Gale5c9522b2017-12-02 20:30:37 -05001875 trace_gdbstub_hit_io_error();
Jan Kiszka425189a2011-03-22 11:02:09 +01001876 ret = GDB_SIGNAL_IO;
1877 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001878 case RUN_STATE_WATCHDOG:
Doug Gale5c9522b2017-12-02 20:30:37 -05001879 trace_gdbstub_hit_watchdog();
Jan Kiszka425189a2011-03-22 11:02:09 +01001880 ret = GDB_SIGNAL_ALRM;
1881 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001882 case RUN_STATE_INTERNAL_ERROR:
Doug Gale5c9522b2017-12-02 20:30:37 -05001883 trace_gdbstub_hit_internal_error();
Jan Kiszka425189a2011-03-22 11:02:09 +01001884 ret = GDB_SIGNAL_ABRT;
1885 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001886 case RUN_STATE_SAVE_VM:
1887 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001888 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001889 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001890 ret = GDB_SIGNAL_XCPU;
1891 break;
1892 default:
Doug Gale5c9522b2017-12-02 20:30:37 -05001893 trace_gdbstub_hit_unknown(state);
Jan Kiszka425189a2011-03-22 11:02:09 +01001894 ret = GDB_SIGNAL_UNKNOWN;
1895 break;
bellardbbeb7b52006-04-23 18:42:15 +00001896 }
Jan Kiszka226d0072015-07-24 18:52:31 +02001897 gdb_set_stop_cpu(cpu);
Luc Michel95567c22019-01-07 15:23:46 +00001898 snprintf(buf, sizeof(buf), "T%02xthread:%s;", ret, thread_id);
Jan Kiszka425189a2011-03-22 11:02:09 +01001899
1900send_packet:
bellard858693c2004-03-31 18:52:07 +00001901 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001902
1903 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001904 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001905}
bellard1fddef42005-04-17 19:16:13 +00001906#endif
bellard858693c2004-03-31 18:52:07 +00001907
pbrooka2d1eba2007-01-28 03:10:55 +00001908/* Send a gdb syscall request.
1909 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001910 %x - target_ulong argument printed in hex.
1911 %lx - 64-bit argument printed in hex.
1912 %s - string pointer (target_ulong) and length (int) pair. */
Peter Maydell19239b32015-09-07 10:39:27 +01001913void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
pbrooka2d1eba2007-01-28 03:10:55 +00001914{
pbrooka2d1eba2007-01-28 03:10:55 +00001915 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001916 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001917 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001918 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001919 GDBState *s;
1920
aliguori880a7572008-11-18 20:30:24 +00001921 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001922 if (!s)
1923 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001924 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001925#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001926 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001927#endif
Meador Ingecdb432b2012-03-15 17:49:45 +00001928 p = s->syscall_buf;
1929 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001930 *(p++) = 'F';
1931 while (*fmt) {
1932 if (*fmt == '%') {
1933 fmt++;
1934 switch (*fmt++) {
1935 case 'x':
1936 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001937 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001938 break;
pbrooka87295e2007-05-26 15:09:38 +00001939 case 'l':
1940 if (*(fmt++) != 'x')
1941 goto bad_format;
1942 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001943 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001944 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001945 case 's':
1946 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001947 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001948 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001949 break;
1950 default:
pbrooka87295e2007-05-26 15:09:38 +00001951 bad_format:
Ziyue Yang7ae6c572017-01-18 16:03:29 +08001952 error_report("gdbstub: Bad syscall format string '%s'",
1953 fmt - 1);
pbrooka2d1eba2007-01-28 03:10:55 +00001954 break;
1955 }
1956 } else {
1957 *(p++) = *(fmt++);
1958 }
1959 }
pbrook8a93e022007-08-06 13:19:15 +00001960 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001961#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001962 put_packet(s, s->syscall_buf);
Peter Maydell4f710862018-05-15 19:19:58 +01001963 /* Return control to gdb for it to process the syscall request.
1964 * Since the protocol requires that gdb hands control back to us
1965 * using a "here are the results" F packet, we don't need to check
1966 * gdb_handlesig's return value (which is the signal to deliver if
1967 * execution was resumed via a continue packet).
1968 */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001969 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001970#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001971 /* In this case wait to send the syscall packet until notification that
1972 the CPU has stopped. This must be done because if the packet is sent
1973 now the reply from the syscall request could be received while the CPU
1974 is still in the running state, which can cause packets to be dropped
1975 and state transition 'T' packets to be sent while the syscall is still
1976 being processed. */
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001977 qemu_cpu_kick(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001978#endif
1979}
1980
Peter Maydell19239b32015-09-07 10:39:27 +01001981void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
1982{
1983 va_list va;
1984
1985 va_start(va, fmt);
1986 gdb_do_syscallv(cb, fmt, va);
1987 va_end(va);
1988}
1989
bellard6a00d602005-11-21 23:25:50 +00001990static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001991{
ths60fe76f2007-12-16 03:02:09 +00001992 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001993
bellard1fddef42005-04-17 19:16:13 +00001994#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001995 if (s->last_packet_len) {
1996 /* Waiting for a response to the last packet. If we see the start
1997 of a new command then abandon the previous response. */
1998 if (ch == '-') {
Doug Gale5c9522b2017-12-02 20:30:37 -05001999 trace_gdbstub_err_got_nack();
thsffe8ab82007-12-16 03:16:05 +00002000 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
Alex Bennée118e2262017-07-12 11:52:13 +01002001 } else if (ch == '+') {
Doug Gale5c9522b2017-12-02 20:30:37 -05002002 trace_gdbstub_io_got_ack();
Alex Bennée118e2262017-07-12 11:52:13 +01002003 } else {
Doug Gale5c9522b2017-12-02 20:30:37 -05002004 trace_gdbstub_io_got_unexpected((uint8_t)ch);
pbrook4046d912007-01-28 01:53:16 +00002005 }
Alex Bennée118e2262017-07-12 11:52:13 +01002006
pbrook4046d912007-01-28 01:53:16 +00002007 if (ch == '+' || ch == '$')
2008 s->last_packet_len = 0;
2009 if (ch != '$')
2010 return;
2011 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002012 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002013 /* when the CPU is running, we cannot do anything except stop
2014 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002015 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002016 } else
bellard1fddef42005-04-17 19:16:13 +00002017#endif
bellard41625032005-04-24 10:07:11 +00002018 {
bellard858693c2004-03-31 18:52:07 +00002019 switch(s->state) {
2020 case RS_IDLE:
2021 if (ch == '$') {
Doug Gale4bf43122017-05-01 12:22:10 -04002022 /* start of command packet */
bellard858693c2004-03-31 18:52:07 +00002023 s->line_buf_index = 0;
Doug Gale4bf43122017-05-01 12:22:10 -04002024 s->line_sum = 0;
bellard858693c2004-03-31 18:52:07 +00002025 s->state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04002026 } else {
Doug Gale5c9522b2017-12-02 20:30:37 -05002027 trace_gdbstub_err_garbage((uint8_t)ch);
bellard4c3a88a2003-07-26 12:06:08 +00002028 }
2029 break;
bellard858693c2004-03-31 18:52:07 +00002030 case RS_GETLINE:
Doug Gale4bf43122017-05-01 12:22:10 -04002031 if (ch == '}') {
2032 /* start escape sequence */
2033 s->state = RS_GETLINE_ESC;
2034 s->line_sum += ch;
2035 } else if (ch == '*') {
2036 /* start run length encoding sequence */
2037 s->state = RS_GETLINE_RLE;
2038 s->line_sum += ch;
2039 } else if (ch == '#') {
2040 /* end of command, start of checksum*/
2041 s->state = RS_CHKSUM1;
bellard858693c2004-03-31 18:52:07 +00002042 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
Doug Gale5c9522b2017-12-02 20:30:37 -05002043 trace_gdbstub_err_overrun();
bellard858693c2004-03-31 18:52:07 +00002044 s->state = RS_IDLE;
2045 } else {
Doug Gale4bf43122017-05-01 12:22:10 -04002046 /* unescaped command character */
2047 s->line_buf[s->line_buf_index++] = ch;
2048 s->line_sum += ch;
2049 }
2050 break;
2051 case RS_GETLINE_ESC:
2052 if (ch == '#') {
2053 /* unexpected end of command in escape sequence */
2054 s->state = RS_CHKSUM1;
2055 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2056 /* command buffer overrun */
Doug Gale5c9522b2017-12-02 20:30:37 -05002057 trace_gdbstub_err_overrun();
Doug Gale4bf43122017-05-01 12:22:10 -04002058 s->state = RS_IDLE;
2059 } else {
2060 /* parse escaped character and leave escape state */
2061 s->line_buf[s->line_buf_index++] = ch ^ 0x20;
2062 s->line_sum += ch;
2063 s->state = RS_GETLINE;
2064 }
2065 break;
2066 case RS_GETLINE_RLE:
2067 if (ch < ' ') {
2068 /* invalid RLE count encoding */
Doug Gale5c9522b2017-12-02 20:30:37 -05002069 trace_gdbstub_err_invalid_repeat((uint8_t)ch);
Doug Gale4bf43122017-05-01 12:22:10 -04002070 s->state = RS_GETLINE;
2071 } else {
2072 /* decode repeat length */
2073 int repeat = (unsigned char)ch - ' ' + 3;
2074 if (s->line_buf_index + repeat >= sizeof(s->line_buf) - 1) {
2075 /* that many repeats would overrun the command buffer */
Doug Gale5c9522b2017-12-02 20:30:37 -05002076 trace_gdbstub_err_overrun();
Doug Gale4bf43122017-05-01 12:22:10 -04002077 s->state = RS_IDLE;
2078 } else if (s->line_buf_index < 1) {
2079 /* got a repeat but we have nothing to repeat */
Doug Gale5c9522b2017-12-02 20:30:37 -05002080 trace_gdbstub_err_invalid_rle();
Doug Gale4bf43122017-05-01 12:22:10 -04002081 s->state = RS_GETLINE;
2082 } else {
2083 /* repeat the last character */
2084 memset(s->line_buf + s->line_buf_index,
2085 s->line_buf[s->line_buf_index - 1], repeat);
2086 s->line_buf_index += repeat;
2087 s->line_sum += ch;
2088 s->state = RS_GETLINE;
2089 }
bellard858693c2004-03-31 18:52:07 +00002090 }
2091 break;
2092 case RS_CHKSUM1:
Doug Gale4bf43122017-05-01 12:22:10 -04002093 /* get high hex digit of checksum */
2094 if (!isxdigit(ch)) {
Doug Gale5c9522b2017-12-02 20:30:37 -05002095 trace_gdbstub_err_checksum_invalid((uint8_t)ch);
Doug Gale4bf43122017-05-01 12:22:10 -04002096 s->state = RS_GETLINE;
2097 break;
2098 }
bellard858693c2004-03-31 18:52:07 +00002099 s->line_buf[s->line_buf_index] = '\0';
2100 s->line_csum = fromhex(ch) << 4;
2101 s->state = RS_CHKSUM2;
2102 break;
2103 case RS_CHKSUM2:
Doug Gale4bf43122017-05-01 12:22:10 -04002104 /* get low hex digit of checksum */
2105 if (!isxdigit(ch)) {
Doug Gale5c9522b2017-12-02 20:30:37 -05002106 trace_gdbstub_err_checksum_invalid((uint8_t)ch);
Doug Gale4bf43122017-05-01 12:22:10 -04002107 s->state = RS_GETLINE;
2108 break;
bellard858693c2004-03-31 18:52:07 +00002109 }
Doug Gale4bf43122017-05-01 12:22:10 -04002110 s->line_csum |= fromhex(ch);
2111
2112 if (s->line_csum != (s->line_sum & 0xff)) {
Doug Gale5c9522b2017-12-02 20:30:37 -05002113 trace_gdbstub_err_checksum_incorrect(s->line_sum, s->line_csum);
Doug Gale4bf43122017-05-01 12:22:10 -04002114 /* send NAK reply */
ths60fe76f2007-12-16 03:02:09 +00002115 reply = '-';
2116 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002117 s->state = RS_IDLE;
2118 } else {
Doug Gale4bf43122017-05-01 12:22:10 -04002119 /* send ACK reply */
ths60fe76f2007-12-16 03:02:09 +00002120 reply = '+';
2121 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002122 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002123 }
bellardb4608c02003-06-27 17:34:32 +00002124 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002125 default:
2126 abort();
bellardb4608c02003-06-27 17:34:32 +00002127 }
2128 }
bellard858693c2004-03-31 18:52:07 +00002129}
2130
Paul Brook0e1c9c52010-06-16 13:03:51 +01002131/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002132void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002133{
2134 GDBState *s;
2135 char buf[4];
2136
2137 s = gdbserver_state;
2138 if (!s) {
2139 return;
2140 }
2141#ifdef CONFIG_USER_ONLY
2142 if (gdbserver_fd < 0 || s->fd < 0) {
2143 return;
2144 }
2145#endif
2146
Doug Gale5c9522b2017-12-02 20:30:37 -05002147 trace_gdbstub_op_exiting((uint8_t)code);
2148
Paul Brook0e1c9c52010-06-16 13:03:51 +01002149 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2150 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002151
2152#ifndef CONFIG_USER_ONLY
Marc-André Lureau1ce26102017-01-27 00:49:13 +04002153 qemu_chr_fe_deinit(&s->chr, true);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002154#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002155}
2156
Luc Michel8f468632019-01-07 15:23:45 +00002157/*
2158 * Create the process that will contain all the "orphan" CPUs (that are not
2159 * part of a CPU cluster). Note that if this process contains no CPUs, it won't
2160 * be attachable and thus will be invisible to the user.
2161 */
2162static void create_default_process(GDBState *s)
2163{
2164 GDBProcess *process;
2165 int max_pid = 0;
2166
2167 if (s->process_num) {
2168 max_pid = s->processes[s->process_num - 1].pid;
2169 }
2170
2171 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
2172 process = &s->processes[s->process_num - 1];
2173
2174 /* We need an available PID slot for this process */
2175 assert(max_pid < UINT32_MAX);
2176
2177 process->pid = max_pid + 1;
2178 process->attached = false;
Luc Michelc145eea2019-01-07 15:23:46 +00002179 process->target_xml[0] = '\0';
Luc Michel8f468632019-01-07 15:23:45 +00002180}
2181
bellard1fddef42005-04-17 19:16:13 +00002182#ifdef CONFIG_USER_ONLY
2183int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002184gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002185{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002186 GDBState *s;
2187 char buf[256];
2188 int n;
bellard1fddef42005-04-17 19:16:13 +00002189
Andreas Färber5ca666c2013-06-24 19:20:57 +02002190 s = gdbserver_state;
2191 if (gdbserver_fd < 0 || s->fd < 0) {
2192 return sig;
bellard1fddef42005-04-17 19:16:13 +00002193 }
2194
Andreas Färber5ca666c2013-06-24 19:20:57 +02002195 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002196 cpu_single_step(cpu, 0);
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07002197 tb_flush(cpu);
bellard1fddef42005-04-17 19:16:13 +00002198
Andreas Färber5ca666c2013-06-24 19:20:57 +02002199 if (sig != 0) {
2200 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2201 put_packet(s, buf);
2202 }
2203 /* put_packet() might have detected that the peer terminated the
2204 connection. */
2205 if (s->fd < 0) {
2206 return sig;
2207 }
2208
2209 sig = 0;
2210 s->state = RS_IDLE;
2211 s->running_state = 0;
2212 while (s->running_state == 0) {
2213 n = read(s->fd, buf, 256);
2214 if (n > 0) {
2215 int i;
2216
2217 for (i = 0; i < n; i++) {
2218 gdb_read_byte(s, buf[i]);
2219 }
Peter Wu5819e3e2016-06-05 16:35:48 +02002220 } else {
Andreas Färber5ca666c2013-06-24 19:20:57 +02002221 /* XXX: Connection closed. Should probably wait for another
2222 connection before continuing. */
Peter Wu5819e3e2016-06-05 16:35:48 +02002223 if (n == 0) {
2224 close(s->fd);
2225 }
2226 s->fd = -1;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002227 return sig;
bellard1fddef42005-04-17 19:16:13 +00002228 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002229 }
2230 sig = s->signal;
2231 s->signal = 0;
2232 return sig;
bellard1fddef42005-04-17 19:16:13 +00002233}
bellarde9009672005-04-26 20:42:36 +00002234
aurel32ca587a82008-12-18 22:44:13 +00002235/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002236void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002237{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002238 GDBState *s;
2239 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002240
Andreas Färber5ca666c2013-06-24 19:20:57 +02002241 s = gdbserver_state;
2242 if (gdbserver_fd < 0 || s->fd < 0) {
2243 return;
2244 }
aurel32ca587a82008-12-18 22:44:13 +00002245
Andreas Färber5ca666c2013-06-24 19:20:57 +02002246 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2247 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002248}
bellard1fddef42005-04-17 19:16:13 +00002249
Peter Maydell2f652222018-05-14 18:30:44 +01002250static bool gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002251{
2252 GDBState *s;
2253 struct sockaddr_in sockaddr;
2254 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002255 int fd;
bellard858693c2004-03-31 18:52:07 +00002256
2257 for(;;) {
2258 len = sizeof(sockaddr);
2259 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2260 if (fd < 0 && errno != EINTR) {
2261 perror("accept");
Peter Maydell2f652222018-05-14 18:30:44 +01002262 return false;
bellard858693c2004-03-31 18:52:07 +00002263 } else if (fd >= 0) {
Peter Maydellf5bdd782018-05-14 18:30:43 +01002264 qemu_set_cloexec(fd);
bellard858693c2004-03-31 18:52:07 +00002265 break;
2266 }
2267 }
2268
2269 /* set short latency */
Peter Maydell2f652222018-05-14 18:30:44 +01002270 if (socket_set_nodelay(fd)) {
2271 perror("setsockopt");
Philippe Mathieu-Daudéead75d82018-05-24 19:34:58 -03002272 close(fd);
Peter Maydell2f652222018-05-14 18:30:44 +01002273 return false;
2274 }
ths3b46e622007-09-17 08:09:54 +00002275
Anthony Liguori7267c092011-08-20 22:09:37 -05002276 s = g_malloc0(sizeof(GDBState));
Luc Michel8f468632019-01-07 15:23:45 +00002277 create_default_process(s);
Luc Michel970ed902019-01-07 15:23:46 +00002278 s->processes[0].attached = true;
2279 s->c_cpu = gdb_first_attached_cpu(s);
2280 s->g_cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002281 s->fd = fd;
Andreas Färber5b50e792013-06-29 04:18:45 +02002282 gdb_has_xml = false;
bellard858693c2004-03-31 18:52:07 +00002283
aliguori880a7572008-11-18 20:30:24 +00002284 gdbserver_state = s;
Peter Maydell2f652222018-05-14 18:30:44 +01002285 return true;
bellard858693c2004-03-31 18:52:07 +00002286}
2287
2288static int gdbserver_open(int port)
2289{
2290 struct sockaddr_in sockaddr;
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02002291 int fd, ret;
bellard858693c2004-03-31 18:52:07 +00002292
2293 fd = socket(PF_INET, SOCK_STREAM, 0);
2294 if (fd < 0) {
2295 perror("socket");
2296 return -1;
2297 }
Peter Maydellf5bdd782018-05-14 18:30:43 +01002298 qemu_set_cloexec(fd);
bellard858693c2004-03-31 18:52:07 +00002299
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02002300 socket_set_fast_reuse(fd);
bellard858693c2004-03-31 18:52:07 +00002301
2302 sockaddr.sin_family = AF_INET;
2303 sockaddr.sin_port = htons(port);
2304 sockaddr.sin_addr.s_addr = 0;
2305 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2306 if (ret < 0) {
2307 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002308 close(fd);
bellard858693c2004-03-31 18:52:07 +00002309 return -1;
2310 }
Peter Wu96165b92016-05-04 11:32:17 +02002311 ret = listen(fd, 1);
bellard858693c2004-03-31 18:52:07 +00002312 if (ret < 0) {
2313 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002314 close(fd);
bellard858693c2004-03-31 18:52:07 +00002315 return -1;
2316 }
bellard858693c2004-03-31 18:52:07 +00002317 return fd;
2318}
2319
2320int gdbserver_start(int port)
2321{
2322 gdbserver_fd = gdbserver_open(port);
2323 if (gdbserver_fd < 0)
2324 return -1;
2325 /* accept connections */
Peter Maydell2f652222018-05-14 18:30:44 +01002326 if (!gdb_accept()) {
2327 close(gdbserver_fd);
2328 gdbserver_fd = -1;
2329 return -1;
2330 }
bellardb4608c02003-06-27 17:34:32 +00002331 return 0;
2332}
aurel322b1319c2008-12-18 22:44:04 +00002333
2334/* Disable gdb stub for child processes. */
Peter Crosthwaitef7ec7f72015-06-23 19:31:16 -07002335void gdbserver_fork(CPUState *cpu)
aurel322b1319c2008-12-18 22:44:04 +00002336{
2337 GDBState *s = gdbserver_state;
Andreas Färber75a34032013-09-02 16:57:02 +02002338
2339 if (gdbserver_fd < 0 || s->fd < 0) {
2340 return;
2341 }
aurel322b1319c2008-12-18 22:44:04 +00002342 close(s->fd);
2343 s->fd = -1;
Andreas Färberb3310ab2013-09-02 17:26:20 +02002344 cpu_breakpoint_remove_all(cpu, BP_GDB);
Andreas Färber75a34032013-09-02 16:57:02 +02002345 cpu_watchpoint_remove_all(cpu, BP_GDB);
aurel322b1319c2008-12-18 22:44:04 +00002346}
pbrook4046d912007-01-28 01:53:16 +00002347#else
thsaa1f17c2007-07-11 22:48:58 +00002348static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002349{
pbrook56aebc82008-10-11 17:55:29 +00002350 /* We can handle an arbitrarily large amount of data.
2351 Pick the maximum packet size, which is as good as anything. */
2352 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002353}
2354
thsaa1f17c2007-07-11 22:48:58 +00002355static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002356{
pbrook4046d912007-01-28 01:53:16 +00002357 int i;
2358
2359 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002360 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002361 }
2362}
2363
2364static void gdb_chr_event(void *opaque, int event)
2365{
Luc Michel970ed902019-01-07 15:23:46 +00002366 int i;
2367 GDBState *s = (GDBState *) opaque;
2368
pbrook4046d912007-01-28 01:53:16 +00002369 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302370 case CHR_EVENT_OPENED:
Luc Michel970ed902019-01-07 15:23:46 +00002371 /* Start with first process attached, others detached */
2372 for (i = 0; i < s->process_num; i++) {
2373 s->processes[i].attached = !i;
2374 }
2375
2376 s->c_cpu = gdb_first_attached_cpu(s);
2377 s->g_cpu = s->c_cpu;
2378
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002379 vm_stop(RUN_STATE_PAUSED);
Andreas Färber5b50e792013-06-29 04:18:45 +02002380 gdb_has_xml = false;
pbrook4046d912007-01-28 01:53:16 +00002381 break;
2382 default:
2383 break;
2384 }
2385}
2386
aliguori8a34a0f2009-03-05 23:01:55 +00002387static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2388{
2389 char buf[MAX_PACKET_LENGTH];
2390
2391 buf[0] = 'O';
2392 if (len > (MAX_PACKET_LENGTH/2) - 1)
2393 len = (MAX_PACKET_LENGTH/2) - 1;
2394 memtohex(buf + 1, (uint8_t *)msg, len);
2395 put_packet(s, buf);
2396}
2397
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03002398static int gdb_monitor_write(Chardev *chr, const uint8_t *buf, int len)
aliguori8a34a0f2009-03-05 23:01:55 +00002399{
2400 const char *p = (const char *)buf;
2401 int max_sz;
2402
2403 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2404 for (;;) {
2405 if (len <= max_sz) {
2406 gdb_monitor_output(gdbserver_state, p, len);
2407 break;
2408 }
2409 gdb_monitor_output(gdbserver_state, p, max_sz);
2410 p += max_sz;
2411 len -= max_sz;
2412 }
2413 return len;
2414}
2415
aliguori59030a82009-04-05 18:43:41 +00002416#ifndef _WIN32
2417static void gdb_sigterm_handler(int signal)
2418{
Luiz Capitulino13548692011-07-29 15:36:43 -03002419 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002420 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002421 }
aliguori59030a82009-04-05 18:43:41 +00002422}
2423#endif
2424
Marc-André Lureau777357d2016-12-07 18:39:10 +03002425static void gdb_monitor_open(Chardev *chr, ChardevBackend *backend,
2426 bool *be_opened, Error **errp)
2427{
2428 *be_opened = false;
2429}
2430
2431static void char_gdb_class_init(ObjectClass *oc, void *data)
2432{
2433 ChardevClass *cc = CHARDEV_CLASS(oc);
2434
2435 cc->internal = true;
2436 cc->open = gdb_monitor_open;
2437 cc->chr_write = gdb_monitor_write;
2438}
2439
2440#define TYPE_CHARDEV_GDB "chardev-gdb"
2441
2442static const TypeInfo char_gdb_type_info = {
2443 .name = TYPE_CHARDEV_GDB,
2444 .parent = TYPE_CHARDEV,
2445 .class_init = char_gdb_class_init,
2446};
2447
Luc Michel8f468632019-01-07 15:23:45 +00002448static int find_cpu_clusters(Object *child, void *opaque)
2449{
2450 if (object_dynamic_cast(child, TYPE_CPU_CLUSTER)) {
2451 GDBState *s = (GDBState *) opaque;
2452 CPUClusterState *cluster = CPU_CLUSTER(child);
2453 GDBProcess *process;
2454
2455 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
2456
2457 process = &s->processes[s->process_num - 1];
2458
2459 /*
2460 * GDB process IDs -1 and 0 are reserved. To avoid subtle errors at
2461 * runtime, we enforce here that the machine does not use a cluster ID
2462 * that would lead to PID 0.
2463 */
2464 assert(cluster->cluster_id != UINT32_MAX);
2465 process->pid = cluster->cluster_id + 1;
2466 process->attached = false;
Luc Michelc145eea2019-01-07 15:23:46 +00002467 process->target_xml[0] = '\0';
Luc Michel8f468632019-01-07 15:23:45 +00002468
2469 return 0;
2470 }
2471
2472 return object_child_foreach(child, find_cpu_clusters, opaque);
2473}
2474
2475static int pid_order(const void *a, const void *b)
2476{
2477 GDBProcess *pa = (GDBProcess *) a;
2478 GDBProcess *pb = (GDBProcess *) b;
2479
2480 if (pa->pid < pb->pid) {
2481 return -1;
2482 } else if (pa->pid > pb->pid) {
2483 return 1;
2484 } else {
2485 return 0;
2486 }
2487}
2488
2489static void create_processes(GDBState *s)
2490{
2491 object_child_foreach(object_get_root(), find_cpu_clusters, s);
2492
2493 if (s->processes) {
2494 /* Sort by PID */
2495 qsort(s->processes, s->process_num, sizeof(s->processes[0]), pid_order);
2496 }
2497
2498 create_default_process(s);
2499}
2500
2501static void cleanup_processes(GDBState *s)
2502{
2503 g_free(s->processes);
2504 s->process_num = 0;
2505 s->processes = NULL;
2506}
2507
aliguori59030a82009-04-05 18:43:41 +00002508int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002509{
Doug Gale5c9522b2017-12-02 20:30:37 -05002510 trace_gdbstub_op_start(device);
2511
pbrook4046d912007-01-28 01:53:16 +00002512 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002513 char gdbstub_device_name[128];
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03002514 Chardev *chr = NULL;
2515 Chardev *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002516
Ziyue Yang508b4ec2017-01-18 16:02:41 +08002517 if (!first_cpu) {
2518 error_report("gdbstub: meaningless to attach gdb to a "
2519 "machine without any CPU.");
2520 return -1;
2521 }
2522
aliguori59030a82009-04-05 18:43:41 +00002523 if (!device)
2524 return -1;
2525 if (strcmp(device, "none") != 0) {
2526 if (strstart(device, "tcp:", NULL)) {
2527 /* enforce required TCP attributes */
2528 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2529 "%s,nowait,nodelay,server", device);
2530 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002531 }
aliguori59030a82009-04-05 18:43:41 +00002532#ifndef _WIN32
2533 else if (strcmp(device, "stdio") == 0) {
2534 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002535
aliguori59030a82009-04-05 18:43:41 +00002536 memset(&act, 0, sizeof(act));
2537 act.sa_handler = gdb_sigterm_handler;
2538 sigaction(SIGINT, &act, NULL);
2539 }
2540#endif
Marc-André Lureau95e30b22018-08-22 19:19:42 +02002541 /*
2542 * FIXME: it's a bit weird to allow using a mux chardev here
2543 * and implicitly setup a monitor. We may want to break this.
2544 */
Paolo Bonzini4ad6f6c2019-02-13 14:18:13 +01002545 chr = qemu_chr_new_noreplay("gdb", device, true, NULL);
aliguori36556b22009-03-28 18:05:53 +00002546 if (!chr)
2547 return -1;
pbrookcfc34752007-02-22 01:48:01 +00002548 }
2549
aliguori36556b22009-03-28 18:05:53 +00002550 s = gdbserver_state;
2551 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002552 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002553 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002554
aliguori36556b22009-03-28 18:05:53 +00002555 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2556
2557 /* Initialize a monitor terminal for gdb */
Marc-André Lureau777357d2016-12-07 18:39:10 +03002558 mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
Paolo Bonzini4ad6f6c2019-02-13 14:18:13 +01002559 NULL, NULL, &error_abort);
aliguori36556b22009-03-28 18:05:53 +00002560 monitor_init(mon_chr, 0);
2561 } else {
Marc-André Lureau1ce26102017-01-27 00:49:13 +04002562 qemu_chr_fe_deinit(&s->chr, true);
aliguori36556b22009-03-28 18:05:53 +00002563 mon_chr = s->mon_chr;
Luc Michel8f468632019-01-07 15:23:45 +00002564 cleanup_processes(s);
aliguori36556b22009-03-28 18:05:53 +00002565 memset(s, 0, sizeof(GDBState));
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03002566 s->mon_chr = mon_chr;
aliguori36556b22009-03-28 18:05:53 +00002567 }
Luc Michel8f468632019-01-07 15:23:45 +00002568
2569 create_processes(s);
2570
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03002571 if (chr) {
2572 qemu_chr_fe_init(&s->chr, chr, &error_abort);
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03002573 qemu_chr_fe_set_handlers(&s->chr, gdb_chr_can_receive, gdb_chr_receive,
Luc Michel970ed902019-01-07 15:23:46 +00002574 gdb_chr_event, NULL, s, NULL, true);
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03002575 }
aliguori36556b22009-03-28 18:05:53 +00002576 s->state = chr ? RS_IDLE : RS_INACTIVE;
2577 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002578 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002579
pbrook4046d912007-01-28 01:53:16 +00002580 return 0;
2581}
Marc-André Lureau777357d2016-12-07 18:39:10 +03002582
KONRAD Frederic1bb982b2018-03-20 10:39:33 +01002583void gdbserver_cleanup(void)
2584{
2585 if (gdbserver_state) {
2586 put_packet(gdbserver_state, "W00");
2587 }
2588}
2589
Marc-André Lureau777357d2016-12-07 18:39:10 +03002590static void register_types(void)
2591{
2592 type_register_static(&char_gdb_type_info);
2593}
2594
2595type_init(register_types);
pbrook4046d912007-01-28 01:53:16 +00002596#endif