blob: 8a2f80c7d15c4827e6f9cbc4bc9198a16749fe3a [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"
Richard Henderson6ee77b12012-08-23 10:44:45 -070043#include "qemu/bitops.h"
aurel32ca587a82008-12-18 22:44:13 +000044
Andreas Färberf3659ee2013-06-27 19:09:09 +020045static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
46 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020047{
Andreas Färberf3659ee2013-06-27 19:09:09 +020048 CPUClass *cc = CPU_GET_CLASS(cpu);
49
50 if (cc->memory_rw_debug) {
51 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
52 }
53 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020054}
aurel32ca587a82008-12-18 22:44:13 +000055
56enum {
57 GDB_SIGNAL_0 = 0,
58 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010059 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000060 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010061 GDB_SIGNAL_ABRT = 6,
62 GDB_SIGNAL_ALRM = 14,
63 GDB_SIGNAL_IO = 23,
64 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000065 GDB_SIGNAL_UNKNOWN = 143
66};
67
68#ifdef CONFIG_USER_ONLY
69
70/* Map target signal numbers to GDB protocol signal numbers and vice
71 * versa. For user emulation's currently supported systems, we can
72 * assume most signals are defined.
73 */
74
75static int gdb_signal_table[] = {
76 0,
77 TARGET_SIGHUP,
78 TARGET_SIGINT,
79 TARGET_SIGQUIT,
80 TARGET_SIGILL,
81 TARGET_SIGTRAP,
82 TARGET_SIGABRT,
83 -1, /* SIGEMT */
84 TARGET_SIGFPE,
85 TARGET_SIGKILL,
86 TARGET_SIGBUS,
87 TARGET_SIGSEGV,
88 TARGET_SIGSYS,
89 TARGET_SIGPIPE,
90 TARGET_SIGALRM,
91 TARGET_SIGTERM,
92 TARGET_SIGURG,
93 TARGET_SIGSTOP,
94 TARGET_SIGTSTP,
95 TARGET_SIGCONT,
96 TARGET_SIGCHLD,
97 TARGET_SIGTTIN,
98 TARGET_SIGTTOU,
99 TARGET_SIGIO,
100 TARGET_SIGXCPU,
101 TARGET_SIGXFSZ,
102 TARGET_SIGVTALRM,
103 TARGET_SIGPROF,
104 TARGET_SIGWINCH,
105 -1, /* SIGLOST */
106 TARGET_SIGUSR1,
107 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000108#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000109 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000110#else
111 -1,
112#endif
aurel32ca587a82008-12-18 22:44:13 +0000113 -1, /* SIGPOLL */
114 -1,
115 -1,
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
123 -1,
124 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000125#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000126 __SIGRTMIN + 1,
127 __SIGRTMIN + 2,
128 __SIGRTMIN + 3,
129 __SIGRTMIN + 4,
130 __SIGRTMIN + 5,
131 __SIGRTMIN + 6,
132 __SIGRTMIN + 7,
133 __SIGRTMIN + 8,
134 __SIGRTMIN + 9,
135 __SIGRTMIN + 10,
136 __SIGRTMIN + 11,
137 __SIGRTMIN + 12,
138 __SIGRTMIN + 13,
139 __SIGRTMIN + 14,
140 __SIGRTMIN + 15,
141 __SIGRTMIN + 16,
142 __SIGRTMIN + 17,
143 __SIGRTMIN + 18,
144 __SIGRTMIN + 19,
145 __SIGRTMIN + 20,
146 __SIGRTMIN + 21,
147 __SIGRTMIN + 22,
148 __SIGRTMIN + 23,
149 __SIGRTMIN + 24,
150 __SIGRTMIN + 25,
151 __SIGRTMIN + 26,
152 __SIGRTMIN + 27,
153 __SIGRTMIN + 28,
154 __SIGRTMIN + 29,
155 __SIGRTMIN + 30,
156 __SIGRTMIN + 31,
157 -1, /* SIGCANCEL */
158 __SIGRTMIN,
159 __SIGRTMIN + 32,
160 __SIGRTMIN + 33,
161 __SIGRTMIN + 34,
162 __SIGRTMIN + 35,
163 __SIGRTMIN + 36,
164 __SIGRTMIN + 37,
165 __SIGRTMIN + 38,
166 __SIGRTMIN + 39,
167 __SIGRTMIN + 40,
168 __SIGRTMIN + 41,
169 __SIGRTMIN + 42,
170 __SIGRTMIN + 43,
171 __SIGRTMIN + 44,
172 __SIGRTMIN + 45,
173 __SIGRTMIN + 46,
174 __SIGRTMIN + 47,
175 __SIGRTMIN + 48,
176 __SIGRTMIN + 49,
177 __SIGRTMIN + 50,
178 __SIGRTMIN + 51,
179 __SIGRTMIN + 52,
180 __SIGRTMIN + 53,
181 __SIGRTMIN + 54,
182 __SIGRTMIN + 55,
183 __SIGRTMIN + 56,
184 __SIGRTMIN + 57,
185 __SIGRTMIN + 58,
186 __SIGRTMIN + 59,
187 __SIGRTMIN + 60,
188 __SIGRTMIN + 61,
189 __SIGRTMIN + 62,
190 __SIGRTMIN + 63,
191 __SIGRTMIN + 64,
192 __SIGRTMIN + 65,
193 __SIGRTMIN + 66,
194 __SIGRTMIN + 67,
195 __SIGRTMIN + 68,
196 __SIGRTMIN + 69,
197 __SIGRTMIN + 70,
198 __SIGRTMIN + 71,
199 __SIGRTMIN + 72,
200 __SIGRTMIN + 73,
201 __SIGRTMIN + 74,
202 __SIGRTMIN + 75,
203 __SIGRTMIN + 76,
204 __SIGRTMIN + 77,
205 __SIGRTMIN + 78,
206 __SIGRTMIN + 79,
207 __SIGRTMIN + 80,
208 __SIGRTMIN + 81,
209 __SIGRTMIN + 82,
210 __SIGRTMIN + 83,
211 __SIGRTMIN + 84,
212 __SIGRTMIN + 85,
213 __SIGRTMIN + 86,
214 __SIGRTMIN + 87,
215 __SIGRTMIN + 88,
216 __SIGRTMIN + 89,
217 __SIGRTMIN + 90,
218 __SIGRTMIN + 91,
219 __SIGRTMIN + 92,
220 __SIGRTMIN + 93,
221 __SIGRTMIN + 94,
222 __SIGRTMIN + 95,
223 -1, /* SIGINFO */
224 -1, /* UNKNOWN */
225 -1, /* DEFAULT */
226 -1,
227 -1,
228 -1,
229 -1,
230 -1,
231 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000232#endif
aurel32ca587a82008-12-18 22:44:13 +0000233};
bellard8f447cc2006-06-14 15:21:14 +0000234#else
aurel32ca587a82008-12-18 22:44:13 +0000235/* In system mode we only need SIGINT and SIGTRAP; other signals
236 are not yet supported. */
237
238enum {
239 TARGET_SIGINT = 2,
240 TARGET_SIGTRAP = 5
241};
242
243static int gdb_signal_table[] = {
244 -1,
245 -1,
246 TARGET_SIGINT,
247 -1,
248 -1,
249 TARGET_SIGTRAP
250};
bellard8f447cc2006-06-14 15:21:14 +0000251#endif
bellardb4608c02003-06-27 17:34:32 +0000252
aurel32ca587a82008-12-18 22:44:13 +0000253#ifdef CONFIG_USER_ONLY
254static int target_signal_to_gdb (int sig)
255{
256 int i;
257 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
258 if (gdb_signal_table[i] == sig)
259 return i;
260 return GDB_SIGNAL_UNKNOWN;
261}
262#endif
263
264static int gdb_signal_to_target (int sig)
265{
266 if (sig < ARRAY_SIZE (gdb_signal_table))
267 return gdb_signal_table[sig];
268 else
269 return -1;
270}
271
bellard4abe6152003-07-26 18:01:58 +0000272//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000273
pbrook56aebc82008-10-11 17:55:29 +0000274typedef struct GDBRegisterState {
275 int base_reg;
276 int num_regs;
277 gdb_reg_cb get_reg;
278 gdb_reg_cb set_reg;
279 const char *xml;
280 struct GDBRegisterState *next;
281} GDBRegisterState;
282
bellard858693c2004-03-31 18:52:07 +0000283enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000284 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000285 RS_IDLE,
286 RS_GETLINE,
287 RS_CHKSUM1,
288 RS_CHKSUM2,
289};
bellard858693c2004-03-31 18:52:07 +0000290typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200291 CPUState *c_cpu; /* current CPU for step/continue ops */
292 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200293 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000294 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000295 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000296 int line_buf_index;
297 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000298 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000299 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000300 int signal;
bellard41625032005-04-24 10:07:11 +0000301#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000302 int fd;
bellard41625032005-04-24 10:07:11 +0000303 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000304#else
305 CharDriverState *chr;
aliguori8a34a0f2009-03-05 23:01:55 +0000306 CharDriverState *mon_chr;
bellard41625032005-04-24 10:07:11 +0000307#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000308 char syscall_buf[256];
309 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000310} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000311
edgar_igl60897d32008-05-09 08:25:14 +0000312/* By default use no IRQs and no timers while single stepping so as to
313 * make single stepping like an ICE HW step.
314 */
315static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
316
aliguori880a7572008-11-18 20:30:24 +0000317static GDBState *gdbserver_state;
318
pbrook56aebc82008-10-11 17:55:29 +0000319/* This is an ugly hack to cope with both new and old gdb.
320 If gdb sends qXfer:features:read then assume we're talking to a newish
321 gdb that understands target descriptions. */
322static int gdb_has_xml;
323
bellard1fddef42005-04-17 19:16:13 +0000324#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000325/* XXX: This is not thread safe. Do we care? */
326static int gdbserver_fd = -1;
327
bellard858693c2004-03-31 18:52:07 +0000328static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000329{
330 uint8_t ch;
331 int ret;
332
333 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000334 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000335 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000336 if (errno == ECONNRESET)
337 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000338 if (errno != EINTR && errno != EAGAIN)
339 return -1;
340 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000341 close(s->fd);
342 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000343 return -1;
344 } else {
345 break;
346 }
347 }
348 return ch;
349}
pbrook4046d912007-01-28 01:53:16 +0000350#endif
bellardb4608c02003-06-27 17:34:32 +0000351
blueswir1654efcf2009-04-18 07:29:59 +0000352static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000353 GDB_SYS_UNKNOWN,
354 GDB_SYS_ENABLED,
355 GDB_SYS_DISABLED,
356} gdb_syscall_mode;
357
358/* If gdb is connected when the first semihosting syscall occurs then use
359 remote gdb syscalls. Otherwise use native file IO. */
360int use_gdb_syscalls(void)
361{
362 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000363 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
364 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000365 }
366 return gdb_syscall_mode == GDB_SYS_ENABLED;
367}
368
edgar_iglba70a622008-03-14 06:10:42 +0000369/* Resume execution. */
370static inline void gdb_continue(GDBState *s)
371{
372#ifdef CONFIG_USER_ONLY
373 s->running_state = 1;
374#else
Paolo Bonzinibc7d0e62013-06-03 17:06:55 +0200375 if (runstate_check(RUN_STATE_GUEST_PANICKED)) {
376 runstate_set(RUN_STATE_DEBUG);
377 }
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200378 if (!runstate_needs_reset()) {
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200379 vm_start();
380 }
edgar_iglba70a622008-03-14 06:10:42 +0000381#endif
382}
383
bellard858693c2004-03-31 18:52:07 +0000384static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000385{
pbrook4046d912007-01-28 01:53:16 +0000386#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000387 int ret;
388
389 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000390 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000391 if (ret < 0) {
392 if (errno != EINTR && errno != EAGAIN)
393 return;
394 } else {
395 buf += ret;
396 len -= ret;
397 }
398 }
pbrook4046d912007-01-28 01:53:16 +0000399#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500400 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000401#endif
bellardb4608c02003-06-27 17:34:32 +0000402}
403
404static inline int fromhex(int v)
405{
406 if (v >= '0' && v <= '9')
407 return v - '0';
408 else if (v >= 'A' && v <= 'F')
409 return v - 'A' + 10;
410 else if (v >= 'a' && v <= 'f')
411 return v - 'a' + 10;
412 else
413 return 0;
414}
415
416static inline int tohex(int v)
417{
418 if (v < 10)
419 return v + '0';
420 else
421 return v - 10 + 'a';
422}
423
424static void memtohex(char *buf, const uint8_t *mem, int len)
425{
426 int i, c;
427 char *q;
428 q = buf;
429 for(i = 0; i < len; i++) {
430 c = mem[i];
431 *q++ = tohex(c >> 4);
432 *q++ = tohex(c & 0xf);
433 }
434 *q = '\0';
435}
436
437static void hextomem(uint8_t *mem, const char *buf, int len)
438{
439 int i;
440
441 for(i = 0; i < len; i++) {
442 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
443 buf += 2;
444 }
445}
446
bellardb4608c02003-06-27 17:34:32 +0000447/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000448static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000449{
pbrook56aebc82008-10-11 17:55:29 +0000450 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000451 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000452
bellardb4608c02003-06-27 17:34:32 +0000453 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000454 p = s->last_packet;
455 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000456 memcpy(p, buf, len);
457 p += len;
bellardb4608c02003-06-27 17:34:32 +0000458 csum = 0;
459 for(i = 0; i < len; i++) {
460 csum += buf[i];
461 }
pbrook4046d912007-01-28 01:53:16 +0000462 *(p++) = '#';
463 *(p++) = tohex((csum >> 4) & 0xf);
464 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000465
pbrook4046d912007-01-28 01:53:16 +0000466 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000467 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000468
pbrook4046d912007-01-28 01:53:16 +0000469#ifdef CONFIG_USER_ONLY
470 i = get_char(s);
471 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000472 return -1;
pbrook4046d912007-01-28 01:53:16 +0000473 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000474 break;
pbrook4046d912007-01-28 01:53:16 +0000475#else
476 break;
477#endif
bellardb4608c02003-06-27 17:34:32 +0000478 }
479 return 0;
480}
481
pbrook56aebc82008-10-11 17:55:29 +0000482/* return -1 if error, 0 if OK */
483static int put_packet(GDBState *s, const char *buf)
484{
485#ifdef DEBUG_GDB
486 printf("reply='%s'\n", buf);
487#endif
488
489 return put_packet_binary(s, buf, strlen(buf));
490}
491
492/* The GDB remote protocol transfers values in target byte order. This means
493 we can use the raw memory access routines to access the value buffer.
494 Conveniently, these also handle the case where the buffer is mis-aligned.
495 */
496#define GET_REG8(val) do { \
497 stb_p(mem_buf, val); \
498 return 1; \
499 } while(0)
500#define GET_REG16(val) do { \
501 stw_p(mem_buf, val); \
502 return 2; \
503 } while(0)
504#define GET_REG32(val) do { \
505 stl_p(mem_buf, val); \
506 return 4; \
507 } while(0)
508#define GET_REG64(val) do { \
509 stq_p(mem_buf, val); \
510 return 8; \
511 } while(0)
512
513#if TARGET_LONG_BITS == 64
514#define GET_REGL(val) GET_REG64(val)
515#define ldtul_p(addr) ldq_p(addr)
516#else
517#define GET_REGL(val) GET_REG32(val)
518#define ldtul_p(addr) ldl_p(addr)
519#endif
520
edgar_iglfde3fd62008-05-09 08:50:01 +0000521#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000522
Andreas Färberf20f9df2013-07-07 12:07:54 +0200523#include "target-i386/gdbstub.c"
bellard6da41ea2004-01-04 15:48:38 +0000524
bellard9e62fd72004-01-05 22:49:06 +0000525#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000526
aurel32e571cb42009-01-24 15:07:42 +0000527#if defined (TARGET_PPC64)
528#define GDB_CORE_XML "power64-core.xml"
529#else
530#define GDB_CORE_XML "power-core.xml"
531#endif
pbrook56aebc82008-10-11 17:55:29 +0000532
Andreas Färber0980bfa2013-07-07 12:26:33 +0200533#include "target-ppc/gdbstub.c"
pbrook56aebc82008-10-11 17:55:29 +0000534
bellarde95c8d52004-09-30 22:22:08 +0000535#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000536
Andreas Färberd19c87f2013-07-07 12:29:26 +0200537#include "target-sparc/gdbstub.c"
pbrook56aebc82008-10-11 17:55:29 +0000538
bellard1fddef42005-04-17 19:16:13 +0000539#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000540
pbrook56aebc82008-10-11 17:55:29 +0000541#define GDB_CORE_XML "arm-core.xml"
542
Andreas Färber58850da2013-07-07 12:32:15 +0200543#include "target-arm/gdbstub.c"
pbrook56aebc82008-10-11 17:55:29 +0000544
pbrooke6e59062006-10-22 00:18:54 +0000545#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +0000546
pbrook56aebc82008-10-11 17:55:29 +0000547#define GDB_CORE_XML "cf-core.xml"
548
Andreas Färberc88de142013-07-07 12:33:56 +0200549#include "target-m68k/gdbstub.c"
pbrooke6e59062006-10-22 00:18:54 +0000550
bellard6f970bd2005-12-05 19:55:19 +0000551#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +0000552
Andreas Färber814ac262013-07-07 12:38:42 +0200553#include "target-mips/gdbstub.c"
ths36d23952007-02-28 22:37:42 +0000554
Jia Liufc043552012-07-20 15:50:50 +0800555#elif defined(TARGET_OPENRISC)
556
Andreas Färber30028732013-07-07 12:40:38 +0200557#include "target-openrisc/gdbstub.c"
Jia Liufc043552012-07-20 15:50:50 +0800558
bellardfdf9b3e2006-04-27 21:07:38 +0000559#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +0000560
Andreas Färber2f937732013-07-07 12:42:52 +0200561#include "target-sh4/gdbstub.c"
ths6ef99fc2007-05-13 16:36:24 +0000562
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200563#elif defined (TARGET_MICROBLAZE)
564
Andreas Färbereabfc232013-07-07 12:45:47 +0200565#include "target-microblaze/gdbstub.c"
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200566
thsf1ccf902007-10-08 13:16:14 +0000567#elif defined (TARGET_CRIS)
568
Andreas Färber213c19d2013-07-07 12:50:22 +0200569#include "target-cris/gdbstub.c"
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100570
aurel3219bf5172008-12-07 23:26:32 +0000571#elif defined (TARGET_ALPHA)
572
Andreas Färberc3ce8eb2013-07-07 12:52:32 +0200573#include "target-alpha/gdbstub.c"
aurel3219bf5172008-12-07 23:26:32 +0000574
Alexander Grafafcb0e42009-12-05 12:44:29 +0100575#elif defined (TARGET_S390X)
576
Andreas Färbercfae5c92013-07-07 12:54:12 +0200577#include "target-s390x/gdbstub.c"
Richard Henderson6ee77b12012-08-23 10:44:45 -0700578
Michael Walle0c45d3d2011-02-17 23:45:06 +0100579#elif defined (TARGET_LM32)
580
Andreas Färberd0ff8d02013-07-07 12:55:44 +0200581#include "target-lm32/gdbstub.c"
Michael Walle0c45d3d2011-02-17 23:45:06 +0100582
Max Filippovccfcaba2011-09-06 03:55:52 +0400583#elif defined(TARGET_XTENSA)
584
Andreas Färberf3840912012-02-20 06:44:56 +0100585static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400586{
587 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
588
589 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
590 return 0;
591 }
592
593 switch (reg->type) {
594 case 9: /*pc*/
595 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +0400596
597 case 1: /*ar*/
598 xtensa_sync_phys_from_window(env);
599 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400600
601 case 2: /*SR*/
602 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400603
604 case 3: /*UR*/
605 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400606
Max Filippovdd519cb2012-09-19 04:23:54 +0400607 case 4: /*f*/
608 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +0400609
Max Filippovccfcaba2011-09-06 03:55:52 +0400610 case 8: /*a*/
611 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400612
613 default:
614 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200615 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400616 return 0;
617 }
618}
619
Andreas Färberf3840912012-02-20 06:44:56 +0100620static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400621{
622 uint32_t tmp;
623 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
624
625 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
626 return 0;
627 }
628
629 tmp = ldl_p(mem_buf);
630
631 switch (reg->type) {
632 case 9: /*pc*/
633 env->pc = tmp;
634 break;
635
636 case 1: /*ar*/
637 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
638 xtensa_sync_window_from_phys(env);
639 break;
640
641 case 2: /*SR*/
642 env->sregs[reg->targno & 0xff] = tmp;
643 break;
644
645 case 3: /*UR*/
646 env->uregs[reg->targno & 0xff] = tmp;
647 break;
648
Max Filippovdd519cb2012-09-19 04:23:54 +0400649 case 4: /*f*/
650 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
651 break;
652
Max Filippovccfcaba2011-09-06 03:55:52 +0400653 case 8: /*a*/
654 env->regs[reg->targno & 0x0f] = tmp;
655 break;
656
657 default:
658 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200659 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400660 return 0;
661 }
662
663 return 4;
664}
bellard1fddef42005-04-17 19:16:13 +0000665#else
pbrook56aebc82008-10-11 17:55:29 +0000666
Andreas Färber9349b4f2012-03-14 01:38:32 +0100667static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000668{
669 return 0;
670}
671
Andreas Färber9349b4f2012-03-14 01:38:32 +0100672static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000673{
pbrook56aebc82008-10-11 17:55:29 +0000674 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000675}
676
677#endif
bellardb4608c02003-06-27 17:34:32 +0000678
pbrook56aebc82008-10-11 17:55:29 +0000679#ifdef GDB_CORE_XML
680/* Encode data using the encoding for 'x' packets. */
681static int memtox(char *buf, const char *mem, int len)
682{
683 char *p = buf;
684 char c;
685
686 while (len--) {
687 c = *(mem++);
688 switch (c) {
689 case '#': case '$': case '*': case '}':
690 *(p++) = '}';
691 *(p++) = c ^ 0x20;
692 break;
693 default:
694 *(p++) = c;
695 break;
696 }
697 }
698 return p - buf;
699}
700
aurel323faf7782008-12-07 23:26:17 +0000701static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +0000702{
pbrook56aebc82008-10-11 17:55:29 +0000703 size_t len;
704 int i;
705 const char *name;
706 static char target_xml[1024];
707
708 len = 0;
709 while (p[len] && p[len] != ':')
710 len++;
711 *newp = p + len;
712
713 name = NULL;
714 if (strncmp(p, "target.xml", len) == 0) {
715 /* Generate the XML description for this CPU. */
716 if (!target_xml[0]) {
717 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +0200718 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +0000719
blueswir15b3715b2008-10-25 11:18:12 +0000720 snprintf(target_xml, sizeof(target_xml),
721 "<?xml version=\"1.0\"?>"
722 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
723 "<target>"
724 "<xi:include href=\"%s\"/>",
725 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +0000726
Andreas Färbereac8b352013-06-28 21:11:37 +0200727 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000728 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
729 pstrcat(target_xml, sizeof(target_xml), r->xml);
730 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000731 }
blueswir12dc766d2009-04-13 16:06:19 +0000732 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000733 }
734 return target_xml;
735 }
736 for (i = 0; ; i++) {
737 name = xml_builtin[i][0];
738 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
739 break;
740 }
741 return name ? xml_builtin[i][1] : NULL;
742}
743#endif
744
Andreas Färber385b9f02013-06-27 18:25:36 +0200745static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000746{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200747 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200748 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000749 GDBRegisterState *r;
750
Andreas Färbera0e372f2013-06-28 23:18:47 +0200751 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +0000752 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200753 }
pbrook56aebc82008-10-11 17:55:29 +0000754
Andreas Färbereac8b352013-06-28 21:11:37 +0200755 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000756 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
757 return r->get_reg(env, mem_buf, reg - r->base_reg);
758 }
759 }
760 return 0;
761}
762
Andreas Färber385b9f02013-06-27 18:25:36 +0200763static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000764{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200765 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200766 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000767 GDBRegisterState *r;
768
Andreas Färbera0e372f2013-06-28 23:18:47 +0200769 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +0000770 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200771 }
pbrook56aebc82008-10-11 17:55:29 +0000772
Andreas Färbereac8b352013-06-28 21:11:37 +0200773 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000774 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
775 return r->set_reg(env, mem_buf, reg - r->base_reg);
776 }
777 }
778 return 0;
779}
780
781/* Register a supplemental set of CPU registers. If g_pos is nonzero it
782 specifies the first register number and these registers are included in
783 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
784 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
785 */
786
Andreas Färber22169d42013-06-28 21:27:39 +0200787void gdb_register_coprocessor(CPUState *cpu,
788 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
789 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000790{
791 GDBRegisterState *s;
792 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000793
Andreas Färbereac8b352013-06-28 21:11:37 +0200794 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000795 while (*p) {
796 /* Check for duplicates. */
797 if (strcmp((*p)->xml, xml) == 0)
798 return;
799 p = &(*p)->next;
800 }
Stefan Weil9643c252011-10-18 22:25:38 +0200801
802 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200803 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200804 s->num_regs = num_regs;
805 s->get_reg = get_reg;
806 s->set_reg = set_reg;
807 s->xml = xml;
808
pbrook56aebc82008-10-11 17:55:29 +0000809 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200810 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000811 *p = s;
812 if (g_pos) {
813 if (g_pos != s->base_reg) {
814 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
815 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +0000816 }
817 }
818}
819
aliguoria1d1bb32008-11-18 20:07:32 +0000820#ifndef CONFIG_USER_ONLY
821static const int xlat_gdb_type[] = {
822 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
823 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
824 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
825};
826#endif
827
aliguori880a7572008-11-18 20:30:24 +0000828static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000829{
Andreas Färber182735e2013-05-29 22:29:20 +0200830 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +0100831 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +0000832 int err = 0;
833
Andreas Färber62278812013-06-27 17:12:06 +0200834 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200835 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200836 }
aliguorie22a25c2009-03-12 20:12:48 +0000837
aliguoria1d1bb32008-11-18 20:07:32 +0000838 switch (type) {
839 case GDB_BREAKPOINT_SW:
840 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +0200841 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
842 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000843 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
844 if (err)
845 break;
846 }
847 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000848#ifndef CONFIG_USER_ONLY
849 case GDB_WATCHPOINT_WRITE:
850 case GDB_WATCHPOINT_READ:
851 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +0200852 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
853 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000854 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
855 NULL);
856 if (err)
857 break;
858 }
859 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000860#endif
861 default:
862 return -ENOSYS;
863 }
864}
865
aliguori880a7572008-11-18 20:30:24 +0000866static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000867{
Andreas Färber182735e2013-05-29 22:29:20 +0200868 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +0100869 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +0000870 int err = 0;
871
Andreas Färber62278812013-06-27 17:12:06 +0200872 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200873 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200874 }
aliguorie22a25c2009-03-12 20:12:48 +0000875
aliguoria1d1bb32008-11-18 20:07:32 +0000876 switch (type) {
877 case GDB_BREAKPOINT_SW:
878 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +0200879 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
880 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000881 err = cpu_breakpoint_remove(env, addr, BP_GDB);
882 if (err)
883 break;
884 }
885 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000886#ifndef CONFIG_USER_ONLY
887 case GDB_WATCHPOINT_WRITE:
888 case GDB_WATCHPOINT_READ:
889 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +0200890 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
891 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000892 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
893 if (err)
894 break;
895 }
896 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000897#endif
898 default:
899 return -ENOSYS;
900 }
901}
902
aliguori880a7572008-11-18 20:30:24 +0000903static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +0000904{
Andreas Färber182735e2013-05-29 22:29:20 +0200905 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +0100906 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +0000907
aliguorie22a25c2009-03-12 20:12:48 +0000908 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200909 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +0000910 return;
911 }
912
Andreas Färber182735e2013-05-29 22:29:20 +0200913 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
914 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000915 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000916#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +0000917 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000918#endif
aliguori880a7572008-11-18 20:30:24 +0000919 }
aliguoria1d1bb32008-11-18 20:07:32 +0000920}
921
aurel32fab9d282009-04-08 21:29:37 +0000922static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
923{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200924 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +0200925 CPUClass *cc = CPU_GET_CLASS(cpu);
926
927 cpu_synchronize_state(cpu);
928 if (cc->set_pc) {
929 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -0800930 }
aurel32fab9d282009-04-08 21:29:37 +0000931}
932
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200933static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700934{
Andreas Färber0d342822012-12-17 07:12:13 +0100935 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700936
Andreas Färber182735e2013-05-29 22:29:20 +0200937 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +0200938 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200939 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +0200940 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700941 }
Andreas Färberaa48dd92013-07-09 20:50:52 +0200942
943 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700944}
945
aliguori880a7572008-11-18 20:30:24 +0000946static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +0000947{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200948 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +0000949 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700950 uint32_t thread;
951 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +0000952 char buf[MAX_PACKET_LENGTH];
953 uint8_t mem_buf[MAX_PACKET_LENGTH];
954 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +0000955 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +0000956
bellard858693c2004-03-31 18:52:07 +0000957#ifdef DEBUG_GDB
958 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +0000959#endif
bellard858693c2004-03-31 18:52:07 +0000960 p = line_buf;
961 ch = *p++;
962 switch(ch) {
963 case '?':
bellard1fddef42005-04-17 19:16:13 +0000964 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +0000965 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200966 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +0000967 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +0000968 /* Remove all the breakpoints when this query is issued,
969 * because gdb is doing and initial connect and the state
970 * should be cleaned up.
971 */
aliguori880a7572008-11-18 20:30:24 +0000972 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +0000973 break;
974 case 'c':
975 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +0000976 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000977 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000978 }
aurel32ca587a82008-12-18 22:44:13 +0000979 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +0000980 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000981 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +0000982 case 'C':
aurel32ca587a82008-12-18 22:44:13 +0000983 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
984 if (s->signal == -1)
985 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +0000986 gdb_continue(s);
987 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200988 case 'v':
989 if (strncmp(p, "Cont", 4) == 0) {
990 int res_signal, res_thread;
991
992 p += 4;
993 if (*p == '?') {
994 put_packet(s, "vCont;c;C;s;S");
995 break;
996 }
997 res = 0;
998 res_signal = 0;
999 res_thread = 0;
1000 while (*p) {
1001 int action, signal;
1002
1003 if (*p++ != ';') {
1004 res = 0;
1005 break;
1006 }
1007 action = *p++;
1008 signal = 0;
1009 if (action == 'C' || action == 'S') {
1010 signal = strtoul(p, (char **)&p, 16);
1011 } else if (action != 'c' && action != 's') {
1012 res = 0;
1013 break;
1014 }
1015 thread = 0;
1016 if (*p == ':') {
1017 thread = strtoull(p+1, (char **)&p, 16);
1018 }
1019 action = tolower(action);
1020 if (res == 0 || (res == 'c' && action == 's')) {
1021 res = action;
1022 res_signal = signal;
1023 res_thread = thread;
1024 }
1025 }
1026 if (res) {
1027 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001028 cpu = find_cpu(res_thread);
1029 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001030 put_packet(s, "E22");
1031 break;
1032 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001033 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001034 }
1035 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001036 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001037 }
1038 s->signal = res_signal;
1039 gdb_continue(s);
1040 return RS_IDLE;
1041 }
1042 break;
1043 } else {
1044 goto unknown_command;
1045 }
edgar_igl7d03f822008-05-17 18:58:29 +00001046 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001047#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001048 /* Kill the target */
1049 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1050 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001051#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001052 case 'D':
1053 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001054 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001055 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001056 gdb_continue(s);
1057 put_packet(s, "OK");
1058 break;
bellard858693c2004-03-31 18:52:07 +00001059 case 's':
1060 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001061 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001062 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001063 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001064 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001065 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001066 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001067 case 'F':
1068 {
1069 target_ulong ret;
1070 target_ulong err;
1071
1072 ret = strtoull(p, (char **)&p, 16);
1073 if (*p == ',') {
1074 p++;
1075 err = strtoull(p, (char **)&p, 16);
1076 } else {
1077 err = 0;
1078 }
1079 if (*p == ',')
1080 p++;
1081 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001082 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001083 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001084 s->current_syscall_cb = NULL;
1085 }
pbrooka2d1eba2007-01-28 03:10:55 +00001086 if (type == 'C') {
1087 put_packet(s, "T02");
1088 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001089 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001090 }
1091 }
1092 break;
bellard858693c2004-03-31 18:52:07 +00001093 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001094 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001095 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001096 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001097 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001098 len += reg_size;
1099 }
1100 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001101 put_packet(s, buf);
1102 break;
1103 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001104 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001105 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001106 len = strlen(p) / 2;
1107 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001108 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001109 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001110 len -= reg_size;
1111 registers += reg_size;
1112 }
bellard858693c2004-03-31 18:52:07 +00001113 put_packet(s, "OK");
1114 break;
1115 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001116 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001117 if (*p == ',')
1118 p++;
bellard9d9754a2006-06-25 15:32:37 +00001119 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001120 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001121 put_packet (s, "E14");
1122 } else {
1123 memtohex(buf, mem_buf, len);
1124 put_packet(s, buf);
1125 }
bellard858693c2004-03-31 18:52:07 +00001126 break;
1127 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001128 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001129 if (*p == ',')
1130 p++;
bellard9d9754a2006-06-25 15:32:37 +00001131 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001132 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001133 p++;
1134 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001135 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001136 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001137 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001138 } else {
bellard858693c2004-03-31 18:52:07 +00001139 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001140 }
bellard858693c2004-03-31 18:52:07 +00001141 break;
pbrook56aebc82008-10-11 17:55:29 +00001142 case 'p':
1143 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1144 This works, but can be very slow. Anything new enough to
1145 understand XML also knows how to use this properly. */
1146 if (!gdb_has_xml)
1147 goto unknown_command;
1148 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001149 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001150 if (reg_size) {
1151 memtohex(buf, mem_buf, reg_size);
1152 put_packet(s, buf);
1153 } else {
1154 put_packet(s, "E14");
1155 }
1156 break;
1157 case 'P':
1158 if (!gdb_has_xml)
1159 goto unknown_command;
1160 addr = strtoull(p, (char **)&p, 16);
1161 if (*p == '=')
1162 p++;
1163 reg_size = strlen(p) / 2;
1164 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001165 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001166 put_packet(s, "OK");
1167 break;
bellard858693c2004-03-31 18:52:07 +00001168 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001169 case 'z':
1170 type = strtoul(p, (char **)&p, 16);
1171 if (*p == ',')
1172 p++;
bellard9d9754a2006-06-25 15:32:37 +00001173 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001174 if (*p == ',')
1175 p++;
bellard9d9754a2006-06-25 15:32:37 +00001176 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001177 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001178 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001179 else
aliguori880a7572008-11-18 20:30:24 +00001180 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001181 if (res >= 0)
1182 put_packet(s, "OK");
1183 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001184 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001185 else
1186 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001187 break;
aliguori880a7572008-11-18 20:30:24 +00001188 case 'H':
1189 type = *p++;
1190 thread = strtoull(p, (char **)&p, 16);
1191 if (thread == -1 || thread == 0) {
1192 put_packet(s, "OK");
1193 break;
1194 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001195 cpu = find_cpu(thread);
1196 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001197 put_packet(s, "E22");
1198 break;
1199 }
1200 switch (type) {
1201 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001202 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001203 put_packet(s, "OK");
1204 break;
1205 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001206 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001207 put_packet(s, "OK");
1208 break;
1209 default:
1210 put_packet(s, "E22");
1211 break;
1212 }
1213 break;
1214 case 'T':
1215 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001216 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001217
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001218 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001219 put_packet(s, "OK");
1220 } else {
aliguori880a7572008-11-18 20:30:24 +00001221 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001222 }
aliguori880a7572008-11-18 20:30:24 +00001223 break;
pbrook978efd62006-06-17 18:30:42 +00001224 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001225 case 'Q':
1226 /* parse any 'q' packets here */
1227 if (!strcmp(p,"qemu.sstepbits")) {
1228 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001229 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1230 SSTEP_ENABLE,
1231 SSTEP_NOIRQ,
1232 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001233 put_packet(s, buf);
1234 break;
1235 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1236 /* Display or change the sstep_flags */
1237 p += 10;
1238 if (*p != '=') {
1239 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001240 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001241 put_packet(s, buf);
1242 break;
1243 }
1244 p++;
1245 type = strtoul(p, (char **)&p, 16);
1246 sstep_flags = type;
1247 put_packet(s, "OK");
1248 break;
aliguori880a7572008-11-18 20:30:24 +00001249 } else if (strcmp(p,"C") == 0) {
1250 /* "Current thread" remains vague in the spec, so always return
1251 * the first CPU (gdb returns the first thread). */
1252 put_packet(s, "QC1");
1253 break;
1254 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001255 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001256 goto report_cpuinfo;
1257 } else if (strcmp(p,"sThreadInfo") == 0) {
1258 report_cpuinfo:
1259 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001260 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001261 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001262 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001263 } else
1264 put_packet(s, "l");
1265 break;
1266 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1267 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001268 cpu = find_cpu(thread);
1269 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001270 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001271 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001272 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001273 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001274 memtohex(buf, mem_buf, len);
1275 put_packet(s, buf);
1276 }
aliguori880a7572008-11-18 20:30:24 +00001277 break;
edgar_igl60897d32008-05-09 08:25:14 +00001278 }
blueswir10b8a9882009-03-07 10:51:36 +00001279#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001280 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001281 CPUArchState *env = s->c_cpu->env_ptr;
1282 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001283
blueswir1363a37d2008-08-21 17:58:08 +00001284 snprintf(buf, sizeof(buf),
1285 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1286 ";Bss=" TARGET_ABI_FMT_lx,
1287 ts->info->code_offset,
1288 ts->info->data_offset,
1289 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001290 put_packet(s, buf);
1291 break;
1292 }
blueswir10b8a9882009-03-07 10:51:36 +00001293#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001294 else if (strncmp(p, "Rcmd,", 5) == 0) {
1295 int len = strlen(p + 5);
1296
1297 if ((len % 2) != 0) {
1298 put_packet(s, "E01");
1299 break;
1300 }
1301 hextomem(mem_buf, p + 5, len);
1302 len = len / 2;
1303 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001304 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001305 put_packet(s, "OK");
1306 break;
1307 }
blueswir10b8a9882009-03-07 10:51:36 +00001308#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001309 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001310 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001311#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001312 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001313#endif
1314 put_packet(s, buf);
1315 break;
1316 }
1317#ifdef GDB_CORE_XML
1318 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1319 const char *xml;
1320 target_ulong total_len;
1321
1322 gdb_has_xml = 1;
1323 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001324 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001325 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001326 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001327 put_packet(s, buf);
1328 break;
1329 }
1330
1331 if (*p == ':')
1332 p++;
1333 addr = strtoul(p, (char **)&p, 16);
1334 if (*p == ',')
1335 p++;
1336 len = strtoul(p, (char **)&p, 16);
1337
1338 total_len = strlen(xml);
1339 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001340 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001341 put_packet(s, buf);
1342 break;
1343 }
1344 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1345 len = (MAX_PACKET_LENGTH - 5) / 2;
1346 if (len < total_len - addr) {
1347 buf[0] = 'm';
1348 len = memtox(buf + 1, xml + addr, len);
1349 } else {
1350 buf[0] = 'l';
1351 len = memtox(buf + 1, xml + addr, total_len - addr);
1352 }
1353 put_packet_binary(s, buf, len + 1);
1354 break;
1355 }
1356#endif
1357 /* Unrecognised 'q' command. */
1358 goto unknown_command;
1359
bellard858693c2004-03-31 18:52:07 +00001360 default:
pbrook56aebc82008-10-11 17:55:29 +00001361 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001362 /* put empty packet */
1363 buf[0] = '\0';
1364 put_packet(s, buf);
1365 break;
1366 }
1367 return RS_IDLE;
1368}
1369
Andreas Färber64f6b342013-05-27 02:06:09 +02001370void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001371{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001372 gdbserver_state->c_cpu = cpu;
1373 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001374}
1375
bellard1fddef42005-04-17 19:16:13 +00001376#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001377static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001378{
aliguori880a7572008-11-18 20:30:24 +00001379 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001380 CPUArchState *env = s->c_cpu->env_ptr;
1381 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001382 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001383 const char *type;
bellard858693c2004-03-31 18:52:07 +00001384 int ret;
1385
Meador Ingecdb432b2012-03-15 17:49:45 +00001386 if (running || s->state == RS_INACTIVE) {
1387 return;
1388 }
1389 /* Is there a GDB syscall waiting to be sent? */
1390 if (s->current_syscall_cb) {
1391 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001392 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001393 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001394 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001395 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00001396 if (env->watchpoint_hit) {
1397 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001398 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001399 type = "r";
1400 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001401 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001402 type = "a";
1403 break;
1404 default:
1405 type = "";
1406 break;
1407 }
aliguori880a7572008-11-18 20:30:24 +00001408 snprintf(buf, sizeof(buf),
1409 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001410 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00001411 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001412 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001413 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001414 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001415 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001416 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001417 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001418 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001419 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001420 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001421 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001422 ret = GDB_SIGNAL_QUIT;
1423 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001424 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001425 ret = GDB_SIGNAL_IO;
1426 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001427 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001428 ret = GDB_SIGNAL_ALRM;
1429 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001430 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001431 ret = GDB_SIGNAL_ABRT;
1432 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001433 case RUN_STATE_SAVE_VM:
1434 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001435 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001436 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001437 ret = GDB_SIGNAL_XCPU;
1438 break;
1439 default:
1440 ret = GDB_SIGNAL_UNKNOWN;
1441 break;
bellardbbeb7b52006-04-23 18:42:15 +00001442 }
Andreas Färber0d342822012-12-17 07:12:13 +01001443 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001444
1445send_packet:
bellard858693c2004-03-31 18:52:07 +00001446 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001447
1448 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001449 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001450}
bellard1fddef42005-04-17 19:16:13 +00001451#endif
bellard858693c2004-03-31 18:52:07 +00001452
pbrooka2d1eba2007-01-28 03:10:55 +00001453/* Send a gdb syscall request.
1454 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001455 %x - target_ulong argument printed in hex.
1456 %lx - 64-bit argument printed in hex.
1457 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001458void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001459{
1460 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001461 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001462 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001463 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001464 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001465 GDBState *s;
1466
aliguori880a7572008-11-18 20:30:24 +00001467 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001468 if (!s)
1469 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001470 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001471#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001472 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001473#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001474 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001475 p = s->syscall_buf;
1476 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001477 *(p++) = 'F';
1478 while (*fmt) {
1479 if (*fmt == '%') {
1480 fmt++;
1481 switch (*fmt++) {
1482 case 'x':
1483 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001484 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001485 break;
pbrooka87295e2007-05-26 15:09:38 +00001486 case 'l':
1487 if (*(fmt++) != 'x')
1488 goto bad_format;
1489 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001490 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001491 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001492 case 's':
1493 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001494 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001495 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001496 break;
1497 default:
pbrooka87295e2007-05-26 15:09:38 +00001498 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001499 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1500 fmt - 1);
1501 break;
1502 }
1503 } else {
1504 *(p++) = *(fmt++);
1505 }
1506 }
pbrook8a93e022007-08-06 13:19:15 +00001507 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001508 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001509#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001510 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001511 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001512#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001513 /* In this case wait to send the syscall packet until notification that
1514 the CPU has stopped. This must be done because if the packet is sent
1515 now the reply from the syscall request could be received while the CPU
1516 is still in the running state, which can cause packets to be dropped
1517 and state transition 'T' packets to be sent while the syscall is still
1518 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001519 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001520#endif
1521}
1522
bellard6a00d602005-11-21 23:25:50 +00001523static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001524{
1525 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001526 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001527
bellard1fddef42005-04-17 19:16:13 +00001528#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001529 if (s->last_packet_len) {
1530 /* Waiting for a response to the last packet. If we see the start
1531 of a new command then abandon the previous response. */
1532 if (ch == '-') {
1533#ifdef DEBUG_GDB
1534 printf("Got NACK, retransmitting\n");
1535#endif
thsffe8ab82007-12-16 03:16:05 +00001536 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001537 }
1538#ifdef DEBUG_GDB
1539 else if (ch == '+')
1540 printf("Got ACK\n");
1541 else
1542 printf("Got '%c' when expecting ACK/NACK\n", ch);
1543#endif
1544 if (ch == '+' || ch == '$')
1545 s->last_packet_len = 0;
1546 if (ch != '$')
1547 return;
1548 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001549 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001550 /* when the CPU is running, we cannot do anything except stop
1551 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001552 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001553 } else
bellard1fddef42005-04-17 19:16:13 +00001554#endif
bellard41625032005-04-24 10:07:11 +00001555 {
bellard858693c2004-03-31 18:52:07 +00001556 switch(s->state) {
1557 case RS_IDLE:
1558 if (ch == '$') {
1559 s->line_buf_index = 0;
1560 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001561 }
1562 break;
bellard858693c2004-03-31 18:52:07 +00001563 case RS_GETLINE:
1564 if (ch == '#') {
1565 s->state = RS_CHKSUM1;
1566 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1567 s->state = RS_IDLE;
1568 } else {
1569 s->line_buf[s->line_buf_index++] = ch;
1570 }
1571 break;
1572 case RS_CHKSUM1:
1573 s->line_buf[s->line_buf_index] = '\0';
1574 s->line_csum = fromhex(ch) << 4;
1575 s->state = RS_CHKSUM2;
1576 break;
1577 case RS_CHKSUM2:
1578 s->line_csum |= fromhex(ch);
1579 csum = 0;
1580 for(i = 0; i < s->line_buf_index; i++) {
1581 csum += s->line_buf[i];
1582 }
1583 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001584 reply = '-';
1585 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001586 s->state = RS_IDLE;
1587 } else {
ths60fe76f2007-12-16 03:02:09 +00001588 reply = '+';
1589 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001590 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001591 }
bellardb4608c02003-06-27 17:34:32 +00001592 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001593 default:
1594 abort();
bellardb4608c02003-06-27 17:34:32 +00001595 }
1596 }
bellard858693c2004-03-31 18:52:07 +00001597}
1598
Paul Brook0e1c9c52010-06-16 13:03:51 +01001599/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001600void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001601{
1602 GDBState *s;
1603 char buf[4];
1604
1605 s = gdbserver_state;
1606 if (!s) {
1607 return;
1608 }
1609#ifdef CONFIG_USER_ONLY
1610 if (gdbserver_fd < 0 || s->fd < 0) {
1611 return;
1612 }
1613#endif
1614
1615 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1616 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001617
1618#ifndef CONFIG_USER_ONLY
1619 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001620 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001621 }
1622#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001623}
1624
bellard1fddef42005-04-17 19:16:13 +00001625#ifdef CONFIG_USER_ONLY
1626int
aurel32ca587a82008-12-18 22:44:13 +00001627gdb_queuesig (void)
1628{
1629 GDBState *s;
1630
1631 s = gdbserver_state;
1632
1633 if (gdbserver_fd < 0 || s->fd < 0)
1634 return 0;
1635 else
1636 return 1;
1637}
1638
1639int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001640gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001641{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001642 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001643 GDBState *s;
1644 char buf[256];
1645 int n;
bellard1fddef42005-04-17 19:16:13 +00001646
Andreas Färber5ca666c2013-06-24 19:20:57 +02001647 s = gdbserver_state;
1648 if (gdbserver_fd < 0 || s->fd < 0) {
1649 return sig;
bellard1fddef42005-04-17 19:16:13 +00001650 }
1651
Andreas Färber5ca666c2013-06-24 19:20:57 +02001652 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001653 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02001654 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00001655
Andreas Färber5ca666c2013-06-24 19:20:57 +02001656 if (sig != 0) {
1657 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1658 put_packet(s, buf);
1659 }
1660 /* put_packet() might have detected that the peer terminated the
1661 connection. */
1662 if (s->fd < 0) {
1663 return sig;
1664 }
1665
1666 sig = 0;
1667 s->state = RS_IDLE;
1668 s->running_state = 0;
1669 while (s->running_state == 0) {
1670 n = read(s->fd, buf, 256);
1671 if (n > 0) {
1672 int i;
1673
1674 for (i = 0; i < n; i++) {
1675 gdb_read_byte(s, buf[i]);
1676 }
1677 } else if (n == 0 || errno != EAGAIN) {
1678 /* XXX: Connection closed. Should probably wait for another
1679 connection before continuing. */
1680 return sig;
bellard1fddef42005-04-17 19:16:13 +00001681 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001682 }
1683 sig = s->signal;
1684 s->signal = 0;
1685 return sig;
bellard1fddef42005-04-17 19:16:13 +00001686}
bellarde9009672005-04-26 20:42:36 +00001687
aurel32ca587a82008-12-18 22:44:13 +00001688/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001689void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001690{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001691 GDBState *s;
1692 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001693
Andreas Färber5ca666c2013-06-24 19:20:57 +02001694 s = gdbserver_state;
1695 if (gdbserver_fd < 0 || s->fd < 0) {
1696 return;
1697 }
aurel32ca587a82008-12-18 22:44:13 +00001698
Andreas Färber5ca666c2013-06-24 19:20:57 +02001699 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1700 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001701}
bellard1fddef42005-04-17 19:16:13 +00001702
aliguori880a7572008-11-18 20:30:24 +00001703static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001704{
1705 GDBState *s;
1706 struct sockaddr_in sockaddr;
1707 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001708 int fd;
bellard858693c2004-03-31 18:52:07 +00001709
1710 for(;;) {
1711 len = sizeof(sockaddr);
1712 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1713 if (fd < 0 && errno != EINTR) {
1714 perror("accept");
1715 return;
1716 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001717#ifndef _WIN32
1718 fcntl(fd, F_SETFD, FD_CLOEXEC);
1719#endif
bellard858693c2004-03-31 18:52:07 +00001720 break;
1721 }
1722 }
1723
1724 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001725 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00001726
Anthony Liguori7267c092011-08-20 22:09:37 -05001727 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001728 s->c_cpu = first_cpu;
1729 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00001730 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00001731 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00001732
aliguori880a7572008-11-18 20:30:24 +00001733 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00001734
bellard858693c2004-03-31 18:52:07 +00001735 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00001736}
1737
1738static int gdbserver_open(int port)
1739{
1740 struct sockaddr_in sockaddr;
1741 int fd, val, ret;
1742
1743 fd = socket(PF_INET, SOCK_STREAM, 0);
1744 if (fd < 0) {
1745 perror("socket");
1746 return -1;
1747 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001748#ifndef _WIN32
1749 fcntl(fd, F_SETFD, FD_CLOEXEC);
1750#endif
bellard858693c2004-03-31 18:52:07 +00001751
1752 /* allow fast reuse */
1753 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01001754 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00001755
1756 sockaddr.sin_family = AF_INET;
1757 sockaddr.sin_port = htons(port);
1758 sockaddr.sin_addr.s_addr = 0;
1759 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1760 if (ret < 0) {
1761 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001762 close(fd);
bellard858693c2004-03-31 18:52:07 +00001763 return -1;
1764 }
1765 ret = listen(fd, 0);
1766 if (ret < 0) {
1767 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001768 close(fd);
bellard858693c2004-03-31 18:52:07 +00001769 return -1;
1770 }
bellard858693c2004-03-31 18:52:07 +00001771 return fd;
1772}
1773
1774int gdbserver_start(int port)
1775{
1776 gdbserver_fd = gdbserver_open(port);
1777 if (gdbserver_fd < 0)
1778 return -1;
1779 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00001780 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00001781 return 0;
1782}
aurel322b1319c2008-12-18 22:44:04 +00001783
1784/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001785void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00001786{
1787 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00001788 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00001789 return;
1790 close(s->fd);
1791 s->fd = -1;
1792 cpu_breakpoint_remove_all(env, BP_GDB);
1793 cpu_watchpoint_remove_all(env, BP_GDB);
1794}
pbrook4046d912007-01-28 01:53:16 +00001795#else
thsaa1f17c2007-07-11 22:48:58 +00001796static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001797{
pbrook56aebc82008-10-11 17:55:29 +00001798 /* We can handle an arbitrarily large amount of data.
1799 Pick the maximum packet size, which is as good as anything. */
1800 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001801}
1802
thsaa1f17c2007-07-11 22:48:58 +00001803static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001804{
pbrook4046d912007-01-28 01:53:16 +00001805 int i;
1806
1807 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00001808 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00001809 }
1810}
1811
1812static void gdb_chr_event(void *opaque, int event)
1813{
1814 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05301815 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001816 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00001817 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00001818 break;
1819 default:
1820 break;
1821 }
1822}
1823
aliguori8a34a0f2009-03-05 23:01:55 +00001824static void gdb_monitor_output(GDBState *s, const char *msg, int len)
1825{
1826 char buf[MAX_PACKET_LENGTH];
1827
1828 buf[0] = 'O';
1829 if (len > (MAX_PACKET_LENGTH/2) - 1)
1830 len = (MAX_PACKET_LENGTH/2) - 1;
1831 memtohex(buf + 1, (uint8_t *)msg, len);
1832 put_packet(s, buf);
1833}
1834
1835static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
1836{
1837 const char *p = (const char *)buf;
1838 int max_sz;
1839
1840 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
1841 for (;;) {
1842 if (len <= max_sz) {
1843 gdb_monitor_output(gdbserver_state, p, len);
1844 break;
1845 }
1846 gdb_monitor_output(gdbserver_state, p, max_sz);
1847 p += max_sz;
1848 len -= max_sz;
1849 }
1850 return len;
1851}
1852
aliguori59030a82009-04-05 18:43:41 +00001853#ifndef _WIN32
1854static void gdb_sigterm_handler(int signal)
1855{
Luiz Capitulino13548692011-07-29 15:36:43 -03001856 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001857 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001858 }
aliguori59030a82009-04-05 18:43:41 +00001859}
1860#endif
1861
1862int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00001863{
1864 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00001865 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00001866 CharDriverState *chr = NULL;
1867 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00001868
aliguori59030a82009-04-05 18:43:41 +00001869 if (!device)
1870 return -1;
1871 if (strcmp(device, "none") != 0) {
1872 if (strstart(device, "tcp:", NULL)) {
1873 /* enforce required TCP attributes */
1874 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
1875 "%s,nowait,nodelay,server", device);
1876 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00001877 }
aliguori59030a82009-04-05 18:43:41 +00001878#ifndef _WIN32
1879 else if (strcmp(device, "stdio") == 0) {
1880 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00001881
aliguori59030a82009-04-05 18:43:41 +00001882 memset(&act, 0, sizeof(act));
1883 act.sa_handler = gdb_sigterm_handler;
1884 sigaction(SIGINT, &act, NULL);
1885 }
1886#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05001887 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00001888 if (!chr)
1889 return -1;
1890
Hans de Goede456d6062013-03-27 20:29:40 +01001891 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00001892 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
1893 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00001894 }
1895
aliguori36556b22009-03-28 18:05:53 +00001896 s = gdbserver_state;
1897 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05001898 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00001899 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00001900
aliguori36556b22009-03-28 18:05:53 +00001901 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
1902
1903 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05001904 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00001905 mon_chr->chr_write = gdb_monitor_write;
1906 monitor_init(mon_chr, 0);
1907 } else {
1908 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001909 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00001910 mon_chr = s->mon_chr;
1911 memset(s, 0, sizeof(GDBState));
1912 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001913 s->c_cpu = first_cpu;
1914 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00001915 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00001916 s->state = chr ? RS_IDLE : RS_INACTIVE;
1917 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00001918 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00001919
pbrook4046d912007-01-28 01:53:16 +00001920 return 0;
1921}
1922#endif