blob: e4e480f66811dfb8955c12722a5ce9a7c77ab164 [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"
pbrook56aebc82008-10-11 17:55:29 +000021#include "qemu-common.h"
bellard1fddef42005-04-17 19:16:13 +000022#ifdef CONFIG_USER_ONLY
bellard1fddef42005-04-17 19:16:13 +000023
24#include "qemu.h"
25#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010026#include "monitor/monitor.h"
Paolo Bonzinidccfcd02013-04-08 16:55:25 +020027#include "sysemu/char.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010028#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010029#include "exec/gdbstub.h"
bellard1fddef42005-04-17 19:16:13 +000030#endif
bellard67b915a2004-03-31 23:37:16 +000031
pbrook56aebc82008-10-11 17:55:29 +000032#define MAX_PACKET_LENGTH 4096
33
Blue Swirl2b41f102011-06-19 20:38:22 +000034#include "cpu.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010035#include "qemu/sockets.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010036#include "sysemu/kvm.h"
Leon Alraecfe67ce2015-06-19 14:17:45 +010037#include "exec/semihost.h"
aurel32ca587a82008-12-18 22:44:13 +000038
Jan Kiszkaa3919382015-02-07 09:38:44 +010039#ifdef CONFIG_USER_ONLY
40#define GDB_ATTACHED "0"
41#else
42#define GDB_ATTACHED "1"
43#endif
44
Andreas Färberf3659ee2013-06-27 19:09:09 +020045static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
46 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020047{
Andreas Färberf3659ee2013-06-27 19:09:09 +020048 CPUClass *cc = CPU_GET_CLASS(cpu);
49
50 if (cc->memory_rw_debug) {
51 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
52 }
53 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020054}
aurel32ca587a82008-12-18 22:44:13 +000055
56enum {
57 GDB_SIGNAL_0 = 0,
58 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010059 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000060 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010061 GDB_SIGNAL_ABRT = 6,
62 GDB_SIGNAL_ALRM = 14,
63 GDB_SIGNAL_IO = 23,
64 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000065 GDB_SIGNAL_UNKNOWN = 143
66};
67
68#ifdef CONFIG_USER_ONLY
69
70/* Map target signal numbers to GDB protocol signal numbers and vice
71 * versa. For user emulation's currently supported systems, we can
72 * assume most signals are defined.
73 */
74
75static int gdb_signal_table[] = {
76 0,
77 TARGET_SIGHUP,
78 TARGET_SIGINT,
79 TARGET_SIGQUIT,
80 TARGET_SIGILL,
81 TARGET_SIGTRAP,
82 TARGET_SIGABRT,
83 -1, /* SIGEMT */
84 TARGET_SIGFPE,
85 TARGET_SIGKILL,
86 TARGET_SIGBUS,
87 TARGET_SIGSEGV,
88 TARGET_SIGSYS,
89 TARGET_SIGPIPE,
90 TARGET_SIGALRM,
91 TARGET_SIGTERM,
92 TARGET_SIGURG,
93 TARGET_SIGSTOP,
94 TARGET_SIGTSTP,
95 TARGET_SIGCONT,
96 TARGET_SIGCHLD,
97 TARGET_SIGTTIN,
98 TARGET_SIGTTOU,
99 TARGET_SIGIO,
100 TARGET_SIGXCPU,
101 TARGET_SIGXFSZ,
102 TARGET_SIGVTALRM,
103 TARGET_SIGPROF,
104 TARGET_SIGWINCH,
105 -1, /* SIGLOST */
106 TARGET_SIGUSR1,
107 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000108#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000109 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000110#else
111 -1,
112#endif
aurel32ca587a82008-12-18 22:44:13 +0000113 -1, /* SIGPOLL */
114 -1,
115 -1,
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
123 -1,
124 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000125#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000126 __SIGRTMIN + 1,
127 __SIGRTMIN + 2,
128 __SIGRTMIN + 3,
129 __SIGRTMIN + 4,
130 __SIGRTMIN + 5,
131 __SIGRTMIN + 6,
132 __SIGRTMIN + 7,
133 __SIGRTMIN + 8,
134 __SIGRTMIN + 9,
135 __SIGRTMIN + 10,
136 __SIGRTMIN + 11,
137 __SIGRTMIN + 12,
138 __SIGRTMIN + 13,
139 __SIGRTMIN + 14,
140 __SIGRTMIN + 15,
141 __SIGRTMIN + 16,
142 __SIGRTMIN + 17,
143 __SIGRTMIN + 18,
144 __SIGRTMIN + 19,
145 __SIGRTMIN + 20,
146 __SIGRTMIN + 21,
147 __SIGRTMIN + 22,
148 __SIGRTMIN + 23,
149 __SIGRTMIN + 24,
150 __SIGRTMIN + 25,
151 __SIGRTMIN + 26,
152 __SIGRTMIN + 27,
153 __SIGRTMIN + 28,
154 __SIGRTMIN + 29,
155 __SIGRTMIN + 30,
156 __SIGRTMIN + 31,
157 -1, /* SIGCANCEL */
158 __SIGRTMIN,
159 __SIGRTMIN + 32,
160 __SIGRTMIN + 33,
161 __SIGRTMIN + 34,
162 __SIGRTMIN + 35,
163 __SIGRTMIN + 36,
164 __SIGRTMIN + 37,
165 __SIGRTMIN + 38,
166 __SIGRTMIN + 39,
167 __SIGRTMIN + 40,
168 __SIGRTMIN + 41,
169 __SIGRTMIN + 42,
170 __SIGRTMIN + 43,
171 __SIGRTMIN + 44,
172 __SIGRTMIN + 45,
173 __SIGRTMIN + 46,
174 __SIGRTMIN + 47,
175 __SIGRTMIN + 48,
176 __SIGRTMIN + 49,
177 __SIGRTMIN + 50,
178 __SIGRTMIN + 51,
179 __SIGRTMIN + 52,
180 __SIGRTMIN + 53,
181 __SIGRTMIN + 54,
182 __SIGRTMIN + 55,
183 __SIGRTMIN + 56,
184 __SIGRTMIN + 57,
185 __SIGRTMIN + 58,
186 __SIGRTMIN + 59,
187 __SIGRTMIN + 60,
188 __SIGRTMIN + 61,
189 __SIGRTMIN + 62,
190 __SIGRTMIN + 63,
191 __SIGRTMIN + 64,
192 __SIGRTMIN + 65,
193 __SIGRTMIN + 66,
194 __SIGRTMIN + 67,
195 __SIGRTMIN + 68,
196 __SIGRTMIN + 69,
197 __SIGRTMIN + 70,
198 __SIGRTMIN + 71,
199 __SIGRTMIN + 72,
200 __SIGRTMIN + 73,
201 __SIGRTMIN + 74,
202 __SIGRTMIN + 75,
203 __SIGRTMIN + 76,
204 __SIGRTMIN + 77,
205 __SIGRTMIN + 78,
206 __SIGRTMIN + 79,
207 __SIGRTMIN + 80,
208 __SIGRTMIN + 81,
209 __SIGRTMIN + 82,
210 __SIGRTMIN + 83,
211 __SIGRTMIN + 84,
212 __SIGRTMIN + 85,
213 __SIGRTMIN + 86,
214 __SIGRTMIN + 87,
215 __SIGRTMIN + 88,
216 __SIGRTMIN + 89,
217 __SIGRTMIN + 90,
218 __SIGRTMIN + 91,
219 __SIGRTMIN + 92,
220 __SIGRTMIN + 93,
221 __SIGRTMIN + 94,
222 __SIGRTMIN + 95,
223 -1, /* SIGINFO */
224 -1, /* UNKNOWN */
225 -1, /* DEFAULT */
226 -1,
227 -1,
228 -1,
229 -1,
230 -1,
231 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000232#endif
aurel32ca587a82008-12-18 22:44:13 +0000233};
bellard8f447cc2006-06-14 15:21:14 +0000234#else
aurel32ca587a82008-12-18 22:44:13 +0000235/* In system mode we only need SIGINT and SIGTRAP; other signals
236 are not yet supported. */
237
238enum {
239 TARGET_SIGINT = 2,
240 TARGET_SIGTRAP = 5
241};
242
243static int gdb_signal_table[] = {
244 -1,
245 -1,
246 TARGET_SIGINT,
247 -1,
248 -1,
249 TARGET_SIGTRAP
250};
bellard8f447cc2006-06-14 15:21:14 +0000251#endif
bellardb4608c02003-06-27 17:34:32 +0000252
aurel32ca587a82008-12-18 22:44:13 +0000253#ifdef CONFIG_USER_ONLY
254static int target_signal_to_gdb (int sig)
255{
256 int i;
257 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
258 if (gdb_signal_table[i] == sig)
259 return i;
260 return GDB_SIGNAL_UNKNOWN;
261}
262#endif
263
264static int gdb_signal_to_target (int sig)
265{
266 if (sig < ARRAY_SIZE (gdb_signal_table))
267 return gdb_signal_table[sig];
268 else
269 return -1;
270}
271
bellard4abe6152003-07-26 18:01:58 +0000272//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000273
pbrook56aebc82008-10-11 17:55:29 +0000274typedef struct GDBRegisterState {
275 int base_reg;
276 int num_regs;
277 gdb_reg_cb get_reg;
278 gdb_reg_cb set_reg;
279 const char *xml;
280 struct GDBRegisterState *next;
281} GDBRegisterState;
282
bellard858693c2004-03-31 18:52:07 +0000283enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000284 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000285 RS_IDLE,
286 RS_GETLINE,
287 RS_CHKSUM1,
288 RS_CHKSUM2,
289};
bellard858693c2004-03-31 18:52:07 +0000290typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200291 CPUState *c_cpu; /* current CPU for step/continue ops */
292 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200293 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000294 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000295 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000296 int line_buf_index;
297 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000298 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000299 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000300 int signal;
bellard41625032005-04-24 10:07:11 +0000301#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000302 int fd;
bellard41625032005-04-24 10:07:11 +0000303 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000304#else
305 CharDriverState *chr;
aliguori8a34a0f2009-03-05 23:01:55 +0000306 CharDriverState *mon_chr;
bellard41625032005-04-24 10:07:11 +0000307#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000308 char syscall_buf[256];
309 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000310} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000311
edgar_igl60897d32008-05-09 08:25:14 +0000312/* By default use no IRQs and no timers while single stepping so as to
313 * make single stepping like an ICE HW step.
314 */
315static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
316
aliguori880a7572008-11-18 20:30:24 +0000317static GDBState *gdbserver_state;
318
Andreas Färber5b50e792013-06-29 04:18:45 +0200319bool gdb_has_xml;
pbrook56aebc82008-10-11 17:55:29 +0000320
bellard1fddef42005-04-17 19:16:13 +0000321#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000322/* XXX: This is not thread safe. Do we care? */
323static int gdbserver_fd = -1;
324
bellard858693c2004-03-31 18:52:07 +0000325static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000326{
327 uint8_t ch;
328 int ret;
329
330 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000331 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000332 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000333 if (errno == ECONNRESET)
334 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000335 if (errno != EINTR && errno != EAGAIN)
336 return -1;
337 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000338 close(s->fd);
339 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000340 return -1;
341 } else {
342 break;
343 }
344 }
345 return ch;
346}
pbrook4046d912007-01-28 01:53:16 +0000347#endif
bellardb4608c02003-06-27 17:34:32 +0000348
blueswir1654efcf2009-04-18 07:29:59 +0000349static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000350 GDB_SYS_UNKNOWN,
351 GDB_SYS_ENABLED,
352 GDB_SYS_DISABLED,
353} gdb_syscall_mode;
354
Liviu Ionescua38bb072014-12-11 12:07:48 +0000355/* Decide if either remote gdb syscalls or native file IO should be used. */
pbrooka2d1eba2007-01-28 03:10:55 +0000356int use_gdb_syscalls(void)
357{
Leon Alraecfe67ce2015-06-19 14:17:45 +0100358 SemihostingTarget target = semihosting_get_target();
359 if (target == SEMIHOSTING_TARGET_NATIVE) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000360 /* -semihosting-config target=native */
361 return false;
Leon Alraecfe67ce2015-06-19 14:17:45 +0100362 } else if (target == SEMIHOSTING_TARGET_GDB) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000363 /* -semihosting-config target=gdb */
364 return true;
365 }
366
367 /* -semihosting-config target=auto */
368 /* On the first call check if gdb is connected and remember. */
pbrooka2d1eba2007-01-28 03:10:55 +0000369 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000370 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
371 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000372 }
373 return gdb_syscall_mode == GDB_SYS_ENABLED;
374}
375
edgar_iglba70a622008-03-14 06:10:42 +0000376/* Resume execution. */
377static inline void gdb_continue(GDBState *s)
378{
379#ifdef CONFIG_USER_ONLY
380 s->running_state = 1;
381#else
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200382 if (!runstate_needs_reset()) {
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200383 vm_start();
384 }
edgar_iglba70a622008-03-14 06:10:42 +0000385#endif
386}
387
bellard858693c2004-03-31 18:52:07 +0000388static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000389{
pbrook4046d912007-01-28 01:53:16 +0000390#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000391 int ret;
392
393 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000394 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000395 if (ret < 0) {
396 if (errno != EINTR && errno != EAGAIN)
397 return;
398 } else {
399 buf += ret;
400 len -= ret;
401 }
402 }
pbrook4046d912007-01-28 01:53:16 +0000403#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500404 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000405#endif
bellardb4608c02003-06-27 17:34:32 +0000406}
407
408static inline int fromhex(int v)
409{
410 if (v >= '0' && v <= '9')
411 return v - '0';
412 else if (v >= 'A' && v <= 'F')
413 return v - 'A' + 10;
414 else if (v >= 'a' && v <= 'f')
415 return v - 'a' + 10;
416 else
417 return 0;
418}
419
420static inline int tohex(int v)
421{
422 if (v < 10)
423 return v + '0';
424 else
425 return v - 10 + 'a';
426}
427
428static void memtohex(char *buf, const uint8_t *mem, int len)
429{
430 int i, c;
431 char *q;
432 q = buf;
433 for(i = 0; i < len; i++) {
434 c = mem[i];
435 *q++ = tohex(c >> 4);
436 *q++ = tohex(c & 0xf);
437 }
438 *q = '\0';
439}
440
441static void hextomem(uint8_t *mem, const char *buf, int len)
442{
443 int i;
444
445 for(i = 0; i < len; i++) {
446 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
447 buf += 2;
448 }
449}
450
bellardb4608c02003-06-27 17:34:32 +0000451/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000452static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000453{
pbrook56aebc82008-10-11 17:55:29 +0000454 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000455 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000456
bellardb4608c02003-06-27 17:34:32 +0000457 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000458 p = s->last_packet;
459 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000460 memcpy(p, buf, len);
461 p += len;
bellardb4608c02003-06-27 17:34:32 +0000462 csum = 0;
463 for(i = 0; i < len; i++) {
464 csum += buf[i];
465 }
pbrook4046d912007-01-28 01:53:16 +0000466 *(p++) = '#';
467 *(p++) = tohex((csum >> 4) & 0xf);
468 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000469
pbrook4046d912007-01-28 01:53:16 +0000470 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000471 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000472
pbrook4046d912007-01-28 01:53:16 +0000473#ifdef CONFIG_USER_ONLY
474 i = get_char(s);
475 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000476 return -1;
pbrook4046d912007-01-28 01:53:16 +0000477 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000478 break;
pbrook4046d912007-01-28 01:53:16 +0000479#else
480 break;
481#endif
bellardb4608c02003-06-27 17:34:32 +0000482 }
483 return 0;
484}
485
pbrook56aebc82008-10-11 17:55:29 +0000486/* return -1 if error, 0 if OK */
487static int put_packet(GDBState *s, const char *buf)
488{
489#ifdef DEBUG_GDB
490 printf("reply='%s'\n", buf);
491#endif
492
493 return put_packet_binary(s, buf, strlen(buf));
494}
495
pbrook56aebc82008-10-11 17:55:29 +0000496/* Encode data using the encoding for 'x' packets. */
497static int memtox(char *buf, const char *mem, int len)
498{
499 char *p = buf;
500 char c;
501
502 while (len--) {
503 c = *(mem++);
504 switch (c) {
505 case '#': case '$': case '*': case '}':
506 *(p++) = '}';
507 *(p++) = c ^ 0x20;
508 break;
509 default:
510 *(p++) = c;
511 break;
512 }
513 }
514 return p - buf;
515}
516
Andreas Färber5b24c642013-07-07 15:08:22 +0200517static const char *get_feature_xml(const char *p, const char **newp,
518 CPUClass *cc)
pbrook56aebc82008-10-11 17:55:29 +0000519{
pbrook56aebc82008-10-11 17:55:29 +0000520 size_t len;
521 int i;
522 const char *name;
523 static char target_xml[1024];
524
525 len = 0;
526 while (p[len] && p[len] != ':')
527 len++;
528 *newp = p + len;
529
530 name = NULL;
531 if (strncmp(p, "target.xml", len) == 0) {
532 /* Generate the XML description for this CPU. */
533 if (!target_xml[0]) {
534 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +0200535 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +0000536
David Hildenbrandb3820e62015-12-03 13:14:41 +0100537 pstrcat(target_xml, sizeof(target_xml),
538 "<?xml version=\"1.0\"?>"
539 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
540 "<target>");
541 if (cc->gdb_arch_name) {
542 gchar *arch = cc->gdb_arch_name(cpu);
543 pstrcat(target_xml, sizeof(target_xml), "<architecture>");
544 pstrcat(target_xml, sizeof(target_xml), arch);
545 pstrcat(target_xml, sizeof(target_xml), "</architecture>");
546 g_free(arch);
547 }
548 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
549 pstrcat(target_xml, sizeof(target_xml), cc->gdb_core_xml_file);
550 pstrcat(target_xml, sizeof(target_xml), "\"/>");
Andreas Färbereac8b352013-06-28 21:11:37 +0200551 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000552 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
553 pstrcat(target_xml, sizeof(target_xml), r->xml);
554 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000555 }
blueswir12dc766d2009-04-13 16:06:19 +0000556 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000557 }
558 return target_xml;
559 }
560 for (i = 0; ; i++) {
561 name = xml_builtin[i][0];
562 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
563 break;
564 }
565 return name ? xml_builtin[i][1] : NULL;
566}
pbrook56aebc82008-10-11 17:55:29 +0000567
Andreas Färber385b9f02013-06-27 18:25:36 +0200568static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000569{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200570 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200571 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000572 GDBRegisterState *r;
573
Andreas Färbera0e372f2013-06-28 23:18:47 +0200574 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200575 return cc->gdb_read_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200576 }
pbrook56aebc82008-10-11 17:55:29 +0000577
Andreas Färbereac8b352013-06-28 21:11:37 +0200578 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000579 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
580 return r->get_reg(env, mem_buf, reg - r->base_reg);
581 }
582 }
583 return 0;
584}
585
Andreas Färber385b9f02013-06-27 18:25:36 +0200586static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000587{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200588 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200589 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000590 GDBRegisterState *r;
591
Andreas Färbera0e372f2013-06-28 23:18:47 +0200592 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200593 return cc->gdb_write_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200594 }
pbrook56aebc82008-10-11 17:55:29 +0000595
Andreas Färbereac8b352013-06-28 21:11:37 +0200596 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000597 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
598 return r->set_reg(env, mem_buf, reg - r->base_reg);
599 }
600 }
601 return 0;
602}
603
604/* Register a supplemental set of CPU registers. If g_pos is nonzero it
605 specifies the first register number and these registers are included in
606 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
607 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
608 */
609
Andreas Färber22169d42013-06-28 21:27:39 +0200610void gdb_register_coprocessor(CPUState *cpu,
611 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
612 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000613{
614 GDBRegisterState *s;
615 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000616
Andreas Färbereac8b352013-06-28 21:11:37 +0200617 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000618 while (*p) {
619 /* Check for duplicates. */
620 if (strcmp((*p)->xml, xml) == 0)
621 return;
622 p = &(*p)->next;
623 }
Stefan Weil9643c252011-10-18 22:25:38 +0200624
625 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200626 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200627 s->num_regs = num_regs;
628 s->get_reg = get_reg;
629 s->set_reg = set_reg;
630 s->xml = xml;
631
pbrook56aebc82008-10-11 17:55:29 +0000632 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200633 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000634 *p = s;
635 if (g_pos) {
636 if (g_pos != s->base_reg) {
637 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
638 "Expected %d got %d\n", xml, g_pos, s->base_reg);
Andreas Färber35143f02013-08-12 18:09:47 +0200639 } else {
640 cpu->gdb_num_g_regs = cpu->gdb_num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000641 }
642 }
643}
644
aliguoria1d1bb32008-11-18 20:07:32 +0000645#ifndef CONFIG_USER_ONLY
Peter Maydell2472b6c2014-09-12 19:04:17 +0100646/* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
647static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
648{
649 static const int xlat[] = {
650 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
651 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
652 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
653 };
654
655 CPUClass *cc = CPU_GET_CLASS(cpu);
656 int cputype = xlat[gdbtype];
657
658 if (cc->gdb_stop_before_watchpoint) {
659 cputype |= BP_STOP_BEFORE_ACCESS;
660 }
661 return cputype;
662}
aliguoria1d1bb32008-11-18 20:07:32 +0000663#endif
664
aliguori880a7572008-11-18 20:30:24 +0000665static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000666{
Andreas Färber182735e2013-05-29 22:29:20 +0200667 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000668 int err = 0;
669
Andreas Färber62278812013-06-27 17:12:06 +0200670 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200671 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200672 }
aliguorie22a25c2009-03-12 20:12:48 +0000673
aliguoria1d1bb32008-11-18 20:07:32 +0000674 switch (type) {
675 case GDB_BREAKPOINT_SW:
676 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200677 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200678 err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
679 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000680 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200681 }
aliguori880a7572008-11-18 20:30:24 +0000682 }
683 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000684#ifndef CONFIG_USER_ONLY
685 case GDB_WATCHPOINT_WRITE:
686 case GDB_WATCHPOINT_READ:
687 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200688 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100689 err = cpu_watchpoint_insert(cpu, addr, len,
690 xlat_gdb_type(cpu, type), NULL);
691 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000692 break;
Peter Maydell2472b6c2014-09-12 19:04:17 +0100693 }
aliguori880a7572008-11-18 20:30:24 +0000694 }
695 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000696#endif
697 default:
698 return -ENOSYS;
699 }
700}
701
aliguori880a7572008-11-18 20:30:24 +0000702static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000703{
Andreas Färber182735e2013-05-29 22:29:20 +0200704 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000705 int err = 0;
706
Andreas Färber62278812013-06-27 17:12:06 +0200707 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200708 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200709 }
aliguorie22a25c2009-03-12 20:12:48 +0000710
aliguoria1d1bb32008-11-18 20:07:32 +0000711 switch (type) {
712 case GDB_BREAKPOINT_SW:
713 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200714 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200715 err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
716 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000717 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200718 }
aliguori880a7572008-11-18 20:30:24 +0000719 }
720 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000721#ifndef CONFIG_USER_ONLY
722 case GDB_WATCHPOINT_WRITE:
723 case GDB_WATCHPOINT_READ:
724 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200725 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100726 err = cpu_watchpoint_remove(cpu, addr, len,
727 xlat_gdb_type(cpu, type));
aliguori880a7572008-11-18 20:30:24 +0000728 if (err)
729 break;
730 }
731 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000732#endif
733 default:
734 return -ENOSYS;
735 }
736}
737
aliguori880a7572008-11-18 20:30:24 +0000738static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +0000739{
Andreas Färber182735e2013-05-29 22:29:20 +0200740 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000741
aliguorie22a25c2009-03-12 20:12:48 +0000742 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200743 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +0000744 return;
745 }
746
Andreas Färberbdc44642013-06-24 23:50:24 +0200747 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200748 cpu_breakpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000749#ifndef CONFIG_USER_ONLY
Andreas Färber75a34032013-09-02 16:57:02 +0200750 cpu_watchpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000751#endif
aliguori880a7572008-11-18 20:30:24 +0000752 }
aliguoria1d1bb32008-11-18 20:07:32 +0000753}
754
aurel32fab9d282009-04-08 21:29:37 +0000755static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
756{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200757 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +0200758
759 cpu_synchronize_state(cpu);
Peter Crosthwaite4a2b24e2015-06-23 20:19:21 -0700760 cpu_set_pc(cpu, pc);
aurel32fab9d282009-04-08 21:29:37 +0000761}
762
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200763static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700764{
Andreas Färber0d342822012-12-17 07:12:13 +0100765 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700766
Andreas Färberbdc44642013-06-24 23:50:24 +0200767 CPU_FOREACH(cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +0200768 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200769 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +0200770 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700771 }
Andreas Färberaa48dd92013-07-09 20:50:52 +0200772
773 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700774}
775
Jan Kiszka4dabe742015-02-07 09:38:43 +0100776static int is_query_packet(const char *p, const char *query, char separator)
777{
778 unsigned int query_len = strlen(query);
779
780 return strncmp(p, query, query_len) == 0 &&
781 (p[query_len] == '\0' || p[query_len] == separator);
782}
783
aliguori880a7572008-11-18 20:30:24 +0000784static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +0000785{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200786 CPUState *cpu;
Andreas Färber5b24c642013-07-07 15:08:22 +0200787 CPUClass *cc;
bellardb4608c02003-06-27 17:34:32 +0000788 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700789 uint32_t thread;
790 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +0000791 char buf[MAX_PACKET_LENGTH];
792 uint8_t mem_buf[MAX_PACKET_LENGTH];
793 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +0000794 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +0000795
bellard858693c2004-03-31 18:52:07 +0000796#ifdef DEBUG_GDB
797 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +0000798#endif
bellard858693c2004-03-31 18:52:07 +0000799 p = line_buf;
800 ch = *p++;
801 switch(ch) {
802 case '?':
bellard1fddef42005-04-17 19:16:13 +0000803 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +0000804 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200805 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +0000806 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +0000807 /* Remove all the breakpoints when this query is issued,
808 * because gdb is doing and initial connect and the state
809 * should be cleaned up.
810 */
aliguori880a7572008-11-18 20:30:24 +0000811 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +0000812 break;
813 case 'c':
814 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +0000815 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000816 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000817 }
aurel32ca587a82008-12-18 22:44:13 +0000818 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +0000819 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000820 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +0000821 case 'C':
aurel32ca587a82008-12-18 22:44:13 +0000822 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
823 if (s->signal == -1)
824 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +0000825 gdb_continue(s);
826 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200827 case 'v':
828 if (strncmp(p, "Cont", 4) == 0) {
829 int res_signal, res_thread;
830
831 p += 4;
832 if (*p == '?') {
833 put_packet(s, "vCont;c;C;s;S");
834 break;
835 }
836 res = 0;
837 res_signal = 0;
838 res_thread = 0;
839 while (*p) {
840 int action, signal;
841
842 if (*p++ != ';') {
843 res = 0;
844 break;
845 }
846 action = *p++;
847 signal = 0;
848 if (action == 'C' || action == 'S') {
Martin Simmonsf17b0692014-11-05 14:47:39 +0000849 signal = gdb_signal_to_target(strtoul(p, (char **)&p, 16));
850 if (signal == -1) {
851 signal = 0;
852 }
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200853 } else if (action != 'c' && action != 's') {
854 res = 0;
855 break;
856 }
857 thread = 0;
858 if (*p == ':') {
859 thread = strtoull(p+1, (char **)&p, 16);
860 }
861 action = tolower(action);
862 if (res == 0 || (res == 'c' && action == 's')) {
863 res = action;
864 res_signal = signal;
865 res_thread = thread;
866 }
867 }
868 if (res) {
869 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200870 cpu = find_cpu(res_thread);
871 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200872 put_packet(s, "E22");
873 break;
874 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200875 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200876 }
877 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200878 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200879 }
880 s->signal = res_signal;
881 gdb_continue(s);
882 return RS_IDLE;
883 }
884 break;
885 } else {
886 goto unknown_command;
887 }
edgar_igl7d03f822008-05-17 18:58:29 +0000888 case 'k':
889 /* Kill the target */
890 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
891 exit(0);
892 case 'D':
893 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +0000894 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -0300895 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +0000896 gdb_continue(s);
897 put_packet(s, "OK");
898 break;
bellard858693c2004-03-31 18:52:07 +0000899 case 's':
900 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +0000901 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000902 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000903 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200904 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +0000905 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000906 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +0000907 case 'F':
908 {
909 target_ulong ret;
910 target_ulong err;
911
912 ret = strtoull(p, (char **)&p, 16);
913 if (*p == ',') {
914 p++;
915 err = strtoull(p, (char **)&p, 16);
916 } else {
917 err = 0;
918 }
919 if (*p == ',')
920 p++;
921 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +0000922 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200923 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +0000924 s->current_syscall_cb = NULL;
925 }
pbrooka2d1eba2007-01-28 03:10:55 +0000926 if (type == 'C') {
927 put_packet(s, "T02");
928 } else {
edgar_iglba70a622008-03-14 06:10:42 +0000929 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +0000930 }
931 }
932 break;
bellard858693c2004-03-31 18:52:07 +0000933 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200934 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +0000935 len = 0;
Andreas Färber35143f02013-08-12 18:09:47 +0200936 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200937 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +0000938 len += reg_size;
939 }
940 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +0000941 put_packet(s, buf);
942 break;
943 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200944 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +0000945 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +0000946 len = strlen(p) / 2;
947 hextomem((uint8_t *)registers, p, len);
Andreas Färber35143f02013-08-12 18:09:47 +0200948 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200949 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +0000950 len -= reg_size;
951 registers += reg_size;
952 }
bellard858693c2004-03-31 18:52:07 +0000953 put_packet(s, "OK");
954 break;
955 case 'm':
bellard9d9754a2006-06-25 15:32:37 +0000956 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +0000957 if (*p == ',')
958 p++;
bellard9d9754a2006-06-25 15:32:37 +0000959 len = strtoull(p, NULL, 16);
Kevin Wolf5accecb2015-10-13 09:38:50 +0200960
961 /* memtohex() doubles the required space */
962 if (len > MAX_PACKET_LENGTH / 2) {
963 put_packet (s, "E22");
964 break;
965 }
966
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200967 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +0000968 put_packet (s, "E14");
969 } else {
970 memtohex(buf, mem_buf, len);
971 put_packet(s, buf);
972 }
bellard858693c2004-03-31 18:52:07 +0000973 break;
974 case 'M':
bellard9d9754a2006-06-25 15:32:37 +0000975 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +0000976 if (*p == ',')
977 p++;
bellard9d9754a2006-06-25 15:32:37 +0000978 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +0000979 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +0000980 p++;
Kevin Wolf5accecb2015-10-13 09:38:50 +0200981
982 /* hextomem() reads 2*len bytes */
983 if (len > strlen(p) / 2) {
984 put_packet (s, "E22");
985 break;
986 }
bellard858693c2004-03-31 18:52:07 +0000987 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200988 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +0200989 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +0000990 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +0200991 } else {
bellard858693c2004-03-31 18:52:07 +0000992 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +0200993 }
bellard858693c2004-03-31 18:52:07 +0000994 break;
pbrook56aebc82008-10-11 17:55:29 +0000995 case 'p':
996 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
997 This works, but can be very slow. Anything new enough to
998 understand XML also knows how to use this properly. */
999 if (!gdb_has_xml)
1000 goto unknown_command;
1001 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001002 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001003 if (reg_size) {
1004 memtohex(buf, mem_buf, reg_size);
1005 put_packet(s, buf);
1006 } else {
1007 put_packet(s, "E14");
1008 }
1009 break;
1010 case 'P':
1011 if (!gdb_has_xml)
1012 goto unknown_command;
1013 addr = strtoull(p, (char **)&p, 16);
1014 if (*p == '=')
1015 p++;
1016 reg_size = strlen(p) / 2;
1017 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001018 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001019 put_packet(s, "OK");
1020 break;
bellard858693c2004-03-31 18:52:07 +00001021 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001022 case 'z':
1023 type = strtoul(p, (char **)&p, 16);
1024 if (*p == ',')
1025 p++;
bellard9d9754a2006-06-25 15:32:37 +00001026 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001027 if (*p == ',')
1028 p++;
bellard9d9754a2006-06-25 15:32:37 +00001029 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001030 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001031 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001032 else
aliguori880a7572008-11-18 20:30:24 +00001033 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001034 if (res >= 0)
1035 put_packet(s, "OK");
1036 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001037 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001038 else
1039 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001040 break;
aliguori880a7572008-11-18 20:30:24 +00001041 case 'H':
1042 type = *p++;
1043 thread = strtoull(p, (char **)&p, 16);
1044 if (thread == -1 || thread == 0) {
1045 put_packet(s, "OK");
1046 break;
1047 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001048 cpu = find_cpu(thread);
1049 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001050 put_packet(s, "E22");
1051 break;
1052 }
1053 switch (type) {
1054 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001055 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001056 put_packet(s, "OK");
1057 break;
1058 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001059 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001060 put_packet(s, "OK");
1061 break;
1062 default:
1063 put_packet(s, "E22");
1064 break;
1065 }
1066 break;
1067 case 'T':
1068 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001069 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001070
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001071 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001072 put_packet(s, "OK");
1073 } else {
aliguori880a7572008-11-18 20:30:24 +00001074 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001075 }
aliguori880a7572008-11-18 20:30:24 +00001076 break;
pbrook978efd62006-06-17 18:30:42 +00001077 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001078 case 'Q':
1079 /* parse any 'q' packets here */
1080 if (!strcmp(p,"qemu.sstepbits")) {
1081 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001082 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1083 SSTEP_ENABLE,
1084 SSTEP_NOIRQ,
1085 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001086 put_packet(s, buf);
1087 break;
Jan Kiszka4dabe742015-02-07 09:38:43 +01001088 } else if (is_query_packet(p, "qemu.sstep", '=')) {
edgar_igl60897d32008-05-09 08:25:14 +00001089 /* Display or change the sstep_flags */
1090 p += 10;
1091 if (*p != '=') {
1092 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001093 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001094 put_packet(s, buf);
1095 break;
1096 }
1097 p++;
1098 type = strtoul(p, (char **)&p, 16);
1099 sstep_flags = type;
1100 put_packet(s, "OK");
1101 break;
aliguori880a7572008-11-18 20:30:24 +00001102 } else if (strcmp(p,"C") == 0) {
1103 /* "Current thread" remains vague in the spec, so always return
1104 * the first CPU (gdb returns the first thread). */
1105 put_packet(s, "QC1");
1106 break;
1107 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001108 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001109 goto report_cpuinfo;
1110 } else if (strcmp(p,"sThreadInfo") == 0) {
1111 report_cpuinfo:
1112 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001113 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001114 put_packet(s, buf);
Andreas Färberbdc44642013-06-24 23:50:24 +02001115 s->query_cpu = CPU_NEXT(s->query_cpu);
aliguori880a7572008-11-18 20:30:24 +00001116 } else
1117 put_packet(s, "l");
1118 break;
1119 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1120 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001121 cpu = find_cpu(thread);
1122 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001123 cpu_synchronize_state(cpu);
Kevin Wolf5accecb2015-10-13 09:38:50 +02001124 /* memtohex() doubles the required space */
1125 len = snprintf((char *)mem_buf, sizeof(buf) / 2,
Andreas Färber55e5c282012-12-17 06:18:02 +01001126 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001127 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001128 memtohex(buf, mem_buf, len);
1129 put_packet(s, buf);
1130 }
aliguori880a7572008-11-18 20:30:24 +00001131 break;
edgar_igl60897d32008-05-09 08:25:14 +00001132 }
blueswir10b8a9882009-03-07 10:51:36 +00001133#ifdef CONFIG_USER_ONLY
Jan Kiszka070949f2015-02-07 09:38:42 +01001134 else if (strcmp(p, "Offsets") == 0) {
Andreas Färber0429a972013-08-26 18:14:44 +02001135 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00001136
blueswir1363a37d2008-08-21 17:58:08 +00001137 snprintf(buf, sizeof(buf),
1138 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1139 ";Bss=" TARGET_ABI_FMT_lx,
1140 ts->info->code_offset,
1141 ts->info->data_offset,
1142 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001143 put_packet(s, buf);
1144 break;
1145 }
blueswir10b8a9882009-03-07 10:51:36 +00001146#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001147 else if (strncmp(p, "Rcmd,", 5) == 0) {
1148 int len = strlen(p + 5);
1149
1150 if ((len % 2) != 0) {
1151 put_packet(s, "E01");
1152 break;
1153 }
aliguori8a34a0f2009-03-05 23:01:55 +00001154 len = len / 2;
Kevin Wolf5accecb2015-10-13 09:38:50 +02001155 hextomem(mem_buf, p + 5, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001156 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001157 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001158 put_packet(s, "OK");
1159 break;
1160 }
blueswir10b8a9882009-03-07 10:51:36 +00001161#endif /* !CONFIG_USER_ONLY */
Jan Kiszka4dabe742015-02-07 09:38:43 +01001162 if (is_query_packet(p, "Supported", ':')) {
blueswir15b3715b2008-10-25 11:18:12 +00001163 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
Andreas Färber5b24c642013-07-07 15:08:22 +02001164 cc = CPU_GET_CLASS(first_cpu);
1165 if (cc->gdb_core_xml_file != NULL) {
1166 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
1167 }
pbrook56aebc82008-10-11 17:55:29 +00001168 put_packet(s, buf);
1169 break;
1170 }
pbrook56aebc82008-10-11 17:55:29 +00001171 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1172 const char *xml;
1173 target_ulong total_len;
1174
Andreas Färber5b24c642013-07-07 15:08:22 +02001175 cc = CPU_GET_CLASS(first_cpu);
1176 if (cc->gdb_core_xml_file == NULL) {
1177 goto unknown_command;
1178 }
1179
Andreas Färber5b50e792013-06-29 04:18:45 +02001180 gdb_has_xml = true;
pbrook56aebc82008-10-11 17:55:29 +00001181 p += 19;
Andreas Färber5b24c642013-07-07 15:08:22 +02001182 xml = get_feature_xml(p, &p, cc);
pbrook56aebc82008-10-11 17:55:29 +00001183 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001184 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001185 put_packet(s, buf);
1186 break;
1187 }
1188
1189 if (*p == ':')
1190 p++;
1191 addr = strtoul(p, (char **)&p, 16);
1192 if (*p == ',')
1193 p++;
1194 len = strtoul(p, (char **)&p, 16);
1195
1196 total_len = strlen(xml);
1197 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001198 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001199 put_packet(s, buf);
1200 break;
1201 }
1202 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1203 len = (MAX_PACKET_LENGTH - 5) / 2;
1204 if (len < total_len - addr) {
1205 buf[0] = 'm';
1206 len = memtox(buf + 1, xml + addr, len);
1207 } else {
1208 buf[0] = 'l';
1209 len = memtox(buf + 1, xml + addr, total_len - addr);
1210 }
1211 put_packet_binary(s, buf, len + 1);
1212 break;
1213 }
Jan Kiszkaa3919382015-02-07 09:38:44 +01001214 if (is_query_packet(p, "Attached", ':')) {
1215 put_packet(s, GDB_ATTACHED);
1216 break;
1217 }
pbrook56aebc82008-10-11 17:55:29 +00001218 /* Unrecognised 'q' command. */
1219 goto unknown_command;
1220
bellard858693c2004-03-31 18:52:07 +00001221 default:
pbrook56aebc82008-10-11 17:55:29 +00001222 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001223 /* put empty packet */
1224 buf[0] = '\0';
1225 put_packet(s, buf);
1226 break;
1227 }
1228 return RS_IDLE;
1229}
1230
Andreas Färber64f6b342013-05-27 02:06:09 +02001231void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001232{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001233 gdbserver_state->c_cpu = cpu;
1234 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001235}
1236
bellard1fddef42005-04-17 19:16:13 +00001237#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001238static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001239{
aliguori880a7572008-11-18 20:30:24 +00001240 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001241 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001242 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001243 const char *type;
bellard858693c2004-03-31 18:52:07 +00001244 int ret;
1245
Meador Ingecdb432b2012-03-15 17:49:45 +00001246 if (running || s->state == RS_INACTIVE) {
1247 return;
1248 }
1249 /* Is there a GDB syscall waiting to be sent? */
1250 if (s->current_syscall_cb) {
1251 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001252 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001253 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001254 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001255 case RUN_STATE_DEBUG:
Andreas Färberff4700b2013-08-26 18:23:18 +02001256 if (cpu->watchpoint_hit) {
1257 switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001258 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001259 type = "r";
1260 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001261 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001262 type = "a";
1263 break;
1264 default:
1265 type = "";
1266 break;
1267 }
aliguori880a7572008-11-18 20:30:24 +00001268 snprintf(buf, sizeof(buf),
1269 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001270 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
Andreas Färberff4700b2013-08-26 18:23:18 +02001271 (target_ulong)cpu->watchpoint_hit->vaddr);
1272 cpu->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001273 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001274 }
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001275 tb_flush(cpu);
aurel32ca587a82008-12-18 22:44:13 +00001276 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001277 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001278 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001279 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001280 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001281 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001282 ret = GDB_SIGNAL_QUIT;
1283 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001284 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001285 ret = GDB_SIGNAL_IO;
1286 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001287 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001288 ret = GDB_SIGNAL_ALRM;
1289 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001290 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001291 ret = GDB_SIGNAL_ABRT;
1292 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001293 case RUN_STATE_SAVE_VM:
1294 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001295 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001296 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001297 ret = GDB_SIGNAL_XCPU;
1298 break;
1299 default:
1300 ret = GDB_SIGNAL_UNKNOWN;
1301 break;
bellardbbeb7b52006-04-23 18:42:15 +00001302 }
Jan Kiszka226d0072015-07-24 18:52:31 +02001303 gdb_set_stop_cpu(cpu);
Andreas Färber0d342822012-12-17 07:12:13 +01001304 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001305
1306send_packet:
bellard858693c2004-03-31 18:52:07 +00001307 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001308
1309 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001310 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001311}
bellard1fddef42005-04-17 19:16:13 +00001312#endif
bellard858693c2004-03-31 18:52:07 +00001313
pbrooka2d1eba2007-01-28 03:10:55 +00001314/* Send a gdb syscall request.
1315 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001316 %x - target_ulong argument printed in hex.
1317 %lx - 64-bit argument printed in hex.
1318 %s - string pointer (target_ulong) and length (int) pair. */
Peter Maydell19239b32015-09-07 10:39:27 +01001319void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
pbrooka2d1eba2007-01-28 03:10:55 +00001320{
pbrooka2d1eba2007-01-28 03:10:55 +00001321 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001322 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001323 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001324 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001325 GDBState *s;
1326
aliguori880a7572008-11-18 20:30:24 +00001327 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001328 if (!s)
1329 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001330 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001331#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001332 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001333#endif
Meador Ingecdb432b2012-03-15 17:49:45 +00001334 p = s->syscall_buf;
1335 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001336 *(p++) = 'F';
1337 while (*fmt) {
1338 if (*fmt == '%') {
1339 fmt++;
1340 switch (*fmt++) {
1341 case 'x':
1342 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001343 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001344 break;
pbrooka87295e2007-05-26 15:09:38 +00001345 case 'l':
1346 if (*(fmt++) != 'x')
1347 goto bad_format;
1348 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001349 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001350 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001351 case 's':
1352 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001353 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001354 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001355 break;
1356 default:
pbrooka87295e2007-05-26 15:09:38 +00001357 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001358 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1359 fmt - 1);
1360 break;
1361 }
1362 } else {
1363 *(p++) = *(fmt++);
1364 }
1365 }
pbrook8a93e022007-08-06 13:19:15 +00001366 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001367#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001368 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001369 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001370#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001371 /* In this case wait to send the syscall packet until notification that
1372 the CPU has stopped. This must be done because if the packet is sent
1373 now the reply from the syscall request could be received while the CPU
1374 is still in the running state, which can cause packets to be dropped
1375 and state transition 'T' packets to be sent while the syscall is still
1376 being processed. */
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001377 qemu_cpu_kick(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001378#endif
1379}
1380
Peter Maydell19239b32015-09-07 10:39:27 +01001381void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
1382{
1383 va_list va;
1384
1385 va_start(va, fmt);
1386 gdb_do_syscallv(cb, fmt, va);
1387 va_end(va);
1388}
1389
bellard6a00d602005-11-21 23:25:50 +00001390static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001391{
1392 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001393 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001394
bellard1fddef42005-04-17 19:16:13 +00001395#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001396 if (s->last_packet_len) {
1397 /* Waiting for a response to the last packet. If we see the start
1398 of a new command then abandon the previous response. */
1399 if (ch == '-') {
1400#ifdef DEBUG_GDB
1401 printf("Got NACK, retransmitting\n");
1402#endif
thsffe8ab82007-12-16 03:16:05 +00001403 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001404 }
1405#ifdef DEBUG_GDB
1406 else if (ch == '+')
1407 printf("Got ACK\n");
1408 else
1409 printf("Got '%c' when expecting ACK/NACK\n", ch);
1410#endif
1411 if (ch == '+' || ch == '$')
1412 s->last_packet_len = 0;
1413 if (ch != '$')
1414 return;
1415 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001416 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001417 /* when the CPU is running, we cannot do anything except stop
1418 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001419 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001420 } else
bellard1fddef42005-04-17 19:16:13 +00001421#endif
bellard41625032005-04-24 10:07:11 +00001422 {
bellard858693c2004-03-31 18:52:07 +00001423 switch(s->state) {
1424 case RS_IDLE:
1425 if (ch == '$') {
1426 s->line_buf_index = 0;
1427 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001428 }
1429 break;
bellard858693c2004-03-31 18:52:07 +00001430 case RS_GETLINE:
1431 if (ch == '#') {
1432 s->state = RS_CHKSUM1;
1433 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1434 s->state = RS_IDLE;
1435 } else {
1436 s->line_buf[s->line_buf_index++] = ch;
1437 }
1438 break;
1439 case RS_CHKSUM1:
1440 s->line_buf[s->line_buf_index] = '\0';
1441 s->line_csum = fromhex(ch) << 4;
1442 s->state = RS_CHKSUM2;
1443 break;
1444 case RS_CHKSUM2:
1445 s->line_csum |= fromhex(ch);
1446 csum = 0;
1447 for(i = 0; i < s->line_buf_index; i++) {
1448 csum += s->line_buf[i];
1449 }
1450 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001451 reply = '-';
1452 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001453 s->state = RS_IDLE;
1454 } else {
ths60fe76f2007-12-16 03:02:09 +00001455 reply = '+';
1456 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001457 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001458 }
bellardb4608c02003-06-27 17:34:32 +00001459 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001460 default:
1461 abort();
bellardb4608c02003-06-27 17:34:32 +00001462 }
1463 }
bellard858693c2004-03-31 18:52:07 +00001464}
1465
Paul Brook0e1c9c52010-06-16 13:03:51 +01001466/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001467void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001468{
1469 GDBState *s;
1470 char buf[4];
1471
1472 s = gdbserver_state;
1473 if (!s) {
1474 return;
1475 }
1476#ifdef CONFIG_USER_ONLY
1477 if (gdbserver_fd < 0 || s->fd < 0) {
1478 return;
1479 }
Paolo Bonzini3d0f4412015-03-02 13:26:58 +01001480#else
1481 if (!s->chr) {
1482 return;
1483 }
Paul Brook0e1c9c52010-06-16 13:03:51 +01001484#endif
1485
1486 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1487 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001488
1489#ifndef CONFIG_USER_ONLY
Paolo Bonzini3d0f4412015-03-02 13:26:58 +01001490 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001491#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001492}
1493
bellard1fddef42005-04-17 19:16:13 +00001494#ifdef CONFIG_USER_ONLY
1495int
aurel32ca587a82008-12-18 22:44:13 +00001496gdb_queuesig (void)
1497{
1498 GDBState *s;
1499
1500 s = gdbserver_state;
1501
1502 if (gdbserver_fd < 0 || s->fd < 0)
1503 return 0;
1504 else
1505 return 1;
1506}
1507
1508int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001509gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001510{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001511 GDBState *s;
1512 char buf[256];
1513 int n;
bellard1fddef42005-04-17 19:16:13 +00001514
Andreas Färber5ca666c2013-06-24 19:20:57 +02001515 s = gdbserver_state;
1516 if (gdbserver_fd < 0 || s->fd < 0) {
1517 return sig;
bellard1fddef42005-04-17 19:16:13 +00001518 }
1519
Andreas Färber5ca666c2013-06-24 19:20:57 +02001520 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001521 cpu_single_step(cpu, 0);
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001522 tb_flush(cpu);
bellard1fddef42005-04-17 19:16:13 +00001523
Andreas Färber5ca666c2013-06-24 19:20:57 +02001524 if (sig != 0) {
1525 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1526 put_packet(s, buf);
1527 }
1528 /* put_packet() might have detected that the peer terminated the
1529 connection. */
1530 if (s->fd < 0) {
1531 return sig;
1532 }
1533
1534 sig = 0;
1535 s->state = RS_IDLE;
1536 s->running_state = 0;
1537 while (s->running_state == 0) {
1538 n = read(s->fd, buf, 256);
1539 if (n > 0) {
1540 int i;
1541
1542 for (i = 0; i < n; i++) {
1543 gdb_read_byte(s, buf[i]);
1544 }
1545 } else if (n == 0 || errno != EAGAIN) {
1546 /* XXX: Connection closed. Should probably wait for another
1547 connection before continuing. */
1548 return sig;
bellard1fddef42005-04-17 19:16:13 +00001549 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001550 }
1551 sig = s->signal;
1552 s->signal = 0;
1553 return sig;
bellard1fddef42005-04-17 19:16:13 +00001554}
bellarde9009672005-04-26 20:42:36 +00001555
aurel32ca587a82008-12-18 22:44:13 +00001556/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001557void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001558{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001559 GDBState *s;
1560 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001561
Andreas Färber5ca666c2013-06-24 19:20:57 +02001562 s = gdbserver_state;
1563 if (gdbserver_fd < 0 || s->fd < 0) {
1564 return;
1565 }
aurel32ca587a82008-12-18 22:44:13 +00001566
Andreas Färber5ca666c2013-06-24 19:20:57 +02001567 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1568 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001569}
bellard1fddef42005-04-17 19:16:13 +00001570
aliguori880a7572008-11-18 20:30:24 +00001571static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001572{
1573 GDBState *s;
1574 struct sockaddr_in sockaddr;
1575 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001576 int fd;
bellard858693c2004-03-31 18:52:07 +00001577
1578 for(;;) {
1579 len = sizeof(sockaddr);
1580 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1581 if (fd < 0 && errno != EINTR) {
1582 perror("accept");
1583 return;
1584 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001585#ifndef _WIN32
1586 fcntl(fd, F_SETFD, FD_CLOEXEC);
1587#endif
bellard858693c2004-03-31 18:52:07 +00001588 break;
1589 }
1590 }
1591
1592 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001593 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00001594
Anthony Liguori7267c092011-08-20 22:09:37 -05001595 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001596 s->c_cpu = first_cpu;
1597 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00001598 s->fd = fd;
Andreas Färber5b50e792013-06-29 04:18:45 +02001599 gdb_has_xml = false;
bellard858693c2004-03-31 18:52:07 +00001600
aliguori880a7572008-11-18 20:30:24 +00001601 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00001602
bellard858693c2004-03-31 18:52:07 +00001603 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00001604}
1605
1606static int gdbserver_open(int port)
1607{
1608 struct sockaddr_in sockaddr;
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001609 int fd, ret;
bellard858693c2004-03-31 18:52:07 +00001610
1611 fd = socket(PF_INET, SOCK_STREAM, 0);
1612 if (fd < 0) {
1613 perror("socket");
1614 return -1;
1615 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001616#ifndef _WIN32
1617 fcntl(fd, F_SETFD, FD_CLOEXEC);
1618#endif
bellard858693c2004-03-31 18:52:07 +00001619
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001620 socket_set_fast_reuse(fd);
bellard858693c2004-03-31 18:52:07 +00001621
1622 sockaddr.sin_family = AF_INET;
1623 sockaddr.sin_port = htons(port);
1624 sockaddr.sin_addr.s_addr = 0;
1625 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1626 if (ret < 0) {
1627 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001628 close(fd);
bellard858693c2004-03-31 18:52:07 +00001629 return -1;
1630 }
1631 ret = listen(fd, 0);
1632 if (ret < 0) {
1633 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001634 close(fd);
bellard858693c2004-03-31 18:52:07 +00001635 return -1;
1636 }
bellard858693c2004-03-31 18:52:07 +00001637 return fd;
1638}
1639
1640int gdbserver_start(int port)
1641{
1642 gdbserver_fd = gdbserver_open(port);
1643 if (gdbserver_fd < 0)
1644 return -1;
1645 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00001646 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00001647 return 0;
1648}
aurel322b1319c2008-12-18 22:44:04 +00001649
1650/* Disable gdb stub for child processes. */
Peter Crosthwaitef7ec7f72015-06-23 19:31:16 -07001651void gdbserver_fork(CPUState *cpu)
aurel322b1319c2008-12-18 22:44:04 +00001652{
1653 GDBState *s = gdbserver_state;
Andreas Färber75a34032013-09-02 16:57:02 +02001654
1655 if (gdbserver_fd < 0 || s->fd < 0) {
1656 return;
1657 }
aurel322b1319c2008-12-18 22:44:04 +00001658 close(s->fd);
1659 s->fd = -1;
Andreas Färberb3310ab2013-09-02 17:26:20 +02001660 cpu_breakpoint_remove_all(cpu, BP_GDB);
Andreas Färber75a34032013-09-02 16:57:02 +02001661 cpu_watchpoint_remove_all(cpu, BP_GDB);
aurel322b1319c2008-12-18 22:44:04 +00001662}
pbrook4046d912007-01-28 01:53:16 +00001663#else
thsaa1f17c2007-07-11 22:48:58 +00001664static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001665{
pbrook56aebc82008-10-11 17:55:29 +00001666 /* We can handle an arbitrarily large amount of data.
1667 Pick the maximum packet size, which is as good as anything. */
1668 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001669}
1670
thsaa1f17c2007-07-11 22:48:58 +00001671static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001672{
pbrook4046d912007-01-28 01:53:16 +00001673 int i;
1674
1675 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00001676 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00001677 }
1678}
1679
1680static void gdb_chr_event(void *opaque, int event)
1681{
1682 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05301683 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001684 vm_stop(RUN_STATE_PAUSED);
Andreas Färber5b50e792013-06-29 04:18:45 +02001685 gdb_has_xml = false;
pbrook4046d912007-01-28 01:53:16 +00001686 break;
1687 default:
1688 break;
1689 }
1690}
1691
aliguori8a34a0f2009-03-05 23:01:55 +00001692static void gdb_monitor_output(GDBState *s, const char *msg, int len)
1693{
1694 char buf[MAX_PACKET_LENGTH];
1695
1696 buf[0] = 'O';
1697 if (len > (MAX_PACKET_LENGTH/2) - 1)
1698 len = (MAX_PACKET_LENGTH/2) - 1;
1699 memtohex(buf + 1, (uint8_t *)msg, len);
1700 put_packet(s, buf);
1701}
1702
1703static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
1704{
1705 const char *p = (const char *)buf;
1706 int max_sz;
1707
1708 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
1709 for (;;) {
1710 if (len <= max_sz) {
1711 gdb_monitor_output(gdbserver_state, p, len);
1712 break;
1713 }
1714 gdb_monitor_output(gdbserver_state, p, max_sz);
1715 p += max_sz;
1716 len -= max_sz;
1717 }
1718 return len;
1719}
1720
aliguori59030a82009-04-05 18:43:41 +00001721#ifndef _WIN32
1722static void gdb_sigterm_handler(int signal)
1723{
Luiz Capitulino13548692011-07-29 15:36:43 -03001724 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001725 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001726 }
aliguori59030a82009-04-05 18:43:41 +00001727}
1728#endif
1729
1730int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00001731{
1732 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00001733 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00001734 CharDriverState *chr = NULL;
1735 CharDriverState *mon_chr;
Daniel P. Berranged0d77082016-01-11 12:44:41 +00001736 ChardevCommon common = { 0 };
pbrook4046d912007-01-28 01:53:16 +00001737
aliguori59030a82009-04-05 18:43:41 +00001738 if (!device)
1739 return -1;
1740 if (strcmp(device, "none") != 0) {
1741 if (strstart(device, "tcp:", NULL)) {
1742 /* enforce required TCP attributes */
1743 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
1744 "%s,nowait,nodelay,server", device);
1745 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00001746 }
aliguori59030a82009-04-05 18:43:41 +00001747#ifndef _WIN32
1748 else if (strcmp(device, "stdio") == 0) {
1749 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00001750
aliguori59030a82009-04-05 18:43:41 +00001751 memset(&act, 0, sizeof(act));
1752 act.sa_handler = gdb_sigterm_handler;
1753 sigaction(SIGINT, &act, NULL);
1754 }
1755#endif
Pavel Dovgalyuk33577b42016-03-14 10:44:36 +03001756 chr = qemu_chr_new_noreplay("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00001757 if (!chr)
1758 return -1;
1759
Hans de Goede456d6062013-03-27 20:29:40 +01001760 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00001761 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
1762 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00001763 }
1764
aliguori36556b22009-03-28 18:05:53 +00001765 s = gdbserver_state;
1766 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05001767 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00001768 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00001769
aliguori36556b22009-03-28 18:05:53 +00001770 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
1771
1772 /* Initialize a monitor terminal for gdb */
Daniel P. Berranged0d77082016-01-11 12:44:41 +00001773 mon_chr = qemu_chr_alloc(&common, &error_abort);
aliguori36556b22009-03-28 18:05:53 +00001774 mon_chr->chr_write = gdb_monitor_write;
1775 monitor_init(mon_chr, 0);
1776 } else {
1777 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001778 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00001779 mon_chr = s->mon_chr;
1780 memset(s, 0, sizeof(GDBState));
1781 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001782 s->c_cpu = first_cpu;
1783 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00001784 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00001785 s->state = chr ? RS_IDLE : RS_INACTIVE;
1786 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00001787 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00001788
pbrook4046d912007-01-28 01:53:16 +00001789 return 0;
1790}
1791#endif