blob: d8a5a0e698877ce1762ff48ed840aabc267a0e78 [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
bellard1fddef42005-04-17 19:16:13 +0000320#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000321/* XXX: This is not thread safe. Do we care? */
322static int gdbserver_fd = -1;
323
bellard858693c2004-03-31 18:52:07 +0000324static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000325{
326 uint8_t ch;
327 int ret;
328
329 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000330 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000331 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000332 if (errno == ECONNRESET)
333 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000334 if (errno != EINTR && errno != EAGAIN)
335 return -1;
336 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000337 close(s->fd);
338 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000339 return -1;
340 } else {
341 break;
342 }
343 }
344 return ch;
345}
pbrook4046d912007-01-28 01:53:16 +0000346#endif
bellardb4608c02003-06-27 17:34:32 +0000347
blueswir1654efcf2009-04-18 07:29:59 +0000348static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000349 GDB_SYS_UNKNOWN,
350 GDB_SYS_ENABLED,
351 GDB_SYS_DISABLED,
352} gdb_syscall_mode;
353
354/* If gdb is connected when the first semihosting syscall occurs then use
355 remote gdb syscalls. Otherwise use native file IO. */
356int use_gdb_syscalls(void)
357{
358 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000359 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
360 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000361 }
362 return gdb_syscall_mode == GDB_SYS_ENABLED;
363}
364
edgar_iglba70a622008-03-14 06:10:42 +0000365/* Resume execution. */
366static inline void gdb_continue(GDBState *s)
367{
368#ifdef CONFIG_USER_ONLY
369 s->running_state = 1;
370#else
Paolo Bonzinibc7d0e62013-06-03 17:06:55 +0200371 if (runstate_check(RUN_STATE_GUEST_PANICKED)) {
372 runstate_set(RUN_STATE_DEBUG);
373 }
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200374 if (!runstate_needs_reset()) {
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200375 vm_start();
376 }
edgar_iglba70a622008-03-14 06:10:42 +0000377#endif
378}
379
bellard858693c2004-03-31 18:52:07 +0000380static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000381{
pbrook4046d912007-01-28 01:53:16 +0000382#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000383 int ret;
384
385 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000386 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000387 if (ret < 0) {
388 if (errno != EINTR && errno != EAGAIN)
389 return;
390 } else {
391 buf += ret;
392 len -= ret;
393 }
394 }
pbrook4046d912007-01-28 01:53:16 +0000395#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500396 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000397#endif
bellardb4608c02003-06-27 17:34:32 +0000398}
399
400static inline int fromhex(int v)
401{
402 if (v >= '0' && v <= '9')
403 return v - '0';
404 else if (v >= 'A' && v <= 'F')
405 return v - 'A' + 10;
406 else if (v >= 'a' && v <= 'f')
407 return v - 'a' + 10;
408 else
409 return 0;
410}
411
412static inline int tohex(int v)
413{
414 if (v < 10)
415 return v + '0';
416 else
417 return v - 10 + 'a';
418}
419
420static void memtohex(char *buf, const uint8_t *mem, int len)
421{
422 int i, c;
423 char *q;
424 q = buf;
425 for(i = 0; i < len; i++) {
426 c = mem[i];
427 *q++ = tohex(c >> 4);
428 *q++ = tohex(c & 0xf);
429 }
430 *q = '\0';
431}
432
433static void hextomem(uint8_t *mem, const char *buf, int len)
434{
435 int i;
436
437 for(i = 0; i < len; i++) {
438 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
439 buf += 2;
440 }
441}
442
bellardb4608c02003-06-27 17:34:32 +0000443/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000444static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000445{
pbrook56aebc82008-10-11 17:55:29 +0000446 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000447 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000448
bellardb4608c02003-06-27 17:34:32 +0000449 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000450 p = s->last_packet;
451 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000452 memcpy(p, buf, len);
453 p += len;
bellardb4608c02003-06-27 17:34:32 +0000454 csum = 0;
455 for(i = 0; i < len; i++) {
456 csum += buf[i];
457 }
pbrook4046d912007-01-28 01:53:16 +0000458 *(p++) = '#';
459 *(p++) = tohex((csum >> 4) & 0xf);
460 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000461
pbrook4046d912007-01-28 01:53:16 +0000462 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000463 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000464
pbrook4046d912007-01-28 01:53:16 +0000465#ifdef CONFIG_USER_ONLY
466 i = get_char(s);
467 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000468 return -1;
pbrook4046d912007-01-28 01:53:16 +0000469 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000470 break;
pbrook4046d912007-01-28 01:53:16 +0000471#else
472 break;
473#endif
bellardb4608c02003-06-27 17:34:32 +0000474 }
475 return 0;
476}
477
pbrook56aebc82008-10-11 17:55:29 +0000478/* return -1 if error, 0 if OK */
479static int put_packet(GDBState *s, const char *buf)
480{
481#ifdef DEBUG_GDB
482 printf("reply='%s'\n", buf);
483#endif
484
485 return put_packet_binary(s, buf, strlen(buf));
486}
487
Andreas Färber5b50e792013-06-29 04:18:45 +0200488#if defined(TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000489
aurel32e571cb42009-01-24 15:07:42 +0000490#if defined (TARGET_PPC64)
491#define GDB_CORE_XML "power64-core.xml"
492#else
493#define GDB_CORE_XML "power-core.xml"
494#endif
pbrook56aebc82008-10-11 17:55:29 +0000495
bellard1fddef42005-04-17 19:16:13 +0000496#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000497
pbrook56aebc82008-10-11 17:55:29 +0000498#define GDB_CORE_XML "arm-core.xml"
499
pbrooke6e59062006-10-22 00:18:54 +0000500#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +0000501
pbrook56aebc82008-10-11 17:55:29 +0000502#define GDB_CORE_XML "cf-core.xml"
503
bellard6da41ea2004-01-04 15:48:38 +0000504#endif
bellardb4608c02003-06-27 17:34:32 +0000505
pbrook56aebc82008-10-11 17:55:29 +0000506#ifdef GDB_CORE_XML
507/* Encode data using the encoding for 'x' packets. */
508static int memtox(char *buf, const char *mem, int len)
509{
510 char *p = buf;
511 char c;
512
513 while (len--) {
514 c = *(mem++);
515 switch (c) {
516 case '#': case '$': case '*': case '}':
517 *(p++) = '}';
518 *(p++) = c ^ 0x20;
519 break;
520 default:
521 *(p++) = c;
522 break;
523 }
524 }
525 return p - buf;
526}
527
aurel323faf7782008-12-07 23:26:17 +0000528static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +0000529{
pbrook56aebc82008-10-11 17:55:29 +0000530 size_t len;
531 int i;
532 const char *name;
533 static char target_xml[1024];
534
535 len = 0;
536 while (p[len] && p[len] != ':')
537 len++;
538 *newp = p + len;
539
540 name = NULL;
541 if (strncmp(p, "target.xml", len) == 0) {
542 /* Generate the XML description for this CPU. */
543 if (!target_xml[0]) {
544 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +0200545 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +0000546
blueswir15b3715b2008-10-25 11:18:12 +0000547 snprintf(target_xml, sizeof(target_xml),
548 "<?xml version=\"1.0\"?>"
549 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
550 "<target>"
551 "<xi:include href=\"%s\"/>",
552 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +0000553
Andreas Färbereac8b352013-06-28 21:11:37 +0200554 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000555 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
556 pstrcat(target_xml, sizeof(target_xml), r->xml);
557 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000558 }
blueswir12dc766d2009-04-13 16:06:19 +0000559 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000560 }
561 return target_xml;
562 }
563 for (i = 0; ; i++) {
564 name = xml_builtin[i][0];
565 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
566 break;
567 }
568 return name ? xml_builtin[i][1] : NULL;
569}
570#endif
571
Andreas Färber385b9f02013-06-27 18:25:36 +0200572static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000573{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200574 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200575 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000576 GDBRegisterState *r;
577
Andreas Färbera0e372f2013-06-28 23:18:47 +0200578 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200579 return cc->gdb_read_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200580 }
pbrook56aebc82008-10-11 17:55:29 +0000581
Andreas Färbereac8b352013-06-28 21:11:37 +0200582 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000583 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
584 return r->get_reg(env, mem_buf, reg - r->base_reg);
585 }
586 }
587 return 0;
588}
589
Andreas Färber385b9f02013-06-27 18:25:36 +0200590static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000591{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200592 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200593 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000594 GDBRegisterState *r;
595
Andreas Färbera0e372f2013-06-28 23:18:47 +0200596 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200597 return cc->gdb_write_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200598 }
pbrook56aebc82008-10-11 17:55:29 +0000599
Andreas Färbereac8b352013-06-28 21:11:37 +0200600 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000601 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
602 return r->set_reg(env, mem_buf, reg - r->base_reg);
603 }
604 }
605 return 0;
606}
607
608/* Register a supplemental set of CPU registers. If g_pos is nonzero it
609 specifies the first register number and these registers are included in
610 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
611 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
612 */
613
Andreas Färber22169d42013-06-28 21:27:39 +0200614void gdb_register_coprocessor(CPUState *cpu,
615 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
616 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000617{
618 GDBRegisterState *s;
619 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000620
Andreas Färbereac8b352013-06-28 21:11:37 +0200621 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000622 while (*p) {
623 /* Check for duplicates. */
624 if (strcmp((*p)->xml, xml) == 0)
625 return;
626 p = &(*p)->next;
627 }
Stefan Weil9643c252011-10-18 22:25:38 +0200628
629 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200630 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200631 s->num_regs = num_regs;
632 s->get_reg = get_reg;
633 s->set_reg = set_reg;
634 s->xml = xml;
635
pbrook56aebc82008-10-11 17:55:29 +0000636 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200637 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000638 *p = s;
639 if (g_pos) {
640 if (g_pos != s->base_reg) {
641 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
642 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +0000643 }
644 }
645}
646
aliguoria1d1bb32008-11-18 20:07:32 +0000647#ifndef CONFIG_USER_ONLY
648static const int xlat_gdb_type[] = {
649 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
650 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
651 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
652};
653#endif
654
aliguori880a7572008-11-18 20:30:24 +0000655static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000656{
Andreas Färber182735e2013-05-29 22:29:20 +0200657 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +0100658 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +0000659 int err = 0;
660
Andreas Färber62278812013-06-27 17:12:06 +0200661 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200662 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200663 }
aliguorie22a25c2009-03-12 20:12:48 +0000664
aliguoria1d1bb32008-11-18 20:07:32 +0000665 switch (type) {
666 case GDB_BREAKPOINT_SW:
667 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +0200668 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
669 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000670 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
671 if (err)
672 break;
673 }
674 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000675#ifndef CONFIG_USER_ONLY
676 case GDB_WATCHPOINT_WRITE:
677 case GDB_WATCHPOINT_READ:
678 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +0200679 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
680 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000681 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
682 NULL);
683 if (err)
684 break;
685 }
686 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000687#endif
688 default:
689 return -ENOSYS;
690 }
691}
692
aliguori880a7572008-11-18 20:30:24 +0000693static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000694{
Andreas Färber182735e2013-05-29 22:29:20 +0200695 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +0100696 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +0000697 int err = 0;
698
Andreas Färber62278812013-06-27 17:12:06 +0200699 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200700 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200701 }
aliguorie22a25c2009-03-12 20:12:48 +0000702
aliguoria1d1bb32008-11-18 20:07:32 +0000703 switch (type) {
704 case GDB_BREAKPOINT_SW:
705 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +0200706 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
707 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000708 err = cpu_breakpoint_remove(env, addr, BP_GDB);
709 if (err)
710 break;
711 }
712 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000713#ifndef CONFIG_USER_ONLY
714 case GDB_WATCHPOINT_WRITE:
715 case GDB_WATCHPOINT_READ:
716 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +0200717 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
718 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000719 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
720 if (err)
721 break;
722 }
723 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000724#endif
725 default:
726 return -ENOSYS;
727 }
728}
729
aliguori880a7572008-11-18 20:30:24 +0000730static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +0000731{
Andreas Färber182735e2013-05-29 22:29:20 +0200732 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +0100733 CPUArchState *env;
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ärber182735e2013-05-29 22:29:20 +0200740 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
741 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000742 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000743#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +0000744 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000745#endif
aliguori880a7572008-11-18 20:30:24 +0000746 }
aliguoria1d1bb32008-11-18 20:07:32 +0000747}
748
aurel32fab9d282009-04-08 21:29:37 +0000749static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
750{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200751 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +0200752 CPUClass *cc = CPU_GET_CLASS(cpu);
753
754 cpu_synchronize_state(cpu);
755 if (cc->set_pc) {
756 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -0800757 }
aurel32fab9d282009-04-08 21:29:37 +0000758}
759
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200760static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700761{
Andreas Färber0d342822012-12-17 07:12:13 +0100762 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700763
Andreas Färber182735e2013-05-29 22:29:20 +0200764 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +0200765 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200766 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +0200767 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700768 }
Andreas Färberaa48dd92013-07-09 20:50:52 +0200769
770 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700771}
772
aliguori880a7572008-11-18 20:30:24 +0000773static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +0000774{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200775 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +0000776 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700777 uint32_t thread;
778 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +0000779 char buf[MAX_PACKET_LENGTH];
780 uint8_t mem_buf[MAX_PACKET_LENGTH];
781 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +0000782 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +0000783
bellard858693c2004-03-31 18:52:07 +0000784#ifdef DEBUG_GDB
785 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +0000786#endif
bellard858693c2004-03-31 18:52:07 +0000787 p = line_buf;
788 ch = *p++;
789 switch(ch) {
790 case '?':
bellard1fddef42005-04-17 19:16:13 +0000791 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +0000792 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200793 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +0000794 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +0000795 /* Remove all the breakpoints when this query is issued,
796 * because gdb is doing and initial connect and the state
797 * should be cleaned up.
798 */
aliguori880a7572008-11-18 20:30:24 +0000799 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +0000800 break;
801 case 'c':
802 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +0000803 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000804 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000805 }
aurel32ca587a82008-12-18 22:44:13 +0000806 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +0000807 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000808 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +0000809 case 'C':
aurel32ca587a82008-12-18 22:44:13 +0000810 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
811 if (s->signal == -1)
812 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +0000813 gdb_continue(s);
814 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200815 case 'v':
816 if (strncmp(p, "Cont", 4) == 0) {
817 int res_signal, res_thread;
818
819 p += 4;
820 if (*p == '?') {
821 put_packet(s, "vCont;c;C;s;S");
822 break;
823 }
824 res = 0;
825 res_signal = 0;
826 res_thread = 0;
827 while (*p) {
828 int action, signal;
829
830 if (*p++ != ';') {
831 res = 0;
832 break;
833 }
834 action = *p++;
835 signal = 0;
836 if (action == 'C' || action == 'S') {
837 signal = strtoul(p, (char **)&p, 16);
838 } else if (action != 'c' && action != 's') {
839 res = 0;
840 break;
841 }
842 thread = 0;
843 if (*p == ':') {
844 thread = strtoull(p+1, (char **)&p, 16);
845 }
846 action = tolower(action);
847 if (res == 0 || (res == 'c' && action == 's')) {
848 res = action;
849 res_signal = signal;
850 res_thread = thread;
851 }
852 }
853 if (res) {
854 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200855 cpu = find_cpu(res_thread);
856 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200857 put_packet(s, "E22");
858 break;
859 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200860 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200861 }
862 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200863 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200864 }
865 s->signal = res_signal;
866 gdb_continue(s);
867 return RS_IDLE;
868 }
869 break;
870 } else {
871 goto unknown_command;
872 }
edgar_igl7d03f822008-05-17 18:58:29 +0000873 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +0100874#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +0000875 /* Kill the target */
876 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
877 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +0100878#endif
edgar_igl7d03f822008-05-17 18:58:29 +0000879 case 'D':
880 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +0000881 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -0300882 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +0000883 gdb_continue(s);
884 put_packet(s, "OK");
885 break;
bellard858693c2004-03-31 18:52:07 +0000886 case 's':
887 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +0000888 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000889 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000890 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200891 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +0000892 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000893 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +0000894 case 'F':
895 {
896 target_ulong ret;
897 target_ulong err;
898
899 ret = strtoull(p, (char **)&p, 16);
900 if (*p == ',') {
901 p++;
902 err = strtoull(p, (char **)&p, 16);
903 } else {
904 err = 0;
905 }
906 if (*p == ',')
907 p++;
908 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +0000909 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200910 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +0000911 s->current_syscall_cb = NULL;
912 }
pbrooka2d1eba2007-01-28 03:10:55 +0000913 if (type == 'C') {
914 put_packet(s, "T02");
915 } else {
edgar_iglba70a622008-03-14 06:10:42 +0000916 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +0000917 }
918 }
919 break;
bellard858693c2004-03-31 18:52:07 +0000920 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200921 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +0000922 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +0200923 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200924 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +0000925 len += reg_size;
926 }
927 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +0000928 put_packet(s, buf);
929 break;
930 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200931 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +0000932 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +0000933 len = strlen(p) / 2;
934 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200935 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200936 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +0000937 len -= reg_size;
938 registers += reg_size;
939 }
bellard858693c2004-03-31 18:52:07 +0000940 put_packet(s, "OK");
941 break;
942 case 'm':
bellard9d9754a2006-06-25 15:32:37 +0000943 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +0000944 if (*p == ',')
945 p++;
bellard9d9754a2006-06-25 15:32:37 +0000946 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200947 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +0000948 put_packet (s, "E14");
949 } else {
950 memtohex(buf, mem_buf, len);
951 put_packet(s, buf);
952 }
bellard858693c2004-03-31 18:52:07 +0000953 break;
954 case 'M':
bellard9d9754a2006-06-25 15:32:37 +0000955 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +0000956 if (*p == ',')
957 p++;
bellard9d9754a2006-06-25 15:32:37 +0000958 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +0000959 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +0000960 p++;
961 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200962 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +0200963 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +0000964 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +0200965 } else {
bellard858693c2004-03-31 18:52:07 +0000966 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +0200967 }
bellard858693c2004-03-31 18:52:07 +0000968 break;
pbrook56aebc82008-10-11 17:55:29 +0000969 case 'p':
970 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
971 This works, but can be very slow. Anything new enough to
972 understand XML also knows how to use this properly. */
973 if (!gdb_has_xml)
974 goto unknown_command;
975 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200976 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +0000977 if (reg_size) {
978 memtohex(buf, mem_buf, reg_size);
979 put_packet(s, buf);
980 } else {
981 put_packet(s, "E14");
982 }
983 break;
984 case 'P':
985 if (!gdb_has_xml)
986 goto unknown_command;
987 addr = strtoull(p, (char **)&p, 16);
988 if (*p == '=')
989 p++;
990 reg_size = strlen(p) / 2;
991 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200992 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +0000993 put_packet(s, "OK");
994 break;
bellard858693c2004-03-31 18:52:07 +0000995 case 'Z':
bellard858693c2004-03-31 18:52:07 +0000996 case 'z':
997 type = strtoul(p, (char **)&p, 16);
998 if (*p == ',')
999 p++;
bellard9d9754a2006-06-25 15:32:37 +00001000 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001001 if (*p == ',')
1002 p++;
bellard9d9754a2006-06-25 15:32:37 +00001003 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001004 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001005 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001006 else
aliguori880a7572008-11-18 20:30:24 +00001007 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001008 if (res >= 0)
1009 put_packet(s, "OK");
1010 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001011 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001012 else
1013 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001014 break;
aliguori880a7572008-11-18 20:30:24 +00001015 case 'H':
1016 type = *p++;
1017 thread = strtoull(p, (char **)&p, 16);
1018 if (thread == -1 || thread == 0) {
1019 put_packet(s, "OK");
1020 break;
1021 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001022 cpu = find_cpu(thread);
1023 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001024 put_packet(s, "E22");
1025 break;
1026 }
1027 switch (type) {
1028 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001029 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001030 put_packet(s, "OK");
1031 break;
1032 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001033 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001034 put_packet(s, "OK");
1035 break;
1036 default:
1037 put_packet(s, "E22");
1038 break;
1039 }
1040 break;
1041 case 'T':
1042 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001043 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001044
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001045 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001046 put_packet(s, "OK");
1047 } else {
aliguori880a7572008-11-18 20:30:24 +00001048 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001049 }
aliguori880a7572008-11-18 20:30:24 +00001050 break;
pbrook978efd62006-06-17 18:30:42 +00001051 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001052 case 'Q':
1053 /* parse any 'q' packets here */
1054 if (!strcmp(p,"qemu.sstepbits")) {
1055 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001056 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1057 SSTEP_ENABLE,
1058 SSTEP_NOIRQ,
1059 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001060 put_packet(s, buf);
1061 break;
1062 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1063 /* Display or change the sstep_flags */
1064 p += 10;
1065 if (*p != '=') {
1066 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001067 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001068 put_packet(s, buf);
1069 break;
1070 }
1071 p++;
1072 type = strtoul(p, (char **)&p, 16);
1073 sstep_flags = type;
1074 put_packet(s, "OK");
1075 break;
aliguori880a7572008-11-18 20:30:24 +00001076 } else if (strcmp(p,"C") == 0) {
1077 /* "Current thread" remains vague in the spec, so always return
1078 * the first CPU (gdb returns the first thread). */
1079 put_packet(s, "QC1");
1080 break;
1081 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001082 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001083 goto report_cpuinfo;
1084 } else if (strcmp(p,"sThreadInfo") == 0) {
1085 report_cpuinfo:
1086 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001087 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001088 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001089 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001090 } else
1091 put_packet(s, "l");
1092 break;
1093 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1094 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001095 cpu = find_cpu(thread);
1096 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001097 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001098 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001099 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001100 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001101 memtohex(buf, mem_buf, len);
1102 put_packet(s, buf);
1103 }
aliguori880a7572008-11-18 20:30:24 +00001104 break;
edgar_igl60897d32008-05-09 08:25:14 +00001105 }
blueswir10b8a9882009-03-07 10:51:36 +00001106#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001107 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001108 CPUArchState *env = s->c_cpu->env_ptr;
1109 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001110
blueswir1363a37d2008-08-21 17:58:08 +00001111 snprintf(buf, sizeof(buf),
1112 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1113 ";Bss=" TARGET_ABI_FMT_lx,
1114 ts->info->code_offset,
1115 ts->info->data_offset,
1116 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001117 put_packet(s, buf);
1118 break;
1119 }
blueswir10b8a9882009-03-07 10:51:36 +00001120#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001121 else if (strncmp(p, "Rcmd,", 5) == 0) {
1122 int len = strlen(p + 5);
1123
1124 if ((len % 2) != 0) {
1125 put_packet(s, "E01");
1126 break;
1127 }
1128 hextomem(mem_buf, p + 5, len);
1129 len = len / 2;
1130 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001131 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001132 put_packet(s, "OK");
1133 break;
1134 }
blueswir10b8a9882009-03-07 10:51:36 +00001135#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001136 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001137 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001138#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001139 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001140#endif
1141 put_packet(s, buf);
1142 break;
1143 }
1144#ifdef GDB_CORE_XML
1145 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1146 const char *xml;
1147 target_ulong total_len;
1148
Andreas Färber5b50e792013-06-29 04:18:45 +02001149 gdb_has_xml = true;
pbrook56aebc82008-10-11 17:55:29 +00001150 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001151 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001152 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001153 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001154 put_packet(s, buf);
1155 break;
1156 }
1157
1158 if (*p == ':')
1159 p++;
1160 addr = strtoul(p, (char **)&p, 16);
1161 if (*p == ',')
1162 p++;
1163 len = strtoul(p, (char **)&p, 16);
1164
1165 total_len = strlen(xml);
1166 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001167 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001168 put_packet(s, buf);
1169 break;
1170 }
1171 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1172 len = (MAX_PACKET_LENGTH - 5) / 2;
1173 if (len < total_len - addr) {
1174 buf[0] = 'm';
1175 len = memtox(buf + 1, xml + addr, len);
1176 } else {
1177 buf[0] = 'l';
1178 len = memtox(buf + 1, xml + addr, total_len - addr);
1179 }
1180 put_packet_binary(s, buf, len + 1);
1181 break;
1182 }
1183#endif
1184 /* Unrecognised 'q' command. */
1185 goto unknown_command;
1186
bellard858693c2004-03-31 18:52:07 +00001187 default:
pbrook56aebc82008-10-11 17:55:29 +00001188 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001189 /* put empty packet */
1190 buf[0] = '\0';
1191 put_packet(s, buf);
1192 break;
1193 }
1194 return RS_IDLE;
1195}
1196
Andreas Färber64f6b342013-05-27 02:06:09 +02001197void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001198{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001199 gdbserver_state->c_cpu = cpu;
1200 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001201}
1202
bellard1fddef42005-04-17 19:16:13 +00001203#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001204static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001205{
aliguori880a7572008-11-18 20:30:24 +00001206 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001207 CPUArchState *env = s->c_cpu->env_ptr;
1208 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001209 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001210 const char *type;
bellard858693c2004-03-31 18:52:07 +00001211 int ret;
1212
Meador Ingecdb432b2012-03-15 17:49:45 +00001213 if (running || s->state == RS_INACTIVE) {
1214 return;
1215 }
1216 /* Is there a GDB syscall waiting to be sent? */
1217 if (s->current_syscall_cb) {
1218 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001219 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001220 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001221 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001222 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00001223 if (env->watchpoint_hit) {
1224 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001225 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001226 type = "r";
1227 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001228 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001229 type = "a";
1230 break;
1231 default:
1232 type = "";
1233 break;
1234 }
aliguori880a7572008-11-18 20:30:24 +00001235 snprintf(buf, sizeof(buf),
1236 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001237 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00001238 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001239 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001240 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001241 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001242 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001243 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001244 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001245 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001246 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001247 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001248 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001249 ret = GDB_SIGNAL_QUIT;
1250 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001251 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001252 ret = GDB_SIGNAL_IO;
1253 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001254 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001255 ret = GDB_SIGNAL_ALRM;
1256 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001257 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001258 ret = GDB_SIGNAL_ABRT;
1259 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001260 case RUN_STATE_SAVE_VM:
1261 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001262 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001263 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001264 ret = GDB_SIGNAL_XCPU;
1265 break;
1266 default:
1267 ret = GDB_SIGNAL_UNKNOWN;
1268 break;
bellardbbeb7b52006-04-23 18:42:15 +00001269 }
Andreas Färber0d342822012-12-17 07:12:13 +01001270 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001271
1272send_packet:
bellard858693c2004-03-31 18:52:07 +00001273 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001274
1275 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001276 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001277}
bellard1fddef42005-04-17 19:16:13 +00001278#endif
bellard858693c2004-03-31 18:52:07 +00001279
pbrooka2d1eba2007-01-28 03:10:55 +00001280/* Send a gdb syscall request.
1281 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001282 %x - target_ulong argument printed in hex.
1283 %lx - 64-bit argument printed in hex.
1284 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001285void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001286{
1287 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001288 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001289 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001290 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001291 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001292 GDBState *s;
1293
aliguori880a7572008-11-18 20:30:24 +00001294 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001295 if (!s)
1296 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001297 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001298#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001299 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001300#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001301 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001302 p = s->syscall_buf;
1303 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001304 *(p++) = 'F';
1305 while (*fmt) {
1306 if (*fmt == '%') {
1307 fmt++;
1308 switch (*fmt++) {
1309 case 'x':
1310 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001311 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001312 break;
pbrooka87295e2007-05-26 15:09:38 +00001313 case 'l':
1314 if (*(fmt++) != 'x')
1315 goto bad_format;
1316 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001317 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001318 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001319 case 's':
1320 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001321 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001322 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001323 break;
1324 default:
pbrooka87295e2007-05-26 15:09:38 +00001325 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001326 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1327 fmt - 1);
1328 break;
1329 }
1330 } else {
1331 *(p++) = *(fmt++);
1332 }
1333 }
pbrook8a93e022007-08-06 13:19:15 +00001334 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001335 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001336#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001337 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001338 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001339#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001340 /* In this case wait to send the syscall packet until notification that
1341 the CPU has stopped. This must be done because if the packet is sent
1342 now the reply from the syscall request could be received while the CPU
1343 is still in the running state, which can cause packets to be dropped
1344 and state transition 'T' packets to be sent while the syscall is still
1345 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001346 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001347#endif
1348}
1349
bellard6a00d602005-11-21 23:25:50 +00001350static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001351{
1352 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001353 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001354
bellard1fddef42005-04-17 19:16:13 +00001355#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001356 if (s->last_packet_len) {
1357 /* Waiting for a response to the last packet. If we see the start
1358 of a new command then abandon the previous response. */
1359 if (ch == '-') {
1360#ifdef DEBUG_GDB
1361 printf("Got NACK, retransmitting\n");
1362#endif
thsffe8ab82007-12-16 03:16:05 +00001363 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001364 }
1365#ifdef DEBUG_GDB
1366 else if (ch == '+')
1367 printf("Got ACK\n");
1368 else
1369 printf("Got '%c' when expecting ACK/NACK\n", ch);
1370#endif
1371 if (ch == '+' || ch == '$')
1372 s->last_packet_len = 0;
1373 if (ch != '$')
1374 return;
1375 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001376 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001377 /* when the CPU is running, we cannot do anything except stop
1378 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001379 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001380 } else
bellard1fddef42005-04-17 19:16:13 +00001381#endif
bellard41625032005-04-24 10:07:11 +00001382 {
bellard858693c2004-03-31 18:52:07 +00001383 switch(s->state) {
1384 case RS_IDLE:
1385 if (ch == '$') {
1386 s->line_buf_index = 0;
1387 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001388 }
1389 break;
bellard858693c2004-03-31 18:52:07 +00001390 case RS_GETLINE:
1391 if (ch == '#') {
1392 s->state = RS_CHKSUM1;
1393 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1394 s->state = RS_IDLE;
1395 } else {
1396 s->line_buf[s->line_buf_index++] = ch;
1397 }
1398 break;
1399 case RS_CHKSUM1:
1400 s->line_buf[s->line_buf_index] = '\0';
1401 s->line_csum = fromhex(ch) << 4;
1402 s->state = RS_CHKSUM2;
1403 break;
1404 case RS_CHKSUM2:
1405 s->line_csum |= fromhex(ch);
1406 csum = 0;
1407 for(i = 0; i < s->line_buf_index; i++) {
1408 csum += s->line_buf[i];
1409 }
1410 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001411 reply = '-';
1412 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001413 s->state = RS_IDLE;
1414 } else {
ths60fe76f2007-12-16 03:02:09 +00001415 reply = '+';
1416 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001417 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001418 }
bellardb4608c02003-06-27 17:34:32 +00001419 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001420 default:
1421 abort();
bellardb4608c02003-06-27 17:34:32 +00001422 }
1423 }
bellard858693c2004-03-31 18:52:07 +00001424}
1425
Paul Brook0e1c9c52010-06-16 13:03:51 +01001426/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001427void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001428{
1429 GDBState *s;
1430 char buf[4];
1431
1432 s = gdbserver_state;
1433 if (!s) {
1434 return;
1435 }
1436#ifdef CONFIG_USER_ONLY
1437 if (gdbserver_fd < 0 || s->fd < 0) {
1438 return;
1439 }
1440#endif
1441
1442 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1443 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001444
1445#ifndef CONFIG_USER_ONLY
1446 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001447 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001448 }
1449#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001450}
1451
bellard1fddef42005-04-17 19:16:13 +00001452#ifdef CONFIG_USER_ONLY
1453int
aurel32ca587a82008-12-18 22:44:13 +00001454gdb_queuesig (void)
1455{
1456 GDBState *s;
1457
1458 s = gdbserver_state;
1459
1460 if (gdbserver_fd < 0 || s->fd < 0)
1461 return 0;
1462 else
1463 return 1;
1464}
1465
1466int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001467gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001468{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001469 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001470 GDBState *s;
1471 char buf[256];
1472 int n;
bellard1fddef42005-04-17 19:16:13 +00001473
Andreas Färber5ca666c2013-06-24 19:20:57 +02001474 s = gdbserver_state;
1475 if (gdbserver_fd < 0 || s->fd < 0) {
1476 return sig;
bellard1fddef42005-04-17 19:16:13 +00001477 }
1478
Andreas Färber5ca666c2013-06-24 19:20:57 +02001479 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001480 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02001481 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00001482
Andreas Färber5ca666c2013-06-24 19:20:57 +02001483 if (sig != 0) {
1484 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1485 put_packet(s, buf);
1486 }
1487 /* put_packet() might have detected that the peer terminated the
1488 connection. */
1489 if (s->fd < 0) {
1490 return sig;
1491 }
1492
1493 sig = 0;
1494 s->state = RS_IDLE;
1495 s->running_state = 0;
1496 while (s->running_state == 0) {
1497 n = read(s->fd, buf, 256);
1498 if (n > 0) {
1499 int i;
1500
1501 for (i = 0; i < n; i++) {
1502 gdb_read_byte(s, buf[i]);
1503 }
1504 } else if (n == 0 || errno != EAGAIN) {
1505 /* XXX: Connection closed. Should probably wait for another
1506 connection before continuing. */
1507 return sig;
bellard1fddef42005-04-17 19:16:13 +00001508 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001509 }
1510 sig = s->signal;
1511 s->signal = 0;
1512 return sig;
bellard1fddef42005-04-17 19:16:13 +00001513}
bellarde9009672005-04-26 20:42:36 +00001514
aurel32ca587a82008-12-18 22:44:13 +00001515/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001516void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001517{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001518 GDBState *s;
1519 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001520
Andreas Färber5ca666c2013-06-24 19:20:57 +02001521 s = gdbserver_state;
1522 if (gdbserver_fd < 0 || s->fd < 0) {
1523 return;
1524 }
aurel32ca587a82008-12-18 22:44:13 +00001525
Andreas Färber5ca666c2013-06-24 19:20:57 +02001526 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1527 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001528}
bellard1fddef42005-04-17 19:16:13 +00001529
aliguori880a7572008-11-18 20:30:24 +00001530static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001531{
1532 GDBState *s;
1533 struct sockaddr_in sockaddr;
1534 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001535 int fd;
bellard858693c2004-03-31 18:52:07 +00001536
1537 for(;;) {
1538 len = sizeof(sockaddr);
1539 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1540 if (fd < 0 && errno != EINTR) {
1541 perror("accept");
1542 return;
1543 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001544#ifndef _WIN32
1545 fcntl(fd, F_SETFD, FD_CLOEXEC);
1546#endif
bellard858693c2004-03-31 18:52:07 +00001547 break;
1548 }
1549 }
1550
1551 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001552 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00001553
Anthony Liguori7267c092011-08-20 22:09:37 -05001554 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001555 s->c_cpu = first_cpu;
1556 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00001557 s->fd = fd;
Andreas Färber5b50e792013-06-29 04:18:45 +02001558 gdb_has_xml = false;
bellard858693c2004-03-31 18:52:07 +00001559
aliguori880a7572008-11-18 20:30:24 +00001560 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00001561
bellard858693c2004-03-31 18:52:07 +00001562 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00001563}
1564
1565static int gdbserver_open(int port)
1566{
1567 struct sockaddr_in sockaddr;
1568 int fd, val, ret;
1569
1570 fd = socket(PF_INET, SOCK_STREAM, 0);
1571 if (fd < 0) {
1572 perror("socket");
1573 return -1;
1574 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001575#ifndef _WIN32
1576 fcntl(fd, F_SETFD, FD_CLOEXEC);
1577#endif
bellard858693c2004-03-31 18:52:07 +00001578
1579 /* allow fast reuse */
1580 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01001581 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00001582
1583 sockaddr.sin_family = AF_INET;
1584 sockaddr.sin_port = htons(port);
1585 sockaddr.sin_addr.s_addr = 0;
1586 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1587 if (ret < 0) {
1588 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001589 close(fd);
bellard858693c2004-03-31 18:52:07 +00001590 return -1;
1591 }
1592 ret = listen(fd, 0);
1593 if (ret < 0) {
1594 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001595 close(fd);
bellard858693c2004-03-31 18:52:07 +00001596 return -1;
1597 }
bellard858693c2004-03-31 18:52:07 +00001598 return fd;
1599}
1600
1601int gdbserver_start(int port)
1602{
1603 gdbserver_fd = gdbserver_open(port);
1604 if (gdbserver_fd < 0)
1605 return -1;
1606 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00001607 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00001608 return 0;
1609}
aurel322b1319c2008-12-18 22:44:04 +00001610
1611/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001612void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00001613{
1614 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00001615 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00001616 return;
1617 close(s->fd);
1618 s->fd = -1;
1619 cpu_breakpoint_remove_all(env, BP_GDB);
1620 cpu_watchpoint_remove_all(env, BP_GDB);
1621}
pbrook4046d912007-01-28 01:53:16 +00001622#else
thsaa1f17c2007-07-11 22:48:58 +00001623static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001624{
pbrook56aebc82008-10-11 17:55:29 +00001625 /* We can handle an arbitrarily large amount of data.
1626 Pick the maximum packet size, which is as good as anything. */
1627 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001628}
1629
thsaa1f17c2007-07-11 22:48:58 +00001630static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001631{
pbrook4046d912007-01-28 01:53:16 +00001632 int i;
1633
1634 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00001635 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00001636 }
1637}
1638
1639static void gdb_chr_event(void *opaque, int event)
1640{
1641 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05301642 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001643 vm_stop(RUN_STATE_PAUSED);
Andreas Färber5b50e792013-06-29 04:18:45 +02001644 gdb_has_xml = false;
pbrook4046d912007-01-28 01:53:16 +00001645 break;
1646 default:
1647 break;
1648 }
1649}
1650
aliguori8a34a0f2009-03-05 23:01:55 +00001651static void gdb_monitor_output(GDBState *s, const char *msg, int len)
1652{
1653 char buf[MAX_PACKET_LENGTH];
1654
1655 buf[0] = 'O';
1656 if (len > (MAX_PACKET_LENGTH/2) - 1)
1657 len = (MAX_PACKET_LENGTH/2) - 1;
1658 memtohex(buf + 1, (uint8_t *)msg, len);
1659 put_packet(s, buf);
1660}
1661
1662static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
1663{
1664 const char *p = (const char *)buf;
1665 int max_sz;
1666
1667 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
1668 for (;;) {
1669 if (len <= max_sz) {
1670 gdb_monitor_output(gdbserver_state, p, len);
1671 break;
1672 }
1673 gdb_monitor_output(gdbserver_state, p, max_sz);
1674 p += max_sz;
1675 len -= max_sz;
1676 }
1677 return len;
1678}
1679
aliguori59030a82009-04-05 18:43:41 +00001680#ifndef _WIN32
1681static void gdb_sigterm_handler(int signal)
1682{
Luiz Capitulino13548692011-07-29 15:36:43 -03001683 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001684 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001685 }
aliguori59030a82009-04-05 18:43:41 +00001686}
1687#endif
1688
1689int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00001690{
1691 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00001692 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00001693 CharDriverState *chr = NULL;
1694 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00001695
aliguori59030a82009-04-05 18:43:41 +00001696 if (!device)
1697 return -1;
1698 if (strcmp(device, "none") != 0) {
1699 if (strstart(device, "tcp:", NULL)) {
1700 /* enforce required TCP attributes */
1701 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
1702 "%s,nowait,nodelay,server", device);
1703 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00001704 }
aliguori59030a82009-04-05 18:43:41 +00001705#ifndef _WIN32
1706 else if (strcmp(device, "stdio") == 0) {
1707 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00001708
aliguori59030a82009-04-05 18:43:41 +00001709 memset(&act, 0, sizeof(act));
1710 act.sa_handler = gdb_sigterm_handler;
1711 sigaction(SIGINT, &act, NULL);
1712 }
1713#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05001714 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00001715 if (!chr)
1716 return -1;
1717
Hans de Goede456d6062013-03-27 20:29:40 +01001718 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00001719 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
1720 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00001721 }
1722
aliguori36556b22009-03-28 18:05:53 +00001723 s = gdbserver_state;
1724 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05001725 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00001726 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00001727
aliguori36556b22009-03-28 18:05:53 +00001728 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
1729
1730 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05001731 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00001732 mon_chr->chr_write = gdb_monitor_write;
1733 monitor_init(mon_chr, 0);
1734 } else {
1735 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001736 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00001737 mon_chr = s->mon_chr;
1738 memset(s, 0, sizeof(GDBState));
1739 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001740 s->c_cpu = first_cpu;
1741 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00001742 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00001743 s->state = chr ? RS_IDLE : RS_INACTIVE;
1744 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00001745 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00001746
pbrook4046d912007-01-28 01:53:16 +00001747 return 0;
1748}
1749#endif