blob: 7ee08700656efbf766ef3dc7b14bd4ff16ce7a80 [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
Jia Liufc043552012-07-20 15:50:50 +0800557static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
558{
559 if (n < 32) {
560 GET_REG32(env->gpr[n]);
561 } else {
562 switch (n) {
563 case 32: /* PPC */
564 GET_REG32(env->ppc);
Jia Liufc043552012-07-20 15:50:50 +0800565
566 case 33: /* NPC */
567 GET_REG32(env->npc);
Jia Liufc043552012-07-20 15:50:50 +0800568
569 case 34: /* SR */
570 GET_REG32(env->sr);
Jia Liufc043552012-07-20 15:50:50 +0800571
572 default:
573 break;
574 }
575 }
576 return 0;
577}
578
579static int cpu_gdb_write_register(CPUOpenRISCState *env,
580 uint8_t *mem_buf, int n)
581{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200582 OpenRISCCPU *cpu = openrisc_env_get_cpu(env);
583 CPUClass *cc = CPU_GET_CLASS(cpu);
Jia Liufc043552012-07-20 15:50:50 +0800584 uint32_t tmp;
585
Andreas Färbera0e372f2013-06-28 23:18:47 +0200586 if (n > cc->gdb_num_core_regs) {
Jia Liufc043552012-07-20 15:50:50 +0800587 return 0;
588 }
589
590 tmp = ldl_p(mem_buf);
591
592 if (n < 32) {
593 env->gpr[n] = tmp;
594 } else {
595 switch (n) {
596 case 32: /* PPC */
597 env->ppc = tmp;
598 break;
599
600 case 33: /* NPC */
601 env->npc = tmp;
602 break;
603
604 case 34: /* SR */
605 env->sr = tmp;
606 break;
607
608 default:
609 break;
610 }
611 }
612 return 4;
613}
bellardfdf9b3e2006-04-27 21:07:38 +0000614#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +0000615
616/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +0000617/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +0000618
Andreas Färberf3840912012-02-20 06:44:56 +0100619static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000620{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200621 switch (n) {
622 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +0000623 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
624 GET_REGL(env->gregs[n + 16]);
625 } else {
626 GET_REGL(env->gregs[n]);
627 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200628 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +0900629 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200630 case 16:
631 GET_REGL(env->pc);
632 case 17:
633 GET_REGL(env->pr);
634 case 18:
635 GET_REGL(env->gbr);
636 case 19:
637 GET_REGL(env->vbr);
638 case 20:
639 GET_REGL(env->mach);
640 case 21:
641 GET_REGL(env->macl);
642 case 22:
643 GET_REGL(env->sr);
644 case 23:
645 GET_REGL(env->fpul);
646 case 24:
647 GET_REGL(env->fpscr);
648 case 25 ... 40:
649 if (env->fpscr & FPSCR_FR) {
650 stfl_p(mem_buf, env->fregs[n - 9]);
651 } else {
652 stfl_p(mem_buf, env->fregs[n - 25]);
653 }
654 return 4;
655 case 41:
656 GET_REGL(env->ssr);
657 case 42:
658 GET_REGL(env->spc);
659 case 43 ... 50:
660 GET_REGL(env->gregs[n - 43]);
661 case 51 ... 58:
662 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +0000663 }
bellardfdf9b3e2006-04-27 21:07:38 +0000664
pbrook56aebc82008-10-11 17:55:29 +0000665 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +0000666}
667
Andreas Färberf3840912012-02-20 06:44:56 +0100668static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000669{
pbrook56aebc82008-10-11 17:55:29 +0000670 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200671 case 0 ... 7:
672 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
673 env->gregs[n + 16] = ldl_p(mem_buf);
674 } else {
675 env->gregs[n] = ldl_p(mem_buf);
676 }
677 break;
678 case 8 ... 15:
679 env->gregs[n] = ldl_p(mem_buf);
680 break;
681 case 16:
682 env->pc = ldl_p(mem_buf);
683 break;
684 case 17:
685 env->pr = ldl_p(mem_buf);
686 break;
687 case 18:
688 env->gbr = ldl_p(mem_buf);
689 break;
690 case 19:
691 env->vbr = ldl_p(mem_buf);
692 break;
693 case 20:
694 env->mach = ldl_p(mem_buf);
695 break;
696 case 21:
697 env->macl = ldl_p(mem_buf);
698 break;
699 case 22:
700 env->sr = ldl_p(mem_buf);
701 break;
702 case 23:
703 env->fpul = ldl_p(mem_buf);
704 break;
705 case 24:
706 env->fpscr = ldl_p(mem_buf);
707 break;
708 case 25 ... 40:
709 if (env->fpscr & FPSCR_FR) {
710 env->fregs[n - 9] = ldfl_p(mem_buf);
711 } else {
712 env->fregs[n - 25] = ldfl_p(mem_buf);
713 }
714 break;
715 case 41:
716 env->ssr = ldl_p(mem_buf);
717 break;
718 case 42:
719 env->spc = ldl_p(mem_buf);
720 break;
721 case 43 ... 50:
722 env->gregs[n - 43] = ldl_p(mem_buf);
723 break;
724 case 51 ... 58:
725 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
726 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200727 default:
728 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000729 }
730
731 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +0000732}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200733#elif defined (TARGET_MICROBLAZE)
734
Andreas Färberf3840912012-02-20 06:44:56 +0100735static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200736{
737 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200738 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200739 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200740 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200741 }
742 return 0;
743}
744
Andreas Färberf3840912012-02-20 06:44:56 +0100745static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200746{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200747 MicroBlazeCPU *cpu = mb_env_get_cpu(env);
748 CPUClass *cc = CPU_GET_CLASS(cpu);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200749 uint32_t tmp;
750
Andreas Färbera0e372f2013-06-28 23:18:47 +0200751 if (n > cc->gdb_num_core_regs) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200752 return 0;
753 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200754
755 tmp = ldl_p(mem_buf);
756
757 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200758 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200759 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200760 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200761 }
762 return 4;
763}
thsf1ccf902007-10-08 13:16:14 +0000764#elif defined (TARGET_CRIS)
765
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100766static int
Andreas Färberf3840912012-02-20 06:44:56 +0100767read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100768{
769 if (n < 15) {
770 GET_REG32(env->regs[n]);
771 }
772
773 if (n == 15) {
774 GET_REG32(env->pc);
775 }
776
777 if (n < 32) {
778 switch (n) {
779 case 16:
780 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100781 case 17:
782 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100783 case 20:
784 case 21:
785 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100786 default:
787 if (n >= 23) {
788 GET_REG32(env->pregs[n - 16]);
789 }
790 break;
791 }
792 }
793 return 0;
794}
795
Andreas Färberf3840912012-02-20 06:44:56 +0100796static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000797{
pbrook56aebc82008-10-11 17:55:29 +0000798 uint8_t srs;
799
Andreas Färber47d74ef2013-07-07 11:17:26 +0200800 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100801 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200802 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100803
pbrook56aebc82008-10-11 17:55:29 +0000804 srs = env->pregs[PR_SRS];
805 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200806 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +0000807 }
808
809 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200810 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +0000811 }
812 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200813 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +0000814 }
815 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200816 case 16:
817 GET_REG8(env->pregs[0]);
818 case 17:
819 GET_REG8(env->pregs[1]);
820 case 18:
821 GET_REG32(env->pregs[2]);
822 case 19:
823 GET_REG8(srs);
824 case 20:
825 GET_REG16(env->pregs[4]);
826 case 32:
827 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000828 }
829
830 return 0;
thsf1ccf902007-10-08 13:16:14 +0000831}
832
Andreas Färberf3840912012-02-20 06:44:56 +0100833static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000834{
pbrook56aebc82008-10-11 17:55:29 +0000835 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +0000836
Andreas Färber47d74ef2013-07-07 11:17:26 +0200837 if (n > 49) {
838 return 0;
839 }
thsf1ccf902007-10-08 13:16:14 +0000840
pbrook56aebc82008-10-11 17:55:29 +0000841 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +0000842
pbrook56aebc82008-10-11 17:55:29 +0000843 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200844 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000845 }
thsf1ccf902007-10-08 13:16:14 +0000846
edgar_igld7b69672008-10-11 19:32:21 +0000847 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200848 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +0000849 }
850
851 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +0000852 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200853 case 16:
854 return 1;
855 case 17:
856 return 1;
857 case 18:
858 env->pregs[PR_PID] = tmp;
859 break;
860 case 19:
861 return 1;
862 case 20:
863 return 2;
864 case 32:
865 env->pc = tmp;
866 break;
pbrook56aebc82008-10-11 17:55:29 +0000867 }
thsf1ccf902007-10-08 13:16:14 +0000868
pbrook56aebc82008-10-11 17:55:29 +0000869 return 4;
thsf1ccf902007-10-08 13:16:14 +0000870}
aurel3219bf5172008-12-07 23:26:32 +0000871#elif defined (TARGET_ALPHA)
872
Andreas Färberf3840912012-02-20 06:44:56 +0100873static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000874{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800875 uint64_t val;
876 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000877
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800878 switch (n) {
879 case 0 ... 30:
880 val = env->ir[n];
881 break;
882 case 32 ... 62:
883 d.d = env->fir[n - 32];
884 val = d.ll;
885 break;
886 case 63:
887 val = cpu_alpha_load_fpcr(env);
888 break;
889 case 64:
890 val = env->pc;
891 break;
892 case 66:
893 val = env->unique;
894 break;
895 case 31:
896 case 65:
897 /* 31 really is the zero register; 65 is unassigned in the
898 gdb protocol, but is still required to occupy 8 bytes. */
899 val = 0;
900 break;
901 default:
902 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000903 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800904 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +0000905}
906
Andreas Färberf3840912012-02-20 06:44:56 +0100907static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000908{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800909 target_ulong tmp = ldtul_p(mem_buf);
910 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000911
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800912 switch (n) {
913 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +0000914 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800915 break;
916 case 32 ... 62:
917 d.ll = tmp;
918 env->fir[n - 32] = d.d;
919 break;
920 case 63:
921 cpu_alpha_store_fpcr(env, tmp);
922 break;
923 case 64:
924 env->pc = tmp;
925 break;
926 case 66:
927 env->unique = tmp;
928 break;
929 case 31:
930 case 65:
931 /* 31 really is the zero register; 65 is unassigned in the
932 gdb protocol, but is still required to occupy 8 bytes. */
933 break;
934 default:
935 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000936 }
aurel3219bf5172008-12-07 23:26:32 +0000937 return 8;
938}
Alexander Grafafcb0e42009-12-05 12:44:29 +0100939#elif defined (TARGET_S390X)
940
Andreas Färberf3840912012-02-20 06:44:56 +0100941static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100942{
Richard Henderson6ee77b12012-08-23 10:44:45 -0700943 uint64_t val;
944 int cc_op;
945
Alexander Grafafcb0e42009-12-05 12:44:29 +0100946 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700947 case S390_PSWM_REGNUM:
948 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
949 val = deposit64(env->psw.mask, 44, 2, cc_op);
950 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700951 case S390_PSWA_REGNUM:
952 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700953 case S390_R0_REGNUM ... S390_R15_REGNUM:
954 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700955 case S390_A0_REGNUM ... S390_A15_REGNUM:
956 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700957 case S390_FPC_REGNUM:
958 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700959 case S390_F0_REGNUM ... S390_F15_REGNUM:
960 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +0100961 }
962
963 return 0;
964}
965
Andreas Färberf3840912012-02-20 06:44:56 +0100966static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100967{
968 target_ulong tmpl;
969 uint32_t tmp32;
970 int r = 8;
971 tmpl = ldtul_p(mem_buf);
972 tmp32 = ldl_p(mem_buf);
973
974 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700975 case S390_PSWM_REGNUM:
976 env->psw.mask = tmpl;
977 env->cc_op = extract64(tmpl, 44, 2);
978 break;
979 case S390_PSWA_REGNUM:
980 env->psw.addr = tmpl;
981 break;
982 case S390_R0_REGNUM ... S390_R15_REGNUM:
983 env->regs[n-S390_R0_REGNUM] = tmpl;
984 break;
985 case S390_A0_REGNUM ... S390_A15_REGNUM:
986 env->aregs[n-S390_A0_REGNUM] = tmp32;
987 r = 4;
988 break;
989 case S390_FPC_REGNUM:
990 env->fpc = tmp32;
991 r = 4;
992 break;
993 case S390_F0_REGNUM ... S390_F15_REGNUM:
994 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
995 break;
996 default:
997 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +0100998 }
Alexander Grafafcb0e42009-12-05 12:44:29 +0100999 return r;
1000}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001001#elif defined (TARGET_LM32)
1002
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001003#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001004
Andreas Färberf3840912012-02-20 06:44:56 +01001005static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001006{
1007 if (n < 32) {
1008 GET_REG32(env->regs[n]);
1009 } else {
1010 switch (n) {
1011 case 32:
1012 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001013 /* FIXME: put in right exception ID */
1014 case 33:
1015 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001016 case 34:
1017 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001018 case 35:
1019 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001020 case 36:
1021 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001022 case 37:
1023 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001024 case 38:
1025 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001026 }
1027 }
1028 return 0;
1029}
1030
Andreas Färberf3840912012-02-20 06:44:56 +01001031static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001032{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001033 LM32CPU *cpu = lm32_env_get_cpu(env);
1034 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001035 uint32_t tmp;
1036
Andreas Färbera0e372f2013-06-28 23:18:47 +02001037 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +01001038 return 0;
1039 }
1040
1041 tmp = ldl_p(mem_buf);
1042
1043 if (n < 32) {
1044 env->regs[n] = tmp;
1045 } else {
1046 switch (n) {
1047 case 32:
1048 env->pc = tmp;
1049 break;
1050 case 34:
1051 env->eba = tmp;
1052 break;
1053 case 35:
1054 env->deba = tmp;
1055 break;
1056 case 36:
1057 env->ie = tmp;
1058 break;
1059 case 37:
1060 lm32_pic_set_im(env->pic_state, tmp);
1061 break;
1062 case 38:
1063 lm32_pic_set_ip(env->pic_state, tmp);
1064 break;
1065 }
1066 }
1067 return 4;
1068}
Max Filippovccfcaba2011-09-06 03:55:52 +04001069#elif defined(TARGET_XTENSA)
1070
Andreas Färberf3840912012-02-20 06:44:56 +01001071static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001072{
1073 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1074
1075 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1076 return 0;
1077 }
1078
1079 switch (reg->type) {
1080 case 9: /*pc*/
1081 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +04001082
1083 case 1: /*ar*/
1084 xtensa_sync_phys_from_window(env);
1085 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001086
1087 case 2: /*SR*/
1088 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001089
1090 case 3: /*UR*/
1091 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001092
Max Filippovdd519cb2012-09-19 04:23:54 +04001093 case 4: /*f*/
1094 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +04001095
Max Filippovccfcaba2011-09-06 03:55:52 +04001096 case 8: /*a*/
1097 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001098
1099 default:
1100 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001101 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001102 return 0;
1103 }
1104}
1105
Andreas Färberf3840912012-02-20 06:44:56 +01001106static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001107{
1108 uint32_t tmp;
1109 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1110
1111 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1112 return 0;
1113 }
1114
1115 tmp = ldl_p(mem_buf);
1116
1117 switch (reg->type) {
1118 case 9: /*pc*/
1119 env->pc = tmp;
1120 break;
1121
1122 case 1: /*ar*/
1123 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1124 xtensa_sync_window_from_phys(env);
1125 break;
1126
1127 case 2: /*SR*/
1128 env->sregs[reg->targno & 0xff] = tmp;
1129 break;
1130
1131 case 3: /*UR*/
1132 env->uregs[reg->targno & 0xff] = tmp;
1133 break;
1134
Max Filippovdd519cb2012-09-19 04:23:54 +04001135 case 4: /*f*/
1136 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1137 break;
1138
Max Filippovccfcaba2011-09-06 03:55:52 +04001139 case 8: /*a*/
1140 env->regs[reg->targno & 0x0f] = tmp;
1141 break;
1142
1143 default:
1144 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001145 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001146 return 0;
1147 }
1148
1149 return 4;
1150}
bellard1fddef42005-04-17 19:16:13 +00001151#else
pbrook56aebc82008-10-11 17:55:29 +00001152
Andreas Färber9349b4f2012-03-14 01:38:32 +01001153static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001154{
1155 return 0;
1156}
1157
Andreas Färber9349b4f2012-03-14 01:38:32 +01001158static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001159{
pbrook56aebc82008-10-11 17:55:29 +00001160 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001161}
1162
1163#endif
bellardb4608c02003-06-27 17:34:32 +00001164
pbrook56aebc82008-10-11 17:55:29 +00001165#ifdef GDB_CORE_XML
1166/* Encode data using the encoding for 'x' packets. */
1167static int memtox(char *buf, const char *mem, int len)
1168{
1169 char *p = buf;
1170 char c;
1171
1172 while (len--) {
1173 c = *(mem++);
1174 switch (c) {
1175 case '#': case '$': case '*': case '}':
1176 *(p++) = '}';
1177 *(p++) = c ^ 0x20;
1178 break;
1179 default:
1180 *(p++) = c;
1181 break;
1182 }
1183 }
1184 return p - buf;
1185}
1186
aurel323faf7782008-12-07 23:26:17 +00001187static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001188{
pbrook56aebc82008-10-11 17:55:29 +00001189 size_t len;
1190 int i;
1191 const char *name;
1192 static char target_xml[1024];
1193
1194 len = 0;
1195 while (p[len] && p[len] != ':')
1196 len++;
1197 *newp = p + len;
1198
1199 name = NULL;
1200 if (strncmp(p, "target.xml", len) == 0) {
1201 /* Generate the XML description for this CPU. */
1202 if (!target_xml[0]) {
1203 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001204 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001205
blueswir15b3715b2008-10-25 11:18:12 +00001206 snprintf(target_xml, sizeof(target_xml),
1207 "<?xml version=\"1.0\"?>"
1208 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1209 "<target>"
1210 "<xi:include href=\"%s\"/>",
1211 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001212
Andreas Färbereac8b352013-06-28 21:11:37 +02001213 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001214 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1215 pstrcat(target_xml, sizeof(target_xml), r->xml);
1216 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001217 }
blueswir12dc766d2009-04-13 16:06:19 +00001218 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001219 }
1220 return target_xml;
1221 }
1222 for (i = 0; ; i++) {
1223 name = xml_builtin[i][0];
1224 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1225 break;
1226 }
1227 return name ? xml_builtin[i][1] : NULL;
1228}
1229#endif
1230
Andreas Färber385b9f02013-06-27 18:25:36 +02001231static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001232{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001233 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001234 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001235 GDBRegisterState *r;
1236
Andreas Färbera0e372f2013-06-28 23:18:47 +02001237 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001238 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001239 }
pbrook56aebc82008-10-11 17:55:29 +00001240
Andreas Färbereac8b352013-06-28 21:11:37 +02001241 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001242 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1243 return r->get_reg(env, mem_buf, reg - r->base_reg);
1244 }
1245 }
1246 return 0;
1247}
1248
Andreas Färber385b9f02013-06-27 18:25:36 +02001249static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001250{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001251 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001252 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001253 GDBRegisterState *r;
1254
Andreas Färbera0e372f2013-06-28 23:18:47 +02001255 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001256 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001257 }
pbrook56aebc82008-10-11 17:55:29 +00001258
Andreas Färbereac8b352013-06-28 21:11:37 +02001259 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001260 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1261 return r->set_reg(env, mem_buf, reg - r->base_reg);
1262 }
1263 }
1264 return 0;
1265}
1266
1267/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1268 specifies the first register number and these registers are included in
1269 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1270 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1271 */
1272
Andreas Färber22169d42013-06-28 21:27:39 +02001273void gdb_register_coprocessor(CPUState *cpu,
1274 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1275 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001276{
1277 GDBRegisterState *s;
1278 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001279
Andreas Färbereac8b352013-06-28 21:11:37 +02001280 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001281 while (*p) {
1282 /* Check for duplicates. */
1283 if (strcmp((*p)->xml, xml) == 0)
1284 return;
1285 p = &(*p)->next;
1286 }
Stefan Weil9643c252011-10-18 22:25:38 +02001287
1288 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001289 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02001290 s->num_regs = num_regs;
1291 s->get_reg = get_reg;
1292 s->set_reg = set_reg;
1293 s->xml = xml;
1294
pbrook56aebc82008-10-11 17:55:29 +00001295 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02001296 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00001297 *p = s;
1298 if (g_pos) {
1299 if (g_pos != s->base_reg) {
1300 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1301 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001302 }
1303 }
1304}
1305
aliguoria1d1bb32008-11-18 20:07:32 +00001306#ifndef CONFIG_USER_ONLY
1307static const int xlat_gdb_type[] = {
1308 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1309 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1310 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1311};
1312#endif
1313
aliguori880a7572008-11-18 20:30:24 +00001314static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001315{
Andreas Färber182735e2013-05-29 22:29:20 +02001316 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001317 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001318 int err = 0;
1319
Andreas Färber62278812013-06-27 17:12:06 +02001320 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001321 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001322 }
aliguorie22a25c2009-03-12 20:12:48 +00001323
aliguoria1d1bb32008-11-18 20:07:32 +00001324 switch (type) {
1325 case GDB_BREAKPOINT_SW:
1326 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001327 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1328 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001329 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1330 if (err)
1331 break;
1332 }
1333 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001334#ifndef CONFIG_USER_ONLY
1335 case GDB_WATCHPOINT_WRITE:
1336 case GDB_WATCHPOINT_READ:
1337 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001338 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1339 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001340 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1341 NULL);
1342 if (err)
1343 break;
1344 }
1345 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001346#endif
1347 default:
1348 return -ENOSYS;
1349 }
1350}
1351
aliguori880a7572008-11-18 20:30:24 +00001352static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001353{
Andreas Färber182735e2013-05-29 22:29:20 +02001354 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001355 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001356 int err = 0;
1357
Andreas Färber62278812013-06-27 17:12:06 +02001358 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001359 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001360 }
aliguorie22a25c2009-03-12 20:12:48 +00001361
aliguoria1d1bb32008-11-18 20:07:32 +00001362 switch (type) {
1363 case GDB_BREAKPOINT_SW:
1364 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001365 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1366 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001367 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1368 if (err)
1369 break;
1370 }
1371 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001372#ifndef CONFIG_USER_ONLY
1373 case GDB_WATCHPOINT_WRITE:
1374 case GDB_WATCHPOINT_READ:
1375 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001376 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1377 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001378 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1379 if (err)
1380 break;
1381 }
1382 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001383#endif
1384 default:
1385 return -ENOSYS;
1386 }
1387}
1388
aliguori880a7572008-11-18 20:30:24 +00001389static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001390{
Andreas Färber182735e2013-05-29 22:29:20 +02001391 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001392 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001393
aliguorie22a25c2009-03-12 20:12:48 +00001394 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001395 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001396 return;
1397 }
1398
Andreas Färber182735e2013-05-29 22:29:20 +02001399 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1400 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001401 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001402#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001403 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001404#endif
aliguori880a7572008-11-18 20:30:24 +00001405 }
aliguoria1d1bb32008-11-18 20:07:32 +00001406}
1407
aurel32fab9d282009-04-08 21:29:37 +00001408static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1409{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001410 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001411 CPUClass *cc = CPU_GET_CLASS(cpu);
1412
1413 cpu_synchronize_state(cpu);
1414 if (cc->set_pc) {
1415 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001416 }
aurel32fab9d282009-04-08 21:29:37 +00001417}
1418
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001419static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001420{
Andreas Färber0d342822012-12-17 07:12:13 +01001421 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001422
Andreas Färber182735e2013-05-29 22:29:20 +02001423 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001424 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001425 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001426 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001427 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001428
1429 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001430}
1431
aliguori880a7572008-11-18 20:30:24 +00001432static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001433{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001434 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001435 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001436 uint32_t thread;
1437 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001438 char buf[MAX_PACKET_LENGTH];
1439 uint8_t mem_buf[MAX_PACKET_LENGTH];
1440 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001441 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001442
bellard858693c2004-03-31 18:52:07 +00001443#ifdef DEBUG_GDB
1444 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001445#endif
bellard858693c2004-03-31 18:52:07 +00001446 p = line_buf;
1447 ch = *p++;
1448 switch(ch) {
1449 case '?':
bellard1fddef42005-04-17 19:16:13 +00001450 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001451 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001452 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001453 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001454 /* Remove all the breakpoints when this query is issued,
1455 * because gdb is doing and initial connect and the state
1456 * should be cleaned up.
1457 */
aliguori880a7572008-11-18 20:30:24 +00001458 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001459 break;
1460 case 'c':
1461 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001462 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001463 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001464 }
aurel32ca587a82008-12-18 22:44:13 +00001465 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001466 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001467 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001468 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001469 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1470 if (s->signal == -1)
1471 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001472 gdb_continue(s);
1473 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001474 case 'v':
1475 if (strncmp(p, "Cont", 4) == 0) {
1476 int res_signal, res_thread;
1477
1478 p += 4;
1479 if (*p == '?') {
1480 put_packet(s, "vCont;c;C;s;S");
1481 break;
1482 }
1483 res = 0;
1484 res_signal = 0;
1485 res_thread = 0;
1486 while (*p) {
1487 int action, signal;
1488
1489 if (*p++ != ';') {
1490 res = 0;
1491 break;
1492 }
1493 action = *p++;
1494 signal = 0;
1495 if (action == 'C' || action == 'S') {
1496 signal = strtoul(p, (char **)&p, 16);
1497 } else if (action != 'c' && action != 's') {
1498 res = 0;
1499 break;
1500 }
1501 thread = 0;
1502 if (*p == ':') {
1503 thread = strtoull(p+1, (char **)&p, 16);
1504 }
1505 action = tolower(action);
1506 if (res == 0 || (res == 'c' && action == 's')) {
1507 res = action;
1508 res_signal = signal;
1509 res_thread = thread;
1510 }
1511 }
1512 if (res) {
1513 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001514 cpu = find_cpu(res_thread);
1515 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001516 put_packet(s, "E22");
1517 break;
1518 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001519 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001520 }
1521 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001522 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001523 }
1524 s->signal = res_signal;
1525 gdb_continue(s);
1526 return RS_IDLE;
1527 }
1528 break;
1529 } else {
1530 goto unknown_command;
1531 }
edgar_igl7d03f822008-05-17 18:58:29 +00001532 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001533#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001534 /* Kill the target */
1535 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1536 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001537#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001538 case 'D':
1539 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001540 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001541 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001542 gdb_continue(s);
1543 put_packet(s, "OK");
1544 break;
bellard858693c2004-03-31 18:52:07 +00001545 case 's':
1546 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001547 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001548 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001549 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001550 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001551 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001552 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001553 case 'F':
1554 {
1555 target_ulong ret;
1556 target_ulong err;
1557
1558 ret = strtoull(p, (char **)&p, 16);
1559 if (*p == ',') {
1560 p++;
1561 err = strtoull(p, (char **)&p, 16);
1562 } else {
1563 err = 0;
1564 }
1565 if (*p == ',')
1566 p++;
1567 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001568 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001569 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001570 s->current_syscall_cb = NULL;
1571 }
pbrooka2d1eba2007-01-28 03:10:55 +00001572 if (type == 'C') {
1573 put_packet(s, "T02");
1574 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001575 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001576 }
1577 }
1578 break;
bellard858693c2004-03-31 18:52:07 +00001579 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001580 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001581 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001582 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001583 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001584 len += reg_size;
1585 }
1586 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001587 put_packet(s, buf);
1588 break;
1589 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001590 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001591 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001592 len = strlen(p) / 2;
1593 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001594 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001595 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001596 len -= reg_size;
1597 registers += reg_size;
1598 }
bellard858693c2004-03-31 18:52:07 +00001599 put_packet(s, "OK");
1600 break;
1601 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001602 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001603 if (*p == ',')
1604 p++;
bellard9d9754a2006-06-25 15:32:37 +00001605 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001606 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001607 put_packet (s, "E14");
1608 } else {
1609 memtohex(buf, mem_buf, len);
1610 put_packet(s, buf);
1611 }
bellard858693c2004-03-31 18:52:07 +00001612 break;
1613 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001614 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001615 if (*p == ',')
1616 p++;
bellard9d9754a2006-06-25 15:32:37 +00001617 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001618 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001619 p++;
1620 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001621 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001622 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001623 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001624 } else {
bellard858693c2004-03-31 18:52:07 +00001625 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001626 }
bellard858693c2004-03-31 18:52:07 +00001627 break;
pbrook56aebc82008-10-11 17:55:29 +00001628 case 'p':
1629 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1630 This works, but can be very slow. Anything new enough to
1631 understand XML also knows how to use this properly. */
1632 if (!gdb_has_xml)
1633 goto unknown_command;
1634 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001635 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001636 if (reg_size) {
1637 memtohex(buf, mem_buf, reg_size);
1638 put_packet(s, buf);
1639 } else {
1640 put_packet(s, "E14");
1641 }
1642 break;
1643 case 'P':
1644 if (!gdb_has_xml)
1645 goto unknown_command;
1646 addr = strtoull(p, (char **)&p, 16);
1647 if (*p == '=')
1648 p++;
1649 reg_size = strlen(p) / 2;
1650 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001651 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001652 put_packet(s, "OK");
1653 break;
bellard858693c2004-03-31 18:52:07 +00001654 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001655 case 'z':
1656 type = strtoul(p, (char **)&p, 16);
1657 if (*p == ',')
1658 p++;
bellard9d9754a2006-06-25 15:32:37 +00001659 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001660 if (*p == ',')
1661 p++;
bellard9d9754a2006-06-25 15:32:37 +00001662 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001663 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001664 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001665 else
aliguori880a7572008-11-18 20:30:24 +00001666 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001667 if (res >= 0)
1668 put_packet(s, "OK");
1669 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001670 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001671 else
1672 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001673 break;
aliguori880a7572008-11-18 20:30:24 +00001674 case 'H':
1675 type = *p++;
1676 thread = strtoull(p, (char **)&p, 16);
1677 if (thread == -1 || thread == 0) {
1678 put_packet(s, "OK");
1679 break;
1680 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001681 cpu = find_cpu(thread);
1682 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001683 put_packet(s, "E22");
1684 break;
1685 }
1686 switch (type) {
1687 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001688 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001689 put_packet(s, "OK");
1690 break;
1691 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001692 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001693 put_packet(s, "OK");
1694 break;
1695 default:
1696 put_packet(s, "E22");
1697 break;
1698 }
1699 break;
1700 case 'T':
1701 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001702 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001703
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001704 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001705 put_packet(s, "OK");
1706 } else {
aliguori880a7572008-11-18 20:30:24 +00001707 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001708 }
aliguori880a7572008-11-18 20:30:24 +00001709 break;
pbrook978efd62006-06-17 18:30:42 +00001710 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001711 case 'Q':
1712 /* parse any 'q' packets here */
1713 if (!strcmp(p,"qemu.sstepbits")) {
1714 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001715 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1716 SSTEP_ENABLE,
1717 SSTEP_NOIRQ,
1718 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001719 put_packet(s, buf);
1720 break;
1721 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1722 /* Display or change the sstep_flags */
1723 p += 10;
1724 if (*p != '=') {
1725 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001726 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001727 put_packet(s, buf);
1728 break;
1729 }
1730 p++;
1731 type = strtoul(p, (char **)&p, 16);
1732 sstep_flags = type;
1733 put_packet(s, "OK");
1734 break;
aliguori880a7572008-11-18 20:30:24 +00001735 } else if (strcmp(p,"C") == 0) {
1736 /* "Current thread" remains vague in the spec, so always return
1737 * the first CPU (gdb returns the first thread). */
1738 put_packet(s, "QC1");
1739 break;
1740 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001741 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001742 goto report_cpuinfo;
1743 } else if (strcmp(p,"sThreadInfo") == 0) {
1744 report_cpuinfo:
1745 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001746 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001747 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001748 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001749 } else
1750 put_packet(s, "l");
1751 break;
1752 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1753 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001754 cpu = find_cpu(thread);
1755 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001756 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001757 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001758 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001759 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001760 memtohex(buf, mem_buf, len);
1761 put_packet(s, buf);
1762 }
aliguori880a7572008-11-18 20:30:24 +00001763 break;
edgar_igl60897d32008-05-09 08:25:14 +00001764 }
blueswir10b8a9882009-03-07 10:51:36 +00001765#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001766 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001767 CPUArchState *env = s->c_cpu->env_ptr;
1768 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001769
blueswir1363a37d2008-08-21 17:58:08 +00001770 snprintf(buf, sizeof(buf),
1771 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1772 ";Bss=" TARGET_ABI_FMT_lx,
1773 ts->info->code_offset,
1774 ts->info->data_offset,
1775 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001776 put_packet(s, buf);
1777 break;
1778 }
blueswir10b8a9882009-03-07 10:51:36 +00001779#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001780 else if (strncmp(p, "Rcmd,", 5) == 0) {
1781 int len = strlen(p + 5);
1782
1783 if ((len % 2) != 0) {
1784 put_packet(s, "E01");
1785 break;
1786 }
1787 hextomem(mem_buf, p + 5, len);
1788 len = len / 2;
1789 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001790 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001791 put_packet(s, "OK");
1792 break;
1793 }
blueswir10b8a9882009-03-07 10:51:36 +00001794#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001795 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001796 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001797#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001798 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001799#endif
1800 put_packet(s, buf);
1801 break;
1802 }
1803#ifdef GDB_CORE_XML
1804 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1805 const char *xml;
1806 target_ulong total_len;
1807
1808 gdb_has_xml = 1;
1809 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001810 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001811 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001812 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001813 put_packet(s, buf);
1814 break;
1815 }
1816
1817 if (*p == ':')
1818 p++;
1819 addr = strtoul(p, (char **)&p, 16);
1820 if (*p == ',')
1821 p++;
1822 len = strtoul(p, (char **)&p, 16);
1823
1824 total_len = strlen(xml);
1825 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001826 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001827 put_packet(s, buf);
1828 break;
1829 }
1830 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1831 len = (MAX_PACKET_LENGTH - 5) / 2;
1832 if (len < total_len - addr) {
1833 buf[0] = 'm';
1834 len = memtox(buf + 1, xml + addr, len);
1835 } else {
1836 buf[0] = 'l';
1837 len = memtox(buf + 1, xml + addr, total_len - addr);
1838 }
1839 put_packet_binary(s, buf, len + 1);
1840 break;
1841 }
1842#endif
1843 /* Unrecognised 'q' command. */
1844 goto unknown_command;
1845
bellard858693c2004-03-31 18:52:07 +00001846 default:
pbrook56aebc82008-10-11 17:55:29 +00001847 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001848 /* put empty packet */
1849 buf[0] = '\0';
1850 put_packet(s, buf);
1851 break;
1852 }
1853 return RS_IDLE;
1854}
1855
Andreas Färber64f6b342013-05-27 02:06:09 +02001856void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001857{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001858 gdbserver_state->c_cpu = cpu;
1859 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001860}
1861
bellard1fddef42005-04-17 19:16:13 +00001862#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001863static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001864{
aliguori880a7572008-11-18 20:30:24 +00001865 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001866 CPUArchState *env = s->c_cpu->env_ptr;
1867 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001868 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001869 const char *type;
bellard858693c2004-03-31 18:52:07 +00001870 int ret;
1871
Meador Ingecdb432b2012-03-15 17:49:45 +00001872 if (running || s->state == RS_INACTIVE) {
1873 return;
1874 }
1875 /* Is there a GDB syscall waiting to be sent? */
1876 if (s->current_syscall_cb) {
1877 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001878 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001879 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001880 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001881 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00001882 if (env->watchpoint_hit) {
1883 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001884 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001885 type = "r";
1886 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001887 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001888 type = "a";
1889 break;
1890 default:
1891 type = "";
1892 break;
1893 }
aliguori880a7572008-11-18 20:30:24 +00001894 snprintf(buf, sizeof(buf),
1895 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001896 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00001897 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001898 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001899 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001900 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001901 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001902 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001903 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001904 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001905 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001906 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001907 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001908 ret = GDB_SIGNAL_QUIT;
1909 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001910 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001911 ret = GDB_SIGNAL_IO;
1912 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001913 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001914 ret = GDB_SIGNAL_ALRM;
1915 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001916 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001917 ret = GDB_SIGNAL_ABRT;
1918 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001919 case RUN_STATE_SAVE_VM:
1920 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001921 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001922 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001923 ret = GDB_SIGNAL_XCPU;
1924 break;
1925 default:
1926 ret = GDB_SIGNAL_UNKNOWN;
1927 break;
bellardbbeb7b52006-04-23 18:42:15 +00001928 }
Andreas Färber0d342822012-12-17 07:12:13 +01001929 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001930
1931send_packet:
bellard858693c2004-03-31 18:52:07 +00001932 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001933
1934 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001935 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001936}
bellard1fddef42005-04-17 19:16:13 +00001937#endif
bellard858693c2004-03-31 18:52:07 +00001938
pbrooka2d1eba2007-01-28 03:10:55 +00001939/* Send a gdb syscall request.
1940 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001941 %x - target_ulong argument printed in hex.
1942 %lx - 64-bit argument printed in hex.
1943 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001944void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001945{
1946 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001947 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001948 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001949 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001950 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001951 GDBState *s;
1952
aliguori880a7572008-11-18 20:30:24 +00001953 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001954 if (!s)
1955 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001956 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001957#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001958 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001959#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001960 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001961 p = s->syscall_buf;
1962 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001963 *(p++) = 'F';
1964 while (*fmt) {
1965 if (*fmt == '%') {
1966 fmt++;
1967 switch (*fmt++) {
1968 case 'x':
1969 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001970 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001971 break;
pbrooka87295e2007-05-26 15:09:38 +00001972 case 'l':
1973 if (*(fmt++) != 'x')
1974 goto bad_format;
1975 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001976 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001977 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001978 case 's':
1979 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001980 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001981 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001982 break;
1983 default:
pbrooka87295e2007-05-26 15:09:38 +00001984 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001985 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1986 fmt - 1);
1987 break;
1988 }
1989 } else {
1990 *(p++) = *(fmt++);
1991 }
1992 }
pbrook8a93e022007-08-06 13:19:15 +00001993 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001994 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001995#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001996 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001997 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001998#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001999 /* In this case wait to send the syscall packet until notification that
2000 the CPU has stopped. This must be done because if the packet is sent
2001 now the reply from the syscall request could be received while the CPU
2002 is still in the running state, which can cause packets to be dropped
2003 and state transition 'T' packets to be sent while the syscall is still
2004 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002005 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002006#endif
2007}
2008
bellard6a00d602005-11-21 23:25:50 +00002009static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002010{
2011 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002012 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002013
bellard1fddef42005-04-17 19:16:13 +00002014#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002015 if (s->last_packet_len) {
2016 /* Waiting for a response to the last packet. If we see the start
2017 of a new command then abandon the previous response. */
2018 if (ch == '-') {
2019#ifdef DEBUG_GDB
2020 printf("Got NACK, retransmitting\n");
2021#endif
thsffe8ab82007-12-16 03:16:05 +00002022 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002023 }
2024#ifdef DEBUG_GDB
2025 else if (ch == '+')
2026 printf("Got ACK\n");
2027 else
2028 printf("Got '%c' when expecting ACK/NACK\n", ch);
2029#endif
2030 if (ch == '+' || ch == '$')
2031 s->last_packet_len = 0;
2032 if (ch != '$')
2033 return;
2034 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002035 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002036 /* when the CPU is running, we cannot do anything except stop
2037 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002038 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002039 } else
bellard1fddef42005-04-17 19:16:13 +00002040#endif
bellard41625032005-04-24 10:07:11 +00002041 {
bellard858693c2004-03-31 18:52:07 +00002042 switch(s->state) {
2043 case RS_IDLE:
2044 if (ch == '$') {
2045 s->line_buf_index = 0;
2046 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002047 }
2048 break;
bellard858693c2004-03-31 18:52:07 +00002049 case RS_GETLINE:
2050 if (ch == '#') {
2051 s->state = RS_CHKSUM1;
2052 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2053 s->state = RS_IDLE;
2054 } else {
2055 s->line_buf[s->line_buf_index++] = ch;
2056 }
2057 break;
2058 case RS_CHKSUM1:
2059 s->line_buf[s->line_buf_index] = '\0';
2060 s->line_csum = fromhex(ch) << 4;
2061 s->state = RS_CHKSUM2;
2062 break;
2063 case RS_CHKSUM2:
2064 s->line_csum |= fromhex(ch);
2065 csum = 0;
2066 for(i = 0; i < s->line_buf_index; i++) {
2067 csum += s->line_buf[i];
2068 }
2069 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002070 reply = '-';
2071 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002072 s->state = RS_IDLE;
2073 } else {
ths60fe76f2007-12-16 03:02:09 +00002074 reply = '+';
2075 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002076 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002077 }
bellardb4608c02003-06-27 17:34:32 +00002078 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002079 default:
2080 abort();
bellardb4608c02003-06-27 17:34:32 +00002081 }
2082 }
bellard858693c2004-03-31 18:52:07 +00002083}
2084
Paul Brook0e1c9c52010-06-16 13:03:51 +01002085/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002086void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002087{
2088 GDBState *s;
2089 char buf[4];
2090
2091 s = gdbserver_state;
2092 if (!s) {
2093 return;
2094 }
2095#ifdef CONFIG_USER_ONLY
2096 if (gdbserver_fd < 0 || s->fd < 0) {
2097 return;
2098 }
2099#endif
2100
2101 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2102 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002103
2104#ifndef CONFIG_USER_ONLY
2105 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002106 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002107 }
2108#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002109}
2110
bellard1fddef42005-04-17 19:16:13 +00002111#ifdef CONFIG_USER_ONLY
2112int
aurel32ca587a82008-12-18 22:44:13 +00002113gdb_queuesig (void)
2114{
2115 GDBState *s;
2116
2117 s = gdbserver_state;
2118
2119 if (gdbserver_fd < 0 || s->fd < 0)
2120 return 0;
2121 else
2122 return 1;
2123}
2124
2125int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002126gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002127{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002128 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002129 GDBState *s;
2130 char buf[256];
2131 int n;
bellard1fddef42005-04-17 19:16:13 +00002132
Andreas Färber5ca666c2013-06-24 19:20:57 +02002133 s = gdbserver_state;
2134 if (gdbserver_fd < 0 || s->fd < 0) {
2135 return sig;
bellard1fddef42005-04-17 19:16:13 +00002136 }
2137
Andreas Färber5ca666c2013-06-24 19:20:57 +02002138 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002139 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002140 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002141
Andreas Färber5ca666c2013-06-24 19:20:57 +02002142 if (sig != 0) {
2143 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2144 put_packet(s, buf);
2145 }
2146 /* put_packet() might have detected that the peer terminated the
2147 connection. */
2148 if (s->fd < 0) {
2149 return sig;
2150 }
2151
2152 sig = 0;
2153 s->state = RS_IDLE;
2154 s->running_state = 0;
2155 while (s->running_state == 0) {
2156 n = read(s->fd, buf, 256);
2157 if (n > 0) {
2158 int i;
2159
2160 for (i = 0; i < n; i++) {
2161 gdb_read_byte(s, buf[i]);
2162 }
2163 } else if (n == 0 || errno != EAGAIN) {
2164 /* XXX: Connection closed. Should probably wait for another
2165 connection before continuing. */
2166 return sig;
bellard1fddef42005-04-17 19:16:13 +00002167 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002168 }
2169 sig = s->signal;
2170 s->signal = 0;
2171 return sig;
bellard1fddef42005-04-17 19:16:13 +00002172}
bellarde9009672005-04-26 20:42:36 +00002173
aurel32ca587a82008-12-18 22:44:13 +00002174/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002175void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002176{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002177 GDBState *s;
2178 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002179
Andreas Färber5ca666c2013-06-24 19:20:57 +02002180 s = gdbserver_state;
2181 if (gdbserver_fd < 0 || s->fd < 0) {
2182 return;
2183 }
aurel32ca587a82008-12-18 22:44:13 +00002184
Andreas Färber5ca666c2013-06-24 19:20:57 +02002185 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2186 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002187}
bellard1fddef42005-04-17 19:16:13 +00002188
aliguori880a7572008-11-18 20:30:24 +00002189static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002190{
2191 GDBState *s;
2192 struct sockaddr_in sockaddr;
2193 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002194 int fd;
bellard858693c2004-03-31 18:52:07 +00002195
2196 for(;;) {
2197 len = sizeof(sockaddr);
2198 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2199 if (fd < 0 && errno != EINTR) {
2200 perror("accept");
2201 return;
2202 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002203#ifndef _WIN32
2204 fcntl(fd, F_SETFD, FD_CLOEXEC);
2205#endif
bellard858693c2004-03-31 18:52:07 +00002206 break;
2207 }
2208 }
2209
2210 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002211 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002212
Anthony Liguori7267c092011-08-20 22:09:37 -05002213 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002214 s->c_cpu = first_cpu;
2215 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002216 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002217 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002218
aliguori880a7572008-11-18 20:30:24 +00002219 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002220
bellard858693c2004-03-31 18:52:07 +00002221 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002222}
2223
2224static int gdbserver_open(int port)
2225{
2226 struct sockaddr_in sockaddr;
2227 int fd, val, ret;
2228
2229 fd = socket(PF_INET, SOCK_STREAM, 0);
2230 if (fd < 0) {
2231 perror("socket");
2232 return -1;
2233 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002234#ifndef _WIN32
2235 fcntl(fd, F_SETFD, FD_CLOEXEC);
2236#endif
bellard858693c2004-03-31 18:52:07 +00002237
2238 /* allow fast reuse */
2239 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002240 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002241
2242 sockaddr.sin_family = AF_INET;
2243 sockaddr.sin_port = htons(port);
2244 sockaddr.sin_addr.s_addr = 0;
2245 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2246 if (ret < 0) {
2247 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002248 close(fd);
bellard858693c2004-03-31 18:52:07 +00002249 return -1;
2250 }
2251 ret = listen(fd, 0);
2252 if (ret < 0) {
2253 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002254 close(fd);
bellard858693c2004-03-31 18:52:07 +00002255 return -1;
2256 }
bellard858693c2004-03-31 18:52:07 +00002257 return fd;
2258}
2259
2260int gdbserver_start(int port)
2261{
2262 gdbserver_fd = gdbserver_open(port);
2263 if (gdbserver_fd < 0)
2264 return -1;
2265 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002266 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002267 return 0;
2268}
aurel322b1319c2008-12-18 22:44:04 +00002269
2270/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002271void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002272{
2273 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002274 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002275 return;
2276 close(s->fd);
2277 s->fd = -1;
2278 cpu_breakpoint_remove_all(env, BP_GDB);
2279 cpu_watchpoint_remove_all(env, BP_GDB);
2280}
pbrook4046d912007-01-28 01:53:16 +00002281#else
thsaa1f17c2007-07-11 22:48:58 +00002282static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002283{
pbrook56aebc82008-10-11 17:55:29 +00002284 /* We can handle an arbitrarily large amount of data.
2285 Pick the maximum packet size, which is as good as anything. */
2286 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002287}
2288
thsaa1f17c2007-07-11 22:48:58 +00002289static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002290{
pbrook4046d912007-01-28 01:53:16 +00002291 int i;
2292
2293 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002294 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002295 }
2296}
2297
2298static void gdb_chr_event(void *opaque, int event)
2299{
2300 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302301 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002302 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002303 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002304 break;
2305 default:
2306 break;
2307 }
2308}
2309
aliguori8a34a0f2009-03-05 23:01:55 +00002310static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2311{
2312 char buf[MAX_PACKET_LENGTH];
2313
2314 buf[0] = 'O';
2315 if (len > (MAX_PACKET_LENGTH/2) - 1)
2316 len = (MAX_PACKET_LENGTH/2) - 1;
2317 memtohex(buf + 1, (uint8_t *)msg, len);
2318 put_packet(s, buf);
2319}
2320
2321static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2322{
2323 const char *p = (const char *)buf;
2324 int max_sz;
2325
2326 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2327 for (;;) {
2328 if (len <= max_sz) {
2329 gdb_monitor_output(gdbserver_state, p, len);
2330 break;
2331 }
2332 gdb_monitor_output(gdbserver_state, p, max_sz);
2333 p += max_sz;
2334 len -= max_sz;
2335 }
2336 return len;
2337}
2338
aliguori59030a82009-04-05 18:43:41 +00002339#ifndef _WIN32
2340static void gdb_sigterm_handler(int signal)
2341{
Luiz Capitulino13548692011-07-29 15:36:43 -03002342 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002343 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002344 }
aliguori59030a82009-04-05 18:43:41 +00002345}
2346#endif
2347
2348int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002349{
2350 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002351 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002352 CharDriverState *chr = NULL;
2353 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002354
aliguori59030a82009-04-05 18:43:41 +00002355 if (!device)
2356 return -1;
2357 if (strcmp(device, "none") != 0) {
2358 if (strstart(device, "tcp:", NULL)) {
2359 /* enforce required TCP attributes */
2360 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2361 "%s,nowait,nodelay,server", device);
2362 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002363 }
aliguori59030a82009-04-05 18:43:41 +00002364#ifndef _WIN32
2365 else if (strcmp(device, "stdio") == 0) {
2366 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002367
aliguori59030a82009-04-05 18:43:41 +00002368 memset(&act, 0, sizeof(act));
2369 act.sa_handler = gdb_sigterm_handler;
2370 sigaction(SIGINT, &act, NULL);
2371 }
2372#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002373 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002374 if (!chr)
2375 return -1;
2376
Hans de Goede456d6062013-03-27 20:29:40 +01002377 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002378 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2379 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002380 }
2381
aliguori36556b22009-03-28 18:05:53 +00002382 s = gdbserver_state;
2383 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002384 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002385 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002386
aliguori36556b22009-03-28 18:05:53 +00002387 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2388
2389 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002390 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002391 mon_chr->chr_write = gdb_monitor_write;
2392 monitor_init(mon_chr, 0);
2393 } else {
2394 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002395 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002396 mon_chr = s->mon_chr;
2397 memset(s, 0, sizeof(GDBState));
2398 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002399 s->c_cpu = first_cpu;
2400 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002401 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002402 s->state = chr ? RS_IDLE : RS_INACTIVE;
2403 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002404 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002405
pbrook4046d912007-01-28 01:53:16 +00002406 return 0;
2407}
2408#endif