blob: 991115361e0310dd6615fffcc2d80610ce5b0748 [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"
Paolo Bonzini33c11872016-03-15 16:58:45 +010023#include "cpu.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"
Paolo Bonzinidccfcd02013-04-08 16:55:25 +020028#include "sysemu/char.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010029#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010030#include "exec/gdbstub.h"
bellard1fddef42005-04-17 19:16:13 +000031#endif
bellard67b915a2004-03-31 23:37:16 +000032
pbrook56aebc82008-10-11 17:55:29 +000033#define MAX_PACKET_LENGTH 4096
34
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010035#include "qemu/sockets.h"
Vincent Palatinb3946622017-01-10 11:59:55 +010036#include "sysemu/hw_accel.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010037#include "sysemu/kvm.h"
Leon Alraecfe67ce2015-06-19 14:17:45 +010038#include "exec/semihost.h"
Paolo Bonzini63c91552016-03-15 13:18:37 +010039#include "exec/exec-all.h"
aurel32ca587a82008-12-18 22:44:13 +000040
Jan Kiszkaa3919382015-02-07 09:38:44 +010041#ifdef CONFIG_USER_ONLY
42#define GDB_ATTACHED "0"
43#else
44#define GDB_ATTACHED "1"
45#endif
46
Andreas Färberf3659ee2013-06-27 19:09:09 +020047static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
48 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020049{
Andreas Färberf3659ee2013-06-27 19:09:09 +020050 CPUClass *cc = CPU_GET_CLASS(cpu);
51
52 if (cc->memory_rw_debug) {
53 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
54 }
55 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020056}
aurel32ca587a82008-12-18 22:44:13 +000057
58enum {
59 GDB_SIGNAL_0 = 0,
60 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010061 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000062 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010063 GDB_SIGNAL_ABRT = 6,
64 GDB_SIGNAL_ALRM = 14,
65 GDB_SIGNAL_IO = 23,
66 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000067 GDB_SIGNAL_UNKNOWN = 143
68};
69
70#ifdef CONFIG_USER_ONLY
71
72/* Map target signal numbers to GDB protocol signal numbers and vice
73 * versa. For user emulation's currently supported systems, we can
74 * assume most signals are defined.
75 */
76
77static int gdb_signal_table[] = {
78 0,
79 TARGET_SIGHUP,
80 TARGET_SIGINT,
81 TARGET_SIGQUIT,
82 TARGET_SIGILL,
83 TARGET_SIGTRAP,
84 TARGET_SIGABRT,
85 -1, /* SIGEMT */
86 TARGET_SIGFPE,
87 TARGET_SIGKILL,
88 TARGET_SIGBUS,
89 TARGET_SIGSEGV,
90 TARGET_SIGSYS,
91 TARGET_SIGPIPE,
92 TARGET_SIGALRM,
93 TARGET_SIGTERM,
94 TARGET_SIGURG,
95 TARGET_SIGSTOP,
96 TARGET_SIGTSTP,
97 TARGET_SIGCONT,
98 TARGET_SIGCHLD,
99 TARGET_SIGTTIN,
100 TARGET_SIGTTOU,
101 TARGET_SIGIO,
102 TARGET_SIGXCPU,
103 TARGET_SIGXFSZ,
104 TARGET_SIGVTALRM,
105 TARGET_SIGPROF,
106 TARGET_SIGWINCH,
107 -1, /* SIGLOST */
108 TARGET_SIGUSR1,
109 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000110#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000111 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000112#else
113 -1,
114#endif
aurel32ca587a82008-12-18 22:44:13 +0000115 -1, /* SIGPOLL */
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
123 -1,
124 -1,
125 -1,
126 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000127#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000128 __SIGRTMIN + 1,
129 __SIGRTMIN + 2,
130 __SIGRTMIN + 3,
131 __SIGRTMIN + 4,
132 __SIGRTMIN + 5,
133 __SIGRTMIN + 6,
134 __SIGRTMIN + 7,
135 __SIGRTMIN + 8,
136 __SIGRTMIN + 9,
137 __SIGRTMIN + 10,
138 __SIGRTMIN + 11,
139 __SIGRTMIN + 12,
140 __SIGRTMIN + 13,
141 __SIGRTMIN + 14,
142 __SIGRTMIN + 15,
143 __SIGRTMIN + 16,
144 __SIGRTMIN + 17,
145 __SIGRTMIN + 18,
146 __SIGRTMIN + 19,
147 __SIGRTMIN + 20,
148 __SIGRTMIN + 21,
149 __SIGRTMIN + 22,
150 __SIGRTMIN + 23,
151 __SIGRTMIN + 24,
152 __SIGRTMIN + 25,
153 __SIGRTMIN + 26,
154 __SIGRTMIN + 27,
155 __SIGRTMIN + 28,
156 __SIGRTMIN + 29,
157 __SIGRTMIN + 30,
158 __SIGRTMIN + 31,
159 -1, /* SIGCANCEL */
160 __SIGRTMIN,
161 __SIGRTMIN + 32,
162 __SIGRTMIN + 33,
163 __SIGRTMIN + 34,
164 __SIGRTMIN + 35,
165 __SIGRTMIN + 36,
166 __SIGRTMIN + 37,
167 __SIGRTMIN + 38,
168 __SIGRTMIN + 39,
169 __SIGRTMIN + 40,
170 __SIGRTMIN + 41,
171 __SIGRTMIN + 42,
172 __SIGRTMIN + 43,
173 __SIGRTMIN + 44,
174 __SIGRTMIN + 45,
175 __SIGRTMIN + 46,
176 __SIGRTMIN + 47,
177 __SIGRTMIN + 48,
178 __SIGRTMIN + 49,
179 __SIGRTMIN + 50,
180 __SIGRTMIN + 51,
181 __SIGRTMIN + 52,
182 __SIGRTMIN + 53,
183 __SIGRTMIN + 54,
184 __SIGRTMIN + 55,
185 __SIGRTMIN + 56,
186 __SIGRTMIN + 57,
187 __SIGRTMIN + 58,
188 __SIGRTMIN + 59,
189 __SIGRTMIN + 60,
190 __SIGRTMIN + 61,
191 __SIGRTMIN + 62,
192 __SIGRTMIN + 63,
193 __SIGRTMIN + 64,
194 __SIGRTMIN + 65,
195 __SIGRTMIN + 66,
196 __SIGRTMIN + 67,
197 __SIGRTMIN + 68,
198 __SIGRTMIN + 69,
199 __SIGRTMIN + 70,
200 __SIGRTMIN + 71,
201 __SIGRTMIN + 72,
202 __SIGRTMIN + 73,
203 __SIGRTMIN + 74,
204 __SIGRTMIN + 75,
205 __SIGRTMIN + 76,
206 __SIGRTMIN + 77,
207 __SIGRTMIN + 78,
208 __SIGRTMIN + 79,
209 __SIGRTMIN + 80,
210 __SIGRTMIN + 81,
211 __SIGRTMIN + 82,
212 __SIGRTMIN + 83,
213 __SIGRTMIN + 84,
214 __SIGRTMIN + 85,
215 __SIGRTMIN + 86,
216 __SIGRTMIN + 87,
217 __SIGRTMIN + 88,
218 __SIGRTMIN + 89,
219 __SIGRTMIN + 90,
220 __SIGRTMIN + 91,
221 __SIGRTMIN + 92,
222 __SIGRTMIN + 93,
223 __SIGRTMIN + 94,
224 __SIGRTMIN + 95,
225 -1, /* SIGINFO */
226 -1, /* UNKNOWN */
227 -1, /* DEFAULT */
228 -1,
229 -1,
230 -1,
231 -1,
232 -1,
233 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000234#endif
aurel32ca587a82008-12-18 22:44:13 +0000235};
bellard8f447cc2006-06-14 15:21:14 +0000236#else
aurel32ca587a82008-12-18 22:44:13 +0000237/* In system mode we only need SIGINT and SIGTRAP; other signals
238 are not yet supported. */
239
240enum {
241 TARGET_SIGINT = 2,
242 TARGET_SIGTRAP = 5
243};
244
245static int gdb_signal_table[] = {
246 -1,
247 -1,
248 TARGET_SIGINT,
249 -1,
250 -1,
251 TARGET_SIGTRAP
252};
bellard8f447cc2006-06-14 15:21:14 +0000253#endif
bellardb4608c02003-06-27 17:34:32 +0000254
aurel32ca587a82008-12-18 22:44:13 +0000255#ifdef CONFIG_USER_ONLY
256static int target_signal_to_gdb (int sig)
257{
258 int i;
259 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
260 if (gdb_signal_table[i] == sig)
261 return i;
262 return GDB_SIGNAL_UNKNOWN;
263}
264#endif
265
266static int gdb_signal_to_target (int sig)
267{
268 if (sig < ARRAY_SIZE (gdb_signal_table))
269 return gdb_signal_table[sig];
270 else
271 return -1;
272}
273
bellard4abe6152003-07-26 18:01:58 +0000274//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000275
pbrook56aebc82008-10-11 17:55:29 +0000276typedef struct GDBRegisterState {
277 int base_reg;
278 int num_regs;
279 gdb_reg_cb get_reg;
280 gdb_reg_cb set_reg;
281 const char *xml;
282 struct GDBRegisterState *next;
283} GDBRegisterState;
284
bellard858693c2004-03-31 18:52:07 +0000285enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000286 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000287 RS_IDLE,
288 RS_GETLINE,
289 RS_CHKSUM1,
290 RS_CHKSUM2,
291};
bellard858693c2004-03-31 18:52:07 +0000292typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200293 CPUState *c_cpu; /* current CPU for step/continue ops */
294 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200295 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000296 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000297 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000298 int line_buf_index;
299 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000300 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000301 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000302 int signal;
bellard41625032005-04-24 10:07:11 +0000303#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000304 int fd;
bellard41625032005-04-24 10:07:11 +0000305 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000306#else
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +0300307 CharBackend chr;
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +0300308 Chardev *mon_chr;
bellard41625032005-04-24 10:07:11 +0000309#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000310 char syscall_buf[256];
311 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000312} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000313
edgar_igl60897d32008-05-09 08:25:14 +0000314/* By default use no IRQs and no timers while single stepping so as to
315 * make single stepping like an ICE HW step.
316 */
317static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
318
aliguori880a7572008-11-18 20:30:24 +0000319static GDBState *gdbserver_state;
320
Andreas Färber5b50e792013-06-29 04:18:45 +0200321bool gdb_has_xml;
pbrook56aebc82008-10-11 17:55:29 +0000322
bellard1fddef42005-04-17 19:16:13 +0000323#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000324/* XXX: This is not thread safe. Do we care? */
325static int gdbserver_fd = -1;
326
bellard858693c2004-03-31 18:52:07 +0000327static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000328{
329 uint8_t ch;
330 int ret;
331
332 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000333 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000334 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000335 if (errno == ECONNRESET)
336 s->fd = -1;
Peter Wu5819e3e2016-06-05 16:35:48 +0200337 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000338 return -1;
339 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000340 close(s->fd);
341 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000342 return -1;
343 } else {
344 break;
345 }
346 }
347 return ch;
348}
pbrook4046d912007-01-28 01:53:16 +0000349#endif
bellardb4608c02003-06-27 17:34:32 +0000350
blueswir1654efcf2009-04-18 07:29:59 +0000351static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000352 GDB_SYS_UNKNOWN,
353 GDB_SYS_ENABLED,
354 GDB_SYS_DISABLED,
355} gdb_syscall_mode;
356
Liviu Ionescua38bb072014-12-11 12:07:48 +0000357/* Decide if either remote gdb syscalls or native file IO should be used. */
pbrooka2d1eba2007-01-28 03:10:55 +0000358int use_gdb_syscalls(void)
359{
Leon Alraecfe67ce2015-06-19 14:17:45 +0100360 SemihostingTarget target = semihosting_get_target();
361 if (target == SEMIHOSTING_TARGET_NATIVE) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000362 /* -semihosting-config target=native */
363 return false;
Leon Alraecfe67ce2015-06-19 14:17:45 +0100364 } else if (target == SEMIHOSTING_TARGET_GDB) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000365 /* -semihosting-config target=gdb */
366 return true;
367 }
368
369 /* -semihosting-config target=auto */
370 /* On the first call check if gdb is connected and remember. */
pbrooka2d1eba2007-01-28 03:10:55 +0000371 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000372 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
373 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000374 }
375 return gdb_syscall_mode == GDB_SYS_ENABLED;
376}
377
edgar_iglba70a622008-03-14 06:10:42 +0000378/* Resume execution. */
379static inline void gdb_continue(GDBState *s)
380{
381#ifdef CONFIG_USER_ONLY
382 s->running_state = 1;
383#else
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200384 if (!runstate_needs_reset()) {
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200385 vm_start();
386 }
edgar_iglba70a622008-03-14 06:10:42 +0000387#endif
388}
389
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100390/*
391 * Resume execution, per CPU actions. For user-mode emulation it's
392 * equivalent to gdb_continue.
393 */
394static int gdb_continue_partial(GDBState *s, char *newstates)
395{
396 CPUState *cpu;
397 int res = 0;
398#ifdef CONFIG_USER_ONLY
399 /*
400 * This is not exactly accurate, but it's an improvement compared to the
401 * previous situation, where only one CPU would be single-stepped.
402 */
403 CPU_FOREACH(cpu) {
404 if (newstates[cpu->cpu_index] == 's') {
405 cpu_single_step(cpu, sstep_flags);
406 }
407 }
408 s->running_state = 1;
409#else
410 int flag = 0;
411
412 if (!runstate_needs_reset()) {
413 if (vm_prepare_start()) {
414 return 0;
415 }
416
417 CPU_FOREACH(cpu) {
418 switch (newstates[cpu->cpu_index]) {
419 case 0:
420 case 1:
421 break; /* nothing to do here */
422 case 's':
423 cpu_single_step(cpu, sstep_flags);
424 cpu_resume(cpu);
425 flag = 1;
426 break;
427 case 'c':
428 cpu_resume(cpu);
429 flag = 1;
430 break;
431 default:
432 res = -1;
433 break;
434 }
435 }
436 }
437 if (flag) {
438 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
439 }
440#endif
441 return res;
442}
443
bellard858693c2004-03-31 18:52:07 +0000444static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000445{
pbrook4046d912007-01-28 01:53:16 +0000446#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000447 int ret;
448
449 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000450 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000451 if (ret < 0) {
Peter Wu5819e3e2016-06-05 16:35:48 +0200452 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000453 return;
454 } else {
455 buf += ret;
456 len -= ret;
457 }
458 }
pbrook4046d912007-01-28 01:53:16 +0000459#else
Daniel P. Berrange6ab3fc32016-09-06 14:56:04 +0100460 /* XXX this blocks entire thread. Rewrite to use
461 * qemu_chr_fe_write and background I/O callbacks */
Marc-André Lureau5345fdb2016-10-22 12:52:55 +0300462 qemu_chr_fe_write_all(&s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000463#endif
bellardb4608c02003-06-27 17:34:32 +0000464}
465
466static inline int fromhex(int v)
467{
468 if (v >= '0' && v <= '9')
469 return v - '0';
470 else if (v >= 'A' && v <= 'F')
471 return v - 'A' + 10;
472 else if (v >= 'a' && v <= 'f')
473 return v - 'a' + 10;
474 else
475 return 0;
476}
477
478static inline int tohex(int v)
479{
480 if (v < 10)
481 return v + '0';
482 else
483 return v - 10 + 'a';
484}
485
486static void memtohex(char *buf, const uint8_t *mem, int len)
487{
488 int i, c;
489 char *q;
490 q = buf;
491 for(i = 0; i < len; i++) {
492 c = mem[i];
493 *q++ = tohex(c >> 4);
494 *q++ = tohex(c & 0xf);
495 }
496 *q = '\0';
497}
498
499static void hextomem(uint8_t *mem, const char *buf, int len)
500{
501 int i;
502
503 for(i = 0; i < len; i++) {
504 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
505 buf += 2;
506 }
507}
508
bellardb4608c02003-06-27 17:34:32 +0000509/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000510static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000511{
pbrook56aebc82008-10-11 17:55:29 +0000512 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000513 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000514
bellardb4608c02003-06-27 17:34:32 +0000515 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000516 p = s->last_packet;
517 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000518 memcpy(p, buf, len);
519 p += len;
bellardb4608c02003-06-27 17:34:32 +0000520 csum = 0;
521 for(i = 0; i < len; i++) {
522 csum += buf[i];
523 }
pbrook4046d912007-01-28 01:53:16 +0000524 *(p++) = '#';
525 *(p++) = tohex((csum >> 4) & 0xf);
526 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000527
pbrook4046d912007-01-28 01:53:16 +0000528 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000529 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000530
pbrook4046d912007-01-28 01:53:16 +0000531#ifdef CONFIG_USER_ONLY
532 i = get_char(s);
533 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000534 return -1;
pbrook4046d912007-01-28 01:53:16 +0000535 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000536 break;
pbrook4046d912007-01-28 01:53:16 +0000537#else
538 break;
539#endif
bellardb4608c02003-06-27 17:34:32 +0000540 }
541 return 0;
542}
543
pbrook56aebc82008-10-11 17:55:29 +0000544/* return -1 if error, 0 if OK */
545static int put_packet(GDBState *s, const char *buf)
546{
547#ifdef DEBUG_GDB
548 printf("reply='%s'\n", buf);
549#endif
550
551 return put_packet_binary(s, buf, strlen(buf));
552}
553
pbrook56aebc82008-10-11 17:55:29 +0000554/* Encode data using the encoding for 'x' packets. */
555static int memtox(char *buf, const char *mem, int len)
556{
557 char *p = buf;
558 char c;
559
560 while (len--) {
561 c = *(mem++);
562 switch (c) {
563 case '#': case '$': case '*': case '}':
564 *(p++) = '}';
565 *(p++) = c ^ 0x20;
566 break;
567 default:
568 *(p++) = c;
569 break;
570 }
571 }
572 return p - buf;
573}
574
Andreas Färber5b24c642013-07-07 15:08:22 +0200575static const char *get_feature_xml(const char *p, const char **newp,
576 CPUClass *cc)
pbrook56aebc82008-10-11 17:55:29 +0000577{
pbrook56aebc82008-10-11 17:55:29 +0000578 size_t len;
579 int i;
580 const char *name;
581 static char target_xml[1024];
582
583 len = 0;
584 while (p[len] && p[len] != ':')
585 len++;
586 *newp = p + len;
587
588 name = NULL;
589 if (strncmp(p, "target.xml", len) == 0) {
590 /* Generate the XML description for this CPU. */
591 if (!target_xml[0]) {
592 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +0200593 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +0000594
David Hildenbrandb3820e62015-12-03 13:14:41 +0100595 pstrcat(target_xml, sizeof(target_xml),
596 "<?xml version=\"1.0\"?>"
597 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
598 "<target>");
599 if (cc->gdb_arch_name) {
600 gchar *arch = cc->gdb_arch_name(cpu);
601 pstrcat(target_xml, sizeof(target_xml), "<architecture>");
602 pstrcat(target_xml, sizeof(target_xml), arch);
603 pstrcat(target_xml, sizeof(target_xml), "</architecture>");
604 g_free(arch);
605 }
606 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
607 pstrcat(target_xml, sizeof(target_xml), cc->gdb_core_xml_file);
608 pstrcat(target_xml, sizeof(target_xml), "\"/>");
Andreas Färbereac8b352013-06-28 21:11:37 +0200609 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000610 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
611 pstrcat(target_xml, sizeof(target_xml), r->xml);
612 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000613 }
blueswir12dc766d2009-04-13 16:06:19 +0000614 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000615 }
616 return target_xml;
617 }
618 for (i = 0; ; i++) {
619 name = xml_builtin[i][0];
620 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
621 break;
622 }
623 return name ? xml_builtin[i][1] : NULL;
624}
pbrook56aebc82008-10-11 17:55:29 +0000625
Andreas Färber385b9f02013-06-27 18:25:36 +0200626static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000627{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200628 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200629 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000630 GDBRegisterState *r;
631
Andreas Färbera0e372f2013-06-28 23:18:47 +0200632 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200633 return cc->gdb_read_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200634 }
pbrook56aebc82008-10-11 17:55:29 +0000635
Andreas Färbereac8b352013-06-28 21:11:37 +0200636 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000637 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
638 return r->get_reg(env, mem_buf, reg - r->base_reg);
639 }
640 }
641 return 0;
642}
643
Andreas Färber385b9f02013-06-27 18:25:36 +0200644static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000645{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200646 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200647 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000648 GDBRegisterState *r;
649
Andreas Färbera0e372f2013-06-28 23:18:47 +0200650 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200651 return cc->gdb_write_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200652 }
pbrook56aebc82008-10-11 17:55:29 +0000653
Andreas Färbereac8b352013-06-28 21:11:37 +0200654 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000655 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
656 return r->set_reg(env, mem_buf, reg - r->base_reg);
657 }
658 }
659 return 0;
660}
661
662/* Register a supplemental set of CPU registers. If g_pos is nonzero it
663 specifies the first register number and these registers are included in
664 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
665 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
666 */
667
Andreas Färber22169d42013-06-28 21:27:39 +0200668void gdb_register_coprocessor(CPUState *cpu,
669 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
670 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000671{
672 GDBRegisterState *s;
673 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000674
Andreas Färbereac8b352013-06-28 21:11:37 +0200675 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000676 while (*p) {
677 /* Check for duplicates. */
678 if (strcmp((*p)->xml, xml) == 0)
679 return;
680 p = &(*p)->next;
681 }
Stefan Weil9643c252011-10-18 22:25:38 +0200682
683 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200684 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200685 s->num_regs = num_regs;
686 s->get_reg = get_reg;
687 s->set_reg = set_reg;
688 s->xml = xml;
689
pbrook56aebc82008-10-11 17:55:29 +0000690 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200691 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000692 *p = s;
693 if (g_pos) {
694 if (g_pos != s->base_reg) {
Ziyue Yang7ae6c572017-01-18 16:03:29 +0800695 error_report("Error: Bad gdb register numbering for '%s', "
696 "expected %d got %d", xml, g_pos, s->base_reg);
Andreas Färber35143f02013-08-12 18:09:47 +0200697 } else {
698 cpu->gdb_num_g_regs = cpu->gdb_num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000699 }
700 }
701}
702
aliguoria1d1bb32008-11-18 20:07:32 +0000703#ifndef CONFIG_USER_ONLY
Peter Maydell2472b6c2014-09-12 19:04:17 +0100704/* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
705static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
706{
707 static const int xlat[] = {
708 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
709 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
710 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
711 };
712
713 CPUClass *cc = CPU_GET_CLASS(cpu);
714 int cputype = xlat[gdbtype];
715
716 if (cc->gdb_stop_before_watchpoint) {
717 cputype |= BP_STOP_BEFORE_ACCESS;
718 }
719 return cputype;
720}
aliguoria1d1bb32008-11-18 20:07:32 +0000721#endif
722
aliguori880a7572008-11-18 20:30:24 +0000723static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000724{
Andreas Färber182735e2013-05-29 22:29:20 +0200725 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000726 int err = 0;
727
Andreas Färber62278812013-06-27 17:12:06 +0200728 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200729 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200730 }
aliguorie22a25c2009-03-12 20:12:48 +0000731
aliguoria1d1bb32008-11-18 20:07:32 +0000732 switch (type) {
733 case GDB_BREAKPOINT_SW:
734 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200735 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200736 err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
737 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000738 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200739 }
aliguori880a7572008-11-18 20:30:24 +0000740 }
741 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000742#ifndef CONFIG_USER_ONLY
743 case GDB_WATCHPOINT_WRITE:
744 case GDB_WATCHPOINT_READ:
745 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200746 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100747 err = cpu_watchpoint_insert(cpu, addr, len,
748 xlat_gdb_type(cpu, type), NULL);
749 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000750 break;
Peter Maydell2472b6c2014-09-12 19:04:17 +0100751 }
aliguori880a7572008-11-18 20:30:24 +0000752 }
753 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000754#endif
755 default:
756 return -ENOSYS;
757 }
758}
759
aliguori880a7572008-11-18 20:30:24 +0000760static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000761{
Andreas Färber182735e2013-05-29 22:29:20 +0200762 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000763 int err = 0;
764
Andreas Färber62278812013-06-27 17:12:06 +0200765 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200766 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200767 }
aliguorie22a25c2009-03-12 20:12:48 +0000768
aliguoria1d1bb32008-11-18 20:07:32 +0000769 switch (type) {
770 case GDB_BREAKPOINT_SW:
771 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200772 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200773 err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
774 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000775 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200776 }
aliguori880a7572008-11-18 20:30:24 +0000777 }
778 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000779#ifndef CONFIG_USER_ONLY
780 case GDB_WATCHPOINT_WRITE:
781 case GDB_WATCHPOINT_READ:
782 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200783 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100784 err = cpu_watchpoint_remove(cpu, addr, len,
785 xlat_gdb_type(cpu, type));
aliguori880a7572008-11-18 20:30:24 +0000786 if (err)
787 break;
788 }
789 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000790#endif
791 default:
792 return -ENOSYS;
793 }
794}
795
aliguori880a7572008-11-18 20:30:24 +0000796static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +0000797{
Andreas Färber182735e2013-05-29 22:29:20 +0200798 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000799
aliguorie22a25c2009-03-12 20:12:48 +0000800 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200801 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +0000802 return;
803 }
804
Andreas Färberbdc44642013-06-24 23:50:24 +0200805 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200806 cpu_breakpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000807#ifndef CONFIG_USER_ONLY
Andreas Färber75a34032013-09-02 16:57:02 +0200808 cpu_watchpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000809#endif
aliguori880a7572008-11-18 20:30:24 +0000810 }
aliguoria1d1bb32008-11-18 20:07:32 +0000811}
812
aurel32fab9d282009-04-08 21:29:37 +0000813static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
814{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200815 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +0200816
817 cpu_synchronize_state(cpu);
Peter Crosthwaite4a2b24e2015-06-23 20:19:21 -0700818 cpu_set_pc(cpu, pc);
aurel32fab9d282009-04-08 21:29:37 +0000819}
820
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200821static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700822{
Andreas Färber0d342822012-12-17 07:12:13 +0100823 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700824
Andreas Färberbdc44642013-06-24 23:50:24 +0200825 CPU_FOREACH(cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +0200826 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200827 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +0200828 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700829 }
Andreas Färberaa48dd92013-07-09 20:50:52 +0200830
831 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700832}
833
Jan Kiszka4dabe742015-02-07 09:38:43 +0100834static int is_query_packet(const char *p, const char *query, char separator)
835{
836 unsigned int query_len = strlen(query);
837
838 return strncmp(p, query, query_len) == 0 &&
839 (p[query_len] == '\0' || p[query_len] == separator);
840}
841
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100842/**
843 * gdb_handle_vcont - Parses and handles a vCont packet.
844 * returns -ENOTSUP if a command is unsupported, -EINVAL or -ERANGE if there is
845 * a format error, 0 on success.
846 */
847static int gdb_handle_vcont(GDBState *s, const char *p)
848{
849 int res, idx, signal = 0;
850 char cur_action;
851 char *newstates;
852 unsigned long tmp;
853 CPUState *cpu;
854#ifdef CONFIG_USER_ONLY
855 int max_cpus = 1; /* global variable max_cpus exists only in system mode */
856
857 CPU_FOREACH(cpu) {
858 max_cpus = max_cpus <= cpu->cpu_index ? cpu->cpu_index + 1 : max_cpus;
859 }
860#endif
861 /* uninitialised CPUs stay 0 */
862 newstates = g_new0(char, max_cpus);
863
864 /* mark valid CPUs with 1 */
865 CPU_FOREACH(cpu) {
866 newstates[cpu->cpu_index] = 1;
867 }
868
869 /*
870 * res keeps track of what error we are returning, with -ENOTSUP meaning
871 * that the command is unknown or unsupported, thus returning an empty
872 * packet, while -EINVAL and -ERANGE cause an E22 packet, due to invalid,
873 * or incorrect parameters passed.
874 */
875 res = 0;
876 while (*p) {
877 if (*p++ != ';') {
878 res = -ENOTSUP;
879 goto out;
880 }
881
882 cur_action = *p++;
883 if (cur_action == 'C' || cur_action == 'S') {
884 cur_action = tolower(cur_action);
885 res = qemu_strtoul(p + 1, &p, 16, &tmp);
886 if (res) {
887 goto out;
888 }
889 signal = gdb_signal_to_target(tmp);
890 } else if (cur_action != 'c' && cur_action != 's') {
891 /* unknown/invalid/unsupported command */
892 res = -ENOTSUP;
893 goto out;
894 }
895 /* thread specification. special values: (none), -1 = all; 0 = any */
896 if ((p[0] == ':' && p[1] == '-' && p[2] == '1') || (p[0] != ':')) {
897 if (*p == ':') {
898 p += 3;
899 }
900 for (idx = 0; idx < max_cpus; idx++) {
901 if (newstates[idx] == 1) {
902 newstates[idx] = cur_action;
903 }
904 }
905 } else if (*p == ':') {
906 p++;
907 res = qemu_strtoul(p, &p, 16, &tmp);
908 if (res) {
909 goto out;
910 }
911 idx = tmp;
912 /* 0 means any thread, so we pick the first valid CPU */
913 if (!idx) {
914 idx = cpu_index(first_cpu);
915 }
916
917 /*
918 * If we are in user mode, the thread specified is actually a
919 * thread id, and not an index. We need to find the actual
920 * CPU first, and only then we can use its index.
921 */
922 cpu = find_cpu(idx);
923 /* invalid CPU/thread specified */
924 if (!idx || !cpu) {
925 res = -EINVAL;
926 goto out;
927 }
928 /* only use if no previous match occourred */
929 if (newstates[cpu->cpu_index] == 1) {
930 newstates[cpu->cpu_index] = cur_action;
931 }
932 }
933 }
934 s->signal = signal;
935 gdb_continue_partial(s, newstates);
936
937out:
938 g_free(newstates);
939
940 return res;
941}
942
aliguori880a7572008-11-18 20:30:24 +0000943static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +0000944{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200945 CPUState *cpu;
Andreas Färber5b24c642013-07-07 15:08:22 +0200946 CPUClass *cc;
bellardb4608c02003-06-27 17:34:32 +0000947 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700948 uint32_t thread;
949 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +0000950 char buf[MAX_PACKET_LENGTH];
951 uint8_t mem_buf[MAX_PACKET_LENGTH];
952 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +0000953 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +0000954
bellard858693c2004-03-31 18:52:07 +0000955#ifdef DEBUG_GDB
956 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +0000957#endif
bellard858693c2004-03-31 18:52:07 +0000958 p = line_buf;
959 ch = *p++;
960 switch(ch) {
961 case '?':
bellard1fddef42005-04-17 19:16:13 +0000962 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +0000963 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200964 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +0000965 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +0000966 /* Remove all the breakpoints when this query is issued,
967 * because gdb is doing and initial connect and the state
968 * should be cleaned up.
969 */
aliguori880a7572008-11-18 20:30:24 +0000970 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +0000971 break;
972 case 'c':
973 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +0000974 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000975 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000976 }
aurel32ca587a82008-12-18 22:44:13 +0000977 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +0000978 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000979 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +0000980 case 'C':
aurel32ca587a82008-12-18 22:44:13 +0000981 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
982 if (s->signal == -1)
983 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +0000984 gdb_continue(s);
985 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200986 case 'v':
987 if (strncmp(p, "Cont", 4) == 0) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200988 p += 4;
989 if (*p == '?') {
990 put_packet(s, "vCont;c;C;s;S");
991 break;
992 }
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200993
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100994 res = gdb_handle_vcont(s, p);
995
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200996 if (res) {
Claudio Imbrenda544177a2017-02-14 18:07:48 +0100997 if ((res == -EINVAL) || (res == -ERANGE)) {
998 put_packet(s, "E22");
999 break;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001000 }
Claudio Imbrenda544177a2017-02-14 18:07:48 +01001001 goto unknown_command;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001002 }
1003 break;
1004 } else {
1005 goto unknown_command;
1006 }
edgar_igl7d03f822008-05-17 18:58:29 +00001007 case 'k':
1008 /* Kill the target */
Ziyue Yang7ae6c572017-01-18 16:03:29 +08001009 error_report("QEMU: Terminated via GDBstub");
edgar_igl7d03f822008-05-17 18:58:29 +00001010 exit(0);
1011 case 'D':
1012 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001013 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001014 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001015 gdb_continue(s);
1016 put_packet(s, "OK");
1017 break;
bellard858693c2004-03-31 18:52:07 +00001018 case 's':
1019 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001020 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001021 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001022 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001023 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001024 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001025 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001026 case 'F':
1027 {
1028 target_ulong ret;
1029 target_ulong err;
1030
1031 ret = strtoull(p, (char **)&p, 16);
1032 if (*p == ',') {
1033 p++;
1034 err = strtoull(p, (char **)&p, 16);
1035 } else {
1036 err = 0;
1037 }
1038 if (*p == ',')
1039 p++;
1040 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001041 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001042 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001043 s->current_syscall_cb = NULL;
1044 }
pbrooka2d1eba2007-01-28 03:10:55 +00001045 if (type == 'C') {
1046 put_packet(s, "T02");
1047 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001048 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001049 }
1050 }
1051 break;
bellard858693c2004-03-31 18:52:07 +00001052 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001053 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001054 len = 0;
Andreas Färber35143f02013-08-12 18:09:47 +02001055 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001056 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001057 len += reg_size;
1058 }
1059 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001060 put_packet(s, buf);
1061 break;
1062 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001063 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001064 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001065 len = strlen(p) / 2;
1066 hextomem((uint8_t *)registers, p, len);
Andreas Färber35143f02013-08-12 18:09:47 +02001067 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001068 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001069 len -= reg_size;
1070 registers += reg_size;
1071 }
bellard858693c2004-03-31 18:52:07 +00001072 put_packet(s, "OK");
1073 break;
1074 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001075 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001076 if (*p == ',')
1077 p++;
bellard9d9754a2006-06-25 15:32:37 +00001078 len = strtoull(p, NULL, 16);
Kevin Wolf5accecb2015-10-13 09:38:50 +02001079
1080 /* memtohex() doubles the required space */
1081 if (len > MAX_PACKET_LENGTH / 2) {
1082 put_packet (s, "E22");
1083 break;
1084 }
1085
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001086 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001087 put_packet (s, "E14");
1088 } else {
1089 memtohex(buf, mem_buf, len);
1090 put_packet(s, buf);
1091 }
bellard858693c2004-03-31 18:52:07 +00001092 break;
1093 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001094 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001095 if (*p == ',')
1096 p++;
bellard9d9754a2006-06-25 15:32:37 +00001097 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001098 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001099 p++;
Kevin Wolf5accecb2015-10-13 09:38:50 +02001100
1101 /* hextomem() reads 2*len bytes */
1102 if (len > strlen(p) / 2) {
1103 put_packet (s, "E22");
1104 break;
1105 }
bellard858693c2004-03-31 18:52:07 +00001106 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001107 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001108 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001109 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001110 } else {
bellard858693c2004-03-31 18:52:07 +00001111 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001112 }
bellard858693c2004-03-31 18:52:07 +00001113 break;
pbrook56aebc82008-10-11 17:55:29 +00001114 case 'p':
1115 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1116 This works, but can be very slow. Anything new enough to
1117 understand XML also knows how to use this properly. */
1118 if (!gdb_has_xml)
1119 goto unknown_command;
1120 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001121 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001122 if (reg_size) {
1123 memtohex(buf, mem_buf, reg_size);
1124 put_packet(s, buf);
1125 } else {
1126 put_packet(s, "E14");
1127 }
1128 break;
1129 case 'P':
1130 if (!gdb_has_xml)
1131 goto unknown_command;
1132 addr = strtoull(p, (char **)&p, 16);
1133 if (*p == '=')
1134 p++;
1135 reg_size = strlen(p) / 2;
1136 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001137 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001138 put_packet(s, "OK");
1139 break;
bellard858693c2004-03-31 18:52:07 +00001140 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001141 case 'z':
1142 type = strtoul(p, (char **)&p, 16);
1143 if (*p == ',')
1144 p++;
bellard9d9754a2006-06-25 15:32:37 +00001145 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001146 if (*p == ',')
1147 p++;
bellard9d9754a2006-06-25 15:32:37 +00001148 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001149 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001150 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001151 else
aliguori880a7572008-11-18 20:30:24 +00001152 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001153 if (res >= 0)
1154 put_packet(s, "OK");
1155 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001156 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001157 else
1158 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001159 break;
aliguori880a7572008-11-18 20:30:24 +00001160 case 'H':
1161 type = *p++;
1162 thread = strtoull(p, (char **)&p, 16);
1163 if (thread == -1 || thread == 0) {
1164 put_packet(s, "OK");
1165 break;
1166 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001167 cpu = find_cpu(thread);
1168 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001169 put_packet(s, "E22");
1170 break;
1171 }
1172 switch (type) {
1173 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001174 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001175 put_packet(s, "OK");
1176 break;
1177 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001178 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001179 put_packet(s, "OK");
1180 break;
1181 default:
1182 put_packet(s, "E22");
1183 break;
1184 }
1185 break;
1186 case 'T':
1187 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001188 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001189
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001190 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001191 put_packet(s, "OK");
1192 } else {
aliguori880a7572008-11-18 20:30:24 +00001193 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001194 }
aliguori880a7572008-11-18 20:30:24 +00001195 break;
pbrook978efd62006-06-17 18:30:42 +00001196 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001197 case 'Q':
1198 /* parse any 'q' packets here */
1199 if (!strcmp(p,"qemu.sstepbits")) {
1200 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001201 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1202 SSTEP_ENABLE,
1203 SSTEP_NOIRQ,
1204 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001205 put_packet(s, buf);
1206 break;
Jan Kiszka4dabe742015-02-07 09:38:43 +01001207 } else if (is_query_packet(p, "qemu.sstep", '=')) {
edgar_igl60897d32008-05-09 08:25:14 +00001208 /* Display or change the sstep_flags */
1209 p += 10;
1210 if (*p != '=') {
1211 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001212 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001213 put_packet(s, buf);
1214 break;
1215 }
1216 p++;
1217 type = strtoul(p, (char **)&p, 16);
1218 sstep_flags = type;
1219 put_packet(s, "OK");
1220 break;
aliguori880a7572008-11-18 20:30:24 +00001221 } else if (strcmp(p,"C") == 0) {
1222 /* "Current thread" remains vague in the spec, so always return
1223 * the first CPU (gdb returns the first thread). */
1224 put_packet(s, "QC1");
1225 break;
1226 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001227 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001228 goto report_cpuinfo;
1229 } else if (strcmp(p,"sThreadInfo") == 0) {
1230 report_cpuinfo:
1231 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001232 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001233 put_packet(s, buf);
Andreas Färberbdc44642013-06-24 23:50:24 +02001234 s->query_cpu = CPU_NEXT(s->query_cpu);
aliguori880a7572008-11-18 20:30:24 +00001235 } else
1236 put_packet(s, "l");
1237 break;
1238 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1239 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001240 cpu = find_cpu(thread);
1241 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001242 cpu_synchronize_state(cpu);
Kevin Wolf5accecb2015-10-13 09:38:50 +02001243 /* memtohex() doubles the required space */
1244 len = snprintf((char *)mem_buf, sizeof(buf) / 2,
Andreas Färber55e5c282012-12-17 06:18:02 +01001245 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001246 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001247 memtohex(buf, mem_buf, len);
1248 put_packet(s, buf);
1249 }
aliguori880a7572008-11-18 20:30:24 +00001250 break;
edgar_igl60897d32008-05-09 08:25:14 +00001251 }
blueswir10b8a9882009-03-07 10:51:36 +00001252#ifdef CONFIG_USER_ONLY
Jan Kiszka070949f2015-02-07 09:38:42 +01001253 else if (strcmp(p, "Offsets") == 0) {
Andreas Färber0429a972013-08-26 18:14:44 +02001254 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00001255
blueswir1363a37d2008-08-21 17:58:08 +00001256 snprintf(buf, sizeof(buf),
1257 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1258 ";Bss=" TARGET_ABI_FMT_lx,
1259 ts->info->code_offset,
1260 ts->info->data_offset,
1261 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001262 put_packet(s, buf);
1263 break;
1264 }
blueswir10b8a9882009-03-07 10:51:36 +00001265#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001266 else if (strncmp(p, "Rcmd,", 5) == 0) {
1267 int len = strlen(p + 5);
1268
1269 if ((len % 2) != 0) {
1270 put_packet(s, "E01");
1271 break;
1272 }
aliguori8a34a0f2009-03-05 23:01:55 +00001273 len = len / 2;
Kevin Wolf5accecb2015-10-13 09:38:50 +02001274 hextomem(mem_buf, p + 5, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001275 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001276 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001277 put_packet(s, "OK");
1278 break;
1279 }
blueswir10b8a9882009-03-07 10:51:36 +00001280#endif /* !CONFIG_USER_ONLY */
Jan Kiszka4dabe742015-02-07 09:38:43 +01001281 if (is_query_packet(p, "Supported", ':')) {
blueswir15b3715b2008-10-25 11:18:12 +00001282 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
Andreas Färber5b24c642013-07-07 15:08:22 +02001283 cc = CPU_GET_CLASS(first_cpu);
1284 if (cc->gdb_core_xml_file != NULL) {
1285 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
1286 }
pbrook56aebc82008-10-11 17:55:29 +00001287 put_packet(s, buf);
1288 break;
1289 }
pbrook56aebc82008-10-11 17:55:29 +00001290 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1291 const char *xml;
1292 target_ulong total_len;
1293
Andreas Färber5b24c642013-07-07 15:08:22 +02001294 cc = CPU_GET_CLASS(first_cpu);
1295 if (cc->gdb_core_xml_file == NULL) {
1296 goto unknown_command;
1297 }
1298
Andreas Färber5b50e792013-06-29 04:18:45 +02001299 gdb_has_xml = true;
pbrook56aebc82008-10-11 17:55:29 +00001300 p += 19;
Andreas Färber5b24c642013-07-07 15:08:22 +02001301 xml = get_feature_xml(p, &p, cc);
pbrook56aebc82008-10-11 17:55:29 +00001302 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001303 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001304 put_packet(s, buf);
1305 break;
1306 }
1307
1308 if (*p == ':')
1309 p++;
1310 addr = strtoul(p, (char **)&p, 16);
1311 if (*p == ',')
1312 p++;
1313 len = strtoul(p, (char **)&p, 16);
1314
1315 total_len = strlen(xml);
1316 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001317 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001318 put_packet(s, buf);
1319 break;
1320 }
1321 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1322 len = (MAX_PACKET_LENGTH - 5) / 2;
1323 if (len < total_len - addr) {
1324 buf[0] = 'm';
1325 len = memtox(buf + 1, xml + addr, len);
1326 } else {
1327 buf[0] = 'l';
1328 len = memtox(buf + 1, xml + addr, total_len - addr);
1329 }
1330 put_packet_binary(s, buf, len + 1);
1331 break;
1332 }
Jan Kiszkaa3919382015-02-07 09:38:44 +01001333 if (is_query_packet(p, "Attached", ':')) {
1334 put_packet(s, GDB_ATTACHED);
1335 break;
1336 }
pbrook56aebc82008-10-11 17:55:29 +00001337 /* Unrecognised 'q' command. */
1338 goto unknown_command;
1339
bellard858693c2004-03-31 18:52:07 +00001340 default:
pbrook56aebc82008-10-11 17:55:29 +00001341 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001342 /* put empty packet */
1343 buf[0] = '\0';
1344 put_packet(s, buf);
1345 break;
1346 }
1347 return RS_IDLE;
1348}
1349
Andreas Färber64f6b342013-05-27 02:06:09 +02001350void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001351{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001352 gdbserver_state->c_cpu = cpu;
1353 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001354}
1355
bellard1fddef42005-04-17 19:16:13 +00001356#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001357static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001358{
aliguori880a7572008-11-18 20:30:24 +00001359 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001360 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001361 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001362 const char *type;
bellard858693c2004-03-31 18:52:07 +00001363 int ret;
1364
Meador Ingecdb432b2012-03-15 17:49:45 +00001365 if (running || s->state == RS_INACTIVE) {
1366 return;
1367 }
1368 /* Is there a GDB syscall waiting to be sent? */
1369 if (s->current_syscall_cb) {
1370 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001371 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001372 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001373 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001374 case RUN_STATE_DEBUG:
Andreas Färberff4700b2013-08-26 18:23:18 +02001375 if (cpu->watchpoint_hit) {
1376 switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001377 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001378 type = "r";
1379 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001380 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001381 type = "a";
1382 break;
1383 default:
1384 type = "";
1385 break;
1386 }
aliguori880a7572008-11-18 20:30:24 +00001387 snprintf(buf, sizeof(buf),
1388 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001389 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
Andreas Färberff4700b2013-08-26 18:23:18 +02001390 (target_ulong)cpu->watchpoint_hit->vaddr);
1391 cpu->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001392 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001393 }
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001394 tb_flush(cpu);
aurel32ca587a82008-12-18 22:44:13 +00001395 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001396 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001397 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001398 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001399 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001400 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001401 ret = GDB_SIGNAL_QUIT;
1402 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001403 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001404 ret = GDB_SIGNAL_IO;
1405 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001406 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001407 ret = GDB_SIGNAL_ALRM;
1408 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001409 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001410 ret = GDB_SIGNAL_ABRT;
1411 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001412 case RUN_STATE_SAVE_VM:
1413 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001414 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001415 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001416 ret = GDB_SIGNAL_XCPU;
1417 break;
1418 default:
1419 ret = GDB_SIGNAL_UNKNOWN;
1420 break;
bellardbbeb7b52006-04-23 18:42:15 +00001421 }
Jan Kiszka226d0072015-07-24 18:52:31 +02001422 gdb_set_stop_cpu(cpu);
Andreas Färber0d342822012-12-17 07:12:13 +01001423 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001424
1425send_packet:
bellard858693c2004-03-31 18:52:07 +00001426 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001427
1428 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001429 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001430}
bellard1fddef42005-04-17 19:16:13 +00001431#endif
bellard858693c2004-03-31 18:52:07 +00001432
pbrooka2d1eba2007-01-28 03:10:55 +00001433/* Send a gdb syscall request.
1434 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001435 %x - target_ulong argument printed in hex.
1436 %lx - 64-bit argument printed in hex.
1437 %s - string pointer (target_ulong) and length (int) pair. */
Peter Maydell19239b32015-09-07 10:39:27 +01001438void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
pbrooka2d1eba2007-01-28 03:10:55 +00001439{
pbrooka2d1eba2007-01-28 03:10:55 +00001440 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001441 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001442 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001443 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001444 GDBState *s;
1445
aliguori880a7572008-11-18 20:30:24 +00001446 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001447 if (!s)
1448 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001449 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001450#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001451 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001452#endif
Meador Ingecdb432b2012-03-15 17:49:45 +00001453 p = s->syscall_buf;
1454 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001455 *(p++) = 'F';
1456 while (*fmt) {
1457 if (*fmt == '%') {
1458 fmt++;
1459 switch (*fmt++) {
1460 case 'x':
1461 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001462 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001463 break;
pbrooka87295e2007-05-26 15:09:38 +00001464 case 'l':
1465 if (*(fmt++) != 'x')
1466 goto bad_format;
1467 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001468 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001469 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001470 case 's':
1471 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001472 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001473 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001474 break;
1475 default:
pbrooka87295e2007-05-26 15:09:38 +00001476 bad_format:
Ziyue Yang7ae6c572017-01-18 16:03:29 +08001477 error_report("gdbstub: Bad syscall format string '%s'",
1478 fmt - 1);
pbrooka2d1eba2007-01-28 03:10:55 +00001479 break;
1480 }
1481 } else {
1482 *(p++) = *(fmt++);
1483 }
1484 }
pbrook8a93e022007-08-06 13:19:15 +00001485 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001486#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001487 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001488 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001489#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001490 /* In this case wait to send the syscall packet until notification that
1491 the CPU has stopped. This must be done because if the packet is sent
1492 now the reply from the syscall request could be received while the CPU
1493 is still in the running state, which can cause packets to be dropped
1494 and state transition 'T' packets to be sent while the syscall is still
1495 being processed. */
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001496 qemu_cpu_kick(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001497#endif
1498}
1499
Peter Maydell19239b32015-09-07 10:39:27 +01001500void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
1501{
1502 va_list va;
1503
1504 va_start(va, fmt);
1505 gdb_do_syscallv(cb, fmt, va);
1506 va_end(va);
1507}
1508
bellard6a00d602005-11-21 23:25:50 +00001509static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001510{
1511 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001512 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001513
bellard1fddef42005-04-17 19:16:13 +00001514#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001515 if (s->last_packet_len) {
1516 /* Waiting for a response to the last packet. If we see the start
1517 of a new command then abandon the previous response. */
1518 if (ch == '-') {
1519#ifdef DEBUG_GDB
1520 printf("Got NACK, retransmitting\n");
1521#endif
thsffe8ab82007-12-16 03:16:05 +00001522 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001523 }
1524#ifdef DEBUG_GDB
1525 else if (ch == '+')
1526 printf("Got ACK\n");
1527 else
1528 printf("Got '%c' when expecting ACK/NACK\n", ch);
1529#endif
1530 if (ch == '+' || ch == '$')
1531 s->last_packet_len = 0;
1532 if (ch != '$')
1533 return;
1534 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001535 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001536 /* when the CPU is running, we cannot do anything except stop
1537 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001538 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001539 } else
bellard1fddef42005-04-17 19:16:13 +00001540#endif
bellard41625032005-04-24 10:07:11 +00001541 {
bellard858693c2004-03-31 18:52:07 +00001542 switch(s->state) {
1543 case RS_IDLE:
1544 if (ch == '$') {
1545 s->line_buf_index = 0;
1546 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001547 }
1548 break;
bellard858693c2004-03-31 18:52:07 +00001549 case RS_GETLINE:
1550 if (ch == '#') {
1551 s->state = RS_CHKSUM1;
1552 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1553 s->state = RS_IDLE;
1554 } else {
1555 s->line_buf[s->line_buf_index++] = ch;
1556 }
1557 break;
1558 case RS_CHKSUM1:
1559 s->line_buf[s->line_buf_index] = '\0';
1560 s->line_csum = fromhex(ch) << 4;
1561 s->state = RS_CHKSUM2;
1562 break;
1563 case RS_CHKSUM2:
1564 s->line_csum |= fromhex(ch);
1565 csum = 0;
1566 for(i = 0; i < s->line_buf_index; i++) {
1567 csum += s->line_buf[i];
1568 }
1569 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001570 reply = '-';
1571 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001572 s->state = RS_IDLE;
1573 } else {
ths60fe76f2007-12-16 03:02:09 +00001574 reply = '+';
1575 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001576 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001577 }
bellardb4608c02003-06-27 17:34:32 +00001578 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001579 default:
1580 abort();
bellardb4608c02003-06-27 17:34:32 +00001581 }
1582 }
bellard858693c2004-03-31 18:52:07 +00001583}
1584
Paul Brook0e1c9c52010-06-16 13:03:51 +01001585/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001586void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001587{
1588 GDBState *s;
1589 char buf[4];
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001590#ifndef CONFIG_USER_ONLY
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03001591 Chardev *chr;
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001592#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001593
1594 s = gdbserver_state;
1595 if (!s) {
1596 return;
1597 }
1598#ifdef CONFIG_USER_ONLY
1599 if (gdbserver_fd < 0 || s->fd < 0) {
1600 return;
1601 }
Paolo Bonzini3d0f4412015-03-02 13:26:58 +01001602#else
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001603 chr = qemu_chr_fe_get_driver(&s->chr);
1604 if (!chr) {
Paolo Bonzini3d0f4412015-03-02 13:26:58 +01001605 return;
1606 }
Paul Brook0e1c9c52010-06-16 13:03:51 +01001607#endif
1608
1609 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1610 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001611
1612#ifndef CONFIG_USER_ONLY
Marc-André Lureauc39860e2016-10-22 12:52:58 +03001613 qemu_chr_fe_deinit(&s->chr);
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001614 qemu_chr_delete(chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001615#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001616}
1617
bellard1fddef42005-04-17 19:16:13 +00001618#ifdef CONFIG_USER_ONLY
1619int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001620gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001621{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001622 GDBState *s;
1623 char buf[256];
1624 int n;
bellard1fddef42005-04-17 19:16:13 +00001625
Andreas Färber5ca666c2013-06-24 19:20:57 +02001626 s = gdbserver_state;
1627 if (gdbserver_fd < 0 || s->fd < 0) {
1628 return sig;
bellard1fddef42005-04-17 19:16:13 +00001629 }
1630
Andreas Färber5ca666c2013-06-24 19:20:57 +02001631 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001632 cpu_single_step(cpu, 0);
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001633 tb_flush(cpu);
bellard1fddef42005-04-17 19:16:13 +00001634
Andreas Färber5ca666c2013-06-24 19:20:57 +02001635 if (sig != 0) {
1636 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1637 put_packet(s, buf);
1638 }
1639 /* put_packet() might have detected that the peer terminated the
1640 connection. */
1641 if (s->fd < 0) {
1642 return sig;
1643 }
1644
1645 sig = 0;
1646 s->state = RS_IDLE;
1647 s->running_state = 0;
1648 while (s->running_state == 0) {
1649 n = read(s->fd, buf, 256);
1650 if (n > 0) {
1651 int i;
1652
1653 for (i = 0; i < n; i++) {
1654 gdb_read_byte(s, buf[i]);
1655 }
Peter Wu5819e3e2016-06-05 16:35:48 +02001656 } else {
Andreas Färber5ca666c2013-06-24 19:20:57 +02001657 /* XXX: Connection closed. Should probably wait for another
1658 connection before continuing. */
Peter Wu5819e3e2016-06-05 16:35:48 +02001659 if (n == 0) {
1660 close(s->fd);
1661 }
1662 s->fd = -1;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001663 return sig;
bellard1fddef42005-04-17 19:16:13 +00001664 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001665 }
1666 sig = s->signal;
1667 s->signal = 0;
1668 return sig;
bellard1fddef42005-04-17 19:16:13 +00001669}
bellarde9009672005-04-26 20:42:36 +00001670
aurel32ca587a82008-12-18 22:44:13 +00001671/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001672void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001673{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001674 GDBState *s;
1675 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001676
Andreas Färber5ca666c2013-06-24 19:20:57 +02001677 s = gdbserver_state;
1678 if (gdbserver_fd < 0 || s->fd < 0) {
1679 return;
1680 }
aurel32ca587a82008-12-18 22:44:13 +00001681
Andreas Färber5ca666c2013-06-24 19:20:57 +02001682 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1683 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001684}
bellard1fddef42005-04-17 19:16:13 +00001685
aliguori880a7572008-11-18 20:30:24 +00001686static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001687{
1688 GDBState *s;
1689 struct sockaddr_in sockaddr;
1690 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001691 int fd;
bellard858693c2004-03-31 18:52:07 +00001692
1693 for(;;) {
1694 len = sizeof(sockaddr);
1695 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1696 if (fd < 0 && errno != EINTR) {
1697 perror("accept");
1698 return;
1699 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001700#ifndef _WIN32
1701 fcntl(fd, F_SETFD, FD_CLOEXEC);
1702#endif
bellard858693c2004-03-31 18:52:07 +00001703 break;
1704 }
1705 }
1706
1707 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001708 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00001709
Anthony Liguori7267c092011-08-20 22:09:37 -05001710 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001711 s->c_cpu = first_cpu;
1712 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00001713 s->fd = fd;
Andreas Färber5b50e792013-06-29 04:18:45 +02001714 gdb_has_xml = false;
bellard858693c2004-03-31 18:52:07 +00001715
aliguori880a7572008-11-18 20:30:24 +00001716 gdbserver_state = s;
bellard858693c2004-03-31 18:52:07 +00001717}
1718
1719static int gdbserver_open(int port)
1720{
1721 struct sockaddr_in sockaddr;
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001722 int fd, ret;
bellard858693c2004-03-31 18:52:07 +00001723
1724 fd = socket(PF_INET, SOCK_STREAM, 0);
1725 if (fd < 0) {
1726 perror("socket");
1727 return -1;
1728 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001729#ifndef _WIN32
1730 fcntl(fd, F_SETFD, FD_CLOEXEC);
1731#endif
bellard858693c2004-03-31 18:52:07 +00001732
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001733 socket_set_fast_reuse(fd);
bellard858693c2004-03-31 18:52:07 +00001734
1735 sockaddr.sin_family = AF_INET;
1736 sockaddr.sin_port = htons(port);
1737 sockaddr.sin_addr.s_addr = 0;
1738 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1739 if (ret < 0) {
1740 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001741 close(fd);
bellard858693c2004-03-31 18:52:07 +00001742 return -1;
1743 }
Peter Wu96165b92016-05-04 11:32:17 +02001744 ret = listen(fd, 1);
bellard858693c2004-03-31 18:52:07 +00001745 if (ret < 0) {
1746 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001747 close(fd);
bellard858693c2004-03-31 18:52:07 +00001748 return -1;
1749 }
bellard858693c2004-03-31 18:52:07 +00001750 return fd;
1751}
1752
1753int gdbserver_start(int port)
1754{
1755 gdbserver_fd = gdbserver_open(port);
1756 if (gdbserver_fd < 0)
1757 return -1;
1758 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00001759 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00001760 return 0;
1761}
aurel322b1319c2008-12-18 22:44:04 +00001762
1763/* Disable gdb stub for child processes. */
Peter Crosthwaitef7ec7f72015-06-23 19:31:16 -07001764void gdbserver_fork(CPUState *cpu)
aurel322b1319c2008-12-18 22:44:04 +00001765{
1766 GDBState *s = gdbserver_state;
Andreas Färber75a34032013-09-02 16:57:02 +02001767
1768 if (gdbserver_fd < 0 || s->fd < 0) {
1769 return;
1770 }
aurel322b1319c2008-12-18 22:44:04 +00001771 close(s->fd);
1772 s->fd = -1;
Andreas Färberb3310ab2013-09-02 17:26:20 +02001773 cpu_breakpoint_remove_all(cpu, BP_GDB);
Andreas Färber75a34032013-09-02 16:57:02 +02001774 cpu_watchpoint_remove_all(cpu, BP_GDB);
aurel322b1319c2008-12-18 22:44:04 +00001775}
pbrook4046d912007-01-28 01:53:16 +00001776#else
thsaa1f17c2007-07-11 22:48:58 +00001777static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001778{
pbrook56aebc82008-10-11 17:55:29 +00001779 /* We can handle an arbitrarily large amount of data.
1780 Pick the maximum packet size, which is as good as anything. */
1781 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001782}
1783
thsaa1f17c2007-07-11 22:48:58 +00001784static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001785{
pbrook4046d912007-01-28 01:53:16 +00001786 int i;
1787
1788 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00001789 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00001790 }
1791}
1792
1793static void gdb_chr_event(void *opaque, int event)
1794{
1795 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05301796 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001797 vm_stop(RUN_STATE_PAUSED);
Andreas Färber5b50e792013-06-29 04:18:45 +02001798 gdb_has_xml = false;
pbrook4046d912007-01-28 01:53:16 +00001799 break;
1800 default:
1801 break;
1802 }
1803}
1804
aliguori8a34a0f2009-03-05 23:01:55 +00001805static void gdb_monitor_output(GDBState *s, const char *msg, int len)
1806{
1807 char buf[MAX_PACKET_LENGTH];
1808
1809 buf[0] = 'O';
1810 if (len > (MAX_PACKET_LENGTH/2) - 1)
1811 len = (MAX_PACKET_LENGTH/2) - 1;
1812 memtohex(buf + 1, (uint8_t *)msg, len);
1813 put_packet(s, buf);
1814}
1815
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03001816static int gdb_monitor_write(Chardev *chr, const uint8_t *buf, int len)
aliguori8a34a0f2009-03-05 23:01:55 +00001817{
1818 const char *p = (const char *)buf;
1819 int max_sz;
1820
1821 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
1822 for (;;) {
1823 if (len <= max_sz) {
1824 gdb_monitor_output(gdbserver_state, p, len);
1825 break;
1826 }
1827 gdb_monitor_output(gdbserver_state, p, max_sz);
1828 p += max_sz;
1829 len -= max_sz;
1830 }
1831 return len;
1832}
1833
aliguori59030a82009-04-05 18:43:41 +00001834#ifndef _WIN32
1835static void gdb_sigterm_handler(int signal)
1836{
Luiz Capitulino13548692011-07-29 15:36:43 -03001837 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001838 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001839 }
aliguori59030a82009-04-05 18:43:41 +00001840}
1841#endif
1842
Marc-André Lureau777357d2016-12-07 18:39:10 +03001843static void gdb_monitor_open(Chardev *chr, ChardevBackend *backend,
1844 bool *be_opened, Error **errp)
1845{
1846 *be_opened = false;
1847}
1848
1849static void char_gdb_class_init(ObjectClass *oc, void *data)
1850{
1851 ChardevClass *cc = CHARDEV_CLASS(oc);
1852
1853 cc->internal = true;
1854 cc->open = gdb_monitor_open;
1855 cc->chr_write = gdb_monitor_write;
1856}
1857
1858#define TYPE_CHARDEV_GDB "chardev-gdb"
1859
1860static const TypeInfo char_gdb_type_info = {
1861 .name = TYPE_CHARDEV_GDB,
1862 .parent = TYPE_CHARDEV,
1863 .class_init = char_gdb_class_init,
1864};
1865
aliguori59030a82009-04-05 18:43:41 +00001866int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00001867{
1868 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00001869 char gdbstub_device_name[128];
Marc-André Lureau0ec7b3e2016-12-07 16:20:22 +03001870 Chardev *chr = NULL;
1871 Chardev *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00001872
Ziyue Yang508b4ec2017-01-18 16:02:41 +08001873 if (!first_cpu) {
1874 error_report("gdbstub: meaningless to attach gdb to a "
1875 "machine without any CPU.");
1876 return -1;
1877 }
1878
aliguori59030a82009-04-05 18:43:41 +00001879 if (!device)
1880 return -1;
1881 if (strcmp(device, "none") != 0) {
1882 if (strstart(device, "tcp:", NULL)) {
1883 /* enforce required TCP attributes */
1884 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
1885 "%s,nowait,nodelay,server", device);
1886 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00001887 }
aliguori59030a82009-04-05 18:43:41 +00001888#ifndef _WIN32
1889 else if (strcmp(device, "stdio") == 0) {
1890 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00001891
aliguori59030a82009-04-05 18:43:41 +00001892 memset(&act, 0, sizeof(act));
1893 act.sa_handler = gdb_sigterm_handler;
1894 sigaction(SIGINT, &act, NULL);
1895 }
1896#endif
Marc-André Lureaub4948be2016-10-22 12:52:46 +03001897 chr = qemu_chr_new_noreplay("gdb", device);
aliguori36556b22009-03-28 18:05:53 +00001898 if (!chr)
1899 return -1;
pbrookcfc34752007-02-22 01:48:01 +00001900 }
1901
aliguori36556b22009-03-28 18:05:53 +00001902 s = gdbserver_state;
1903 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05001904 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00001905 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00001906
aliguori36556b22009-03-28 18:05:53 +00001907 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
1908
1909 /* Initialize a monitor terminal for gdb */
Marc-André Lureau777357d2016-12-07 18:39:10 +03001910 mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
1911 NULL, &error_abort);
aliguori36556b22009-03-28 18:05:53 +00001912 monitor_init(mon_chr, 0);
1913 } else {
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001914 if (qemu_chr_fe_get_driver(&s->chr)) {
1915 qemu_chr_delete(qemu_chr_fe_get_driver(&s->chr));
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03001916 }
aliguori36556b22009-03-28 18:05:53 +00001917 mon_chr = s->mon_chr;
1918 memset(s, 0, sizeof(GDBState));
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03001919 s->mon_chr = mon_chr;
aliguori36556b22009-03-28 18:05:53 +00001920 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001921 s->c_cpu = first_cpu;
1922 s->g_cpu = first_cpu;
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03001923 if (chr) {
1924 qemu_chr_fe_init(&s->chr, chr, &error_abort);
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001925 qemu_chr_fe_set_handlers(&s->chr, gdb_chr_can_receive, gdb_chr_receive,
Marc-André Lureau39ab61c2016-10-22 12:53:03 +03001926 gdb_chr_event, NULL, NULL, true);
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03001927 }
aliguori36556b22009-03-28 18:05:53 +00001928 s->state = chr ? RS_IDLE : RS_INACTIVE;
1929 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00001930 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00001931
pbrook4046d912007-01-28 01:53:16 +00001932 return 0;
1933}
Marc-André Lureau777357d2016-12-07 18:39:10 +03001934
1935static void register_types(void)
1936{
1937 type_register_static(&char_gdb_type_info);
1938}
1939
1940type_init(register_types);
pbrook4046d912007-01-28 01:53:16 +00001941#endif