blob: 7bcdd3f064aa5f29e793fd180d7e0554ab20fac2 [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
561/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +0000562/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +0000563
Andreas Färberf3840912012-02-20 06:44:56 +0100564static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000565{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200566 switch (n) {
567 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +0000568 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
569 GET_REGL(env->gregs[n + 16]);
570 } else {
571 GET_REGL(env->gregs[n]);
572 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200573 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +0900574 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200575 case 16:
576 GET_REGL(env->pc);
577 case 17:
578 GET_REGL(env->pr);
579 case 18:
580 GET_REGL(env->gbr);
581 case 19:
582 GET_REGL(env->vbr);
583 case 20:
584 GET_REGL(env->mach);
585 case 21:
586 GET_REGL(env->macl);
587 case 22:
588 GET_REGL(env->sr);
589 case 23:
590 GET_REGL(env->fpul);
591 case 24:
592 GET_REGL(env->fpscr);
593 case 25 ... 40:
594 if (env->fpscr & FPSCR_FR) {
595 stfl_p(mem_buf, env->fregs[n - 9]);
596 } else {
597 stfl_p(mem_buf, env->fregs[n - 25]);
598 }
599 return 4;
600 case 41:
601 GET_REGL(env->ssr);
602 case 42:
603 GET_REGL(env->spc);
604 case 43 ... 50:
605 GET_REGL(env->gregs[n - 43]);
606 case 51 ... 58:
607 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +0000608 }
bellardfdf9b3e2006-04-27 21:07:38 +0000609
pbrook56aebc82008-10-11 17:55:29 +0000610 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +0000611}
612
Andreas Färberf3840912012-02-20 06:44:56 +0100613static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000614{
pbrook56aebc82008-10-11 17:55:29 +0000615 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200616 case 0 ... 7:
617 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
618 env->gregs[n + 16] = ldl_p(mem_buf);
619 } else {
620 env->gregs[n] = ldl_p(mem_buf);
621 }
622 break;
623 case 8 ... 15:
624 env->gregs[n] = ldl_p(mem_buf);
625 break;
626 case 16:
627 env->pc = ldl_p(mem_buf);
628 break;
629 case 17:
630 env->pr = ldl_p(mem_buf);
631 break;
632 case 18:
633 env->gbr = ldl_p(mem_buf);
634 break;
635 case 19:
636 env->vbr = ldl_p(mem_buf);
637 break;
638 case 20:
639 env->mach = ldl_p(mem_buf);
640 break;
641 case 21:
642 env->macl = ldl_p(mem_buf);
643 break;
644 case 22:
645 env->sr = ldl_p(mem_buf);
646 break;
647 case 23:
648 env->fpul = ldl_p(mem_buf);
649 break;
650 case 24:
651 env->fpscr = ldl_p(mem_buf);
652 break;
653 case 25 ... 40:
654 if (env->fpscr & FPSCR_FR) {
655 env->fregs[n - 9] = ldfl_p(mem_buf);
656 } else {
657 env->fregs[n - 25] = ldfl_p(mem_buf);
658 }
659 break;
660 case 41:
661 env->ssr = ldl_p(mem_buf);
662 break;
663 case 42:
664 env->spc = ldl_p(mem_buf);
665 break;
666 case 43 ... 50:
667 env->gregs[n - 43] = ldl_p(mem_buf);
668 break;
669 case 51 ... 58:
670 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
671 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200672 default:
673 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000674 }
675
676 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +0000677}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200678#elif defined (TARGET_MICROBLAZE)
679
Andreas Färberf3840912012-02-20 06:44:56 +0100680static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200681{
682 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200683 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200684 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200685 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200686 }
687 return 0;
688}
689
Andreas Färberf3840912012-02-20 06:44:56 +0100690static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200691{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200692 MicroBlazeCPU *cpu = mb_env_get_cpu(env);
693 CPUClass *cc = CPU_GET_CLASS(cpu);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200694 uint32_t tmp;
695
Andreas Färbera0e372f2013-06-28 23:18:47 +0200696 if (n > cc->gdb_num_core_regs) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200697 return 0;
698 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200699
700 tmp = ldl_p(mem_buf);
701
702 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200703 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200704 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200705 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200706 }
707 return 4;
708}
thsf1ccf902007-10-08 13:16:14 +0000709#elif defined (TARGET_CRIS)
710
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100711static int
Andreas Färberf3840912012-02-20 06:44:56 +0100712read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100713{
714 if (n < 15) {
715 GET_REG32(env->regs[n]);
716 }
717
718 if (n == 15) {
719 GET_REG32(env->pc);
720 }
721
722 if (n < 32) {
723 switch (n) {
724 case 16:
725 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100726 case 17:
727 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100728 case 20:
729 case 21:
730 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100731 default:
732 if (n >= 23) {
733 GET_REG32(env->pregs[n - 16]);
734 }
735 break;
736 }
737 }
738 return 0;
739}
740
Andreas Färberf3840912012-02-20 06:44:56 +0100741static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000742{
pbrook56aebc82008-10-11 17:55:29 +0000743 uint8_t srs;
744
Andreas Färber47d74ef2013-07-07 11:17:26 +0200745 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100746 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200747 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100748
pbrook56aebc82008-10-11 17:55:29 +0000749 srs = env->pregs[PR_SRS];
750 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200751 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +0000752 }
753
754 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200755 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +0000756 }
757 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200758 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +0000759 }
760 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200761 case 16:
762 GET_REG8(env->pregs[0]);
763 case 17:
764 GET_REG8(env->pregs[1]);
765 case 18:
766 GET_REG32(env->pregs[2]);
767 case 19:
768 GET_REG8(srs);
769 case 20:
770 GET_REG16(env->pregs[4]);
771 case 32:
772 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000773 }
774
775 return 0;
thsf1ccf902007-10-08 13:16:14 +0000776}
777
Andreas Färberf3840912012-02-20 06:44:56 +0100778static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000779{
pbrook56aebc82008-10-11 17:55:29 +0000780 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +0000781
Andreas Färber47d74ef2013-07-07 11:17:26 +0200782 if (n > 49) {
783 return 0;
784 }
thsf1ccf902007-10-08 13:16:14 +0000785
pbrook56aebc82008-10-11 17:55:29 +0000786 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +0000787
pbrook56aebc82008-10-11 17:55:29 +0000788 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200789 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000790 }
thsf1ccf902007-10-08 13:16:14 +0000791
edgar_igld7b69672008-10-11 19:32:21 +0000792 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200793 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +0000794 }
795
796 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +0000797 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200798 case 16:
799 return 1;
800 case 17:
801 return 1;
802 case 18:
803 env->pregs[PR_PID] = tmp;
804 break;
805 case 19:
806 return 1;
807 case 20:
808 return 2;
809 case 32:
810 env->pc = tmp;
811 break;
pbrook56aebc82008-10-11 17:55:29 +0000812 }
thsf1ccf902007-10-08 13:16:14 +0000813
pbrook56aebc82008-10-11 17:55:29 +0000814 return 4;
thsf1ccf902007-10-08 13:16:14 +0000815}
aurel3219bf5172008-12-07 23:26:32 +0000816#elif defined (TARGET_ALPHA)
817
Andreas Färberf3840912012-02-20 06:44:56 +0100818static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000819{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800820 uint64_t val;
821 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000822
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800823 switch (n) {
824 case 0 ... 30:
825 val = env->ir[n];
826 break;
827 case 32 ... 62:
828 d.d = env->fir[n - 32];
829 val = d.ll;
830 break;
831 case 63:
832 val = cpu_alpha_load_fpcr(env);
833 break;
834 case 64:
835 val = env->pc;
836 break;
837 case 66:
838 val = env->unique;
839 break;
840 case 31:
841 case 65:
842 /* 31 really is the zero register; 65 is unassigned in the
843 gdb protocol, but is still required to occupy 8 bytes. */
844 val = 0;
845 break;
846 default:
847 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000848 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800849 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +0000850}
851
Andreas Färberf3840912012-02-20 06:44:56 +0100852static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000853{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800854 target_ulong tmp = ldtul_p(mem_buf);
855 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000856
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800857 switch (n) {
858 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +0000859 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800860 break;
861 case 32 ... 62:
862 d.ll = tmp;
863 env->fir[n - 32] = d.d;
864 break;
865 case 63:
866 cpu_alpha_store_fpcr(env, tmp);
867 break;
868 case 64:
869 env->pc = tmp;
870 break;
871 case 66:
872 env->unique = tmp;
873 break;
874 case 31:
875 case 65:
876 /* 31 really is the zero register; 65 is unassigned in the
877 gdb protocol, but is still required to occupy 8 bytes. */
878 break;
879 default:
880 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000881 }
aurel3219bf5172008-12-07 23:26:32 +0000882 return 8;
883}
Alexander Grafafcb0e42009-12-05 12:44:29 +0100884#elif defined (TARGET_S390X)
885
Andreas Färberf3840912012-02-20 06:44:56 +0100886static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100887{
Richard Henderson6ee77b12012-08-23 10:44:45 -0700888 uint64_t val;
889 int cc_op;
890
Alexander Grafafcb0e42009-12-05 12:44:29 +0100891 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700892 case S390_PSWM_REGNUM:
893 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
894 val = deposit64(env->psw.mask, 44, 2, cc_op);
895 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700896 case S390_PSWA_REGNUM:
897 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700898 case S390_R0_REGNUM ... S390_R15_REGNUM:
899 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700900 case S390_A0_REGNUM ... S390_A15_REGNUM:
901 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700902 case S390_FPC_REGNUM:
903 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700904 case S390_F0_REGNUM ... S390_F15_REGNUM:
905 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +0100906 }
907
908 return 0;
909}
910
Andreas Färberf3840912012-02-20 06:44:56 +0100911static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100912{
913 target_ulong tmpl;
914 uint32_t tmp32;
915 int r = 8;
916 tmpl = ldtul_p(mem_buf);
917 tmp32 = ldl_p(mem_buf);
918
919 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700920 case S390_PSWM_REGNUM:
921 env->psw.mask = tmpl;
922 env->cc_op = extract64(tmpl, 44, 2);
923 break;
924 case S390_PSWA_REGNUM:
925 env->psw.addr = tmpl;
926 break;
927 case S390_R0_REGNUM ... S390_R15_REGNUM:
928 env->regs[n-S390_R0_REGNUM] = tmpl;
929 break;
930 case S390_A0_REGNUM ... S390_A15_REGNUM:
931 env->aregs[n-S390_A0_REGNUM] = tmp32;
932 r = 4;
933 break;
934 case S390_FPC_REGNUM:
935 env->fpc = tmp32;
936 r = 4;
937 break;
938 case S390_F0_REGNUM ... S390_F15_REGNUM:
939 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
940 break;
941 default:
942 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +0100943 }
Alexander Grafafcb0e42009-12-05 12:44:29 +0100944 return r;
945}
Michael Walle0c45d3d2011-02-17 23:45:06 +0100946#elif defined (TARGET_LM32)
947
Paolo Bonzini0d09e412013-02-05 17:06:20 +0100948#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +0100949
Andreas Färberf3840912012-02-20 06:44:56 +0100950static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100951{
952 if (n < 32) {
953 GET_REG32(env->regs[n]);
954 } else {
955 switch (n) {
956 case 32:
957 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100958 /* FIXME: put in right exception ID */
959 case 33:
960 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100961 case 34:
962 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100963 case 35:
964 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100965 case 36:
966 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100967 case 37:
968 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100969 case 38:
970 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100971 }
972 }
973 return 0;
974}
975
Andreas Färberf3840912012-02-20 06:44:56 +0100976static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100977{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200978 LM32CPU *cpu = lm32_env_get_cpu(env);
979 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100980 uint32_t tmp;
981
Andreas Färbera0e372f2013-06-28 23:18:47 +0200982 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +0100983 return 0;
984 }
985
986 tmp = ldl_p(mem_buf);
987
988 if (n < 32) {
989 env->regs[n] = tmp;
990 } else {
991 switch (n) {
992 case 32:
993 env->pc = tmp;
994 break;
995 case 34:
996 env->eba = tmp;
997 break;
998 case 35:
999 env->deba = tmp;
1000 break;
1001 case 36:
1002 env->ie = tmp;
1003 break;
1004 case 37:
1005 lm32_pic_set_im(env->pic_state, tmp);
1006 break;
1007 case 38:
1008 lm32_pic_set_ip(env->pic_state, tmp);
1009 break;
1010 }
1011 }
1012 return 4;
1013}
Max Filippovccfcaba2011-09-06 03:55:52 +04001014#elif defined(TARGET_XTENSA)
1015
Andreas Färberf3840912012-02-20 06:44:56 +01001016static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001017{
1018 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1019
1020 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1021 return 0;
1022 }
1023
1024 switch (reg->type) {
1025 case 9: /*pc*/
1026 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +04001027
1028 case 1: /*ar*/
1029 xtensa_sync_phys_from_window(env);
1030 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001031
1032 case 2: /*SR*/
1033 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001034
1035 case 3: /*UR*/
1036 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001037
Max Filippovdd519cb2012-09-19 04:23:54 +04001038 case 4: /*f*/
1039 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +04001040
Max Filippovccfcaba2011-09-06 03:55:52 +04001041 case 8: /*a*/
1042 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001043
1044 default:
1045 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001046 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001047 return 0;
1048 }
1049}
1050
Andreas Färberf3840912012-02-20 06:44:56 +01001051static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001052{
1053 uint32_t tmp;
1054 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1055
1056 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1057 return 0;
1058 }
1059
1060 tmp = ldl_p(mem_buf);
1061
1062 switch (reg->type) {
1063 case 9: /*pc*/
1064 env->pc = tmp;
1065 break;
1066
1067 case 1: /*ar*/
1068 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1069 xtensa_sync_window_from_phys(env);
1070 break;
1071
1072 case 2: /*SR*/
1073 env->sregs[reg->targno & 0xff] = tmp;
1074 break;
1075
1076 case 3: /*UR*/
1077 env->uregs[reg->targno & 0xff] = tmp;
1078 break;
1079
Max Filippovdd519cb2012-09-19 04:23:54 +04001080 case 4: /*f*/
1081 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1082 break;
1083
Max Filippovccfcaba2011-09-06 03:55:52 +04001084 case 8: /*a*/
1085 env->regs[reg->targno & 0x0f] = tmp;
1086 break;
1087
1088 default:
1089 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001090 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001091 return 0;
1092 }
1093
1094 return 4;
1095}
bellard1fddef42005-04-17 19:16:13 +00001096#else
pbrook56aebc82008-10-11 17:55:29 +00001097
Andreas Färber9349b4f2012-03-14 01:38:32 +01001098static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001099{
1100 return 0;
1101}
1102
Andreas Färber9349b4f2012-03-14 01:38:32 +01001103static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001104{
pbrook56aebc82008-10-11 17:55:29 +00001105 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001106}
1107
1108#endif
bellardb4608c02003-06-27 17:34:32 +00001109
pbrook56aebc82008-10-11 17:55:29 +00001110#ifdef GDB_CORE_XML
1111/* Encode data using the encoding for 'x' packets. */
1112static int memtox(char *buf, const char *mem, int len)
1113{
1114 char *p = buf;
1115 char c;
1116
1117 while (len--) {
1118 c = *(mem++);
1119 switch (c) {
1120 case '#': case '$': case '*': case '}':
1121 *(p++) = '}';
1122 *(p++) = c ^ 0x20;
1123 break;
1124 default:
1125 *(p++) = c;
1126 break;
1127 }
1128 }
1129 return p - buf;
1130}
1131
aurel323faf7782008-12-07 23:26:17 +00001132static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001133{
pbrook56aebc82008-10-11 17:55:29 +00001134 size_t len;
1135 int i;
1136 const char *name;
1137 static char target_xml[1024];
1138
1139 len = 0;
1140 while (p[len] && p[len] != ':')
1141 len++;
1142 *newp = p + len;
1143
1144 name = NULL;
1145 if (strncmp(p, "target.xml", len) == 0) {
1146 /* Generate the XML description for this CPU. */
1147 if (!target_xml[0]) {
1148 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001149 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001150
blueswir15b3715b2008-10-25 11:18:12 +00001151 snprintf(target_xml, sizeof(target_xml),
1152 "<?xml version=\"1.0\"?>"
1153 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1154 "<target>"
1155 "<xi:include href=\"%s\"/>",
1156 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001157
Andreas Färbereac8b352013-06-28 21:11:37 +02001158 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001159 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1160 pstrcat(target_xml, sizeof(target_xml), r->xml);
1161 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001162 }
blueswir12dc766d2009-04-13 16:06:19 +00001163 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001164 }
1165 return target_xml;
1166 }
1167 for (i = 0; ; i++) {
1168 name = xml_builtin[i][0];
1169 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1170 break;
1171 }
1172 return name ? xml_builtin[i][1] : NULL;
1173}
1174#endif
1175
Andreas Färber385b9f02013-06-27 18:25:36 +02001176static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001177{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001178 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001179 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001180 GDBRegisterState *r;
1181
Andreas Färbera0e372f2013-06-28 23:18:47 +02001182 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001183 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001184 }
pbrook56aebc82008-10-11 17:55:29 +00001185
Andreas Färbereac8b352013-06-28 21:11:37 +02001186 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001187 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1188 return r->get_reg(env, mem_buf, reg - r->base_reg);
1189 }
1190 }
1191 return 0;
1192}
1193
Andreas Färber385b9f02013-06-27 18:25:36 +02001194static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001195{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001196 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001197 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001198 GDBRegisterState *r;
1199
Andreas Färbera0e372f2013-06-28 23:18:47 +02001200 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001201 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001202 }
pbrook56aebc82008-10-11 17:55:29 +00001203
Andreas Färbereac8b352013-06-28 21:11:37 +02001204 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001205 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1206 return r->set_reg(env, mem_buf, reg - r->base_reg);
1207 }
1208 }
1209 return 0;
1210}
1211
1212/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1213 specifies the first register number and these registers are included in
1214 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1215 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1216 */
1217
Andreas Färber22169d42013-06-28 21:27:39 +02001218void gdb_register_coprocessor(CPUState *cpu,
1219 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1220 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001221{
1222 GDBRegisterState *s;
1223 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001224
Andreas Färbereac8b352013-06-28 21:11:37 +02001225 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001226 while (*p) {
1227 /* Check for duplicates. */
1228 if (strcmp((*p)->xml, xml) == 0)
1229 return;
1230 p = &(*p)->next;
1231 }
Stefan Weil9643c252011-10-18 22:25:38 +02001232
1233 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001234 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02001235 s->num_regs = num_regs;
1236 s->get_reg = get_reg;
1237 s->set_reg = set_reg;
1238 s->xml = xml;
1239
pbrook56aebc82008-10-11 17:55:29 +00001240 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02001241 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00001242 *p = s;
1243 if (g_pos) {
1244 if (g_pos != s->base_reg) {
1245 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1246 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001247 }
1248 }
1249}
1250
aliguoria1d1bb32008-11-18 20:07:32 +00001251#ifndef CONFIG_USER_ONLY
1252static const int xlat_gdb_type[] = {
1253 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1254 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1255 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1256};
1257#endif
1258
aliguori880a7572008-11-18 20:30:24 +00001259static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001260{
Andreas Färber182735e2013-05-29 22:29:20 +02001261 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001262 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001263 int err = 0;
1264
Andreas Färber62278812013-06-27 17:12:06 +02001265 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001266 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001267 }
aliguorie22a25c2009-03-12 20:12:48 +00001268
aliguoria1d1bb32008-11-18 20:07:32 +00001269 switch (type) {
1270 case GDB_BREAKPOINT_SW:
1271 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001272 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1273 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001274 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1275 if (err)
1276 break;
1277 }
1278 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001279#ifndef CONFIG_USER_ONLY
1280 case GDB_WATCHPOINT_WRITE:
1281 case GDB_WATCHPOINT_READ:
1282 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001283 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1284 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001285 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1286 NULL);
1287 if (err)
1288 break;
1289 }
1290 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001291#endif
1292 default:
1293 return -ENOSYS;
1294 }
1295}
1296
aliguori880a7572008-11-18 20:30:24 +00001297static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001298{
Andreas Färber182735e2013-05-29 22:29:20 +02001299 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001300 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001301 int err = 0;
1302
Andreas Färber62278812013-06-27 17:12:06 +02001303 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001304 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001305 }
aliguorie22a25c2009-03-12 20:12:48 +00001306
aliguoria1d1bb32008-11-18 20:07:32 +00001307 switch (type) {
1308 case GDB_BREAKPOINT_SW:
1309 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001310 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1311 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001312 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1313 if (err)
1314 break;
1315 }
1316 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001317#ifndef CONFIG_USER_ONLY
1318 case GDB_WATCHPOINT_WRITE:
1319 case GDB_WATCHPOINT_READ:
1320 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001321 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1322 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001323 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1324 if (err)
1325 break;
1326 }
1327 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001328#endif
1329 default:
1330 return -ENOSYS;
1331 }
1332}
1333
aliguori880a7572008-11-18 20:30:24 +00001334static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001335{
Andreas Färber182735e2013-05-29 22:29:20 +02001336 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001337 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001338
aliguorie22a25c2009-03-12 20:12:48 +00001339 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001340 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001341 return;
1342 }
1343
Andreas Färber182735e2013-05-29 22:29:20 +02001344 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1345 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001346 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001347#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001348 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001349#endif
aliguori880a7572008-11-18 20:30:24 +00001350 }
aliguoria1d1bb32008-11-18 20:07:32 +00001351}
1352
aurel32fab9d282009-04-08 21:29:37 +00001353static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1354{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001355 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001356 CPUClass *cc = CPU_GET_CLASS(cpu);
1357
1358 cpu_synchronize_state(cpu);
1359 if (cc->set_pc) {
1360 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001361 }
aurel32fab9d282009-04-08 21:29:37 +00001362}
1363
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001364static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001365{
Andreas Färber0d342822012-12-17 07:12:13 +01001366 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001367
Andreas Färber182735e2013-05-29 22:29:20 +02001368 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001369 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001370 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001371 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001372 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001373
1374 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001375}
1376
aliguori880a7572008-11-18 20:30:24 +00001377static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001378{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001379 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001380 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001381 uint32_t thread;
1382 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001383 char buf[MAX_PACKET_LENGTH];
1384 uint8_t mem_buf[MAX_PACKET_LENGTH];
1385 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001386 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001387
bellard858693c2004-03-31 18:52:07 +00001388#ifdef DEBUG_GDB
1389 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001390#endif
bellard858693c2004-03-31 18:52:07 +00001391 p = line_buf;
1392 ch = *p++;
1393 switch(ch) {
1394 case '?':
bellard1fddef42005-04-17 19:16:13 +00001395 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001396 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001397 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001398 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001399 /* Remove all the breakpoints when this query is issued,
1400 * because gdb is doing and initial connect and the state
1401 * should be cleaned up.
1402 */
aliguori880a7572008-11-18 20:30:24 +00001403 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001404 break;
1405 case 'c':
1406 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001407 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001408 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001409 }
aurel32ca587a82008-12-18 22:44:13 +00001410 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001411 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001412 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001413 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001414 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1415 if (s->signal == -1)
1416 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001417 gdb_continue(s);
1418 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001419 case 'v':
1420 if (strncmp(p, "Cont", 4) == 0) {
1421 int res_signal, res_thread;
1422
1423 p += 4;
1424 if (*p == '?') {
1425 put_packet(s, "vCont;c;C;s;S");
1426 break;
1427 }
1428 res = 0;
1429 res_signal = 0;
1430 res_thread = 0;
1431 while (*p) {
1432 int action, signal;
1433
1434 if (*p++ != ';') {
1435 res = 0;
1436 break;
1437 }
1438 action = *p++;
1439 signal = 0;
1440 if (action == 'C' || action == 'S') {
1441 signal = strtoul(p, (char **)&p, 16);
1442 } else if (action != 'c' && action != 's') {
1443 res = 0;
1444 break;
1445 }
1446 thread = 0;
1447 if (*p == ':') {
1448 thread = strtoull(p+1, (char **)&p, 16);
1449 }
1450 action = tolower(action);
1451 if (res == 0 || (res == 'c' && action == 's')) {
1452 res = action;
1453 res_signal = signal;
1454 res_thread = thread;
1455 }
1456 }
1457 if (res) {
1458 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001459 cpu = find_cpu(res_thread);
1460 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001461 put_packet(s, "E22");
1462 break;
1463 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001464 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001465 }
1466 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001467 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001468 }
1469 s->signal = res_signal;
1470 gdb_continue(s);
1471 return RS_IDLE;
1472 }
1473 break;
1474 } else {
1475 goto unknown_command;
1476 }
edgar_igl7d03f822008-05-17 18:58:29 +00001477 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001478#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001479 /* Kill the target */
1480 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1481 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001482#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001483 case 'D':
1484 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001485 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001486 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001487 gdb_continue(s);
1488 put_packet(s, "OK");
1489 break;
bellard858693c2004-03-31 18:52:07 +00001490 case 's':
1491 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001492 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001493 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001494 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001495 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001496 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001497 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001498 case 'F':
1499 {
1500 target_ulong ret;
1501 target_ulong err;
1502
1503 ret = strtoull(p, (char **)&p, 16);
1504 if (*p == ',') {
1505 p++;
1506 err = strtoull(p, (char **)&p, 16);
1507 } else {
1508 err = 0;
1509 }
1510 if (*p == ',')
1511 p++;
1512 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001513 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001514 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001515 s->current_syscall_cb = NULL;
1516 }
pbrooka2d1eba2007-01-28 03:10:55 +00001517 if (type == 'C') {
1518 put_packet(s, "T02");
1519 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001520 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001521 }
1522 }
1523 break;
bellard858693c2004-03-31 18:52:07 +00001524 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001525 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001526 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001527 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001528 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001529 len += reg_size;
1530 }
1531 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001532 put_packet(s, buf);
1533 break;
1534 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001535 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001536 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001537 len = strlen(p) / 2;
1538 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001539 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001540 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001541 len -= reg_size;
1542 registers += reg_size;
1543 }
bellard858693c2004-03-31 18:52:07 +00001544 put_packet(s, "OK");
1545 break;
1546 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001547 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001548 if (*p == ',')
1549 p++;
bellard9d9754a2006-06-25 15:32:37 +00001550 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001551 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001552 put_packet (s, "E14");
1553 } else {
1554 memtohex(buf, mem_buf, len);
1555 put_packet(s, buf);
1556 }
bellard858693c2004-03-31 18:52:07 +00001557 break;
1558 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001559 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001560 if (*p == ',')
1561 p++;
bellard9d9754a2006-06-25 15:32:37 +00001562 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001563 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001564 p++;
1565 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001566 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001567 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001568 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001569 } else {
bellard858693c2004-03-31 18:52:07 +00001570 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001571 }
bellard858693c2004-03-31 18:52:07 +00001572 break;
pbrook56aebc82008-10-11 17:55:29 +00001573 case 'p':
1574 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1575 This works, but can be very slow. Anything new enough to
1576 understand XML also knows how to use this properly. */
1577 if (!gdb_has_xml)
1578 goto unknown_command;
1579 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001580 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001581 if (reg_size) {
1582 memtohex(buf, mem_buf, reg_size);
1583 put_packet(s, buf);
1584 } else {
1585 put_packet(s, "E14");
1586 }
1587 break;
1588 case 'P':
1589 if (!gdb_has_xml)
1590 goto unknown_command;
1591 addr = strtoull(p, (char **)&p, 16);
1592 if (*p == '=')
1593 p++;
1594 reg_size = strlen(p) / 2;
1595 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001596 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001597 put_packet(s, "OK");
1598 break;
bellard858693c2004-03-31 18:52:07 +00001599 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001600 case 'z':
1601 type = strtoul(p, (char **)&p, 16);
1602 if (*p == ',')
1603 p++;
bellard9d9754a2006-06-25 15:32:37 +00001604 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001605 if (*p == ',')
1606 p++;
bellard9d9754a2006-06-25 15:32:37 +00001607 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001608 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001609 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001610 else
aliguori880a7572008-11-18 20:30:24 +00001611 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001612 if (res >= 0)
1613 put_packet(s, "OK");
1614 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001615 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001616 else
1617 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001618 break;
aliguori880a7572008-11-18 20:30:24 +00001619 case 'H':
1620 type = *p++;
1621 thread = strtoull(p, (char **)&p, 16);
1622 if (thread == -1 || thread == 0) {
1623 put_packet(s, "OK");
1624 break;
1625 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001626 cpu = find_cpu(thread);
1627 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001628 put_packet(s, "E22");
1629 break;
1630 }
1631 switch (type) {
1632 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001633 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001634 put_packet(s, "OK");
1635 break;
1636 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001637 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001638 put_packet(s, "OK");
1639 break;
1640 default:
1641 put_packet(s, "E22");
1642 break;
1643 }
1644 break;
1645 case 'T':
1646 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001647 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001648
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001649 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001650 put_packet(s, "OK");
1651 } else {
aliguori880a7572008-11-18 20:30:24 +00001652 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001653 }
aliguori880a7572008-11-18 20:30:24 +00001654 break;
pbrook978efd62006-06-17 18:30:42 +00001655 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001656 case 'Q':
1657 /* parse any 'q' packets here */
1658 if (!strcmp(p,"qemu.sstepbits")) {
1659 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001660 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1661 SSTEP_ENABLE,
1662 SSTEP_NOIRQ,
1663 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001664 put_packet(s, buf);
1665 break;
1666 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1667 /* Display or change the sstep_flags */
1668 p += 10;
1669 if (*p != '=') {
1670 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001671 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001672 put_packet(s, buf);
1673 break;
1674 }
1675 p++;
1676 type = strtoul(p, (char **)&p, 16);
1677 sstep_flags = type;
1678 put_packet(s, "OK");
1679 break;
aliguori880a7572008-11-18 20:30:24 +00001680 } else if (strcmp(p,"C") == 0) {
1681 /* "Current thread" remains vague in the spec, so always return
1682 * the first CPU (gdb returns the first thread). */
1683 put_packet(s, "QC1");
1684 break;
1685 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001686 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001687 goto report_cpuinfo;
1688 } else if (strcmp(p,"sThreadInfo") == 0) {
1689 report_cpuinfo:
1690 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001691 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001692 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001693 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001694 } else
1695 put_packet(s, "l");
1696 break;
1697 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1698 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001699 cpu = find_cpu(thread);
1700 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001701 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001702 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001703 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001704 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001705 memtohex(buf, mem_buf, len);
1706 put_packet(s, buf);
1707 }
aliguori880a7572008-11-18 20:30:24 +00001708 break;
edgar_igl60897d32008-05-09 08:25:14 +00001709 }
blueswir10b8a9882009-03-07 10:51:36 +00001710#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001711 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001712 CPUArchState *env = s->c_cpu->env_ptr;
1713 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001714
blueswir1363a37d2008-08-21 17:58:08 +00001715 snprintf(buf, sizeof(buf),
1716 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1717 ";Bss=" TARGET_ABI_FMT_lx,
1718 ts->info->code_offset,
1719 ts->info->data_offset,
1720 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001721 put_packet(s, buf);
1722 break;
1723 }
blueswir10b8a9882009-03-07 10:51:36 +00001724#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001725 else if (strncmp(p, "Rcmd,", 5) == 0) {
1726 int len = strlen(p + 5);
1727
1728 if ((len % 2) != 0) {
1729 put_packet(s, "E01");
1730 break;
1731 }
1732 hextomem(mem_buf, p + 5, len);
1733 len = len / 2;
1734 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001735 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001736 put_packet(s, "OK");
1737 break;
1738 }
blueswir10b8a9882009-03-07 10:51:36 +00001739#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001740 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001741 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001742#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001743 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001744#endif
1745 put_packet(s, buf);
1746 break;
1747 }
1748#ifdef GDB_CORE_XML
1749 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1750 const char *xml;
1751 target_ulong total_len;
1752
1753 gdb_has_xml = 1;
1754 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001755 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001756 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001757 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001758 put_packet(s, buf);
1759 break;
1760 }
1761
1762 if (*p == ':')
1763 p++;
1764 addr = strtoul(p, (char **)&p, 16);
1765 if (*p == ',')
1766 p++;
1767 len = strtoul(p, (char **)&p, 16);
1768
1769 total_len = strlen(xml);
1770 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001771 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001772 put_packet(s, buf);
1773 break;
1774 }
1775 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1776 len = (MAX_PACKET_LENGTH - 5) / 2;
1777 if (len < total_len - addr) {
1778 buf[0] = 'm';
1779 len = memtox(buf + 1, xml + addr, len);
1780 } else {
1781 buf[0] = 'l';
1782 len = memtox(buf + 1, xml + addr, total_len - addr);
1783 }
1784 put_packet_binary(s, buf, len + 1);
1785 break;
1786 }
1787#endif
1788 /* Unrecognised 'q' command. */
1789 goto unknown_command;
1790
bellard858693c2004-03-31 18:52:07 +00001791 default:
pbrook56aebc82008-10-11 17:55:29 +00001792 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001793 /* put empty packet */
1794 buf[0] = '\0';
1795 put_packet(s, buf);
1796 break;
1797 }
1798 return RS_IDLE;
1799}
1800
Andreas Färber64f6b342013-05-27 02:06:09 +02001801void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001802{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001803 gdbserver_state->c_cpu = cpu;
1804 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001805}
1806
bellard1fddef42005-04-17 19:16:13 +00001807#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001808static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001809{
aliguori880a7572008-11-18 20:30:24 +00001810 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001811 CPUArchState *env = s->c_cpu->env_ptr;
1812 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001813 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001814 const char *type;
bellard858693c2004-03-31 18:52:07 +00001815 int ret;
1816
Meador Ingecdb432b2012-03-15 17:49:45 +00001817 if (running || s->state == RS_INACTIVE) {
1818 return;
1819 }
1820 /* Is there a GDB syscall waiting to be sent? */
1821 if (s->current_syscall_cb) {
1822 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001823 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001824 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001825 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001826 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00001827 if (env->watchpoint_hit) {
1828 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001829 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001830 type = "r";
1831 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001832 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001833 type = "a";
1834 break;
1835 default:
1836 type = "";
1837 break;
1838 }
aliguori880a7572008-11-18 20:30:24 +00001839 snprintf(buf, sizeof(buf),
1840 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001841 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00001842 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001843 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001844 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001845 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001846 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001847 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001848 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001849 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001850 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001851 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001852 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001853 ret = GDB_SIGNAL_QUIT;
1854 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001855 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001856 ret = GDB_SIGNAL_IO;
1857 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001858 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001859 ret = GDB_SIGNAL_ALRM;
1860 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001861 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001862 ret = GDB_SIGNAL_ABRT;
1863 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001864 case RUN_STATE_SAVE_VM:
1865 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001866 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001867 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001868 ret = GDB_SIGNAL_XCPU;
1869 break;
1870 default:
1871 ret = GDB_SIGNAL_UNKNOWN;
1872 break;
bellardbbeb7b52006-04-23 18:42:15 +00001873 }
Andreas Färber0d342822012-12-17 07:12:13 +01001874 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001875
1876send_packet:
bellard858693c2004-03-31 18:52:07 +00001877 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001878
1879 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001880 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001881}
bellard1fddef42005-04-17 19:16:13 +00001882#endif
bellard858693c2004-03-31 18:52:07 +00001883
pbrooka2d1eba2007-01-28 03:10:55 +00001884/* Send a gdb syscall request.
1885 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001886 %x - target_ulong argument printed in hex.
1887 %lx - 64-bit argument printed in hex.
1888 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001889void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001890{
1891 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001892 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001893 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001894 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001895 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001896 GDBState *s;
1897
aliguori880a7572008-11-18 20:30:24 +00001898 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001899 if (!s)
1900 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001901 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001902#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001903 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001904#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001905 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001906 p = s->syscall_buf;
1907 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001908 *(p++) = 'F';
1909 while (*fmt) {
1910 if (*fmt == '%') {
1911 fmt++;
1912 switch (*fmt++) {
1913 case 'x':
1914 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001915 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001916 break;
pbrooka87295e2007-05-26 15:09:38 +00001917 case 'l':
1918 if (*(fmt++) != 'x')
1919 goto bad_format;
1920 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001921 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001922 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001923 case 's':
1924 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001925 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001926 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001927 break;
1928 default:
pbrooka87295e2007-05-26 15:09:38 +00001929 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001930 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1931 fmt - 1);
1932 break;
1933 }
1934 } else {
1935 *(p++) = *(fmt++);
1936 }
1937 }
pbrook8a93e022007-08-06 13:19:15 +00001938 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001939 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001940#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001941 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001942 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001943#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001944 /* In this case wait to send the syscall packet until notification that
1945 the CPU has stopped. This must be done because if the packet is sent
1946 now the reply from the syscall request could be received while the CPU
1947 is still in the running state, which can cause packets to be dropped
1948 and state transition 'T' packets to be sent while the syscall is still
1949 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001950 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001951#endif
1952}
1953
bellard6a00d602005-11-21 23:25:50 +00001954static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001955{
1956 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001957 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001958
bellard1fddef42005-04-17 19:16:13 +00001959#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001960 if (s->last_packet_len) {
1961 /* Waiting for a response to the last packet. If we see the start
1962 of a new command then abandon the previous response. */
1963 if (ch == '-') {
1964#ifdef DEBUG_GDB
1965 printf("Got NACK, retransmitting\n");
1966#endif
thsffe8ab82007-12-16 03:16:05 +00001967 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001968 }
1969#ifdef DEBUG_GDB
1970 else if (ch == '+')
1971 printf("Got ACK\n");
1972 else
1973 printf("Got '%c' when expecting ACK/NACK\n", ch);
1974#endif
1975 if (ch == '+' || ch == '$')
1976 s->last_packet_len = 0;
1977 if (ch != '$')
1978 return;
1979 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001980 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001981 /* when the CPU is running, we cannot do anything except stop
1982 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001983 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001984 } else
bellard1fddef42005-04-17 19:16:13 +00001985#endif
bellard41625032005-04-24 10:07:11 +00001986 {
bellard858693c2004-03-31 18:52:07 +00001987 switch(s->state) {
1988 case RS_IDLE:
1989 if (ch == '$') {
1990 s->line_buf_index = 0;
1991 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001992 }
1993 break;
bellard858693c2004-03-31 18:52:07 +00001994 case RS_GETLINE:
1995 if (ch == '#') {
1996 s->state = RS_CHKSUM1;
1997 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1998 s->state = RS_IDLE;
1999 } else {
2000 s->line_buf[s->line_buf_index++] = ch;
2001 }
2002 break;
2003 case RS_CHKSUM1:
2004 s->line_buf[s->line_buf_index] = '\0';
2005 s->line_csum = fromhex(ch) << 4;
2006 s->state = RS_CHKSUM2;
2007 break;
2008 case RS_CHKSUM2:
2009 s->line_csum |= fromhex(ch);
2010 csum = 0;
2011 for(i = 0; i < s->line_buf_index; i++) {
2012 csum += s->line_buf[i];
2013 }
2014 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002015 reply = '-';
2016 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002017 s->state = RS_IDLE;
2018 } else {
ths60fe76f2007-12-16 03:02:09 +00002019 reply = '+';
2020 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002021 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002022 }
bellardb4608c02003-06-27 17:34:32 +00002023 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002024 default:
2025 abort();
bellardb4608c02003-06-27 17:34:32 +00002026 }
2027 }
bellard858693c2004-03-31 18:52:07 +00002028}
2029
Paul Brook0e1c9c52010-06-16 13:03:51 +01002030/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002031void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002032{
2033 GDBState *s;
2034 char buf[4];
2035
2036 s = gdbserver_state;
2037 if (!s) {
2038 return;
2039 }
2040#ifdef CONFIG_USER_ONLY
2041 if (gdbserver_fd < 0 || s->fd < 0) {
2042 return;
2043 }
2044#endif
2045
2046 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2047 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002048
2049#ifndef CONFIG_USER_ONLY
2050 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002051 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002052 }
2053#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002054}
2055
bellard1fddef42005-04-17 19:16:13 +00002056#ifdef CONFIG_USER_ONLY
2057int
aurel32ca587a82008-12-18 22:44:13 +00002058gdb_queuesig (void)
2059{
2060 GDBState *s;
2061
2062 s = gdbserver_state;
2063
2064 if (gdbserver_fd < 0 || s->fd < 0)
2065 return 0;
2066 else
2067 return 1;
2068}
2069
2070int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002071gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002072{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002073 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002074 GDBState *s;
2075 char buf[256];
2076 int n;
bellard1fddef42005-04-17 19:16:13 +00002077
Andreas Färber5ca666c2013-06-24 19:20:57 +02002078 s = gdbserver_state;
2079 if (gdbserver_fd < 0 || s->fd < 0) {
2080 return sig;
bellard1fddef42005-04-17 19:16:13 +00002081 }
2082
Andreas Färber5ca666c2013-06-24 19:20:57 +02002083 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002084 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002085 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002086
Andreas Färber5ca666c2013-06-24 19:20:57 +02002087 if (sig != 0) {
2088 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2089 put_packet(s, buf);
2090 }
2091 /* put_packet() might have detected that the peer terminated the
2092 connection. */
2093 if (s->fd < 0) {
2094 return sig;
2095 }
2096
2097 sig = 0;
2098 s->state = RS_IDLE;
2099 s->running_state = 0;
2100 while (s->running_state == 0) {
2101 n = read(s->fd, buf, 256);
2102 if (n > 0) {
2103 int i;
2104
2105 for (i = 0; i < n; i++) {
2106 gdb_read_byte(s, buf[i]);
2107 }
2108 } else if (n == 0 || errno != EAGAIN) {
2109 /* XXX: Connection closed. Should probably wait for another
2110 connection before continuing. */
2111 return sig;
bellard1fddef42005-04-17 19:16:13 +00002112 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002113 }
2114 sig = s->signal;
2115 s->signal = 0;
2116 return sig;
bellard1fddef42005-04-17 19:16:13 +00002117}
bellarde9009672005-04-26 20:42:36 +00002118
aurel32ca587a82008-12-18 22:44:13 +00002119/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002120void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002121{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002122 GDBState *s;
2123 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002124
Andreas Färber5ca666c2013-06-24 19:20:57 +02002125 s = gdbserver_state;
2126 if (gdbserver_fd < 0 || s->fd < 0) {
2127 return;
2128 }
aurel32ca587a82008-12-18 22:44:13 +00002129
Andreas Färber5ca666c2013-06-24 19:20:57 +02002130 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2131 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002132}
bellard1fddef42005-04-17 19:16:13 +00002133
aliguori880a7572008-11-18 20:30:24 +00002134static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002135{
2136 GDBState *s;
2137 struct sockaddr_in sockaddr;
2138 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002139 int fd;
bellard858693c2004-03-31 18:52:07 +00002140
2141 for(;;) {
2142 len = sizeof(sockaddr);
2143 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2144 if (fd < 0 && errno != EINTR) {
2145 perror("accept");
2146 return;
2147 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002148#ifndef _WIN32
2149 fcntl(fd, F_SETFD, FD_CLOEXEC);
2150#endif
bellard858693c2004-03-31 18:52:07 +00002151 break;
2152 }
2153 }
2154
2155 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002156 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002157
Anthony Liguori7267c092011-08-20 22:09:37 -05002158 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002159 s->c_cpu = first_cpu;
2160 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002161 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002162 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002163
aliguori880a7572008-11-18 20:30:24 +00002164 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002165
bellard858693c2004-03-31 18:52:07 +00002166 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002167}
2168
2169static int gdbserver_open(int port)
2170{
2171 struct sockaddr_in sockaddr;
2172 int fd, val, ret;
2173
2174 fd = socket(PF_INET, SOCK_STREAM, 0);
2175 if (fd < 0) {
2176 perror("socket");
2177 return -1;
2178 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002179#ifndef _WIN32
2180 fcntl(fd, F_SETFD, FD_CLOEXEC);
2181#endif
bellard858693c2004-03-31 18:52:07 +00002182
2183 /* allow fast reuse */
2184 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002185 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002186
2187 sockaddr.sin_family = AF_INET;
2188 sockaddr.sin_port = htons(port);
2189 sockaddr.sin_addr.s_addr = 0;
2190 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2191 if (ret < 0) {
2192 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002193 close(fd);
bellard858693c2004-03-31 18:52:07 +00002194 return -1;
2195 }
2196 ret = listen(fd, 0);
2197 if (ret < 0) {
2198 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002199 close(fd);
bellard858693c2004-03-31 18:52:07 +00002200 return -1;
2201 }
bellard858693c2004-03-31 18:52:07 +00002202 return fd;
2203}
2204
2205int gdbserver_start(int port)
2206{
2207 gdbserver_fd = gdbserver_open(port);
2208 if (gdbserver_fd < 0)
2209 return -1;
2210 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002211 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002212 return 0;
2213}
aurel322b1319c2008-12-18 22:44:04 +00002214
2215/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002216void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002217{
2218 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002219 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002220 return;
2221 close(s->fd);
2222 s->fd = -1;
2223 cpu_breakpoint_remove_all(env, BP_GDB);
2224 cpu_watchpoint_remove_all(env, BP_GDB);
2225}
pbrook4046d912007-01-28 01:53:16 +00002226#else
thsaa1f17c2007-07-11 22:48:58 +00002227static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002228{
pbrook56aebc82008-10-11 17:55:29 +00002229 /* We can handle an arbitrarily large amount of data.
2230 Pick the maximum packet size, which is as good as anything. */
2231 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002232}
2233
thsaa1f17c2007-07-11 22:48:58 +00002234static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002235{
pbrook4046d912007-01-28 01:53:16 +00002236 int i;
2237
2238 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002239 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002240 }
2241}
2242
2243static void gdb_chr_event(void *opaque, int event)
2244{
2245 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302246 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002247 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002248 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002249 break;
2250 default:
2251 break;
2252 }
2253}
2254
aliguori8a34a0f2009-03-05 23:01:55 +00002255static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2256{
2257 char buf[MAX_PACKET_LENGTH];
2258
2259 buf[0] = 'O';
2260 if (len > (MAX_PACKET_LENGTH/2) - 1)
2261 len = (MAX_PACKET_LENGTH/2) - 1;
2262 memtohex(buf + 1, (uint8_t *)msg, len);
2263 put_packet(s, buf);
2264}
2265
2266static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2267{
2268 const char *p = (const char *)buf;
2269 int max_sz;
2270
2271 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2272 for (;;) {
2273 if (len <= max_sz) {
2274 gdb_monitor_output(gdbserver_state, p, len);
2275 break;
2276 }
2277 gdb_monitor_output(gdbserver_state, p, max_sz);
2278 p += max_sz;
2279 len -= max_sz;
2280 }
2281 return len;
2282}
2283
aliguori59030a82009-04-05 18:43:41 +00002284#ifndef _WIN32
2285static void gdb_sigterm_handler(int signal)
2286{
Luiz Capitulino13548692011-07-29 15:36:43 -03002287 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002288 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002289 }
aliguori59030a82009-04-05 18:43:41 +00002290}
2291#endif
2292
2293int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002294{
2295 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002296 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002297 CharDriverState *chr = NULL;
2298 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002299
aliguori59030a82009-04-05 18:43:41 +00002300 if (!device)
2301 return -1;
2302 if (strcmp(device, "none") != 0) {
2303 if (strstart(device, "tcp:", NULL)) {
2304 /* enforce required TCP attributes */
2305 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2306 "%s,nowait,nodelay,server", device);
2307 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002308 }
aliguori59030a82009-04-05 18:43:41 +00002309#ifndef _WIN32
2310 else if (strcmp(device, "stdio") == 0) {
2311 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002312
aliguori59030a82009-04-05 18:43:41 +00002313 memset(&act, 0, sizeof(act));
2314 act.sa_handler = gdb_sigterm_handler;
2315 sigaction(SIGINT, &act, NULL);
2316 }
2317#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002318 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002319 if (!chr)
2320 return -1;
2321
Hans de Goede456d6062013-03-27 20:29:40 +01002322 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002323 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2324 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002325 }
2326
aliguori36556b22009-03-28 18:05:53 +00002327 s = gdbserver_state;
2328 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002329 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002330 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002331
aliguori36556b22009-03-28 18:05:53 +00002332 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2333
2334 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002335 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002336 mon_chr->chr_write = gdb_monitor_write;
2337 monitor_init(mon_chr, 0);
2338 } else {
2339 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002340 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002341 mon_chr = s->mon_chr;
2342 memset(s, 0, sizeof(GDBState));
2343 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002344 s->c_cpu = first_cpu;
2345 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002346 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002347 s->state = chr ? RS_IDLE : RS_INACTIVE;
2348 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002349 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002350
pbrook4046d912007-01-28 01:53:16 +00002351 return 0;
2352}
2353#endif