blob: 9ffb41f6dd97647dd17fbf85fc8b249e0233d097 [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ärberf3840912012-02-20 06:44:56 +0100573static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000574{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800575 uint64_t val;
576 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000577
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800578 switch (n) {
579 case 0 ... 30:
580 val = env->ir[n];
581 break;
582 case 32 ... 62:
583 d.d = env->fir[n - 32];
584 val = d.ll;
585 break;
586 case 63:
587 val = cpu_alpha_load_fpcr(env);
588 break;
589 case 64:
590 val = env->pc;
591 break;
592 case 66:
593 val = env->unique;
594 break;
595 case 31:
596 case 65:
597 /* 31 really is the zero register; 65 is unassigned in the
598 gdb protocol, but is still required to occupy 8 bytes. */
599 val = 0;
600 break;
601 default:
602 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000603 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800604 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +0000605}
606
Andreas Färberf3840912012-02-20 06:44:56 +0100607static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000608{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800609 target_ulong tmp = ldtul_p(mem_buf);
610 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000611
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800612 switch (n) {
613 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +0000614 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800615 break;
616 case 32 ... 62:
617 d.ll = tmp;
618 env->fir[n - 32] = d.d;
619 break;
620 case 63:
621 cpu_alpha_store_fpcr(env, tmp);
622 break;
623 case 64:
624 env->pc = tmp;
625 break;
626 case 66:
627 env->unique = tmp;
628 break;
629 case 31:
630 case 65:
631 /* 31 really is the zero register; 65 is unassigned in the
632 gdb protocol, but is still required to occupy 8 bytes. */
633 break;
634 default:
635 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000636 }
aurel3219bf5172008-12-07 23:26:32 +0000637 return 8;
638}
Alexander Grafafcb0e42009-12-05 12:44:29 +0100639#elif defined (TARGET_S390X)
640
Andreas Färberf3840912012-02-20 06:44:56 +0100641static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100642{
Richard Henderson6ee77b12012-08-23 10:44:45 -0700643 uint64_t val;
644 int cc_op;
645
Alexander Grafafcb0e42009-12-05 12:44:29 +0100646 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700647 case S390_PSWM_REGNUM:
648 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
649 val = deposit64(env->psw.mask, 44, 2, cc_op);
650 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700651 case S390_PSWA_REGNUM:
652 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700653 case S390_R0_REGNUM ... S390_R15_REGNUM:
654 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700655 case S390_A0_REGNUM ... S390_A15_REGNUM:
656 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700657 case S390_FPC_REGNUM:
658 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700659 case S390_F0_REGNUM ... S390_F15_REGNUM:
660 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +0100661 }
662
663 return 0;
664}
665
Andreas Färberf3840912012-02-20 06:44:56 +0100666static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100667{
668 target_ulong tmpl;
669 uint32_t tmp32;
670 int r = 8;
671 tmpl = ldtul_p(mem_buf);
672 tmp32 = ldl_p(mem_buf);
673
674 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700675 case S390_PSWM_REGNUM:
676 env->psw.mask = tmpl;
677 env->cc_op = extract64(tmpl, 44, 2);
678 break;
679 case S390_PSWA_REGNUM:
680 env->psw.addr = tmpl;
681 break;
682 case S390_R0_REGNUM ... S390_R15_REGNUM:
683 env->regs[n-S390_R0_REGNUM] = tmpl;
684 break;
685 case S390_A0_REGNUM ... S390_A15_REGNUM:
686 env->aregs[n-S390_A0_REGNUM] = tmp32;
687 r = 4;
688 break;
689 case S390_FPC_REGNUM:
690 env->fpc = tmp32;
691 r = 4;
692 break;
693 case S390_F0_REGNUM ... S390_F15_REGNUM:
694 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
695 break;
696 default:
697 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +0100698 }
Alexander Grafafcb0e42009-12-05 12:44:29 +0100699 return r;
700}
Michael Walle0c45d3d2011-02-17 23:45:06 +0100701#elif defined (TARGET_LM32)
702
Paolo Bonzini0d09e412013-02-05 17:06:20 +0100703#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +0100704
Andreas Färberf3840912012-02-20 06:44:56 +0100705static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100706{
707 if (n < 32) {
708 GET_REG32(env->regs[n]);
709 } else {
710 switch (n) {
711 case 32:
712 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100713 /* FIXME: put in right exception ID */
714 case 33:
715 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100716 case 34:
717 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100718 case 35:
719 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100720 case 36:
721 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100722 case 37:
723 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100724 case 38:
725 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100726 }
727 }
728 return 0;
729}
730
Andreas Färberf3840912012-02-20 06:44:56 +0100731static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100732{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200733 LM32CPU *cpu = lm32_env_get_cpu(env);
734 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100735 uint32_t tmp;
736
Andreas Färbera0e372f2013-06-28 23:18:47 +0200737 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +0100738 return 0;
739 }
740
741 tmp = ldl_p(mem_buf);
742
743 if (n < 32) {
744 env->regs[n] = tmp;
745 } else {
746 switch (n) {
747 case 32:
748 env->pc = tmp;
749 break;
750 case 34:
751 env->eba = tmp;
752 break;
753 case 35:
754 env->deba = tmp;
755 break;
756 case 36:
757 env->ie = tmp;
758 break;
759 case 37:
760 lm32_pic_set_im(env->pic_state, tmp);
761 break;
762 case 38:
763 lm32_pic_set_ip(env->pic_state, tmp);
764 break;
765 }
766 }
767 return 4;
768}
Max Filippovccfcaba2011-09-06 03:55:52 +0400769#elif defined(TARGET_XTENSA)
770
Andreas Färberf3840912012-02-20 06:44:56 +0100771static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400772{
773 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
774
775 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
776 return 0;
777 }
778
779 switch (reg->type) {
780 case 9: /*pc*/
781 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +0400782
783 case 1: /*ar*/
784 xtensa_sync_phys_from_window(env);
785 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400786
787 case 2: /*SR*/
788 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400789
790 case 3: /*UR*/
791 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400792
Max Filippovdd519cb2012-09-19 04:23:54 +0400793 case 4: /*f*/
794 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +0400795
Max Filippovccfcaba2011-09-06 03:55:52 +0400796 case 8: /*a*/
797 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400798
799 default:
800 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200801 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400802 return 0;
803 }
804}
805
Andreas Färberf3840912012-02-20 06:44:56 +0100806static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400807{
808 uint32_t tmp;
809 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
810
811 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
812 return 0;
813 }
814
815 tmp = ldl_p(mem_buf);
816
817 switch (reg->type) {
818 case 9: /*pc*/
819 env->pc = tmp;
820 break;
821
822 case 1: /*ar*/
823 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
824 xtensa_sync_window_from_phys(env);
825 break;
826
827 case 2: /*SR*/
828 env->sregs[reg->targno & 0xff] = tmp;
829 break;
830
831 case 3: /*UR*/
832 env->uregs[reg->targno & 0xff] = tmp;
833 break;
834
Max Filippovdd519cb2012-09-19 04:23:54 +0400835 case 4: /*f*/
836 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
837 break;
838
Max Filippovccfcaba2011-09-06 03:55:52 +0400839 case 8: /*a*/
840 env->regs[reg->targno & 0x0f] = tmp;
841 break;
842
843 default:
844 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200845 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400846 return 0;
847 }
848
849 return 4;
850}
bellard1fddef42005-04-17 19:16:13 +0000851#else
pbrook56aebc82008-10-11 17:55:29 +0000852
Andreas Färber9349b4f2012-03-14 01:38:32 +0100853static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000854{
855 return 0;
856}
857
Andreas Färber9349b4f2012-03-14 01:38:32 +0100858static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000859{
pbrook56aebc82008-10-11 17:55:29 +0000860 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000861}
862
863#endif
bellardb4608c02003-06-27 17:34:32 +0000864
pbrook56aebc82008-10-11 17:55:29 +0000865#ifdef GDB_CORE_XML
866/* Encode data using the encoding for 'x' packets. */
867static int memtox(char *buf, const char *mem, int len)
868{
869 char *p = buf;
870 char c;
871
872 while (len--) {
873 c = *(mem++);
874 switch (c) {
875 case '#': case '$': case '*': case '}':
876 *(p++) = '}';
877 *(p++) = c ^ 0x20;
878 break;
879 default:
880 *(p++) = c;
881 break;
882 }
883 }
884 return p - buf;
885}
886
aurel323faf7782008-12-07 23:26:17 +0000887static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +0000888{
pbrook56aebc82008-10-11 17:55:29 +0000889 size_t len;
890 int i;
891 const char *name;
892 static char target_xml[1024];
893
894 len = 0;
895 while (p[len] && p[len] != ':')
896 len++;
897 *newp = p + len;
898
899 name = NULL;
900 if (strncmp(p, "target.xml", len) == 0) {
901 /* Generate the XML description for this CPU. */
902 if (!target_xml[0]) {
903 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +0200904 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +0000905
blueswir15b3715b2008-10-25 11:18:12 +0000906 snprintf(target_xml, sizeof(target_xml),
907 "<?xml version=\"1.0\"?>"
908 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
909 "<target>"
910 "<xi:include href=\"%s\"/>",
911 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +0000912
Andreas Färbereac8b352013-06-28 21:11:37 +0200913 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000914 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
915 pstrcat(target_xml, sizeof(target_xml), r->xml);
916 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000917 }
blueswir12dc766d2009-04-13 16:06:19 +0000918 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000919 }
920 return target_xml;
921 }
922 for (i = 0; ; i++) {
923 name = xml_builtin[i][0];
924 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
925 break;
926 }
927 return name ? xml_builtin[i][1] : NULL;
928}
929#endif
930
Andreas Färber385b9f02013-06-27 18:25:36 +0200931static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000932{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200933 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200934 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000935 GDBRegisterState *r;
936
Andreas Färbera0e372f2013-06-28 23:18:47 +0200937 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +0000938 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200939 }
pbrook56aebc82008-10-11 17:55:29 +0000940
Andreas Färbereac8b352013-06-28 21:11:37 +0200941 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000942 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
943 return r->get_reg(env, mem_buf, reg - r->base_reg);
944 }
945 }
946 return 0;
947}
948
Andreas Färber385b9f02013-06-27 18:25:36 +0200949static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000950{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200951 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200952 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000953 GDBRegisterState *r;
954
Andreas Färbera0e372f2013-06-28 23:18:47 +0200955 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +0000956 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200957 }
pbrook56aebc82008-10-11 17:55:29 +0000958
Andreas Färbereac8b352013-06-28 21:11:37 +0200959 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000960 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
961 return r->set_reg(env, mem_buf, reg - r->base_reg);
962 }
963 }
964 return 0;
965}
966
967/* Register a supplemental set of CPU registers. If g_pos is nonzero it
968 specifies the first register number and these registers are included in
969 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
970 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
971 */
972
Andreas Färber22169d42013-06-28 21:27:39 +0200973void gdb_register_coprocessor(CPUState *cpu,
974 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
975 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000976{
977 GDBRegisterState *s;
978 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000979
Andreas Färbereac8b352013-06-28 21:11:37 +0200980 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000981 while (*p) {
982 /* Check for duplicates. */
983 if (strcmp((*p)->xml, xml) == 0)
984 return;
985 p = &(*p)->next;
986 }
Stefan Weil9643c252011-10-18 22:25:38 +0200987
988 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200989 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200990 s->num_regs = num_regs;
991 s->get_reg = get_reg;
992 s->set_reg = set_reg;
993 s->xml = xml;
994
pbrook56aebc82008-10-11 17:55:29 +0000995 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200996 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000997 *p = s;
998 if (g_pos) {
999 if (g_pos != s->base_reg) {
1000 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1001 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001002 }
1003 }
1004}
1005
aliguoria1d1bb32008-11-18 20:07:32 +00001006#ifndef CONFIG_USER_ONLY
1007static const int xlat_gdb_type[] = {
1008 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1009 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1010 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1011};
1012#endif
1013
aliguori880a7572008-11-18 20:30:24 +00001014static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001015{
Andreas Färber182735e2013-05-29 22:29:20 +02001016 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001017 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001018 int err = 0;
1019
Andreas Färber62278812013-06-27 17:12:06 +02001020 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001021 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001022 }
aliguorie22a25c2009-03-12 20:12:48 +00001023
aliguoria1d1bb32008-11-18 20:07:32 +00001024 switch (type) {
1025 case GDB_BREAKPOINT_SW:
1026 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001027 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1028 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001029 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1030 if (err)
1031 break;
1032 }
1033 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001034#ifndef CONFIG_USER_ONLY
1035 case GDB_WATCHPOINT_WRITE:
1036 case GDB_WATCHPOINT_READ:
1037 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001038 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1039 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001040 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1041 NULL);
1042 if (err)
1043 break;
1044 }
1045 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001046#endif
1047 default:
1048 return -ENOSYS;
1049 }
1050}
1051
aliguori880a7572008-11-18 20:30:24 +00001052static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001053{
Andreas Färber182735e2013-05-29 22:29:20 +02001054 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001055 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001056 int err = 0;
1057
Andreas Färber62278812013-06-27 17:12:06 +02001058 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001059 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001060 }
aliguorie22a25c2009-03-12 20:12:48 +00001061
aliguoria1d1bb32008-11-18 20:07:32 +00001062 switch (type) {
1063 case GDB_BREAKPOINT_SW:
1064 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001065 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1066 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001067 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1068 if (err)
1069 break;
1070 }
1071 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001072#ifndef CONFIG_USER_ONLY
1073 case GDB_WATCHPOINT_WRITE:
1074 case GDB_WATCHPOINT_READ:
1075 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001076 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1077 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001078 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1079 if (err)
1080 break;
1081 }
1082 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001083#endif
1084 default:
1085 return -ENOSYS;
1086 }
1087}
1088
aliguori880a7572008-11-18 20:30:24 +00001089static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001090{
Andreas Färber182735e2013-05-29 22:29:20 +02001091 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001092 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001093
aliguorie22a25c2009-03-12 20:12:48 +00001094 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001095 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001096 return;
1097 }
1098
Andreas Färber182735e2013-05-29 22:29:20 +02001099 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1100 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001101 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001102#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001103 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001104#endif
aliguori880a7572008-11-18 20:30:24 +00001105 }
aliguoria1d1bb32008-11-18 20:07:32 +00001106}
1107
aurel32fab9d282009-04-08 21:29:37 +00001108static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1109{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001110 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001111 CPUClass *cc = CPU_GET_CLASS(cpu);
1112
1113 cpu_synchronize_state(cpu);
1114 if (cc->set_pc) {
1115 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001116 }
aurel32fab9d282009-04-08 21:29:37 +00001117}
1118
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001119static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001120{
Andreas Färber0d342822012-12-17 07:12:13 +01001121 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001122
Andreas Färber182735e2013-05-29 22:29:20 +02001123 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001124 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001125 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001126 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001127 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001128
1129 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001130}
1131
aliguori880a7572008-11-18 20:30:24 +00001132static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001133{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001134 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001135 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001136 uint32_t thread;
1137 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001138 char buf[MAX_PACKET_LENGTH];
1139 uint8_t mem_buf[MAX_PACKET_LENGTH];
1140 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001141 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001142
bellard858693c2004-03-31 18:52:07 +00001143#ifdef DEBUG_GDB
1144 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001145#endif
bellard858693c2004-03-31 18:52:07 +00001146 p = line_buf;
1147 ch = *p++;
1148 switch(ch) {
1149 case '?':
bellard1fddef42005-04-17 19:16:13 +00001150 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001151 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001152 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001153 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001154 /* Remove all the breakpoints when this query is issued,
1155 * because gdb is doing and initial connect and the state
1156 * should be cleaned up.
1157 */
aliguori880a7572008-11-18 20:30:24 +00001158 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001159 break;
1160 case 'c':
1161 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001162 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001163 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001164 }
aurel32ca587a82008-12-18 22:44:13 +00001165 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001166 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001167 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001168 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001169 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1170 if (s->signal == -1)
1171 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001172 gdb_continue(s);
1173 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001174 case 'v':
1175 if (strncmp(p, "Cont", 4) == 0) {
1176 int res_signal, res_thread;
1177
1178 p += 4;
1179 if (*p == '?') {
1180 put_packet(s, "vCont;c;C;s;S");
1181 break;
1182 }
1183 res = 0;
1184 res_signal = 0;
1185 res_thread = 0;
1186 while (*p) {
1187 int action, signal;
1188
1189 if (*p++ != ';') {
1190 res = 0;
1191 break;
1192 }
1193 action = *p++;
1194 signal = 0;
1195 if (action == 'C' || action == 'S') {
1196 signal = strtoul(p, (char **)&p, 16);
1197 } else if (action != 'c' && action != 's') {
1198 res = 0;
1199 break;
1200 }
1201 thread = 0;
1202 if (*p == ':') {
1203 thread = strtoull(p+1, (char **)&p, 16);
1204 }
1205 action = tolower(action);
1206 if (res == 0 || (res == 'c' && action == 's')) {
1207 res = action;
1208 res_signal = signal;
1209 res_thread = thread;
1210 }
1211 }
1212 if (res) {
1213 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001214 cpu = find_cpu(res_thread);
1215 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001216 put_packet(s, "E22");
1217 break;
1218 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001219 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001220 }
1221 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001222 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001223 }
1224 s->signal = res_signal;
1225 gdb_continue(s);
1226 return RS_IDLE;
1227 }
1228 break;
1229 } else {
1230 goto unknown_command;
1231 }
edgar_igl7d03f822008-05-17 18:58:29 +00001232 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001233#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001234 /* Kill the target */
1235 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1236 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001237#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001238 case 'D':
1239 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001240 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001241 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001242 gdb_continue(s);
1243 put_packet(s, "OK");
1244 break;
bellard858693c2004-03-31 18:52:07 +00001245 case 's':
1246 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001247 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001248 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001249 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001250 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001251 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001252 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001253 case 'F':
1254 {
1255 target_ulong ret;
1256 target_ulong err;
1257
1258 ret = strtoull(p, (char **)&p, 16);
1259 if (*p == ',') {
1260 p++;
1261 err = strtoull(p, (char **)&p, 16);
1262 } else {
1263 err = 0;
1264 }
1265 if (*p == ',')
1266 p++;
1267 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001268 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001269 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001270 s->current_syscall_cb = NULL;
1271 }
pbrooka2d1eba2007-01-28 03:10:55 +00001272 if (type == 'C') {
1273 put_packet(s, "T02");
1274 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001275 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001276 }
1277 }
1278 break;
bellard858693c2004-03-31 18:52:07 +00001279 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001280 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001281 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001282 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001283 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001284 len += reg_size;
1285 }
1286 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001287 put_packet(s, buf);
1288 break;
1289 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001290 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001291 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001292 len = strlen(p) / 2;
1293 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001294 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001295 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001296 len -= reg_size;
1297 registers += reg_size;
1298 }
bellard858693c2004-03-31 18:52:07 +00001299 put_packet(s, "OK");
1300 break;
1301 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001302 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001303 if (*p == ',')
1304 p++;
bellard9d9754a2006-06-25 15:32:37 +00001305 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001306 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001307 put_packet (s, "E14");
1308 } else {
1309 memtohex(buf, mem_buf, len);
1310 put_packet(s, buf);
1311 }
bellard858693c2004-03-31 18:52:07 +00001312 break;
1313 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001314 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001315 if (*p == ',')
1316 p++;
bellard9d9754a2006-06-25 15:32:37 +00001317 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001318 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001319 p++;
1320 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001321 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001322 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001323 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001324 } else {
bellard858693c2004-03-31 18:52:07 +00001325 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001326 }
bellard858693c2004-03-31 18:52:07 +00001327 break;
pbrook56aebc82008-10-11 17:55:29 +00001328 case 'p':
1329 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1330 This works, but can be very slow. Anything new enough to
1331 understand XML also knows how to use this properly. */
1332 if (!gdb_has_xml)
1333 goto unknown_command;
1334 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001335 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001336 if (reg_size) {
1337 memtohex(buf, mem_buf, reg_size);
1338 put_packet(s, buf);
1339 } else {
1340 put_packet(s, "E14");
1341 }
1342 break;
1343 case 'P':
1344 if (!gdb_has_xml)
1345 goto unknown_command;
1346 addr = strtoull(p, (char **)&p, 16);
1347 if (*p == '=')
1348 p++;
1349 reg_size = strlen(p) / 2;
1350 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001351 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001352 put_packet(s, "OK");
1353 break;
bellard858693c2004-03-31 18:52:07 +00001354 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001355 case 'z':
1356 type = strtoul(p, (char **)&p, 16);
1357 if (*p == ',')
1358 p++;
bellard9d9754a2006-06-25 15:32:37 +00001359 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001360 if (*p == ',')
1361 p++;
bellard9d9754a2006-06-25 15:32:37 +00001362 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001363 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001364 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001365 else
aliguori880a7572008-11-18 20:30:24 +00001366 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001367 if (res >= 0)
1368 put_packet(s, "OK");
1369 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001370 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001371 else
1372 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001373 break;
aliguori880a7572008-11-18 20:30:24 +00001374 case 'H':
1375 type = *p++;
1376 thread = strtoull(p, (char **)&p, 16);
1377 if (thread == -1 || thread == 0) {
1378 put_packet(s, "OK");
1379 break;
1380 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001381 cpu = find_cpu(thread);
1382 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001383 put_packet(s, "E22");
1384 break;
1385 }
1386 switch (type) {
1387 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001388 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001389 put_packet(s, "OK");
1390 break;
1391 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001392 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001393 put_packet(s, "OK");
1394 break;
1395 default:
1396 put_packet(s, "E22");
1397 break;
1398 }
1399 break;
1400 case 'T':
1401 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001402 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001403
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001404 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001405 put_packet(s, "OK");
1406 } else {
aliguori880a7572008-11-18 20:30:24 +00001407 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001408 }
aliguori880a7572008-11-18 20:30:24 +00001409 break;
pbrook978efd62006-06-17 18:30:42 +00001410 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001411 case 'Q':
1412 /* parse any 'q' packets here */
1413 if (!strcmp(p,"qemu.sstepbits")) {
1414 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001415 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1416 SSTEP_ENABLE,
1417 SSTEP_NOIRQ,
1418 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001419 put_packet(s, buf);
1420 break;
1421 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1422 /* Display or change the sstep_flags */
1423 p += 10;
1424 if (*p != '=') {
1425 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001426 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001427 put_packet(s, buf);
1428 break;
1429 }
1430 p++;
1431 type = strtoul(p, (char **)&p, 16);
1432 sstep_flags = type;
1433 put_packet(s, "OK");
1434 break;
aliguori880a7572008-11-18 20:30:24 +00001435 } else if (strcmp(p,"C") == 0) {
1436 /* "Current thread" remains vague in the spec, so always return
1437 * the first CPU (gdb returns the first thread). */
1438 put_packet(s, "QC1");
1439 break;
1440 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001441 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001442 goto report_cpuinfo;
1443 } else if (strcmp(p,"sThreadInfo") == 0) {
1444 report_cpuinfo:
1445 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001446 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001447 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001448 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001449 } else
1450 put_packet(s, "l");
1451 break;
1452 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1453 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001454 cpu = find_cpu(thread);
1455 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001456 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001457 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001458 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001459 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001460 memtohex(buf, mem_buf, len);
1461 put_packet(s, buf);
1462 }
aliguori880a7572008-11-18 20:30:24 +00001463 break;
edgar_igl60897d32008-05-09 08:25:14 +00001464 }
blueswir10b8a9882009-03-07 10:51:36 +00001465#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001466 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001467 CPUArchState *env = s->c_cpu->env_ptr;
1468 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001469
blueswir1363a37d2008-08-21 17:58:08 +00001470 snprintf(buf, sizeof(buf),
1471 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1472 ";Bss=" TARGET_ABI_FMT_lx,
1473 ts->info->code_offset,
1474 ts->info->data_offset,
1475 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001476 put_packet(s, buf);
1477 break;
1478 }
blueswir10b8a9882009-03-07 10:51:36 +00001479#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001480 else if (strncmp(p, "Rcmd,", 5) == 0) {
1481 int len = strlen(p + 5);
1482
1483 if ((len % 2) != 0) {
1484 put_packet(s, "E01");
1485 break;
1486 }
1487 hextomem(mem_buf, p + 5, len);
1488 len = len / 2;
1489 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001490 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001491 put_packet(s, "OK");
1492 break;
1493 }
blueswir10b8a9882009-03-07 10:51:36 +00001494#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001495 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001496 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001497#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001498 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001499#endif
1500 put_packet(s, buf);
1501 break;
1502 }
1503#ifdef GDB_CORE_XML
1504 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1505 const char *xml;
1506 target_ulong total_len;
1507
1508 gdb_has_xml = 1;
1509 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001510 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001511 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001512 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001513 put_packet(s, buf);
1514 break;
1515 }
1516
1517 if (*p == ':')
1518 p++;
1519 addr = strtoul(p, (char **)&p, 16);
1520 if (*p == ',')
1521 p++;
1522 len = strtoul(p, (char **)&p, 16);
1523
1524 total_len = strlen(xml);
1525 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001526 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001527 put_packet(s, buf);
1528 break;
1529 }
1530 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1531 len = (MAX_PACKET_LENGTH - 5) / 2;
1532 if (len < total_len - addr) {
1533 buf[0] = 'm';
1534 len = memtox(buf + 1, xml + addr, len);
1535 } else {
1536 buf[0] = 'l';
1537 len = memtox(buf + 1, xml + addr, total_len - addr);
1538 }
1539 put_packet_binary(s, buf, len + 1);
1540 break;
1541 }
1542#endif
1543 /* Unrecognised 'q' command. */
1544 goto unknown_command;
1545
bellard858693c2004-03-31 18:52:07 +00001546 default:
pbrook56aebc82008-10-11 17:55:29 +00001547 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001548 /* put empty packet */
1549 buf[0] = '\0';
1550 put_packet(s, buf);
1551 break;
1552 }
1553 return RS_IDLE;
1554}
1555
Andreas Färber64f6b342013-05-27 02:06:09 +02001556void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001557{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001558 gdbserver_state->c_cpu = cpu;
1559 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001560}
1561
bellard1fddef42005-04-17 19:16:13 +00001562#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001563static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001564{
aliguori880a7572008-11-18 20:30:24 +00001565 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001566 CPUArchState *env = s->c_cpu->env_ptr;
1567 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001568 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001569 const char *type;
bellard858693c2004-03-31 18:52:07 +00001570 int ret;
1571
Meador Ingecdb432b2012-03-15 17:49:45 +00001572 if (running || s->state == RS_INACTIVE) {
1573 return;
1574 }
1575 /* Is there a GDB syscall waiting to be sent? */
1576 if (s->current_syscall_cb) {
1577 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001578 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001579 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001580 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001581 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00001582 if (env->watchpoint_hit) {
1583 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001584 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001585 type = "r";
1586 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001587 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001588 type = "a";
1589 break;
1590 default:
1591 type = "";
1592 break;
1593 }
aliguori880a7572008-11-18 20:30:24 +00001594 snprintf(buf, sizeof(buf),
1595 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001596 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00001597 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001598 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001599 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001600 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001601 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001602 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001603 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001604 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001605 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001606 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001607 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001608 ret = GDB_SIGNAL_QUIT;
1609 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001610 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001611 ret = GDB_SIGNAL_IO;
1612 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001613 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001614 ret = GDB_SIGNAL_ALRM;
1615 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001616 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001617 ret = GDB_SIGNAL_ABRT;
1618 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001619 case RUN_STATE_SAVE_VM:
1620 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001621 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001622 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001623 ret = GDB_SIGNAL_XCPU;
1624 break;
1625 default:
1626 ret = GDB_SIGNAL_UNKNOWN;
1627 break;
bellardbbeb7b52006-04-23 18:42:15 +00001628 }
Andreas Färber0d342822012-12-17 07:12:13 +01001629 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001630
1631send_packet:
bellard858693c2004-03-31 18:52:07 +00001632 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001633
1634 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001635 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001636}
bellard1fddef42005-04-17 19:16:13 +00001637#endif
bellard858693c2004-03-31 18:52:07 +00001638
pbrooka2d1eba2007-01-28 03:10:55 +00001639/* Send a gdb syscall request.
1640 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001641 %x - target_ulong argument printed in hex.
1642 %lx - 64-bit argument printed in hex.
1643 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001644void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001645{
1646 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001647 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001648 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001649 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001650 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001651 GDBState *s;
1652
aliguori880a7572008-11-18 20:30:24 +00001653 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001654 if (!s)
1655 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001656 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001657#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001658 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001659#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001660 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001661 p = s->syscall_buf;
1662 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001663 *(p++) = 'F';
1664 while (*fmt) {
1665 if (*fmt == '%') {
1666 fmt++;
1667 switch (*fmt++) {
1668 case 'x':
1669 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001670 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001671 break;
pbrooka87295e2007-05-26 15:09:38 +00001672 case 'l':
1673 if (*(fmt++) != 'x')
1674 goto bad_format;
1675 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001676 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001677 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001678 case 's':
1679 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001680 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001681 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001682 break;
1683 default:
pbrooka87295e2007-05-26 15:09:38 +00001684 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001685 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1686 fmt - 1);
1687 break;
1688 }
1689 } else {
1690 *(p++) = *(fmt++);
1691 }
1692 }
pbrook8a93e022007-08-06 13:19:15 +00001693 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001694 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001695#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001696 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001697 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001698#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001699 /* In this case wait to send the syscall packet until notification that
1700 the CPU has stopped. This must be done because if the packet is sent
1701 now the reply from the syscall request could be received while the CPU
1702 is still in the running state, which can cause packets to be dropped
1703 and state transition 'T' packets to be sent while the syscall is still
1704 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001705 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001706#endif
1707}
1708
bellard6a00d602005-11-21 23:25:50 +00001709static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001710{
1711 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001712 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001713
bellard1fddef42005-04-17 19:16:13 +00001714#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001715 if (s->last_packet_len) {
1716 /* Waiting for a response to the last packet. If we see the start
1717 of a new command then abandon the previous response. */
1718 if (ch == '-') {
1719#ifdef DEBUG_GDB
1720 printf("Got NACK, retransmitting\n");
1721#endif
thsffe8ab82007-12-16 03:16:05 +00001722 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001723 }
1724#ifdef DEBUG_GDB
1725 else if (ch == '+')
1726 printf("Got ACK\n");
1727 else
1728 printf("Got '%c' when expecting ACK/NACK\n", ch);
1729#endif
1730 if (ch == '+' || ch == '$')
1731 s->last_packet_len = 0;
1732 if (ch != '$')
1733 return;
1734 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001735 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001736 /* when the CPU is running, we cannot do anything except stop
1737 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001738 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001739 } else
bellard1fddef42005-04-17 19:16:13 +00001740#endif
bellard41625032005-04-24 10:07:11 +00001741 {
bellard858693c2004-03-31 18:52:07 +00001742 switch(s->state) {
1743 case RS_IDLE:
1744 if (ch == '$') {
1745 s->line_buf_index = 0;
1746 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001747 }
1748 break;
bellard858693c2004-03-31 18:52:07 +00001749 case RS_GETLINE:
1750 if (ch == '#') {
1751 s->state = RS_CHKSUM1;
1752 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1753 s->state = RS_IDLE;
1754 } else {
1755 s->line_buf[s->line_buf_index++] = ch;
1756 }
1757 break;
1758 case RS_CHKSUM1:
1759 s->line_buf[s->line_buf_index] = '\0';
1760 s->line_csum = fromhex(ch) << 4;
1761 s->state = RS_CHKSUM2;
1762 break;
1763 case RS_CHKSUM2:
1764 s->line_csum |= fromhex(ch);
1765 csum = 0;
1766 for(i = 0; i < s->line_buf_index; i++) {
1767 csum += s->line_buf[i];
1768 }
1769 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001770 reply = '-';
1771 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001772 s->state = RS_IDLE;
1773 } else {
ths60fe76f2007-12-16 03:02:09 +00001774 reply = '+';
1775 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001776 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001777 }
bellardb4608c02003-06-27 17:34:32 +00001778 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001779 default:
1780 abort();
bellardb4608c02003-06-27 17:34:32 +00001781 }
1782 }
bellard858693c2004-03-31 18:52:07 +00001783}
1784
Paul Brook0e1c9c52010-06-16 13:03:51 +01001785/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001786void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001787{
1788 GDBState *s;
1789 char buf[4];
1790
1791 s = gdbserver_state;
1792 if (!s) {
1793 return;
1794 }
1795#ifdef CONFIG_USER_ONLY
1796 if (gdbserver_fd < 0 || s->fd < 0) {
1797 return;
1798 }
1799#endif
1800
1801 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1802 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001803
1804#ifndef CONFIG_USER_ONLY
1805 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001806 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001807 }
1808#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001809}
1810
bellard1fddef42005-04-17 19:16:13 +00001811#ifdef CONFIG_USER_ONLY
1812int
aurel32ca587a82008-12-18 22:44:13 +00001813gdb_queuesig (void)
1814{
1815 GDBState *s;
1816
1817 s = gdbserver_state;
1818
1819 if (gdbserver_fd < 0 || s->fd < 0)
1820 return 0;
1821 else
1822 return 1;
1823}
1824
1825int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001826gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001827{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001828 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001829 GDBState *s;
1830 char buf[256];
1831 int n;
bellard1fddef42005-04-17 19:16:13 +00001832
Andreas Färber5ca666c2013-06-24 19:20:57 +02001833 s = gdbserver_state;
1834 if (gdbserver_fd < 0 || s->fd < 0) {
1835 return sig;
bellard1fddef42005-04-17 19:16:13 +00001836 }
1837
Andreas Färber5ca666c2013-06-24 19:20:57 +02001838 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001839 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02001840 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00001841
Andreas Färber5ca666c2013-06-24 19:20:57 +02001842 if (sig != 0) {
1843 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1844 put_packet(s, buf);
1845 }
1846 /* put_packet() might have detected that the peer terminated the
1847 connection. */
1848 if (s->fd < 0) {
1849 return sig;
1850 }
1851
1852 sig = 0;
1853 s->state = RS_IDLE;
1854 s->running_state = 0;
1855 while (s->running_state == 0) {
1856 n = read(s->fd, buf, 256);
1857 if (n > 0) {
1858 int i;
1859
1860 for (i = 0; i < n; i++) {
1861 gdb_read_byte(s, buf[i]);
1862 }
1863 } else if (n == 0 || errno != EAGAIN) {
1864 /* XXX: Connection closed. Should probably wait for another
1865 connection before continuing. */
1866 return sig;
bellard1fddef42005-04-17 19:16:13 +00001867 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001868 }
1869 sig = s->signal;
1870 s->signal = 0;
1871 return sig;
bellard1fddef42005-04-17 19:16:13 +00001872}
bellarde9009672005-04-26 20:42:36 +00001873
aurel32ca587a82008-12-18 22:44:13 +00001874/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001875void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001876{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001877 GDBState *s;
1878 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001879
Andreas Färber5ca666c2013-06-24 19:20:57 +02001880 s = gdbserver_state;
1881 if (gdbserver_fd < 0 || s->fd < 0) {
1882 return;
1883 }
aurel32ca587a82008-12-18 22:44:13 +00001884
Andreas Färber5ca666c2013-06-24 19:20:57 +02001885 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1886 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001887}
bellard1fddef42005-04-17 19:16:13 +00001888
aliguori880a7572008-11-18 20:30:24 +00001889static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001890{
1891 GDBState *s;
1892 struct sockaddr_in sockaddr;
1893 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001894 int fd;
bellard858693c2004-03-31 18:52:07 +00001895
1896 for(;;) {
1897 len = sizeof(sockaddr);
1898 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1899 if (fd < 0 && errno != EINTR) {
1900 perror("accept");
1901 return;
1902 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001903#ifndef _WIN32
1904 fcntl(fd, F_SETFD, FD_CLOEXEC);
1905#endif
bellard858693c2004-03-31 18:52:07 +00001906 break;
1907 }
1908 }
1909
1910 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001911 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00001912
Anthony Liguori7267c092011-08-20 22:09:37 -05001913 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001914 s->c_cpu = first_cpu;
1915 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00001916 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00001917 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00001918
aliguori880a7572008-11-18 20:30:24 +00001919 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00001920
bellard858693c2004-03-31 18:52:07 +00001921 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00001922}
1923
1924static int gdbserver_open(int port)
1925{
1926 struct sockaddr_in sockaddr;
1927 int fd, val, ret;
1928
1929 fd = socket(PF_INET, SOCK_STREAM, 0);
1930 if (fd < 0) {
1931 perror("socket");
1932 return -1;
1933 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001934#ifndef _WIN32
1935 fcntl(fd, F_SETFD, FD_CLOEXEC);
1936#endif
bellard858693c2004-03-31 18:52:07 +00001937
1938 /* allow fast reuse */
1939 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01001940 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00001941
1942 sockaddr.sin_family = AF_INET;
1943 sockaddr.sin_port = htons(port);
1944 sockaddr.sin_addr.s_addr = 0;
1945 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1946 if (ret < 0) {
1947 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001948 close(fd);
bellard858693c2004-03-31 18:52:07 +00001949 return -1;
1950 }
1951 ret = listen(fd, 0);
1952 if (ret < 0) {
1953 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001954 close(fd);
bellard858693c2004-03-31 18:52:07 +00001955 return -1;
1956 }
bellard858693c2004-03-31 18:52:07 +00001957 return fd;
1958}
1959
1960int gdbserver_start(int port)
1961{
1962 gdbserver_fd = gdbserver_open(port);
1963 if (gdbserver_fd < 0)
1964 return -1;
1965 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00001966 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00001967 return 0;
1968}
aurel322b1319c2008-12-18 22:44:04 +00001969
1970/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001971void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00001972{
1973 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00001974 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00001975 return;
1976 close(s->fd);
1977 s->fd = -1;
1978 cpu_breakpoint_remove_all(env, BP_GDB);
1979 cpu_watchpoint_remove_all(env, BP_GDB);
1980}
pbrook4046d912007-01-28 01:53:16 +00001981#else
thsaa1f17c2007-07-11 22:48:58 +00001982static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001983{
pbrook56aebc82008-10-11 17:55:29 +00001984 /* We can handle an arbitrarily large amount of data.
1985 Pick the maximum packet size, which is as good as anything. */
1986 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001987}
1988
thsaa1f17c2007-07-11 22:48:58 +00001989static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001990{
pbrook4046d912007-01-28 01:53:16 +00001991 int i;
1992
1993 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00001994 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00001995 }
1996}
1997
1998static void gdb_chr_event(void *opaque, int event)
1999{
2000 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302001 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002002 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002003 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002004 break;
2005 default:
2006 break;
2007 }
2008}
2009
aliguori8a34a0f2009-03-05 23:01:55 +00002010static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2011{
2012 char buf[MAX_PACKET_LENGTH];
2013
2014 buf[0] = 'O';
2015 if (len > (MAX_PACKET_LENGTH/2) - 1)
2016 len = (MAX_PACKET_LENGTH/2) - 1;
2017 memtohex(buf + 1, (uint8_t *)msg, len);
2018 put_packet(s, buf);
2019}
2020
2021static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2022{
2023 const char *p = (const char *)buf;
2024 int max_sz;
2025
2026 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2027 for (;;) {
2028 if (len <= max_sz) {
2029 gdb_monitor_output(gdbserver_state, p, len);
2030 break;
2031 }
2032 gdb_monitor_output(gdbserver_state, p, max_sz);
2033 p += max_sz;
2034 len -= max_sz;
2035 }
2036 return len;
2037}
2038
aliguori59030a82009-04-05 18:43:41 +00002039#ifndef _WIN32
2040static void gdb_sigterm_handler(int signal)
2041{
Luiz Capitulino13548692011-07-29 15:36:43 -03002042 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002043 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002044 }
aliguori59030a82009-04-05 18:43:41 +00002045}
2046#endif
2047
2048int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002049{
2050 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002051 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002052 CharDriverState *chr = NULL;
2053 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002054
aliguori59030a82009-04-05 18:43:41 +00002055 if (!device)
2056 return -1;
2057 if (strcmp(device, "none") != 0) {
2058 if (strstart(device, "tcp:", NULL)) {
2059 /* enforce required TCP attributes */
2060 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2061 "%s,nowait,nodelay,server", device);
2062 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002063 }
aliguori59030a82009-04-05 18:43:41 +00002064#ifndef _WIN32
2065 else if (strcmp(device, "stdio") == 0) {
2066 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002067
aliguori59030a82009-04-05 18:43:41 +00002068 memset(&act, 0, sizeof(act));
2069 act.sa_handler = gdb_sigterm_handler;
2070 sigaction(SIGINT, &act, NULL);
2071 }
2072#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002073 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002074 if (!chr)
2075 return -1;
2076
Hans de Goede456d6062013-03-27 20:29:40 +01002077 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002078 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2079 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002080 }
2081
aliguori36556b22009-03-28 18:05:53 +00002082 s = gdbserver_state;
2083 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002084 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002085 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002086
aliguori36556b22009-03-28 18:05:53 +00002087 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2088
2089 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002090 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002091 mon_chr->chr_write = gdb_monitor_write;
2092 monitor_init(mon_chr, 0);
2093 } else {
2094 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002095 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002096 mon_chr = s->mon_chr;
2097 memset(s, 0, sizeof(GDBState));
2098 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002099 s->c_cpu = first_cpu;
2100 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002101 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002102 s->state = chr ? RS_IDLE : RS_INACTIVE;
2103 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002104 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002105
pbrook4046d912007-01-28 01:53:16 +00002106 return 0;
2107}
2108#endif