blob: 51e64bb4cb3f54f89222cd11748e1798990762f6 [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ärberf3840912012-02-20 06:44:56 +0100577static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100578{
Richard Henderson6ee77b12012-08-23 10:44:45 -0700579 uint64_t val;
580 int cc_op;
581
Alexander Grafafcb0e42009-12-05 12:44:29 +0100582 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700583 case S390_PSWM_REGNUM:
584 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
585 val = deposit64(env->psw.mask, 44, 2, cc_op);
586 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700587 case S390_PSWA_REGNUM:
588 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700589 case S390_R0_REGNUM ... S390_R15_REGNUM:
590 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700591 case S390_A0_REGNUM ... S390_A15_REGNUM:
592 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700593 case S390_FPC_REGNUM:
594 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700595 case S390_F0_REGNUM ... S390_F15_REGNUM:
596 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +0100597 }
598
599 return 0;
600}
601
Andreas Färberf3840912012-02-20 06:44:56 +0100602static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100603{
604 target_ulong tmpl;
605 uint32_t tmp32;
606 int r = 8;
607 tmpl = ldtul_p(mem_buf);
608 tmp32 = ldl_p(mem_buf);
609
610 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700611 case S390_PSWM_REGNUM:
612 env->psw.mask = tmpl;
613 env->cc_op = extract64(tmpl, 44, 2);
614 break;
615 case S390_PSWA_REGNUM:
616 env->psw.addr = tmpl;
617 break;
618 case S390_R0_REGNUM ... S390_R15_REGNUM:
619 env->regs[n-S390_R0_REGNUM] = tmpl;
620 break;
621 case S390_A0_REGNUM ... S390_A15_REGNUM:
622 env->aregs[n-S390_A0_REGNUM] = tmp32;
623 r = 4;
624 break;
625 case S390_FPC_REGNUM:
626 env->fpc = tmp32;
627 r = 4;
628 break;
629 case S390_F0_REGNUM ... S390_F15_REGNUM:
630 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
631 break;
632 default:
633 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +0100634 }
Alexander Grafafcb0e42009-12-05 12:44:29 +0100635 return r;
636}
Michael Walle0c45d3d2011-02-17 23:45:06 +0100637#elif defined (TARGET_LM32)
638
Paolo Bonzini0d09e412013-02-05 17:06:20 +0100639#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +0100640
Andreas Färberf3840912012-02-20 06:44:56 +0100641static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100642{
643 if (n < 32) {
644 GET_REG32(env->regs[n]);
645 } else {
646 switch (n) {
647 case 32:
648 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100649 /* FIXME: put in right exception ID */
650 case 33:
651 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100652 case 34:
653 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100654 case 35:
655 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100656 case 36:
657 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100658 case 37:
659 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100660 case 38:
661 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100662 }
663 }
664 return 0;
665}
666
Andreas Färberf3840912012-02-20 06:44:56 +0100667static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100668{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200669 LM32CPU *cpu = lm32_env_get_cpu(env);
670 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100671 uint32_t tmp;
672
Andreas Färbera0e372f2013-06-28 23:18:47 +0200673 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +0100674 return 0;
675 }
676
677 tmp = ldl_p(mem_buf);
678
679 if (n < 32) {
680 env->regs[n] = tmp;
681 } else {
682 switch (n) {
683 case 32:
684 env->pc = tmp;
685 break;
686 case 34:
687 env->eba = tmp;
688 break;
689 case 35:
690 env->deba = tmp;
691 break;
692 case 36:
693 env->ie = tmp;
694 break;
695 case 37:
696 lm32_pic_set_im(env->pic_state, tmp);
697 break;
698 case 38:
699 lm32_pic_set_ip(env->pic_state, tmp);
700 break;
701 }
702 }
703 return 4;
704}
Max Filippovccfcaba2011-09-06 03:55:52 +0400705#elif defined(TARGET_XTENSA)
706
Andreas Färberf3840912012-02-20 06:44:56 +0100707static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400708{
709 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
710
711 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
712 return 0;
713 }
714
715 switch (reg->type) {
716 case 9: /*pc*/
717 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +0400718
719 case 1: /*ar*/
720 xtensa_sync_phys_from_window(env);
721 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400722
723 case 2: /*SR*/
724 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400725
726 case 3: /*UR*/
727 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400728
Max Filippovdd519cb2012-09-19 04:23:54 +0400729 case 4: /*f*/
730 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +0400731
Max Filippovccfcaba2011-09-06 03:55:52 +0400732 case 8: /*a*/
733 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400734
735 default:
736 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200737 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400738 return 0;
739 }
740}
741
Andreas Färberf3840912012-02-20 06:44:56 +0100742static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400743{
744 uint32_t tmp;
745 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
746
747 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
748 return 0;
749 }
750
751 tmp = ldl_p(mem_buf);
752
753 switch (reg->type) {
754 case 9: /*pc*/
755 env->pc = tmp;
756 break;
757
758 case 1: /*ar*/
759 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
760 xtensa_sync_window_from_phys(env);
761 break;
762
763 case 2: /*SR*/
764 env->sregs[reg->targno & 0xff] = tmp;
765 break;
766
767 case 3: /*UR*/
768 env->uregs[reg->targno & 0xff] = tmp;
769 break;
770
Max Filippovdd519cb2012-09-19 04:23:54 +0400771 case 4: /*f*/
772 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
773 break;
774
Max Filippovccfcaba2011-09-06 03:55:52 +0400775 case 8: /*a*/
776 env->regs[reg->targno & 0x0f] = tmp;
777 break;
778
779 default:
780 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200781 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400782 return 0;
783 }
784
785 return 4;
786}
bellard1fddef42005-04-17 19:16:13 +0000787#else
pbrook56aebc82008-10-11 17:55:29 +0000788
Andreas Färber9349b4f2012-03-14 01:38:32 +0100789static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000790{
791 return 0;
792}
793
Andreas Färber9349b4f2012-03-14 01:38:32 +0100794static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000795{
pbrook56aebc82008-10-11 17:55:29 +0000796 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000797}
798
799#endif
bellardb4608c02003-06-27 17:34:32 +0000800
pbrook56aebc82008-10-11 17:55:29 +0000801#ifdef GDB_CORE_XML
802/* Encode data using the encoding for 'x' packets. */
803static int memtox(char *buf, const char *mem, int len)
804{
805 char *p = buf;
806 char c;
807
808 while (len--) {
809 c = *(mem++);
810 switch (c) {
811 case '#': case '$': case '*': case '}':
812 *(p++) = '}';
813 *(p++) = c ^ 0x20;
814 break;
815 default:
816 *(p++) = c;
817 break;
818 }
819 }
820 return p - buf;
821}
822
aurel323faf7782008-12-07 23:26:17 +0000823static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +0000824{
pbrook56aebc82008-10-11 17:55:29 +0000825 size_t len;
826 int i;
827 const char *name;
828 static char target_xml[1024];
829
830 len = 0;
831 while (p[len] && p[len] != ':')
832 len++;
833 *newp = p + len;
834
835 name = NULL;
836 if (strncmp(p, "target.xml", len) == 0) {
837 /* Generate the XML description for this CPU. */
838 if (!target_xml[0]) {
839 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +0200840 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +0000841
blueswir15b3715b2008-10-25 11:18:12 +0000842 snprintf(target_xml, sizeof(target_xml),
843 "<?xml version=\"1.0\"?>"
844 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
845 "<target>"
846 "<xi:include href=\"%s\"/>",
847 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +0000848
Andreas Färbereac8b352013-06-28 21:11:37 +0200849 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000850 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
851 pstrcat(target_xml, sizeof(target_xml), r->xml);
852 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000853 }
blueswir12dc766d2009-04-13 16:06:19 +0000854 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000855 }
856 return target_xml;
857 }
858 for (i = 0; ; i++) {
859 name = xml_builtin[i][0];
860 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
861 break;
862 }
863 return name ? xml_builtin[i][1] : NULL;
864}
865#endif
866
Andreas Färber385b9f02013-06-27 18:25:36 +0200867static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000868{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200869 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200870 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000871 GDBRegisterState *r;
872
Andreas Färbera0e372f2013-06-28 23:18:47 +0200873 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +0000874 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200875 }
pbrook56aebc82008-10-11 17:55:29 +0000876
Andreas Färbereac8b352013-06-28 21:11:37 +0200877 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000878 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
879 return r->get_reg(env, mem_buf, reg - r->base_reg);
880 }
881 }
882 return 0;
883}
884
Andreas Färber385b9f02013-06-27 18:25:36 +0200885static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000886{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200887 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200888 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000889 GDBRegisterState *r;
890
Andreas Färbera0e372f2013-06-28 23:18:47 +0200891 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +0000892 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200893 }
pbrook56aebc82008-10-11 17:55:29 +0000894
Andreas Färbereac8b352013-06-28 21:11:37 +0200895 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000896 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
897 return r->set_reg(env, mem_buf, reg - r->base_reg);
898 }
899 }
900 return 0;
901}
902
903/* Register a supplemental set of CPU registers. If g_pos is nonzero it
904 specifies the first register number and these registers are included in
905 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
906 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
907 */
908
Andreas Färber22169d42013-06-28 21:27:39 +0200909void gdb_register_coprocessor(CPUState *cpu,
910 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
911 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000912{
913 GDBRegisterState *s;
914 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000915
Andreas Färbereac8b352013-06-28 21:11:37 +0200916 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000917 while (*p) {
918 /* Check for duplicates. */
919 if (strcmp((*p)->xml, xml) == 0)
920 return;
921 p = &(*p)->next;
922 }
Stefan Weil9643c252011-10-18 22:25:38 +0200923
924 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200925 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200926 s->num_regs = num_regs;
927 s->get_reg = get_reg;
928 s->set_reg = set_reg;
929 s->xml = xml;
930
pbrook56aebc82008-10-11 17:55:29 +0000931 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200932 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000933 *p = s;
934 if (g_pos) {
935 if (g_pos != s->base_reg) {
936 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
937 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +0000938 }
939 }
940}
941
aliguoria1d1bb32008-11-18 20:07:32 +0000942#ifndef CONFIG_USER_ONLY
943static const int xlat_gdb_type[] = {
944 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
945 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
946 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
947};
948#endif
949
aliguori880a7572008-11-18 20:30:24 +0000950static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000951{
Andreas Färber182735e2013-05-29 22:29:20 +0200952 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +0100953 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +0000954 int err = 0;
955
Andreas Färber62278812013-06-27 17:12:06 +0200956 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200957 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200958 }
aliguorie22a25c2009-03-12 20:12:48 +0000959
aliguoria1d1bb32008-11-18 20:07:32 +0000960 switch (type) {
961 case GDB_BREAKPOINT_SW:
962 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +0200963 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
964 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000965 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
966 if (err)
967 break;
968 }
969 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000970#ifndef CONFIG_USER_ONLY
971 case GDB_WATCHPOINT_WRITE:
972 case GDB_WATCHPOINT_READ:
973 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +0200974 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
975 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +0000976 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
977 NULL);
978 if (err)
979 break;
980 }
981 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000982#endif
983 default:
984 return -ENOSYS;
985 }
986}
987
aliguori880a7572008-11-18 20:30:24 +0000988static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000989{
Andreas Färber182735e2013-05-29 22:29:20 +0200990 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +0100991 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +0000992 int err = 0;
993
Andreas Färber62278812013-06-27 17:12:06 +0200994 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200995 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200996 }
aliguorie22a25c2009-03-12 20:12:48 +0000997
aliguoria1d1bb32008-11-18 20:07:32 +0000998 switch (type) {
999 case GDB_BREAKPOINT_SW:
1000 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001001 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1002 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001003 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1004 if (err)
1005 break;
1006 }
1007 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001008#ifndef CONFIG_USER_ONLY
1009 case GDB_WATCHPOINT_WRITE:
1010 case GDB_WATCHPOINT_READ:
1011 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001012 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1013 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001014 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1015 if (err)
1016 break;
1017 }
1018 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001019#endif
1020 default:
1021 return -ENOSYS;
1022 }
1023}
1024
aliguori880a7572008-11-18 20:30:24 +00001025static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001026{
Andreas Färber182735e2013-05-29 22:29:20 +02001027 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001028 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001029
aliguorie22a25c2009-03-12 20:12:48 +00001030 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001031 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001032 return;
1033 }
1034
Andreas Färber182735e2013-05-29 22:29:20 +02001035 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1036 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001037 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001038#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001039 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001040#endif
aliguori880a7572008-11-18 20:30:24 +00001041 }
aliguoria1d1bb32008-11-18 20:07:32 +00001042}
1043
aurel32fab9d282009-04-08 21:29:37 +00001044static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1045{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001046 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001047 CPUClass *cc = CPU_GET_CLASS(cpu);
1048
1049 cpu_synchronize_state(cpu);
1050 if (cc->set_pc) {
1051 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001052 }
aurel32fab9d282009-04-08 21:29:37 +00001053}
1054
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001055static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001056{
Andreas Färber0d342822012-12-17 07:12:13 +01001057 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001058
Andreas Färber182735e2013-05-29 22:29:20 +02001059 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001060 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001061 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001062 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001063 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001064
1065 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001066}
1067
aliguori880a7572008-11-18 20:30:24 +00001068static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001069{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001070 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001071 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001072 uint32_t thread;
1073 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001074 char buf[MAX_PACKET_LENGTH];
1075 uint8_t mem_buf[MAX_PACKET_LENGTH];
1076 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001077 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001078
bellard858693c2004-03-31 18:52:07 +00001079#ifdef DEBUG_GDB
1080 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001081#endif
bellard858693c2004-03-31 18:52:07 +00001082 p = line_buf;
1083 ch = *p++;
1084 switch(ch) {
1085 case '?':
bellard1fddef42005-04-17 19:16:13 +00001086 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001087 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001088 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001089 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001090 /* Remove all the breakpoints when this query is issued,
1091 * because gdb is doing and initial connect and the state
1092 * should be cleaned up.
1093 */
aliguori880a7572008-11-18 20:30:24 +00001094 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001095 break;
1096 case 'c':
1097 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001098 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001099 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001100 }
aurel32ca587a82008-12-18 22:44:13 +00001101 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001102 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001103 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001104 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001105 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1106 if (s->signal == -1)
1107 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001108 gdb_continue(s);
1109 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001110 case 'v':
1111 if (strncmp(p, "Cont", 4) == 0) {
1112 int res_signal, res_thread;
1113
1114 p += 4;
1115 if (*p == '?') {
1116 put_packet(s, "vCont;c;C;s;S");
1117 break;
1118 }
1119 res = 0;
1120 res_signal = 0;
1121 res_thread = 0;
1122 while (*p) {
1123 int action, signal;
1124
1125 if (*p++ != ';') {
1126 res = 0;
1127 break;
1128 }
1129 action = *p++;
1130 signal = 0;
1131 if (action == 'C' || action == 'S') {
1132 signal = strtoul(p, (char **)&p, 16);
1133 } else if (action != 'c' && action != 's') {
1134 res = 0;
1135 break;
1136 }
1137 thread = 0;
1138 if (*p == ':') {
1139 thread = strtoull(p+1, (char **)&p, 16);
1140 }
1141 action = tolower(action);
1142 if (res == 0 || (res == 'c' && action == 's')) {
1143 res = action;
1144 res_signal = signal;
1145 res_thread = thread;
1146 }
1147 }
1148 if (res) {
1149 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001150 cpu = find_cpu(res_thread);
1151 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001152 put_packet(s, "E22");
1153 break;
1154 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001155 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001156 }
1157 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001158 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001159 }
1160 s->signal = res_signal;
1161 gdb_continue(s);
1162 return RS_IDLE;
1163 }
1164 break;
1165 } else {
1166 goto unknown_command;
1167 }
edgar_igl7d03f822008-05-17 18:58:29 +00001168 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001169#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001170 /* Kill the target */
1171 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1172 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001173#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001174 case 'D':
1175 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001176 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001177 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001178 gdb_continue(s);
1179 put_packet(s, "OK");
1180 break;
bellard858693c2004-03-31 18:52:07 +00001181 case 's':
1182 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001183 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001184 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001185 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001186 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001187 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001188 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001189 case 'F':
1190 {
1191 target_ulong ret;
1192 target_ulong err;
1193
1194 ret = strtoull(p, (char **)&p, 16);
1195 if (*p == ',') {
1196 p++;
1197 err = strtoull(p, (char **)&p, 16);
1198 } else {
1199 err = 0;
1200 }
1201 if (*p == ',')
1202 p++;
1203 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001204 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001205 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001206 s->current_syscall_cb = NULL;
1207 }
pbrooka2d1eba2007-01-28 03:10:55 +00001208 if (type == 'C') {
1209 put_packet(s, "T02");
1210 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001211 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001212 }
1213 }
1214 break;
bellard858693c2004-03-31 18:52:07 +00001215 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001216 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001217 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001218 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001219 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001220 len += reg_size;
1221 }
1222 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001223 put_packet(s, buf);
1224 break;
1225 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001226 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001227 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001228 len = strlen(p) / 2;
1229 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001230 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001231 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001232 len -= reg_size;
1233 registers += reg_size;
1234 }
bellard858693c2004-03-31 18:52:07 +00001235 put_packet(s, "OK");
1236 break;
1237 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001238 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001239 if (*p == ',')
1240 p++;
bellard9d9754a2006-06-25 15:32:37 +00001241 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001242 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001243 put_packet (s, "E14");
1244 } else {
1245 memtohex(buf, mem_buf, len);
1246 put_packet(s, buf);
1247 }
bellard858693c2004-03-31 18:52:07 +00001248 break;
1249 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001250 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001251 if (*p == ',')
1252 p++;
bellard9d9754a2006-06-25 15:32:37 +00001253 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001254 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001255 p++;
1256 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001257 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001258 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001259 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001260 } else {
bellard858693c2004-03-31 18:52:07 +00001261 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001262 }
bellard858693c2004-03-31 18:52:07 +00001263 break;
pbrook56aebc82008-10-11 17:55:29 +00001264 case 'p':
1265 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1266 This works, but can be very slow. Anything new enough to
1267 understand XML also knows how to use this properly. */
1268 if (!gdb_has_xml)
1269 goto unknown_command;
1270 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001271 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001272 if (reg_size) {
1273 memtohex(buf, mem_buf, reg_size);
1274 put_packet(s, buf);
1275 } else {
1276 put_packet(s, "E14");
1277 }
1278 break;
1279 case 'P':
1280 if (!gdb_has_xml)
1281 goto unknown_command;
1282 addr = strtoull(p, (char **)&p, 16);
1283 if (*p == '=')
1284 p++;
1285 reg_size = strlen(p) / 2;
1286 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001287 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001288 put_packet(s, "OK");
1289 break;
bellard858693c2004-03-31 18:52:07 +00001290 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001291 case 'z':
1292 type = strtoul(p, (char **)&p, 16);
1293 if (*p == ',')
1294 p++;
bellard9d9754a2006-06-25 15:32:37 +00001295 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001296 if (*p == ',')
1297 p++;
bellard9d9754a2006-06-25 15:32:37 +00001298 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001299 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001300 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001301 else
aliguori880a7572008-11-18 20:30:24 +00001302 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001303 if (res >= 0)
1304 put_packet(s, "OK");
1305 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001306 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001307 else
1308 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001309 break;
aliguori880a7572008-11-18 20:30:24 +00001310 case 'H':
1311 type = *p++;
1312 thread = strtoull(p, (char **)&p, 16);
1313 if (thread == -1 || thread == 0) {
1314 put_packet(s, "OK");
1315 break;
1316 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001317 cpu = find_cpu(thread);
1318 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001319 put_packet(s, "E22");
1320 break;
1321 }
1322 switch (type) {
1323 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001324 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001325 put_packet(s, "OK");
1326 break;
1327 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001328 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001329 put_packet(s, "OK");
1330 break;
1331 default:
1332 put_packet(s, "E22");
1333 break;
1334 }
1335 break;
1336 case 'T':
1337 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001338 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001339
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001340 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001341 put_packet(s, "OK");
1342 } else {
aliguori880a7572008-11-18 20:30:24 +00001343 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001344 }
aliguori880a7572008-11-18 20:30:24 +00001345 break;
pbrook978efd62006-06-17 18:30:42 +00001346 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001347 case 'Q':
1348 /* parse any 'q' packets here */
1349 if (!strcmp(p,"qemu.sstepbits")) {
1350 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001351 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1352 SSTEP_ENABLE,
1353 SSTEP_NOIRQ,
1354 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001355 put_packet(s, buf);
1356 break;
1357 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1358 /* Display or change the sstep_flags */
1359 p += 10;
1360 if (*p != '=') {
1361 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001362 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001363 put_packet(s, buf);
1364 break;
1365 }
1366 p++;
1367 type = strtoul(p, (char **)&p, 16);
1368 sstep_flags = type;
1369 put_packet(s, "OK");
1370 break;
aliguori880a7572008-11-18 20:30:24 +00001371 } else if (strcmp(p,"C") == 0) {
1372 /* "Current thread" remains vague in the spec, so always return
1373 * the first CPU (gdb returns the first thread). */
1374 put_packet(s, "QC1");
1375 break;
1376 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001377 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001378 goto report_cpuinfo;
1379 } else if (strcmp(p,"sThreadInfo") == 0) {
1380 report_cpuinfo:
1381 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001382 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001383 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001384 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001385 } else
1386 put_packet(s, "l");
1387 break;
1388 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1389 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001390 cpu = find_cpu(thread);
1391 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001392 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001393 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001394 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001395 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001396 memtohex(buf, mem_buf, len);
1397 put_packet(s, buf);
1398 }
aliguori880a7572008-11-18 20:30:24 +00001399 break;
edgar_igl60897d32008-05-09 08:25:14 +00001400 }
blueswir10b8a9882009-03-07 10:51:36 +00001401#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001402 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001403 CPUArchState *env = s->c_cpu->env_ptr;
1404 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001405
blueswir1363a37d2008-08-21 17:58:08 +00001406 snprintf(buf, sizeof(buf),
1407 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1408 ";Bss=" TARGET_ABI_FMT_lx,
1409 ts->info->code_offset,
1410 ts->info->data_offset,
1411 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001412 put_packet(s, buf);
1413 break;
1414 }
blueswir10b8a9882009-03-07 10:51:36 +00001415#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001416 else if (strncmp(p, "Rcmd,", 5) == 0) {
1417 int len = strlen(p + 5);
1418
1419 if ((len % 2) != 0) {
1420 put_packet(s, "E01");
1421 break;
1422 }
1423 hextomem(mem_buf, p + 5, len);
1424 len = len / 2;
1425 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001426 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001427 put_packet(s, "OK");
1428 break;
1429 }
blueswir10b8a9882009-03-07 10:51:36 +00001430#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001431 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001432 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001433#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001434 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001435#endif
1436 put_packet(s, buf);
1437 break;
1438 }
1439#ifdef GDB_CORE_XML
1440 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1441 const char *xml;
1442 target_ulong total_len;
1443
1444 gdb_has_xml = 1;
1445 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001446 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001447 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001448 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001449 put_packet(s, buf);
1450 break;
1451 }
1452
1453 if (*p == ':')
1454 p++;
1455 addr = strtoul(p, (char **)&p, 16);
1456 if (*p == ',')
1457 p++;
1458 len = strtoul(p, (char **)&p, 16);
1459
1460 total_len = strlen(xml);
1461 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001462 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001463 put_packet(s, buf);
1464 break;
1465 }
1466 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1467 len = (MAX_PACKET_LENGTH - 5) / 2;
1468 if (len < total_len - addr) {
1469 buf[0] = 'm';
1470 len = memtox(buf + 1, xml + addr, len);
1471 } else {
1472 buf[0] = 'l';
1473 len = memtox(buf + 1, xml + addr, total_len - addr);
1474 }
1475 put_packet_binary(s, buf, len + 1);
1476 break;
1477 }
1478#endif
1479 /* Unrecognised 'q' command. */
1480 goto unknown_command;
1481
bellard858693c2004-03-31 18:52:07 +00001482 default:
pbrook56aebc82008-10-11 17:55:29 +00001483 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001484 /* put empty packet */
1485 buf[0] = '\0';
1486 put_packet(s, buf);
1487 break;
1488 }
1489 return RS_IDLE;
1490}
1491
Andreas Färber64f6b342013-05-27 02:06:09 +02001492void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001493{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001494 gdbserver_state->c_cpu = cpu;
1495 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001496}
1497
bellard1fddef42005-04-17 19:16:13 +00001498#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001499static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001500{
aliguori880a7572008-11-18 20:30:24 +00001501 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001502 CPUArchState *env = s->c_cpu->env_ptr;
1503 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001504 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001505 const char *type;
bellard858693c2004-03-31 18:52:07 +00001506 int ret;
1507
Meador Ingecdb432b2012-03-15 17:49:45 +00001508 if (running || s->state == RS_INACTIVE) {
1509 return;
1510 }
1511 /* Is there a GDB syscall waiting to be sent? */
1512 if (s->current_syscall_cb) {
1513 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001514 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001515 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001516 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001517 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00001518 if (env->watchpoint_hit) {
1519 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001520 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001521 type = "r";
1522 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001523 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001524 type = "a";
1525 break;
1526 default:
1527 type = "";
1528 break;
1529 }
aliguori880a7572008-11-18 20:30:24 +00001530 snprintf(buf, sizeof(buf),
1531 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001532 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00001533 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001534 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001535 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001536 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001537 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001538 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001539 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001540 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001541 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001542 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001543 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001544 ret = GDB_SIGNAL_QUIT;
1545 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001546 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001547 ret = GDB_SIGNAL_IO;
1548 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001549 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001550 ret = GDB_SIGNAL_ALRM;
1551 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001552 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001553 ret = GDB_SIGNAL_ABRT;
1554 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001555 case RUN_STATE_SAVE_VM:
1556 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001557 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001558 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001559 ret = GDB_SIGNAL_XCPU;
1560 break;
1561 default:
1562 ret = GDB_SIGNAL_UNKNOWN;
1563 break;
bellardbbeb7b52006-04-23 18:42:15 +00001564 }
Andreas Färber0d342822012-12-17 07:12:13 +01001565 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001566
1567send_packet:
bellard858693c2004-03-31 18:52:07 +00001568 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001569
1570 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001571 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001572}
bellard1fddef42005-04-17 19:16:13 +00001573#endif
bellard858693c2004-03-31 18:52:07 +00001574
pbrooka2d1eba2007-01-28 03:10:55 +00001575/* Send a gdb syscall request.
1576 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001577 %x - target_ulong argument printed in hex.
1578 %lx - 64-bit argument printed in hex.
1579 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001580void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001581{
1582 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001583 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001584 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001585 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001586 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001587 GDBState *s;
1588
aliguori880a7572008-11-18 20:30:24 +00001589 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001590 if (!s)
1591 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001592 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001593#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001594 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001595#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001596 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001597 p = s->syscall_buf;
1598 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001599 *(p++) = 'F';
1600 while (*fmt) {
1601 if (*fmt == '%') {
1602 fmt++;
1603 switch (*fmt++) {
1604 case 'x':
1605 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001606 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001607 break;
pbrooka87295e2007-05-26 15:09:38 +00001608 case 'l':
1609 if (*(fmt++) != 'x')
1610 goto bad_format;
1611 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001612 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001613 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001614 case 's':
1615 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001616 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001617 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001618 break;
1619 default:
pbrooka87295e2007-05-26 15:09:38 +00001620 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001621 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1622 fmt - 1);
1623 break;
1624 }
1625 } else {
1626 *(p++) = *(fmt++);
1627 }
1628 }
pbrook8a93e022007-08-06 13:19:15 +00001629 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001630 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001631#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001632 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001633 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001634#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001635 /* In this case wait to send the syscall packet until notification that
1636 the CPU has stopped. This must be done because if the packet is sent
1637 now the reply from the syscall request could be received while the CPU
1638 is still in the running state, which can cause packets to be dropped
1639 and state transition 'T' packets to be sent while the syscall is still
1640 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001641 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001642#endif
1643}
1644
bellard6a00d602005-11-21 23:25:50 +00001645static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001646{
1647 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001648 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001649
bellard1fddef42005-04-17 19:16:13 +00001650#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001651 if (s->last_packet_len) {
1652 /* Waiting for a response to the last packet. If we see the start
1653 of a new command then abandon the previous response. */
1654 if (ch == '-') {
1655#ifdef DEBUG_GDB
1656 printf("Got NACK, retransmitting\n");
1657#endif
thsffe8ab82007-12-16 03:16:05 +00001658 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001659 }
1660#ifdef DEBUG_GDB
1661 else if (ch == '+')
1662 printf("Got ACK\n");
1663 else
1664 printf("Got '%c' when expecting ACK/NACK\n", ch);
1665#endif
1666 if (ch == '+' || ch == '$')
1667 s->last_packet_len = 0;
1668 if (ch != '$')
1669 return;
1670 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001671 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001672 /* when the CPU is running, we cannot do anything except stop
1673 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001674 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001675 } else
bellard1fddef42005-04-17 19:16:13 +00001676#endif
bellard41625032005-04-24 10:07:11 +00001677 {
bellard858693c2004-03-31 18:52:07 +00001678 switch(s->state) {
1679 case RS_IDLE:
1680 if (ch == '$') {
1681 s->line_buf_index = 0;
1682 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001683 }
1684 break;
bellard858693c2004-03-31 18:52:07 +00001685 case RS_GETLINE:
1686 if (ch == '#') {
1687 s->state = RS_CHKSUM1;
1688 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1689 s->state = RS_IDLE;
1690 } else {
1691 s->line_buf[s->line_buf_index++] = ch;
1692 }
1693 break;
1694 case RS_CHKSUM1:
1695 s->line_buf[s->line_buf_index] = '\0';
1696 s->line_csum = fromhex(ch) << 4;
1697 s->state = RS_CHKSUM2;
1698 break;
1699 case RS_CHKSUM2:
1700 s->line_csum |= fromhex(ch);
1701 csum = 0;
1702 for(i = 0; i < s->line_buf_index; i++) {
1703 csum += s->line_buf[i];
1704 }
1705 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001706 reply = '-';
1707 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001708 s->state = RS_IDLE;
1709 } else {
ths60fe76f2007-12-16 03:02:09 +00001710 reply = '+';
1711 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001712 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001713 }
bellardb4608c02003-06-27 17:34:32 +00001714 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001715 default:
1716 abort();
bellardb4608c02003-06-27 17:34:32 +00001717 }
1718 }
bellard858693c2004-03-31 18:52:07 +00001719}
1720
Paul Brook0e1c9c52010-06-16 13:03:51 +01001721/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001722void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001723{
1724 GDBState *s;
1725 char buf[4];
1726
1727 s = gdbserver_state;
1728 if (!s) {
1729 return;
1730 }
1731#ifdef CONFIG_USER_ONLY
1732 if (gdbserver_fd < 0 || s->fd < 0) {
1733 return;
1734 }
1735#endif
1736
1737 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1738 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001739
1740#ifndef CONFIG_USER_ONLY
1741 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001742 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001743 }
1744#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001745}
1746
bellard1fddef42005-04-17 19:16:13 +00001747#ifdef CONFIG_USER_ONLY
1748int
aurel32ca587a82008-12-18 22:44:13 +00001749gdb_queuesig (void)
1750{
1751 GDBState *s;
1752
1753 s = gdbserver_state;
1754
1755 if (gdbserver_fd < 0 || s->fd < 0)
1756 return 0;
1757 else
1758 return 1;
1759}
1760
1761int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001762gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001763{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001764 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001765 GDBState *s;
1766 char buf[256];
1767 int n;
bellard1fddef42005-04-17 19:16:13 +00001768
Andreas Färber5ca666c2013-06-24 19:20:57 +02001769 s = gdbserver_state;
1770 if (gdbserver_fd < 0 || s->fd < 0) {
1771 return sig;
bellard1fddef42005-04-17 19:16:13 +00001772 }
1773
Andreas Färber5ca666c2013-06-24 19:20:57 +02001774 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001775 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02001776 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00001777
Andreas Färber5ca666c2013-06-24 19:20:57 +02001778 if (sig != 0) {
1779 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1780 put_packet(s, buf);
1781 }
1782 /* put_packet() might have detected that the peer terminated the
1783 connection. */
1784 if (s->fd < 0) {
1785 return sig;
1786 }
1787
1788 sig = 0;
1789 s->state = RS_IDLE;
1790 s->running_state = 0;
1791 while (s->running_state == 0) {
1792 n = read(s->fd, buf, 256);
1793 if (n > 0) {
1794 int i;
1795
1796 for (i = 0; i < n; i++) {
1797 gdb_read_byte(s, buf[i]);
1798 }
1799 } else if (n == 0 || errno != EAGAIN) {
1800 /* XXX: Connection closed. Should probably wait for another
1801 connection before continuing. */
1802 return sig;
bellard1fddef42005-04-17 19:16:13 +00001803 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001804 }
1805 sig = s->signal;
1806 s->signal = 0;
1807 return sig;
bellard1fddef42005-04-17 19:16:13 +00001808}
bellarde9009672005-04-26 20:42:36 +00001809
aurel32ca587a82008-12-18 22:44:13 +00001810/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001811void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001812{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001813 GDBState *s;
1814 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001815
Andreas Färber5ca666c2013-06-24 19:20:57 +02001816 s = gdbserver_state;
1817 if (gdbserver_fd < 0 || s->fd < 0) {
1818 return;
1819 }
aurel32ca587a82008-12-18 22:44:13 +00001820
Andreas Färber5ca666c2013-06-24 19:20:57 +02001821 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1822 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001823}
bellard1fddef42005-04-17 19:16:13 +00001824
aliguori880a7572008-11-18 20:30:24 +00001825static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001826{
1827 GDBState *s;
1828 struct sockaddr_in sockaddr;
1829 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001830 int fd;
bellard858693c2004-03-31 18:52:07 +00001831
1832 for(;;) {
1833 len = sizeof(sockaddr);
1834 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1835 if (fd < 0 && errno != EINTR) {
1836 perror("accept");
1837 return;
1838 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001839#ifndef _WIN32
1840 fcntl(fd, F_SETFD, FD_CLOEXEC);
1841#endif
bellard858693c2004-03-31 18:52:07 +00001842 break;
1843 }
1844 }
1845
1846 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001847 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00001848
Anthony Liguori7267c092011-08-20 22:09:37 -05001849 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001850 s->c_cpu = first_cpu;
1851 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00001852 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00001853 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00001854
aliguori880a7572008-11-18 20:30:24 +00001855 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00001856
bellard858693c2004-03-31 18:52:07 +00001857 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00001858}
1859
1860static int gdbserver_open(int port)
1861{
1862 struct sockaddr_in sockaddr;
1863 int fd, val, ret;
1864
1865 fd = socket(PF_INET, SOCK_STREAM, 0);
1866 if (fd < 0) {
1867 perror("socket");
1868 return -1;
1869 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001870#ifndef _WIN32
1871 fcntl(fd, F_SETFD, FD_CLOEXEC);
1872#endif
bellard858693c2004-03-31 18:52:07 +00001873
1874 /* allow fast reuse */
1875 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01001876 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00001877
1878 sockaddr.sin_family = AF_INET;
1879 sockaddr.sin_port = htons(port);
1880 sockaddr.sin_addr.s_addr = 0;
1881 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1882 if (ret < 0) {
1883 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001884 close(fd);
bellard858693c2004-03-31 18:52:07 +00001885 return -1;
1886 }
1887 ret = listen(fd, 0);
1888 if (ret < 0) {
1889 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001890 close(fd);
bellard858693c2004-03-31 18:52:07 +00001891 return -1;
1892 }
bellard858693c2004-03-31 18:52:07 +00001893 return fd;
1894}
1895
1896int gdbserver_start(int port)
1897{
1898 gdbserver_fd = gdbserver_open(port);
1899 if (gdbserver_fd < 0)
1900 return -1;
1901 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00001902 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00001903 return 0;
1904}
aurel322b1319c2008-12-18 22:44:04 +00001905
1906/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001907void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00001908{
1909 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00001910 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00001911 return;
1912 close(s->fd);
1913 s->fd = -1;
1914 cpu_breakpoint_remove_all(env, BP_GDB);
1915 cpu_watchpoint_remove_all(env, BP_GDB);
1916}
pbrook4046d912007-01-28 01:53:16 +00001917#else
thsaa1f17c2007-07-11 22:48:58 +00001918static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001919{
pbrook56aebc82008-10-11 17:55:29 +00001920 /* We can handle an arbitrarily large amount of data.
1921 Pick the maximum packet size, which is as good as anything. */
1922 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001923}
1924
thsaa1f17c2007-07-11 22:48:58 +00001925static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001926{
pbrook4046d912007-01-28 01:53:16 +00001927 int i;
1928
1929 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00001930 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00001931 }
1932}
1933
1934static void gdb_chr_event(void *opaque, int event)
1935{
1936 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05301937 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001938 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00001939 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00001940 break;
1941 default:
1942 break;
1943 }
1944}
1945
aliguori8a34a0f2009-03-05 23:01:55 +00001946static void gdb_monitor_output(GDBState *s, const char *msg, int len)
1947{
1948 char buf[MAX_PACKET_LENGTH];
1949
1950 buf[0] = 'O';
1951 if (len > (MAX_PACKET_LENGTH/2) - 1)
1952 len = (MAX_PACKET_LENGTH/2) - 1;
1953 memtohex(buf + 1, (uint8_t *)msg, len);
1954 put_packet(s, buf);
1955}
1956
1957static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
1958{
1959 const char *p = (const char *)buf;
1960 int max_sz;
1961
1962 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
1963 for (;;) {
1964 if (len <= max_sz) {
1965 gdb_monitor_output(gdbserver_state, p, len);
1966 break;
1967 }
1968 gdb_monitor_output(gdbserver_state, p, max_sz);
1969 p += max_sz;
1970 len -= max_sz;
1971 }
1972 return len;
1973}
1974
aliguori59030a82009-04-05 18:43:41 +00001975#ifndef _WIN32
1976static void gdb_sigterm_handler(int signal)
1977{
Luiz Capitulino13548692011-07-29 15:36:43 -03001978 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001979 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001980 }
aliguori59030a82009-04-05 18:43:41 +00001981}
1982#endif
1983
1984int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00001985{
1986 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00001987 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00001988 CharDriverState *chr = NULL;
1989 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00001990
aliguori59030a82009-04-05 18:43:41 +00001991 if (!device)
1992 return -1;
1993 if (strcmp(device, "none") != 0) {
1994 if (strstart(device, "tcp:", NULL)) {
1995 /* enforce required TCP attributes */
1996 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
1997 "%s,nowait,nodelay,server", device);
1998 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00001999 }
aliguori59030a82009-04-05 18:43:41 +00002000#ifndef _WIN32
2001 else if (strcmp(device, "stdio") == 0) {
2002 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002003
aliguori59030a82009-04-05 18:43:41 +00002004 memset(&act, 0, sizeof(act));
2005 act.sa_handler = gdb_sigterm_handler;
2006 sigaction(SIGINT, &act, NULL);
2007 }
2008#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002009 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002010 if (!chr)
2011 return -1;
2012
Hans de Goede456d6062013-03-27 20:29:40 +01002013 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002014 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2015 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002016 }
2017
aliguori36556b22009-03-28 18:05:53 +00002018 s = gdbserver_state;
2019 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002020 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002021 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002022
aliguori36556b22009-03-28 18:05:53 +00002023 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2024
2025 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002026 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002027 mon_chr->chr_write = gdb_monitor_write;
2028 monitor_init(mon_chr, 0);
2029 } else {
2030 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002031 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002032 mon_chr = s->mon_chr;
2033 memset(s, 0, sizeof(GDBState));
2034 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002035 s->c_cpu = first_cpu;
2036 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002037 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002038 s->state = chr ? RS_IDLE : RS_INACTIVE;
2039 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002040 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002041
pbrook4046d912007-01-28 01:53:16 +00002042 return 0;
2043}
2044#endif