blob: 61b1bc7e81b6188f7f56852b0480a1661b634c3c [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ärberf3840912012-02-20 06:44:56 +0100565static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200566{
567 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200568 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200569 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200570 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200571 }
572 return 0;
573}
574
Andreas Färberf3840912012-02-20 06:44:56 +0100575static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200576{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200577 MicroBlazeCPU *cpu = mb_env_get_cpu(env);
578 CPUClass *cc = CPU_GET_CLASS(cpu);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200579 uint32_t tmp;
580
Andreas Färbera0e372f2013-06-28 23:18:47 +0200581 if (n > cc->gdb_num_core_regs) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200582 return 0;
583 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200584
585 tmp = ldl_p(mem_buf);
586
587 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200588 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200589 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200590 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200591 }
592 return 4;
593}
thsf1ccf902007-10-08 13:16:14 +0000594#elif defined (TARGET_CRIS)
595
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100596static int
Andreas Färberf3840912012-02-20 06:44:56 +0100597read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100598{
599 if (n < 15) {
600 GET_REG32(env->regs[n]);
601 }
602
603 if (n == 15) {
604 GET_REG32(env->pc);
605 }
606
607 if (n < 32) {
608 switch (n) {
609 case 16:
610 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100611 case 17:
612 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100613 case 20:
614 case 21:
615 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100616 default:
617 if (n >= 23) {
618 GET_REG32(env->pregs[n - 16]);
619 }
620 break;
621 }
622 }
623 return 0;
624}
625
Andreas Färberf3840912012-02-20 06:44:56 +0100626static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000627{
pbrook56aebc82008-10-11 17:55:29 +0000628 uint8_t srs;
629
Andreas Färber47d74ef2013-07-07 11:17:26 +0200630 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100631 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200632 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100633
pbrook56aebc82008-10-11 17:55:29 +0000634 srs = env->pregs[PR_SRS];
635 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200636 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +0000637 }
638
639 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200640 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +0000641 }
642 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200643 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +0000644 }
645 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200646 case 16:
647 GET_REG8(env->pregs[0]);
648 case 17:
649 GET_REG8(env->pregs[1]);
650 case 18:
651 GET_REG32(env->pregs[2]);
652 case 19:
653 GET_REG8(srs);
654 case 20:
655 GET_REG16(env->pregs[4]);
656 case 32:
657 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000658 }
659
660 return 0;
thsf1ccf902007-10-08 13:16:14 +0000661}
662
Andreas Färberf3840912012-02-20 06:44:56 +0100663static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000664{
pbrook56aebc82008-10-11 17:55:29 +0000665 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +0000666
Andreas Färber47d74ef2013-07-07 11:17:26 +0200667 if (n > 49) {
668 return 0;
669 }
thsf1ccf902007-10-08 13:16:14 +0000670
pbrook56aebc82008-10-11 17:55:29 +0000671 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +0000672
pbrook56aebc82008-10-11 17:55:29 +0000673 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200674 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000675 }
thsf1ccf902007-10-08 13:16:14 +0000676
edgar_igld7b69672008-10-11 19:32:21 +0000677 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200678 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +0000679 }
680
681 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +0000682 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200683 case 16:
684 return 1;
685 case 17:
686 return 1;
687 case 18:
688 env->pregs[PR_PID] = tmp;
689 break;
690 case 19:
691 return 1;
692 case 20:
693 return 2;
694 case 32:
695 env->pc = tmp;
696 break;
pbrook56aebc82008-10-11 17:55:29 +0000697 }
thsf1ccf902007-10-08 13:16:14 +0000698
pbrook56aebc82008-10-11 17:55:29 +0000699 return 4;
thsf1ccf902007-10-08 13:16:14 +0000700}
aurel3219bf5172008-12-07 23:26:32 +0000701#elif defined (TARGET_ALPHA)
702
Andreas Färberf3840912012-02-20 06:44:56 +0100703static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000704{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800705 uint64_t val;
706 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000707
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800708 switch (n) {
709 case 0 ... 30:
710 val = env->ir[n];
711 break;
712 case 32 ... 62:
713 d.d = env->fir[n - 32];
714 val = d.ll;
715 break;
716 case 63:
717 val = cpu_alpha_load_fpcr(env);
718 break;
719 case 64:
720 val = env->pc;
721 break;
722 case 66:
723 val = env->unique;
724 break;
725 case 31:
726 case 65:
727 /* 31 really is the zero register; 65 is unassigned in the
728 gdb protocol, but is still required to occupy 8 bytes. */
729 val = 0;
730 break;
731 default:
732 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000733 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800734 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +0000735}
736
Andreas Färberf3840912012-02-20 06:44:56 +0100737static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000738{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800739 target_ulong tmp = ldtul_p(mem_buf);
740 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000741
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800742 switch (n) {
743 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +0000744 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800745 break;
746 case 32 ... 62:
747 d.ll = tmp;
748 env->fir[n - 32] = d.d;
749 break;
750 case 63:
751 cpu_alpha_store_fpcr(env, tmp);
752 break;
753 case 64:
754 env->pc = tmp;
755 break;
756 case 66:
757 env->unique = tmp;
758 break;
759 case 31:
760 case 65:
761 /* 31 really is the zero register; 65 is unassigned in the
762 gdb protocol, but is still required to occupy 8 bytes. */
763 break;
764 default:
765 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000766 }
aurel3219bf5172008-12-07 23:26:32 +0000767 return 8;
768}
Alexander Grafafcb0e42009-12-05 12:44:29 +0100769#elif defined (TARGET_S390X)
770
Andreas Färberf3840912012-02-20 06:44:56 +0100771static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100772{
Richard Henderson6ee77b12012-08-23 10:44:45 -0700773 uint64_t val;
774 int cc_op;
775
Alexander Grafafcb0e42009-12-05 12:44:29 +0100776 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700777 case S390_PSWM_REGNUM:
778 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
779 val = deposit64(env->psw.mask, 44, 2, cc_op);
780 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700781 case S390_PSWA_REGNUM:
782 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700783 case S390_R0_REGNUM ... S390_R15_REGNUM:
784 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700785 case S390_A0_REGNUM ... S390_A15_REGNUM:
786 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700787 case S390_FPC_REGNUM:
788 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700789 case S390_F0_REGNUM ... S390_F15_REGNUM:
790 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +0100791 }
792
793 return 0;
794}
795
Andreas Färberf3840912012-02-20 06:44:56 +0100796static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100797{
798 target_ulong tmpl;
799 uint32_t tmp32;
800 int r = 8;
801 tmpl = ldtul_p(mem_buf);
802 tmp32 = ldl_p(mem_buf);
803
804 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700805 case S390_PSWM_REGNUM:
806 env->psw.mask = tmpl;
807 env->cc_op = extract64(tmpl, 44, 2);
808 break;
809 case S390_PSWA_REGNUM:
810 env->psw.addr = tmpl;
811 break;
812 case S390_R0_REGNUM ... S390_R15_REGNUM:
813 env->regs[n-S390_R0_REGNUM] = tmpl;
814 break;
815 case S390_A0_REGNUM ... S390_A15_REGNUM:
816 env->aregs[n-S390_A0_REGNUM] = tmp32;
817 r = 4;
818 break;
819 case S390_FPC_REGNUM:
820 env->fpc = tmp32;
821 r = 4;
822 break;
823 case S390_F0_REGNUM ... S390_F15_REGNUM:
824 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
825 break;
826 default:
827 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +0100828 }
Alexander Grafafcb0e42009-12-05 12:44:29 +0100829 return r;
830}
Michael Walle0c45d3d2011-02-17 23:45:06 +0100831#elif defined (TARGET_LM32)
832
Paolo Bonzini0d09e412013-02-05 17:06:20 +0100833#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +0100834
Andreas Färberf3840912012-02-20 06:44:56 +0100835static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100836{
837 if (n < 32) {
838 GET_REG32(env->regs[n]);
839 } else {
840 switch (n) {
841 case 32:
842 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100843 /* FIXME: put in right exception ID */
844 case 33:
845 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100846 case 34:
847 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100848 case 35:
849 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100850 case 36:
851 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100852 case 37:
853 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100854 case 38:
855 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100856 }
857 }
858 return 0;
859}
860
Andreas Färberf3840912012-02-20 06:44:56 +0100861static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100862{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200863 LM32CPU *cpu = lm32_env_get_cpu(env);
864 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100865 uint32_t tmp;
866
Andreas Färbera0e372f2013-06-28 23:18:47 +0200867 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +0100868 return 0;
869 }
870
871 tmp = ldl_p(mem_buf);
872
873 if (n < 32) {
874 env->regs[n] = tmp;
875 } else {
876 switch (n) {
877 case 32:
878 env->pc = tmp;
879 break;
880 case 34:
881 env->eba = tmp;
882 break;
883 case 35:
884 env->deba = tmp;
885 break;
886 case 36:
887 env->ie = tmp;
888 break;
889 case 37:
890 lm32_pic_set_im(env->pic_state, tmp);
891 break;
892 case 38:
893 lm32_pic_set_ip(env->pic_state, tmp);
894 break;
895 }
896 }
897 return 4;
898}
Max Filippovccfcaba2011-09-06 03:55:52 +0400899#elif defined(TARGET_XTENSA)
900
Andreas Färberf3840912012-02-20 06:44:56 +0100901static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400902{
903 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
904
905 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
906 return 0;
907 }
908
909 switch (reg->type) {
910 case 9: /*pc*/
911 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +0400912
913 case 1: /*ar*/
914 xtensa_sync_phys_from_window(env);
915 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400916
917 case 2: /*SR*/
918 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400919
920 case 3: /*UR*/
921 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400922
Max Filippovdd519cb2012-09-19 04:23:54 +0400923 case 4: /*f*/
924 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +0400925
Max Filippovccfcaba2011-09-06 03:55:52 +0400926 case 8: /*a*/
927 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400928
929 default:
930 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200931 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400932 return 0;
933 }
934}
935
Andreas Färberf3840912012-02-20 06:44:56 +0100936static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400937{
938 uint32_t tmp;
939 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
940
941 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
942 return 0;
943 }
944
945 tmp = ldl_p(mem_buf);
946
947 switch (reg->type) {
948 case 9: /*pc*/
949 env->pc = tmp;
950 break;
951
952 case 1: /*ar*/
953 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
954 xtensa_sync_window_from_phys(env);
955 break;
956
957 case 2: /*SR*/
958 env->sregs[reg->targno & 0xff] = tmp;
959 break;
960
961 case 3: /*UR*/
962 env->uregs[reg->targno & 0xff] = tmp;
963 break;
964
Max Filippovdd519cb2012-09-19 04:23:54 +0400965 case 4: /*f*/
966 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
967 break;
968
Max Filippovccfcaba2011-09-06 03:55:52 +0400969 case 8: /*a*/
970 env->regs[reg->targno & 0x0f] = tmp;
971 break;
972
973 default:
974 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200975 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400976 return 0;
977 }
978
979 return 4;
980}
bellard1fddef42005-04-17 19:16:13 +0000981#else
pbrook56aebc82008-10-11 17:55:29 +0000982
Andreas Färber9349b4f2012-03-14 01:38:32 +0100983static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000984{
985 return 0;
986}
987
Andreas Färber9349b4f2012-03-14 01:38:32 +0100988static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000989{
pbrook56aebc82008-10-11 17:55:29 +0000990 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000991}
992
993#endif
bellardb4608c02003-06-27 17:34:32 +0000994
pbrook56aebc82008-10-11 17:55:29 +0000995#ifdef GDB_CORE_XML
996/* Encode data using the encoding for 'x' packets. */
997static int memtox(char *buf, const char *mem, int len)
998{
999 char *p = buf;
1000 char c;
1001
1002 while (len--) {
1003 c = *(mem++);
1004 switch (c) {
1005 case '#': case '$': case '*': case '}':
1006 *(p++) = '}';
1007 *(p++) = c ^ 0x20;
1008 break;
1009 default:
1010 *(p++) = c;
1011 break;
1012 }
1013 }
1014 return p - buf;
1015}
1016
aurel323faf7782008-12-07 23:26:17 +00001017static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001018{
pbrook56aebc82008-10-11 17:55:29 +00001019 size_t len;
1020 int i;
1021 const char *name;
1022 static char target_xml[1024];
1023
1024 len = 0;
1025 while (p[len] && p[len] != ':')
1026 len++;
1027 *newp = p + len;
1028
1029 name = NULL;
1030 if (strncmp(p, "target.xml", len) == 0) {
1031 /* Generate the XML description for this CPU. */
1032 if (!target_xml[0]) {
1033 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001034 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001035
blueswir15b3715b2008-10-25 11:18:12 +00001036 snprintf(target_xml, sizeof(target_xml),
1037 "<?xml version=\"1.0\"?>"
1038 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1039 "<target>"
1040 "<xi:include href=\"%s\"/>",
1041 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001042
Andreas Färbereac8b352013-06-28 21:11:37 +02001043 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001044 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1045 pstrcat(target_xml, sizeof(target_xml), r->xml);
1046 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001047 }
blueswir12dc766d2009-04-13 16:06:19 +00001048 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001049 }
1050 return target_xml;
1051 }
1052 for (i = 0; ; i++) {
1053 name = xml_builtin[i][0];
1054 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1055 break;
1056 }
1057 return name ? xml_builtin[i][1] : NULL;
1058}
1059#endif
1060
Andreas Färber385b9f02013-06-27 18:25:36 +02001061static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001062{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001063 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001064 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001065 GDBRegisterState *r;
1066
Andreas Färbera0e372f2013-06-28 23:18:47 +02001067 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001068 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001069 }
pbrook56aebc82008-10-11 17:55:29 +00001070
Andreas Färbereac8b352013-06-28 21:11:37 +02001071 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001072 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1073 return r->get_reg(env, mem_buf, reg - r->base_reg);
1074 }
1075 }
1076 return 0;
1077}
1078
Andreas Färber385b9f02013-06-27 18:25:36 +02001079static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001080{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001081 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001082 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001083 GDBRegisterState *r;
1084
Andreas Färbera0e372f2013-06-28 23:18:47 +02001085 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001086 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001087 }
pbrook56aebc82008-10-11 17:55:29 +00001088
Andreas Färbereac8b352013-06-28 21:11:37 +02001089 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001090 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1091 return r->set_reg(env, mem_buf, reg - r->base_reg);
1092 }
1093 }
1094 return 0;
1095}
1096
1097/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1098 specifies the first register number and these registers are included in
1099 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1100 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1101 */
1102
Andreas Färber22169d42013-06-28 21:27:39 +02001103void gdb_register_coprocessor(CPUState *cpu,
1104 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1105 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001106{
1107 GDBRegisterState *s;
1108 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001109
Andreas Färbereac8b352013-06-28 21:11:37 +02001110 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001111 while (*p) {
1112 /* Check for duplicates. */
1113 if (strcmp((*p)->xml, xml) == 0)
1114 return;
1115 p = &(*p)->next;
1116 }
Stefan Weil9643c252011-10-18 22:25:38 +02001117
1118 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001119 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02001120 s->num_regs = num_regs;
1121 s->get_reg = get_reg;
1122 s->set_reg = set_reg;
1123 s->xml = xml;
1124
pbrook56aebc82008-10-11 17:55:29 +00001125 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02001126 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00001127 *p = s;
1128 if (g_pos) {
1129 if (g_pos != s->base_reg) {
1130 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1131 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001132 }
1133 }
1134}
1135
aliguoria1d1bb32008-11-18 20:07:32 +00001136#ifndef CONFIG_USER_ONLY
1137static const int xlat_gdb_type[] = {
1138 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1139 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1140 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1141};
1142#endif
1143
aliguori880a7572008-11-18 20:30:24 +00001144static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001145{
Andreas Färber182735e2013-05-29 22:29:20 +02001146 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001147 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001148 int err = 0;
1149
Andreas Färber62278812013-06-27 17:12:06 +02001150 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001151 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001152 }
aliguorie22a25c2009-03-12 20:12:48 +00001153
aliguoria1d1bb32008-11-18 20:07:32 +00001154 switch (type) {
1155 case GDB_BREAKPOINT_SW:
1156 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001157 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1158 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001159 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1160 if (err)
1161 break;
1162 }
1163 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001164#ifndef CONFIG_USER_ONLY
1165 case GDB_WATCHPOINT_WRITE:
1166 case GDB_WATCHPOINT_READ:
1167 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001168 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1169 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001170 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1171 NULL);
1172 if (err)
1173 break;
1174 }
1175 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001176#endif
1177 default:
1178 return -ENOSYS;
1179 }
1180}
1181
aliguori880a7572008-11-18 20:30:24 +00001182static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001183{
Andreas Färber182735e2013-05-29 22:29:20 +02001184 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001185 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001186 int err = 0;
1187
Andreas Färber62278812013-06-27 17:12:06 +02001188 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001189 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001190 }
aliguorie22a25c2009-03-12 20:12:48 +00001191
aliguoria1d1bb32008-11-18 20:07:32 +00001192 switch (type) {
1193 case GDB_BREAKPOINT_SW:
1194 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001195 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1196 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001197 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1198 if (err)
1199 break;
1200 }
1201 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001202#ifndef CONFIG_USER_ONLY
1203 case GDB_WATCHPOINT_WRITE:
1204 case GDB_WATCHPOINT_READ:
1205 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001206 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1207 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001208 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1209 if (err)
1210 break;
1211 }
1212 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001213#endif
1214 default:
1215 return -ENOSYS;
1216 }
1217}
1218
aliguori880a7572008-11-18 20:30:24 +00001219static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001220{
Andreas Färber182735e2013-05-29 22:29:20 +02001221 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001222 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001223
aliguorie22a25c2009-03-12 20:12:48 +00001224 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001225 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001226 return;
1227 }
1228
Andreas Färber182735e2013-05-29 22:29:20 +02001229 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1230 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001231 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001232#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001233 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001234#endif
aliguori880a7572008-11-18 20:30:24 +00001235 }
aliguoria1d1bb32008-11-18 20:07:32 +00001236}
1237
aurel32fab9d282009-04-08 21:29:37 +00001238static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1239{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001240 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001241 CPUClass *cc = CPU_GET_CLASS(cpu);
1242
1243 cpu_synchronize_state(cpu);
1244 if (cc->set_pc) {
1245 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001246 }
aurel32fab9d282009-04-08 21:29:37 +00001247}
1248
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001249static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001250{
Andreas Färber0d342822012-12-17 07:12:13 +01001251 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001252
Andreas Färber182735e2013-05-29 22:29:20 +02001253 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001254 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001255 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001256 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001257 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001258
1259 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001260}
1261
aliguori880a7572008-11-18 20:30:24 +00001262static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001263{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001264 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001265 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001266 uint32_t thread;
1267 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001268 char buf[MAX_PACKET_LENGTH];
1269 uint8_t mem_buf[MAX_PACKET_LENGTH];
1270 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001271 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001272
bellard858693c2004-03-31 18:52:07 +00001273#ifdef DEBUG_GDB
1274 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001275#endif
bellard858693c2004-03-31 18:52:07 +00001276 p = line_buf;
1277 ch = *p++;
1278 switch(ch) {
1279 case '?':
bellard1fddef42005-04-17 19:16:13 +00001280 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001281 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001282 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001283 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001284 /* Remove all the breakpoints when this query is issued,
1285 * because gdb is doing and initial connect and the state
1286 * should be cleaned up.
1287 */
aliguori880a7572008-11-18 20:30:24 +00001288 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001289 break;
1290 case 'c':
1291 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001292 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001293 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001294 }
aurel32ca587a82008-12-18 22:44:13 +00001295 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001296 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001297 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001298 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001299 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1300 if (s->signal == -1)
1301 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001302 gdb_continue(s);
1303 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001304 case 'v':
1305 if (strncmp(p, "Cont", 4) == 0) {
1306 int res_signal, res_thread;
1307
1308 p += 4;
1309 if (*p == '?') {
1310 put_packet(s, "vCont;c;C;s;S");
1311 break;
1312 }
1313 res = 0;
1314 res_signal = 0;
1315 res_thread = 0;
1316 while (*p) {
1317 int action, signal;
1318
1319 if (*p++ != ';') {
1320 res = 0;
1321 break;
1322 }
1323 action = *p++;
1324 signal = 0;
1325 if (action == 'C' || action == 'S') {
1326 signal = strtoul(p, (char **)&p, 16);
1327 } else if (action != 'c' && action != 's') {
1328 res = 0;
1329 break;
1330 }
1331 thread = 0;
1332 if (*p == ':') {
1333 thread = strtoull(p+1, (char **)&p, 16);
1334 }
1335 action = tolower(action);
1336 if (res == 0 || (res == 'c' && action == 's')) {
1337 res = action;
1338 res_signal = signal;
1339 res_thread = thread;
1340 }
1341 }
1342 if (res) {
1343 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001344 cpu = find_cpu(res_thread);
1345 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001346 put_packet(s, "E22");
1347 break;
1348 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001349 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001350 }
1351 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001352 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001353 }
1354 s->signal = res_signal;
1355 gdb_continue(s);
1356 return RS_IDLE;
1357 }
1358 break;
1359 } else {
1360 goto unknown_command;
1361 }
edgar_igl7d03f822008-05-17 18:58:29 +00001362 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001363#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001364 /* Kill the target */
1365 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1366 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001367#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001368 case 'D':
1369 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001370 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001371 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001372 gdb_continue(s);
1373 put_packet(s, "OK");
1374 break;
bellard858693c2004-03-31 18:52:07 +00001375 case 's':
1376 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001377 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001378 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001379 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001380 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001381 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001382 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001383 case 'F':
1384 {
1385 target_ulong ret;
1386 target_ulong err;
1387
1388 ret = strtoull(p, (char **)&p, 16);
1389 if (*p == ',') {
1390 p++;
1391 err = strtoull(p, (char **)&p, 16);
1392 } else {
1393 err = 0;
1394 }
1395 if (*p == ',')
1396 p++;
1397 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001398 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001399 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001400 s->current_syscall_cb = NULL;
1401 }
pbrooka2d1eba2007-01-28 03:10:55 +00001402 if (type == 'C') {
1403 put_packet(s, "T02");
1404 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001405 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001406 }
1407 }
1408 break;
bellard858693c2004-03-31 18:52:07 +00001409 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001410 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001411 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001412 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001413 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001414 len += reg_size;
1415 }
1416 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001417 put_packet(s, buf);
1418 break;
1419 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001420 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001421 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001422 len = strlen(p) / 2;
1423 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001424 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001425 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001426 len -= reg_size;
1427 registers += reg_size;
1428 }
bellard858693c2004-03-31 18:52:07 +00001429 put_packet(s, "OK");
1430 break;
1431 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001432 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001433 if (*p == ',')
1434 p++;
bellard9d9754a2006-06-25 15:32:37 +00001435 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001436 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001437 put_packet (s, "E14");
1438 } else {
1439 memtohex(buf, mem_buf, len);
1440 put_packet(s, buf);
1441 }
bellard858693c2004-03-31 18:52:07 +00001442 break;
1443 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001444 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001445 if (*p == ',')
1446 p++;
bellard9d9754a2006-06-25 15:32:37 +00001447 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001448 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001449 p++;
1450 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001451 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001452 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001453 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001454 } else {
bellard858693c2004-03-31 18:52:07 +00001455 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001456 }
bellard858693c2004-03-31 18:52:07 +00001457 break;
pbrook56aebc82008-10-11 17:55:29 +00001458 case 'p':
1459 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1460 This works, but can be very slow. Anything new enough to
1461 understand XML also knows how to use this properly. */
1462 if (!gdb_has_xml)
1463 goto unknown_command;
1464 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001465 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001466 if (reg_size) {
1467 memtohex(buf, mem_buf, reg_size);
1468 put_packet(s, buf);
1469 } else {
1470 put_packet(s, "E14");
1471 }
1472 break;
1473 case 'P':
1474 if (!gdb_has_xml)
1475 goto unknown_command;
1476 addr = strtoull(p, (char **)&p, 16);
1477 if (*p == '=')
1478 p++;
1479 reg_size = strlen(p) / 2;
1480 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001481 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001482 put_packet(s, "OK");
1483 break;
bellard858693c2004-03-31 18:52:07 +00001484 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001485 case 'z':
1486 type = strtoul(p, (char **)&p, 16);
1487 if (*p == ',')
1488 p++;
bellard9d9754a2006-06-25 15:32:37 +00001489 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001490 if (*p == ',')
1491 p++;
bellard9d9754a2006-06-25 15:32:37 +00001492 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001493 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001494 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001495 else
aliguori880a7572008-11-18 20:30:24 +00001496 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001497 if (res >= 0)
1498 put_packet(s, "OK");
1499 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001500 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001501 else
1502 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001503 break;
aliguori880a7572008-11-18 20:30:24 +00001504 case 'H':
1505 type = *p++;
1506 thread = strtoull(p, (char **)&p, 16);
1507 if (thread == -1 || thread == 0) {
1508 put_packet(s, "OK");
1509 break;
1510 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001511 cpu = find_cpu(thread);
1512 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001513 put_packet(s, "E22");
1514 break;
1515 }
1516 switch (type) {
1517 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001518 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001519 put_packet(s, "OK");
1520 break;
1521 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001522 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001523 put_packet(s, "OK");
1524 break;
1525 default:
1526 put_packet(s, "E22");
1527 break;
1528 }
1529 break;
1530 case 'T':
1531 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001532 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001533
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001534 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001535 put_packet(s, "OK");
1536 } else {
aliguori880a7572008-11-18 20:30:24 +00001537 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001538 }
aliguori880a7572008-11-18 20:30:24 +00001539 break;
pbrook978efd62006-06-17 18:30:42 +00001540 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001541 case 'Q':
1542 /* parse any 'q' packets here */
1543 if (!strcmp(p,"qemu.sstepbits")) {
1544 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001545 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1546 SSTEP_ENABLE,
1547 SSTEP_NOIRQ,
1548 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001549 put_packet(s, buf);
1550 break;
1551 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1552 /* Display or change the sstep_flags */
1553 p += 10;
1554 if (*p != '=') {
1555 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001556 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001557 put_packet(s, buf);
1558 break;
1559 }
1560 p++;
1561 type = strtoul(p, (char **)&p, 16);
1562 sstep_flags = type;
1563 put_packet(s, "OK");
1564 break;
aliguori880a7572008-11-18 20:30:24 +00001565 } else if (strcmp(p,"C") == 0) {
1566 /* "Current thread" remains vague in the spec, so always return
1567 * the first CPU (gdb returns the first thread). */
1568 put_packet(s, "QC1");
1569 break;
1570 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001571 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001572 goto report_cpuinfo;
1573 } else if (strcmp(p,"sThreadInfo") == 0) {
1574 report_cpuinfo:
1575 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001576 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001577 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001578 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001579 } else
1580 put_packet(s, "l");
1581 break;
1582 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1583 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001584 cpu = find_cpu(thread);
1585 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001586 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001587 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001588 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001589 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001590 memtohex(buf, mem_buf, len);
1591 put_packet(s, buf);
1592 }
aliguori880a7572008-11-18 20:30:24 +00001593 break;
edgar_igl60897d32008-05-09 08:25:14 +00001594 }
blueswir10b8a9882009-03-07 10:51:36 +00001595#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001596 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001597 CPUArchState *env = s->c_cpu->env_ptr;
1598 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001599
blueswir1363a37d2008-08-21 17:58:08 +00001600 snprintf(buf, sizeof(buf),
1601 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1602 ";Bss=" TARGET_ABI_FMT_lx,
1603 ts->info->code_offset,
1604 ts->info->data_offset,
1605 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001606 put_packet(s, buf);
1607 break;
1608 }
blueswir10b8a9882009-03-07 10:51:36 +00001609#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001610 else if (strncmp(p, "Rcmd,", 5) == 0) {
1611 int len = strlen(p + 5);
1612
1613 if ((len % 2) != 0) {
1614 put_packet(s, "E01");
1615 break;
1616 }
1617 hextomem(mem_buf, p + 5, len);
1618 len = len / 2;
1619 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001620 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001621 put_packet(s, "OK");
1622 break;
1623 }
blueswir10b8a9882009-03-07 10:51:36 +00001624#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001625 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001626 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001627#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001628 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001629#endif
1630 put_packet(s, buf);
1631 break;
1632 }
1633#ifdef GDB_CORE_XML
1634 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1635 const char *xml;
1636 target_ulong total_len;
1637
1638 gdb_has_xml = 1;
1639 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001640 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001641 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001642 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001643 put_packet(s, buf);
1644 break;
1645 }
1646
1647 if (*p == ':')
1648 p++;
1649 addr = strtoul(p, (char **)&p, 16);
1650 if (*p == ',')
1651 p++;
1652 len = strtoul(p, (char **)&p, 16);
1653
1654 total_len = strlen(xml);
1655 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001656 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001657 put_packet(s, buf);
1658 break;
1659 }
1660 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1661 len = (MAX_PACKET_LENGTH - 5) / 2;
1662 if (len < total_len - addr) {
1663 buf[0] = 'm';
1664 len = memtox(buf + 1, xml + addr, len);
1665 } else {
1666 buf[0] = 'l';
1667 len = memtox(buf + 1, xml + addr, total_len - addr);
1668 }
1669 put_packet_binary(s, buf, len + 1);
1670 break;
1671 }
1672#endif
1673 /* Unrecognised 'q' command. */
1674 goto unknown_command;
1675
bellard858693c2004-03-31 18:52:07 +00001676 default:
pbrook56aebc82008-10-11 17:55:29 +00001677 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001678 /* put empty packet */
1679 buf[0] = '\0';
1680 put_packet(s, buf);
1681 break;
1682 }
1683 return RS_IDLE;
1684}
1685
Andreas Färber64f6b342013-05-27 02:06:09 +02001686void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001687{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001688 gdbserver_state->c_cpu = cpu;
1689 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001690}
1691
bellard1fddef42005-04-17 19:16:13 +00001692#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001693static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001694{
aliguori880a7572008-11-18 20:30:24 +00001695 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001696 CPUArchState *env = s->c_cpu->env_ptr;
1697 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001698 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001699 const char *type;
bellard858693c2004-03-31 18:52:07 +00001700 int ret;
1701
Meador Ingecdb432b2012-03-15 17:49:45 +00001702 if (running || s->state == RS_INACTIVE) {
1703 return;
1704 }
1705 /* Is there a GDB syscall waiting to be sent? */
1706 if (s->current_syscall_cb) {
1707 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001708 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001709 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001710 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001711 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00001712 if (env->watchpoint_hit) {
1713 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001714 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001715 type = "r";
1716 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001717 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001718 type = "a";
1719 break;
1720 default:
1721 type = "";
1722 break;
1723 }
aliguori880a7572008-11-18 20:30:24 +00001724 snprintf(buf, sizeof(buf),
1725 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001726 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00001727 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001728 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001729 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001730 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001731 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001732 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001733 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001734 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001735 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001736 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001737 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001738 ret = GDB_SIGNAL_QUIT;
1739 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001740 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001741 ret = GDB_SIGNAL_IO;
1742 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001743 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001744 ret = GDB_SIGNAL_ALRM;
1745 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001746 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001747 ret = GDB_SIGNAL_ABRT;
1748 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001749 case RUN_STATE_SAVE_VM:
1750 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001751 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001752 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001753 ret = GDB_SIGNAL_XCPU;
1754 break;
1755 default:
1756 ret = GDB_SIGNAL_UNKNOWN;
1757 break;
bellardbbeb7b52006-04-23 18:42:15 +00001758 }
Andreas Färber0d342822012-12-17 07:12:13 +01001759 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001760
1761send_packet:
bellard858693c2004-03-31 18:52:07 +00001762 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001763
1764 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001765 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001766}
bellard1fddef42005-04-17 19:16:13 +00001767#endif
bellard858693c2004-03-31 18:52:07 +00001768
pbrooka2d1eba2007-01-28 03:10:55 +00001769/* Send a gdb syscall request.
1770 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001771 %x - target_ulong argument printed in hex.
1772 %lx - 64-bit argument printed in hex.
1773 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001774void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001775{
1776 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001777 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001778 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001779 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001780 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001781 GDBState *s;
1782
aliguori880a7572008-11-18 20:30:24 +00001783 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001784 if (!s)
1785 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001786 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001787#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001788 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001789#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001790 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001791 p = s->syscall_buf;
1792 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001793 *(p++) = 'F';
1794 while (*fmt) {
1795 if (*fmt == '%') {
1796 fmt++;
1797 switch (*fmt++) {
1798 case 'x':
1799 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001800 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001801 break;
pbrooka87295e2007-05-26 15:09:38 +00001802 case 'l':
1803 if (*(fmt++) != 'x')
1804 goto bad_format;
1805 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001806 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001807 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001808 case 's':
1809 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001810 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001811 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001812 break;
1813 default:
pbrooka87295e2007-05-26 15:09:38 +00001814 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001815 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1816 fmt - 1);
1817 break;
1818 }
1819 } else {
1820 *(p++) = *(fmt++);
1821 }
1822 }
pbrook8a93e022007-08-06 13:19:15 +00001823 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001824 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001825#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001826 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001827 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001828#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001829 /* In this case wait to send the syscall packet until notification that
1830 the CPU has stopped. This must be done because if the packet is sent
1831 now the reply from the syscall request could be received while the CPU
1832 is still in the running state, which can cause packets to be dropped
1833 and state transition 'T' packets to be sent while the syscall is still
1834 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001835 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001836#endif
1837}
1838
bellard6a00d602005-11-21 23:25:50 +00001839static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001840{
1841 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001842 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001843
bellard1fddef42005-04-17 19:16:13 +00001844#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001845 if (s->last_packet_len) {
1846 /* Waiting for a response to the last packet. If we see the start
1847 of a new command then abandon the previous response. */
1848 if (ch == '-') {
1849#ifdef DEBUG_GDB
1850 printf("Got NACK, retransmitting\n");
1851#endif
thsffe8ab82007-12-16 03:16:05 +00001852 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001853 }
1854#ifdef DEBUG_GDB
1855 else if (ch == '+')
1856 printf("Got ACK\n");
1857 else
1858 printf("Got '%c' when expecting ACK/NACK\n", ch);
1859#endif
1860 if (ch == '+' || ch == '$')
1861 s->last_packet_len = 0;
1862 if (ch != '$')
1863 return;
1864 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001865 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001866 /* when the CPU is running, we cannot do anything except stop
1867 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001868 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001869 } else
bellard1fddef42005-04-17 19:16:13 +00001870#endif
bellard41625032005-04-24 10:07:11 +00001871 {
bellard858693c2004-03-31 18:52:07 +00001872 switch(s->state) {
1873 case RS_IDLE:
1874 if (ch == '$') {
1875 s->line_buf_index = 0;
1876 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001877 }
1878 break;
bellard858693c2004-03-31 18:52:07 +00001879 case RS_GETLINE:
1880 if (ch == '#') {
1881 s->state = RS_CHKSUM1;
1882 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1883 s->state = RS_IDLE;
1884 } else {
1885 s->line_buf[s->line_buf_index++] = ch;
1886 }
1887 break;
1888 case RS_CHKSUM1:
1889 s->line_buf[s->line_buf_index] = '\0';
1890 s->line_csum = fromhex(ch) << 4;
1891 s->state = RS_CHKSUM2;
1892 break;
1893 case RS_CHKSUM2:
1894 s->line_csum |= fromhex(ch);
1895 csum = 0;
1896 for(i = 0; i < s->line_buf_index; i++) {
1897 csum += s->line_buf[i];
1898 }
1899 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001900 reply = '-';
1901 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001902 s->state = RS_IDLE;
1903 } else {
ths60fe76f2007-12-16 03:02:09 +00001904 reply = '+';
1905 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001906 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001907 }
bellardb4608c02003-06-27 17:34:32 +00001908 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001909 default:
1910 abort();
bellardb4608c02003-06-27 17:34:32 +00001911 }
1912 }
bellard858693c2004-03-31 18:52:07 +00001913}
1914
Paul Brook0e1c9c52010-06-16 13:03:51 +01001915/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001916void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001917{
1918 GDBState *s;
1919 char buf[4];
1920
1921 s = gdbserver_state;
1922 if (!s) {
1923 return;
1924 }
1925#ifdef CONFIG_USER_ONLY
1926 if (gdbserver_fd < 0 || s->fd < 0) {
1927 return;
1928 }
1929#endif
1930
1931 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1932 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001933
1934#ifndef CONFIG_USER_ONLY
1935 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001936 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001937 }
1938#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001939}
1940
bellard1fddef42005-04-17 19:16:13 +00001941#ifdef CONFIG_USER_ONLY
1942int
aurel32ca587a82008-12-18 22:44:13 +00001943gdb_queuesig (void)
1944{
1945 GDBState *s;
1946
1947 s = gdbserver_state;
1948
1949 if (gdbserver_fd < 0 || s->fd < 0)
1950 return 0;
1951 else
1952 return 1;
1953}
1954
1955int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001956gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001957{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001958 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001959 GDBState *s;
1960 char buf[256];
1961 int n;
bellard1fddef42005-04-17 19:16:13 +00001962
Andreas Färber5ca666c2013-06-24 19:20:57 +02001963 s = gdbserver_state;
1964 if (gdbserver_fd < 0 || s->fd < 0) {
1965 return sig;
bellard1fddef42005-04-17 19:16:13 +00001966 }
1967
Andreas Färber5ca666c2013-06-24 19:20:57 +02001968 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001969 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02001970 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00001971
Andreas Färber5ca666c2013-06-24 19:20:57 +02001972 if (sig != 0) {
1973 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1974 put_packet(s, buf);
1975 }
1976 /* put_packet() might have detected that the peer terminated the
1977 connection. */
1978 if (s->fd < 0) {
1979 return sig;
1980 }
1981
1982 sig = 0;
1983 s->state = RS_IDLE;
1984 s->running_state = 0;
1985 while (s->running_state == 0) {
1986 n = read(s->fd, buf, 256);
1987 if (n > 0) {
1988 int i;
1989
1990 for (i = 0; i < n; i++) {
1991 gdb_read_byte(s, buf[i]);
1992 }
1993 } else if (n == 0 || errno != EAGAIN) {
1994 /* XXX: Connection closed. Should probably wait for another
1995 connection before continuing. */
1996 return sig;
bellard1fddef42005-04-17 19:16:13 +00001997 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001998 }
1999 sig = s->signal;
2000 s->signal = 0;
2001 return sig;
bellard1fddef42005-04-17 19:16:13 +00002002}
bellarde9009672005-04-26 20:42:36 +00002003
aurel32ca587a82008-12-18 22:44:13 +00002004/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002005void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002006{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002007 GDBState *s;
2008 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002009
Andreas Färber5ca666c2013-06-24 19:20:57 +02002010 s = gdbserver_state;
2011 if (gdbserver_fd < 0 || s->fd < 0) {
2012 return;
2013 }
aurel32ca587a82008-12-18 22:44:13 +00002014
Andreas Färber5ca666c2013-06-24 19:20:57 +02002015 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2016 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002017}
bellard1fddef42005-04-17 19:16:13 +00002018
aliguori880a7572008-11-18 20:30:24 +00002019static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002020{
2021 GDBState *s;
2022 struct sockaddr_in sockaddr;
2023 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002024 int fd;
bellard858693c2004-03-31 18:52:07 +00002025
2026 for(;;) {
2027 len = sizeof(sockaddr);
2028 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2029 if (fd < 0 && errno != EINTR) {
2030 perror("accept");
2031 return;
2032 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002033#ifndef _WIN32
2034 fcntl(fd, F_SETFD, FD_CLOEXEC);
2035#endif
bellard858693c2004-03-31 18:52:07 +00002036 break;
2037 }
2038 }
2039
2040 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002041 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002042
Anthony Liguori7267c092011-08-20 22:09:37 -05002043 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002044 s->c_cpu = first_cpu;
2045 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002046 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002047 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002048
aliguori880a7572008-11-18 20:30:24 +00002049 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002050
bellard858693c2004-03-31 18:52:07 +00002051 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002052}
2053
2054static int gdbserver_open(int port)
2055{
2056 struct sockaddr_in sockaddr;
2057 int fd, val, ret;
2058
2059 fd = socket(PF_INET, SOCK_STREAM, 0);
2060 if (fd < 0) {
2061 perror("socket");
2062 return -1;
2063 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002064#ifndef _WIN32
2065 fcntl(fd, F_SETFD, FD_CLOEXEC);
2066#endif
bellard858693c2004-03-31 18:52:07 +00002067
2068 /* allow fast reuse */
2069 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002070 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002071
2072 sockaddr.sin_family = AF_INET;
2073 sockaddr.sin_port = htons(port);
2074 sockaddr.sin_addr.s_addr = 0;
2075 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2076 if (ret < 0) {
2077 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002078 close(fd);
bellard858693c2004-03-31 18:52:07 +00002079 return -1;
2080 }
2081 ret = listen(fd, 0);
2082 if (ret < 0) {
2083 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002084 close(fd);
bellard858693c2004-03-31 18:52:07 +00002085 return -1;
2086 }
bellard858693c2004-03-31 18:52:07 +00002087 return fd;
2088}
2089
2090int gdbserver_start(int port)
2091{
2092 gdbserver_fd = gdbserver_open(port);
2093 if (gdbserver_fd < 0)
2094 return -1;
2095 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002096 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002097 return 0;
2098}
aurel322b1319c2008-12-18 22:44:04 +00002099
2100/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002101void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002102{
2103 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002104 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002105 return;
2106 close(s->fd);
2107 s->fd = -1;
2108 cpu_breakpoint_remove_all(env, BP_GDB);
2109 cpu_watchpoint_remove_all(env, BP_GDB);
2110}
pbrook4046d912007-01-28 01:53:16 +00002111#else
thsaa1f17c2007-07-11 22:48:58 +00002112static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002113{
pbrook56aebc82008-10-11 17:55:29 +00002114 /* We can handle an arbitrarily large amount of data.
2115 Pick the maximum packet size, which is as good as anything. */
2116 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002117}
2118
thsaa1f17c2007-07-11 22:48:58 +00002119static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002120{
pbrook4046d912007-01-28 01:53:16 +00002121 int i;
2122
2123 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002124 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002125 }
2126}
2127
2128static void gdb_chr_event(void *opaque, int event)
2129{
2130 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302131 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002132 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002133 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002134 break;
2135 default:
2136 break;
2137 }
2138}
2139
aliguori8a34a0f2009-03-05 23:01:55 +00002140static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2141{
2142 char buf[MAX_PACKET_LENGTH];
2143
2144 buf[0] = 'O';
2145 if (len > (MAX_PACKET_LENGTH/2) - 1)
2146 len = (MAX_PACKET_LENGTH/2) - 1;
2147 memtohex(buf + 1, (uint8_t *)msg, len);
2148 put_packet(s, buf);
2149}
2150
2151static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2152{
2153 const char *p = (const char *)buf;
2154 int max_sz;
2155
2156 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2157 for (;;) {
2158 if (len <= max_sz) {
2159 gdb_monitor_output(gdbserver_state, p, len);
2160 break;
2161 }
2162 gdb_monitor_output(gdbserver_state, p, max_sz);
2163 p += max_sz;
2164 len -= max_sz;
2165 }
2166 return len;
2167}
2168
aliguori59030a82009-04-05 18:43:41 +00002169#ifndef _WIN32
2170static void gdb_sigterm_handler(int signal)
2171{
Luiz Capitulino13548692011-07-29 15:36:43 -03002172 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002173 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002174 }
aliguori59030a82009-04-05 18:43:41 +00002175}
2176#endif
2177
2178int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002179{
2180 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002181 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002182 CharDriverState *chr = NULL;
2183 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002184
aliguori59030a82009-04-05 18:43:41 +00002185 if (!device)
2186 return -1;
2187 if (strcmp(device, "none") != 0) {
2188 if (strstart(device, "tcp:", NULL)) {
2189 /* enforce required TCP attributes */
2190 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2191 "%s,nowait,nodelay,server", device);
2192 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002193 }
aliguori59030a82009-04-05 18:43:41 +00002194#ifndef _WIN32
2195 else if (strcmp(device, "stdio") == 0) {
2196 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002197
aliguori59030a82009-04-05 18:43:41 +00002198 memset(&act, 0, sizeof(act));
2199 act.sa_handler = gdb_sigterm_handler;
2200 sigaction(SIGINT, &act, NULL);
2201 }
2202#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002203 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002204 if (!chr)
2205 return -1;
2206
Hans de Goede456d6062013-03-27 20:29:40 +01002207 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002208 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2209 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002210 }
2211
aliguori36556b22009-03-28 18:05:53 +00002212 s = gdbserver_state;
2213 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002214 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002215 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002216
aliguori36556b22009-03-28 18:05:53 +00002217 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2218
2219 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002220 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002221 mon_chr->chr_write = gdb_monitor_write;
2222 monitor_init(mon_chr, 0);
2223 } else {
2224 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002225 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002226 mon_chr = s->mon_chr;
2227 memset(s, 0, sizeof(GDBState));
2228 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002229 s->c_cpu = first_cpu;
2230 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002231 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002232 s->state = chr ? RS_IDLE : RS_INACTIVE;
2233 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002234 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002235
pbrook4046d912007-01-28 01:53:16 +00002236 return 0;
2237}
2238#endif