blob: 02beb44d97367e4d0f320240e8985b921d780c87 [file] [log] [blame]
bellardb4608c02003-06-27 17:34:32 +00001/*
2 * gdb server stub
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard34751872005-07-02 14:31:34 +00004 * Copyright (c) 2003-2005 Fabrice Bellard
bellardb4608c02003-06-27 17:34:32 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
Blue Swirl8167ee82009-07-16 20:47:01 +000017 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
bellardb4608c02003-06-27 17:34:32 +000018 */
Peter Maydelld38ea872016-01-29 17:50:05 +000019#include "qemu/osdep.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010020#include "qapi/error.h"
Ziyue Yang508b4ec2017-01-18 16:02:41 +080021#include "qemu/error-report.h"
Veronia Bahaaf348b6d2016-03-20 19:16:19 +020022#include "qemu/cutils.h"
Doug Gale5c9522b2017-12-02 20:30:37 -050023#include "trace-root.h"
Veronia Bahaaf348b6d2016-03-20 19:16:19 +020024#ifdef CONFIG_USER_ONLY
bellard1fddef42005-04-17 19:16:13 +000025#include "qemu.h"
26#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010027#include "monitor/monitor.h"
Marc-André Lureau8228e352017-01-26 17:19:46 +040028#include "chardev/char.h"
Marc-André Lureau4d43a602017-01-26 18:26:44 +040029#include "chardev/char-fe.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010030#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010031#include "exec/gdbstub.h"
Luc Michel8f468632019-01-07 15:23:45 +000032#include "hw/cpu/cluster.h"
bellard1fddef42005-04-17 19:16:13 +000033#endif
bellard67b915a2004-03-31 23:37:16 +000034
pbrook56aebc82008-10-11 17:55:29 +000035#define MAX_PACKET_LENGTH 4096
36
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010037#include "qemu/sockets.h"
Vincent Palatinb3946622017-01-10 11:59:55 +010038#include "sysemu/hw_accel.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010039#include "sysemu/kvm.h"
Leon Alraecfe67ce2015-06-19 14:17:45 +010040#include "exec/semihost.h"
Paolo Bonzini63c91552016-03-15 13:18:37 +010041#include "exec/exec-all.h"
aurel32ca587a82008-12-18 22:44:13 +000042
Jan Kiszkaa3919382015-02-07 09:38:44 +010043#ifdef CONFIG_USER_ONLY
44#define GDB_ATTACHED "0"
45#else
46#define GDB_ATTACHED "1"
47#endif
48
Andreas Färberf3659ee2013-06-27 19:09:09 +020049static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
50 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020051{
Andreas Färberf3659ee2013-06-27 19:09:09 +020052 CPUClass *cc = CPU_GET_CLASS(cpu);
53
54 if (cc->memory_rw_debug) {
55 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
56 }
57 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020058}
aurel32ca587a82008-12-18 22:44:13 +000059
Alex Bennéed2a6c852017-07-12 11:52:14 +010060/* Return the GDB index for a given vCPU state.
61 *
62 * For user mode this is simply the thread id. In system mode GDB
63 * numbers CPUs from 1 as 0 is reserved as an "any cpu" index.
64 */
65static inline int cpu_gdb_index(CPUState *cpu)
66{
67#if defined(CONFIG_USER_ONLY)
Alex Bennéebd88c782017-07-12 11:52:15 +010068 TaskState *ts = (TaskState *) cpu->opaque;
69 return ts->ts_tid;
Alex Bennéed2a6c852017-07-12 11:52:14 +010070#else
71 return cpu->cpu_index + 1;
72#endif
73}
74
aurel32ca587a82008-12-18 22:44:13 +000075enum {
76 GDB_SIGNAL_0 = 0,
77 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010078 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000079 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010080 GDB_SIGNAL_ABRT = 6,
81 GDB_SIGNAL_ALRM = 14,
82 GDB_SIGNAL_IO = 23,
83 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000084 GDB_SIGNAL_UNKNOWN = 143
85};
86
87#ifdef CONFIG_USER_ONLY
88
89/* Map target signal numbers to GDB protocol signal numbers and vice
90 * versa. For user emulation's currently supported systems, we can
91 * assume most signals are defined.
92 */
93
94static int gdb_signal_table[] = {
95 0,
96 TARGET_SIGHUP,
97 TARGET_SIGINT,
98 TARGET_SIGQUIT,
99 TARGET_SIGILL,
100 TARGET_SIGTRAP,
101 TARGET_SIGABRT,
102 -1, /* SIGEMT */
103 TARGET_SIGFPE,
104 TARGET_SIGKILL,
105 TARGET_SIGBUS,
106 TARGET_SIGSEGV,
107 TARGET_SIGSYS,
108 TARGET_SIGPIPE,
109 TARGET_SIGALRM,
110 TARGET_SIGTERM,
111 TARGET_SIGURG,
112 TARGET_SIGSTOP,
113 TARGET_SIGTSTP,
114 TARGET_SIGCONT,
115 TARGET_SIGCHLD,
116 TARGET_SIGTTIN,
117 TARGET_SIGTTOU,
118 TARGET_SIGIO,
119 TARGET_SIGXCPU,
120 TARGET_SIGXFSZ,
121 TARGET_SIGVTALRM,
122 TARGET_SIGPROF,
123 TARGET_SIGWINCH,
124 -1, /* SIGLOST */
125 TARGET_SIGUSR1,
126 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000127#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000128 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000129#else
130 -1,
131#endif
aurel32ca587a82008-12-18 22:44:13 +0000132 -1, /* SIGPOLL */
133 -1,
134 -1,
135 -1,
136 -1,
137 -1,
138 -1,
139 -1,
140 -1,
141 -1,
142 -1,
143 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000144#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000145 __SIGRTMIN + 1,
146 __SIGRTMIN + 2,
147 __SIGRTMIN + 3,
148 __SIGRTMIN + 4,
149 __SIGRTMIN + 5,
150 __SIGRTMIN + 6,
151 __SIGRTMIN + 7,
152 __SIGRTMIN + 8,
153 __SIGRTMIN + 9,
154 __SIGRTMIN + 10,
155 __SIGRTMIN + 11,
156 __SIGRTMIN + 12,
157 __SIGRTMIN + 13,
158 __SIGRTMIN + 14,
159 __SIGRTMIN + 15,
160 __SIGRTMIN + 16,
161 __SIGRTMIN + 17,
162 __SIGRTMIN + 18,
163 __SIGRTMIN + 19,
164 __SIGRTMIN + 20,
165 __SIGRTMIN + 21,
166 __SIGRTMIN + 22,
167 __SIGRTMIN + 23,
168 __SIGRTMIN + 24,
169 __SIGRTMIN + 25,
170 __SIGRTMIN + 26,
171 __SIGRTMIN + 27,
172 __SIGRTMIN + 28,
173 __SIGRTMIN + 29,
174 __SIGRTMIN + 30,
175 __SIGRTMIN + 31,
176 -1, /* SIGCANCEL */
177 __SIGRTMIN,
178 __SIGRTMIN + 32,
179 __SIGRTMIN + 33,
180 __SIGRTMIN + 34,
181 __SIGRTMIN + 35,
182 __SIGRTMIN + 36,
183 __SIGRTMIN + 37,
184 __SIGRTMIN + 38,
185 __SIGRTMIN + 39,
186 __SIGRTMIN + 40,
187 __SIGRTMIN + 41,
188 __SIGRTMIN + 42,
189 __SIGRTMIN + 43,
190 __SIGRTMIN + 44,
191 __SIGRTMIN + 45,
192 __SIGRTMIN + 46,
193 __SIGRTMIN + 47,
194 __SIGRTMIN + 48,
195 __SIGRTMIN + 49,
196 __SIGRTMIN + 50,
197 __SIGRTMIN + 51,
198 __SIGRTMIN + 52,
199 __SIGRTMIN + 53,
200 __SIGRTMIN + 54,
201 __SIGRTMIN + 55,
202 __SIGRTMIN + 56,
203 __SIGRTMIN + 57,
204 __SIGRTMIN + 58,
205 __SIGRTMIN + 59,
206 __SIGRTMIN + 60,
207 __SIGRTMIN + 61,
208 __SIGRTMIN + 62,
209 __SIGRTMIN + 63,
210 __SIGRTMIN + 64,
211 __SIGRTMIN + 65,
212 __SIGRTMIN + 66,
213 __SIGRTMIN + 67,
214 __SIGRTMIN + 68,
215 __SIGRTMIN + 69,
216 __SIGRTMIN + 70,
217 __SIGRTMIN + 71,
218 __SIGRTMIN + 72,
219 __SIGRTMIN + 73,
220 __SIGRTMIN + 74,
221 __SIGRTMIN + 75,
222 __SIGRTMIN + 76,
223 __SIGRTMIN + 77,
224 __SIGRTMIN + 78,
225 __SIGRTMIN + 79,
226 __SIGRTMIN + 80,
227 __SIGRTMIN + 81,
228 __SIGRTMIN + 82,
229 __SIGRTMIN + 83,
230 __SIGRTMIN + 84,
231 __SIGRTMIN + 85,
232 __SIGRTMIN + 86,
233 __SIGRTMIN + 87,
234 __SIGRTMIN + 88,
235 __SIGRTMIN + 89,
236 __SIGRTMIN + 90,
237 __SIGRTMIN + 91,
238 __SIGRTMIN + 92,
239 __SIGRTMIN + 93,
240 __SIGRTMIN + 94,
241 __SIGRTMIN + 95,
242 -1, /* SIGINFO */
243 -1, /* UNKNOWN */
244 -1, /* DEFAULT */
245 -1,
246 -1,
247 -1,
248 -1,
249 -1,
250 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000251#endif
aurel32ca587a82008-12-18 22:44:13 +0000252};
bellard8f447cc2006-06-14 15:21:14 +0000253#else
aurel32ca587a82008-12-18 22:44:13 +0000254/* In system mode we only need SIGINT and SIGTRAP; other signals
255 are not yet supported. */
256
257enum {
258 TARGET_SIGINT = 2,
259 TARGET_SIGTRAP = 5
260};
261
262static int gdb_signal_table[] = {
263 -1,
264 -1,
265 TARGET_SIGINT,
266 -1,
267 -1,
268 TARGET_SIGTRAP
269};
bellard8f447cc2006-06-14 15:21:14 +0000270#endif
bellardb4608c02003-06-27 17:34:32 +0000271
aurel32ca587a82008-12-18 22:44:13 +0000272#ifdef CONFIG_USER_ONLY
273static int target_signal_to_gdb (int sig)
274{
275 int i;
276 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
277 if (gdb_signal_table[i] == sig)
278 return i;
279 return GDB_SIGNAL_UNKNOWN;
280}
281#endif
282
283static int gdb_signal_to_target (int sig)
284{
285 if (sig < ARRAY_SIZE (gdb_signal_table))
286 return gdb_signal_table[sig];
287 else
288 return -1;
289}
290
pbrook56aebc82008-10-11 17:55:29 +0000291typedef struct GDBRegisterState {
292 int base_reg;
293 int num_regs;
294 gdb_reg_cb get_reg;
295 gdb_reg_cb set_reg;
296 const char *xml;
297 struct GDBRegisterState *next;
298} GDBRegisterState;
299
Luc Michel8f468632019-01-07 15:23:45 +0000300typedef struct GDBProcess {
301 uint32_t pid;
302 bool attached;
303} GDBProcess;
304
bellard858693c2004-03-31 18:52:07 +0000305enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000306 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000307 RS_IDLE,
308 RS_GETLINE,
Doug Gale4bf43122017-05-01 12:22:10 -0400309 RS_GETLINE_ESC,
310 RS_GETLINE_RLE,
bellard858693c2004-03-31 18:52:07 +0000311 RS_CHKSUM1,
312 RS_CHKSUM2,
313};
bellard858693c2004-03-31 18:52:07 +0000314typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200315 CPUState *c_cpu; /* current CPU for step/continue ops */
316 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200317 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000318 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000319 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000320 int line_buf_index;
Doug Gale4bf43122017-05-01 12:22:10 -0400321 int line_sum; /* running checksum */
322 int line_csum; /* checksum at the end of the packet */
pbrook56aebc82008-10-11 17:55:29 +0000323 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000324 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000325 int signal;
bellard41625032005-04-24 10:07:11 +0000326#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000327 int fd;
bellard41625032005-04-24 10:07:11 +0000328 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000329#else
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +0300330 CharBackend chr;
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +0300331 Chardev *mon_chr;
bellard41625032005-04-24 10:07:11 +0000332#endif
Luc Michel8f468632019-01-07 15:23:45 +0000333 bool multiprocess;
334 GDBProcess *processes;
335 int process_num;
Meador Ingecdb432b2012-03-15 17:49:45 +0000336 char syscall_buf[256];
337 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000338} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000339
edgar_igl60897d32008-05-09 08:25:14 +0000340/* By default use no IRQs and no timers while single stepping so as to
341 * make single stepping like an ICE HW step.
342 */
343static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
344
aliguori880a7572008-11-18 20:30:24 +0000345static GDBState *gdbserver_state;
346
Andreas Färber5b50e792013-06-29 04:18:45 +0200347bool gdb_has_xml;
pbrook56aebc82008-10-11 17:55:29 +0000348
bellard1fddef42005-04-17 19:16:13 +0000349#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000350/* XXX: This is not thread safe. Do we care? */
351static int gdbserver_fd = -1;
352
bellard858693c2004-03-31 18:52:07 +0000353static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000354{
355 uint8_t ch;
356 int ret;
357
358 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000359 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000360 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000361 if (errno == ECONNRESET)
362 s->fd = -1;
Peter Wu5819e3e2016-06-05 16:35:48 +0200363 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000364 return -1;
365 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000366 close(s->fd);
367 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000368 return -1;
369 } else {
370 break;
371 }
372 }
373 return ch;
374}
pbrook4046d912007-01-28 01:53:16 +0000375#endif
bellardb4608c02003-06-27 17:34:32 +0000376
blueswir1654efcf2009-04-18 07:29:59 +0000377static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000378 GDB_SYS_UNKNOWN,
379 GDB_SYS_ENABLED,
380 GDB_SYS_DISABLED,
381} gdb_syscall_mode;
382
Liviu Ionescua38bb072014-12-11 12:07:48 +0000383/* Decide if either remote gdb syscalls or native file IO should be used. */
pbrooka2d1eba2007-01-28 03:10:55 +0000384int use_gdb_syscalls(void)
385{
Leon Alraecfe67ce2015-06-19 14:17:45 +0100386 SemihostingTarget target = semihosting_get_target();
387 if (target == SEMIHOSTING_TARGET_NATIVE) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000388 /* -semihosting-config target=native */
389 return false;
Leon Alraecfe67ce2015-06-19 14:17:45 +0100390 } else if (target == SEMIHOSTING_TARGET_GDB) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000391 /* -semihosting-config target=gdb */
392 return true;
393 }
394
395 /* -semihosting-config target=auto */
396 /* On the first call check if gdb is connected and remember. */
pbrooka2d1eba2007-01-28 03:10:55 +0000397 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000398 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
399 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000400 }
401 return gdb_syscall_mode == GDB_SYS_ENABLED;
402}
403
edgar_iglba70a622008-03-14 06:10:42 +0000404/* Resume execution. */
405static inline void gdb_continue(GDBState *s)
406{
Doug Gale5c9522b2017-12-02 20:30:37 -0500407
edgar_iglba70a622008-03-14 06:10:42 +0000408#ifdef CONFIG_USER_ONLY
409 s->running_state = 1;
Doug Gale5c9522b2017-12-02 20:30:37 -0500410 trace_gdbstub_op_continue();
edgar_iglba70a622008-03-14 06:10:42 +0000411#else
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200412 if (!runstate_needs_reset()) {
Doug Gale5c9522b2017-12-02 20:30:37 -0500413 trace_gdbstub_op_continue();
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200414 vm_start();
415 }
edgar_iglba70a622008-03-14 06:10:42 +0000416#endif
417}
418
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100419/*
420 * Resume execution, per CPU actions. For user-mode emulation it's
421 * equivalent to gdb_continue.
422 */
423static int gdb_continue_partial(GDBState *s, char *newstates)
424{
425 CPUState *cpu;
426 int res = 0;
427#ifdef CONFIG_USER_ONLY
428 /*
429 * This is not exactly accurate, but it's an improvement compared to the
430 * previous situation, where only one CPU would be single-stepped.
431 */
432 CPU_FOREACH(cpu) {
433 if (newstates[cpu->cpu_index] == 's') {
Doug Gale5c9522b2017-12-02 20:30:37 -0500434 trace_gdbstub_op_stepping(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100435 cpu_single_step(cpu, sstep_flags);
436 }
437 }
438 s->running_state = 1;
439#else
440 int flag = 0;
441
442 if (!runstate_needs_reset()) {
443 if (vm_prepare_start()) {
444 return 0;
445 }
446
447 CPU_FOREACH(cpu) {
448 switch (newstates[cpu->cpu_index]) {
449 case 0:
450 case 1:
451 break; /* nothing to do here */
452 case 's':
Doug Gale5c9522b2017-12-02 20:30:37 -0500453 trace_gdbstub_op_stepping(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100454 cpu_single_step(cpu, sstep_flags);
455 cpu_resume(cpu);
456 flag = 1;
457 break;
458 case 'c':
Doug Gale5c9522b2017-12-02 20:30:37 -0500459 trace_gdbstub_op_continue_cpu(cpu->cpu_index);
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100460 cpu_resume(cpu);
461 flag = 1;
462 break;
463 default:
464 res = -1;
465 break;
466 }
467 }
468 }
469 if (flag) {
470 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
471 }
472#endif
473 return res;
474}
475
bellard858693c2004-03-31 18:52:07 +0000476static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000477{
pbrook4046d912007-01-28 01:53:16 +0000478#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000479 int ret;
480
481 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000482 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000483 if (ret < 0) {
Peter Wu5819e3e2016-06-05 16:35:48 +0200484 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000485 return;
486 } else {
487 buf += ret;
488 len -= ret;
489 }
490 }
pbrook4046d912007-01-28 01:53:16 +0000491#else
Daniel P. Berrange6ab3fc32016-09-06 14:56:04 +0100492 /* XXX this blocks entire thread. Rewrite to use
493 * qemu_chr_fe_write and background I/O callbacks */
Marc-André Lureau5345fdb2016-10-22 12:52:55 +0300494 qemu_chr_fe_write_all(&s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000495#endif
bellardb4608c02003-06-27 17:34:32 +0000496}
497
498static inline int fromhex(int v)
499{
500 if (v >= '0' && v <= '9')
501 return v - '0';
502 else if (v >= 'A' && v <= 'F')
503 return v - 'A' + 10;
504 else if (v >= 'a' && v <= 'f')
505 return v - 'a' + 10;
506 else
507 return 0;
508}
509
510static inline int tohex(int v)
511{
512 if (v < 10)
513 return v + '0';
514 else
515 return v - 10 + 'a';
516}
517
Philippe Mathieu-Daudé90057742018-04-08 11:59:33 -0300518/* writes 2*len+1 bytes in buf */
bellardb4608c02003-06-27 17:34:32 +0000519static void memtohex(char *buf, const uint8_t *mem, int len)
520{
521 int i, c;
522 char *q;
523 q = buf;
524 for(i = 0; i < len; i++) {
525 c = mem[i];
526 *q++ = tohex(c >> 4);
527 *q++ = tohex(c & 0xf);
528 }
529 *q = '\0';
530}
531
532static void hextomem(uint8_t *mem, const char *buf, int len)
533{
534 int i;
535
536 for(i = 0; i < len; i++) {
537 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
538 buf += 2;
539 }
540}
541
Doug Gale5c9522b2017-12-02 20:30:37 -0500542static void hexdump(const char *buf, int len,
543 void (*trace_fn)(size_t ofs, char const *text))
544{
545 char line_buffer[3 * 16 + 4 + 16 + 1];
546
547 size_t i;
548 for (i = 0; i < len || (i & 0xF); ++i) {
549 size_t byte_ofs = i & 15;
550
551 if (byte_ofs == 0) {
552 memset(line_buffer, ' ', 3 * 16 + 4 + 16);
553 line_buffer[3 * 16 + 4 + 16] = 0;
554 }
555
556 size_t col_group = (i >> 2) & 3;
557 size_t hex_col = byte_ofs * 3 + col_group;
558 size_t txt_col = 3 * 16 + 4 + byte_ofs;
559
560 if (i < len) {
561 char value = buf[i];
562
563 line_buffer[hex_col + 0] = tohex((value >> 4) & 0xF);
564 line_buffer[hex_col + 1] = tohex((value >> 0) & 0xF);
565 line_buffer[txt_col + 0] = (value >= ' ' && value < 127)
566 ? value
567 : '.';
568 }
569
570 if (byte_ofs == 0xF)
571 trace_fn(i & -16, line_buffer);
572 }
573}
574
bellardb4608c02003-06-27 17:34:32 +0000575/* return -1 if error, 0 if OK */
Doug Gale5c9522b2017-12-02 20:30:37 -0500576static int put_packet_binary(GDBState *s, const char *buf, int len, bool dump)
bellardb4608c02003-06-27 17:34:32 +0000577{
pbrook56aebc82008-10-11 17:55:29 +0000578 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000579 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000580
Doug Gale5c9522b2017-12-02 20:30:37 -0500581 if (dump && trace_event_get_state_backends(TRACE_GDBSTUB_IO_BINARYREPLY)) {
582 hexdump(buf, len, trace_gdbstub_io_binaryreply);
583 }
584
bellardb4608c02003-06-27 17:34:32 +0000585 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000586 p = s->last_packet;
587 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000588 memcpy(p, buf, len);
589 p += len;
bellardb4608c02003-06-27 17:34:32 +0000590 csum = 0;
591 for(i = 0; i < len; i++) {
592 csum += buf[i];
593 }
pbrook4046d912007-01-28 01:53:16 +0000594 *(p++) = '#';
595 *(p++) = tohex((csum >> 4) & 0xf);
596 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000597
pbrook4046d912007-01-28 01:53:16 +0000598 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000599 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000600
pbrook4046d912007-01-28 01:53:16 +0000601#ifdef CONFIG_USER_ONLY
602 i = get_char(s);
603 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000604 return -1;
pbrook4046d912007-01-28 01:53:16 +0000605 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000606 break;
pbrook4046d912007-01-28 01:53:16 +0000607#else
608 break;
609#endif
bellardb4608c02003-06-27 17:34:32 +0000610 }
611 return 0;
612}
613
pbrook56aebc82008-10-11 17:55:29 +0000614/* return -1 if error, 0 if OK */
615static int put_packet(GDBState *s, const char *buf)
616{
Doug Gale5c9522b2017-12-02 20:30:37 -0500617 trace_gdbstub_io_reply(buf);
pbrook56aebc82008-10-11 17:55:29 +0000618
Doug Gale5c9522b2017-12-02 20:30:37 -0500619 return put_packet_binary(s, buf, strlen(buf), false);
pbrook56aebc82008-10-11 17:55:29 +0000620}
621
pbrook56aebc82008-10-11 17:55:29 +0000622/* Encode data using the encoding for 'x' packets. */
623static int memtox(char *buf, const char *mem, int len)
624{
625 char *p = buf;
626 char c;
627
628 while (len--) {
629 c = *(mem++);
630 switch (c) {
631 case '#': case '$': case '*': case '}':
632 *(p++) = '}';
633 *(p++) = c ^ 0x20;
634 break;
635 default:
636 *(p++) = c;
637 break;
638 }
639 }
640 return p - buf;
641}
642
Luc Michel1a227332019-01-07 15:23:45 +0000643static uint32_t gdb_get_cpu_pid(const GDBState *s, CPUState *cpu)
644{
645#ifndef CONFIG_USER_ONLY
646 gchar *path, *name = NULL;
647 Object *obj;
648 CPUClusterState *cluster;
649 uint32_t ret;
650
651 path = object_get_canonical_path(OBJECT(cpu));
652
653 if (path == NULL) {
654 /* Return the default process' PID */
655 ret = s->processes[s->process_num - 1].pid;
656 goto out;
657 }
658
659 name = object_get_canonical_path_component(OBJECT(cpu));
660 assert(name != NULL);
661
662 /*
663 * Retrieve the CPU parent path by removing the last '/' and the CPU name
664 * from the CPU canonical path.
665 */
666 path[strlen(path) - strlen(name) - 1] = '\0';
667
668 obj = object_resolve_path_type(path, TYPE_CPU_CLUSTER, NULL);
669
670 if (obj == NULL) {
671 /* Return the default process' PID */
672 ret = s->processes[s->process_num - 1].pid;
673 goto out;
674 }
675
676 cluster = CPU_CLUSTER(obj);
677 ret = cluster->cluster_id + 1;
678
679out:
680 g_free(name);
681 g_free(path);
682
683 return ret;
684
685#else
686 /* TODO: In user mode, we should use the task state PID */
687 return s->processes[s->process_num - 1].pid;
688#endif
689}
690
Andreas Färber5b24c642013-07-07 15:08:22 +0200691static const char *get_feature_xml(const char *p, const char **newp,
692 CPUClass *cc)
pbrook56aebc82008-10-11 17:55:29 +0000693{
pbrook56aebc82008-10-11 17:55:29 +0000694 size_t len;
695 int i;
696 const char *name;
697 static char target_xml[1024];
698
699 len = 0;
700 while (p[len] && p[len] != ':')
701 len++;
702 *newp = p + len;
703
704 name = NULL;
705 if (strncmp(p, "target.xml", len) == 0) {
706 /* Generate the XML description for this CPU. */
707 if (!target_xml[0]) {
708 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +0200709 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +0000710
David Hildenbrandb3820e62015-12-03 13:14:41 +0100711 pstrcat(target_xml, sizeof(target_xml),
712 "<?xml version=\"1.0\"?>"
713 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
714 "<target>");
715 if (cc->gdb_arch_name) {
716 gchar *arch = cc->gdb_arch_name(cpu);
717 pstrcat(target_xml, sizeof(target_xml), "<architecture>");
718 pstrcat(target_xml, sizeof(target_xml), arch);
719 pstrcat(target_xml, sizeof(target_xml), "</architecture>");
720 g_free(arch);
721 }
722 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
723 pstrcat(target_xml, sizeof(target_xml), cc->gdb_core_xml_file);
724 pstrcat(target_xml, sizeof(target_xml), "\"/>");
Andreas Färbereac8b352013-06-28 21:11:37 +0200725 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000726 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
727 pstrcat(target_xml, sizeof(target_xml), r->xml);
728 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000729 }
blueswir12dc766d2009-04-13 16:06:19 +0000730 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000731 }
732 return target_xml;
733 }
Abdallah Bouassida200bf5b2018-05-18 17:48:07 +0100734 if (cc->gdb_get_dynamic_xml) {
735 CPUState *cpu = first_cpu;
736 char *xmlname = g_strndup(p, len);
737 const char *xml = cc->gdb_get_dynamic_xml(cpu, xmlname);
738
739 g_free(xmlname);
740 if (xml) {
741 return xml;
742 }
743 }
pbrook56aebc82008-10-11 17:55:29 +0000744 for (i = 0; ; i++) {
745 name = xml_builtin[i][0];
746 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
747 break;
748 }
749 return name ? xml_builtin[i][1] : NULL;
750}
pbrook56aebc82008-10-11 17:55:29 +0000751
Andreas Färber385b9f02013-06-27 18:25:36 +0200752static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000753{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200754 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200755 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000756 GDBRegisterState *r;
757
Andreas Färbera0e372f2013-06-28 23:18:47 +0200758 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200759 return cc->gdb_read_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200760 }
pbrook56aebc82008-10-11 17:55:29 +0000761
Andreas Färbereac8b352013-06-28 21:11:37 +0200762 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000763 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
764 return r->get_reg(env, mem_buf, reg - r->base_reg);
765 }
766 }
767 return 0;
768}
769
Andreas Färber385b9f02013-06-27 18:25:36 +0200770static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000771{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200772 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200773 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000774 GDBRegisterState *r;
775
Andreas Färbera0e372f2013-06-28 23:18:47 +0200776 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200777 return cc->gdb_write_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200778 }
pbrook56aebc82008-10-11 17:55:29 +0000779
Andreas Färbereac8b352013-06-28 21:11:37 +0200780 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000781 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
782 return r->set_reg(env, mem_buf, reg - r->base_reg);
783 }
784 }
785 return 0;
786}
787
788/* Register a supplemental set of CPU registers. If g_pos is nonzero it
789 specifies the first register number and these registers are included in
790 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
791 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
792 */
793
Andreas Färber22169d42013-06-28 21:27:39 +0200794void gdb_register_coprocessor(CPUState *cpu,
795 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
796 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000797{
798 GDBRegisterState *s;
799 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000800
Andreas Färbereac8b352013-06-28 21:11:37 +0200801 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000802 while (*p) {
803 /* Check for duplicates. */
804 if (strcmp((*p)->xml, xml) == 0)
805 return;
806 p = &(*p)->next;
807 }
Stefan Weil9643c252011-10-18 22:25:38 +0200808
809 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200810 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200811 s->num_regs = num_regs;
812 s->get_reg = get_reg;
813 s->set_reg = set_reg;
814 s->xml = xml;
815
pbrook56aebc82008-10-11 17:55:29 +0000816 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200817 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000818 *p = s;
819 if (g_pos) {
820 if (g_pos != s->base_reg) {
Ziyue Yang7ae6c572017-01-18 16:03:29 +0800821 error_report("Error: Bad gdb register numbering for '%s', "
822 "expected %d got %d", xml, g_pos, s->base_reg);
Andreas Färber35143f02013-08-12 18:09:47 +0200823 } else {
824 cpu->gdb_num_g_regs = cpu->gdb_num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000825 }
826 }
827}
828
aliguoria1d1bb32008-11-18 20:07:32 +0000829#ifndef CONFIG_USER_ONLY
Peter Maydell2472b6c2014-09-12 19:04:17 +0100830/* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
831static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
832{
833 static const int xlat[] = {
834 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
835 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
836 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
837 };
838
839 CPUClass *cc = CPU_GET_CLASS(cpu);
840 int cputype = xlat[gdbtype];
841
842 if (cc->gdb_stop_before_watchpoint) {
843 cputype |= BP_STOP_BEFORE_ACCESS;
844 }
845 return cputype;
846}
aliguoria1d1bb32008-11-18 20:07:32 +0000847#endif
848
aliguori880a7572008-11-18 20:30:24 +0000849static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000850{
Andreas Färber182735e2013-05-29 22:29:20 +0200851 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000852 int err = 0;
853
Andreas Färber62278812013-06-27 17:12:06 +0200854 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200855 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200856 }
aliguorie22a25c2009-03-12 20:12:48 +0000857
aliguoria1d1bb32008-11-18 20:07:32 +0000858 switch (type) {
859 case GDB_BREAKPOINT_SW:
860 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200861 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200862 err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
863 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000864 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200865 }
aliguori880a7572008-11-18 20:30:24 +0000866 }
867 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000868#ifndef CONFIG_USER_ONLY
869 case GDB_WATCHPOINT_WRITE:
870 case GDB_WATCHPOINT_READ:
871 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200872 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100873 err = cpu_watchpoint_insert(cpu, addr, len,
874 xlat_gdb_type(cpu, type), NULL);
875 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000876 break;
Peter Maydell2472b6c2014-09-12 19:04:17 +0100877 }
aliguori880a7572008-11-18 20:30:24 +0000878 }
879 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000880#endif
881 default:
882 return -ENOSYS;
883 }
884}
885
aliguori880a7572008-11-18 20:30:24 +0000886static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000887{
Andreas Färber182735e2013-05-29 22:29:20 +0200888 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000889 int err = 0;
890
Andreas Färber62278812013-06-27 17:12:06 +0200891 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200892 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200893 }
aliguorie22a25c2009-03-12 20:12:48 +0000894
aliguoria1d1bb32008-11-18 20:07:32 +0000895 switch (type) {
896 case GDB_BREAKPOINT_SW:
897 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200898 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200899 err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
900 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000901 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200902 }
aliguori880a7572008-11-18 20:30:24 +0000903 }
904 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000905#ifndef CONFIG_USER_ONLY
906 case GDB_WATCHPOINT_WRITE:
907 case GDB_WATCHPOINT_READ:
908 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200909 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100910 err = cpu_watchpoint_remove(cpu, addr, len,
911 xlat_gdb_type(cpu, type));
aliguori880a7572008-11-18 20:30:24 +0000912 if (err)
913 break;
914 }
915 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000916#endif
917 default:
918 return -ENOSYS;
919 }
920}
921
aliguori880a7572008-11-18 20:30:24 +0000922static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +0000923{
Andreas Färber182735e2013-05-29 22:29:20 +0200924 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000925
aliguorie22a25c2009-03-12 20:12:48 +0000926 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200927 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +0000928 return;
929 }
930
Andreas Färberbdc44642013-06-24 23:50:24 +0200931 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200932 cpu_breakpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000933#ifndef CONFIG_USER_ONLY
Andreas Färber75a34032013-09-02 16:57:02 +0200934 cpu_watchpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000935#endif
aliguori880a7572008-11-18 20:30:24 +0000936 }
aliguoria1d1bb32008-11-18 20:07:32 +0000937}
938
aurel32fab9d282009-04-08 21:29:37 +0000939static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
940{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200941 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +0200942
943 cpu_synchronize_state(cpu);
Peter Crosthwaite4a2b24e2015-06-23 20:19:21 -0700944 cpu_set_pc(cpu, pc);
aurel32fab9d282009-04-08 21:29:37 +0000945}
946
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200947static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700948{
Andreas Färber0d342822012-12-17 07:12:13 +0100949 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700950
Andreas Färberbdc44642013-06-24 23:50:24 +0200951 CPU_FOREACH(cpu) {
Alex Bennéed2a6c852017-07-12 11:52:14 +0100952 if (cpu_gdb_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200953 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +0200954 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700955 }
Andreas Färberaa48dd92013-07-09 20:50:52 +0200956
957 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700958}
959
Luc Michel1a227332019-01-07 15:23:45 +0000960static char *gdb_fmt_thread_id(const GDBState *s, CPUState *cpu,
961 char *buf, size_t buf_size)
962{
963 if (s->multiprocess) {
964 snprintf(buf, buf_size, "p%02x.%02x",
965 gdb_get_cpu_pid(s, cpu), cpu_gdb_index(cpu));
966 } else {
967 snprintf(buf, buf_size, "%02x", cpu_gdb_index(cpu));
968 }
969
970 return buf;
971}
972
Jan Kiszka4dabe742015-02-07 09:38:43 +0100973static int is_query_packet(const char *p, const char *query, char separator)
974{
975 unsigned int query_len = strlen(query);
976
977 return strncmp(p, query, query_len) == 0 &&
978 (p[query_len] == '\0' || p[query_len] == separator);
979}
980
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100981/**
982 * gdb_handle_vcont - Parses and handles a vCont packet.
983 * returns -ENOTSUP if a command is unsupported, -EINVAL or -ERANGE if there is
984 * a format error, 0 on success.
985 */
986static int gdb_handle_vcont(GDBState *s, const char *p)
987{
988 int res, idx, signal = 0;
989 char cur_action;
990 char *newstates;
991 unsigned long tmp;
992 CPUState *cpu;
993#ifdef CONFIG_USER_ONLY
994 int max_cpus = 1; /* global variable max_cpus exists only in system mode */
995
996 CPU_FOREACH(cpu) {
997 max_cpus = max_cpus <= cpu->cpu_index ? cpu->cpu_index + 1 : max_cpus;
998 }
999#endif
1000 /* uninitialised CPUs stay 0 */
1001 newstates = g_new0(char, max_cpus);
1002
1003 /* mark valid CPUs with 1 */
1004 CPU_FOREACH(cpu) {
1005 newstates[cpu->cpu_index] = 1;
1006 }
1007
1008 /*
1009 * res keeps track of what error we are returning, with -ENOTSUP meaning
1010 * that the command is unknown or unsupported, thus returning an empty
1011 * packet, while -EINVAL and -ERANGE cause an E22 packet, due to invalid,
1012 * or incorrect parameters passed.
1013 */
1014 res = 0;
1015 while (*p) {
1016 if (*p++ != ';') {
1017 res = -ENOTSUP;
1018 goto out;
1019 }
1020
1021 cur_action = *p++;
1022 if (cur_action == 'C' || cur_action == 'S') {
Peter Maydell95a5bef2017-07-20 17:31:30 +01001023 cur_action = qemu_tolower(cur_action);
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001024 res = qemu_strtoul(p + 1, &p, 16, &tmp);
1025 if (res) {
1026 goto out;
1027 }
1028 signal = gdb_signal_to_target(tmp);
1029 } else if (cur_action != 'c' && cur_action != 's') {
1030 /* unknown/invalid/unsupported command */
1031 res = -ENOTSUP;
1032 goto out;
1033 }
1034 /* thread specification. special values: (none), -1 = all; 0 = any */
1035 if ((p[0] == ':' && p[1] == '-' && p[2] == '1') || (p[0] != ':')) {
1036 if (*p == ':') {
1037 p += 3;
1038 }
1039 for (idx = 0; idx < max_cpus; idx++) {
1040 if (newstates[idx] == 1) {
1041 newstates[idx] = cur_action;
1042 }
1043 }
1044 } else if (*p == ':') {
1045 p++;
1046 res = qemu_strtoul(p, &p, 16, &tmp);
1047 if (res) {
1048 goto out;
1049 }
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001050
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001051 /* 0 means any thread, so we pick the first valid CPU */
1052 cpu = tmp ? find_cpu(tmp) : first_cpu;
1053
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001054 /* invalid CPU/thread specified */
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001055 if (!cpu) {
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001056 res = -EINVAL;
1057 goto out;
1058 }
Alex Bennée5a6a1ad2017-07-12 11:52:16 +01001059
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001060 /* only use if no previous match occourred */
1061 if (newstates[cpu->cpu_index] == 1) {
1062 newstates[cpu->cpu_index] = cur_action;
1063 }
1064 }
1065 }
1066 s->signal = signal;
1067 gdb_continue_partial(s, newstates);
1068
1069out:
1070 g_free(newstates);
1071
1072 return res;
1073}
1074
aliguori880a7572008-11-18 20:30:24 +00001075static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001076{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001077 CPUState *cpu;
Andreas Färber5b24c642013-07-07 15:08:22 +02001078 CPUClass *cc;
bellardb4608c02003-06-27 17:34:32 +00001079 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001080 uint32_t thread;
1081 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001082 uint8_t mem_buf[MAX_PACKET_LENGTH];
Philippe Mathieu-Daudé90057742018-04-08 11:59:33 -03001083 char buf[sizeof(mem_buf) + 1 /* trailing NUL */];
Luc Michel1a227332019-01-07 15:23:45 +00001084 char thread_id[16];
pbrook56aebc82008-10-11 17:55:29 +00001085 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001086 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001087
Doug Gale5c9522b2017-12-02 20:30:37 -05001088 trace_gdbstub_io_command(line_buf);
Alex Bennée118e2262017-07-12 11:52:13 +01001089
bellard858693c2004-03-31 18:52:07 +00001090 p = line_buf;
1091 ch = *p++;
1092 switch(ch) {
1093 case '?':
bellard1fddef42005-04-17 19:16:13 +00001094 /* TODO: Make this return the correct value for user-mode. */
Luc Michel1a227332019-01-07 15:23:45 +00001095 snprintf(buf, sizeof(buf), "T%02xthread:%s;", GDB_SIGNAL_TRAP,
1096 gdb_fmt_thread_id(s, s->c_cpu, thread_id, sizeof(thread_id)));
bellard858693c2004-03-31 18:52:07 +00001097 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001098 /* Remove all the breakpoints when this query is issued,
1099 * because gdb is doing and initial connect and the state
1100 * should be cleaned up.
1101 */
aliguori880a7572008-11-18 20:30:24 +00001102 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001103 break;
1104 case 'c':
1105 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001106 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001107 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001108 }
aurel32ca587a82008-12-18 22:44:13 +00001109 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001110 gdb_continue(s);
Doug Gale5c9522b2017-12-02 20:30:37 -05001111 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001112 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001113 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1114 if (s->signal == -1)
1115 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001116 gdb_continue(s);
1117 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001118 case 'v':
1119 if (strncmp(p, "Cont", 4) == 0) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001120 p += 4;
1121 if (*p == '?') {
1122 put_packet(s, "vCont;c;C;s;S");
1123 break;
1124 }
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001125
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001126 res = gdb_handle_vcont(s, p);
1127
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001128 if (res) {
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001129 if ((res == -EINVAL) || (res == -ERANGE)) {
1130 put_packet(s, "E22");
1131 break;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001132 }
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001133 goto unknown_command;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001134 }
1135 break;
1136 } else {
1137 goto unknown_command;
1138 }
edgar_igl7d03f822008-05-17 18:58:29 +00001139 case 'k':
1140 /* Kill the target */
Ziyue Yang7ae6c572017-01-18 16:03:29 +08001141 error_report("QEMU: Terminated via GDBstub");
edgar_igl7d03f822008-05-17 18:58:29 +00001142 exit(0);
1143 case 'D':
1144 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001145 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001146 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001147 gdb_continue(s);
1148 put_packet(s, "OK");
1149 break;
bellard858693c2004-03-31 18:52:07 +00001150 case 's':
1151 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001152 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001153 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001154 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001155 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001156 gdb_continue(s);
Doug Gale5c9522b2017-12-02 20:30:37 -05001157 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001158 case 'F':
1159 {
1160 target_ulong ret;
1161 target_ulong err;
1162
1163 ret = strtoull(p, (char **)&p, 16);
1164 if (*p == ',') {
1165 p++;
1166 err = strtoull(p, (char **)&p, 16);
1167 } else {
1168 err = 0;
1169 }
1170 if (*p == ',')
1171 p++;
1172 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001173 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001174 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001175 s->current_syscall_cb = NULL;
1176 }
pbrooka2d1eba2007-01-28 03:10:55 +00001177 if (type == 'C') {
1178 put_packet(s, "T02");
1179 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001180 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001181 }
1182 }
1183 break;
bellard858693c2004-03-31 18:52:07 +00001184 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001185 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001186 len = 0;
Andreas Färber35143f02013-08-12 18:09:47 +02001187 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001188 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001189 len += reg_size;
1190 }
1191 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001192 put_packet(s, buf);
1193 break;
1194 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001195 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001196 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001197 len = strlen(p) / 2;
1198 hextomem((uint8_t *)registers, p, len);
Andreas Färber35143f02013-08-12 18:09:47 +02001199 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001200 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001201 len -= reg_size;
1202 registers += reg_size;
1203 }
bellard858693c2004-03-31 18:52:07 +00001204 put_packet(s, "OK");
1205 break;
1206 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001207 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001208 if (*p == ',')
1209 p++;
bellard9d9754a2006-06-25 15:32:37 +00001210 len = strtoull(p, NULL, 16);
Kevin Wolf5accecb2015-10-13 09:38:50 +02001211
1212 /* memtohex() doubles the required space */
1213 if (len > MAX_PACKET_LENGTH / 2) {
1214 put_packet (s, "E22");
1215 break;
1216 }
1217
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001218 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001219 put_packet (s, "E14");
1220 } else {
1221 memtohex(buf, mem_buf, len);
1222 put_packet(s, buf);
1223 }
bellard858693c2004-03-31 18:52:07 +00001224 break;
1225 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001226 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001227 if (*p == ',')
1228 p++;
bellard9d9754a2006-06-25 15:32:37 +00001229 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001230 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001231 p++;
Kevin Wolf5accecb2015-10-13 09:38:50 +02001232
1233 /* hextomem() reads 2*len bytes */
1234 if (len > strlen(p) / 2) {
1235 put_packet (s, "E22");
1236 break;
1237 }
bellard858693c2004-03-31 18:52:07 +00001238 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001239 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001240 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001241 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001242 } else {
bellard858693c2004-03-31 18:52:07 +00001243 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001244 }
bellard858693c2004-03-31 18:52:07 +00001245 break;
pbrook56aebc82008-10-11 17:55:29 +00001246 case 'p':
1247 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1248 This works, but can be very slow. Anything new enough to
1249 understand XML also knows how to use this properly. */
1250 if (!gdb_has_xml)
1251 goto unknown_command;
1252 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001253 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001254 if (reg_size) {
1255 memtohex(buf, mem_buf, reg_size);
1256 put_packet(s, buf);
1257 } else {
1258 put_packet(s, "E14");
1259 }
1260 break;
1261 case 'P':
1262 if (!gdb_has_xml)
1263 goto unknown_command;
1264 addr = strtoull(p, (char **)&p, 16);
1265 if (*p == '=')
1266 p++;
1267 reg_size = strlen(p) / 2;
1268 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001269 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001270 put_packet(s, "OK");
1271 break;
bellard858693c2004-03-31 18:52:07 +00001272 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001273 case 'z':
1274 type = strtoul(p, (char **)&p, 16);
1275 if (*p == ',')
1276 p++;
bellard9d9754a2006-06-25 15:32:37 +00001277 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001278 if (*p == ',')
1279 p++;
bellard9d9754a2006-06-25 15:32:37 +00001280 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001281 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001282 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001283 else
aliguori880a7572008-11-18 20:30:24 +00001284 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001285 if (res >= 0)
1286 put_packet(s, "OK");
1287 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001288 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001289 else
1290 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001291 break;
aliguori880a7572008-11-18 20:30:24 +00001292 case 'H':
1293 type = *p++;
1294 thread = strtoull(p, (char **)&p, 16);
1295 if (thread == -1 || thread == 0) {
1296 put_packet(s, "OK");
1297 break;
1298 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001299 cpu = find_cpu(thread);
1300 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001301 put_packet(s, "E22");
1302 break;
1303 }
1304 switch (type) {
1305 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001306 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001307 put_packet(s, "OK");
1308 break;
1309 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001310 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001311 put_packet(s, "OK");
1312 break;
1313 default:
1314 put_packet(s, "E22");
1315 break;
1316 }
1317 break;
1318 case 'T':
1319 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001320 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001321
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001322 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001323 put_packet(s, "OK");
1324 } else {
aliguori880a7572008-11-18 20:30:24 +00001325 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001326 }
aliguori880a7572008-11-18 20:30:24 +00001327 break;
pbrook978efd62006-06-17 18:30:42 +00001328 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001329 case 'Q':
1330 /* parse any 'q' packets here */
1331 if (!strcmp(p,"qemu.sstepbits")) {
1332 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001333 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1334 SSTEP_ENABLE,
1335 SSTEP_NOIRQ,
1336 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001337 put_packet(s, buf);
1338 break;
Jan Kiszka4dabe742015-02-07 09:38:43 +01001339 } else if (is_query_packet(p, "qemu.sstep", '=')) {
edgar_igl60897d32008-05-09 08:25:14 +00001340 /* Display or change the sstep_flags */
1341 p += 10;
1342 if (*p != '=') {
1343 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001344 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001345 put_packet(s, buf);
1346 break;
1347 }
1348 p++;
1349 type = strtoul(p, (char **)&p, 16);
1350 sstep_flags = type;
1351 put_packet(s, "OK");
1352 break;
aliguori880a7572008-11-18 20:30:24 +00001353 } else if (strcmp(p,"C") == 0) {
1354 /* "Current thread" remains vague in the spec, so always return
1355 * the first CPU (gdb returns the first thread). */
1356 put_packet(s, "QC1");
1357 break;
1358 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001359 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001360 goto report_cpuinfo;
1361 } else if (strcmp(p,"sThreadInfo") == 0) {
1362 report_cpuinfo:
1363 if (s->query_cpu) {
Alex Bennéed2a6c852017-07-12 11:52:14 +01001364 snprintf(buf, sizeof(buf), "m%x", cpu_gdb_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001365 put_packet(s, buf);
Andreas Färberbdc44642013-06-24 23:50:24 +02001366 s->query_cpu = CPU_NEXT(s->query_cpu);
aliguori880a7572008-11-18 20:30:24 +00001367 } else
1368 put_packet(s, "l");
1369 break;
1370 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1371 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001372 cpu = find_cpu(thread);
1373 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001374 cpu_synchronize_state(cpu);
Kevin Wolf5accecb2015-10-13 09:38:50 +02001375 /* memtohex() doubles the required space */
1376 len = snprintf((char *)mem_buf, sizeof(buf) / 2,
Andreas Färber55e5c282012-12-17 06:18:02 +01001377 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001378 cpu->halted ? "halted " : "running");
Doug Gale5c9522b2017-12-02 20:30:37 -05001379 trace_gdbstub_op_extra_info((char *)mem_buf);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001380 memtohex(buf, mem_buf, len);
1381 put_packet(s, buf);
1382 }
aliguori880a7572008-11-18 20:30:24 +00001383 break;
edgar_igl60897d32008-05-09 08:25:14 +00001384 }
blueswir10b8a9882009-03-07 10:51:36 +00001385#ifdef CONFIG_USER_ONLY
Jan Kiszka070949f2015-02-07 09:38:42 +01001386 else if (strcmp(p, "Offsets") == 0) {
Andreas Färber0429a972013-08-26 18:14:44 +02001387 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00001388
blueswir1363a37d2008-08-21 17:58:08 +00001389 snprintf(buf, sizeof(buf),
1390 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1391 ";Bss=" TARGET_ABI_FMT_lx,
1392 ts->info->code_offset,
1393 ts->info->data_offset,
1394 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001395 put_packet(s, buf);
1396 break;
1397 }
blueswir10b8a9882009-03-07 10:51:36 +00001398#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001399 else if (strncmp(p, "Rcmd,", 5) == 0) {
1400 int len = strlen(p + 5);
1401
1402 if ((len % 2) != 0) {
1403 put_packet(s, "E01");
1404 break;
1405 }
aliguori8a34a0f2009-03-05 23:01:55 +00001406 len = len / 2;
Kevin Wolf5accecb2015-10-13 09:38:50 +02001407 hextomem(mem_buf, p + 5, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001408 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001409 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001410 put_packet(s, "OK");
1411 break;
1412 }
blueswir10b8a9882009-03-07 10:51:36 +00001413#endif /* !CONFIG_USER_ONLY */
Jan Kiszka4dabe742015-02-07 09:38:43 +01001414 if (is_query_packet(p, "Supported", ':')) {
blueswir15b3715b2008-10-25 11:18:12 +00001415 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
Andreas Färber5b24c642013-07-07 15:08:22 +02001416 cc = CPU_GET_CLASS(first_cpu);
1417 if (cc->gdb_core_xml_file != NULL) {
1418 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
1419 }
pbrook56aebc82008-10-11 17:55:29 +00001420 put_packet(s, buf);
1421 break;
1422 }
pbrook56aebc82008-10-11 17:55:29 +00001423 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1424 const char *xml;
1425 target_ulong total_len;
1426
Andreas Färber5b24c642013-07-07 15:08:22 +02001427 cc = CPU_GET_CLASS(first_cpu);
1428 if (cc->gdb_core_xml_file == NULL) {
1429 goto unknown_command;
1430 }
1431
Andreas Färber5b50e792013-06-29 04:18:45 +02001432 gdb_has_xml = true;
pbrook56aebc82008-10-11 17:55:29 +00001433 p += 19;
Andreas Färber5b24c642013-07-07 15:08:22 +02001434 xml = get_feature_xml(p, &p, cc);
pbrook56aebc82008-10-11 17:55:29 +00001435 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001436 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001437 put_packet(s, buf);
1438 break;
1439 }
1440
1441 if (*p == ':')
1442 p++;
1443 addr = strtoul(p, (char **)&p, 16);
1444 if (*p == ',')
1445 p++;
1446 len = strtoul(p, (char **)&p, 16);
1447
1448 total_len = strlen(xml);
1449 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001450 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001451 put_packet(s, buf);
1452 break;
1453 }
1454 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1455 len = (MAX_PACKET_LENGTH - 5) / 2;
1456 if (len < total_len - addr) {
1457 buf[0] = 'm';
1458 len = memtox(buf + 1, xml + addr, len);
1459 } else {
1460 buf[0] = 'l';
1461 len = memtox(buf + 1, xml + addr, total_len - addr);
1462 }
Doug Gale5c9522b2017-12-02 20:30:37 -05001463 put_packet_binary(s, buf, len + 1, true);
pbrook56aebc82008-10-11 17:55:29 +00001464 break;
1465 }
Jan Kiszkaa3919382015-02-07 09:38:44 +01001466 if (is_query_packet(p, "Attached", ':')) {
1467 put_packet(s, GDB_ATTACHED);
1468 break;
1469 }
pbrook56aebc82008-10-11 17:55:29 +00001470 /* Unrecognised 'q' command. */
1471 goto unknown_command;
1472
bellard858693c2004-03-31 18:52:07 +00001473 default:
pbrook56aebc82008-10-11 17:55:29 +00001474 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001475 /* put empty packet */
1476 buf[0] = '\0';
1477 put_packet(s, buf);
1478 break;
1479 }
1480 return RS_IDLE;
1481}
1482
Andreas Färber64f6b342013-05-27 02:06:09 +02001483void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001484{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001485 gdbserver_state->c_cpu = cpu;
1486 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001487}
1488
bellard1fddef42005-04-17 19:16:13 +00001489#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001490static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001491{
aliguori880a7572008-11-18 20:30:24 +00001492 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001493 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001494 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001495 const char *type;
bellard858693c2004-03-31 18:52:07 +00001496 int ret;
1497
Meador Ingecdb432b2012-03-15 17:49:45 +00001498 if (running || s->state == RS_INACTIVE) {
1499 return;
1500 }
1501 /* Is there a GDB syscall waiting to be sent? */
1502 if (s->current_syscall_cb) {
1503 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001504 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001505 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001506 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001507 case RUN_STATE_DEBUG:
Andreas Färberff4700b2013-08-26 18:23:18 +02001508 if (cpu->watchpoint_hit) {
1509 switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001510 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001511 type = "r";
1512 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001513 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001514 type = "a";
1515 break;
1516 default:
1517 type = "";
1518 break;
1519 }
Doug Gale5c9522b2017-12-02 20:30:37 -05001520 trace_gdbstub_hit_watchpoint(type, cpu_gdb_index(cpu),
1521 (target_ulong)cpu->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001522 snprintf(buf, sizeof(buf),
1523 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Alex Bennéed2a6c852017-07-12 11:52:14 +01001524 GDB_SIGNAL_TRAP, cpu_gdb_index(cpu), type,
Andreas Färberff4700b2013-08-26 18:23:18 +02001525 (target_ulong)cpu->watchpoint_hit->vaddr);
1526 cpu->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001527 goto send_packet;
Doug Gale5c9522b2017-12-02 20:30:37 -05001528 } else {
1529 trace_gdbstub_hit_break();
pbrook6658ffb2007-03-16 23:58:11 +00001530 }
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001531 tb_flush(cpu);
aurel32ca587a82008-12-18 22:44:13 +00001532 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001533 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001534 case RUN_STATE_PAUSED:
Doug Gale5c9522b2017-12-02 20:30:37 -05001535 trace_gdbstub_hit_paused();
aliguori9781e042009-01-22 17:15:29 +00001536 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001537 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001538 case RUN_STATE_SHUTDOWN:
Doug Gale5c9522b2017-12-02 20:30:37 -05001539 trace_gdbstub_hit_shutdown();
Jan Kiszka425189a2011-03-22 11:02:09 +01001540 ret = GDB_SIGNAL_QUIT;
1541 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001542 case RUN_STATE_IO_ERROR:
Doug Gale5c9522b2017-12-02 20:30:37 -05001543 trace_gdbstub_hit_io_error();
Jan Kiszka425189a2011-03-22 11:02:09 +01001544 ret = GDB_SIGNAL_IO;
1545 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001546 case RUN_STATE_WATCHDOG:
Doug Gale5c9522b2017-12-02 20:30:37 -05001547 trace_gdbstub_hit_watchdog();
Jan Kiszka425189a2011-03-22 11:02:09 +01001548 ret = GDB_SIGNAL_ALRM;
1549 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001550 case RUN_STATE_INTERNAL_ERROR:
Doug Gale5c9522b2017-12-02 20:30:37 -05001551 trace_gdbstub_hit_internal_error();
Jan Kiszka425189a2011-03-22 11:02:09 +01001552 ret = GDB_SIGNAL_ABRT;
1553 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001554 case RUN_STATE_SAVE_VM:
1555 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001556 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001557 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001558 ret = GDB_SIGNAL_XCPU;
1559 break;
1560 default:
Doug Gale5c9522b2017-12-02 20:30:37 -05001561 trace_gdbstub_hit_unknown(state);
Jan Kiszka425189a2011-03-22 11:02:09 +01001562 ret = GDB_SIGNAL_UNKNOWN;
1563 break;
bellardbbeb7b52006-04-23 18:42:15 +00001564 }
Jan Kiszka226d0072015-07-24 18:52:31 +02001565 gdb_set_stop_cpu(cpu);
Alex Bennéed2a6c852017-07-12 11:52:14 +01001566 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_gdb_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001567
1568send_packet:
bellard858693c2004-03-31 18:52:07 +00001569 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001570
1571 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001572 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001573}
bellard1fddef42005-04-17 19:16:13 +00001574#endif
bellard858693c2004-03-31 18:52:07 +00001575
pbrooka2d1eba2007-01-28 03:10:55 +00001576/* Send a gdb syscall request.
1577 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001578 %x - target_ulong argument printed in hex.
1579 %lx - 64-bit argument printed in hex.
1580 %s - string pointer (target_ulong) and length (int) pair. */
Peter Maydell19239b32015-09-07 10:39:27 +01001581void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
pbrooka2d1eba2007-01-28 03:10:55 +00001582{
pbrooka2d1eba2007-01-28 03:10:55 +00001583 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001584 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001585 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001586 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001587 GDBState *s;
1588
aliguori880a7572008-11-18 20:30:24 +00001589 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001590 if (!s)
1591 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001592 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001593#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001594 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001595#endif
Meador Ingecdb432b2012-03-15 17:49:45 +00001596 p = s->syscall_buf;
1597 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001598 *(p++) = 'F';
1599 while (*fmt) {
1600 if (*fmt == '%') {
1601 fmt++;
1602 switch (*fmt++) {
1603 case 'x':
1604 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001605 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001606 break;
pbrooka87295e2007-05-26 15:09:38 +00001607 case 'l':
1608 if (*(fmt++) != 'x')
1609 goto bad_format;
1610 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001611 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001612 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001613 case 's':
1614 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001615 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001616 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001617 break;
1618 default:
pbrooka87295e2007-05-26 15:09:38 +00001619 bad_format:
Ziyue Yang7ae6c572017-01-18 16:03:29 +08001620 error_report("gdbstub: Bad syscall format string '%s'",
1621 fmt - 1);
pbrooka2d1eba2007-01-28 03:10:55 +00001622 break;
1623 }
1624 } else {
1625 *(p++) = *(fmt++);
1626 }
1627 }
pbrook8a93e022007-08-06 13:19:15 +00001628 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001629#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001630 put_packet(s, s->syscall_buf);
Peter Maydell4f710862018-05-15 19:19:58 +01001631 /* Return control to gdb for it to process the syscall request.
1632 * Since the protocol requires that gdb hands control back to us
1633 * using a "here are the results" F packet, we don't need to check
1634 * gdb_handlesig's return value (which is the signal to deliver if
1635 * execution was resumed via a continue packet).
1636 */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001637 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001638#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001639 /* In this case wait to send the syscall packet until notification that
1640 the CPU has stopped. This must be done because if the packet is sent
1641 now the reply from the syscall request could be received while the CPU
1642 is still in the running state, which can cause packets to be dropped
1643 and state transition 'T' packets to be sent while the syscall is still
1644 being processed. */
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001645 qemu_cpu_kick(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001646#endif
1647}
1648
Peter Maydell19239b32015-09-07 10:39:27 +01001649void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
1650{
1651 va_list va;
1652
1653 va_start(va, fmt);
1654 gdb_do_syscallv(cb, fmt, va);
1655 va_end(va);
1656}
1657
bellard6a00d602005-11-21 23:25:50 +00001658static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001659{
ths60fe76f2007-12-16 03:02:09 +00001660 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001661
bellard1fddef42005-04-17 19:16:13 +00001662#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001663 if (s->last_packet_len) {
1664 /* Waiting for a response to the last packet. If we see the start
1665 of a new command then abandon the previous response. */
1666 if (ch == '-') {
Doug Gale5c9522b2017-12-02 20:30:37 -05001667 trace_gdbstub_err_got_nack();
thsffe8ab82007-12-16 03:16:05 +00001668 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
Alex Bennée118e2262017-07-12 11:52:13 +01001669 } else if (ch == '+') {
Doug Gale5c9522b2017-12-02 20:30:37 -05001670 trace_gdbstub_io_got_ack();
Alex Bennée118e2262017-07-12 11:52:13 +01001671 } else {
Doug Gale5c9522b2017-12-02 20:30:37 -05001672 trace_gdbstub_io_got_unexpected((uint8_t)ch);
pbrook4046d912007-01-28 01:53:16 +00001673 }
Alex Bennée118e2262017-07-12 11:52:13 +01001674
pbrook4046d912007-01-28 01:53:16 +00001675 if (ch == '+' || ch == '$')
1676 s->last_packet_len = 0;
1677 if (ch != '$')
1678 return;
1679 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001680 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001681 /* when the CPU is running, we cannot do anything except stop
1682 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001683 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001684 } else
bellard1fddef42005-04-17 19:16:13 +00001685#endif
bellard41625032005-04-24 10:07:11 +00001686 {
bellard858693c2004-03-31 18:52:07 +00001687 switch(s->state) {
1688 case RS_IDLE:
1689 if (ch == '$') {
Doug Gale4bf43122017-05-01 12:22:10 -04001690 /* start of command packet */
bellard858693c2004-03-31 18:52:07 +00001691 s->line_buf_index = 0;
Doug Gale4bf43122017-05-01 12:22:10 -04001692 s->line_sum = 0;
bellard858693c2004-03-31 18:52:07 +00001693 s->state = RS_GETLINE;
Doug Gale4bf43122017-05-01 12:22:10 -04001694 } else {
Doug Gale5c9522b2017-12-02 20:30:37 -05001695 trace_gdbstub_err_garbage((uint8_t)ch);
bellard4c3a88a2003-07-26 12:06:08 +00001696 }
1697 break;
bellard858693c2004-03-31 18:52:07 +00001698 case RS_GETLINE:
Doug Gale4bf43122017-05-01 12:22:10 -04001699 if (ch == '}') {
1700 /* start escape sequence */
1701 s->state = RS_GETLINE_ESC;
1702 s->line_sum += ch;
1703 } else if (ch == '*') {
1704 /* start run length encoding sequence */
1705 s->state = RS_GETLINE_RLE;
1706 s->line_sum += ch;
1707 } else if (ch == '#') {
1708 /* end of command, start of checksum*/
1709 s->state = RS_CHKSUM1;
bellard858693c2004-03-31 18:52:07 +00001710 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
Doug Gale5c9522b2017-12-02 20:30:37 -05001711 trace_gdbstub_err_overrun();
bellard858693c2004-03-31 18:52:07 +00001712 s->state = RS_IDLE;
1713 } else {
Doug Gale4bf43122017-05-01 12:22:10 -04001714 /* unescaped command character */
1715 s->line_buf[s->line_buf_index++] = ch;
1716 s->line_sum += ch;
1717 }
1718 break;
1719 case RS_GETLINE_ESC:
1720 if (ch == '#') {
1721 /* unexpected end of command in escape sequence */
1722 s->state = RS_CHKSUM1;
1723 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1724 /* command buffer overrun */
Doug Gale5c9522b2017-12-02 20:30:37 -05001725 trace_gdbstub_err_overrun();
Doug Gale4bf43122017-05-01 12:22:10 -04001726 s->state = RS_IDLE;
1727 } else {
1728 /* parse escaped character and leave escape state */
1729 s->line_buf[s->line_buf_index++] = ch ^ 0x20;
1730 s->line_sum += ch;
1731 s->state = RS_GETLINE;
1732 }
1733 break;
1734 case RS_GETLINE_RLE:
1735 if (ch < ' ') {
1736 /* invalid RLE count encoding */
Doug Gale5c9522b2017-12-02 20:30:37 -05001737 trace_gdbstub_err_invalid_repeat((uint8_t)ch);
Doug Gale4bf43122017-05-01 12:22:10 -04001738 s->state = RS_GETLINE;
1739 } else {
1740 /* decode repeat length */
1741 int repeat = (unsigned char)ch - ' ' + 3;
1742 if (s->line_buf_index + repeat >= sizeof(s->line_buf) - 1) {
1743 /* that many repeats would overrun the command buffer */
Doug Gale5c9522b2017-12-02 20:30:37 -05001744 trace_gdbstub_err_overrun();
Doug Gale4bf43122017-05-01 12:22:10 -04001745 s->state = RS_IDLE;
1746 } else if (s->line_buf_index < 1) {
1747 /* got a repeat but we have nothing to repeat */
Doug Gale5c9522b2017-12-02 20:30:37 -05001748 trace_gdbstub_err_invalid_rle();
Doug Gale4bf43122017-05-01 12:22:10 -04001749 s->state = RS_GETLINE;
1750 } else {
1751 /* repeat the last character */
1752 memset(s->line_buf + s->line_buf_index,
1753 s->line_buf[s->line_buf_index - 1], repeat);
1754 s->line_buf_index += repeat;
1755 s->line_sum += ch;
1756 s->state = RS_GETLINE;
1757 }
bellard858693c2004-03-31 18:52:07 +00001758 }
1759 break;
1760 case RS_CHKSUM1:
Doug Gale4bf43122017-05-01 12:22:10 -04001761 /* get high hex digit of checksum */
1762 if (!isxdigit(ch)) {
Doug Gale5c9522b2017-12-02 20:30:37 -05001763 trace_gdbstub_err_checksum_invalid((uint8_t)ch);
Doug Gale4bf43122017-05-01 12:22:10 -04001764 s->state = RS_GETLINE;
1765 break;
1766 }
bellard858693c2004-03-31 18:52:07 +00001767 s->line_buf[s->line_buf_index] = '\0';
1768 s->line_csum = fromhex(ch) << 4;
1769 s->state = RS_CHKSUM2;
1770 break;
1771 case RS_CHKSUM2:
Doug Gale4bf43122017-05-01 12:22:10 -04001772 /* get low hex digit of checksum */
1773 if (!isxdigit(ch)) {
Doug Gale5c9522b2017-12-02 20:30:37 -05001774 trace_gdbstub_err_checksum_invalid((uint8_t)ch);
Doug Gale4bf43122017-05-01 12:22:10 -04001775 s->state = RS_GETLINE;
1776 break;
bellard858693c2004-03-31 18:52:07 +00001777 }
Doug Gale4bf43122017-05-01 12:22:10 -04001778 s->line_csum |= fromhex(ch);
1779
1780 if (s->line_csum != (s->line_sum & 0xff)) {
Doug Gale5c9522b2017-12-02 20:30:37 -05001781 trace_gdbstub_err_checksum_incorrect(s->line_sum, s->line_csum);
Doug Gale4bf43122017-05-01 12:22:10 -04001782 /* send NAK reply */
ths60fe76f2007-12-16 03:02:09 +00001783 reply = '-';
1784 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001785 s->state = RS_IDLE;
1786 } else {
Doug Gale4bf43122017-05-01 12:22:10 -04001787 /* send ACK reply */
ths60fe76f2007-12-16 03:02:09 +00001788 reply = '+';
1789 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001790 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001791 }
bellardb4608c02003-06-27 17:34:32 +00001792 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001793 default:
1794 abort();
bellardb4608c02003-06-27 17:34:32 +00001795 }
1796 }
bellard858693c2004-03-31 18:52:07 +00001797}
1798
Paul Brook0e1c9c52010-06-16 13:03:51 +01001799/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001800void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001801{
1802 GDBState *s;
1803 char buf[4];
1804
1805 s = gdbserver_state;
1806 if (!s) {
1807 return;
1808 }
1809#ifdef CONFIG_USER_ONLY
1810 if (gdbserver_fd < 0 || s->fd < 0) {
1811 return;
1812 }
1813#endif
1814
Doug Gale5c9522b2017-12-02 20:30:37 -05001815 trace_gdbstub_op_exiting((uint8_t)code);
1816
Paul Brook0e1c9c52010-06-16 13:03:51 +01001817 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1818 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001819
1820#ifndef CONFIG_USER_ONLY
Marc-André Lureau1ce26102017-01-27 00:49:13 +04001821 qemu_chr_fe_deinit(&s->chr, true);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001822#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001823}
1824
Luc Michel8f468632019-01-07 15:23:45 +00001825/*
1826 * Create the process that will contain all the "orphan" CPUs (that are not
1827 * part of a CPU cluster). Note that if this process contains no CPUs, it won't
1828 * be attachable and thus will be invisible to the user.
1829 */
1830static void create_default_process(GDBState *s)
1831{
1832 GDBProcess *process;
1833 int max_pid = 0;
1834
1835 if (s->process_num) {
1836 max_pid = s->processes[s->process_num - 1].pid;
1837 }
1838
1839 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
1840 process = &s->processes[s->process_num - 1];
1841
1842 /* We need an available PID slot for this process */
1843 assert(max_pid < UINT32_MAX);
1844
1845 process->pid = max_pid + 1;
1846 process->attached = false;
1847}
1848
bellard1fddef42005-04-17 19:16:13 +00001849#ifdef CONFIG_USER_ONLY
1850int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001851gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001852{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001853 GDBState *s;
1854 char buf[256];
1855 int n;
bellard1fddef42005-04-17 19:16:13 +00001856
Andreas Färber5ca666c2013-06-24 19:20:57 +02001857 s = gdbserver_state;
1858 if (gdbserver_fd < 0 || s->fd < 0) {
1859 return sig;
bellard1fddef42005-04-17 19:16:13 +00001860 }
1861
Andreas Färber5ca666c2013-06-24 19:20:57 +02001862 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001863 cpu_single_step(cpu, 0);
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001864 tb_flush(cpu);
bellard1fddef42005-04-17 19:16:13 +00001865
Andreas Färber5ca666c2013-06-24 19:20:57 +02001866 if (sig != 0) {
1867 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1868 put_packet(s, buf);
1869 }
1870 /* put_packet() might have detected that the peer terminated the
1871 connection. */
1872 if (s->fd < 0) {
1873 return sig;
1874 }
1875
1876 sig = 0;
1877 s->state = RS_IDLE;
1878 s->running_state = 0;
1879 while (s->running_state == 0) {
1880 n = read(s->fd, buf, 256);
1881 if (n > 0) {
1882 int i;
1883
1884 for (i = 0; i < n; i++) {
1885 gdb_read_byte(s, buf[i]);
1886 }
Peter Wu5819e3e2016-06-05 16:35:48 +02001887 } else {
Andreas Färber5ca666c2013-06-24 19:20:57 +02001888 /* XXX: Connection closed. Should probably wait for another
1889 connection before continuing. */
Peter Wu5819e3e2016-06-05 16:35:48 +02001890 if (n == 0) {
1891 close(s->fd);
1892 }
1893 s->fd = -1;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001894 return sig;
bellard1fddef42005-04-17 19:16:13 +00001895 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001896 }
1897 sig = s->signal;
1898 s->signal = 0;
1899 return sig;
bellard1fddef42005-04-17 19:16:13 +00001900}
bellarde9009672005-04-26 20:42:36 +00001901
aurel32ca587a82008-12-18 22:44:13 +00001902/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001903void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001904{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001905 GDBState *s;
1906 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001907
Andreas Färber5ca666c2013-06-24 19:20:57 +02001908 s = gdbserver_state;
1909 if (gdbserver_fd < 0 || s->fd < 0) {
1910 return;
1911 }
aurel32ca587a82008-12-18 22:44:13 +00001912
Andreas Färber5ca666c2013-06-24 19:20:57 +02001913 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1914 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001915}
bellard1fddef42005-04-17 19:16:13 +00001916
Peter Maydell2f652222018-05-14 18:30:44 +01001917static bool gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001918{
1919 GDBState *s;
1920 struct sockaddr_in sockaddr;
1921 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001922 int fd;
bellard858693c2004-03-31 18:52:07 +00001923
1924 for(;;) {
1925 len = sizeof(sockaddr);
1926 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1927 if (fd < 0 && errno != EINTR) {
1928 perror("accept");
Peter Maydell2f652222018-05-14 18:30:44 +01001929 return false;
bellard858693c2004-03-31 18:52:07 +00001930 } else if (fd >= 0) {
Peter Maydellf5bdd782018-05-14 18:30:43 +01001931 qemu_set_cloexec(fd);
bellard858693c2004-03-31 18:52:07 +00001932 break;
1933 }
1934 }
1935
1936 /* set short latency */
Peter Maydell2f652222018-05-14 18:30:44 +01001937 if (socket_set_nodelay(fd)) {
1938 perror("setsockopt");
Philippe Mathieu-Daudéead75d82018-05-24 19:34:58 -03001939 close(fd);
Peter Maydell2f652222018-05-14 18:30:44 +01001940 return false;
1941 }
ths3b46e622007-09-17 08:09:54 +00001942
Anthony Liguori7267c092011-08-20 22:09:37 -05001943 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001944 s->c_cpu = first_cpu;
1945 s->g_cpu = first_cpu;
Luc Michel8f468632019-01-07 15:23:45 +00001946 create_default_process(s);
bellard858693c2004-03-31 18:52:07 +00001947 s->fd = fd;
Andreas Färber5b50e792013-06-29 04:18:45 +02001948 gdb_has_xml = false;
bellard858693c2004-03-31 18:52:07 +00001949
aliguori880a7572008-11-18 20:30:24 +00001950 gdbserver_state = s;
Peter Maydell2f652222018-05-14 18:30:44 +01001951 return true;
bellard858693c2004-03-31 18:52:07 +00001952}
1953
1954static int gdbserver_open(int port)
1955{
1956 struct sockaddr_in sockaddr;
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001957 int fd, ret;
bellard858693c2004-03-31 18:52:07 +00001958
1959 fd = socket(PF_INET, SOCK_STREAM, 0);
1960 if (fd < 0) {
1961 perror("socket");
1962 return -1;
1963 }
Peter Maydellf5bdd782018-05-14 18:30:43 +01001964 qemu_set_cloexec(fd);
bellard858693c2004-03-31 18:52:07 +00001965
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001966 socket_set_fast_reuse(fd);
bellard858693c2004-03-31 18:52:07 +00001967
1968 sockaddr.sin_family = AF_INET;
1969 sockaddr.sin_port = htons(port);
1970 sockaddr.sin_addr.s_addr = 0;
1971 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1972 if (ret < 0) {
1973 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001974 close(fd);
bellard858693c2004-03-31 18:52:07 +00001975 return -1;
1976 }
Peter Wu96165b92016-05-04 11:32:17 +02001977 ret = listen(fd, 1);
bellard858693c2004-03-31 18:52:07 +00001978 if (ret < 0) {
1979 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001980 close(fd);
bellard858693c2004-03-31 18:52:07 +00001981 return -1;
1982 }
bellard858693c2004-03-31 18:52:07 +00001983 return fd;
1984}
1985
1986int gdbserver_start(int port)
1987{
1988 gdbserver_fd = gdbserver_open(port);
1989 if (gdbserver_fd < 0)
1990 return -1;
1991 /* accept connections */
Peter Maydell2f652222018-05-14 18:30:44 +01001992 if (!gdb_accept()) {
1993 close(gdbserver_fd);
1994 gdbserver_fd = -1;
1995 return -1;
1996 }
bellardb4608c02003-06-27 17:34:32 +00001997 return 0;
1998}
aurel322b1319c2008-12-18 22:44:04 +00001999
2000/* Disable gdb stub for child processes. */
Peter Crosthwaitef7ec7f72015-06-23 19:31:16 -07002001void gdbserver_fork(CPUState *cpu)
aurel322b1319c2008-12-18 22:44:04 +00002002{
2003 GDBState *s = gdbserver_state;
Andreas Färber75a34032013-09-02 16:57:02 +02002004
2005 if (gdbserver_fd < 0 || s->fd < 0) {
2006 return;
2007 }
aurel322b1319c2008-12-18 22:44:04 +00002008 close(s->fd);
2009 s->fd = -1;
Andreas Färberb3310ab2013-09-02 17:26:20 +02002010 cpu_breakpoint_remove_all(cpu, BP_GDB);
Andreas Färber75a34032013-09-02 16:57:02 +02002011 cpu_watchpoint_remove_all(cpu, BP_GDB);
aurel322b1319c2008-12-18 22:44:04 +00002012}
pbrook4046d912007-01-28 01:53:16 +00002013#else
thsaa1f17c2007-07-11 22:48:58 +00002014static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002015{
pbrook56aebc82008-10-11 17:55:29 +00002016 /* We can handle an arbitrarily large amount of data.
2017 Pick the maximum packet size, which is as good as anything. */
2018 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002019}
2020
thsaa1f17c2007-07-11 22:48:58 +00002021static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002022{
pbrook4046d912007-01-28 01:53:16 +00002023 int i;
2024
2025 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002026 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002027 }
2028}
2029
2030static void gdb_chr_event(void *opaque, int event)
2031{
2032 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302033 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002034 vm_stop(RUN_STATE_PAUSED);
Andreas Färber5b50e792013-06-29 04:18:45 +02002035 gdb_has_xml = false;
pbrook4046d912007-01-28 01:53:16 +00002036 break;
2037 default:
2038 break;
2039 }
2040}
2041
aliguori8a34a0f2009-03-05 23:01:55 +00002042static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2043{
2044 char buf[MAX_PACKET_LENGTH];
2045
2046 buf[0] = 'O';
2047 if (len > (MAX_PACKET_LENGTH/2) - 1)
2048 len = (MAX_PACKET_LENGTH/2) - 1;
2049 memtohex(buf + 1, (uint8_t *)msg, len);
2050 put_packet(s, buf);
2051}
2052
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03002053static int gdb_monitor_write(Chardev *chr, const uint8_t *buf, int len)
aliguori8a34a0f2009-03-05 23:01:55 +00002054{
2055 const char *p = (const char *)buf;
2056 int max_sz;
2057
2058 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2059 for (;;) {
2060 if (len <= max_sz) {
2061 gdb_monitor_output(gdbserver_state, p, len);
2062 break;
2063 }
2064 gdb_monitor_output(gdbserver_state, p, max_sz);
2065 p += max_sz;
2066 len -= max_sz;
2067 }
2068 return len;
2069}
2070
aliguori59030a82009-04-05 18:43:41 +00002071#ifndef _WIN32
2072static void gdb_sigterm_handler(int signal)
2073{
Luiz Capitulino13548692011-07-29 15:36:43 -03002074 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002075 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002076 }
aliguori59030a82009-04-05 18:43:41 +00002077}
2078#endif
2079
Marc-André Lureau777357d2016-12-07 18:39:10 +03002080static void gdb_monitor_open(Chardev *chr, ChardevBackend *backend,
2081 bool *be_opened, Error **errp)
2082{
2083 *be_opened = false;
2084}
2085
2086static void char_gdb_class_init(ObjectClass *oc, void *data)
2087{
2088 ChardevClass *cc = CHARDEV_CLASS(oc);
2089
2090 cc->internal = true;
2091 cc->open = gdb_monitor_open;
2092 cc->chr_write = gdb_monitor_write;
2093}
2094
2095#define TYPE_CHARDEV_GDB "chardev-gdb"
2096
2097static const TypeInfo char_gdb_type_info = {
2098 .name = TYPE_CHARDEV_GDB,
2099 .parent = TYPE_CHARDEV,
2100 .class_init = char_gdb_class_init,
2101};
2102
Luc Michel8f468632019-01-07 15:23:45 +00002103static int find_cpu_clusters(Object *child, void *opaque)
2104{
2105 if (object_dynamic_cast(child, TYPE_CPU_CLUSTER)) {
2106 GDBState *s = (GDBState *) opaque;
2107 CPUClusterState *cluster = CPU_CLUSTER(child);
2108 GDBProcess *process;
2109
2110 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num);
2111
2112 process = &s->processes[s->process_num - 1];
2113
2114 /*
2115 * GDB process IDs -1 and 0 are reserved. To avoid subtle errors at
2116 * runtime, we enforce here that the machine does not use a cluster ID
2117 * that would lead to PID 0.
2118 */
2119 assert(cluster->cluster_id != UINT32_MAX);
2120 process->pid = cluster->cluster_id + 1;
2121 process->attached = false;
2122
2123 return 0;
2124 }
2125
2126 return object_child_foreach(child, find_cpu_clusters, opaque);
2127}
2128
2129static int pid_order(const void *a, const void *b)
2130{
2131 GDBProcess *pa = (GDBProcess *) a;
2132 GDBProcess *pb = (GDBProcess *) b;
2133
2134 if (pa->pid < pb->pid) {
2135 return -1;
2136 } else if (pa->pid > pb->pid) {
2137 return 1;
2138 } else {
2139 return 0;
2140 }
2141}
2142
2143static void create_processes(GDBState *s)
2144{
2145 object_child_foreach(object_get_root(), find_cpu_clusters, s);
2146
2147 if (s->processes) {
2148 /* Sort by PID */
2149 qsort(s->processes, s->process_num, sizeof(s->processes[0]), pid_order);
2150 }
2151
2152 create_default_process(s);
2153}
2154
2155static void cleanup_processes(GDBState *s)
2156{
2157 g_free(s->processes);
2158 s->process_num = 0;
2159 s->processes = NULL;
2160}
2161
aliguori59030a82009-04-05 18:43:41 +00002162int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002163{
Doug Gale5c9522b2017-12-02 20:30:37 -05002164 trace_gdbstub_op_start(device);
2165
pbrook4046d912007-01-28 01:53:16 +00002166 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002167 char gdbstub_device_name[128];
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03002168 Chardev *chr = NULL;
2169 Chardev *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002170
Ziyue Yang508b4ec2017-01-18 16:02:41 +08002171 if (!first_cpu) {
2172 error_report("gdbstub: meaningless to attach gdb to a "
2173 "machine without any CPU.");
2174 return -1;
2175 }
2176
aliguori59030a82009-04-05 18:43:41 +00002177 if (!device)
2178 return -1;
2179 if (strcmp(device, "none") != 0) {
2180 if (strstart(device, "tcp:", NULL)) {
2181 /* enforce required TCP attributes */
2182 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2183 "%s,nowait,nodelay,server", device);
2184 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002185 }
aliguori59030a82009-04-05 18:43:41 +00002186#ifndef _WIN32
2187 else if (strcmp(device, "stdio") == 0) {
2188 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002189
aliguori59030a82009-04-05 18:43:41 +00002190 memset(&act, 0, sizeof(act));
2191 act.sa_handler = gdb_sigterm_handler;
2192 sigaction(SIGINT, &act, NULL);
2193 }
2194#endif
Marc-André Lureau95e30b22018-08-22 19:19:42 +02002195 /*
2196 * FIXME: it's a bit weird to allow using a mux chardev here
2197 * and implicitly setup a monitor. We may want to break this.
2198 */
2199 chr = qemu_chr_new_noreplay("gdb", device, true);
aliguori36556b22009-03-28 18:05:53 +00002200 if (!chr)
2201 return -1;
pbrookcfc34752007-02-22 01:48:01 +00002202 }
2203
aliguori36556b22009-03-28 18:05:53 +00002204 s = gdbserver_state;
2205 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002206 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002207 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002208
aliguori36556b22009-03-28 18:05:53 +00002209 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2210
2211 /* Initialize a monitor terminal for gdb */
Marc-André Lureau777357d2016-12-07 18:39:10 +03002212 mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
2213 NULL, &error_abort);
aliguori36556b22009-03-28 18:05:53 +00002214 monitor_init(mon_chr, 0);
2215 } else {
Marc-André Lureau1ce26102017-01-27 00:49:13 +04002216 qemu_chr_fe_deinit(&s->chr, true);
aliguori36556b22009-03-28 18:05:53 +00002217 mon_chr = s->mon_chr;
Luc Michel8f468632019-01-07 15:23:45 +00002218 cleanup_processes(s);
aliguori36556b22009-03-28 18:05:53 +00002219 memset(s, 0, sizeof(GDBState));
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03002220 s->mon_chr = mon_chr;
aliguori36556b22009-03-28 18:05:53 +00002221 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002222 s->c_cpu = first_cpu;
2223 s->g_cpu = first_cpu;
Luc Michel8f468632019-01-07 15:23:45 +00002224
2225 create_processes(s);
2226
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03002227 if (chr) {
2228 qemu_chr_fe_init(&s->chr, chr, &error_abort);
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03002229 qemu_chr_fe_set_handlers(&s->chr, gdb_chr_can_receive, gdb_chr_receive,
Anton Nefedov81517ba2017-07-06 15:08:49 +03002230 gdb_chr_event, NULL, NULL, NULL, true);
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03002231 }
aliguori36556b22009-03-28 18:05:53 +00002232 s->state = chr ? RS_IDLE : RS_INACTIVE;
2233 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002234 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002235
pbrook4046d912007-01-28 01:53:16 +00002236 return 0;
2237}
Marc-André Lureau777357d2016-12-07 18:39:10 +03002238
KONRAD Frederic1bb982b2018-03-20 10:39:33 +01002239void gdbserver_cleanup(void)
2240{
2241 if (gdbserver_state) {
2242 put_packet(gdbserver_state, "W00");
2243 }
2244}
2245
Marc-André Lureau777357d2016-12-07 18:39:10 +03002246static void register_types(void)
2247{
2248 type_register_static(&char_gdb_type_info);
2249}
2250
2251type_init(register_types);
pbrook4046d912007-01-28 01:53:16 +00002252#endif