blob: 6c0db4f87d48625bad2ae525c4c3192a205ece34 [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 */
pbrook978efd62006-06-17 18:30:42 +000019#include "config.h"
pbrook56aebc82008-10-11 17:55:29 +000020#include "qemu-common.h"
bellard1fddef42005-04-17 19:16:13 +000021#ifdef CONFIG_USER_ONLY
22#include <stdlib.h>
23#include <stdio.h>
24#include <stdarg.h>
25#include <string.h>
26#include <errno.h>
27#include <unistd.h>
pbrook978efd62006-06-17 18:30:42 +000028#include <fcntl.h>
bellard1fddef42005-04-17 19:16:13 +000029
30#include "qemu.h"
31#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010032#include "monitor/monitor.h"
Paolo Bonzinidccfcd02013-04-08 16:55:25 +020033#include "sysemu/char.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010034#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010035#include "exec/gdbstub.h"
bellard1fddef42005-04-17 19:16:13 +000036#endif
bellard67b915a2004-03-31 23:37:16 +000037
pbrook56aebc82008-10-11 17:55:29 +000038#define MAX_PACKET_LENGTH 4096
39
Blue Swirl2b41f102011-06-19 20:38:22 +000040#include "cpu.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010041#include "qemu/sockets.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010042#include "sysemu/kvm.h"
aurel32ca587a82008-12-18 22:44:13 +000043
Andreas Färberf3659ee2013-06-27 19:09:09 +020044static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
45 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020046{
Andreas Färberf3659ee2013-06-27 19:09:09 +020047 CPUClass *cc = CPU_GET_CLASS(cpu);
48
49 if (cc->memory_rw_debug) {
50 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
51 }
52 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020053}
aurel32ca587a82008-12-18 22:44:13 +000054
55enum {
56 GDB_SIGNAL_0 = 0,
57 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010058 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000059 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010060 GDB_SIGNAL_ABRT = 6,
61 GDB_SIGNAL_ALRM = 14,
62 GDB_SIGNAL_IO = 23,
63 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000064 GDB_SIGNAL_UNKNOWN = 143
65};
66
67#ifdef CONFIG_USER_ONLY
68
69/* Map target signal numbers to GDB protocol signal numbers and vice
70 * versa. For user emulation's currently supported systems, we can
71 * assume most signals are defined.
72 */
73
74static int gdb_signal_table[] = {
75 0,
76 TARGET_SIGHUP,
77 TARGET_SIGINT,
78 TARGET_SIGQUIT,
79 TARGET_SIGILL,
80 TARGET_SIGTRAP,
81 TARGET_SIGABRT,
82 -1, /* SIGEMT */
83 TARGET_SIGFPE,
84 TARGET_SIGKILL,
85 TARGET_SIGBUS,
86 TARGET_SIGSEGV,
87 TARGET_SIGSYS,
88 TARGET_SIGPIPE,
89 TARGET_SIGALRM,
90 TARGET_SIGTERM,
91 TARGET_SIGURG,
92 TARGET_SIGSTOP,
93 TARGET_SIGTSTP,
94 TARGET_SIGCONT,
95 TARGET_SIGCHLD,
96 TARGET_SIGTTIN,
97 TARGET_SIGTTOU,
98 TARGET_SIGIO,
99 TARGET_SIGXCPU,
100 TARGET_SIGXFSZ,
101 TARGET_SIGVTALRM,
102 TARGET_SIGPROF,
103 TARGET_SIGWINCH,
104 -1, /* SIGLOST */
105 TARGET_SIGUSR1,
106 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000107#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000108 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000109#else
110 -1,
111#endif
aurel32ca587a82008-12-18 22:44:13 +0000112 -1, /* SIGPOLL */
113 -1,
114 -1,
115 -1,
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
123 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000124#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000125 __SIGRTMIN + 1,
126 __SIGRTMIN + 2,
127 __SIGRTMIN + 3,
128 __SIGRTMIN + 4,
129 __SIGRTMIN + 5,
130 __SIGRTMIN + 6,
131 __SIGRTMIN + 7,
132 __SIGRTMIN + 8,
133 __SIGRTMIN + 9,
134 __SIGRTMIN + 10,
135 __SIGRTMIN + 11,
136 __SIGRTMIN + 12,
137 __SIGRTMIN + 13,
138 __SIGRTMIN + 14,
139 __SIGRTMIN + 15,
140 __SIGRTMIN + 16,
141 __SIGRTMIN + 17,
142 __SIGRTMIN + 18,
143 __SIGRTMIN + 19,
144 __SIGRTMIN + 20,
145 __SIGRTMIN + 21,
146 __SIGRTMIN + 22,
147 __SIGRTMIN + 23,
148 __SIGRTMIN + 24,
149 __SIGRTMIN + 25,
150 __SIGRTMIN + 26,
151 __SIGRTMIN + 27,
152 __SIGRTMIN + 28,
153 __SIGRTMIN + 29,
154 __SIGRTMIN + 30,
155 __SIGRTMIN + 31,
156 -1, /* SIGCANCEL */
157 __SIGRTMIN,
158 __SIGRTMIN + 32,
159 __SIGRTMIN + 33,
160 __SIGRTMIN + 34,
161 __SIGRTMIN + 35,
162 __SIGRTMIN + 36,
163 __SIGRTMIN + 37,
164 __SIGRTMIN + 38,
165 __SIGRTMIN + 39,
166 __SIGRTMIN + 40,
167 __SIGRTMIN + 41,
168 __SIGRTMIN + 42,
169 __SIGRTMIN + 43,
170 __SIGRTMIN + 44,
171 __SIGRTMIN + 45,
172 __SIGRTMIN + 46,
173 __SIGRTMIN + 47,
174 __SIGRTMIN + 48,
175 __SIGRTMIN + 49,
176 __SIGRTMIN + 50,
177 __SIGRTMIN + 51,
178 __SIGRTMIN + 52,
179 __SIGRTMIN + 53,
180 __SIGRTMIN + 54,
181 __SIGRTMIN + 55,
182 __SIGRTMIN + 56,
183 __SIGRTMIN + 57,
184 __SIGRTMIN + 58,
185 __SIGRTMIN + 59,
186 __SIGRTMIN + 60,
187 __SIGRTMIN + 61,
188 __SIGRTMIN + 62,
189 __SIGRTMIN + 63,
190 __SIGRTMIN + 64,
191 __SIGRTMIN + 65,
192 __SIGRTMIN + 66,
193 __SIGRTMIN + 67,
194 __SIGRTMIN + 68,
195 __SIGRTMIN + 69,
196 __SIGRTMIN + 70,
197 __SIGRTMIN + 71,
198 __SIGRTMIN + 72,
199 __SIGRTMIN + 73,
200 __SIGRTMIN + 74,
201 __SIGRTMIN + 75,
202 __SIGRTMIN + 76,
203 __SIGRTMIN + 77,
204 __SIGRTMIN + 78,
205 __SIGRTMIN + 79,
206 __SIGRTMIN + 80,
207 __SIGRTMIN + 81,
208 __SIGRTMIN + 82,
209 __SIGRTMIN + 83,
210 __SIGRTMIN + 84,
211 __SIGRTMIN + 85,
212 __SIGRTMIN + 86,
213 __SIGRTMIN + 87,
214 __SIGRTMIN + 88,
215 __SIGRTMIN + 89,
216 __SIGRTMIN + 90,
217 __SIGRTMIN + 91,
218 __SIGRTMIN + 92,
219 __SIGRTMIN + 93,
220 __SIGRTMIN + 94,
221 __SIGRTMIN + 95,
222 -1, /* SIGINFO */
223 -1, /* UNKNOWN */
224 -1, /* DEFAULT */
225 -1,
226 -1,
227 -1,
228 -1,
229 -1,
230 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000231#endif
aurel32ca587a82008-12-18 22:44:13 +0000232};
bellard8f447cc2006-06-14 15:21:14 +0000233#else
aurel32ca587a82008-12-18 22:44:13 +0000234/* In system mode we only need SIGINT and SIGTRAP; other signals
235 are not yet supported. */
236
237enum {
238 TARGET_SIGINT = 2,
239 TARGET_SIGTRAP = 5
240};
241
242static int gdb_signal_table[] = {
243 -1,
244 -1,
245 TARGET_SIGINT,
246 -1,
247 -1,
248 TARGET_SIGTRAP
249};
bellard8f447cc2006-06-14 15:21:14 +0000250#endif
bellardb4608c02003-06-27 17:34:32 +0000251
aurel32ca587a82008-12-18 22:44:13 +0000252#ifdef CONFIG_USER_ONLY
253static int target_signal_to_gdb (int sig)
254{
255 int i;
256 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
257 if (gdb_signal_table[i] == sig)
258 return i;
259 return GDB_SIGNAL_UNKNOWN;
260}
261#endif
262
263static int gdb_signal_to_target (int sig)
264{
265 if (sig < ARRAY_SIZE (gdb_signal_table))
266 return gdb_signal_table[sig];
267 else
268 return -1;
269}
270
bellard4abe6152003-07-26 18:01:58 +0000271//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000272
pbrook56aebc82008-10-11 17:55:29 +0000273typedef struct GDBRegisterState {
274 int base_reg;
275 int num_regs;
276 gdb_reg_cb get_reg;
277 gdb_reg_cb set_reg;
278 const char *xml;
279 struct GDBRegisterState *next;
280} GDBRegisterState;
281
bellard858693c2004-03-31 18:52:07 +0000282enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000283 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000284 RS_IDLE,
285 RS_GETLINE,
286 RS_CHKSUM1,
287 RS_CHKSUM2,
288};
bellard858693c2004-03-31 18:52:07 +0000289typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200290 CPUState *c_cpu; /* current CPU for step/continue ops */
291 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200292 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000293 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000294 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000295 int line_buf_index;
296 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000297 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000298 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000299 int signal;
bellard41625032005-04-24 10:07:11 +0000300#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000301 int fd;
bellard41625032005-04-24 10:07:11 +0000302 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000303#else
304 CharDriverState *chr;
aliguori8a34a0f2009-03-05 23:01:55 +0000305 CharDriverState *mon_chr;
bellard41625032005-04-24 10:07:11 +0000306#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000307 char syscall_buf[256];
308 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000309} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000310
edgar_igl60897d32008-05-09 08:25:14 +0000311/* By default use no IRQs and no timers while single stepping so as to
312 * make single stepping like an ICE HW step.
313 */
314static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
315
aliguori880a7572008-11-18 20:30:24 +0000316static GDBState *gdbserver_state;
317
Andreas Färber5b50e792013-06-29 04:18:45 +0200318bool gdb_has_xml;
pbrook56aebc82008-10-11 17:55:29 +0000319
Liviu Ionescua38bb072014-12-11 12:07:48 +0000320int semihosting_target = SEMIHOSTING_TARGET_AUTO;
321
bellard1fddef42005-04-17 19:16:13 +0000322#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000323/* XXX: This is not thread safe. Do we care? */
324static int gdbserver_fd = -1;
325
bellard858693c2004-03-31 18:52:07 +0000326static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000327{
328 uint8_t ch;
329 int ret;
330
331 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000332 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000333 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000334 if (errno == ECONNRESET)
335 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000336 if (errno != EINTR && errno != EAGAIN)
337 return -1;
338 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000339 close(s->fd);
340 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000341 return -1;
342 } else {
343 break;
344 }
345 }
346 return ch;
347}
pbrook4046d912007-01-28 01:53:16 +0000348#endif
bellardb4608c02003-06-27 17:34:32 +0000349
blueswir1654efcf2009-04-18 07:29:59 +0000350static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000351 GDB_SYS_UNKNOWN,
352 GDB_SYS_ENABLED,
353 GDB_SYS_DISABLED,
354} gdb_syscall_mode;
355
Liviu Ionescua38bb072014-12-11 12:07:48 +0000356/* Decide if either remote gdb syscalls or native file IO should be used. */
pbrooka2d1eba2007-01-28 03:10:55 +0000357int use_gdb_syscalls(void)
358{
Liviu Ionescua38bb072014-12-11 12:07:48 +0000359 if (semihosting_target == SEMIHOSTING_TARGET_NATIVE) {
360 /* -semihosting-config target=native */
361 return false;
362 } else if (semihosting_target == SEMIHOSTING_TARGET_GDB) {
363 /* -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
blueswir15b3715b2008-10-25 11:18:12 +0000537 snprintf(target_xml, sizeof(target_xml),
538 "<?xml version=\"1.0\"?>"
539 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
540 "<target>"
541 "<xi:include href=\"%s\"/>",
Andreas Färber5b24c642013-07-07 15:08:22 +0200542 cc->gdb_core_xml_file);
pbrook56aebc82008-10-11 17:55:29 +0000543
Andreas Färbereac8b352013-06-28 21:11:37 +0200544 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000545 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
546 pstrcat(target_xml, sizeof(target_xml), r->xml);
547 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000548 }
blueswir12dc766d2009-04-13 16:06:19 +0000549 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000550 }
551 return target_xml;
552 }
553 for (i = 0; ; i++) {
554 name = xml_builtin[i][0];
555 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
556 break;
557 }
558 return name ? xml_builtin[i][1] : NULL;
559}
pbrook56aebc82008-10-11 17:55:29 +0000560
Andreas Färber385b9f02013-06-27 18:25:36 +0200561static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000562{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200563 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200564 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000565 GDBRegisterState *r;
566
Andreas Färbera0e372f2013-06-28 23:18:47 +0200567 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200568 return cc->gdb_read_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200569 }
pbrook56aebc82008-10-11 17:55:29 +0000570
Andreas Färbereac8b352013-06-28 21:11:37 +0200571 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000572 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
573 return r->get_reg(env, mem_buf, reg - r->base_reg);
574 }
575 }
576 return 0;
577}
578
Andreas Färber385b9f02013-06-27 18:25:36 +0200579static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000580{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200581 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200582 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000583 GDBRegisterState *r;
584
Andreas Färbera0e372f2013-06-28 23:18:47 +0200585 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200586 return cc->gdb_write_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200587 }
pbrook56aebc82008-10-11 17:55:29 +0000588
Andreas Färbereac8b352013-06-28 21:11:37 +0200589 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000590 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
591 return r->set_reg(env, mem_buf, reg - r->base_reg);
592 }
593 }
594 return 0;
595}
596
597/* Register a supplemental set of CPU registers. If g_pos is nonzero it
598 specifies the first register number and these registers are included in
599 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
600 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
601 */
602
Andreas Färber22169d42013-06-28 21:27:39 +0200603void gdb_register_coprocessor(CPUState *cpu,
604 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
605 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000606{
607 GDBRegisterState *s;
608 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000609
Andreas Färbereac8b352013-06-28 21:11:37 +0200610 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000611 while (*p) {
612 /* Check for duplicates. */
613 if (strcmp((*p)->xml, xml) == 0)
614 return;
615 p = &(*p)->next;
616 }
Stefan Weil9643c252011-10-18 22:25:38 +0200617
618 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200619 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200620 s->num_regs = num_regs;
621 s->get_reg = get_reg;
622 s->set_reg = set_reg;
623 s->xml = xml;
624
pbrook56aebc82008-10-11 17:55:29 +0000625 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200626 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000627 *p = s;
628 if (g_pos) {
629 if (g_pos != s->base_reg) {
630 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
631 "Expected %d got %d\n", xml, g_pos, s->base_reg);
Andreas Färber35143f02013-08-12 18:09:47 +0200632 } else {
633 cpu->gdb_num_g_regs = cpu->gdb_num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000634 }
635 }
636}
637
aliguoria1d1bb32008-11-18 20:07:32 +0000638#ifndef CONFIG_USER_ONLY
Peter Maydell2472b6c2014-09-12 19:04:17 +0100639/* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
640static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
641{
642 static const int xlat[] = {
643 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
644 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
645 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
646 };
647
648 CPUClass *cc = CPU_GET_CLASS(cpu);
649 int cputype = xlat[gdbtype];
650
651 if (cc->gdb_stop_before_watchpoint) {
652 cputype |= BP_STOP_BEFORE_ACCESS;
653 }
654 return cputype;
655}
aliguoria1d1bb32008-11-18 20:07:32 +0000656#endif
657
aliguori880a7572008-11-18 20:30:24 +0000658static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000659{
Andreas Färber182735e2013-05-29 22:29:20 +0200660 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000661 int err = 0;
662
Andreas Färber62278812013-06-27 17:12:06 +0200663 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200664 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200665 }
aliguorie22a25c2009-03-12 20:12:48 +0000666
aliguoria1d1bb32008-11-18 20:07:32 +0000667 switch (type) {
668 case GDB_BREAKPOINT_SW:
669 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200670 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200671 err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
672 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000673 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200674 }
aliguori880a7572008-11-18 20:30:24 +0000675 }
676 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000677#ifndef CONFIG_USER_ONLY
678 case GDB_WATCHPOINT_WRITE:
679 case GDB_WATCHPOINT_READ:
680 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200681 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100682 err = cpu_watchpoint_insert(cpu, addr, len,
683 xlat_gdb_type(cpu, type), NULL);
684 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000685 break;
Peter Maydell2472b6c2014-09-12 19:04:17 +0100686 }
aliguori880a7572008-11-18 20:30:24 +0000687 }
688 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000689#endif
690 default:
691 return -ENOSYS;
692 }
693}
694
aliguori880a7572008-11-18 20:30:24 +0000695static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000696{
Andreas Färber182735e2013-05-29 22:29:20 +0200697 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000698 int err = 0;
699
Andreas Färber62278812013-06-27 17:12:06 +0200700 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200701 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200702 }
aliguorie22a25c2009-03-12 20:12:48 +0000703
aliguoria1d1bb32008-11-18 20:07:32 +0000704 switch (type) {
705 case GDB_BREAKPOINT_SW:
706 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200707 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200708 err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
709 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000710 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200711 }
aliguori880a7572008-11-18 20:30:24 +0000712 }
713 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000714#ifndef CONFIG_USER_ONLY
715 case GDB_WATCHPOINT_WRITE:
716 case GDB_WATCHPOINT_READ:
717 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200718 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100719 err = cpu_watchpoint_remove(cpu, addr, len,
720 xlat_gdb_type(cpu, type));
aliguori880a7572008-11-18 20:30:24 +0000721 if (err)
722 break;
723 }
724 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000725#endif
726 default:
727 return -ENOSYS;
728 }
729}
730
aliguori880a7572008-11-18 20:30:24 +0000731static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +0000732{
Andreas Färber182735e2013-05-29 22:29:20 +0200733 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000734
aliguorie22a25c2009-03-12 20:12:48 +0000735 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200736 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +0000737 return;
738 }
739
Andreas Färberbdc44642013-06-24 23:50:24 +0200740 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200741 cpu_breakpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000742#ifndef CONFIG_USER_ONLY
Andreas Färber75a34032013-09-02 16:57:02 +0200743 cpu_watchpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000744#endif
aliguori880a7572008-11-18 20:30:24 +0000745 }
aliguoria1d1bb32008-11-18 20:07:32 +0000746}
747
aurel32fab9d282009-04-08 21:29:37 +0000748static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
749{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200750 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +0200751 CPUClass *cc = CPU_GET_CLASS(cpu);
752
753 cpu_synchronize_state(cpu);
754 if (cc->set_pc) {
755 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -0800756 }
aurel32fab9d282009-04-08 21:29:37 +0000757}
758
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200759static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700760{
Andreas Färber0d342822012-12-17 07:12:13 +0100761 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700762
Andreas Färberbdc44642013-06-24 23:50:24 +0200763 CPU_FOREACH(cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +0200764 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200765 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +0200766 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700767 }
Andreas Färberaa48dd92013-07-09 20:50:52 +0200768
769 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700770}
771
Jan Kiszka4dabe742015-02-07 09:38:43 +0100772static int is_query_packet(const char *p, const char *query, char separator)
773{
774 unsigned int query_len = strlen(query);
775
776 return strncmp(p, query, query_len) == 0 &&
777 (p[query_len] == '\0' || p[query_len] == separator);
778}
779
aliguori880a7572008-11-18 20:30:24 +0000780static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +0000781{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200782 CPUState *cpu;
Andreas Färber5b24c642013-07-07 15:08:22 +0200783 CPUClass *cc;
bellardb4608c02003-06-27 17:34:32 +0000784 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700785 uint32_t thread;
786 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +0000787 char buf[MAX_PACKET_LENGTH];
788 uint8_t mem_buf[MAX_PACKET_LENGTH];
789 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +0000790 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +0000791
bellard858693c2004-03-31 18:52:07 +0000792#ifdef DEBUG_GDB
793 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +0000794#endif
bellard858693c2004-03-31 18:52:07 +0000795 p = line_buf;
796 ch = *p++;
797 switch(ch) {
798 case '?':
bellard1fddef42005-04-17 19:16:13 +0000799 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +0000800 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200801 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +0000802 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +0000803 /* Remove all the breakpoints when this query is issued,
804 * because gdb is doing and initial connect and the state
805 * should be cleaned up.
806 */
aliguori880a7572008-11-18 20:30:24 +0000807 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +0000808 break;
809 case 'c':
810 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +0000811 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000812 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000813 }
aurel32ca587a82008-12-18 22:44:13 +0000814 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +0000815 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000816 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +0000817 case 'C':
aurel32ca587a82008-12-18 22:44:13 +0000818 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
819 if (s->signal == -1)
820 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +0000821 gdb_continue(s);
822 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200823 case 'v':
824 if (strncmp(p, "Cont", 4) == 0) {
825 int res_signal, res_thread;
826
827 p += 4;
828 if (*p == '?') {
829 put_packet(s, "vCont;c;C;s;S");
830 break;
831 }
832 res = 0;
833 res_signal = 0;
834 res_thread = 0;
835 while (*p) {
836 int action, signal;
837
838 if (*p++ != ';') {
839 res = 0;
840 break;
841 }
842 action = *p++;
843 signal = 0;
844 if (action == 'C' || action == 'S') {
Martin Simmonsf17b0692014-11-05 14:47:39 +0000845 signal = gdb_signal_to_target(strtoul(p, (char **)&p, 16));
846 if (signal == -1) {
847 signal = 0;
848 }
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200849 } else if (action != 'c' && action != 's') {
850 res = 0;
851 break;
852 }
853 thread = 0;
854 if (*p == ':') {
855 thread = strtoull(p+1, (char **)&p, 16);
856 }
857 action = tolower(action);
858 if (res == 0 || (res == 'c' && action == 's')) {
859 res = action;
860 res_signal = signal;
861 res_thread = thread;
862 }
863 }
864 if (res) {
865 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200866 cpu = find_cpu(res_thread);
867 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200868 put_packet(s, "E22");
869 break;
870 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200871 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200872 }
873 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200874 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200875 }
876 s->signal = res_signal;
877 gdb_continue(s);
878 return RS_IDLE;
879 }
880 break;
881 } else {
882 goto unknown_command;
883 }
edgar_igl7d03f822008-05-17 18:58:29 +0000884 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +0100885#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +0000886 /* Kill the target */
887 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
888 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +0100889#endif
edgar_igl7d03f822008-05-17 18:58:29 +0000890 case 'D':
891 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +0000892 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -0300893 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +0000894 gdb_continue(s);
895 put_packet(s, "OK");
896 break;
bellard858693c2004-03-31 18:52:07 +0000897 case 's':
898 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +0000899 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000900 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000901 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200902 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +0000903 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000904 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +0000905 case 'F':
906 {
907 target_ulong ret;
908 target_ulong err;
909
910 ret = strtoull(p, (char **)&p, 16);
911 if (*p == ',') {
912 p++;
913 err = strtoull(p, (char **)&p, 16);
914 } else {
915 err = 0;
916 }
917 if (*p == ',')
918 p++;
919 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +0000920 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200921 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +0000922 s->current_syscall_cb = NULL;
923 }
pbrooka2d1eba2007-01-28 03:10:55 +0000924 if (type == 'C') {
925 put_packet(s, "T02");
926 } else {
edgar_iglba70a622008-03-14 06:10:42 +0000927 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +0000928 }
929 }
930 break;
bellard858693c2004-03-31 18:52:07 +0000931 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200932 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +0000933 len = 0;
Andreas Färber35143f02013-08-12 18:09:47 +0200934 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200935 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +0000936 len += reg_size;
937 }
938 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +0000939 put_packet(s, buf);
940 break;
941 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200942 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +0000943 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +0000944 len = strlen(p) / 2;
945 hextomem((uint8_t *)registers, p, len);
Andreas Färber35143f02013-08-12 18:09:47 +0200946 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200947 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +0000948 len -= reg_size;
949 registers += reg_size;
950 }
bellard858693c2004-03-31 18:52:07 +0000951 put_packet(s, "OK");
952 break;
953 case 'm':
bellard9d9754a2006-06-25 15:32:37 +0000954 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +0000955 if (*p == ',')
956 p++;
bellard9d9754a2006-06-25 15:32:37 +0000957 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200958 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +0000959 put_packet (s, "E14");
960 } else {
961 memtohex(buf, mem_buf, len);
962 put_packet(s, buf);
963 }
bellard858693c2004-03-31 18:52:07 +0000964 break;
965 case 'M':
bellard9d9754a2006-06-25 15:32:37 +0000966 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +0000967 if (*p == ',')
968 p++;
bellard9d9754a2006-06-25 15:32:37 +0000969 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +0000970 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +0000971 p++;
972 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200973 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +0200974 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +0000975 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +0200976 } else {
bellard858693c2004-03-31 18:52:07 +0000977 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +0200978 }
bellard858693c2004-03-31 18:52:07 +0000979 break;
pbrook56aebc82008-10-11 17:55:29 +0000980 case 'p':
981 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
982 This works, but can be very slow. Anything new enough to
983 understand XML also knows how to use this properly. */
984 if (!gdb_has_xml)
985 goto unknown_command;
986 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200987 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +0000988 if (reg_size) {
989 memtohex(buf, mem_buf, reg_size);
990 put_packet(s, buf);
991 } else {
992 put_packet(s, "E14");
993 }
994 break;
995 case 'P':
996 if (!gdb_has_xml)
997 goto unknown_command;
998 addr = strtoull(p, (char **)&p, 16);
999 if (*p == '=')
1000 p++;
1001 reg_size = strlen(p) / 2;
1002 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001003 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001004 put_packet(s, "OK");
1005 break;
bellard858693c2004-03-31 18:52:07 +00001006 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001007 case 'z':
1008 type = strtoul(p, (char **)&p, 16);
1009 if (*p == ',')
1010 p++;
bellard9d9754a2006-06-25 15:32:37 +00001011 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001012 if (*p == ',')
1013 p++;
bellard9d9754a2006-06-25 15:32:37 +00001014 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001015 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001016 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001017 else
aliguori880a7572008-11-18 20:30:24 +00001018 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001019 if (res >= 0)
1020 put_packet(s, "OK");
1021 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001022 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001023 else
1024 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001025 break;
aliguori880a7572008-11-18 20:30:24 +00001026 case 'H':
1027 type = *p++;
1028 thread = strtoull(p, (char **)&p, 16);
1029 if (thread == -1 || thread == 0) {
1030 put_packet(s, "OK");
1031 break;
1032 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001033 cpu = find_cpu(thread);
1034 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001035 put_packet(s, "E22");
1036 break;
1037 }
1038 switch (type) {
1039 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001040 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001041 put_packet(s, "OK");
1042 break;
1043 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001044 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001045 put_packet(s, "OK");
1046 break;
1047 default:
1048 put_packet(s, "E22");
1049 break;
1050 }
1051 break;
1052 case 'T':
1053 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001054 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001055
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001056 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001057 put_packet(s, "OK");
1058 } else {
aliguori880a7572008-11-18 20:30:24 +00001059 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001060 }
aliguori880a7572008-11-18 20:30:24 +00001061 break;
pbrook978efd62006-06-17 18:30:42 +00001062 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001063 case 'Q':
1064 /* parse any 'q' packets here */
1065 if (!strcmp(p,"qemu.sstepbits")) {
1066 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001067 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1068 SSTEP_ENABLE,
1069 SSTEP_NOIRQ,
1070 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001071 put_packet(s, buf);
1072 break;
Jan Kiszka4dabe742015-02-07 09:38:43 +01001073 } else if (is_query_packet(p, "qemu.sstep", '=')) {
edgar_igl60897d32008-05-09 08:25:14 +00001074 /* Display or change the sstep_flags */
1075 p += 10;
1076 if (*p != '=') {
1077 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001078 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001079 put_packet(s, buf);
1080 break;
1081 }
1082 p++;
1083 type = strtoul(p, (char **)&p, 16);
1084 sstep_flags = type;
1085 put_packet(s, "OK");
1086 break;
aliguori880a7572008-11-18 20:30:24 +00001087 } else if (strcmp(p,"C") == 0) {
1088 /* "Current thread" remains vague in the spec, so always return
1089 * the first CPU (gdb returns the first thread). */
1090 put_packet(s, "QC1");
1091 break;
1092 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001093 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001094 goto report_cpuinfo;
1095 } else if (strcmp(p,"sThreadInfo") == 0) {
1096 report_cpuinfo:
1097 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001098 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001099 put_packet(s, buf);
Andreas Färberbdc44642013-06-24 23:50:24 +02001100 s->query_cpu = CPU_NEXT(s->query_cpu);
aliguori880a7572008-11-18 20:30:24 +00001101 } else
1102 put_packet(s, "l");
1103 break;
1104 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1105 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001106 cpu = find_cpu(thread);
1107 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001108 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001109 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001110 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001111 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001112 memtohex(buf, mem_buf, len);
1113 put_packet(s, buf);
1114 }
aliguori880a7572008-11-18 20:30:24 +00001115 break;
edgar_igl60897d32008-05-09 08:25:14 +00001116 }
blueswir10b8a9882009-03-07 10:51:36 +00001117#ifdef CONFIG_USER_ONLY
Jan Kiszka070949f2015-02-07 09:38:42 +01001118 else if (strcmp(p, "Offsets") == 0) {
Andreas Färber0429a972013-08-26 18:14:44 +02001119 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00001120
blueswir1363a37d2008-08-21 17:58:08 +00001121 snprintf(buf, sizeof(buf),
1122 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1123 ";Bss=" TARGET_ABI_FMT_lx,
1124 ts->info->code_offset,
1125 ts->info->data_offset,
1126 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001127 put_packet(s, buf);
1128 break;
1129 }
blueswir10b8a9882009-03-07 10:51:36 +00001130#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001131 else if (strncmp(p, "Rcmd,", 5) == 0) {
1132 int len = strlen(p + 5);
1133
1134 if ((len % 2) != 0) {
1135 put_packet(s, "E01");
1136 break;
1137 }
1138 hextomem(mem_buf, p + 5, len);
1139 len = len / 2;
1140 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001141 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001142 put_packet(s, "OK");
1143 break;
1144 }
blueswir10b8a9882009-03-07 10:51:36 +00001145#endif /* !CONFIG_USER_ONLY */
Jan Kiszka4dabe742015-02-07 09:38:43 +01001146 if (is_query_packet(p, "Supported", ':')) {
blueswir15b3715b2008-10-25 11:18:12 +00001147 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
Andreas Färber5b24c642013-07-07 15:08:22 +02001148 cc = CPU_GET_CLASS(first_cpu);
1149 if (cc->gdb_core_xml_file != NULL) {
1150 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
1151 }
pbrook56aebc82008-10-11 17:55:29 +00001152 put_packet(s, buf);
1153 break;
1154 }
pbrook56aebc82008-10-11 17:55:29 +00001155 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1156 const char *xml;
1157 target_ulong total_len;
1158
Andreas Färber5b24c642013-07-07 15:08:22 +02001159 cc = CPU_GET_CLASS(first_cpu);
1160 if (cc->gdb_core_xml_file == NULL) {
1161 goto unknown_command;
1162 }
1163
Andreas Färber5b50e792013-06-29 04:18:45 +02001164 gdb_has_xml = true;
pbrook56aebc82008-10-11 17:55:29 +00001165 p += 19;
Andreas Färber5b24c642013-07-07 15:08:22 +02001166 xml = get_feature_xml(p, &p, cc);
pbrook56aebc82008-10-11 17:55:29 +00001167 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001168 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001169 put_packet(s, buf);
1170 break;
1171 }
1172
1173 if (*p == ':')
1174 p++;
1175 addr = strtoul(p, (char **)&p, 16);
1176 if (*p == ',')
1177 p++;
1178 len = strtoul(p, (char **)&p, 16);
1179
1180 total_len = strlen(xml);
1181 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001182 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001183 put_packet(s, buf);
1184 break;
1185 }
1186 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1187 len = (MAX_PACKET_LENGTH - 5) / 2;
1188 if (len < total_len - addr) {
1189 buf[0] = 'm';
1190 len = memtox(buf + 1, xml + addr, len);
1191 } else {
1192 buf[0] = 'l';
1193 len = memtox(buf + 1, xml + addr, total_len - addr);
1194 }
1195 put_packet_binary(s, buf, len + 1);
1196 break;
1197 }
pbrook56aebc82008-10-11 17:55:29 +00001198 /* Unrecognised 'q' command. */
1199 goto unknown_command;
1200
bellard858693c2004-03-31 18:52:07 +00001201 default:
pbrook56aebc82008-10-11 17:55:29 +00001202 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001203 /* put empty packet */
1204 buf[0] = '\0';
1205 put_packet(s, buf);
1206 break;
1207 }
1208 return RS_IDLE;
1209}
1210
Andreas Färber64f6b342013-05-27 02:06:09 +02001211void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001212{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001213 gdbserver_state->c_cpu = cpu;
1214 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001215}
1216
bellard1fddef42005-04-17 19:16:13 +00001217#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001218static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001219{
aliguori880a7572008-11-18 20:30:24 +00001220 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001221 CPUArchState *env = s->c_cpu->env_ptr;
1222 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001223 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001224 const char *type;
bellard858693c2004-03-31 18:52:07 +00001225 int ret;
1226
Meador Ingecdb432b2012-03-15 17:49:45 +00001227 if (running || s->state == RS_INACTIVE) {
1228 return;
1229 }
1230 /* Is there a GDB syscall waiting to be sent? */
1231 if (s->current_syscall_cb) {
1232 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001233 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001234 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001235 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001236 case RUN_STATE_DEBUG:
Andreas Färberff4700b2013-08-26 18:23:18 +02001237 if (cpu->watchpoint_hit) {
1238 switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001239 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001240 type = "r";
1241 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001242 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001243 type = "a";
1244 break;
1245 default:
1246 type = "";
1247 break;
1248 }
aliguori880a7572008-11-18 20:30:24 +00001249 snprintf(buf, sizeof(buf),
1250 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001251 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
Andreas Färberff4700b2013-08-26 18:23:18 +02001252 (target_ulong)cpu->watchpoint_hit->vaddr);
1253 cpu->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001254 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001255 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001256 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001257 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001258 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001259 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001260 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001261 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001262 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001263 ret = GDB_SIGNAL_QUIT;
1264 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001265 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001266 ret = GDB_SIGNAL_IO;
1267 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001268 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001269 ret = GDB_SIGNAL_ALRM;
1270 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001271 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001272 ret = GDB_SIGNAL_ABRT;
1273 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001274 case RUN_STATE_SAVE_VM:
1275 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001276 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001277 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001278 ret = GDB_SIGNAL_XCPU;
1279 break;
1280 default:
1281 ret = GDB_SIGNAL_UNKNOWN;
1282 break;
bellardbbeb7b52006-04-23 18:42:15 +00001283 }
Andreas Färber0d342822012-12-17 07:12:13 +01001284 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001285
1286send_packet:
bellard858693c2004-03-31 18:52:07 +00001287 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001288
1289 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001290 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001291}
bellard1fddef42005-04-17 19:16:13 +00001292#endif
bellard858693c2004-03-31 18:52:07 +00001293
pbrooka2d1eba2007-01-28 03:10:55 +00001294/* Send a gdb syscall request.
1295 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001296 %x - target_ulong argument printed in hex.
1297 %lx - 64-bit argument printed in hex.
1298 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001299void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001300{
1301 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001302 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001303 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001304 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001305 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001306 GDBState *s;
1307
aliguori880a7572008-11-18 20:30:24 +00001308 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001309 if (!s)
1310 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001311 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001312#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001313 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001314#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001315 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001316 p = s->syscall_buf;
1317 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001318 *(p++) = 'F';
1319 while (*fmt) {
1320 if (*fmt == '%') {
1321 fmt++;
1322 switch (*fmt++) {
1323 case 'x':
1324 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001325 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001326 break;
pbrooka87295e2007-05-26 15:09:38 +00001327 case 'l':
1328 if (*(fmt++) != 'x')
1329 goto bad_format;
1330 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001331 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001332 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001333 case 's':
1334 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001335 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001336 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001337 break;
1338 default:
pbrooka87295e2007-05-26 15:09:38 +00001339 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001340 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1341 fmt - 1);
1342 break;
1343 }
1344 } else {
1345 *(p++) = *(fmt++);
1346 }
1347 }
pbrook8a93e022007-08-06 13:19:15 +00001348 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001349 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001350#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001351 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001352 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001353#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001354 /* In this case wait to send the syscall packet until notification that
1355 the CPU has stopped. This must be done because if the packet is sent
1356 now the reply from the syscall request could be received while the CPU
1357 is still in the running state, which can cause packets to be dropped
1358 and state transition 'T' packets to be sent while the syscall is still
1359 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001360 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001361#endif
1362}
1363
bellard6a00d602005-11-21 23:25:50 +00001364static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001365{
1366 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001367 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001368
bellard1fddef42005-04-17 19:16:13 +00001369#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001370 if (s->last_packet_len) {
1371 /* Waiting for a response to the last packet. If we see the start
1372 of a new command then abandon the previous response. */
1373 if (ch == '-') {
1374#ifdef DEBUG_GDB
1375 printf("Got NACK, retransmitting\n");
1376#endif
thsffe8ab82007-12-16 03:16:05 +00001377 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001378 }
1379#ifdef DEBUG_GDB
1380 else if (ch == '+')
1381 printf("Got ACK\n");
1382 else
1383 printf("Got '%c' when expecting ACK/NACK\n", ch);
1384#endif
1385 if (ch == '+' || ch == '$')
1386 s->last_packet_len = 0;
1387 if (ch != '$')
1388 return;
1389 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001390 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001391 /* when the CPU is running, we cannot do anything except stop
1392 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001393 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001394 } else
bellard1fddef42005-04-17 19:16:13 +00001395#endif
bellard41625032005-04-24 10:07:11 +00001396 {
bellard858693c2004-03-31 18:52:07 +00001397 switch(s->state) {
1398 case RS_IDLE:
1399 if (ch == '$') {
1400 s->line_buf_index = 0;
1401 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001402 }
1403 break;
bellard858693c2004-03-31 18:52:07 +00001404 case RS_GETLINE:
1405 if (ch == '#') {
1406 s->state = RS_CHKSUM1;
1407 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1408 s->state = RS_IDLE;
1409 } else {
1410 s->line_buf[s->line_buf_index++] = ch;
1411 }
1412 break;
1413 case RS_CHKSUM1:
1414 s->line_buf[s->line_buf_index] = '\0';
1415 s->line_csum = fromhex(ch) << 4;
1416 s->state = RS_CHKSUM2;
1417 break;
1418 case RS_CHKSUM2:
1419 s->line_csum |= fromhex(ch);
1420 csum = 0;
1421 for(i = 0; i < s->line_buf_index; i++) {
1422 csum += s->line_buf[i];
1423 }
1424 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001425 reply = '-';
1426 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001427 s->state = RS_IDLE;
1428 } else {
ths60fe76f2007-12-16 03:02:09 +00001429 reply = '+';
1430 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001431 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001432 }
bellardb4608c02003-06-27 17:34:32 +00001433 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001434 default:
1435 abort();
bellardb4608c02003-06-27 17:34:32 +00001436 }
1437 }
bellard858693c2004-03-31 18:52:07 +00001438}
1439
Paul Brook0e1c9c52010-06-16 13:03:51 +01001440/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001441void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001442{
1443 GDBState *s;
1444 char buf[4];
1445
1446 s = gdbserver_state;
1447 if (!s) {
1448 return;
1449 }
1450#ifdef CONFIG_USER_ONLY
1451 if (gdbserver_fd < 0 || s->fd < 0) {
1452 return;
1453 }
Paolo Bonzini3d0f4412015-03-02 13:26:58 +01001454#else
1455 if (!s->chr) {
1456 return;
1457 }
Paul Brook0e1c9c52010-06-16 13:03:51 +01001458#endif
1459
1460 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1461 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001462
1463#ifndef CONFIG_USER_ONLY
Paolo Bonzini3d0f4412015-03-02 13:26:58 +01001464 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001465#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001466}
1467
bellard1fddef42005-04-17 19:16:13 +00001468#ifdef CONFIG_USER_ONLY
1469int
aurel32ca587a82008-12-18 22:44:13 +00001470gdb_queuesig (void)
1471{
1472 GDBState *s;
1473
1474 s = gdbserver_state;
1475
1476 if (gdbserver_fd < 0 || s->fd < 0)
1477 return 0;
1478 else
1479 return 1;
1480}
1481
1482int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001483gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001484{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001485 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001486 GDBState *s;
1487 char buf[256];
1488 int n;
bellard1fddef42005-04-17 19:16:13 +00001489
Andreas Färber5ca666c2013-06-24 19:20:57 +02001490 s = gdbserver_state;
1491 if (gdbserver_fd < 0 || s->fd < 0) {
1492 return sig;
bellard1fddef42005-04-17 19:16:13 +00001493 }
1494
Andreas Färber5ca666c2013-06-24 19:20:57 +02001495 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001496 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02001497 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00001498
Andreas Färber5ca666c2013-06-24 19:20:57 +02001499 if (sig != 0) {
1500 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1501 put_packet(s, buf);
1502 }
1503 /* put_packet() might have detected that the peer terminated the
1504 connection. */
1505 if (s->fd < 0) {
1506 return sig;
1507 }
1508
1509 sig = 0;
1510 s->state = RS_IDLE;
1511 s->running_state = 0;
1512 while (s->running_state == 0) {
1513 n = read(s->fd, buf, 256);
1514 if (n > 0) {
1515 int i;
1516
1517 for (i = 0; i < n; i++) {
1518 gdb_read_byte(s, buf[i]);
1519 }
1520 } else if (n == 0 || errno != EAGAIN) {
1521 /* XXX: Connection closed. Should probably wait for another
1522 connection before continuing. */
1523 return sig;
bellard1fddef42005-04-17 19:16:13 +00001524 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001525 }
1526 sig = s->signal;
1527 s->signal = 0;
1528 return sig;
bellard1fddef42005-04-17 19:16:13 +00001529}
bellarde9009672005-04-26 20:42:36 +00001530
aurel32ca587a82008-12-18 22:44:13 +00001531/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001532void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001533{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001534 GDBState *s;
1535 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001536
Andreas Färber5ca666c2013-06-24 19:20:57 +02001537 s = gdbserver_state;
1538 if (gdbserver_fd < 0 || s->fd < 0) {
1539 return;
1540 }
aurel32ca587a82008-12-18 22:44:13 +00001541
Andreas Färber5ca666c2013-06-24 19:20:57 +02001542 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1543 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001544}
bellard1fddef42005-04-17 19:16:13 +00001545
aliguori880a7572008-11-18 20:30:24 +00001546static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001547{
1548 GDBState *s;
1549 struct sockaddr_in sockaddr;
1550 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001551 int fd;
bellard858693c2004-03-31 18:52:07 +00001552
1553 for(;;) {
1554 len = sizeof(sockaddr);
1555 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1556 if (fd < 0 && errno != EINTR) {
1557 perror("accept");
1558 return;
1559 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001560#ifndef _WIN32
1561 fcntl(fd, F_SETFD, FD_CLOEXEC);
1562#endif
bellard858693c2004-03-31 18:52:07 +00001563 break;
1564 }
1565 }
1566
1567 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001568 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00001569
Anthony Liguori7267c092011-08-20 22:09:37 -05001570 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001571 s->c_cpu = first_cpu;
1572 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00001573 s->fd = fd;
Andreas Färber5b50e792013-06-29 04:18:45 +02001574 gdb_has_xml = false;
bellard858693c2004-03-31 18:52:07 +00001575
aliguori880a7572008-11-18 20:30:24 +00001576 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00001577
bellard858693c2004-03-31 18:52:07 +00001578 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00001579}
1580
1581static int gdbserver_open(int port)
1582{
1583 struct sockaddr_in sockaddr;
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001584 int fd, ret;
bellard858693c2004-03-31 18:52:07 +00001585
1586 fd = socket(PF_INET, SOCK_STREAM, 0);
1587 if (fd < 0) {
1588 perror("socket");
1589 return -1;
1590 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001591#ifndef _WIN32
1592 fcntl(fd, F_SETFD, FD_CLOEXEC);
1593#endif
bellard858693c2004-03-31 18:52:07 +00001594
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001595 socket_set_fast_reuse(fd);
bellard858693c2004-03-31 18:52:07 +00001596
1597 sockaddr.sin_family = AF_INET;
1598 sockaddr.sin_port = htons(port);
1599 sockaddr.sin_addr.s_addr = 0;
1600 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1601 if (ret < 0) {
1602 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001603 close(fd);
bellard858693c2004-03-31 18:52:07 +00001604 return -1;
1605 }
1606 ret = listen(fd, 0);
1607 if (ret < 0) {
1608 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001609 close(fd);
bellard858693c2004-03-31 18:52:07 +00001610 return -1;
1611 }
bellard858693c2004-03-31 18:52:07 +00001612 return fd;
1613}
1614
1615int gdbserver_start(int port)
1616{
1617 gdbserver_fd = gdbserver_open(port);
1618 if (gdbserver_fd < 0)
1619 return -1;
1620 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00001621 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00001622 return 0;
1623}
aurel322b1319c2008-12-18 22:44:04 +00001624
1625/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001626void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00001627{
Andreas Färber75a34032013-09-02 16:57:02 +02001628 CPUState *cpu = ENV_GET_CPU(env);
aurel322b1319c2008-12-18 22:44:04 +00001629 GDBState *s = gdbserver_state;
Andreas Färber75a34032013-09-02 16:57:02 +02001630
1631 if (gdbserver_fd < 0 || s->fd < 0) {
1632 return;
1633 }
aurel322b1319c2008-12-18 22:44:04 +00001634 close(s->fd);
1635 s->fd = -1;
Andreas Färberb3310ab2013-09-02 17:26:20 +02001636 cpu_breakpoint_remove_all(cpu, BP_GDB);
Andreas Färber75a34032013-09-02 16:57:02 +02001637 cpu_watchpoint_remove_all(cpu, BP_GDB);
aurel322b1319c2008-12-18 22:44:04 +00001638}
pbrook4046d912007-01-28 01:53:16 +00001639#else
thsaa1f17c2007-07-11 22:48:58 +00001640static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001641{
pbrook56aebc82008-10-11 17:55:29 +00001642 /* We can handle an arbitrarily large amount of data.
1643 Pick the maximum packet size, which is as good as anything. */
1644 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001645}
1646
thsaa1f17c2007-07-11 22:48:58 +00001647static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001648{
pbrook4046d912007-01-28 01:53:16 +00001649 int i;
1650
1651 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00001652 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00001653 }
1654}
1655
1656static void gdb_chr_event(void *opaque, int event)
1657{
1658 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05301659 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001660 vm_stop(RUN_STATE_PAUSED);
Andreas Färber5b50e792013-06-29 04:18:45 +02001661 gdb_has_xml = false;
pbrook4046d912007-01-28 01:53:16 +00001662 break;
1663 default:
1664 break;
1665 }
1666}
1667
aliguori8a34a0f2009-03-05 23:01:55 +00001668static void gdb_monitor_output(GDBState *s, const char *msg, int len)
1669{
1670 char buf[MAX_PACKET_LENGTH];
1671
1672 buf[0] = 'O';
1673 if (len > (MAX_PACKET_LENGTH/2) - 1)
1674 len = (MAX_PACKET_LENGTH/2) - 1;
1675 memtohex(buf + 1, (uint8_t *)msg, len);
1676 put_packet(s, buf);
1677}
1678
1679static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
1680{
1681 const char *p = (const char *)buf;
1682 int max_sz;
1683
1684 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
1685 for (;;) {
1686 if (len <= max_sz) {
1687 gdb_monitor_output(gdbserver_state, p, len);
1688 break;
1689 }
1690 gdb_monitor_output(gdbserver_state, p, max_sz);
1691 p += max_sz;
1692 len -= max_sz;
1693 }
1694 return len;
1695}
1696
aliguori59030a82009-04-05 18:43:41 +00001697#ifndef _WIN32
1698static void gdb_sigterm_handler(int signal)
1699{
Luiz Capitulino13548692011-07-29 15:36:43 -03001700 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001701 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001702 }
aliguori59030a82009-04-05 18:43:41 +00001703}
1704#endif
1705
1706int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00001707{
1708 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00001709 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00001710 CharDriverState *chr = NULL;
1711 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00001712
aliguori59030a82009-04-05 18:43:41 +00001713 if (!device)
1714 return -1;
1715 if (strcmp(device, "none") != 0) {
1716 if (strstart(device, "tcp:", NULL)) {
1717 /* enforce required TCP attributes */
1718 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
1719 "%s,nowait,nodelay,server", device);
1720 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00001721 }
aliguori59030a82009-04-05 18:43:41 +00001722#ifndef _WIN32
1723 else if (strcmp(device, "stdio") == 0) {
1724 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00001725
aliguori59030a82009-04-05 18:43:41 +00001726 memset(&act, 0, sizeof(act));
1727 act.sa_handler = gdb_sigterm_handler;
1728 sigaction(SIGINT, &act, NULL);
1729 }
1730#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05001731 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00001732 if (!chr)
1733 return -1;
1734
Hans de Goede456d6062013-03-27 20:29:40 +01001735 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00001736 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
1737 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00001738 }
1739
aliguori36556b22009-03-28 18:05:53 +00001740 s = gdbserver_state;
1741 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05001742 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00001743 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00001744
aliguori36556b22009-03-28 18:05:53 +00001745 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
1746
1747 /* Initialize a monitor terminal for gdb */
Pavel Dovgalyuk462efe92014-09-10 18:34:14 +04001748 mon_chr = qemu_chr_alloc();
aliguori36556b22009-03-28 18:05:53 +00001749 mon_chr->chr_write = gdb_monitor_write;
1750 monitor_init(mon_chr, 0);
1751 } else {
1752 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001753 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00001754 mon_chr = s->mon_chr;
1755 memset(s, 0, sizeof(GDBState));
1756 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001757 s->c_cpu = first_cpu;
1758 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00001759 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00001760 s->state = chr ? RS_IDLE : RS_INACTIVE;
1761 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00001762 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00001763
pbrook4046d912007-01-28 01:53:16 +00001764 return 0;
1765}
1766#endif