blob: 9dfb6e4142cb5b8f2c44ae79c9758b3b568d05a2 [file] [log] [blame]
bellardb4608c02003-06-27 17:34:32 +00001/*
2 * gdb server stub
ths5fafdf22007-09-16 21:08:06 +00003 *
Alex Bennée42a09592019-07-05 13:28:19 +01004 * This implements a subset of the remote protocol as described in:
5 *
6 * https://sourceware.org/gdb/onlinedocs/gdb/Remote-Protocol.html
7 *
bellard34751872005-07-02 14:31:34 +00008 * Copyright (c) 2003-2005 Fabrice Bellard
bellardb4608c02003-06-27 17:34:32 +00009 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
Blue Swirl8167ee82009-07-16 20:47:01 +000021 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
Alex Bennée42a09592019-07-05 13:28:19 +010022 *
23 * SPDX-License-Identifier: LGPL-2.0+
bellardb4608c02003-06-27 17:34:32 +000024 */
Markus Armbruster856dfd82019-05-23 16:35:06 +020025
Peter Maydelld38ea872016-01-29 17:50:05 +000026#include "qemu/osdep.h"
Markus Armbrustera8d25322019-05-23 16:35:08 +020027#include "qemu-common.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010028#include "qapi/error.h"
Ziyue Yang508b4ec2017-01-18 16:02:41 +080029#include "qemu/error-report.h"
Markus Armbruster856dfd82019-05-23 16:35:06 +020030#include "qemu/ctype.h"
Veronia Bahaaf348b6d2016-03-20 19:16:19 +020031#include "qemu/cutils.h"
Markus Armbruster0b8fa322019-05-23 16:35:07 +020032#include "qemu/module.h"
Paolo Bonzini243af022020-02-04 12:20:10 +010033#include "trace/trace-root.h"
Veronia Bahaaf348b6d2016-03-20 19:16:19 +020034#ifdef CONFIG_USER_ONLY
bellard1fddef42005-04-17 19:16:13 +000035#include "qemu.h"
36#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010037#include "monitor/monitor.h"
Marc-André Lureau8228e352017-01-26 17:19:46 +040038#include "chardev/char.h"
Marc-André Lureau4d43a602017-01-26 18:26:44 +040039#include "chardev/char-fe.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010040#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010041#include "exec/gdbstub.h"
Luc Michel8f468632019-01-07 15:23:45 +000042#include "hw/cpu/cluster.h"
Like Xu5cc87672019-05-19 04:54:21 +080043#include "hw/boards.h"
bellard1fddef42005-04-17 19:16:13 +000044#endif
bellard67b915a2004-03-31 23:37:16 +000045
pbrook56aebc82008-10-11 17:55:29 +000046#define MAX_PACKET_LENGTH 4096
47
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010048#include "qemu/sockets.h"
Vincent Palatinb3946622017-01-10 11:59:55 +010049#include "sysemu/hw_accel.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010050#include "sysemu/kvm.h"
Markus Armbruster54d31232019-08-12 07:23:59 +020051#include "sysemu/runstate.h"
Alex Bennéef1672e62019-05-13 14:43:57 +010052#include "hw/semihosting/semihost.h"
Paolo Bonzini63c91552016-03-15 13:18:37 +010053#include "exec/exec-all.h"
aurel32ca587a82008-12-18 22:44:13 +000054
Jan Kiszkaa3919382015-02-07 09:38:44 +010055#ifdef CONFIG_USER_ONLY
56#define GDB_ATTACHED "0"
57#else
58#define GDB_ATTACHED "1"
59#endif
60
Jon Doronab4752e2019-05-29 09:41:48 +030061#ifndef CONFIG_USER_ONLY
62static int phy_memory_mode;
63#endif
64
Andreas Färberf3659ee2013-06-27 19:09:09 +020065static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
66 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020067{
Jon Doronab4752e2019-05-29 09:41:48 +030068 CPUClass *cc;
Andreas Färberf3659ee2013-06-27 19:09:09 +020069
Jon Doronab4752e2019-05-29 09:41:48 +030070#ifndef CONFIG_USER_ONLY
71 if (phy_memory_mode) {
72 if (is_write) {
73 cpu_physical_memory_write(addr, buf, len);
74 } else {
75 cpu_physical_memory_read(addr, buf, len);
76 }
77 return 0;
78 }
79#endif
80
81 cc = CPU_GET_CLASS(cpu);
Andreas Färberf3659ee2013-06-27 19:09:09 +020082 if (cc->memory_rw_debug) {
83 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
84 }
85 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020086}
aurel32ca587a82008-12-18 22:44:13 +000087
Alex Bennéed2a6c852017-07-12 11:52:14 +010088/* Return the GDB index for a given vCPU state.
89 *
90 * For user mode this is simply the thread id. In system mode GDB
91 * numbers CPUs from 1 as 0 is reserved as an "any cpu" index.
92 */
93static inline int cpu_gdb_index(CPUState *cpu)
94{
95#if defined(CONFIG_USER_ONLY)
Alex Bennéebd88c782017-07-12 11:52:15 +010096 TaskState *ts = (TaskState *) cpu->opaque;
97 return ts->ts_tid;
Alex Bennéed2a6c852017-07-12 11:52:14 +010098#else
99 return cpu->cpu_index + 1;
100#endif
101}
102
aurel32ca587a82008-12-18 22:44:13 +0000103enum {
104 GDB_SIGNAL_0 = 0,
105 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +0100106 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +0000107 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +0100108 GDB_SIGNAL_ABRT = 6,
109 GDB_SIGNAL_ALRM = 14,
110 GDB_SIGNAL_IO = 23,
111 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +0000112 GDB_SIGNAL_UNKNOWN = 143
113};
114
115#ifdef CONFIG_USER_ONLY
116
117/* Map target signal numbers to GDB protocol signal numbers and vice
118 * versa. For user emulation's currently supported systems, we can
119 * assume most signals are defined.
120 */
121
122static int gdb_signal_table[] = {
123 0,
124 TARGET_SIGHUP,
125 TARGET_SIGINT,
126 TARGET_SIGQUIT,
127 TARGET_SIGILL,
128 TARGET_SIGTRAP,
129 TARGET_SIGABRT,
130 -1, /* SIGEMT */
131 TARGET_SIGFPE,
132 TARGET_SIGKILL,
133 TARGET_SIGBUS,
134 TARGET_SIGSEGV,
135 TARGET_SIGSYS,
136 TARGET_SIGPIPE,
137 TARGET_SIGALRM,
138 TARGET_SIGTERM,
139 TARGET_SIGURG,
140 TARGET_SIGSTOP,
141 TARGET_SIGTSTP,
142 TARGET_SIGCONT,
143 TARGET_SIGCHLD,
144 TARGET_SIGTTIN,
145 TARGET_SIGTTOU,
146 TARGET_SIGIO,
147 TARGET_SIGXCPU,
148 TARGET_SIGXFSZ,
149 TARGET_SIGVTALRM,
150 TARGET_SIGPROF,
151 TARGET_SIGWINCH,
152 -1, /* SIGLOST */
153 TARGET_SIGUSR1,
154 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000155#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000156 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000157#else
158 -1,
159#endif
aurel32ca587a82008-12-18 22:44:13 +0000160 -1, /* SIGPOLL */
161 -1,
162 -1,
163 -1,
164 -1,
165 -1,
166 -1,
167 -1,
168 -1,
169 -1,
170 -1,
171 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000172#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000173 __SIGRTMIN + 1,
174 __SIGRTMIN + 2,
175 __SIGRTMIN + 3,
176 __SIGRTMIN + 4,
177 __SIGRTMIN + 5,
178 __SIGRTMIN + 6,
179 __SIGRTMIN + 7,
180 __SIGRTMIN + 8,
181 __SIGRTMIN + 9,
182 __SIGRTMIN + 10,
183 __SIGRTMIN + 11,
184 __SIGRTMIN + 12,
185 __SIGRTMIN + 13,
186 __SIGRTMIN + 14,
187 __SIGRTMIN + 15,
188 __SIGRTMIN + 16,
189 __SIGRTMIN + 17,
190 __SIGRTMIN + 18,
191 __SIGRTMIN + 19,
192 __SIGRTMIN + 20,
193 __SIGRTMIN + 21,
194 __SIGRTMIN + 22,
195 __SIGRTMIN + 23,
196 __SIGRTMIN + 24,
197 __SIGRTMIN + 25,
198 __SIGRTMIN + 26,
199 __SIGRTMIN + 27,
200 __SIGRTMIN + 28,
201 __SIGRTMIN + 29,
202 __SIGRTMIN + 30,
203 __SIGRTMIN + 31,
204 -1, /* SIGCANCEL */
205 __SIGRTMIN,
206 __SIGRTMIN + 32,
207 __SIGRTMIN + 33,
208 __SIGRTMIN + 34,
209 __SIGRTMIN + 35,
210 __SIGRTMIN + 36,
211 __SIGRTMIN + 37,
212 __SIGRTMIN + 38,
213 __SIGRTMIN + 39,
214 __SIGRTMIN + 40,
215 __SIGRTMIN + 41,
216 __SIGRTMIN + 42,
217 __SIGRTMIN + 43,
218 __SIGRTMIN + 44,
219 __SIGRTMIN + 45,
220 __SIGRTMIN + 46,
221 __SIGRTMIN + 47,
222 __SIGRTMIN + 48,
223 __SIGRTMIN + 49,
224 __SIGRTMIN + 50,
225 __SIGRTMIN + 51,
226 __SIGRTMIN + 52,
227 __SIGRTMIN + 53,
228 __SIGRTMIN + 54,
229 __SIGRTMIN + 55,
230 __SIGRTMIN + 56,
231 __SIGRTMIN + 57,
232 __SIGRTMIN + 58,
233 __SIGRTMIN + 59,
234 __SIGRTMIN + 60,
235 __SIGRTMIN + 61,
236 __SIGRTMIN + 62,
237 __SIGRTMIN + 63,
238 __SIGRTMIN + 64,
239 __SIGRTMIN + 65,
240 __SIGRTMIN + 66,
241 __SIGRTMIN + 67,
242 __SIGRTMIN + 68,
243 __SIGRTMIN + 69,
244 __SIGRTMIN + 70,
245 __SIGRTMIN + 71,
246 __SIGRTMIN + 72,
247 __SIGRTMIN + 73,
248 __SIGRTMIN + 74,
249 __SIGRTMIN + 75,
250 __SIGRTMIN + 76,
251 __SIGRTMIN + 77,
252 __SIGRTMIN + 78,
253 __SIGRTMIN + 79,
254 __SIGRTMIN + 80,
255 __SIGRTMIN + 81,
256 __SIGRTMIN + 82,
257 __SIGRTMIN + 83,
258 __SIGRTMIN + 84,
259 __SIGRTMIN + 85,
260 __SIGRTMIN + 86,
261 __SIGRTMIN + 87,
262 __SIGRTMIN + 88,
263 __SIGRTMIN + 89,
264 __SIGRTMIN + 90,
265 __SIGRTMIN + 91,
266 __SIGRTMIN + 92,
267 __SIGRTMIN + 93,
268 __SIGRTMIN + 94,
269 __SIGRTMIN + 95,
270 -1, /* SIGINFO */
271 -1, /* UNKNOWN */
272 -1, /* DEFAULT */
273 -1,
274 -1,
275 -1,
276 -1,
277 -1,
278 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000279#endif
aurel32ca587a82008-12-18 22:44:13 +0000280};
bellard8f447cc2006-06-14 15:21:14 +0000281#else
aurel32ca587a82008-12-18 22:44:13 +0000282/* In system mode we only need SIGINT and SIGTRAP; other signals
283 are not yet supported. */
284
285enum {
286 TARGET_SIGINT = 2,
287 TARGET_SIGTRAP = 5
288};
289
290static int gdb_signal_table[] = {
291 -1,
292 -1,
293 TARGET_SIGINT,
294 -1,
295 -1,
296 TARGET_SIGTRAP
297};
bellard8f447cc2006-06-14 15:21:14 +0000298#endif
bellardb4608c02003-06-27 17:34:32 +0000299
aurel32ca587a82008-12-18 22:44:13 +0000300#ifdef CONFIG_USER_ONLY
301static int target_signal_to_gdb (int sig)
302{
303 int i;
304 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
305 if (gdb_signal_table[i] == sig)
306 return i;
307 return GDB_SIGNAL_UNKNOWN;
308}
309#endif
310
311static int gdb_signal_to_target (int sig)
312{
313 if (sig < ARRAY_SIZE (gdb_signal_table))
314 return gdb_signal_table[sig];
315 else
316 return -1;
317}
318
pbrook56aebc82008-10-11 17:55:29 +0000319typedef struct GDBRegisterState {
320 int base_reg;
321 int num_regs;
Alex Bennéea010bdb2020-03-16 17:21:41 +0000322 gdb_get_reg_cb get_reg;
323 gdb_set_reg_cb set_reg;
pbrook56aebc82008-10-11 17:55:29 +0000324 const char *xml;
325 struct GDBRegisterState *next;
326} GDBRegisterState;
327
Luc Michel8f468632019-01-07 15:23:45 +0000328typedef struct GDBProcess {
329 uint32_t pid;
330 bool attached;
Luc Michelc145eea2019-01-07 15:23:46 +0000331
332 char target_xml[1024];
Luc Michel8f468632019-01-07 15:23:45 +0000333} GDBProcess;
334
bellard858693c2004-03-31 18:52:07 +0000335enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000336 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000337 RS_IDLE,
338 RS_GETLINE,
Doug Gale4bf43122017-05-01 12:22:10 -0400339 RS_GETLINE_ESC,
340 RS_GETLINE_RLE,
bellard858693c2004-03-31 18:52:07 +0000341 RS_CHKSUM1,
342 RS_CHKSUM2,
343};
bellard858693c2004-03-31 18:52:07 +0000344typedef struct GDBState {
Alex Bennée8d98c442020-03-16 17:21:33 +0000345 bool init; /* have we been initialised? */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200346 CPUState *c_cpu; /* current CPU for step/continue ops */
347 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200348 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000349 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000350 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000351 int line_buf_index;
Doug Gale4bf43122017-05-01 12:22:10 -0400352 int line_sum; /* running checksum */
353 int line_csum; /* checksum at the end of the packet */
Damien Hedded116e812020-03-16 17:21:53 +0000354 GByteArray *last_packet;
edgar_igl1f487ee2008-05-17 22:20:53 +0000355 int signal;
bellard41625032005-04-24 10:07:11 +0000356#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000357 int fd;
Alex Bennéefcedd922020-04-30 20:01:19 +0100358 char *socket_path;
bellard41625032005-04-24 10:07:11 +0000359 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000360#else
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +0300361 CharBackend chr;
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +0300362 Chardev *mon_chr;
bellard41625032005-04-24 10:07:11 +0000363#endif
Luc Michel8f468632019-01-07 15:23:45 +0000364 bool multiprocess;
365 GDBProcess *processes;
366 int process_num;
Meador Ingecdb432b2012-03-15 17:49:45 +0000367 char syscall_buf[256];
368 gdb_syscall_complete_cb current_syscall_cb;
Alex Bennée308f9e82020-03-16 17:21:35 +0000369 GString *str_buf;
Alex Bennée4a25f1b2020-03-16 17:21:36 +0000370 GByteArray *mem_buf;
bellard858693c2004-03-31 18:52:07 +0000371} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000372
edgar_igl60897d32008-05-09 08:25:14 +0000373/* By default use no IRQs and no timers while single stepping so as to
374 * make single stepping like an ICE HW step.
375 */
376static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
377
Alex Bennée8d98c442020-03-16 17:21:33 +0000378static GDBState gdbserver_state;
379
380static void init_gdbserver_state(void)
381{
382 g_assert(!gdbserver_state.init);
383 memset(&gdbserver_state, 0, sizeof(GDBState));
384 gdbserver_state.init = true;
Alex Bennée308f9e82020-03-16 17:21:35 +0000385 gdbserver_state.str_buf = g_string_new(NULL);
Alex Bennée4a25f1b2020-03-16 17:21:36 +0000386 gdbserver_state.mem_buf = g_byte_array_sized_new(MAX_PACKET_LENGTH);
Damien Hedded116e812020-03-16 17:21:53 +0000387 gdbserver_state.last_packet = g_byte_array_sized_new(MAX_PACKET_LENGTH + 4);
Alex Bennée8d98c442020-03-16 17:21:33 +0000388}
389
390#ifndef CONFIG_USER_ONLY
391static void reset_gdbserver_state(void)
392{
393 g_free(gdbserver_state.processes);
394 gdbserver_state.processes = NULL;
395 gdbserver_state.process_num = 0;
396}
397#endif
aliguori880a7572008-11-18 20:30:24 +0000398
Andreas Färber5b50e792013-06-29 04:18:45 +0200399bool gdb_has_xml;
pbrook56aebc82008-10-11 17:55:29 +0000400
bellard1fddef42005-04-17 19:16:13 +0000401#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000402
Alex Bennéea346af32020-03-16 17:21:34 +0000403static int get_char(void)
bellardb4608c02003-06-27 17:34:32 +0000404{
405 uint8_t ch;
406 int ret;
407
408 for(;;) {
Alex Bennéea346af32020-03-16 17:21:34 +0000409 ret = qemu_recv(gdbserver_state.fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000410 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000411 if (errno == ECONNRESET)
Alex Bennéea346af32020-03-16 17:21:34 +0000412 gdbserver_state.fd = -1;
Peter Wu5819e3e2016-06-05 16:35:48 +0200413 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000414 return -1;
415 } else if (ret == 0) {
Alex Bennéea346af32020-03-16 17:21:34 +0000416 close(gdbserver_state.fd);
417 gdbserver_state.fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000418 return -1;
419 } else {
420 break;
421 }
422 }
423 return ch;
424}
pbrook4046d912007-01-28 01:53:16 +0000425#endif
bellardb4608c02003-06-27 17:34:32 +0000426
blueswir1654efcf2009-04-18 07:29:59 +0000427static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000428 GDB_SYS_UNKNOWN,
429 GDB_SYS_ENABLED,
430 GDB_SYS_DISABLED,
431} gdb_syscall_mode;
432
Liviu Ionescua38bb072014-12-11 12:07:48 +0000433/* Decide if either remote gdb syscalls or native file IO should be used. */
pbrooka2d1eba2007-01-28 03:10:55 +0000434int use_gdb_syscalls(void)
435{
Leon Alraecfe67ce2015-06-19 14:17:45 +0100436 SemihostingTarget target = semihosting_get_target();
437 if (target == SEMIHOSTING_TARGET_NATIVE) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000438 /* -semihosting-config target=native */
439 return false;
Leon Alraecfe67ce2015-06-19 14:17:45 +0100440 } else if (target == SEMIHOSTING_TARGET_GDB) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000441 /* -semihosting-config target=gdb */
442 return true;
443 }
444
445 /* -semihosting-config target=auto */
446 /* On the first call check if gdb is connected and remember. */
pbrooka2d1eba2007-01-28 03:10:55 +0000447 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
Alex Bennée8d98c442020-03-16 17:21:33 +0000448 gdb_syscall_mode = gdbserver_state.init ?
449 GDB_SYS_ENABLED : GDB_SYS_DISABLED;
pbrooka2d1eba2007-01-28 03:10:55 +0000450 }
451 return gdb_syscall_mode == GDB_SYS_ENABLED;
452}
453
edgar_iglba70a622008-03-14 06:10:42 +0000454/* Resume execution. */
Alex Bennéea346af32020-03-16 17:21:34 +0000455static inline void gdb_continue(void)
edgar_iglba70a622008-03-14 06:10:42 +0000456{
Doug Gale5c9522b2017-12-02 20:30:37 -0500457
edgar_iglba70a622008-03-14 06:10:42 +0000458#ifdef CONFIG_USER_ONLY
Alex Bennéea346af32020-03-16 17:21:34 +0000459 gdbserver_state.running_state = 1;
Doug Gale5c9522b2017-12-02 20:30:37 -0500460 trace_gdbstub_op_continue();
edgar_iglba70a622008-03-14 06:10:42 +0000461#else
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200462 if (!runstate_needs_reset()) {
Doug Gale5c9522b2017-12-02 20:30:37 -0500463 trace_gdbstub_op_continue();
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200464 vm_start();
465 }
edgar_iglba70a622008-03-14 06:10:42 +0000466#endif
467}
468
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100469/*
470 * Resume execution, per CPU actions. For user-mode emulation it's
471 * equivalent to gdb_continue.
472 */
Alex Bennéea346af32020-03-16 17:21:34 +0000473static int gdb_continue_partial(char *newstates)
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100474{
475 CPUState *cpu;
476 int res = 0;
477#ifdef CONFIG_USER_ONLY
478 /*
479 * This is not exactly accurate, but it's an improvement compared to the
480 * previous situation, where only one CPU would be single-stepped.
481 */
482 CPU_FOREACH(cpu) {
483 if (newstates[cpu->cpu_index] == 's') {
Doug Gale5c9522b2017-12-02 20:30:37 -0500484 trace_gdbstub_op_stepping(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100485 cpu_single_step(cpu, sstep_flags);
486 }
487 }
Alex Bennéea346af32020-03-16 17:21:34 +0000488 gdbserver_state.running_state = 1;
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100489#else
490 int flag = 0;
491
492 if (!runstate_needs_reset()) {
493 if (vm_prepare_start()) {
494 return 0;
495 }
496
497 CPU_FOREACH(cpu) {
498 switch (newstates[cpu->cpu_index]) {
499 case 0:
500 case 1:
501 break; /* nothing to do here */
502 case 's':
Doug Gale5c9522b2017-12-02 20:30:37 -0500503 trace_gdbstub_op_stepping(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100504 cpu_single_step(cpu, sstep_flags);
505 cpu_resume(cpu);
506 flag = 1;
507 break;
508 case 'c':
Doug Gale5c9522b2017-12-02 20:30:37 -0500509 trace_gdbstub_op_continue_cpu(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100510 cpu_resume(cpu);
511 flag = 1;
512 break;
513 default:
514 res = -1;
515 break;
516 }
517 }
518 }
519 if (flag) {
520 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
521 }
522#endif
523 return res;
524}
525
Alex Bennéea346af32020-03-16 17:21:34 +0000526static void put_buffer(const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000527{
pbrook4046d912007-01-28 01:53:16 +0000528#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000529 int ret;
530
531 while (len > 0) {
Alex Bennéea346af32020-03-16 17:21:34 +0000532 ret = send(gdbserver_state.fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000533 if (ret < 0) {
Peter Wu5819e3e2016-06-05 16:35:48 +0200534 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000535 return;
536 } else {
537 buf += ret;
538 len -= ret;
539 }
540 }
pbrook4046d912007-01-28 01:53:16 +0000541#else
Daniel P. Berrange6ab3fc32016-09-06 14:56:04 +0100542 /* XXX this blocks entire thread. Rewrite to use
543 * qemu_chr_fe_write and background I/O callbacks */
Alex Bennéea346af32020-03-16 17:21:34 +0000544 qemu_chr_fe_write_all(&gdbserver_state.chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000545#endif
bellardb4608c02003-06-27 17:34:32 +0000546}
547
548static inline int fromhex(int v)
549{
550 if (v >= '0' && v <= '9')
551 return v - '0';
552 else if (v >= 'A' && v <= 'F')
553 return v - 'A' + 10;
554 else if (v >= 'a' && v <= 'f')
555 return v - 'a' + 10;
556 else
557 return 0;
558}
559
560static inline int tohex(int v)
561{
562 if (v < 10)
563 return v + '0';
564 else
565 return v - 10 + 'a';
566}
567
Philippe Mathieu-Daudé90057742018-04-08 11:59:33 -0300568/* writes 2*len+1 bytes in buf */
Alex Bennée308f9e82020-03-16 17:21:35 +0000569static void memtohex(GString *buf, const uint8_t *mem, int len)
bellardb4608c02003-06-27 17:34:32 +0000570{
571 int i, c;
bellardb4608c02003-06-27 17:34:32 +0000572 for(i = 0; i < len; i++) {
573 c = mem[i];
Alex Bennée308f9e82020-03-16 17:21:35 +0000574 g_string_append_c(buf, tohex(c >> 4));
575 g_string_append_c(buf, tohex(c & 0xf));
bellardb4608c02003-06-27 17:34:32 +0000576 }
Alex Bennée308f9e82020-03-16 17:21:35 +0000577 g_string_append_c(buf, '\0');
bellardb4608c02003-06-27 17:34:32 +0000578}
579
Alex Bennée4a25f1b2020-03-16 17:21:36 +0000580static void hextomem(GByteArray *mem, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000581{
582 int i;
583
584 for(i = 0; i < len; i++) {
Alex Bennée4a25f1b2020-03-16 17:21:36 +0000585 guint8 byte = fromhex(buf[0]) << 4 | fromhex(buf[1]);
586 g_byte_array_append(mem, &byte, 1);
bellardb4608c02003-06-27 17:34:32 +0000587 buf += 2;
588 }
589}
590
Doug Gale5c9522b2017-12-02 20:30:37 -0500591static void hexdump(const char *buf, int len,
592 void (*trace_fn)(size_t ofs, char const *text))
593{
594 char line_buffer[3 * 16 + 4 + 16 + 1];
595
596 size_t i;
597 for (i = 0; i < len || (i & 0xF); ++i) {
598 size_t byte_ofs = i & 15;
599
600 if (byte_ofs == 0) {
601 memset(line_buffer, ' ', 3 * 16 + 4 + 16);
602 line_buffer[3 * 16 + 4 + 16] = 0;
603 }
604
605 size_t col_group = (i >> 2) & 3;
606 size_t hex_col = byte_ofs * 3 + col_group;
607 size_t txt_col = 3 * 16 + 4 + byte_ofs;
608
609 if (i < len) {
610 char value = buf[i];
611
612 line_buffer[hex_col + 0] = tohex((value >> 4) & 0xF);
613 line_buffer[hex_col + 1] = tohex((value >> 0) & 0xF);
614 line_buffer[txt_col + 0] = (value >= ' ' && value < 127)
615 ? value
616 : '.';
617 }
618
619 if (byte_ofs == 0xF)
620 trace_fn(i & -16, line_buffer);
621 }
622}
623
bellardb4608c02003-06-27 17:34:32 +0000624/* return -1 if error, 0 if OK */
Alex Bennéea346af32020-03-16 17:21:34 +0000625static int put_packet_binary(const char *buf, int len, bool dump)
bellardb4608c02003-06-27 17:34:32 +0000626{
pbrook56aebc82008-10-11 17:55:29 +0000627 int csum, i;
Damien Hedded116e812020-03-16 17:21:53 +0000628 uint8_t footer[3];
bellardb4608c02003-06-27 17:34:32 +0000629
Doug Gale5c9522b2017-12-02 20:30:37 -0500630 if (dump && trace_event_get_state_backends(TRACE_GDBSTUB_IO_BINARYREPLY)) {
631 hexdump(buf, len, trace_gdbstub_io_binaryreply);
632 }
633
bellardb4608c02003-06-27 17:34:32 +0000634 for(;;) {
Damien Hedded116e812020-03-16 17:21:53 +0000635 g_byte_array_set_size(gdbserver_state.last_packet, 0);
636 g_byte_array_append(gdbserver_state.last_packet,
637 (const uint8_t *) "$", 1);
638 g_byte_array_append(gdbserver_state.last_packet,
639 (const uint8_t *) buf, len);
bellardb4608c02003-06-27 17:34:32 +0000640 csum = 0;
641 for(i = 0; i < len; i++) {
642 csum += buf[i];
643 }
Damien Hedded116e812020-03-16 17:21:53 +0000644 footer[0] = '#';
645 footer[1] = tohex((csum >> 4) & 0xf);
646 footer[2] = tohex((csum) & 0xf);
647 g_byte_array_append(gdbserver_state.last_packet, footer, 3);
bellardb4608c02003-06-27 17:34:32 +0000648
Damien Hedded116e812020-03-16 17:21:53 +0000649 put_buffer(gdbserver_state.last_packet->data,
650 gdbserver_state.last_packet->len);
bellardb4608c02003-06-27 17:34:32 +0000651
pbrook4046d912007-01-28 01:53:16 +0000652#ifdef CONFIG_USER_ONLY
Alex Bennéea346af32020-03-16 17:21:34 +0000653 i = get_char();
pbrook4046d912007-01-28 01:53:16 +0000654 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000655 return -1;
pbrook4046d912007-01-28 01:53:16 +0000656 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000657 break;
pbrook4046d912007-01-28 01:53:16 +0000658#else
659 break;
660#endif
bellardb4608c02003-06-27 17:34:32 +0000661 }
662 return 0;
663}
664
pbrook56aebc82008-10-11 17:55:29 +0000665/* return -1 if error, 0 if OK */
Alex Bennéea346af32020-03-16 17:21:34 +0000666static int put_packet(const char *buf)
pbrook56aebc82008-10-11 17:55:29 +0000667{
Doug Gale5c9522b2017-12-02 20:30:37 -0500668 trace_gdbstub_io_reply(buf);
pbrook56aebc82008-10-11 17:55:29 +0000669
Alex Bennéea346af32020-03-16 17:21:34 +0000670 return put_packet_binary(buf, strlen(buf), false);
pbrook56aebc82008-10-11 17:55:29 +0000671}
672
Alex Bennée308f9e82020-03-16 17:21:35 +0000673static void put_strbuf(void)
pbrook56aebc82008-10-11 17:55:29 +0000674{
Alex Bennée308f9e82020-03-16 17:21:35 +0000675 put_packet(gdbserver_state.str_buf->str);
676}
677
678/* Encode data using the encoding for 'x' packets. */
679static void memtox(GString *buf, const char *mem, int len)
680{
pbrook56aebc82008-10-11 17:55:29 +0000681 char c;
682
683 while (len--) {
684 c = *(mem++);
685 switch (c) {
686 case '#': case '$': case '*': case '}':
Alex Bennée308f9e82020-03-16 17:21:35 +0000687 g_string_append_c(buf, '}');
688 g_string_append_c(buf, c ^ 0x20);
pbrook56aebc82008-10-11 17:55:29 +0000689 break;
690 default:
Alex Bennée308f9e82020-03-16 17:21:35 +0000691 g_string_append_c(buf, c);
pbrook56aebc82008-10-11 17:55:29 +0000692 break;
693 }
694 }
pbrook56aebc82008-10-11 17:55:29 +0000695}
696
Alex Bennéea346af32020-03-16 17:21:34 +0000697static uint32_t gdb_get_cpu_pid(CPUState *cpu)
Luc Michel1a227332019-01-07 15:23:45 +0000698{
Luc Michel1a227332019-01-07 15:23:45 +0000699 /* TODO: In user mode, we should use the task state PID */
Peter Maydell46f5abc2019-01-29 11:46:06 +0000700 if (cpu->cluster_index == UNASSIGNED_CLUSTER_INDEX) {
701 /* Return the default process' PID */
Alex Bennéea346af32020-03-16 17:21:34 +0000702 int index = gdbserver_state.process_num - 1;
703 return gdbserver_state.processes[index].pid;
Peter Maydell46f5abc2019-01-29 11:46:06 +0000704 }
705 return cpu->cluster_index + 1;
Luc Michel1a227332019-01-07 15:23:45 +0000706}
707
Alex Bennéea346af32020-03-16 17:21:34 +0000708static GDBProcess *gdb_get_process(uint32_t pid)
Luc Michel7d8c87d2019-01-07 15:23:45 +0000709{
710 int i;
711
712 if (!pid) {
713 /* 0 means any process, we take the first one */
Alex Bennéea346af32020-03-16 17:21:34 +0000714 return &gdbserver_state.processes[0];
Luc Michel7d8c87d2019-01-07 15:23:45 +0000715 }
716
Alex Bennéea346af32020-03-16 17:21:34 +0000717 for (i = 0; i < gdbserver_state.process_num; i++) {
718 if (gdbserver_state.processes[i].pid == pid) {
719 return &gdbserver_state.processes[i];
Luc Michel7d8c87d2019-01-07 15:23:45 +0000720 }
721 }
722
723 return NULL;
724}
725
Alex Bennéea346af32020-03-16 17:21:34 +0000726static GDBProcess *gdb_get_cpu_process(CPUState *cpu)
Luc Michel7d8c87d2019-01-07 15:23:45 +0000727{
Alex Bennéea346af32020-03-16 17:21:34 +0000728 return gdb_get_process(gdb_get_cpu_pid(cpu));
Luc Michel7d8c87d2019-01-07 15:23:45 +0000729}
730
731static CPUState *find_cpu(uint32_t thread_id)
732{
733 CPUState *cpu;
734
735 CPU_FOREACH(cpu) {
736 if (cpu_gdb_index(cpu) == thread_id) {
737 return cpu;
738 }
739 }
740
741 return NULL;
742}
743
Alex Bennéea346af32020-03-16 17:21:34 +0000744static CPUState *get_first_cpu_in_process(GDBProcess *process)
Luc Michele40e5202019-01-07 15:23:46 +0000745{
746 CPUState *cpu;
747
748 CPU_FOREACH(cpu) {
Alex Bennéea346af32020-03-16 17:21:34 +0000749 if (gdb_get_cpu_pid(cpu) == process->pid) {
Luc Michele40e5202019-01-07 15:23:46 +0000750 return cpu;
751 }
752 }
753
754 return NULL;
755}
756
Alex Bennéea346af32020-03-16 17:21:34 +0000757static CPUState *gdb_next_cpu_in_process(CPUState *cpu)
Luc Michele40e5202019-01-07 15:23:46 +0000758{
Alex Bennéea346af32020-03-16 17:21:34 +0000759 uint32_t pid = gdb_get_cpu_pid(cpu);
Luc Michele40e5202019-01-07 15:23:46 +0000760 cpu = CPU_NEXT(cpu);
761
762 while (cpu) {
Alex Bennéea346af32020-03-16 17:21:34 +0000763 if (gdb_get_cpu_pid(cpu) == pid) {
Luc Michele40e5202019-01-07 15:23:46 +0000764 break;
765 }
766
767 cpu = CPU_NEXT(cpu);
768 }
769
770 return cpu;
771}
772
Luc Michele40e5202019-01-07 15:23:46 +0000773/* Return the cpu following @cpu, while ignoring unattached processes. */
Alex Bennéea346af32020-03-16 17:21:34 +0000774static CPUState *gdb_next_attached_cpu(CPUState *cpu)
Luc Michele40e5202019-01-07 15:23:46 +0000775{
776 cpu = CPU_NEXT(cpu);
777
778 while (cpu) {
Alex Bennéea346af32020-03-16 17:21:34 +0000779 if (gdb_get_cpu_process(cpu)->attached) {
Luc Michele40e5202019-01-07 15:23:46 +0000780 break;
781 }
782
783 cpu = CPU_NEXT(cpu);
784 }
785
786 return cpu;
787}
788
789/* Return the first attached cpu */
Alex Bennéea346af32020-03-16 17:21:34 +0000790static CPUState *gdb_first_attached_cpu(void)
Luc Michele40e5202019-01-07 15:23:46 +0000791{
792 CPUState *cpu = first_cpu;
Alex Bennéea346af32020-03-16 17:21:34 +0000793 GDBProcess *process = gdb_get_cpu_process(cpu);
Luc Michele40e5202019-01-07 15:23:46 +0000794
795 if (!process->attached) {
Alex Bennéea346af32020-03-16 17:21:34 +0000796 return gdb_next_attached_cpu(cpu);
Luc Michele40e5202019-01-07 15:23:46 +0000797 }
798
799 return cpu;
800}
801
Alex Bennéea346af32020-03-16 17:21:34 +0000802static CPUState *gdb_get_cpu(uint32_t pid, uint32_t tid)
Luc Michelab65eed2019-01-29 11:46:03 +0000803{
804 GDBProcess *process;
805 CPUState *cpu;
806
807 if (!pid && !tid) {
808 /* 0 means any process/thread, we take the first attached one */
Alex Bennéea346af32020-03-16 17:21:34 +0000809 return gdb_first_attached_cpu();
Luc Michelab65eed2019-01-29 11:46:03 +0000810 } else if (pid && !tid) {
811 /* any thread in a specific process */
Alex Bennéea346af32020-03-16 17:21:34 +0000812 process = gdb_get_process(pid);
Luc Michelab65eed2019-01-29 11:46:03 +0000813
814 if (process == NULL) {
815 return NULL;
816 }
817
818 if (!process->attached) {
819 return NULL;
820 }
821
Alex Bennéea346af32020-03-16 17:21:34 +0000822 return get_first_cpu_in_process(process);
Luc Michelab65eed2019-01-29 11:46:03 +0000823 } else {
824 /* a specific thread */
825 cpu = find_cpu(tid);
826
827 if (cpu == NULL) {
828 return NULL;
829 }
830
Alex Bennéea346af32020-03-16 17:21:34 +0000831 process = gdb_get_cpu_process(cpu);
Luc Michelab65eed2019-01-29 11:46:03 +0000832
833 if (pid && process->pid != pid) {
834 return NULL;
835 }
836
837 if (!process->attached) {
838 return NULL;
839 }
840
841 return cpu;
842 }
843}
844
Alex Bennéea346af32020-03-16 17:21:34 +0000845static const char *get_feature_xml(const char *p, const char **newp,
846 GDBProcess *process)
pbrook56aebc82008-10-11 17:55:29 +0000847{
pbrook56aebc82008-10-11 17:55:29 +0000848 size_t len;
849 int i;
850 const char *name;
Alex Bennéea346af32020-03-16 17:21:34 +0000851 CPUState *cpu = get_first_cpu_in_process(process);
Luc Michelc145eea2019-01-07 15:23:46 +0000852 CPUClass *cc = CPU_GET_CLASS(cpu);
pbrook56aebc82008-10-11 17:55:29 +0000853
854 len = 0;
855 while (p[len] && p[len] != ':')
856 len++;
857 *newp = p + len;
858
859 name = NULL;
860 if (strncmp(p, "target.xml", len) == 0) {
Luc Michelc145eea2019-01-07 15:23:46 +0000861 char *buf = process->target_xml;
862 const size_t buf_sz = sizeof(process->target_xml);
pbrook56aebc82008-10-11 17:55:29 +0000863
Luc Michelc145eea2019-01-07 15:23:46 +0000864 /* Generate the XML description for this CPU. */
865 if (!buf[0]) {
866 GDBRegisterState *r;
867
868 pstrcat(buf, buf_sz,
David Hildenbrandb3820e62015-12-03 13:14:41 +0100869 "<?xml version=\"1.0\"?>"
870 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
871 "<target>");
872 if (cc->gdb_arch_name) {
873 gchar *arch = cc->gdb_arch_name(cpu);
Luc Michelc145eea2019-01-07 15:23:46 +0000874 pstrcat(buf, buf_sz, "<architecture>");
875 pstrcat(buf, buf_sz, arch);
876 pstrcat(buf, buf_sz, "</architecture>");
David Hildenbrandb3820e62015-12-03 13:14:41 +0100877 g_free(arch);
878 }
Luc Michelc145eea2019-01-07 15:23:46 +0000879 pstrcat(buf, buf_sz, "<xi:include href=\"");
880 pstrcat(buf, buf_sz, cc->gdb_core_xml_file);
881 pstrcat(buf, buf_sz, "\"/>");
Andreas Färbereac8b352013-06-28 21:11:37 +0200882 for (r = cpu->gdb_regs; r; r = r->next) {
Luc Michelc145eea2019-01-07 15:23:46 +0000883 pstrcat(buf, buf_sz, "<xi:include href=\"");
884 pstrcat(buf, buf_sz, r->xml);
885 pstrcat(buf, buf_sz, "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000886 }
Luc Michelc145eea2019-01-07 15:23:46 +0000887 pstrcat(buf, buf_sz, "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000888 }
Luc Michelc145eea2019-01-07 15:23:46 +0000889 return buf;
pbrook56aebc82008-10-11 17:55:29 +0000890 }
Abdallah Bouassida200bf5b2018-05-18 17:48:07 +0100891 if (cc->gdb_get_dynamic_xml) {
Abdallah Bouassida200bf5b2018-05-18 17:48:07 +0100892 char *xmlname = g_strndup(p, len);
893 const char *xml = cc->gdb_get_dynamic_xml(cpu, xmlname);
894
895 g_free(xmlname);
896 if (xml) {
897 return xml;
898 }
899 }
pbrook56aebc82008-10-11 17:55:29 +0000900 for (i = 0; ; i++) {
901 name = xml_builtin[i][0];
902 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
903 break;
904 }
905 return name ? xml_builtin[i][1] : NULL;
906}
pbrook56aebc82008-10-11 17:55:29 +0000907
Alex Bennéea010bdb2020-03-16 17:21:41 +0000908static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000909{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200910 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200911 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000912 GDBRegisterState *r;
913
Andreas Färbera0e372f2013-06-28 23:18:47 +0200914 if (reg < cc->gdb_num_core_regs) {
Alex Bennéea010bdb2020-03-16 17:21:41 +0000915 return cc->gdb_read_register(cpu, buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200916 }
pbrook56aebc82008-10-11 17:55:29 +0000917
Andreas Färbereac8b352013-06-28 21:11:37 +0200918 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000919 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
Alex Bennéea010bdb2020-03-16 17:21:41 +0000920 return r->get_reg(env, buf, reg - r->base_reg);
pbrook56aebc82008-10-11 17:55:29 +0000921 }
922 }
923 return 0;
924}
925
Andreas Färber385b9f02013-06-27 18:25:36 +0200926static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000927{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200928 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200929 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000930 GDBRegisterState *r;
931
Andreas Färbera0e372f2013-06-28 23:18:47 +0200932 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200933 return cc->gdb_write_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200934 }
pbrook56aebc82008-10-11 17:55:29 +0000935
Andreas Färbereac8b352013-06-28 21:11:37 +0200936 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000937 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
938 return r->set_reg(env, mem_buf, reg - r->base_reg);
939 }
940 }
941 return 0;
942}
943
944/* Register a supplemental set of CPU registers. If g_pos is nonzero it
945 specifies the first register number and these registers are included in
946 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
947 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
948 */
949
Andreas Färber22169d42013-06-28 21:27:39 +0200950void gdb_register_coprocessor(CPUState *cpu,
Alex Bennéea010bdb2020-03-16 17:21:41 +0000951 gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
Andreas Färber22169d42013-06-28 21:27:39 +0200952 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000953{
954 GDBRegisterState *s;
955 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000956
Andreas Färbereac8b352013-06-28 21:11:37 +0200957 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000958 while (*p) {
959 /* Check for duplicates. */
960 if (strcmp((*p)->xml, xml) == 0)
961 return;
962 p = &(*p)->next;
963 }
Stefan Weil9643c252011-10-18 22:25:38 +0200964
965 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200966 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200967 s->num_regs = num_regs;
968 s->get_reg = get_reg;
969 s->set_reg = set_reg;
970 s->xml = xml;
971
pbrook56aebc82008-10-11 17:55:29 +0000972 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200973 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000974 *p = s;
975 if (g_pos) {
976 if (g_pos != s->base_reg) {
Ziyue Yang7ae6c572017-01-18 16:03:29 +0800977 error_report("Error: Bad gdb register numbering for '%s', "
978 "expected %d got %d", xml, g_pos, s->base_reg);
Andreas Färber35143f02013-08-12 18:09:47 +0200979 } else {
980 cpu->gdb_num_g_regs = cpu->gdb_num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000981 }
982 }
983}
984
aliguoria1d1bb32008-11-18 20:07:32 +0000985#ifndef CONFIG_USER_ONLY
Peter Maydell2472b6c2014-09-12 19:04:17 +0100986/* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
987static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
988{
989 static const int xlat[] = {
990 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
991 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
992 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
993 };
994
995 CPUClass *cc = CPU_GET_CLASS(cpu);
996 int cputype = xlat[gdbtype];
997
998 if (cc->gdb_stop_before_watchpoint) {
999 cputype |= BP_STOP_BEFORE_ACCESS;
1000 }
1001 return cputype;
1002}
aliguoria1d1bb32008-11-18 20:07:32 +00001003#endif
1004
Jon Doron77f6ce52019-05-29 09:41:35 +03001005static int gdb_breakpoint_insert(int type, target_ulong addr, target_ulong len)
aliguoria1d1bb32008-11-18 20:07:32 +00001006{
Andreas Färber182735e2013-05-29 22:29:20 +02001007 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +00001008 int err = 0;
1009
Andreas Färber62278812013-06-27 17:12:06 +02001010 if (kvm_enabled()) {
Alex Bennée8d98c442020-03-16 17:21:33 +00001011 return kvm_insert_breakpoint(gdbserver_state.c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001012 }
aliguorie22a25c2009-03-12 20:12:48 +00001013
aliguoria1d1bb32008-11-18 20:07:32 +00001014 switch (type) {
1015 case GDB_BREAKPOINT_SW:
1016 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +02001017 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +02001018 err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
1019 if (err) {
aliguori880a7572008-11-18 20:30:24 +00001020 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +02001021 }
aliguori880a7572008-11-18 20:30:24 +00001022 }
1023 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001024#ifndef CONFIG_USER_ONLY
1025 case GDB_WATCHPOINT_WRITE:
1026 case GDB_WATCHPOINT_READ:
1027 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +02001028 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +01001029 err = cpu_watchpoint_insert(cpu, addr, len,
1030 xlat_gdb_type(cpu, type), NULL);
1031 if (err) {
aliguori880a7572008-11-18 20:30:24 +00001032 break;
Peter Maydell2472b6c2014-09-12 19:04:17 +01001033 }
aliguori880a7572008-11-18 20:30:24 +00001034 }
1035 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001036#endif
1037 default:
1038 return -ENOSYS;
1039 }
1040}
1041
Jon Doron77f6ce52019-05-29 09:41:35 +03001042static int gdb_breakpoint_remove(int type, target_ulong addr, target_ulong len)
aliguoria1d1bb32008-11-18 20:07:32 +00001043{
Andreas Färber182735e2013-05-29 22:29:20 +02001044 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +00001045 int err = 0;
1046
Andreas Färber62278812013-06-27 17:12:06 +02001047 if (kvm_enabled()) {
Alex Bennée8d98c442020-03-16 17:21:33 +00001048 return kvm_remove_breakpoint(gdbserver_state.c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001049 }
aliguorie22a25c2009-03-12 20:12:48 +00001050
aliguoria1d1bb32008-11-18 20:07:32 +00001051 switch (type) {
1052 case GDB_BREAKPOINT_SW:
1053 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +02001054 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +02001055 err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
1056 if (err) {
aliguori880a7572008-11-18 20:30:24 +00001057 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +02001058 }
aliguori880a7572008-11-18 20:30:24 +00001059 }
1060 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001061#ifndef CONFIG_USER_ONLY
1062 case GDB_WATCHPOINT_WRITE:
1063 case GDB_WATCHPOINT_READ:
1064 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +02001065 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +01001066 err = cpu_watchpoint_remove(cpu, addr, len,
1067 xlat_gdb_type(cpu, type));
aliguori880a7572008-11-18 20:30:24 +00001068 if (err)
1069 break;
1070 }
1071 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001072#endif
1073 default:
1074 return -ENOSYS;
1075 }
1076}
1077
Luc Michel546f3c62019-01-07 15:23:46 +00001078static inline void gdb_cpu_breakpoint_remove_all(CPUState *cpu)
1079{
1080 cpu_breakpoint_remove_all(cpu, BP_GDB);
1081#ifndef CONFIG_USER_ONLY
1082 cpu_watchpoint_remove_all(cpu, BP_GDB);
1083#endif
1084}
1085
Alex Bennéea346af32020-03-16 17:21:34 +00001086static void gdb_process_breakpoint_remove_all(GDBProcess *p)
Luc Michel546f3c62019-01-07 15:23:46 +00001087{
Alex Bennéea346af32020-03-16 17:21:34 +00001088 CPUState *cpu = get_first_cpu_in_process(p);
Luc Michel546f3c62019-01-07 15:23:46 +00001089
1090 while (cpu) {
1091 gdb_cpu_breakpoint_remove_all(cpu);
Alex Bennéea346af32020-03-16 17:21:34 +00001092 cpu = gdb_next_cpu_in_process(cpu);
Luc Michel546f3c62019-01-07 15:23:46 +00001093 }
1094}
1095
aliguori880a7572008-11-18 20:30:24 +00001096static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001097{
Andreas Färber182735e2013-05-29 22:29:20 +02001098 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +00001099
aliguorie22a25c2009-03-12 20:12:48 +00001100 if (kvm_enabled()) {
Alex Bennée8d98c442020-03-16 17:21:33 +00001101 kvm_remove_all_breakpoints(gdbserver_state.c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001102 return;
1103 }
1104
Andreas Färberbdc44642013-06-24 23:50:24 +02001105 CPU_FOREACH(cpu) {
Luc Michel546f3c62019-01-07 15:23:46 +00001106 gdb_cpu_breakpoint_remove_all(cpu);
aliguori880a7572008-11-18 20:30:24 +00001107 }
aliguoria1d1bb32008-11-18 20:07:32 +00001108}
1109
Alex Bennéea346af32020-03-16 17:21:34 +00001110static void gdb_set_cpu_pc(target_ulong pc)
aurel32fab9d282009-04-08 21:29:37 +00001111{
Alex Bennéea346af32020-03-16 17:21:34 +00001112 CPUState *cpu = gdbserver_state.c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001113
1114 cpu_synchronize_state(cpu);
Peter Crosthwaite4a2b24e2015-06-23 20:19:21 -07001115 cpu_set_pc(cpu, pc);
aurel32fab9d282009-04-08 21:29:37 +00001116}
1117
Alex Bennée308f9e82020-03-16 17:21:35 +00001118static void gdb_append_thread_id(CPUState *cpu, GString *buf)
Luc Michel1a227332019-01-07 15:23:45 +00001119{
Alex Bennéea346af32020-03-16 17:21:34 +00001120 if (gdbserver_state.multiprocess) {
Alex Bennée308f9e82020-03-16 17:21:35 +00001121 g_string_append_printf(buf, "p%02x.%02x",
1122 gdb_get_cpu_pid(cpu), cpu_gdb_index(cpu));
Luc Michel1a227332019-01-07 15:23:45 +00001123 } else {
Alex Bennée308f9e82020-03-16 17:21:35 +00001124 g_string_append_printf(buf, "%02x", cpu_gdb_index(cpu));
Luc Michel1a227332019-01-07 15:23:45 +00001125 }
Luc Michel1a227332019-01-07 15:23:45 +00001126}
1127
Luc Michel7d8c87d2019-01-07 15:23:45 +00001128typedef enum GDBThreadIdKind {
1129 GDB_ONE_THREAD = 0,
1130 GDB_ALL_THREADS, /* One process, all threads */
1131 GDB_ALL_PROCESSES,
1132 GDB_READ_THREAD_ERR
1133} GDBThreadIdKind;
1134
1135static GDBThreadIdKind read_thread_id(const char *buf, const char **end_buf,
1136 uint32_t *pid, uint32_t *tid)
1137{
1138 unsigned long p, t;
1139 int ret;
1140
1141 if (*buf == 'p') {
1142 buf++;
1143 ret = qemu_strtoul(buf, &buf, 16, &p);
1144
1145 if (ret) {
1146 return GDB_READ_THREAD_ERR;
1147 }
1148
1149 /* Skip '.' */
1150 buf++;
1151 } else {
1152 p = 1;
1153 }
1154
1155 ret = qemu_strtoul(buf, &buf, 16, &t);
1156
1157 if (ret) {
1158 return GDB_READ_THREAD_ERR;
1159 }
1160
1161 *end_buf = buf;
1162
1163 if (p == -1) {
1164 return GDB_ALL_PROCESSES;
1165 }
1166
1167 if (pid) {
1168 *pid = p;
1169 }
1170
1171 if (t == -1) {
1172 return GDB_ALL_THREADS;
1173 }
1174
1175 if (tid) {
1176 *tid = t;
1177 }
1178
1179 return GDB_ONE_THREAD;
1180}
1181
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001182/**
1183 * gdb_handle_vcont - Parses and handles a vCont packet.
1184 * returns -ENOTSUP if a command is unsupported, -EINVAL or -ERANGE if there is
1185 * a format error, 0 on success.
1186 */
Alex Bennéea346af32020-03-16 17:21:34 +00001187static int gdb_handle_vcont(const char *p)
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001188{
Luc Michele40e5202019-01-07 15:23:46 +00001189 int res, signal = 0;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001190 char cur_action;
1191 char *newstates;
1192 unsigned long tmp;
Luc Michele40e5202019-01-07 15:23:46 +00001193 uint32_t pid, tid;
1194 GDBProcess *process;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001195 CPUState *cpu;
Luc Michelc99ef792019-03-26 12:53:26 +00001196 GDBThreadIdKind kind;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001197#ifdef CONFIG_USER_ONLY
1198 int max_cpus = 1; /* global variable max_cpus exists only in system mode */
1199
1200 CPU_FOREACH(cpu) {
1201 max_cpus = max_cpus <= cpu->cpu_index ? cpu->cpu_index + 1 : max_cpus;
1202 }
Like Xu5cc87672019-05-19 04:54:21 +08001203#else
1204 MachineState *ms = MACHINE(qdev_get_machine());
1205 unsigned int max_cpus = ms->smp.max_cpus;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001206#endif
1207 /* uninitialised CPUs stay 0 */
1208 newstates = g_new0(char, max_cpus);
1209
1210 /* mark valid CPUs with 1 */
1211 CPU_FOREACH(cpu) {
1212 newstates[cpu->cpu_index] = 1;
1213 }
1214
1215 /*
1216 * res keeps track of what error we are returning, with -ENOTSUP meaning
1217 * that the command is unknown or unsupported, thus returning an empty
1218 * packet, while -EINVAL and -ERANGE cause an E22 packet, due to invalid,
1219 * or incorrect parameters passed.
1220 */
1221 res = 0;
1222 while (*p) {
1223 if (*p++ != ';') {
1224 res = -ENOTSUP;
1225 goto out;
1226 }
1227
1228 cur_action = *p++;
1229 if (cur_action == 'C' || cur_action == 'S') {
Peter Maydell95a5bef2017-07-20 17:31:30 +01001230 cur_action = qemu_tolower(cur_action);
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001231 res = qemu_strtoul(p + 1, &p, 16, &tmp);
1232 if (res) {
1233 goto out;
1234 }
1235 signal = gdb_signal_to_target(tmp);
1236 } else if (cur_action != 'c' && cur_action != 's') {
1237 /* unknown/invalid/unsupported command */
1238 res = -ENOTSUP;
1239 goto out;
1240 }
Luc Michele40e5202019-01-07 15:23:46 +00001241
Luc Michelc99ef792019-03-26 12:53:26 +00001242 if (*p == '\0' || *p == ';') {
1243 /*
1244 * No thread specifier, action is on "all threads". The
1245 * specification is unclear regarding the process to act on. We
1246 * choose all processes.
1247 */
1248 kind = GDB_ALL_PROCESSES;
1249 } else if (*p++ == ':') {
1250 kind = read_thread_id(p, &p, &pid, &tid);
1251 } else {
Luc Michele40e5202019-01-07 15:23:46 +00001252 res = -ENOTSUP;
1253 goto out;
1254 }
1255
Luc Michelc99ef792019-03-26 12:53:26 +00001256 switch (kind) {
Luc Michele40e5202019-01-07 15:23:46 +00001257 case GDB_READ_THREAD_ERR:
1258 res = -EINVAL;
1259 goto out;
1260
1261 case GDB_ALL_PROCESSES:
Alex Bennéea346af32020-03-16 17:21:34 +00001262 cpu = gdb_first_attached_cpu();
Luc Michele40e5202019-01-07 15:23:46 +00001263 while (cpu) {
1264 if (newstates[cpu->cpu_index] == 1) {
1265 newstates[cpu->cpu_index] = cur_action;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001266 }
Luc Michele40e5202019-01-07 15:23:46 +00001267
Alex Bennéea346af32020-03-16 17:21:34 +00001268 cpu = gdb_next_attached_cpu(cpu);
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001269 }
Luc Michele40e5202019-01-07 15:23:46 +00001270 break;
1271
1272 case GDB_ALL_THREADS:
Alex Bennéea346af32020-03-16 17:21:34 +00001273 process = gdb_get_process(pid);
Luc Michele40e5202019-01-07 15:23:46 +00001274
1275 if (!process->attached) {
1276 res = -EINVAL;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001277 goto out;
1278 }
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001279
Alex Bennéea346af32020-03-16 17:21:34 +00001280 cpu = get_first_cpu_in_process(process);
Luc Michele40e5202019-01-07 15:23:46 +00001281 while (cpu) {
1282 if (newstates[cpu->cpu_index] == 1) {
1283 newstates[cpu->cpu_index] = cur_action;
1284 }
1285
Alex Bennéea346af32020-03-16 17:21:34 +00001286 cpu = gdb_next_cpu_in_process(cpu);
Luc Michele40e5202019-01-07 15:23:46 +00001287 }
1288 break;
1289
1290 case GDB_ONE_THREAD:
Alex Bennéea346af32020-03-16 17:21:34 +00001291 cpu = gdb_get_cpu(pid, tid);
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001292
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001293 /* invalid CPU/thread specified */
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001294 if (!cpu) {
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001295 res = -EINVAL;
1296 goto out;
1297 }
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001298
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001299 /* only use if no previous match occourred */
1300 if (newstates[cpu->cpu_index] == 1) {
1301 newstates[cpu->cpu_index] = cur_action;
1302 }
Luc Michele40e5202019-01-07 15:23:46 +00001303 break;
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001304 }
1305 }
Alex Bennéea346af32020-03-16 17:21:34 +00001306 gdbserver_state.signal = signal;
1307 gdb_continue_partial(newstates);
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001308
1309out:
1310 g_free(newstates);
1311
1312 return res;
1313}
1314
Jon Dorond14055d2019-05-29 09:41:29 +03001315typedef union GdbCmdVariant {
1316 const char *data;
1317 uint8_t opcode;
1318 unsigned long val_ul;
1319 unsigned long long val_ull;
1320 struct {
1321 GDBThreadIdKind kind;
1322 uint32_t pid;
1323 uint32_t tid;
1324 } thread_id;
1325} GdbCmdVariant;
1326
1327static const char *cmd_next_param(const char *param, const char delimiter)
1328{
1329 static const char all_delimiters[] = ",;:=";
1330 char curr_delimiters[2] = {0};
1331 const char *delimiters;
1332
1333 if (delimiter == '?') {
1334 delimiters = all_delimiters;
1335 } else if (delimiter == '0') {
1336 return strchr(param, '\0');
1337 } else if (delimiter == '.' && *param) {
1338 return param + 1;
1339 } else {
1340 curr_delimiters[0] = delimiter;
1341 delimiters = curr_delimiters;
1342 }
1343
1344 param += strcspn(param, delimiters);
1345 if (*param) {
1346 param++;
1347 }
1348 return param;
1349}
1350
1351static int cmd_parse_params(const char *data, const char *schema,
1352 GdbCmdVariant *params, int *num_params)
1353{
1354 int curr_param;
1355 const char *curr_schema, *curr_data;
1356
1357 *num_params = 0;
1358
1359 if (!schema) {
1360 return 0;
1361 }
1362
1363 curr_schema = schema;
1364 curr_param = 0;
1365 curr_data = data;
1366 while (curr_schema[0] && curr_schema[1] && *curr_data) {
1367 switch (curr_schema[0]) {
1368 case 'l':
1369 if (qemu_strtoul(curr_data, &curr_data, 16,
1370 &params[curr_param].val_ul)) {
1371 return -EINVAL;
1372 }
1373 curr_param++;
1374 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1375 break;
1376 case 'L':
1377 if (qemu_strtou64(curr_data, &curr_data, 16,
1378 (uint64_t *)&params[curr_param].val_ull)) {
1379 return -EINVAL;
1380 }
1381 curr_param++;
1382 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1383 break;
1384 case 's':
1385 params[curr_param].data = curr_data;
1386 curr_param++;
1387 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1388 break;
1389 case 'o':
1390 params[curr_param].opcode = *(uint8_t *)curr_data;
1391 curr_param++;
1392 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1393 break;
1394 case 't':
1395 params[curr_param].thread_id.kind =
1396 read_thread_id(curr_data, &curr_data,
1397 &params[curr_param].thread_id.pid,
1398 &params[curr_param].thread_id.tid);
1399 curr_param++;
1400 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1401 break;
1402 case '?':
1403 curr_data = cmd_next_param(curr_data, curr_schema[1]);
1404 break;
1405 default:
1406 return -EINVAL;
1407 }
1408 curr_schema += 2;
1409 }
1410
1411 *num_params = curr_param;
1412 return 0;
1413}
1414
1415typedef struct GdbCmdContext {
Jon Dorond14055d2019-05-29 09:41:29 +03001416 GdbCmdVariant *params;
1417 int num_params;
Jon Dorond14055d2019-05-29 09:41:29 +03001418} GdbCmdContext;
1419
1420typedef void (*GdbCmdHandler)(GdbCmdContext *gdb_ctx, void *user_ctx);
1421
1422/*
1423 * cmd_startswith -> cmd is compared using startswith
1424 *
1425 *
1426 * schema definitions:
1427 * Each schema parameter entry consists of 2 chars,
1428 * the first char represents the parameter type handling
1429 * the second char represents the delimiter for the next parameter
1430 *
1431 * Currently supported schema types:
1432 * 'l' -> unsigned long (stored in .val_ul)
1433 * 'L' -> unsigned long long (stored in .val_ull)
1434 * 's' -> string (stored in .data)
1435 * 'o' -> single char (stored in .opcode)
1436 * 't' -> thread id (stored in .thread_id)
1437 * '?' -> skip according to delimiter
1438 *
1439 * Currently supported delimiters:
1440 * '?' -> Stop at any delimiter (",;:=\0")
1441 * '0' -> Stop at "\0"
1442 * '.' -> Skip 1 char unless reached "\0"
1443 * Any other value is treated as the delimiter value itself
1444 */
1445typedef struct GdbCmdParseEntry {
1446 GdbCmdHandler handler;
1447 const char *cmd;
1448 bool cmd_startswith;
1449 const char *schema;
1450} GdbCmdParseEntry;
1451
1452static inline int startswith(const char *string, const char *pattern)
1453{
1454 return !strncmp(string, pattern, strlen(pattern));
1455}
1456
Alex Bennéea346af32020-03-16 17:21:34 +00001457static int process_string_cmd(void *user_ctx, const char *data,
Jon Dorond14055d2019-05-29 09:41:29 +03001458 const GdbCmdParseEntry *cmds, int num_cmds)
1459{
1460 int i, schema_len, max_num_params = 0;
1461 GdbCmdContext gdb_ctx;
1462
1463 if (!cmds) {
1464 return -1;
1465 }
1466
1467 for (i = 0; i < num_cmds; i++) {
1468 const GdbCmdParseEntry *cmd = &cmds[i];
1469 g_assert(cmd->handler && cmd->cmd);
1470
1471 if ((cmd->cmd_startswith && !startswith(data, cmd->cmd)) ||
1472 (!cmd->cmd_startswith && strcmp(cmd->cmd, data))) {
1473 continue;
1474 }
1475
1476 if (cmd->schema) {
1477 schema_len = strlen(cmd->schema);
1478 if (schema_len % 2) {
1479 return -2;
1480 }
1481
1482 max_num_params = schema_len / 2;
1483 }
1484
1485 gdb_ctx.params =
1486 (GdbCmdVariant *)alloca(sizeof(*gdb_ctx.params) * max_num_params);
1487 memset(gdb_ctx.params, 0, sizeof(*gdb_ctx.params) * max_num_params);
1488
1489 if (cmd_parse_params(&data[strlen(cmd->cmd)], cmd->schema,
1490 gdb_ctx.params, &gdb_ctx.num_params)) {
1491 return -1;
1492 }
1493
Jon Dorond14055d2019-05-29 09:41:29 +03001494 cmd->handler(&gdb_ctx, user_ctx);
1495 return 0;
1496 }
1497
1498 return -1;
1499}
1500
Alex Bennéea346af32020-03-16 17:21:34 +00001501static void run_cmd_parser(const char *data, const GdbCmdParseEntry *cmd)
Jon Doron3e2c1262019-05-29 09:41:30 +03001502{
1503 if (!data) {
1504 return;
1505 }
1506
Alex Bennée308f9e82020-03-16 17:21:35 +00001507 g_string_set_size(gdbserver_state.str_buf, 0);
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001508 g_byte_array_set_size(gdbserver_state.mem_buf, 0);
Alex Bennée308f9e82020-03-16 17:21:35 +00001509
Jon Doron3e2c1262019-05-29 09:41:30 +03001510 /* In case there was an error during the command parsing we must
1511 * send a NULL packet to indicate the command is not supported */
Alex Bennéea346af32020-03-16 17:21:34 +00001512 if (process_string_cmd(NULL, data, cmd, 1)) {
1513 put_packet("");
Jon Doron3e2c1262019-05-29 09:41:30 +03001514 }
1515}
1516
1517static void handle_detach(GdbCmdContext *gdb_ctx, void *user_ctx)
1518{
1519 GDBProcess *process;
Jon Doron3e2c1262019-05-29 09:41:30 +03001520 uint32_t pid = 1;
1521
Alex Bennéea346af32020-03-16 17:21:34 +00001522 if (gdbserver_state.multiprocess) {
Jon Doron3e2c1262019-05-29 09:41:30 +03001523 if (!gdb_ctx->num_params) {
Alex Bennéea346af32020-03-16 17:21:34 +00001524 put_packet("E22");
Jon Doron3e2c1262019-05-29 09:41:30 +03001525 return;
1526 }
1527
1528 pid = gdb_ctx->params[0].val_ul;
1529 }
1530
Alex Bennéea346af32020-03-16 17:21:34 +00001531 process = gdb_get_process(pid);
1532 gdb_process_breakpoint_remove_all(process);
Jon Doron3e2c1262019-05-29 09:41:30 +03001533 process->attached = false;
1534
Alex Bennéea346af32020-03-16 17:21:34 +00001535 if (pid == gdb_get_cpu_pid(gdbserver_state.c_cpu)) {
1536 gdbserver_state.c_cpu = gdb_first_attached_cpu();
Jon Doron3e2c1262019-05-29 09:41:30 +03001537 }
1538
Alex Bennéea346af32020-03-16 17:21:34 +00001539 if (pid == gdb_get_cpu_pid(gdbserver_state.g_cpu)) {
1540 gdbserver_state.g_cpu = gdb_first_attached_cpu();
Jon Doron3e2c1262019-05-29 09:41:30 +03001541 }
1542
Alex Bennéea346af32020-03-16 17:21:34 +00001543 if (!gdbserver_state.c_cpu) {
Jon Doron3e2c1262019-05-29 09:41:30 +03001544 /* No more process attached */
1545 gdb_syscall_mode = GDB_SYS_DISABLED;
Alex Bennéea346af32020-03-16 17:21:34 +00001546 gdb_continue();
Jon Doron3e2c1262019-05-29 09:41:30 +03001547 }
Alex Bennéea346af32020-03-16 17:21:34 +00001548 put_packet("OK");
Jon Doron3e2c1262019-05-29 09:41:30 +03001549}
1550
Jon Doron44ffded2019-05-29 09:41:31 +03001551static void handle_thread_alive(GdbCmdContext *gdb_ctx, void *user_ctx)
1552{
1553 CPUState *cpu;
1554
1555 if (!gdb_ctx->num_params) {
Alex Bennéea346af32020-03-16 17:21:34 +00001556 put_packet("E22");
Jon Doron44ffded2019-05-29 09:41:31 +03001557 return;
1558 }
1559
1560 if (gdb_ctx->params[0].thread_id.kind == GDB_READ_THREAD_ERR) {
Alex Bennéea346af32020-03-16 17:21:34 +00001561 put_packet("E22");
Jon Doron44ffded2019-05-29 09:41:31 +03001562 return;
1563 }
1564
Alex Bennéea346af32020-03-16 17:21:34 +00001565 cpu = gdb_get_cpu(gdb_ctx->params[0].thread_id.pid,
Jon Doron44ffded2019-05-29 09:41:31 +03001566 gdb_ctx->params[0].thread_id.tid);
1567 if (!cpu) {
Alex Bennéea346af32020-03-16 17:21:34 +00001568 put_packet("E22");
Jon Doron44ffded2019-05-29 09:41:31 +03001569 return;
1570 }
1571
Alex Bennéea346af32020-03-16 17:21:34 +00001572 put_packet("OK");
Jon Doron44ffded2019-05-29 09:41:31 +03001573}
1574
Jon Doron4d6e3fe2019-05-29 09:41:32 +03001575static void handle_continue(GdbCmdContext *gdb_ctx, void *user_ctx)
1576{
1577 if (gdb_ctx->num_params) {
Alex Bennéea346af32020-03-16 17:21:34 +00001578 gdb_set_cpu_pc(gdb_ctx->params[0].val_ull);
Jon Doron4d6e3fe2019-05-29 09:41:32 +03001579 }
1580
Alex Bennéea346af32020-03-16 17:21:34 +00001581 gdbserver_state.signal = 0;
1582 gdb_continue();
Jon Doron4d6e3fe2019-05-29 09:41:32 +03001583}
1584
Jon Doronccc47d52019-05-29 09:41:33 +03001585static void handle_cont_with_sig(GdbCmdContext *gdb_ctx, void *user_ctx)
1586{
1587 unsigned long signal = 0;
1588
1589 /*
1590 * Note: C sig;[addr] is currently unsupported and we simply
1591 * omit the addr parameter
1592 */
1593 if (gdb_ctx->num_params) {
1594 signal = gdb_ctx->params[0].val_ul;
1595 }
1596
Alex Bennéea346af32020-03-16 17:21:34 +00001597 gdbserver_state.signal = gdb_signal_to_target(signal);
1598 if (gdbserver_state.signal == -1) {
1599 gdbserver_state.signal = 0;
Jon Doronccc47d52019-05-29 09:41:33 +03001600 }
Alex Bennéea346af32020-03-16 17:21:34 +00001601 gdb_continue();
Jon Doronccc47d52019-05-29 09:41:33 +03001602}
1603
Jon Doron3a9651d2019-05-29 09:41:34 +03001604static void handle_set_thread(GdbCmdContext *gdb_ctx, void *user_ctx)
1605{
1606 CPUState *cpu;
1607
1608 if (gdb_ctx->num_params != 2) {
Alex Bennéea346af32020-03-16 17:21:34 +00001609 put_packet("E22");
Jon Doron3a9651d2019-05-29 09:41:34 +03001610 return;
1611 }
1612
1613 if (gdb_ctx->params[1].thread_id.kind == GDB_READ_THREAD_ERR) {
Alex Bennéea346af32020-03-16 17:21:34 +00001614 put_packet("E22");
Jon Doron3a9651d2019-05-29 09:41:34 +03001615 return;
1616 }
1617
1618 if (gdb_ctx->params[1].thread_id.kind != GDB_ONE_THREAD) {
Alex Bennéea346af32020-03-16 17:21:34 +00001619 put_packet("OK");
Jon Doron3a9651d2019-05-29 09:41:34 +03001620 return;
1621 }
1622
Alex Bennéea346af32020-03-16 17:21:34 +00001623 cpu = gdb_get_cpu(gdb_ctx->params[1].thread_id.pid,
Jon Doron3a9651d2019-05-29 09:41:34 +03001624 gdb_ctx->params[1].thread_id.tid);
1625 if (!cpu) {
Alex Bennéea346af32020-03-16 17:21:34 +00001626 put_packet("E22");
Jon Doron3a9651d2019-05-29 09:41:34 +03001627 return;
1628 }
1629
1630 /*
1631 * Note: This command is deprecated and modern gdb's will be using the
1632 * vCont command instead.
1633 */
1634 switch (gdb_ctx->params[0].opcode) {
1635 case 'c':
Alex Bennéea346af32020-03-16 17:21:34 +00001636 gdbserver_state.c_cpu = cpu;
1637 put_packet("OK");
Jon Doron3a9651d2019-05-29 09:41:34 +03001638 break;
1639 case 'g':
Alex Bennéea346af32020-03-16 17:21:34 +00001640 gdbserver_state.g_cpu = cpu;
1641 put_packet("OK");
Jon Doron3a9651d2019-05-29 09:41:34 +03001642 break;
1643 default:
Alex Bennéea346af32020-03-16 17:21:34 +00001644 put_packet("E22");
Jon Doron3a9651d2019-05-29 09:41:34 +03001645 break;
1646 }
1647}
1648
Jon Doron77f6ce52019-05-29 09:41:35 +03001649static void handle_insert_bp(GdbCmdContext *gdb_ctx, void *user_ctx)
1650{
1651 int res;
1652
1653 if (gdb_ctx->num_params != 3) {
Alex Bennéea346af32020-03-16 17:21:34 +00001654 put_packet("E22");
Jon Doron77f6ce52019-05-29 09:41:35 +03001655 return;
1656 }
1657
1658 res = gdb_breakpoint_insert(gdb_ctx->params[0].val_ul,
1659 gdb_ctx->params[1].val_ull,
1660 gdb_ctx->params[2].val_ull);
1661 if (res >= 0) {
Alex Bennéea346af32020-03-16 17:21:34 +00001662 put_packet("OK");
Jon Doron77f6ce52019-05-29 09:41:35 +03001663 return;
1664 } else if (res == -ENOSYS) {
Alex Bennéea346af32020-03-16 17:21:34 +00001665 put_packet("");
Jon Doron77f6ce52019-05-29 09:41:35 +03001666 return;
1667 }
1668
Alex Bennéea346af32020-03-16 17:21:34 +00001669 put_packet("E22");
Jon Doron77f6ce52019-05-29 09:41:35 +03001670}
1671
1672static void handle_remove_bp(GdbCmdContext *gdb_ctx, void *user_ctx)
1673{
1674 int res;
1675
1676 if (gdb_ctx->num_params != 3) {
Alex Bennéea346af32020-03-16 17:21:34 +00001677 put_packet("E22");
Jon Doron77f6ce52019-05-29 09:41:35 +03001678 return;
1679 }
1680
1681 res = gdb_breakpoint_remove(gdb_ctx->params[0].val_ul,
1682 gdb_ctx->params[1].val_ull,
1683 gdb_ctx->params[2].val_ull);
1684 if (res >= 0) {
Alex Bennéea346af32020-03-16 17:21:34 +00001685 put_packet("OK");
Jon Doron77f6ce52019-05-29 09:41:35 +03001686 return;
1687 } else if (res == -ENOSYS) {
Alex Bennéea346af32020-03-16 17:21:34 +00001688 put_packet("");
Jon Doron77f6ce52019-05-29 09:41:35 +03001689 return;
1690 }
1691
Alex Bennéea346af32020-03-16 17:21:34 +00001692 put_packet("E22");
Jon Doron77f6ce52019-05-29 09:41:35 +03001693}
1694
Alex Bennée94b2a622019-07-05 14:23:07 +01001695/*
1696 * handle_set/get_reg
1697 *
1698 * Older gdb are really dumb, and don't use 'G/g' if 'P/p' is available.
1699 * This works, but can be very slow. Anything new enough to understand
1700 * XML also knows how to use this properly. However to use this we
1701 * need to define a local XML file as well as be talking to a
1702 * reasonably modern gdb. Responding with an empty packet will cause
1703 * the remote gdb to fallback to older methods.
1704 */
1705
Jon Doron62b33202019-05-29 09:41:36 +03001706static void handle_set_reg(GdbCmdContext *gdb_ctx, void *user_ctx)
1707{
1708 int reg_size;
1709
1710 if (!gdb_has_xml) {
Alex Bennéea346af32020-03-16 17:21:34 +00001711 put_packet("");
Jon Doron62b33202019-05-29 09:41:36 +03001712 return;
1713 }
1714
1715 if (gdb_ctx->num_params != 2) {
Alex Bennéea346af32020-03-16 17:21:34 +00001716 put_packet("E22");
Jon Doron62b33202019-05-29 09:41:36 +03001717 return;
1718 }
1719
1720 reg_size = strlen(gdb_ctx->params[1].data) / 2;
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001721 hextomem(gdbserver_state.mem_buf, gdb_ctx->params[1].data, reg_size);
1722 gdb_write_register(gdbserver_state.g_cpu, gdbserver_state.mem_buf->data,
Jon Doron62b33202019-05-29 09:41:36 +03001723 gdb_ctx->params[0].val_ull);
Alex Bennéea346af32020-03-16 17:21:34 +00001724 put_packet("OK");
Jon Doron62b33202019-05-29 09:41:36 +03001725}
1726
Jon Doron5d0e57b2019-05-29 09:41:37 +03001727static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx)
1728{
1729 int reg_size;
1730
Jon Doron5d0e57b2019-05-29 09:41:37 +03001731 if (!gdb_has_xml) {
Alex Bennéea346af32020-03-16 17:21:34 +00001732 put_packet("");
Jon Doron5d0e57b2019-05-29 09:41:37 +03001733 return;
1734 }
1735
1736 if (!gdb_ctx->num_params) {
Alex Bennéea346af32020-03-16 17:21:34 +00001737 put_packet("E14");
Jon Doron5d0e57b2019-05-29 09:41:37 +03001738 return;
1739 }
1740
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001741 reg_size = gdb_read_register(gdbserver_state.g_cpu,
Alex Bennéea010bdb2020-03-16 17:21:41 +00001742 gdbserver_state.mem_buf,
Jon Doron5d0e57b2019-05-29 09:41:37 +03001743 gdb_ctx->params[0].val_ull);
1744 if (!reg_size) {
Alex Bennéea346af32020-03-16 17:21:34 +00001745 put_packet("E14");
Jon Doron5d0e57b2019-05-29 09:41:37 +03001746 return;
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001747 } else {
1748 g_byte_array_set_size(gdbserver_state.mem_buf, reg_size);
Jon Doron5d0e57b2019-05-29 09:41:37 +03001749 }
1750
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001751 memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, reg_size);
Alex Bennée308f9e82020-03-16 17:21:35 +00001752 put_strbuf();
Jon Doron5d0e57b2019-05-29 09:41:37 +03001753}
1754
Jon Doroncc0ecc72019-05-29 09:41:38 +03001755static void handle_write_mem(GdbCmdContext *gdb_ctx, void *user_ctx)
1756{
1757 if (gdb_ctx->num_params != 3) {
Alex Bennéea346af32020-03-16 17:21:34 +00001758 put_packet("E22");
Jon Doroncc0ecc72019-05-29 09:41:38 +03001759 return;
1760 }
1761
1762 /* hextomem() reads 2*len bytes */
1763 if (gdb_ctx->params[1].val_ull > strlen(gdb_ctx->params[2].data) / 2) {
Alex Bennéea346af32020-03-16 17:21:34 +00001764 put_packet("E22");
Jon Doroncc0ecc72019-05-29 09:41:38 +03001765 return;
1766 }
1767
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001768 hextomem(gdbserver_state.mem_buf, gdb_ctx->params[2].data,
Jon Doroncc0ecc72019-05-29 09:41:38 +03001769 gdb_ctx->params[1].val_ull);
Alex Bennéea346af32020-03-16 17:21:34 +00001770 if (target_memory_rw_debug(gdbserver_state.g_cpu, gdb_ctx->params[0].val_ull,
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001771 gdbserver_state.mem_buf->data,
1772 gdbserver_state.mem_buf->len, true)) {
Alex Bennéea346af32020-03-16 17:21:34 +00001773 put_packet("E14");
Jon Doroncc0ecc72019-05-29 09:41:38 +03001774 return;
1775 }
1776
Alex Bennéea346af32020-03-16 17:21:34 +00001777 put_packet("OK");
Jon Doroncc0ecc72019-05-29 09:41:38 +03001778}
1779
Jon Doronda92e232019-05-29 09:41:39 +03001780static void handle_read_mem(GdbCmdContext *gdb_ctx, void *user_ctx)
1781{
1782 if (gdb_ctx->num_params != 2) {
Alex Bennéea346af32020-03-16 17:21:34 +00001783 put_packet("E22");
Jon Doronda92e232019-05-29 09:41:39 +03001784 return;
1785 }
1786
1787 /* memtohex() doubles the required space */
1788 if (gdb_ctx->params[1].val_ull > MAX_PACKET_LENGTH / 2) {
Alex Bennéea346af32020-03-16 17:21:34 +00001789 put_packet("E22");
Jon Doronda92e232019-05-29 09:41:39 +03001790 return;
1791 }
1792
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001793 g_byte_array_set_size(gdbserver_state.mem_buf, gdb_ctx->params[1].val_ull);
1794
Alex Bennéea346af32020-03-16 17:21:34 +00001795 if (target_memory_rw_debug(gdbserver_state.g_cpu, gdb_ctx->params[0].val_ull,
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001796 gdbserver_state.mem_buf->data,
1797 gdbserver_state.mem_buf->len, false)) {
Alex Bennéea346af32020-03-16 17:21:34 +00001798 put_packet("E14");
Jon Doronda92e232019-05-29 09:41:39 +03001799 return;
1800 }
1801
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001802 memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data,
1803 gdbserver_state.mem_buf->len);
Alex Bennée308f9e82020-03-16 17:21:35 +00001804 put_strbuf();
Jon Doronda92e232019-05-29 09:41:39 +03001805}
1806
Jon Doron287ca122019-05-29 09:41:40 +03001807static void handle_write_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx)
1808{
1809 target_ulong addr, len;
1810 uint8_t *registers;
1811 int reg_size;
1812
1813 if (!gdb_ctx->num_params) {
1814 return;
1815 }
1816
Alex Bennéea346af32020-03-16 17:21:34 +00001817 cpu_synchronize_state(gdbserver_state.g_cpu);
Jon Doron287ca122019-05-29 09:41:40 +03001818 len = strlen(gdb_ctx->params[0].data) / 2;
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001819 hextomem(gdbserver_state.mem_buf, gdb_ctx->params[0].data, len);
1820 registers = gdbserver_state.mem_buf->data;
Alex Bennéea346af32020-03-16 17:21:34 +00001821 for (addr = 0; addr < gdbserver_state.g_cpu->gdb_num_g_regs && len > 0;
Jon Doron287ca122019-05-29 09:41:40 +03001822 addr++) {
Alex Bennéea346af32020-03-16 17:21:34 +00001823 reg_size = gdb_write_register(gdbserver_state.g_cpu, registers, addr);
Jon Doron287ca122019-05-29 09:41:40 +03001824 len -= reg_size;
1825 registers += reg_size;
1826 }
Alex Bennéea346af32020-03-16 17:21:34 +00001827 put_packet("OK");
Jon Doron287ca122019-05-29 09:41:40 +03001828}
1829
Jon Doron397d1372019-05-29 09:41:41 +03001830static void handle_read_all_regs(GdbCmdContext *gdb_ctx, void *user_ctx)
1831{
1832 target_ulong addr, len;
1833
Alex Bennéea346af32020-03-16 17:21:34 +00001834 cpu_synchronize_state(gdbserver_state.g_cpu);
Alex Bennéea010bdb2020-03-16 17:21:41 +00001835 g_byte_array_set_size(gdbserver_state.mem_buf, 0);
Jon Doron397d1372019-05-29 09:41:41 +03001836 len = 0;
Alex Bennéea346af32020-03-16 17:21:34 +00001837 for (addr = 0; addr < gdbserver_state.g_cpu->gdb_num_g_regs; addr++) {
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001838 len += gdb_read_register(gdbserver_state.g_cpu,
Alex Bennéea010bdb2020-03-16 17:21:41 +00001839 gdbserver_state.mem_buf,
Jon Doron397d1372019-05-29 09:41:41 +03001840 addr);
1841 }
Alex Bennéea010bdb2020-03-16 17:21:41 +00001842 g_assert(len == gdbserver_state.mem_buf->len);
Jon Doron397d1372019-05-29 09:41:41 +03001843
Alex Bennée4a25f1b2020-03-16 17:21:36 +00001844 memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, len);
Alex Bennée308f9e82020-03-16 17:21:35 +00001845 put_strbuf();
Jon Doron397d1372019-05-29 09:41:41 +03001846}
1847
Jon Doron4b20fab2019-05-29 09:41:42 +03001848static void handle_file_io(GdbCmdContext *gdb_ctx, void *user_ctx)
1849{
Alex Bennéea346af32020-03-16 17:21:34 +00001850 if (gdb_ctx->num_params >= 1 && gdbserver_state.current_syscall_cb) {
Jon Doron4b20fab2019-05-29 09:41:42 +03001851 target_ulong ret, err;
1852
1853 ret = (target_ulong)gdb_ctx->params[0].val_ull;
Sandra Loosemorec6ee9522019-08-27 16:33:17 -06001854 if (gdb_ctx->num_params >= 2) {
1855 err = (target_ulong)gdb_ctx->params[1].val_ull;
1856 } else {
1857 err = 0;
1858 }
Alex Bennéea346af32020-03-16 17:21:34 +00001859 gdbserver_state.current_syscall_cb(gdbserver_state.c_cpu, ret, err);
1860 gdbserver_state.current_syscall_cb = NULL;
Jon Doron4b20fab2019-05-29 09:41:42 +03001861 }
1862
1863 if (gdb_ctx->num_params >= 3 && gdb_ctx->params[2].opcode == (uint8_t)'C') {
Alex Bennéea346af32020-03-16 17:21:34 +00001864 put_packet("T02");
Jon Doron4b20fab2019-05-29 09:41:42 +03001865 return;
1866 }
1867
Alex Bennéea346af32020-03-16 17:21:34 +00001868 gdb_continue();
Jon Doron4b20fab2019-05-29 09:41:42 +03001869}
1870
Jon Doron933f80d2019-05-29 09:41:43 +03001871static void handle_step(GdbCmdContext *gdb_ctx, void *user_ctx)
1872{
1873 if (gdb_ctx->num_params) {
Alex Bennéea346af32020-03-16 17:21:34 +00001874 gdb_set_cpu_pc((target_ulong)gdb_ctx->params[0].val_ull);
Jon Doron933f80d2019-05-29 09:41:43 +03001875 }
1876
Alex Bennéea346af32020-03-16 17:21:34 +00001877 cpu_single_step(gdbserver_state.c_cpu, sstep_flags);
1878 gdb_continue();
Jon Doron933f80d2019-05-29 09:41:43 +03001879}
1880
Jon Doron8536ec02019-05-29 09:41:44 +03001881static void handle_v_cont_query(GdbCmdContext *gdb_ctx, void *user_ctx)
1882{
Alex Bennéea346af32020-03-16 17:21:34 +00001883 put_packet("vCont;c;C;s;S");
Jon Doron8536ec02019-05-29 09:41:44 +03001884}
1885
1886static void handle_v_cont(GdbCmdContext *gdb_ctx, void *user_ctx)
1887{
1888 int res;
1889
1890 if (!gdb_ctx->num_params) {
1891 return;
1892 }
1893
Alex Bennéea346af32020-03-16 17:21:34 +00001894 res = gdb_handle_vcont(gdb_ctx->params[0].data);
Jon Doron8536ec02019-05-29 09:41:44 +03001895 if ((res == -EINVAL) || (res == -ERANGE)) {
Alex Bennéea346af32020-03-16 17:21:34 +00001896 put_packet("E22");
Jon Doron8536ec02019-05-29 09:41:44 +03001897 } else if (res) {
Alex Bennéea346af32020-03-16 17:21:34 +00001898 put_packet("");
Jon Doron8536ec02019-05-29 09:41:44 +03001899 }
1900}
1901
1902static void handle_v_attach(GdbCmdContext *gdb_ctx, void *user_ctx)
1903{
1904 GDBProcess *process;
1905 CPUState *cpu;
Jon Doron8536ec02019-05-29 09:41:44 +03001906
Alex Bennée308f9e82020-03-16 17:21:35 +00001907 g_string_assign(gdbserver_state.str_buf, "E22");
Jon Doron8536ec02019-05-29 09:41:44 +03001908 if (!gdb_ctx->num_params) {
1909 goto cleanup;
1910 }
1911
Alex Bennéea346af32020-03-16 17:21:34 +00001912 process = gdb_get_process(gdb_ctx->params[0].val_ul);
Jon Doron8536ec02019-05-29 09:41:44 +03001913 if (!process) {
1914 goto cleanup;
1915 }
1916
Alex Bennéea346af32020-03-16 17:21:34 +00001917 cpu = get_first_cpu_in_process(process);
Jon Doron8536ec02019-05-29 09:41:44 +03001918 if (!cpu) {
1919 goto cleanup;
1920 }
1921
1922 process->attached = true;
Alex Bennéea346af32020-03-16 17:21:34 +00001923 gdbserver_state.g_cpu = cpu;
1924 gdbserver_state.c_cpu = cpu;
Jon Doron8536ec02019-05-29 09:41:44 +03001925
Alex Bennée308f9e82020-03-16 17:21:35 +00001926 g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TRAP);
1927 gdb_append_thread_id(cpu, gdbserver_state.str_buf);
1928 g_string_append_c(gdbserver_state.str_buf, ';');
Jon Doron8536ec02019-05-29 09:41:44 +03001929cleanup:
Alex Bennée308f9e82020-03-16 17:21:35 +00001930 put_strbuf();
Jon Doron8536ec02019-05-29 09:41:44 +03001931}
1932
1933static void handle_v_kill(GdbCmdContext *gdb_ctx, void *user_ctx)
1934{
1935 /* Kill the target */
Alex Bennéea346af32020-03-16 17:21:34 +00001936 put_packet("OK");
Jon Doron8536ec02019-05-29 09:41:44 +03001937 error_report("QEMU: Terminated via GDBstub");
1938 exit(0);
1939}
1940
1941static GdbCmdParseEntry gdb_v_commands_table[] = {
1942 /* Order is important if has same prefix */
1943 {
1944 .handler = handle_v_cont_query,
1945 .cmd = "Cont?",
1946 .cmd_startswith = 1
1947 },
1948 {
1949 .handler = handle_v_cont,
1950 .cmd = "Cont",
1951 .cmd_startswith = 1,
1952 .schema = "s0"
1953 },
1954 {
1955 .handler = handle_v_attach,
1956 .cmd = "Attach;",
1957 .cmd_startswith = 1,
1958 .schema = "l0"
1959 },
1960 {
1961 .handler = handle_v_kill,
1962 .cmd = "Kill;",
1963 .cmd_startswith = 1
1964 },
1965};
1966
1967static void handle_v_commands(GdbCmdContext *gdb_ctx, void *user_ctx)
1968{
1969 if (!gdb_ctx->num_params) {
1970 return;
1971 }
1972
Alex Bennéea346af32020-03-16 17:21:34 +00001973 if (process_string_cmd(NULL, gdb_ctx->params[0].data,
Jon Doron8536ec02019-05-29 09:41:44 +03001974 gdb_v_commands_table,
1975 ARRAY_SIZE(gdb_v_commands_table))) {
Alex Bennéea346af32020-03-16 17:21:34 +00001976 put_packet("");
Jon Doron8536ec02019-05-29 09:41:44 +03001977 }
1978}
1979
Jon Doron2704efa2019-05-29 09:41:45 +03001980static void handle_query_qemu_sstepbits(GdbCmdContext *gdb_ctx, void *user_ctx)
1981{
Alex Bennée308f9e82020-03-16 17:21:35 +00001982 g_string_printf(gdbserver_state.str_buf, "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1983 SSTEP_ENABLE, SSTEP_NOIRQ, SSTEP_NOTIMER);
1984 put_strbuf();
Jon Doron2704efa2019-05-29 09:41:45 +03001985}
1986
1987static void handle_set_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx)
1988{
1989 if (!gdb_ctx->num_params) {
1990 return;
1991 }
1992
1993 sstep_flags = gdb_ctx->params[0].val_ul;
Alex Bennéea346af32020-03-16 17:21:34 +00001994 put_packet("OK");
Jon Doron2704efa2019-05-29 09:41:45 +03001995}
1996
1997static void handle_query_qemu_sstep(GdbCmdContext *gdb_ctx, void *user_ctx)
1998{
Alex Bennée308f9e82020-03-16 17:21:35 +00001999 g_string_printf(gdbserver_state.str_buf, "0x%x", sstep_flags);
2000 put_strbuf();
Jon Doron2704efa2019-05-29 09:41:45 +03002001}
2002
2003static void handle_query_curr_tid(GdbCmdContext *gdb_ctx, void *user_ctx)
bellardb4608c02003-06-27 17:34:32 +00002004{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002005 CPUState *cpu;
Luc Michelc145eea2019-01-07 15:23:46 +00002006 GDBProcess *process;
Jon Doron2704efa2019-05-29 09:41:45 +03002007
2008 /*
2009 * "Current thread" remains vague in the spec, so always return
2010 * the first thread of the current process (gdb returns the
2011 * first thread).
2012 */
Alex Bennéea346af32020-03-16 17:21:34 +00002013 process = gdb_get_cpu_process(gdbserver_state.g_cpu);
2014 cpu = get_first_cpu_in_process(process);
Alex Bennée308f9e82020-03-16 17:21:35 +00002015 g_string_assign(gdbserver_state.str_buf, "QC");
2016 gdb_append_thread_id(cpu, gdbserver_state.str_buf);
2017 put_strbuf();
Jon Doron2704efa2019-05-29 09:41:45 +03002018}
2019
2020static void handle_query_threads(GdbCmdContext *gdb_ctx, void *user_ctx)
2021{
Alex Bennéea346af32020-03-16 17:21:34 +00002022 if (!gdbserver_state.query_cpu) {
2023 put_packet("l");
Jon Doron2704efa2019-05-29 09:41:45 +03002024 return;
2025 }
2026
Alex Bennée308f9e82020-03-16 17:21:35 +00002027 g_string_assign(gdbserver_state.str_buf, "m");
2028 gdb_append_thread_id(gdbserver_state.query_cpu, gdbserver_state.str_buf);
2029 put_strbuf();
Alex Bennéea346af32020-03-16 17:21:34 +00002030 gdbserver_state.query_cpu = gdb_next_attached_cpu(gdbserver_state.query_cpu);
Jon Doron2704efa2019-05-29 09:41:45 +03002031}
2032
2033static void handle_query_first_threads(GdbCmdContext *gdb_ctx, void *user_ctx)
2034{
Alex Bennéea346af32020-03-16 17:21:34 +00002035 gdbserver_state.query_cpu = gdb_first_attached_cpu();
Jon Doron2704efa2019-05-29 09:41:45 +03002036 handle_query_threads(gdb_ctx, user_ctx);
2037}
2038
2039static void handle_query_thread_extra(GdbCmdContext *gdb_ctx, void *user_ctx)
2040{
Alex Bennée308f9e82020-03-16 17:21:35 +00002041 g_autoptr(GString) rs = g_string_new(NULL);
Jon Doron2704efa2019-05-29 09:41:45 +03002042 CPUState *cpu;
Jon Doron2704efa2019-05-29 09:41:45 +03002043
2044 if (!gdb_ctx->num_params ||
2045 gdb_ctx->params[0].thread_id.kind == GDB_READ_THREAD_ERR) {
Alex Bennéea346af32020-03-16 17:21:34 +00002046 put_packet("E22");
Jon Doron2704efa2019-05-29 09:41:45 +03002047 return;
2048 }
2049
Alex Bennéea346af32020-03-16 17:21:34 +00002050 cpu = gdb_get_cpu(gdb_ctx->params[0].thread_id.pid,
Jon Doron2704efa2019-05-29 09:41:45 +03002051 gdb_ctx->params[0].thread_id.tid);
2052 if (!cpu) {
2053 return;
2054 }
2055
2056 cpu_synchronize_state(cpu);
2057
Alex Bennéea346af32020-03-16 17:21:34 +00002058 if (gdbserver_state.multiprocess && (gdbserver_state.process_num > 1)) {
Jon Doron2704efa2019-05-29 09:41:45 +03002059 /* Print the CPU model and name in multiprocess mode */
2060 ObjectClass *oc = object_get_class(OBJECT(cpu));
2061 const char *cpu_model = object_class_get_name(oc);
Markus Armbruster7a309cc2020-07-14 18:02:00 +02002062 const char *cpu_name =
Denis Plotnikov076b2fa2020-04-03 20:11:44 +01002063 object_get_canonical_path_component(OBJECT(cpu));
Alex Bennée308f9e82020-03-16 17:21:35 +00002064 g_string_printf(rs, "%s %s [%s]", cpu_model, cpu_name,
2065 cpu->halted ? "halted " : "running");
Jon Doron2704efa2019-05-29 09:41:45 +03002066 } else {
Alex Bennée308f9e82020-03-16 17:21:35 +00002067 g_string_printf(rs, "CPU#%d [%s]", cpu->cpu_index,
Jon Doron2704efa2019-05-29 09:41:45 +03002068 cpu->halted ? "halted " : "running");
2069 }
Alex Bennée308f9e82020-03-16 17:21:35 +00002070 trace_gdbstub_op_extra_info(rs->str);
2071 memtohex(gdbserver_state.str_buf, (uint8_t *)rs->str, rs->len);
2072 put_strbuf();
Jon Doron2704efa2019-05-29 09:41:45 +03002073}
2074
2075#ifdef CONFIG_USER_ONLY
2076static void handle_query_offsets(GdbCmdContext *gdb_ctx, void *user_ctx)
2077{
2078 TaskState *ts;
2079
Alex Bennéea346af32020-03-16 17:21:34 +00002080 ts = gdbserver_state.c_cpu->opaque;
Alex Bennée308f9e82020-03-16 17:21:35 +00002081 g_string_printf(gdbserver_state.str_buf,
2082 "Text=" TARGET_ABI_FMT_lx
2083 ";Data=" TARGET_ABI_FMT_lx
2084 ";Bss=" TARGET_ABI_FMT_lx,
2085 ts->info->code_offset,
2086 ts->info->data_offset,
2087 ts->info->data_offset);
2088 put_strbuf();
Jon Doron2704efa2019-05-29 09:41:45 +03002089}
2090#else
2091static void handle_query_rcmd(GdbCmdContext *gdb_ctx, void *user_ctx)
2092{
Alex Bennée4a25f1b2020-03-16 17:21:36 +00002093 const guint8 zero = 0;
Jon Doron2704efa2019-05-29 09:41:45 +03002094 int len;
2095
2096 if (!gdb_ctx->num_params) {
Alex Bennéea346af32020-03-16 17:21:34 +00002097 put_packet("E22");
Jon Doron2704efa2019-05-29 09:41:45 +03002098 return;
2099 }
2100
2101 len = strlen(gdb_ctx->params[0].data);
2102 if (len % 2) {
Alex Bennéea346af32020-03-16 17:21:34 +00002103 put_packet("E01");
Jon Doron2704efa2019-05-29 09:41:45 +03002104 return;
2105 }
2106
Alex Bennée4a25f1b2020-03-16 17:21:36 +00002107 g_assert(gdbserver_state.mem_buf->len == 0);
Jon Doron2704efa2019-05-29 09:41:45 +03002108 len = len / 2;
Alex Bennée4a25f1b2020-03-16 17:21:36 +00002109 hextomem(gdbserver_state.mem_buf, gdb_ctx->params[0].data, len);
2110 g_byte_array_append(gdbserver_state.mem_buf, &zero, 1);
2111 qemu_chr_be_write(gdbserver_state.mon_chr, gdbserver_state.mem_buf->data,
2112 gdbserver_state.mem_buf->len);
Alex Bennéea346af32020-03-16 17:21:34 +00002113 put_packet("OK");
Jon Doron2704efa2019-05-29 09:41:45 +03002114}
2115#endif
2116
2117static void handle_query_supported(GdbCmdContext *gdb_ctx, void *user_ctx)
2118{
Andreas Färber5b24c642013-07-07 15:08:22 +02002119 CPUClass *cc;
Jon Doron2704efa2019-05-29 09:41:45 +03002120
Alex Bennée308f9e82020-03-16 17:21:35 +00002121 g_string_printf(gdbserver_state.str_buf, "PacketSize=%x", MAX_PACKET_LENGTH);
Jon Doron2704efa2019-05-29 09:41:45 +03002122 cc = CPU_GET_CLASS(first_cpu);
2123 if (cc->gdb_core_xml_file) {
Alex Bennée308f9e82020-03-16 17:21:35 +00002124 g_string_append(gdbserver_state.str_buf, ";qXfer:features:read+");
Jon Doron2704efa2019-05-29 09:41:45 +03002125 }
2126
2127 if (gdb_ctx->num_params &&
2128 strstr(gdb_ctx->params[0].data, "multiprocess+")) {
Alex Bennéea346af32020-03-16 17:21:34 +00002129 gdbserver_state.multiprocess = true;
Jon Doron2704efa2019-05-29 09:41:45 +03002130 }
2131
Changbin Du3bc26092020-03-16 17:21:55 +00002132 g_string_append(gdbserver_state.str_buf, ";vContSupported+;multiprocess+");
Alex Bennée308f9e82020-03-16 17:21:35 +00002133 put_strbuf();
Jon Doron2704efa2019-05-29 09:41:45 +03002134}
2135
2136static void handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx)
2137{
2138 GDBProcess *process;
2139 CPUClass *cc;
2140 unsigned long len, total_len, addr;
2141 const char *xml;
bellardb4608c02003-06-27 17:34:32 +00002142 const char *p;
Jon Doron2704efa2019-05-29 09:41:45 +03002143
2144 if (gdb_ctx->num_params < 3) {
Alex Bennéea346af32020-03-16 17:21:34 +00002145 put_packet("E22");
Jon Doron2704efa2019-05-29 09:41:45 +03002146 return;
2147 }
2148
Alex Bennéea346af32020-03-16 17:21:34 +00002149 process = gdb_get_cpu_process(gdbserver_state.g_cpu);
2150 cc = CPU_GET_CLASS(gdbserver_state.g_cpu);
Jon Doron2704efa2019-05-29 09:41:45 +03002151 if (!cc->gdb_core_xml_file) {
Alex Bennéea346af32020-03-16 17:21:34 +00002152 put_packet("");
Jon Doron2704efa2019-05-29 09:41:45 +03002153 return;
2154 }
2155
2156 gdb_has_xml = true;
2157 p = gdb_ctx->params[0].data;
Alex Bennéea346af32020-03-16 17:21:34 +00002158 xml = get_feature_xml(p, &p, process);
Jon Doron2704efa2019-05-29 09:41:45 +03002159 if (!xml) {
Alex Bennéea346af32020-03-16 17:21:34 +00002160 put_packet("E00");
Jon Doron2704efa2019-05-29 09:41:45 +03002161 return;
2162 }
2163
2164 addr = gdb_ctx->params[1].val_ul;
2165 len = gdb_ctx->params[2].val_ul;
2166 total_len = strlen(xml);
2167 if (addr > total_len) {
Alex Bennéea346af32020-03-16 17:21:34 +00002168 put_packet("E00");
Jon Doron2704efa2019-05-29 09:41:45 +03002169 return;
2170 }
2171
2172 if (len > (MAX_PACKET_LENGTH - 5) / 2) {
2173 len = (MAX_PACKET_LENGTH - 5) / 2;
2174 }
2175
2176 if (len < total_len - addr) {
Alex Bennée308f9e82020-03-16 17:21:35 +00002177 g_string_assign(gdbserver_state.str_buf, "m");
2178 memtox(gdbserver_state.str_buf, xml + addr, len);
Jon Doron2704efa2019-05-29 09:41:45 +03002179 } else {
Alex Bennée308f9e82020-03-16 17:21:35 +00002180 g_string_assign(gdbserver_state.str_buf, "l");
2181 memtox(gdbserver_state.str_buf, xml + addr, total_len - addr);
Jon Doron2704efa2019-05-29 09:41:45 +03002182 }
2183
Alex Bennée308f9e82020-03-16 17:21:35 +00002184 put_packet_binary(gdbserver_state.str_buf->str,
2185 gdbserver_state.str_buf->len, true);
Jon Doron2704efa2019-05-29 09:41:45 +03002186}
2187
2188static void handle_query_attached(GdbCmdContext *gdb_ctx, void *user_ctx)
2189{
Alex Bennéea346af32020-03-16 17:21:34 +00002190 put_packet(GDB_ATTACHED);
Jon Doron2704efa2019-05-29 09:41:45 +03002191}
2192
2193static void handle_query_qemu_supported(GdbCmdContext *gdb_ctx, void *user_ctx)
2194{
Alex Bennée308f9e82020-03-16 17:21:35 +00002195 g_string_printf(gdbserver_state.str_buf, "sstepbits;sstep");
Jon Doronab4752e2019-05-29 09:41:48 +03002196#ifndef CONFIG_USER_ONLY
Alex Bennée308f9e82020-03-16 17:21:35 +00002197 g_string_append(gdbserver_state.str_buf, ";PhyMemMode");
Jon Doronab4752e2019-05-29 09:41:48 +03002198#endif
Alex Bennée308f9e82020-03-16 17:21:35 +00002199 put_strbuf();
Jon Doron2704efa2019-05-29 09:41:45 +03002200}
2201
Jon Doronab4752e2019-05-29 09:41:48 +03002202#ifndef CONFIG_USER_ONLY
2203static void handle_query_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx,
2204 void *user_ctx)
2205{
Alex Bennée308f9e82020-03-16 17:21:35 +00002206 g_string_printf(gdbserver_state.str_buf, "%d", phy_memory_mode);
2207 put_strbuf();
Jon Doronab4752e2019-05-29 09:41:48 +03002208}
2209
2210static void handle_set_qemu_phy_mem_mode(GdbCmdContext *gdb_ctx, void *user_ctx)
2211{
2212 if (!gdb_ctx->num_params) {
Alex Bennéea346af32020-03-16 17:21:34 +00002213 put_packet("E22");
Jon Doronab4752e2019-05-29 09:41:48 +03002214 return;
2215 }
2216
2217 if (!gdb_ctx->params[0].val_ul) {
2218 phy_memory_mode = 0;
2219 } else {
2220 phy_memory_mode = 1;
2221 }
Alex Bennéea346af32020-03-16 17:21:34 +00002222 put_packet("OK");
Jon Doronab4752e2019-05-29 09:41:48 +03002223}
2224#endif
2225
Jon Doron2704efa2019-05-29 09:41:45 +03002226static GdbCmdParseEntry gdb_gen_query_set_common_table[] = {
2227 /* Order is important if has same prefix */
2228 {
2229 .handler = handle_query_qemu_sstepbits,
2230 .cmd = "qemu.sstepbits",
2231 },
2232 {
2233 .handler = handle_query_qemu_sstep,
2234 .cmd = "qemu.sstep",
2235 },
2236 {
2237 .handler = handle_set_qemu_sstep,
2238 .cmd = "qemu.sstep=",
2239 .cmd_startswith = 1,
2240 .schema = "l0"
2241 },
2242};
2243
2244static GdbCmdParseEntry gdb_gen_query_table[] = {
2245 {
2246 .handler = handle_query_curr_tid,
2247 .cmd = "C",
2248 },
2249 {
2250 .handler = handle_query_threads,
2251 .cmd = "sThreadInfo",
2252 },
2253 {
2254 .handler = handle_query_first_threads,
2255 .cmd = "fThreadInfo",
2256 },
2257 {
2258 .handler = handle_query_thread_extra,
2259 .cmd = "ThreadExtraInfo,",
2260 .cmd_startswith = 1,
2261 .schema = "t0"
2262 },
2263#ifdef CONFIG_USER_ONLY
2264 {
2265 .handler = handle_query_offsets,
2266 .cmd = "Offsets",
2267 },
2268#else
2269 {
2270 .handler = handle_query_rcmd,
2271 .cmd = "Rcmd,",
2272 .cmd_startswith = 1,
2273 .schema = "s0"
2274 },
2275#endif
2276 {
2277 .handler = handle_query_supported,
2278 .cmd = "Supported:",
2279 .cmd_startswith = 1,
2280 .schema = "s0"
2281 },
2282 {
2283 .handler = handle_query_supported,
2284 .cmd = "Supported",
2285 .schema = "s0"
2286 },
2287 {
2288 .handler = handle_query_xfer_features,
2289 .cmd = "Xfer:features:read:",
2290 .cmd_startswith = 1,
2291 .schema = "s:l,l0"
2292 },
2293 {
2294 .handler = handle_query_attached,
2295 .cmd = "Attached:",
2296 .cmd_startswith = 1
2297 },
2298 {
2299 .handler = handle_query_attached,
2300 .cmd = "Attached",
2301 },
2302 {
2303 .handler = handle_query_qemu_supported,
2304 .cmd = "qemu.Supported",
2305 },
Jon Doronab4752e2019-05-29 09:41:48 +03002306#ifndef CONFIG_USER_ONLY
2307 {
2308 .handler = handle_query_qemu_phy_mem_mode,
2309 .cmd = "qemu.PhyMemMode",
2310 },
2311#endif
Jon Doron2704efa2019-05-29 09:41:45 +03002312};
2313
2314static GdbCmdParseEntry gdb_gen_set_table[] = {
2315 /* Order is important if has same prefix */
2316 {
2317 .handler = handle_set_qemu_sstep,
2318 .cmd = "qemu.sstep:",
2319 .cmd_startswith = 1,
2320 .schema = "l0"
2321 },
Jon Doronab4752e2019-05-29 09:41:48 +03002322#ifndef CONFIG_USER_ONLY
2323 {
2324 .handler = handle_set_qemu_phy_mem_mode,
2325 .cmd = "qemu.PhyMemMode:",
2326 .cmd_startswith = 1,
2327 .schema = "l0"
2328 },
2329#endif
Jon Doron2704efa2019-05-29 09:41:45 +03002330};
2331
2332static void handle_gen_query(GdbCmdContext *gdb_ctx, void *user_ctx)
2333{
2334 if (!gdb_ctx->num_params) {
2335 return;
2336 }
2337
Alex Bennéea346af32020-03-16 17:21:34 +00002338 if (!process_string_cmd(NULL, gdb_ctx->params[0].data,
Jon Doron2704efa2019-05-29 09:41:45 +03002339 gdb_gen_query_set_common_table,
2340 ARRAY_SIZE(gdb_gen_query_set_common_table))) {
2341 return;
2342 }
2343
Alex Bennéea346af32020-03-16 17:21:34 +00002344 if (process_string_cmd(NULL, gdb_ctx->params[0].data,
Jon Doron2704efa2019-05-29 09:41:45 +03002345 gdb_gen_query_table,
2346 ARRAY_SIZE(gdb_gen_query_table))) {
Alex Bennéea346af32020-03-16 17:21:34 +00002347 put_packet("");
Jon Doron2704efa2019-05-29 09:41:45 +03002348 }
2349}
2350
2351static void handle_gen_set(GdbCmdContext *gdb_ctx, void *user_ctx)
2352{
2353 if (!gdb_ctx->num_params) {
2354 return;
2355 }
2356
Alex Bennéea346af32020-03-16 17:21:34 +00002357 if (!process_string_cmd(NULL, gdb_ctx->params[0].data,
Jon Doron2704efa2019-05-29 09:41:45 +03002358 gdb_gen_query_set_common_table,
2359 ARRAY_SIZE(gdb_gen_query_set_common_table))) {
2360 return;
2361 }
2362
Alex Bennéea346af32020-03-16 17:21:34 +00002363 if (process_string_cmd(NULL, gdb_ctx->params[0].data,
Jon Doron2704efa2019-05-29 09:41:45 +03002364 gdb_gen_set_table,
2365 ARRAY_SIZE(gdb_gen_set_table))) {
Alex Bennéea346af32020-03-16 17:21:34 +00002366 put_packet("");
Jon Doron2704efa2019-05-29 09:41:45 +03002367 }
2368}
2369
Jon Doron7009d572019-05-29 09:41:46 +03002370static void handle_target_halt(GdbCmdContext *gdb_ctx, void *user_ctx)
2371{
Alex Bennée308f9e82020-03-16 17:21:35 +00002372 g_string_printf(gdbserver_state.str_buf, "T%02xthread:", GDB_SIGNAL_TRAP);
2373 gdb_append_thread_id(gdbserver_state.c_cpu, gdbserver_state.str_buf);
2374 g_string_append_c(gdbserver_state.str_buf, ';');
2375 put_strbuf();
Jon Doron7009d572019-05-29 09:41:46 +03002376 /*
2377 * Remove all the breakpoints when this query is issued,
2378 * because gdb is doing an initial connect and the state
2379 * should be cleaned up.
2380 */
2381 gdb_breakpoint_remove_all();
2382}
2383
Alex Bennéea346af32020-03-16 17:21:34 +00002384static int gdb_handle_packet(const char *line_buf)
Jon Doron2704efa2019-05-29 09:41:45 +03002385{
Jon Doron3e2c1262019-05-29 09:41:30 +03002386 const GdbCmdParseEntry *cmd_parser = NULL;
ths3b46e622007-09-17 08:09:54 +00002387
Doug Gale5c9522b2017-12-02 20:30:37 -05002388 trace_gdbstub_io_command(line_buf);
Alex Bennée118e2262017-07-12 11:52:13 +01002389
Jon Doron3f1cbac2019-05-29 09:41:47 +03002390 switch (line_buf[0]) {
Luc Michel53fd6552019-01-07 15:23:46 +00002391 case '!':
Alex Bennéea346af32020-03-16 17:21:34 +00002392 put_packet("OK");
Luc Michel53fd6552019-01-07 15:23:46 +00002393 break;
bellard858693c2004-03-31 18:52:07 +00002394 case '?':
Jon Doron7009d572019-05-29 09:41:46 +03002395 {
2396 static const GdbCmdParseEntry target_halted_cmd_desc = {
2397 .handler = handle_target_halt,
2398 .cmd = "?",
2399 .cmd_startswith = 1
2400 };
2401 cmd_parser = &target_halted_cmd_desc;
2402 }
bellard858693c2004-03-31 18:52:07 +00002403 break;
2404 case 'c':
Jon Doron4d6e3fe2019-05-29 09:41:32 +03002405 {
2406 static const GdbCmdParseEntry continue_cmd_desc = {
2407 .handler = handle_continue,
2408 .cmd = "c",
2409 .cmd_startswith = 1,
2410 .schema = "L0"
2411 };
2412 cmd_parser = &continue_cmd_desc;
bellard858693c2004-03-31 18:52:07 +00002413 }
Jon Doron4d6e3fe2019-05-29 09:41:32 +03002414 break;
edgar_igl1f487ee2008-05-17 22:20:53 +00002415 case 'C':
Jon Doronccc47d52019-05-29 09:41:33 +03002416 {
2417 static const GdbCmdParseEntry cont_with_sig_cmd_desc = {
2418 .handler = handle_cont_with_sig,
2419 .cmd = "C",
2420 .cmd_startswith = 1,
2421 .schema = "l0"
2422 };
2423 cmd_parser = &cont_with_sig_cmd_desc;
2424 }
2425 break;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002426 case 'v':
Jon Doron8536ec02019-05-29 09:41:44 +03002427 {
2428 static const GdbCmdParseEntry v_cmd_desc = {
2429 .handler = handle_v_commands,
2430 .cmd = "v",
2431 .cmd_startswith = 1,
2432 .schema = "s0"
2433 };
2434 cmd_parser = &v_cmd_desc;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002435 }
Jon Doron8536ec02019-05-29 09:41:44 +03002436 break;
edgar_igl7d03f822008-05-17 18:58:29 +00002437 case 'k':
2438 /* Kill the target */
Ziyue Yang7ae6c572017-01-18 16:03:29 +08002439 error_report("QEMU: Terminated via GDBstub");
edgar_igl7d03f822008-05-17 18:58:29 +00002440 exit(0);
2441 case 'D':
Jon Doron3e2c1262019-05-29 09:41:30 +03002442 {
2443 static const GdbCmdParseEntry detach_cmd_desc = {
2444 .handler = handle_detach,
2445 .cmd = "D",
2446 .cmd_startswith = 1,
2447 .schema = "?.l0"
2448 };
2449 cmd_parser = &detach_cmd_desc;
Luc Michel546f3c62019-01-07 15:23:46 +00002450 }
edgar_igl7d03f822008-05-17 18:58:29 +00002451 break;
bellard858693c2004-03-31 18:52:07 +00002452 case 's':
Jon Doron933f80d2019-05-29 09:41:43 +03002453 {
2454 static const GdbCmdParseEntry step_cmd_desc = {
2455 .handler = handle_step,
2456 .cmd = "s",
2457 .cmd_startswith = 1,
2458 .schema = "L0"
2459 };
2460 cmd_parser = &step_cmd_desc;
bellard858693c2004-03-31 18:52:07 +00002461 }
Jon Doron933f80d2019-05-29 09:41:43 +03002462 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002463 case 'F':
2464 {
Jon Doron4b20fab2019-05-29 09:41:42 +03002465 static const GdbCmdParseEntry file_io_cmd_desc = {
2466 .handler = handle_file_io,
2467 .cmd = "F",
2468 .cmd_startswith = 1,
2469 .schema = "L,L,o0"
2470 };
2471 cmd_parser = &file_io_cmd_desc;
pbrooka2d1eba2007-01-28 03:10:55 +00002472 }
2473 break;
bellard858693c2004-03-31 18:52:07 +00002474 case 'g':
Jon Doron397d1372019-05-29 09:41:41 +03002475 {
2476 static const GdbCmdParseEntry read_all_regs_cmd_desc = {
2477 .handler = handle_read_all_regs,
2478 .cmd = "g",
2479 .cmd_startswith = 1
2480 };
2481 cmd_parser = &read_all_regs_cmd_desc;
pbrook56aebc82008-10-11 17:55:29 +00002482 }
bellard858693c2004-03-31 18:52:07 +00002483 break;
2484 case 'G':
Jon Doron287ca122019-05-29 09:41:40 +03002485 {
2486 static const GdbCmdParseEntry write_all_regs_cmd_desc = {
2487 .handler = handle_write_all_regs,
2488 .cmd = "G",
2489 .cmd_startswith = 1,
2490 .schema = "s0"
2491 };
2492 cmd_parser = &write_all_regs_cmd_desc;
pbrook56aebc82008-10-11 17:55:29 +00002493 }
bellard858693c2004-03-31 18:52:07 +00002494 break;
2495 case 'm':
Jon Doronda92e232019-05-29 09:41:39 +03002496 {
2497 static const GdbCmdParseEntry read_mem_cmd_desc = {
2498 .handler = handle_read_mem,
2499 .cmd = "m",
2500 .cmd_startswith = 1,
2501 .schema = "L,L0"
2502 };
2503 cmd_parser = &read_mem_cmd_desc;
bellard6f970bd2005-12-05 19:55:19 +00002504 }
bellard858693c2004-03-31 18:52:07 +00002505 break;
2506 case 'M':
Jon Doroncc0ecc72019-05-29 09:41:38 +03002507 {
2508 static const GdbCmdParseEntry write_mem_cmd_desc = {
2509 .handler = handle_write_mem,
2510 .cmd = "M",
2511 .cmd_startswith = 1,
2512 .schema = "L,L:s0"
2513 };
2514 cmd_parser = &write_mem_cmd_desc;
Fabien Chouteau44520db2011-09-08 12:48:16 +02002515 }
bellard858693c2004-03-31 18:52:07 +00002516 break;
pbrook56aebc82008-10-11 17:55:29 +00002517 case 'p':
Jon Doron5d0e57b2019-05-29 09:41:37 +03002518 {
2519 static const GdbCmdParseEntry get_reg_cmd_desc = {
2520 .handler = handle_get_reg,
2521 .cmd = "p",
2522 .cmd_startswith = 1,
2523 .schema = "L0"
2524 };
2525 cmd_parser = &get_reg_cmd_desc;
pbrook56aebc82008-10-11 17:55:29 +00002526 }
2527 break;
2528 case 'P':
Jon Doron62b33202019-05-29 09:41:36 +03002529 {
2530 static const GdbCmdParseEntry set_reg_cmd_desc = {
2531 .handler = handle_set_reg,
2532 .cmd = "P",
2533 .cmd_startswith = 1,
2534 .schema = "L?s0"
2535 };
2536 cmd_parser = &set_reg_cmd_desc;
2537 }
pbrook56aebc82008-10-11 17:55:29 +00002538 break;
bellard858693c2004-03-31 18:52:07 +00002539 case 'Z':
Jon Doron77f6ce52019-05-29 09:41:35 +03002540 {
2541 static const GdbCmdParseEntry insert_bp_cmd_desc = {
2542 .handler = handle_insert_bp,
2543 .cmd = "Z",
2544 .cmd_startswith = 1,
2545 .schema = "l?L?L0"
2546 };
2547 cmd_parser = &insert_bp_cmd_desc;
2548 }
2549 break;
bellard858693c2004-03-31 18:52:07 +00002550 case 'z':
Jon Doron77f6ce52019-05-29 09:41:35 +03002551 {
2552 static const GdbCmdParseEntry remove_bp_cmd_desc = {
2553 .handler = handle_remove_bp,
2554 .cmd = "z",
2555 .cmd_startswith = 1,
2556 .schema = "l?L?L0"
2557 };
2558 cmd_parser = &remove_bp_cmd_desc;
2559 }
bellard858693c2004-03-31 18:52:07 +00002560 break;
aliguori880a7572008-11-18 20:30:24 +00002561 case 'H':
Jon Doron3a9651d2019-05-29 09:41:34 +03002562 {
2563 static const GdbCmdParseEntry set_thread_cmd_desc = {
2564 .handler = handle_set_thread,
2565 .cmd = "H",
2566 .cmd_startswith = 1,
2567 .schema = "o.t0"
2568 };
2569 cmd_parser = &set_thread_cmd_desc;
aliguori880a7572008-11-18 20:30:24 +00002570 }
2571 break;
2572 case 'T':
Jon Doron44ffded2019-05-29 09:41:31 +03002573 {
2574 static const GdbCmdParseEntry thread_alive_cmd_desc = {
2575 .handler = handle_thread_alive,
2576 .cmd = "T",
2577 .cmd_startswith = 1,
2578 .schema = "t0"
2579 };
2580 cmd_parser = &thread_alive_cmd_desc;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002581 }
aliguori880a7572008-11-18 20:30:24 +00002582 break;
pbrook978efd62006-06-17 18:30:42 +00002583 case 'q':
Jon Doron2704efa2019-05-29 09:41:45 +03002584 {
2585 static const GdbCmdParseEntry gen_query_cmd_desc = {
2586 .handler = handle_gen_query,
2587 .cmd = "q",
2588 .cmd_startswith = 1,
2589 .schema = "s0"
2590 };
2591 cmd_parser = &gen_query_cmd_desc;
2592 }
2593 break;
edgar_igl60897d32008-05-09 08:25:14 +00002594 case 'Q':
Jon Doron2704efa2019-05-29 09:41:45 +03002595 {
2596 static const GdbCmdParseEntry gen_set_cmd_desc = {
2597 .handler = handle_gen_set,
2598 .cmd = "Q",
2599 .cmd_startswith = 1,
2600 .schema = "s0"
2601 };
2602 cmd_parser = &gen_set_cmd_desc;
edgar_igl60897d32008-05-09 08:25:14 +00002603 }
Jon Doron2704efa2019-05-29 09:41:45 +03002604 break;
bellard858693c2004-03-31 18:52:07 +00002605 default:
bellard858693c2004-03-31 18:52:07 +00002606 /* put empty packet */
Alex Bennéea346af32020-03-16 17:21:34 +00002607 put_packet("");
bellard858693c2004-03-31 18:52:07 +00002608 break;
2609 }
Jon Doron3e2c1262019-05-29 09:41:30 +03002610
Ramiro Polla2bdec392019-08-05 21:09:01 +02002611 if (cmd_parser) {
Alex Bennéea346af32020-03-16 17:21:34 +00002612 run_cmd_parser(line_buf, cmd_parser);
Ramiro Polla2bdec392019-08-05 21:09:01 +02002613 }
Jon Doron3e2c1262019-05-29 09:41:30 +03002614
bellard858693c2004-03-31 18:52:07 +00002615 return RS_IDLE;
2616}
2617
Andreas Färber64f6b342013-05-27 02:06:09 +02002618void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00002619{
Alex Bennéea346af32020-03-16 17:21:34 +00002620 GDBProcess *p = gdb_get_cpu_process(cpu);
Luc Michel160d8582019-01-07 15:23:46 +00002621
2622 if (!p->attached) {
2623 /*
2624 * Having a stop CPU corresponding to a process that is not attached
2625 * confuses GDB. So we ignore the request.
2626 */
2627 return;
2628 }
2629
Alex Bennée8d98c442020-03-16 17:21:33 +00002630 gdbserver_state.c_cpu = cpu;
2631 gdbserver_state.g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002632}
2633
bellard1fddef42005-04-17 19:16:13 +00002634#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002635static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002636{
Alex Bennéea346af32020-03-16 17:21:34 +00002637 CPUState *cpu = gdbserver_state.c_cpu;
Alex Bennée308f9e82020-03-16 17:21:35 +00002638 g_autoptr(GString) buf = g_string_new(NULL);
2639 g_autoptr(GString) tid = g_string_new(NULL);
aliguorid6fc1b32008-11-18 19:55:44 +00002640 const char *type;
bellard858693c2004-03-31 18:52:07 +00002641 int ret;
2642
Alex Bennéea346af32020-03-16 17:21:34 +00002643 if (running || gdbserver_state.state == RS_INACTIVE) {
Meador Ingecdb432b2012-03-15 17:49:45 +00002644 return;
2645 }
2646 /* Is there a GDB syscall waiting to be sent? */
Alex Bennéea346af32020-03-16 17:21:34 +00002647 if (gdbserver_state.current_syscall_cb) {
2648 put_packet(gdbserver_state.syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002649 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002650 }
Luc Michel95567c22019-01-07 15:23:46 +00002651
2652 if (cpu == NULL) {
2653 /* No process attached */
2654 return;
2655 }
2656
Alex Bennée308f9e82020-03-16 17:21:35 +00002657 gdb_append_thread_id(cpu, tid);
Luc Michel95567c22019-01-07 15:23:46 +00002658
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002659 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002660 case RUN_STATE_DEBUG:
Andreas Färberff4700b2013-08-26 18:23:18 +02002661 if (cpu->watchpoint_hit) {
2662 switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002663 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002664 type = "r";
2665 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002666 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002667 type = "a";
2668 break;
2669 default:
2670 type = "";
2671 break;
2672 }
Doug Gale5c9522b2017-12-02 20:30:37 -05002673 trace_gdbstub_hit_watchpoint(type, cpu_gdb_index(cpu),
2674 (target_ulong)cpu->watchpoint_hit->vaddr);
Alex Bennée308f9e82020-03-16 17:21:35 +00002675 g_string_printf(buf, "T%02xthread:%s;%swatch:" TARGET_FMT_lx ";",
2676 GDB_SIGNAL_TRAP, tid->str, type,
2677 (target_ulong)cpu->watchpoint_hit->vaddr);
Andreas Färberff4700b2013-08-26 18:23:18 +02002678 cpu->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002679 goto send_packet;
Doug Gale5c9522b2017-12-02 20:30:37 -05002680 } else {
2681 trace_gdbstub_hit_break();
pbrook6658ffb2007-03-16 23:58:11 +00002682 }
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07002683 tb_flush(cpu);
aurel32ca587a82008-12-18 22:44:13 +00002684 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002685 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002686 case RUN_STATE_PAUSED:
Doug Gale5c9522b2017-12-02 20:30:37 -05002687 trace_gdbstub_hit_paused();
aliguori9781e042009-01-22 17:15:29 +00002688 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002689 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002690 case RUN_STATE_SHUTDOWN:
Doug Gale5c9522b2017-12-02 20:30:37 -05002691 trace_gdbstub_hit_shutdown();
Jan Kiszka425189a2011-03-22 11:02:09 +01002692 ret = GDB_SIGNAL_QUIT;
2693 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002694 case RUN_STATE_IO_ERROR:
Doug Gale5c9522b2017-12-02 20:30:37 -05002695 trace_gdbstub_hit_io_error();
Jan Kiszka425189a2011-03-22 11:02:09 +01002696 ret = GDB_SIGNAL_IO;
2697 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002698 case RUN_STATE_WATCHDOG:
Doug Gale5c9522b2017-12-02 20:30:37 -05002699 trace_gdbstub_hit_watchdog();
Jan Kiszka425189a2011-03-22 11:02:09 +01002700 ret = GDB_SIGNAL_ALRM;
2701 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002702 case RUN_STATE_INTERNAL_ERROR:
Doug Gale5c9522b2017-12-02 20:30:37 -05002703 trace_gdbstub_hit_internal_error();
Jan Kiszka425189a2011-03-22 11:02:09 +01002704 ret = GDB_SIGNAL_ABRT;
2705 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002706 case RUN_STATE_SAVE_VM:
2707 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002708 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002709 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002710 ret = GDB_SIGNAL_XCPU;
2711 break;
2712 default:
Doug Gale5c9522b2017-12-02 20:30:37 -05002713 trace_gdbstub_hit_unknown(state);
Jan Kiszka425189a2011-03-22 11:02:09 +01002714 ret = GDB_SIGNAL_UNKNOWN;
2715 break;
bellardbbeb7b52006-04-23 18:42:15 +00002716 }
Jan Kiszka226d0072015-07-24 18:52:31 +02002717 gdb_set_stop_cpu(cpu);
Alex Bennée308f9e82020-03-16 17:21:35 +00002718 g_string_printf(buf, "T%02xthread:%s;", ret, tid->str);
Jan Kiszka425189a2011-03-22 11:02:09 +01002719
2720send_packet:
Alex Bennée308f9e82020-03-16 17:21:35 +00002721 put_packet(buf->str);
Jan Kiszka425189a2011-03-22 11:02:09 +01002722
2723 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002724 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002725}
bellard1fddef42005-04-17 19:16:13 +00002726#endif
bellard858693c2004-03-31 18:52:07 +00002727
pbrooka2d1eba2007-01-28 03:10:55 +00002728/* Send a gdb syscall request.
2729 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002730 %x - target_ulong argument printed in hex.
2731 %lx - 64-bit argument printed in hex.
2732 %s - string pointer (target_ulong) and length (int) pair. */
Peter Maydell19239b32015-09-07 10:39:27 +01002733void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
pbrooka2d1eba2007-01-28 03:10:55 +00002734{
pbrooka2d1eba2007-01-28 03:10:55 +00002735 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002736 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002737 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002738 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002739
Alex Bennéea346af32020-03-16 17:21:34 +00002740 if (!gdbserver_state.init) {
pbrooka2d1eba2007-01-28 03:10:55 +00002741 return;
Alex Bennéea346af32020-03-16 17:21:34 +00002742 }
Alex Bennée8d98c442020-03-16 17:21:33 +00002743
2744 gdbserver_state.current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002745#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002746 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002747#endif
Alex Bennée8d98c442020-03-16 17:21:33 +00002748 p = &gdbserver_state.syscall_buf[0];
2749 p_end = &gdbserver_state.syscall_buf[sizeof(gdbserver_state.syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002750 *(p++) = 'F';
2751 while (*fmt) {
2752 if (*fmt == '%') {
2753 fmt++;
2754 switch (*fmt++) {
2755 case 'x':
2756 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002757 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002758 break;
pbrooka87295e2007-05-26 15:09:38 +00002759 case 'l':
2760 if (*(fmt++) != 'x')
2761 goto bad_format;
2762 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002763 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002764 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002765 case 's':
2766 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002767 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002768 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002769 break;
2770 default:
pbrooka87295e2007-05-26 15:09:38 +00002771 bad_format:
Ziyue Yang7ae6c572017-01-18 16:03:29 +08002772 error_report("gdbstub: Bad syscall format string '%s'",
2773 fmt - 1);
pbrooka2d1eba2007-01-28 03:10:55 +00002774 break;
2775 }
2776 } else {
2777 *(p++) = *(fmt++);
2778 }
2779 }
pbrook8a93e022007-08-06 13:19:15 +00002780 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002781#ifdef CONFIG_USER_ONLY
Alex Bennéea346af32020-03-16 17:21:34 +00002782 put_packet(gdbserver_state.syscall_buf);
Peter Maydell4f710862018-05-15 19:19:58 +01002783 /* Return control to gdb for it to process the syscall request.
2784 * Since the protocol requires that gdb hands control back to us
2785 * using a "here are the results" F packet, we don't need to check
2786 * gdb_handlesig's return value (which is the signal to deliver if
2787 * execution was resumed via a continue packet).
2788 */
Alex Bennée8d98c442020-03-16 17:21:33 +00002789 gdb_handlesig(gdbserver_state.c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002790#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002791 /* In this case wait to send the syscall packet until notification that
2792 the CPU has stopped. This must be done because if the packet is sent
2793 now the reply from the syscall request could be received while the CPU
2794 is still in the running state, which can cause packets to be dropped
2795 and state transition 'T' packets to be sent while the syscall is still
2796 being processed. */
Alex Bennée8d98c442020-03-16 17:21:33 +00002797 qemu_cpu_kick(gdbserver_state.c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002798#endif
2799}
2800
Peter Maydell19239b32015-09-07 10:39:27 +01002801void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
2802{
2803 va_list va;
2804
2805 va_start(va, fmt);
2806 gdb_do_syscallv(cb, fmt, va);
2807 va_end(va);
2808}
2809
Alex Bennéea346af32020-03-16 17:21:34 +00002810static void gdb_read_byte(uint8_t ch)
bellard858693c2004-03-31 18:52:07 +00002811{
ths60fe76f2007-12-16 03:02:09 +00002812 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002813
bellard1fddef42005-04-17 19:16:13 +00002814#ifndef CONFIG_USER_ONLY
Damien Hedded116e812020-03-16 17:21:53 +00002815 if (gdbserver_state.last_packet->len) {
pbrook4046d912007-01-28 01:53:16 +00002816 /* Waiting for a response to the last packet. If we see the start
2817 of a new command then abandon the previous response. */
2818 if (ch == '-') {
Doug Gale5c9522b2017-12-02 20:30:37 -05002819 trace_gdbstub_err_got_nack();
Damien Hedded116e812020-03-16 17:21:53 +00002820 put_buffer(gdbserver_state.last_packet->data,
2821 gdbserver_state.last_packet->len);
Alex Bennée118e2262017-07-12 11:52:13 +01002822 } else if (ch == '+') {
Doug Gale5c9522b2017-12-02 20:30:37 -05002823 trace_gdbstub_io_got_ack();
Alex Bennée118e2262017-07-12 11:52:13 +01002824 } else {
Markus Armbruster33c846e2019-05-14 20:03:09 +02002825 trace_gdbstub_io_got_unexpected(ch);
pbrook4046d912007-01-28 01:53:16 +00002826 }
Alex Bennée118e2262017-07-12 11:52:13 +01002827
Damien Hedded116e812020-03-16 17:21:53 +00002828 if (ch == '+' || ch == '$') {
2829 g_byte_array_set_size(gdbserver_state.last_packet, 0);
2830 }
pbrook4046d912007-01-28 01:53:16 +00002831 if (ch != '$')
2832 return;
2833 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002834 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002835 /* when the CPU is running, we cannot do anything except stop
2836 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002837 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002838 } else
bellard1fddef42005-04-17 19:16:13 +00002839#endif
bellard41625032005-04-24 10:07:11 +00002840 {
Alex Bennéea346af32020-03-16 17:21:34 +00002841 switch(gdbserver_state.state) {
bellard858693c2004-03-31 18:52:07 +00002842 case RS_IDLE:
2843 if (ch == '$') {
Doug Gale4bf43122017-05-01 12:22:10 -04002844 /* start of command packet */
Alex Bennéea346af32020-03-16 17:21:34 +00002845 gdbserver_state.line_buf_index = 0;
2846 gdbserver_state.line_sum = 0;
2847 gdbserver_state.state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04002848 } else {
Markus Armbruster33c846e2019-05-14 20:03:09 +02002849 trace_gdbstub_err_garbage(ch);
bellard4c3a88a2003-07-26 12:06:08 +00002850 }
2851 break;
bellard858693c2004-03-31 18:52:07 +00002852 case RS_GETLINE:
Doug Gale4bf43122017-05-01 12:22:10 -04002853 if (ch == '}') {
2854 /* start escape sequence */
Alex Bennéea346af32020-03-16 17:21:34 +00002855 gdbserver_state.state = RS_GETLINE_ESC;
2856 gdbserver_state.line_sum += ch;
Doug Gale4bf43122017-05-01 12:22:10 -04002857 } else if (ch == '*') {
2858 /* start run length encoding sequence */
Alex Bennéea346af32020-03-16 17:21:34 +00002859 gdbserver_state.state = RS_GETLINE_RLE;
2860 gdbserver_state.line_sum += ch;
Doug Gale4bf43122017-05-01 12:22:10 -04002861 } else if (ch == '#') {
2862 /* end of command, start of checksum*/
Alex Bennéea346af32020-03-16 17:21:34 +00002863 gdbserver_state.state = RS_CHKSUM1;
2864 } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) {
Doug Gale5c9522b2017-12-02 20:30:37 -05002865 trace_gdbstub_err_overrun();
Alex Bennéea346af32020-03-16 17:21:34 +00002866 gdbserver_state.state = RS_IDLE;
bellard858693c2004-03-31 18:52:07 +00002867 } else {
Doug Gale4bf43122017-05-01 12:22:10 -04002868 /* unescaped command character */
Alex Bennéea346af32020-03-16 17:21:34 +00002869 gdbserver_state.line_buf[gdbserver_state.line_buf_index++] = ch;
2870 gdbserver_state.line_sum += ch;
Doug Gale4bf43122017-05-01 12:22:10 -04002871 }
2872 break;
2873 case RS_GETLINE_ESC:
2874 if (ch == '#') {
2875 /* unexpected end of command in escape sequence */
Alex Bennéea346af32020-03-16 17:21:34 +00002876 gdbserver_state.state = RS_CHKSUM1;
2877 } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) {
Doug Gale4bf43122017-05-01 12:22:10 -04002878 /* command buffer overrun */
Doug Gale5c9522b2017-12-02 20:30:37 -05002879 trace_gdbstub_err_overrun();
Alex Bennéea346af32020-03-16 17:21:34 +00002880 gdbserver_state.state = RS_IDLE;
Doug Gale4bf43122017-05-01 12:22:10 -04002881 } else {
2882 /* parse escaped character and leave escape state */
Alex Bennéea346af32020-03-16 17:21:34 +00002883 gdbserver_state.line_buf[gdbserver_state.line_buf_index++] = ch ^ 0x20;
2884 gdbserver_state.line_sum += ch;
2885 gdbserver_state.state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04002886 }
2887 break;
2888 case RS_GETLINE_RLE:
Markus Armbruster046aba12019-05-14 20:03:08 +02002889 /*
2890 * Run-length encoding is explained in "Debugging with GDB /
2891 * Appendix E GDB Remote Serial Protocol / Overview".
2892 */
2893 if (ch < ' ' || ch == '#' || ch == '$' || ch > 126) {
Doug Gale4bf43122017-05-01 12:22:10 -04002894 /* invalid RLE count encoding */
Markus Armbruster33c846e2019-05-14 20:03:09 +02002895 trace_gdbstub_err_invalid_repeat(ch);
Alex Bennéea346af32020-03-16 17:21:34 +00002896 gdbserver_state.state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04002897 } else {
2898 /* decode repeat length */
Markus Armbruster33c846e2019-05-14 20:03:09 +02002899 int repeat = ch - ' ' + 3;
Alex Bennéea346af32020-03-16 17:21:34 +00002900 if (gdbserver_state.line_buf_index + repeat >= sizeof(gdbserver_state.line_buf) - 1) {
Doug Gale4bf43122017-05-01 12:22:10 -04002901 /* that many repeats would overrun the command buffer */
Doug Gale5c9522b2017-12-02 20:30:37 -05002902 trace_gdbstub_err_overrun();
Alex Bennéea346af32020-03-16 17:21:34 +00002903 gdbserver_state.state = RS_IDLE;
2904 } else if (gdbserver_state.line_buf_index < 1) {
Doug Gale4bf43122017-05-01 12:22:10 -04002905 /* got a repeat but we have nothing to repeat */
Doug Gale5c9522b2017-12-02 20:30:37 -05002906 trace_gdbstub_err_invalid_rle();
Alex Bennéea346af32020-03-16 17:21:34 +00002907 gdbserver_state.state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04002908 } else {
2909 /* repeat the last character */
Alex Bennéea346af32020-03-16 17:21:34 +00002910 memset(gdbserver_state.line_buf + gdbserver_state.line_buf_index,
2911 gdbserver_state.line_buf[gdbserver_state.line_buf_index - 1], repeat);
2912 gdbserver_state.line_buf_index += repeat;
2913 gdbserver_state.line_sum += ch;
2914 gdbserver_state.state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04002915 }
bellard858693c2004-03-31 18:52:07 +00002916 }
2917 break;
2918 case RS_CHKSUM1:
Doug Gale4bf43122017-05-01 12:22:10 -04002919 /* get high hex digit of checksum */
2920 if (!isxdigit(ch)) {
Markus Armbruster33c846e2019-05-14 20:03:09 +02002921 trace_gdbstub_err_checksum_invalid(ch);
Alex Bennéea346af32020-03-16 17:21:34 +00002922 gdbserver_state.state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04002923 break;
2924 }
Alex Bennéea346af32020-03-16 17:21:34 +00002925 gdbserver_state.line_buf[gdbserver_state.line_buf_index] = '\0';
2926 gdbserver_state.line_csum = fromhex(ch) << 4;
2927 gdbserver_state.state = RS_CHKSUM2;
bellard858693c2004-03-31 18:52:07 +00002928 break;
2929 case RS_CHKSUM2:
Doug Gale4bf43122017-05-01 12:22:10 -04002930 /* get low hex digit of checksum */
2931 if (!isxdigit(ch)) {
Markus Armbruster33c846e2019-05-14 20:03:09 +02002932 trace_gdbstub_err_checksum_invalid(ch);
Alex Bennéea346af32020-03-16 17:21:34 +00002933 gdbserver_state.state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04002934 break;
bellard858693c2004-03-31 18:52:07 +00002935 }
Alex Bennéea346af32020-03-16 17:21:34 +00002936 gdbserver_state.line_csum |= fromhex(ch);
Doug Gale4bf43122017-05-01 12:22:10 -04002937
Alex Bennéea346af32020-03-16 17:21:34 +00002938 if (gdbserver_state.line_csum != (gdbserver_state.line_sum & 0xff)) {
2939 trace_gdbstub_err_checksum_incorrect(gdbserver_state.line_sum, gdbserver_state.line_csum);
Doug Gale4bf43122017-05-01 12:22:10 -04002940 /* send NAK reply */
ths60fe76f2007-12-16 03:02:09 +00002941 reply = '-';
Alex Bennéea346af32020-03-16 17:21:34 +00002942 put_buffer(&reply, 1);
2943 gdbserver_state.state = RS_IDLE;
bellard858693c2004-03-31 18:52:07 +00002944 } else {
Doug Gale4bf43122017-05-01 12:22:10 -04002945 /* send ACK reply */
ths60fe76f2007-12-16 03:02:09 +00002946 reply = '+';
Alex Bennéea346af32020-03-16 17:21:34 +00002947 put_buffer(&reply, 1);
2948 gdbserver_state.state = gdb_handle_packet(gdbserver_state.line_buf);
bellard858693c2004-03-31 18:52:07 +00002949 }
bellardb4608c02003-06-27 17:34:32 +00002950 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002951 default:
2952 abort();
bellardb4608c02003-06-27 17:34:32 +00002953 }
2954 }
bellard858693c2004-03-31 18:52:07 +00002955}
2956
Paul Brook0e1c9c52010-06-16 13:03:51 +01002957/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002958void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002959{
Paul Brook0e1c9c52010-06-16 13:03:51 +01002960 char buf[4];
2961
Alex Bennée8d98c442020-03-16 17:21:33 +00002962 if (!gdbserver_state.init) {
Paul Brook0e1c9c52010-06-16 13:03:51 +01002963 return;
2964 }
2965#ifdef CONFIG_USER_ONLY
Alex Bennéefcedd922020-04-30 20:01:19 +01002966 if (gdbserver_state.socket_path) {
2967 unlink(gdbserver_state.socket_path);
2968 }
Alex Bennéee0a1e202020-04-30 20:01:18 +01002969 if (gdbserver_state.fd < 0) {
Paul Brook0e1c9c52010-06-16 13:03:51 +01002970 return;
2971 }
2972#endif
2973
Doug Gale5c9522b2017-12-02 20:30:37 -05002974 trace_gdbstub_op_exiting((uint8_t)code);
2975
Paul Brook0e1c9c52010-06-16 13:03:51 +01002976 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
Alex Bennéea346af32020-03-16 17:21:34 +00002977 put_packet(buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002978
2979#ifndef CONFIG_USER_ONLY
Alex Bennée8d98c442020-03-16 17:21:33 +00002980 qemu_chr_fe_deinit(&gdbserver_state.chr, true);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002981#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002982}
2983
Luc Michel8f468632019-01-07 15:23:45 +00002984/*
2985 * Create the process that will contain all the "orphan" CPUs (that are not
2986 * part of a CPU cluster). Note that if this process contains no CPUs, it won't
2987 * be attachable and thus will be invisible to the user.
2988 */
2989static void create_default_process(GDBState *s)
2990{
2991 GDBProcess *process;
2992 int max_pid = 0;
2993
Alex Bennéea346af32020-03-16 17:21:34 +00002994 if (gdbserver_state.process_num) {
Luc Michel8f468632019-01-07 15:23:45 +00002995 max_pid = s->processes[s->process_num - 1].pid;
2996 }
2997
2998 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
2999 process = &s->processes[s->process_num - 1];
3000
3001 /* We need an available PID slot for this process */
3002 assert(max_pid < UINT32_MAX);
3003
3004 process->pid = max_pid + 1;
3005 process->attached = false;
Luc Michelc145eea2019-01-07 15:23:46 +00003006 process->target_xml[0] = '\0';
Luc Michel8f468632019-01-07 15:23:45 +00003007}
3008
bellard1fddef42005-04-17 19:16:13 +00003009#ifdef CONFIG_USER_ONLY
3010int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02003011gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00003012{
Andreas Färber5ca666c2013-06-24 19:20:57 +02003013 char buf[256];
3014 int n;
bellard1fddef42005-04-17 19:16:13 +00003015
Alex Bennéee0a1e202020-04-30 20:01:18 +01003016 if (!gdbserver_state.init || gdbserver_state.fd < 0) {
Andreas Färber5ca666c2013-06-24 19:20:57 +02003017 return sig;
bellard1fddef42005-04-17 19:16:13 +00003018 }
3019
Andreas Färber5ca666c2013-06-24 19:20:57 +02003020 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02003021 cpu_single_step(cpu, 0);
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07003022 tb_flush(cpu);
bellard1fddef42005-04-17 19:16:13 +00003023
Andreas Färber5ca666c2013-06-24 19:20:57 +02003024 if (sig != 0) {
3025 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
Alex Bennéea346af32020-03-16 17:21:34 +00003026 put_packet(buf);
Andreas Färber5ca666c2013-06-24 19:20:57 +02003027 }
3028 /* put_packet() might have detected that the peer terminated the
3029 connection. */
Alex Bennée8d98c442020-03-16 17:21:33 +00003030 if (gdbserver_state.fd < 0) {
Andreas Färber5ca666c2013-06-24 19:20:57 +02003031 return sig;
3032 }
3033
3034 sig = 0;
Alex Bennée8d98c442020-03-16 17:21:33 +00003035 gdbserver_state.state = RS_IDLE;
3036 gdbserver_state.running_state = 0;
3037 while (gdbserver_state.running_state == 0) {
3038 n = read(gdbserver_state.fd, buf, 256);
Andreas Färber5ca666c2013-06-24 19:20:57 +02003039 if (n > 0) {
3040 int i;
3041
3042 for (i = 0; i < n; i++) {
Alex Bennéea346af32020-03-16 17:21:34 +00003043 gdb_read_byte(buf[i]);
Andreas Färber5ca666c2013-06-24 19:20:57 +02003044 }
Peter Wu5819e3e2016-06-05 16:35:48 +02003045 } else {
Andreas Färber5ca666c2013-06-24 19:20:57 +02003046 /* XXX: Connection closed. Should probably wait for another
3047 connection before continuing. */
Peter Wu5819e3e2016-06-05 16:35:48 +02003048 if (n == 0) {
Alex Bennée8d98c442020-03-16 17:21:33 +00003049 close(gdbserver_state.fd);
Peter Wu5819e3e2016-06-05 16:35:48 +02003050 }
Alex Bennée8d98c442020-03-16 17:21:33 +00003051 gdbserver_state.fd = -1;
Andreas Färber5ca666c2013-06-24 19:20:57 +02003052 return sig;
bellard1fddef42005-04-17 19:16:13 +00003053 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02003054 }
Alex Bennée8d98c442020-03-16 17:21:33 +00003055 sig = gdbserver_state.signal;
3056 gdbserver_state.signal = 0;
Andreas Färber5ca666c2013-06-24 19:20:57 +02003057 return sig;
bellard1fddef42005-04-17 19:16:13 +00003058}
bellarde9009672005-04-26 20:42:36 +00003059
aurel32ca587a82008-12-18 22:44:13 +00003060/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01003061void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00003062{
Andreas Färber5ca666c2013-06-24 19:20:57 +02003063 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00003064
Alex Bennéee0a1e202020-04-30 20:01:18 +01003065 if (!gdbserver_state.init || gdbserver_state.fd < 0) {
Andreas Färber5ca666c2013-06-24 19:20:57 +02003066 return;
3067 }
aurel32ca587a82008-12-18 22:44:13 +00003068
Andreas Färber5ca666c2013-06-24 19:20:57 +02003069 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
Alex Bennéea346af32020-03-16 17:21:34 +00003070 put_packet(buf);
aurel32ca587a82008-12-18 22:44:13 +00003071}
bellard1fddef42005-04-17 19:16:13 +00003072
Alex Bennéefcedd922020-04-30 20:01:19 +01003073static void gdb_accept_init(int fd)
3074{
3075 init_gdbserver_state();
3076 create_default_process(&gdbserver_state);
3077 gdbserver_state.processes[0].attached = true;
3078 gdbserver_state.c_cpu = gdb_first_attached_cpu();
3079 gdbserver_state.g_cpu = gdbserver_state.c_cpu;
3080 gdbserver_state.fd = fd;
3081 gdb_has_xml = false;
3082}
3083
3084static bool gdb_accept_socket(int gdb_fd)
3085{
3086 int fd;
3087
3088 for(;;) {
3089 fd = accept(gdb_fd, NULL, NULL);
3090 if (fd < 0 && errno != EINTR) {
3091 perror("accept socket");
3092 return false;
3093 } else if (fd >= 0) {
3094 qemu_set_cloexec(fd);
3095 break;
3096 }
3097 }
3098
3099 gdb_accept_init(fd);
3100 return true;
3101}
3102
3103static int gdbserver_open_socket(const char *path)
3104{
3105 struct sockaddr_un sockaddr;
3106 int fd, ret;
3107
3108 fd = socket(AF_UNIX, SOCK_STREAM, 0);
3109 if (fd < 0) {
3110 perror("create socket");
3111 return -1;
3112 }
3113
3114 sockaddr.sun_family = AF_UNIX;
3115 pstrcpy(sockaddr.sun_path, sizeof(sockaddr.sun_path) - 1, path);
3116 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
3117 if (ret < 0) {
3118 perror("bind socket");
3119 close(fd);
3120 return -1;
3121 }
3122 ret = listen(fd, 1);
3123 if (ret < 0) {
3124 perror("listen socket");
3125 close(fd);
3126 return -1;
3127 }
3128
3129 return fd;
3130}
3131
3132static bool gdb_accept_tcp(int gdb_fd)
bellard858693c2004-03-31 18:52:07 +00003133{
bellard858693c2004-03-31 18:52:07 +00003134 struct sockaddr_in sockaddr;
3135 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09003136 int fd;
bellard858693c2004-03-31 18:52:07 +00003137
3138 for(;;) {
3139 len = sizeof(sockaddr);
Alex Bennéee0a1e202020-04-30 20:01:18 +01003140 fd = accept(gdb_fd, (struct sockaddr *)&sockaddr, &len);
bellard858693c2004-03-31 18:52:07 +00003141 if (fd < 0 && errno != EINTR) {
3142 perror("accept");
Peter Maydell2f652222018-05-14 18:30:44 +01003143 return false;
bellard858693c2004-03-31 18:52:07 +00003144 } else if (fd >= 0) {
Peter Maydellf5bdd782018-05-14 18:30:43 +01003145 qemu_set_cloexec(fd);
bellard858693c2004-03-31 18:52:07 +00003146 break;
3147 }
3148 }
3149
3150 /* set short latency */
Peter Maydell2f652222018-05-14 18:30:44 +01003151 if (socket_set_nodelay(fd)) {
3152 perror("setsockopt");
Philippe Mathieu-Daudéead75d82018-05-24 19:34:58 -03003153 close(fd);
Peter Maydell2f652222018-05-14 18:30:44 +01003154 return false;
3155 }
ths3b46e622007-09-17 08:09:54 +00003156
Alex Bennéefcedd922020-04-30 20:01:19 +01003157 gdb_accept_init(fd);
Peter Maydell2f652222018-05-14 18:30:44 +01003158 return true;
bellard858693c2004-03-31 18:52:07 +00003159}
3160
Alex Bennéefcedd922020-04-30 20:01:19 +01003161static int gdbserver_open_port(int port)
bellard858693c2004-03-31 18:52:07 +00003162{
3163 struct sockaddr_in sockaddr;
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02003164 int fd, ret;
bellard858693c2004-03-31 18:52:07 +00003165
3166 fd = socket(PF_INET, SOCK_STREAM, 0);
3167 if (fd < 0) {
3168 perror("socket");
3169 return -1;
3170 }
Peter Maydellf5bdd782018-05-14 18:30:43 +01003171 qemu_set_cloexec(fd);
bellard858693c2004-03-31 18:52:07 +00003172
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02003173 socket_set_fast_reuse(fd);
bellard858693c2004-03-31 18:52:07 +00003174
3175 sockaddr.sin_family = AF_INET;
3176 sockaddr.sin_port = htons(port);
3177 sockaddr.sin_addr.s_addr = 0;
3178 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
3179 if (ret < 0) {
3180 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00003181 close(fd);
bellard858693c2004-03-31 18:52:07 +00003182 return -1;
3183 }
Peter Wu96165b92016-05-04 11:32:17 +02003184 ret = listen(fd, 1);
bellard858693c2004-03-31 18:52:07 +00003185 if (ret < 0) {
3186 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00003187 close(fd);
bellard858693c2004-03-31 18:52:07 +00003188 return -1;
3189 }
Alex Bennéefcedd922020-04-30 20:01:19 +01003190
bellard858693c2004-03-31 18:52:07 +00003191 return fd;
3192}
3193
Alex Bennéefcedd922020-04-30 20:01:19 +01003194int gdbserver_start(const char *port_or_path)
bellard858693c2004-03-31 18:52:07 +00003195{
Alex Bennéefcedd922020-04-30 20:01:19 +01003196 int port = g_ascii_strtoull(port_or_path, NULL, 10);
3197 int gdb_fd;
3198
3199 if (port > 0) {
3200 gdb_fd = gdbserver_open_port(port);
3201 } else {
3202 gdb_fd = gdbserver_open_socket(port_or_path);
3203 }
3204
Alex Bennéee0a1e202020-04-30 20:01:18 +01003205 if (gdb_fd < 0) {
bellard858693c2004-03-31 18:52:07 +00003206 return -1;
Alex Bennéee0a1e202020-04-30 20:01:18 +01003207 }
Alex Bennéefcedd922020-04-30 20:01:19 +01003208
3209 if (port > 0 && gdb_accept_tcp(gdb_fd)) {
3210 return 0;
3211 } else if (gdb_accept_socket(gdb_fd)) {
3212 gdbserver_state.socket_path = g_strdup(port_or_path);
3213 return 0;
Peter Maydell2f652222018-05-14 18:30:44 +01003214 }
Alex Bennéefcedd922020-04-30 20:01:19 +01003215
3216 /* gone wrong */
3217 close(gdb_fd);
3218 return -1;
bellardb4608c02003-06-27 17:34:32 +00003219}
aurel322b1319c2008-12-18 22:44:04 +00003220
3221/* Disable gdb stub for child processes. */
Peter Crosthwaitef7ec7f72015-06-23 19:31:16 -07003222void gdbserver_fork(CPUState *cpu)
aurel322b1319c2008-12-18 22:44:04 +00003223{
Alex Bennéee0a1e202020-04-30 20:01:18 +01003224 if (!gdbserver_state.init || gdbserver_state.fd < 0) {
Andreas Färber75a34032013-09-02 16:57:02 +02003225 return;
3226 }
Alex Bennée8d98c442020-03-16 17:21:33 +00003227 close(gdbserver_state.fd);
3228 gdbserver_state.fd = -1;
Andreas Färberb3310ab2013-09-02 17:26:20 +02003229 cpu_breakpoint_remove_all(cpu, BP_GDB);
Andreas Färber75a34032013-09-02 16:57:02 +02003230 cpu_watchpoint_remove_all(cpu, BP_GDB);
aurel322b1319c2008-12-18 22:44:04 +00003231}
pbrook4046d912007-01-28 01:53:16 +00003232#else
thsaa1f17c2007-07-11 22:48:58 +00003233static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00003234{
pbrook56aebc82008-10-11 17:55:29 +00003235 /* We can handle an arbitrarily large amount of data.
3236 Pick the maximum packet size, which is as good as anything. */
3237 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00003238}
3239
thsaa1f17c2007-07-11 22:48:58 +00003240static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00003241{
pbrook4046d912007-01-28 01:53:16 +00003242 int i;
3243
3244 for (i = 0; i < size; i++) {
Alex Bennéea346af32020-03-16 17:21:34 +00003245 gdb_read_byte(buf[i]);
pbrook4046d912007-01-28 01:53:16 +00003246 }
3247}
3248
Philippe Mathieu-Daudé083b2662019-12-18 18:20:09 +01003249static void gdb_chr_event(void *opaque, QEMUChrEvent event)
pbrook4046d912007-01-28 01:53:16 +00003250{
Luc Michel970ed902019-01-07 15:23:46 +00003251 int i;
3252 GDBState *s = (GDBState *) opaque;
3253
pbrook4046d912007-01-28 01:53:16 +00003254 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05303255 case CHR_EVENT_OPENED:
Luc Michel970ed902019-01-07 15:23:46 +00003256 /* Start with first process attached, others detached */
3257 for (i = 0; i < s->process_num; i++) {
3258 s->processes[i].attached = !i;
3259 }
3260
Alex Bennéea346af32020-03-16 17:21:34 +00003261 s->c_cpu = gdb_first_attached_cpu();
Luc Michel970ed902019-01-07 15:23:46 +00003262 s->g_cpu = s->c_cpu;
3263
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03003264 vm_stop(RUN_STATE_PAUSED);
Andreas Färber5b50e792013-06-29 04:18:45 +02003265 gdb_has_xml = false;
pbrook4046d912007-01-28 01:53:16 +00003266 break;
3267 default:
3268 break;
3269 }
3270}
3271
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03003272static int gdb_monitor_write(Chardev *chr, const uint8_t *buf, int len)
aliguori8a34a0f2009-03-05 23:01:55 +00003273{
Damien Hedded86b4672020-03-16 17:21:54 +00003274 g_autoptr(GString) hex_buf = g_string_new("O");
3275 memtohex(hex_buf, buf, len);
3276 put_packet(hex_buf->str);
aliguori8a34a0f2009-03-05 23:01:55 +00003277 return len;
3278}
3279
aliguori59030a82009-04-05 18:43:41 +00003280#ifndef _WIN32
3281static void gdb_sigterm_handler(int signal)
3282{
Luiz Capitulino13548692011-07-29 15:36:43 -03003283 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03003284 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01003285 }
aliguori59030a82009-04-05 18:43:41 +00003286}
3287#endif
3288
Marc-André Lureau777357d2016-12-07 18:39:10 +03003289static void gdb_monitor_open(Chardev *chr, ChardevBackend *backend,
3290 bool *be_opened, Error **errp)
3291{
3292 *be_opened = false;
3293}
3294
3295static void char_gdb_class_init(ObjectClass *oc, void *data)
3296{
3297 ChardevClass *cc = CHARDEV_CLASS(oc);
3298
3299 cc->internal = true;
3300 cc->open = gdb_monitor_open;
3301 cc->chr_write = gdb_monitor_write;
3302}
3303
3304#define TYPE_CHARDEV_GDB "chardev-gdb"
3305
3306static const TypeInfo char_gdb_type_info = {
3307 .name = TYPE_CHARDEV_GDB,
3308 .parent = TYPE_CHARDEV,
3309 .class_init = char_gdb_class_init,
3310};
3311
Luc Michel8f468632019-01-07 15:23:45 +00003312static int find_cpu_clusters(Object *child, void *opaque)
3313{
3314 if (object_dynamic_cast(child, TYPE_CPU_CLUSTER)) {
3315 GDBState *s = (GDBState *) opaque;
3316 CPUClusterState *cluster = CPU_CLUSTER(child);
3317 GDBProcess *process;
3318
3319 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
3320
3321 process = &s->processes[s->process_num - 1];
3322
3323 /*
3324 * GDB process IDs -1 and 0 are reserved. To avoid subtle errors at
3325 * runtime, we enforce here that the machine does not use a cluster ID
3326 * that would lead to PID 0.
3327 */
3328 assert(cluster->cluster_id != UINT32_MAX);
3329 process->pid = cluster->cluster_id + 1;
3330 process->attached = false;
Luc Michelc145eea2019-01-07 15:23:46 +00003331 process->target_xml[0] = '\0';
Luc Michel8f468632019-01-07 15:23:45 +00003332
3333 return 0;
3334 }
3335
3336 return object_child_foreach(child, find_cpu_clusters, opaque);
3337}
3338
3339static int pid_order(const void *a, const void *b)
3340{
3341 GDBProcess *pa = (GDBProcess *) a;
3342 GDBProcess *pb = (GDBProcess *) b;
3343
3344 if (pa->pid < pb->pid) {
3345 return -1;
3346 } else if (pa->pid > pb->pid) {
3347 return 1;
3348 } else {
3349 return 0;
3350 }
3351}
3352
3353static void create_processes(GDBState *s)
3354{
3355 object_child_foreach(object_get_root(), find_cpu_clusters, s);
3356
Alex Bennéea346af32020-03-16 17:21:34 +00003357 if (gdbserver_state.processes) {
Luc Michel8f468632019-01-07 15:23:45 +00003358 /* Sort by PID */
Alex Bennéea346af32020-03-16 17:21:34 +00003359 qsort(gdbserver_state.processes, gdbserver_state.process_num, sizeof(gdbserver_state.processes[0]), pid_order);
Luc Michel8f468632019-01-07 15:23:45 +00003360 }
3361
3362 create_default_process(s);
3363}
3364
aliguori59030a82009-04-05 18:43:41 +00003365int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00003366{
Doug Gale5c9522b2017-12-02 20:30:37 -05003367 trace_gdbstub_op_start(device);
3368
aliguori59030a82009-04-05 18:43:41 +00003369 char gdbstub_device_name[128];
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03003370 Chardev *chr = NULL;
3371 Chardev *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00003372
Ziyue Yang508b4ec2017-01-18 16:02:41 +08003373 if (!first_cpu) {
3374 error_report("gdbstub: meaningless to attach gdb to a "
3375 "machine without any CPU.");
3376 return -1;
3377 }
3378
aliguori59030a82009-04-05 18:43:41 +00003379 if (!device)
3380 return -1;
3381 if (strcmp(device, "none") != 0) {
3382 if (strstart(device, "tcp:", NULL)) {
3383 /* enforce required TCP attributes */
3384 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
3385 "%s,nowait,nodelay,server", device);
3386 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00003387 }
aliguori59030a82009-04-05 18:43:41 +00003388#ifndef _WIN32
3389 else if (strcmp(device, "stdio") == 0) {
3390 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00003391
aliguori59030a82009-04-05 18:43:41 +00003392 memset(&act, 0, sizeof(act));
3393 act.sa_handler = gdb_sigterm_handler;
3394 sigaction(SIGINT, &act, NULL);
3395 }
3396#endif
Marc-André Lureau95e30b22018-08-22 19:19:42 +02003397 /*
3398 * FIXME: it's a bit weird to allow using a mux chardev here
3399 * and implicitly setup a monitor. We may want to break this.
3400 */
Paolo Bonzini4ad6f6c2019-02-13 14:18:13 +01003401 chr = qemu_chr_new_noreplay("gdb", device, true, NULL);
aliguori36556b22009-03-28 18:05:53 +00003402 if (!chr)
3403 return -1;
pbrookcfc34752007-02-22 01:48:01 +00003404 }
3405
Alex Bennée8d98c442020-03-16 17:21:33 +00003406 if (!gdbserver_state.init) {
3407 init_gdbserver_state();
pbrook4046d912007-01-28 01:53:16 +00003408
aliguori36556b22009-03-28 18:05:53 +00003409 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3410
3411 /* Initialize a monitor terminal for gdb */
Marc-André Lureau777357d2016-12-07 18:39:10 +03003412 mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
Paolo Bonzini4ad6f6c2019-02-13 14:18:13 +01003413 NULL, NULL, &error_abort);
Kevin Wolf8e9119a2020-02-24 15:30:06 +01003414 monitor_init_hmp(mon_chr, false, &error_abort);
aliguori36556b22009-03-28 18:05:53 +00003415 } else {
Alex Bennée8d98c442020-03-16 17:21:33 +00003416 qemu_chr_fe_deinit(&gdbserver_state.chr, true);
3417 mon_chr = gdbserver_state.mon_chr;
3418 reset_gdbserver_state();
aliguori36556b22009-03-28 18:05:53 +00003419 }
Luc Michel8f468632019-01-07 15:23:45 +00003420
Alex Bennée8d98c442020-03-16 17:21:33 +00003421 create_processes(&gdbserver_state);
Luc Michel8f468632019-01-07 15:23:45 +00003422
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03003423 if (chr) {
Alex Bennée8d98c442020-03-16 17:21:33 +00003424 qemu_chr_fe_init(&gdbserver_state.chr, chr, &error_abort);
3425 qemu_chr_fe_set_handlers(&gdbserver_state.chr, gdb_chr_can_receive,
3426 gdb_chr_receive, gdb_chr_event,
3427 NULL, &gdbserver_state, NULL, true);
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03003428 }
Alex Bennée8d98c442020-03-16 17:21:33 +00003429 gdbserver_state.state = chr ? RS_IDLE : RS_INACTIVE;
3430 gdbserver_state.mon_chr = mon_chr;
3431 gdbserver_state.current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00003432
pbrook4046d912007-01-28 01:53:16 +00003433 return 0;
3434}
Marc-André Lureau777357d2016-12-07 18:39:10 +03003435
KONRAD Frederic1bb982b2018-03-20 10:39:33 +01003436void gdbserver_cleanup(void)
3437{
Alex Bennée8d98c442020-03-16 17:21:33 +00003438 if (gdbserver_state.init) {
Alex Bennéea346af32020-03-16 17:21:34 +00003439 put_packet("W00");
KONRAD Frederic1bb982b2018-03-20 10:39:33 +01003440 }
3441}
3442
Marc-André Lureau777357d2016-12-07 18:39:10 +03003443static void register_types(void)
3444{
3445 type_register_static(&char_gdb_type_info);
3446}
3447
3448type_init(register_types);
pbrook4046d912007-01-28 01:53:16 +00003449#endif