blob: 3ed2bfe18161bc97aedac400e51bb50a9c55ffe6 [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ärberf3840912012-02-20 06:44:56 +0100553static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000554{
pbrook56aebc82008-10-11 17:55:29 +0000555 if (n < 32) {
556 GET_REGL(env->active_tc.gpr[n]);
557 }
558 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
559 if (n >= 38 && n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200560 if (env->CP0_Status & (1 << CP0St_FR)) {
561 GET_REGL(env->active_fpu.fpr[n - 38].d);
562 } else {
563 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
564 }
pbrook56aebc82008-10-11 17:55:29 +0000565 }
566 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200567 case 70:
568 GET_REGL((int32_t)env->active_fpu.fcr31);
569 case 71:
570 GET_REGL((int32_t)env->active_fpu.fcr0);
pbrook56aebc82008-10-11 17:55:29 +0000571 }
572 }
573 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200574 case 32:
575 GET_REGL((int32_t)env->CP0_Status);
576 case 33:
577 GET_REGL(env->active_tc.LO[0]);
578 case 34:
579 GET_REGL(env->active_tc.HI[0]);
580 case 35:
581 GET_REGL(env->CP0_BadVAddr);
582 case 36:
583 GET_REGL((int32_t)env->CP0_Cause);
584 case 37:
585 GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
586 case 72:
587 GET_REGL(0); /* fp */
588 case 89:
589 GET_REGL((int32_t)env->CP0_PRid);
pbrook56aebc82008-10-11 17:55:29 +0000590 }
591 if (n >= 73 && n <= 88) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200592 /* 16 embedded regs. */
593 GET_REGL(0);
pbrook56aebc82008-10-11 17:55:29 +0000594 }
ths36d23952007-02-28 22:37:42 +0000595
pbrook56aebc82008-10-11 17:55:29 +0000596 return 0;
bellard6f970bd2005-12-05 19:55:19 +0000597}
598
ths8e33c082006-12-11 19:22:27 +0000599/* convert MIPS rounding mode in FCR31 to IEEE library */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200600static unsigned int ieee_rm[] = {
ths8e33c082006-12-11 19:22:27 +0000601 float_round_nearest_even,
602 float_round_to_zero,
603 float_round_up,
604 float_round_down
Andreas Färber47d74ef2013-07-07 11:17:26 +0200605};
ths8e33c082006-12-11 19:22:27 +0000606#define RESTORE_ROUNDING_MODE \
Andreas Färber47d74ef2013-07-07 11:17:26 +0200607 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], \
608 &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +0000609
Andreas Färberf3840912012-02-20 06:44:56 +0100610static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000611{
pbrook56aebc82008-10-11 17:55:29 +0000612 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +0000613
pbrook56aebc82008-10-11 17:55:29 +0000614 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +0000615
pbrook56aebc82008-10-11 17:55:29 +0000616 if (n < 32) {
617 env->active_tc.gpr[n] = tmp;
618 return sizeof(target_ulong);
619 }
620 if (env->CP0_Config1 & (1 << CP0C1_FP)
621 && n >= 38 && n < 73) {
622 if (n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200623 if (env->CP0_Status & (1 << CP0St_FR)) {
624 env->active_fpu.fpr[n - 38].d = tmp;
625 } else {
626 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
627 }
pbrook56aebc82008-10-11 17:55:29 +0000628 }
629 switch (n) {
630 case 70:
631 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
632 /* set rounding mode */
633 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +0000634 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200635 case 71:
636 env->active_fpu.fcr0 = tmp;
637 break;
pbrook56aebc82008-10-11 17:55:29 +0000638 }
639 return sizeof(target_ulong);
640 }
641 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200642 case 32:
643 env->CP0_Status = tmp;
644 break;
645 case 33:
646 env->active_tc.LO[0] = tmp;
647 break;
648 case 34:
649 env->active_tc.HI[0] = tmp;
650 break;
651 case 35:
652 env->CP0_BadVAddr = tmp;
653 break;
654 case 36:
655 env->CP0_Cause = tmp;
656 break;
Nathan Froydff1d1972009-12-08 08:06:30 -0800657 case 37:
658 env->active_tc.PC = tmp & ~(target_ulong)1;
659 if (tmp & 1) {
660 env->hflags |= MIPS_HFLAG_M16;
661 } else {
662 env->hflags &= ~(MIPS_HFLAG_M16);
663 }
664 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200665 case 72: /* fp, ignored */
666 break;
667 default:
668 if (n > 89) {
669 return 0;
670 }
671 /* Other registers are readonly. Ignore writes. */
672 break;
pbrook56aebc82008-10-11 17:55:29 +0000673 }
674
675 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +0000676}
Jia Liufc043552012-07-20 15:50:50 +0800677#elif defined(TARGET_OPENRISC)
678
Jia Liufc043552012-07-20 15:50:50 +0800679static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
680{
681 if (n < 32) {
682 GET_REG32(env->gpr[n]);
683 } else {
684 switch (n) {
685 case 32: /* PPC */
686 GET_REG32(env->ppc);
Jia Liufc043552012-07-20 15:50:50 +0800687
688 case 33: /* NPC */
689 GET_REG32(env->npc);
Jia Liufc043552012-07-20 15:50:50 +0800690
691 case 34: /* SR */
692 GET_REG32(env->sr);
Jia Liufc043552012-07-20 15:50:50 +0800693
694 default:
695 break;
696 }
697 }
698 return 0;
699}
700
701static int cpu_gdb_write_register(CPUOpenRISCState *env,
702 uint8_t *mem_buf, int n)
703{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200704 OpenRISCCPU *cpu = openrisc_env_get_cpu(env);
705 CPUClass *cc = CPU_GET_CLASS(cpu);
Jia Liufc043552012-07-20 15:50:50 +0800706 uint32_t tmp;
707
Andreas Färbera0e372f2013-06-28 23:18:47 +0200708 if (n > cc->gdb_num_core_regs) {
Jia Liufc043552012-07-20 15:50:50 +0800709 return 0;
710 }
711
712 tmp = ldl_p(mem_buf);
713
714 if (n < 32) {
715 env->gpr[n] = tmp;
716 } else {
717 switch (n) {
718 case 32: /* PPC */
719 env->ppc = tmp;
720 break;
721
722 case 33: /* NPC */
723 env->npc = tmp;
724 break;
725
726 case 34: /* SR */
727 env->sr = tmp;
728 break;
729
730 default:
731 break;
732 }
733 }
734 return 4;
735}
bellardfdf9b3e2006-04-27 21:07:38 +0000736#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +0000737
738/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +0000739/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +0000740
Andreas Färberf3840912012-02-20 06:44:56 +0100741static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000742{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200743 switch (n) {
744 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +0000745 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
746 GET_REGL(env->gregs[n + 16]);
747 } else {
748 GET_REGL(env->gregs[n]);
749 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200750 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +0900751 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200752 case 16:
753 GET_REGL(env->pc);
754 case 17:
755 GET_REGL(env->pr);
756 case 18:
757 GET_REGL(env->gbr);
758 case 19:
759 GET_REGL(env->vbr);
760 case 20:
761 GET_REGL(env->mach);
762 case 21:
763 GET_REGL(env->macl);
764 case 22:
765 GET_REGL(env->sr);
766 case 23:
767 GET_REGL(env->fpul);
768 case 24:
769 GET_REGL(env->fpscr);
770 case 25 ... 40:
771 if (env->fpscr & FPSCR_FR) {
772 stfl_p(mem_buf, env->fregs[n - 9]);
773 } else {
774 stfl_p(mem_buf, env->fregs[n - 25]);
775 }
776 return 4;
777 case 41:
778 GET_REGL(env->ssr);
779 case 42:
780 GET_REGL(env->spc);
781 case 43 ... 50:
782 GET_REGL(env->gregs[n - 43]);
783 case 51 ... 58:
784 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +0000785 }
bellardfdf9b3e2006-04-27 21:07:38 +0000786
pbrook56aebc82008-10-11 17:55:29 +0000787 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +0000788}
789
Andreas Färberf3840912012-02-20 06:44:56 +0100790static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000791{
pbrook56aebc82008-10-11 17:55:29 +0000792 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200793 case 0 ... 7:
794 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
795 env->gregs[n + 16] = ldl_p(mem_buf);
796 } else {
797 env->gregs[n] = ldl_p(mem_buf);
798 }
799 break;
800 case 8 ... 15:
801 env->gregs[n] = ldl_p(mem_buf);
802 break;
803 case 16:
804 env->pc = ldl_p(mem_buf);
805 break;
806 case 17:
807 env->pr = ldl_p(mem_buf);
808 break;
809 case 18:
810 env->gbr = ldl_p(mem_buf);
811 break;
812 case 19:
813 env->vbr = ldl_p(mem_buf);
814 break;
815 case 20:
816 env->mach = ldl_p(mem_buf);
817 break;
818 case 21:
819 env->macl = ldl_p(mem_buf);
820 break;
821 case 22:
822 env->sr = ldl_p(mem_buf);
823 break;
824 case 23:
825 env->fpul = ldl_p(mem_buf);
826 break;
827 case 24:
828 env->fpscr = ldl_p(mem_buf);
829 break;
830 case 25 ... 40:
831 if (env->fpscr & FPSCR_FR) {
832 env->fregs[n - 9] = ldfl_p(mem_buf);
833 } else {
834 env->fregs[n - 25] = ldfl_p(mem_buf);
835 }
836 break;
837 case 41:
838 env->ssr = ldl_p(mem_buf);
839 break;
840 case 42:
841 env->spc = ldl_p(mem_buf);
842 break;
843 case 43 ... 50:
844 env->gregs[n - 43] = ldl_p(mem_buf);
845 break;
846 case 51 ... 58:
847 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
848 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200849 default:
850 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000851 }
852
853 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +0000854}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200855#elif defined (TARGET_MICROBLAZE)
856
Andreas Färberf3840912012-02-20 06:44:56 +0100857static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200858{
859 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200860 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200861 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200862 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200863 }
864 return 0;
865}
866
Andreas Färberf3840912012-02-20 06:44:56 +0100867static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200868{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200869 MicroBlazeCPU *cpu = mb_env_get_cpu(env);
870 CPUClass *cc = CPU_GET_CLASS(cpu);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200871 uint32_t tmp;
872
Andreas Färbera0e372f2013-06-28 23:18:47 +0200873 if (n > cc->gdb_num_core_regs) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200874 return 0;
875 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200876
877 tmp = ldl_p(mem_buf);
878
879 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200880 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200881 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200882 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200883 }
884 return 4;
885}
thsf1ccf902007-10-08 13:16:14 +0000886#elif defined (TARGET_CRIS)
887
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100888static int
Andreas Färberf3840912012-02-20 06:44:56 +0100889read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100890{
891 if (n < 15) {
892 GET_REG32(env->regs[n]);
893 }
894
895 if (n == 15) {
896 GET_REG32(env->pc);
897 }
898
899 if (n < 32) {
900 switch (n) {
901 case 16:
902 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100903 case 17:
904 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100905 case 20:
906 case 21:
907 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100908 default:
909 if (n >= 23) {
910 GET_REG32(env->pregs[n - 16]);
911 }
912 break;
913 }
914 }
915 return 0;
916}
917
Andreas Färberf3840912012-02-20 06:44:56 +0100918static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000919{
pbrook56aebc82008-10-11 17:55:29 +0000920 uint8_t srs;
921
Andreas Färber47d74ef2013-07-07 11:17:26 +0200922 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100923 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200924 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100925
pbrook56aebc82008-10-11 17:55:29 +0000926 srs = env->pregs[PR_SRS];
927 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200928 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +0000929 }
930
931 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200932 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +0000933 }
934 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200935 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +0000936 }
937 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200938 case 16:
939 GET_REG8(env->pregs[0]);
940 case 17:
941 GET_REG8(env->pregs[1]);
942 case 18:
943 GET_REG32(env->pregs[2]);
944 case 19:
945 GET_REG8(srs);
946 case 20:
947 GET_REG16(env->pregs[4]);
948 case 32:
949 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000950 }
951
952 return 0;
thsf1ccf902007-10-08 13:16:14 +0000953}
954
Andreas Färberf3840912012-02-20 06:44:56 +0100955static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000956{
pbrook56aebc82008-10-11 17:55:29 +0000957 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +0000958
Andreas Färber47d74ef2013-07-07 11:17:26 +0200959 if (n > 49) {
960 return 0;
961 }
thsf1ccf902007-10-08 13:16:14 +0000962
pbrook56aebc82008-10-11 17:55:29 +0000963 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +0000964
pbrook56aebc82008-10-11 17:55:29 +0000965 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200966 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000967 }
thsf1ccf902007-10-08 13:16:14 +0000968
edgar_igld7b69672008-10-11 19:32:21 +0000969 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200970 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +0000971 }
972
973 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +0000974 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200975 case 16:
976 return 1;
977 case 17:
978 return 1;
979 case 18:
980 env->pregs[PR_PID] = tmp;
981 break;
982 case 19:
983 return 1;
984 case 20:
985 return 2;
986 case 32:
987 env->pc = tmp;
988 break;
pbrook56aebc82008-10-11 17:55:29 +0000989 }
thsf1ccf902007-10-08 13:16:14 +0000990
pbrook56aebc82008-10-11 17:55:29 +0000991 return 4;
thsf1ccf902007-10-08 13:16:14 +0000992}
aurel3219bf5172008-12-07 23:26:32 +0000993#elif defined (TARGET_ALPHA)
994
Andreas Färberf3840912012-02-20 06:44:56 +0100995static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000996{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800997 uint64_t val;
998 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000999
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001000 switch (n) {
1001 case 0 ... 30:
1002 val = env->ir[n];
1003 break;
1004 case 32 ... 62:
1005 d.d = env->fir[n - 32];
1006 val = d.ll;
1007 break;
1008 case 63:
1009 val = cpu_alpha_load_fpcr(env);
1010 break;
1011 case 64:
1012 val = env->pc;
1013 break;
1014 case 66:
1015 val = env->unique;
1016 break;
1017 case 31:
1018 case 65:
1019 /* 31 really is the zero register; 65 is unassigned in the
1020 gdb protocol, but is still required to occupy 8 bytes. */
1021 val = 0;
1022 break;
1023 default:
1024 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001025 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001026 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001027}
1028
Andreas Färberf3840912012-02-20 06:44:56 +01001029static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001030{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001031 target_ulong tmp = ldtul_p(mem_buf);
1032 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001033
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001034 switch (n) {
1035 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001036 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001037 break;
1038 case 32 ... 62:
1039 d.ll = tmp;
1040 env->fir[n - 32] = d.d;
1041 break;
1042 case 63:
1043 cpu_alpha_store_fpcr(env, tmp);
1044 break;
1045 case 64:
1046 env->pc = tmp;
1047 break;
1048 case 66:
1049 env->unique = tmp;
1050 break;
1051 case 31:
1052 case 65:
1053 /* 31 really is the zero register; 65 is unassigned in the
1054 gdb protocol, but is still required to occupy 8 bytes. */
1055 break;
1056 default:
1057 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001058 }
aurel3219bf5172008-12-07 23:26:32 +00001059 return 8;
1060}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001061#elif defined (TARGET_S390X)
1062
Andreas Färberf3840912012-02-20 06:44:56 +01001063static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001064{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001065 uint64_t val;
1066 int cc_op;
1067
Alexander Grafafcb0e42009-12-05 12:44:29 +01001068 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001069 case S390_PSWM_REGNUM:
1070 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1071 val = deposit64(env->psw.mask, 44, 2, cc_op);
1072 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001073 case S390_PSWA_REGNUM:
1074 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001075 case S390_R0_REGNUM ... S390_R15_REGNUM:
1076 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001077 case S390_A0_REGNUM ... S390_A15_REGNUM:
1078 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001079 case S390_FPC_REGNUM:
1080 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001081 case S390_F0_REGNUM ... S390_F15_REGNUM:
1082 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +01001083 }
1084
1085 return 0;
1086}
1087
Andreas Färberf3840912012-02-20 06:44:56 +01001088static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001089{
1090 target_ulong tmpl;
1091 uint32_t tmp32;
1092 int r = 8;
1093 tmpl = ldtul_p(mem_buf);
1094 tmp32 = ldl_p(mem_buf);
1095
1096 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001097 case S390_PSWM_REGNUM:
1098 env->psw.mask = tmpl;
1099 env->cc_op = extract64(tmpl, 44, 2);
1100 break;
1101 case S390_PSWA_REGNUM:
1102 env->psw.addr = tmpl;
1103 break;
1104 case S390_R0_REGNUM ... S390_R15_REGNUM:
1105 env->regs[n-S390_R0_REGNUM] = tmpl;
1106 break;
1107 case S390_A0_REGNUM ... S390_A15_REGNUM:
1108 env->aregs[n-S390_A0_REGNUM] = tmp32;
1109 r = 4;
1110 break;
1111 case S390_FPC_REGNUM:
1112 env->fpc = tmp32;
1113 r = 4;
1114 break;
1115 case S390_F0_REGNUM ... S390_F15_REGNUM:
1116 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1117 break;
1118 default:
1119 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001120 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001121 return r;
1122}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001123#elif defined (TARGET_LM32)
1124
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001125#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001126
Andreas Färberf3840912012-02-20 06:44:56 +01001127static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001128{
1129 if (n < 32) {
1130 GET_REG32(env->regs[n]);
1131 } else {
1132 switch (n) {
1133 case 32:
1134 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001135 /* FIXME: put in right exception ID */
1136 case 33:
1137 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001138 case 34:
1139 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001140 case 35:
1141 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001142 case 36:
1143 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001144 case 37:
1145 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001146 case 38:
1147 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001148 }
1149 }
1150 return 0;
1151}
1152
Andreas Färberf3840912012-02-20 06:44:56 +01001153static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001154{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001155 LM32CPU *cpu = lm32_env_get_cpu(env);
1156 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001157 uint32_t tmp;
1158
Andreas Färbera0e372f2013-06-28 23:18:47 +02001159 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +01001160 return 0;
1161 }
1162
1163 tmp = ldl_p(mem_buf);
1164
1165 if (n < 32) {
1166 env->regs[n] = tmp;
1167 } else {
1168 switch (n) {
1169 case 32:
1170 env->pc = tmp;
1171 break;
1172 case 34:
1173 env->eba = tmp;
1174 break;
1175 case 35:
1176 env->deba = tmp;
1177 break;
1178 case 36:
1179 env->ie = tmp;
1180 break;
1181 case 37:
1182 lm32_pic_set_im(env->pic_state, tmp);
1183 break;
1184 case 38:
1185 lm32_pic_set_ip(env->pic_state, tmp);
1186 break;
1187 }
1188 }
1189 return 4;
1190}
Max Filippovccfcaba2011-09-06 03:55:52 +04001191#elif defined(TARGET_XTENSA)
1192
Andreas Färberf3840912012-02-20 06:44:56 +01001193static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001194{
1195 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1196
1197 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1198 return 0;
1199 }
1200
1201 switch (reg->type) {
1202 case 9: /*pc*/
1203 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +04001204
1205 case 1: /*ar*/
1206 xtensa_sync_phys_from_window(env);
1207 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001208
1209 case 2: /*SR*/
1210 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001211
1212 case 3: /*UR*/
1213 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001214
Max Filippovdd519cb2012-09-19 04:23:54 +04001215 case 4: /*f*/
1216 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +04001217
Max Filippovccfcaba2011-09-06 03:55:52 +04001218 case 8: /*a*/
1219 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001220
1221 default:
1222 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001223 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001224 return 0;
1225 }
1226}
1227
Andreas Färberf3840912012-02-20 06:44:56 +01001228static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001229{
1230 uint32_t tmp;
1231 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1232
1233 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1234 return 0;
1235 }
1236
1237 tmp = ldl_p(mem_buf);
1238
1239 switch (reg->type) {
1240 case 9: /*pc*/
1241 env->pc = tmp;
1242 break;
1243
1244 case 1: /*ar*/
1245 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1246 xtensa_sync_window_from_phys(env);
1247 break;
1248
1249 case 2: /*SR*/
1250 env->sregs[reg->targno & 0xff] = tmp;
1251 break;
1252
1253 case 3: /*UR*/
1254 env->uregs[reg->targno & 0xff] = tmp;
1255 break;
1256
Max Filippovdd519cb2012-09-19 04:23:54 +04001257 case 4: /*f*/
1258 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1259 break;
1260
Max Filippovccfcaba2011-09-06 03:55:52 +04001261 case 8: /*a*/
1262 env->regs[reg->targno & 0x0f] = tmp;
1263 break;
1264
1265 default:
1266 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001267 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001268 return 0;
1269 }
1270
1271 return 4;
1272}
bellard1fddef42005-04-17 19:16:13 +00001273#else
pbrook56aebc82008-10-11 17:55:29 +00001274
Andreas Färber9349b4f2012-03-14 01:38:32 +01001275static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001276{
1277 return 0;
1278}
1279
Andreas Färber9349b4f2012-03-14 01:38:32 +01001280static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001281{
pbrook56aebc82008-10-11 17:55:29 +00001282 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001283}
1284
1285#endif
bellardb4608c02003-06-27 17:34:32 +00001286
pbrook56aebc82008-10-11 17:55:29 +00001287#ifdef GDB_CORE_XML
1288/* Encode data using the encoding for 'x' packets. */
1289static int memtox(char *buf, const char *mem, int len)
1290{
1291 char *p = buf;
1292 char c;
1293
1294 while (len--) {
1295 c = *(mem++);
1296 switch (c) {
1297 case '#': case '$': case '*': case '}':
1298 *(p++) = '}';
1299 *(p++) = c ^ 0x20;
1300 break;
1301 default:
1302 *(p++) = c;
1303 break;
1304 }
1305 }
1306 return p - buf;
1307}
1308
aurel323faf7782008-12-07 23:26:17 +00001309static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001310{
pbrook56aebc82008-10-11 17:55:29 +00001311 size_t len;
1312 int i;
1313 const char *name;
1314 static char target_xml[1024];
1315
1316 len = 0;
1317 while (p[len] && p[len] != ':')
1318 len++;
1319 *newp = p + len;
1320
1321 name = NULL;
1322 if (strncmp(p, "target.xml", len) == 0) {
1323 /* Generate the XML description for this CPU. */
1324 if (!target_xml[0]) {
1325 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001326 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001327
blueswir15b3715b2008-10-25 11:18:12 +00001328 snprintf(target_xml, sizeof(target_xml),
1329 "<?xml version=\"1.0\"?>"
1330 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1331 "<target>"
1332 "<xi:include href=\"%s\"/>",
1333 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001334
Andreas Färbereac8b352013-06-28 21:11:37 +02001335 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001336 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1337 pstrcat(target_xml, sizeof(target_xml), r->xml);
1338 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001339 }
blueswir12dc766d2009-04-13 16:06:19 +00001340 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001341 }
1342 return target_xml;
1343 }
1344 for (i = 0; ; i++) {
1345 name = xml_builtin[i][0];
1346 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1347 break;
1348 }
1349 return name ? xml_builtin[i][1] : NULL;
1350}
1351#endif
1352
Andreas Färber385b9f02013-06-27 18:25:36 +02001353static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001354{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001355 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001356 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001357 GDBRegisterState *r;
1358
Andreas Färbera0e372f2013-06-28 23:18:47 +02001359 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001360 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001361 }
pbrook56aebc82008-10-11 17:55:29 +00001362
Andreas Färbereac8b352013-06-28 21:11:37 +02001363 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001364 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1365 return r->get_reg(env, mem_buf, reg - r->base_reg);
1366 }
1367 }
1368 return 0;
1369}
1370
Andreas Färber385b9f02013-06-27 18:25:36 +02001371static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001372{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001373 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001374 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001375 GDBRegisterState *r;
1376
Andreas Färbera0e372f2013-06-28 23:18:47 +02001377 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001378 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001379 }
pbrook56aebc82008-10-11 17:55:29 +00001380
Andreas Färbereac8b352013-06-28 21:11:37 +02001381 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001382 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1383 return r->set_reg(env, mem_buf, reg - r->base_reg);
1384 }
1385 }
1386 return 0;
1387}
1388
1389/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1390 specifies the first register number and these registers are included in
1391 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1392 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1393 */
1394
Andreas Färber22169d42013-06-28 21:27:39 +02001395void gdb_register_coprocessor(CPUState *cpu,
1396 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1397 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001398{
1399 GDBRegisterState *s;
1400 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001401
Andreas Färbereac8b352013-06-28 21:11:37 +02001402 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001403 while (*p) {
1404 /* Check for duplicates. */
1405 if (strcmp((*p)->xml, xml) == 0)
1406 return;
1407 p = &(*p)->next;
1408 }
Stefan Weil9643c252011-10-18 22:25:38 +02001409
1410 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001411 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02001412 s->num_regs = num_regs;
1413 s->get_reg = get_reg;
1414 s->set_reg = set_reg;
1415 s->xml = xml;
1416
pbrook56aebc82008-10-11 17:55:29 +00001417 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02001418 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00001419 *p = s;
1420 if (g_pos) {
1421 if (g_pos != s->base_reg) {
1422 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1423 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001424 }
1425 }
1426}
1427
aliguoria1d1bb32008-11-18 20:07:32 +00001428#ifndef CONFIG_USER_ONLY
1429static const int xlat_gdb_type[] = {
1430 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1431 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1432 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1433};
1434#endif
1435
aliguori880a7572008-11-18 20:30:24 +00001436static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001437{
Andreas Färber182735e2013-05-29 22:29:20 +02001438 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001439 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001440 int err = 0;
1441
Andreas Färber62278812013-06-27 17:12:06 +02001442 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001443 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001444 }
aliguorie22a25c2009-03-12 20:12:48 +00001445
aliguoria1d1bb32008-11-18 20:07:32 +00001446 switch (type) {
1447 case GDB_BREAKPOINT_SW:
1448 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001449 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1450 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001451 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1452 if (err)
1453 break;
1454 }
1455 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001456#ifndef CONFIG_USER_ONLY
1457 case GDB_WATCHPOINT_WRITE:
1458 case GDB_WATCHPOINT_READ:
1459 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001460 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1461 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001462 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1463 NULL);
1464 if (err)
1465 break;
1466 }
1467 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001468#endif
1469 default:
1470 return -ENOSYS;
1471 }
1472}
1473
aliguori880a7572008-11-18 20:30:24 +00001474static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001475{
Andreas Färber182735e2013-05-29 22:29:20 +02001476 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001477 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001478 int err = 0;
1479
Andreas Färber62278812013-06-27 17:12:06 +02001480 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001481 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001482 }
aliguorie22a25c2009-03-12 20:12:48 +00001483
aliguoria1d1bb32008-11-18 20:07:32 +00001484 switch (type) {
1485 case GDB_BREAKPOINT_SW:
1486 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001487 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1488 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001489 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1490 if (err)
1491 break;
1492 }
1493 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001494#ifndef CONFIG_USER_ONLY
1495 case GDB_WATCHPOINT_WRITE:
1496 case GDB_WATCHPOINT_READ:
1497 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001498 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1499 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001500 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1501 if (err)
1502 break;
1503 }
1504 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001505#endif
1506 default:
1507 return -ENOSYS;
1508 }
1509}
1510
aliguori880a7572008-11-18 20:30:24 +00001511static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001512{
Andreas Färber182735e2013-05-29 22:29:20 +02001513 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001514 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001515
aliguorie22a25c2009-03-12 20:12:48 +00001516 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001517 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001518 return;
1519 }
1520
Andreas Färber182735e2013-05-29 22:29:20 +02001521 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1522 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001523 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001524#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001525 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001526#endif
aliguori880a7572008-11-18 20:30:24 +00001527 }
aliguoria1d1bb32008-11-18 20:07:32 +00001528}
1529
aurel32fab9d282009-04-08 21:29:37 +00001530static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1531{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001532 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001533 CPUClass *cc = CPU_GET_CLASS(cpu);
1534
1535 cpu_synchronize_state(cpu);
1536 if (cc->set_pc) {
1537 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001538 }
aurel32fab9d282009-04-08 21:29:37 +00001539}
1540
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001541static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001542{
Andreas Färber0d342822012-12-17 07:12:13 +01001543 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001544
Andreas Färber182735e2013-05-29 22:29:20 +02001545 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001546 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001547 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001548 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001549 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001550
1551 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001552}
1553
aliguori880a7572008-11-18 20:30:24 +00001554static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001555{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001556 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001557 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001558 uint32_t thread;
1559 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001560 char buf[MAX_PACKET_LENGTH];
1561 uint8_t mem_buf[MAX_PACKET_LENGTH];
1562 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001563 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001564
bellard858693c2004-03-31 18:52:07 +00001565#ifdef DEBUG_GDB
1566 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001567#endif
bellard858693c2004-03-31 18:52:07 +00001568 p = line_buf;
1569 ch = *p++;
1570 switch(ch) {
1571 case '?':
bellard1fddef42005-04-17 19:16:13 +00001572 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001573 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001574 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001575 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001576 /* Remove all the breakpoints when this query is issued,
1577 * because gdb is doing and initial connect and the state
1578 * should be cleaned up.
1579 */
aliguori880a7572008-11-18 20:30:24 +00001580 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001581 break;
1582 case 'c':
1583 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001584 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001585 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001586 }
aurel32ca587a82008-12-18 22:44:13 +00001587 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001588 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001589 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001590 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001591 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1592 if (s->signal == -1)
1593 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001594 gdb_continue(s);
1595 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001596 case 'v':
1597 if (strncmp(p, "Cont", 4) == 0) {
1598 int res_signal, res_thread;
1599
1600 p += 4;
1601 if (*p == '?') {
1602 put_packet(s, "vCont;c;C;s;S");
1603 break;
1604 }
1605 res = 0;
1606 res_signal = 0;
1607 res_thread = 0;
1608 while (*p) {
1609 int action, signal;
1610
1611 if (*p++ != ';') {
1612 res = 0;
1613 break;
1614 }
1615 action = *p++;
1616 signal = 0;
1617 if (action == 'C' || action == 'S') {
1618 signal = strtoul(p, (char **)&p, 16);
1619 } else if (action != 'c' && action != 's') {
1620 res = 0;
1621 break;
1622 }
1623 thread = 0;
1624 if (*p == ':') {
1625 thread = strtoull(p+1, (char **)&p, 16);
1626 }
1627 action = tolower(action);
1628 if (res == 0 || (res == 'c' && action == 's')) {
1629 res = action;
1630 res_signal = signal;
1631 res_thread = thread;
1632 }
1633 }
1634 if (res) {
1635 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001636 cpu = find_cpu(res_thread);
1637 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001638 put_packet(s, "E22");
1639 break;
1640 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001641 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001642 }
1643 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001644 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001645 }
1646 s->signal = res_signal;
1647 gdb_continue(s);
1648 return RS_IDLE;
1649 }
1650 break;
1651 } else {
1652 goto unknown_command;
1653 }
edgar_igl7d03f822008-05-17 18:58:29 +00001654 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001655#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001656 /* Kill the target */
1657 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1658 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001659#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001660 case 'D':
1661 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001662 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001663 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001664 gdb_continue(s);
1665 put_packet(s, "OK");
1666 break;
bellard858693c2004-03-31 18:52:07 +00001667 case 's':
1668 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001669 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001670 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001671 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001672 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001673 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001674 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001675 case 'F':
1676 {
1677 target_ulong ret;
1678 target_ulong err;
1679
1680 ret = strtoull(p, (char **)&p, 16);
1681 if (*p == ',') {
1682 p++;
1683 err = strtoull(p, (char **)&p, 16);
1684 } else {
1685 err = 0;
1686 }
1687 if (*p == ',')
1688 p++;
1689 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001690 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001691 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001692 s->current_syscall_cb = NULL;
1693 }
pbrooka2d1eba2007-01-28 03:10:55 +00001694 if (type == 'C') {
1695 put_packet(s, "T02");
1696 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001697 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001698 }
1699 }
1700 break;
bellard858693c2004-03-31 18:52:07 +00001701 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001702 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001703 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001704 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001705 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001706 len += reg_size;
1707 }
1708 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001709 put_packet(s, buf);
1710 break;
1711 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001712 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001713 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001714 len = strlen(p) / 2;
1715 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001716 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001717 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001718 len -= reg_size;
1719 registers += reg_size;
1720 }
bellard858693c2004-03-31 18:52:07 +00001721 put_packet(s, "OK");
1722 break;
1723 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001724 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001725 if (*p == ',')
1726 p++;
bellard9d9754a2006-06-25 15:32:37 +00001727 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001728 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001729 put_packet (s, "E14");
1730 } else {
1731 memtohex(buf, mem_buf, len);
1732 put_packet(s, buf);
1733 }
bellard858693c2004-03-31 18:52:07 +00001734 break;
1735 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001736 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001737 if (*p == ',')
1738 p++;
bellard9d9754a2006-06-25 15:32:37 +00001739 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001740 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001741 p++;
1742 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001743 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001744 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001745 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001746 } else {
bellard858693c2004-03-31 18:52:07 +00001747 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001748 }
bellard858693c2004-03-31 18:52:07 +00001749 break;
pbrook56aebc82008-10-11 17:55:29 +00001750 case 'p':
1751 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1752 This works, but can be very slow. Anything new enough to
1753 understand XML also knows how to use this properly. */
1754 if (!gdb_has_xml)
1755 goto unknown_command;
1756 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001757 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001758 if (reg_size) {
1759 memtohex(buf, mem_buf, reg_size);
1760 put_packet(s, buf);
1761 } else {
1762 put_packet(s, "E14");
1763 }
1764 break;
1765 case 'P':
1766 if (!gdb_has_xml)
1767 goto unknown_command;
1768 addr = strtoull(p, (char **)&p, 16);
1769 if (*p == '=')
1770 p++;
1771 reg_size = strlen(p) / 2;
1772 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001773 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001774 put_packet(s, "OK");
1775 break;
bellard858693c2004-03-31 18:52:07 +00001776 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001777 case 'z':
1778 type = strtoul(p, (char **)&p, 16);
1779 if (*p == ',')
1780 p++;
bellard9d9754a2006-06-25 15:32:37 +00001781 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001782 if (*p == ',')
1783 p++;
bellard9d9754a2006-06-25 15:32:37 +00001784 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001785 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001786 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001787 else
aliguori880a7572008-11-18 20:30:24 +00001788 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001789 if (res >= 0)
1790 put_packet(s, "OK");
1791 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001792 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001793 else
1794 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001795 break;
aliguori880a7572008-11-18 20:30:24 +00001796 case 'H':
1797 type = *p++;
1798 thread = strtoull(p, (char **)&p, 16);
1799 if (thread == -1 || thread == 0) {
1800 put_packet(s, "OK");
1801 break;
1802 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001803 cpu = find_cpu(thread);
1804 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001805 put_packet(s, "E22");
1806 break;
1807 }
1808 switch (type) {
1809 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001810 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001811 put_packet(s, "OK");
1812 break;
1813 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001814 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001815 put_packet(s, "OK");
1816 break;
1817 default:
1818 put_packet(s, "E22");
1819 break;
1820 }
1821 break;
1822 case 'T':
1823 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001824 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001825
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001826 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001827 put_packet(s, "OK");
1828 } else {
aliguori880a7572008-11-18 20:30:24 +00001829 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001830 }
aliguori880a7572008-11-18 20:30:24 +00001831 break;
pbrook978efd62006-06-17 18:30:42 +00001832 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001833 case 'Q':
1834 /* parse any 'q' packets here */
1835 if (!strcmp(p,"qemu.sstepbits")) {
1836 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001837 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1838 SSTEP_ENABLE,
1839 SSTEP_NOIRQ,
1840 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001841 put_packet(s, buf);
1842 break;
1843 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1844 /* Display or change the sstep_flags */
1845 p += 10;
1846 if (*p != '=') {
1847 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001848 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001849 put_packet(s, buf);
1850 break;
1851 }
1852 p++;
1853 type = strtoul(p, (char **)&p, 16);
1854 sstep_flags = type;
1855 put_packet(s, "OK");
1856 break;
aliguori880a7572008-11-18 20:30:24 +00001857 } else if (strcmp(p,"C") == 0) {
1858 /* "Current thread" remains vague in the spec, so always return
1859 * the first CPU (gdb returns the first thread). */
1860 put_packet(s, "QC1");
1861 break;
1862 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001863 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001864 goto report_cpuinfo;
1865 } else if (strcmp(p,"sThreadInfo") == 0) {
1866 report_cpuinfo:
1867 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001868 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001869 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001870 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001871 } else
1872 put_packet(s, "l");
1873 break;
1874 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1875 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001876 cpu = find_cpu(thread);
1877 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001878 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001879 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001880 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001881 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001882 memtohex(buf, mem_buf, len);
1883 put_packet(s, buf);
1884 }
aliguori880a7572008-11-18 20:30:24 +00001885 break;
edgar_igl60897d32008-05-09 08:25:14 +00001886 }
blueswir10b8a9882009-03-07 10:51:36 +00001887#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001888 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001889 CPUArchState *env = s->c_cpu->env_ptr;
1890 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001891
blueswir1363a37d2008-08-21 17:58:08 +00001892 snprintf(buf, sizeof(buf),
1893 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1894 ";Bss=" TARGET_ABI_FMT_lx,
1895 ts->info->code_offset,
1896 ts->info->data_offset,
1897 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001898 put_packet(s, buf);
1899 break;
1900 }
blueswir10b8a9882009-03-07 10:51:36 +00001901#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001902 else if (strncmp(p, "Rcmd,", 5) == 0) {
1903 int len = strlen(p + 5);
1904
1905 if ((len % 2) != 0) {
1906 put_packet(s, "E01");
1907 break;
1908 }
1909 hextomem(mem_buf, p + 5, len);
1910 len = len / 2;
1911 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001912 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001913 put_packet(s, "OK");
1914 break;
1915 }
blueswir10b8a9882009-03-07 10:51:36 +00001916#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001917 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001918 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001919#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001920 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001921#endif
1922 put_packet(s, buf);
1923 break;
1924 }
1925#ifdef GDB_CORE_XML
1926 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1927 const char *xml;
1928 target_ulong total_len;
1929
1930 gdb_has_xml = 1;
1931 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001932 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001933 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001934 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001935 put_packet(s, buf);
1936 break;
1937 }
1938
1939 if (*p == ':')
1940 p++;
1941 addr = strtoul(p, (char **)&p, 16);
1942 if (*p == ',')
1943 p++;
1944 len = strtoul(p, (char **)&p, 16);
1945
1946 total_len = strlen(xml);
1947 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001948 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001949 put_packet(s, buf);
1950 break;
1951 }
1952 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1953 len = (MAX_PACKET_LENGTH - 5) / 2;
1954 if (len < total_len - addr) {
1955 buf[0] = 'm';
1956 len = memtox(buf + 1, xml + addr, len);
1957 } else {
1958 buf[0] = 'l';
1959 len = memtox(buf + 1, xml + addr, total_len - addr);
1960 }
1961 put_packet_binary(s, buf, len + 1);
1962 break;
1963 }
1964#endif
1965 /* Unrecognised 'q' command. */
1966 goto unknown_command;
1967
bellard858693c2004-03-31 18:52:07 +00001968 default:
pbrook56aebc82008-10-11 17:55:29 +00001969 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001970 /* put empty packet */
1971 buf[0] = '\0';
1972 put_packet(s, buf);
1973 break;
1974 }
1975 return RS_IDLE;
1976}
1977
Andreas Färber64f6b342013-05-27 02:06:09 +02001978void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001979{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001980 gdbserver_state->c_cpu = cpu;
1981 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001982}
1983
bellard1fddef42005-04-17 19:16:13 +00001984#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001985static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001986{
aliguori880a7572008-11-18 20:30:24 +00001987 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001988 CPUArchState *env = s->c_cpu->env_ptr;
1989 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001990 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001991 const char *type;
bellard858693c2004-03-31 18:52:07 +00001992 int ret;
1993
Meador Ingecdb432b2012-03-15 17:49:45 +00001994 if (running || s->state == RS_INACTIVE) {
1995 return;
1996 }
1997 /* Is there a GDB syscall waiting to be sent? */
1998 if (s->current_syscall_cb) {
1999 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002000 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002001 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002002 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002003 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002004 if (env->watchpoint_hit) {
2005 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002006 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002007 type = "r";
2008 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002009 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002010 type = "a";
2011 break;
2012 default:
2013 type = "";
2014 break;
2015 }
aliguori880a7572008-11-18 20:30:24 +00002016 snprintf(buf, sizeof(buf),
2017 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002018 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002019 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002020 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002021 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002022 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002023 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002024 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002025 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002026 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002027 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002028 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002029 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002030 ret = GDB_SIGNAL_QUIT;
2031 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002032 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002033 ret = GDB_SIGNAL_IO;
2034 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002035 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002036 ret = GDB_SIGNAL_ALRM;
2037 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002038 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002039 ret = GDB_SIGNAL_ABRT;
2040 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002041 case RUN_STATE_SAVE_VM:
2042 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002043 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002044 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002045 ret = GDB_SIGNAL_XCPU;
2046 break;
2047 default:
2048 ret = GDB_SIGNAL_UNKNOWN;
2049 break;
bellardbbeb7b52006-04-23 18:42:15 +00002050 }
Andreas Färber0d342822012-12-17 07:12:13 +01002051 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002052
2053send_packet:
bellard858693c2004-03-31 18:52:07 +00002054 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002055
2056 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002057 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002058}
bellard1fddef42005-04-17 19:16:13 +00002059#endif
bellard858693c2004-03-31 18:52:07 +00002060
pbrooka2d1eba2007-01-28 03:10:55 +00002061/* Send a gdb syscall request.
2062 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002063 %x - target_ulong argument printed in hex.
2064 %lx - 64-bit argument printed in hex.
2065 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002066void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002067{
2068 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002069 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002070 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002071 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002072 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002073 GDBState *s;
2074
aliguori880a7572008-11-18 20:30:24 +00002075 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002076 if (!s)
2077 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002078 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002079#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002080 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002081#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002082 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002083 p = s->syscall_buf;
2084 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002085 *(p++) = 'F';
2086 while (*fmt) {
2087 if (*fmt == '%') {
2088 fmt++;
2089 switch (*fmt++) {
2090 case 'x':
2091 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002092 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002093 break;
pbrooka87295e2007-05-26 15:09:38 +00002094 case 'l':
2095 if (*(fmt++) != 'x')
2096 goto bad_format;
2097 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002098 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002099 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002100 case 's':
2101 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002102 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002103 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002104 break;
2105 default:
pbrooka87295e2007-05-26 15:09:38 +00002106 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002107 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2108 fmt - 1);
2109 break;
2110 }
2111 } else {
2112 *(p++) = *(fmt++);
2113 }
2114 }
pbrook8a93e022007-08-06 13:19:15 +00002115 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002116 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002117#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002118 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002119 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002120#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002121 /* In this case wait to send the syscall packet until notification that
2122 the CPU has stopped. This must be done because if the packet is sent
2123 now the reply from the syscall request could be received while the CPU
2124 is still in the running state, which can cause packets to be dropped
2125 and state transition 'T' packets to be sent while the syscall is still
2126 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002127 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002128#endif
2129}
2130
bellard6a00d602005-11-21 23:25:50 +00002131static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002132{
2133 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002134 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002135
bellard1fddef42005-04-17 19:16:13 +00002136#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002137 if (s->last_packet_len) {
2138 /* Waiting for a response to the last packet. If we see the start
2139 of a new command then abandon the previous response. */
2140 if (ch == '-') {
2141#ifdef DEBUG_GDB
2142 printf("Got NACK, retransmitting\n");
2143#endif
thsffe8ab82007-12-16 03:16:05 +00002144 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002145 }
2146#ifdef DEBUG_GDB
2147 else if (ch == '+')
2148 printf("Got ACK\n");
2149 else
2150 printf("Got '%c' when expecting ACK/NACK\n", ch);
2151#endif
2152 if (ch == '+' || ch == '$')
2153 s->last_packet_len = 0;
2154 if (ch != '$')
2155 return;
2156 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002157 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002158 /* when the CPU is running, we cannot do anything except stop
2159 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002160 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002161 } else
bellard1fddef42005-04-17 19:16:13 +00002162#endif
bellard41625032005-04-24 10:07:11 +00002163 {
bellard858693c2004-03-31 18:52:07 +00002164 switch(s->state) {
2165 case RS_IDLE:
2166 if (ch == '$') {
2167 s->line_buf_index = 0;
2168 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002169 }
2170 break;
bellard858693c2004-03-31 18:52:07 +00002171 case RS_GETLINE:
2172 if (ch == '#') {
2173 s->state = RS_CHKSUM1;
2174 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2175 s->state = RS_IDLE;
2176 } else {
2177 s->line_buf[s->line_buf_index++] = ch;
2178 }
2179 break;
2180 case RS_CHKSUM1:
2181 s->line_buf[s->line_buf_index] = '\0';
2182 s->line_csum = fromhex(ch) << 4;
2183 s->state = RS_CHKSUM2;
2184 break;
2185 case RS_CHKSUM2:
2186 s->line_csum |= fromhex(ch);
2187 csum = 0;
2188 for(i = 0; i < s->line_buf_index; i++) {
2189 csum += s->line_buf[i];
2190 }
2191 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002192 reply = '-';
2193 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002194 s->state = RS_IDLE;
2195 } else {
ths60fe76f2007-12-16 03:02:09 +00002196 reply = '+';
2197 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002198 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002199 }
bellardb4608c02003-06-27 17:34:32 +00002200 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002201 default:
2202 abort();
bellardb4608c02003-06-27 17:34:32 +00002203 }
2204 }
bellard858693c2004-03-31 18:52:07 +00002205}
2206
Paul Brook0e1c9c52010-06-16 13:03:51 +01002207/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002208void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002209{
2210 GDBState *s;
2211 char buf[4];
2212
2213 s = gdbserver_state;
2214 if (!s) {
2215 return;
2216 }
2217#ifdef CONFIG_USER_ONLY
2218 if (gdbserver_fd < 0 || s->fd < 0) {
2219 return;
2220 }
2221#endif
2222
2223 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2224 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002225
2226#ifndef CONFIG_USER_ONLY
2227 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002228 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002229 }
2230#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002231}
2232
bellard1fddef42005-04-17 19:16:13 +00002233#ifdef CONFIG_USER_ONLY
2234int
aurel32ca587a82008-12-18 22:44:13 +00002235gdb_queuesig (void)
2236{
2237 GDBState *s;
2238
2239 s = gdbserver_state;
2240
2241 if (gdbserver_fd < 0 || s->fd < 0)
2242 return 0;
2243 else
2244 return 1;
2245}
2246
2247int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002248gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002249{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002250 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002251 GDBState *s;
2252 char buf[256];
2253 int n;
bellard1fddef42005-04-17 19:16:13 +00002254
Andreas Färber5ca666c2013-06-24 19:20:57 +02002255 s = gdbserver_state;
2256 if (gdbserver_fd < 0 || s->fd < 0) {
2257 return sig;
bellard1fddef42005-04-17 19:16:13 +00002258 }
2259
Andreas Färber5ca666c2013-06-24 19:20:57 +02002260 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002261 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002262 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002263
Andreas Färber5ca666c2013-06-24 19:20:57 +02002264 if (sig != 0) {
2265 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2266 put_packet(s, buf);
2267 }
2268 /* put_packet() might have detected that the peer terminated the
2269 connection. */
2270 if (s->fd < 0) {
2271 return sig;
2272 }
2273
2274 sig = 0;
2275 s->state = RS_IDLE;
2276 s->running_state = 0;
2277 while (s->running_state == 0) {
2278 n = read(s->fd, buf, 256);
2279 if (n > 0) {
2280 int i;
2281
2282 for (i = 0; i < n; i++) {
2283 gdb_read_byte(s, buf[i]);
2284 }
2285 } else if (n == 0 || errno != EAGAIN) {
2286 /* XXX: Connection closed. Should probably wait for another
2287 connection before continuing. */
2288 return sig;
bellard1fddef42005-04-17 19:16:13 +00002289 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002290 }
2291 sig = s->signal;
2292 s->signal = 0;
2293 return sig;
bellard1fddef42005-04-17 19:16:13 +00002294}
bellarde9009672005-04-26 20:42:36 +00002295
aurel32ca587a82008-12-18 22:44:13 +00002296/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002297void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002298{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002299 GDBState *s;
2300 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002301
Andreas Färber5ca666c2013-06-24 19:20:57 +02002302 s = gdbserver_state;
2303 if (gdbserver_fd < 0 || s->fd < 0) {
2304 return;
2305 }
aurel32ca587a82008-12-18 22:44:13 +00002306
Andreas Färber5ca666c2013-06-24 19:20:57 +02002307 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2308 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002309}
bellard1fddef42005-04-17 19:16:13 +00002310
aliguori880a7572008-11-18 20:30:24 +00002311static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002312{
2313 GDBState *s;
2314 struct sockaddr_in sockaddr;
2315 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002316 int fd;
bellard858693c2004-03-31 18:52:07 +00002317
2318 for(;;) {
2319 len = sizeof(sockaddr);
2320 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2321 if (fd < 0 && errno != EINTR) {
2322 perror("accept");
2323 return;
2324 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002325#ifndef _WIN32
2326 fcntl(fd, F_SETFD, FD_CLOEXEC);
2327#endif
bellard858693c2004-03-31 18:52:07 +00002328 break;
2329 }
2330 }
2331
2332 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002333 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002334
Anthony Liguori7267c092011-08-20 22:09:37 -05002335 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002336 s->c_cpu = first_cpu;
2337 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002338 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002339 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002340
aliguori880a7572008-11-18 20:30:24 +00002341 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002342
bellard858693c2004-03-31 18:52:07 +00002343 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002344}
2345
2346static int gdbserver_open(int port)
2347{
2348 struct sockaddr_in sockaddr;
2349 int fd, val, ret;
2350
2351 fd = socket(PF_INET, SOCK_STREAM, 0);
2352 if (fd < 0) {
2353 perror("socket");
2354 return -1;
2355 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002356#ifndef _WIN32
2357 fcntl(fd, F_SETFD, FD_CLOEXEC);
2358#endif
bellard858693c2004-03-31 18:52:07 +00002359
2360 /* allow fast reuse */
2361 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002362 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002363
2364 sockaddr.sin_family = AF_INET;
2365 sockaddr.sin_port = htons(port);
2366 sockaddr.sin_addr.s_addr = 0;
2367 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2368 if (ret < 0) {
2369 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002370 close(fd);
bellard858693c2004-03-31 18:52:07 +00002371 return -1;
2372 }
2373 ret = listen(fd, 0);
2374 if (ret < 0) {
2375 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002376 close(fd);
bellard858693c2004-03-31 18:52:07 +00002377 return -1;
2378 }
bellard858693c2004-03-31 18:52:07 +00002379 return fd;
2380}
2381
2382int gdbserver_start(int port)
2383{
2384 gdbserver_fd = gdbserver_open(port);
2385 if (gdbserver_fd < 0)
2386 return -1;
2387 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002388 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002389 return 0;
2390}
aurel322b1319c2008-12-18 22:44:04 +00002391
2392/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002393void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002394{
2395 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002396 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002397 return;
2398 close(s->fd);
2399 s->fd = -1;
2400 cpu_breakpoint_remove_all(env, BP_GDB);
2401 cpu_watchpoint_remove_all(env, BP_GDB);
2402}
pbrook4046d912007-01-28 01:53:16 +00002403#else
thsaa1f17c2007-07-11 22:48:58 +00002404static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002405{
pbrook56aebc82008-10-11 17:55:29 +00002406 /* We can handle an arbitrarily large amount of data.
2407 Pick the maximum packet size, which is as good as anything. */
2408 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002409}
2410
thsaa1f17c2007-07-11 22:48:58 +00002411static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002412{
pbrook4046d912007-01-28 01:53:16 +00002413 int i;
2414
2415 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002416 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002417 }
2418}
2419
2420static void gdb_chr_event(void *opaque, int event)
2421{
2422 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302423 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002424 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002425 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002426 break;
2427 default:
2428 break;
2429 }
2430}
2431
aliguori8a34a0f2009-03-05 23:01:55 +00002432static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2433{
2434 char buf[MAX_PACKET_LENGTH];
2435
2436 buf[0] = 'O';
2437 if (len > (MAX_PACKET_LENGTH/2) - 1)
2438 len = (MAX_PACKET_LENGTH/2) - 1;
2439 memtohex(buf + 1, (uint8_t *)msg, len);
2440 put_packet(s, buf);
2441}
2442
2443static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2444{
2445 const char *p = (const char *)buf;
2446 int max_sz;
2447
2448 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2449 for (;;) {
2450 if (len <= max_sz) {
2451 gdb_monitor_output(gdbserver_state, p, len);
2452 break;
2453 }
2454 gdb_monitor_output(gdbserver_state, p, max_sz);
2455 p += max_sz;
2456 len -= max_sz;
2457 }
2458 return len;
2459}
2460
aliguori59030a82009-04-05 18:43:41 +00002461#ifndef _WIN32
2462static void gdb_sigterm_handler(int signal)
2463{
Luiz Capitulino13548692011-07-29 15:36:43 -03002464 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002465 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002466 }
aliguori59030a82009-04-05 18:43:41 +00002467}
2468#endif
2469
2470int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002471{
2472 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002473 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002474 CharDriverState *chr = NULL;
2475 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002476
aliguori59030a82009-04-05 18:43:41 +00002477 if (!device)
2478 return -1;
2479 if (strcmp(device, "none") != 0) {
2480 if (strstart(device, "tcp:", NULL)) {
2481 /* enforce required TCP attributes */
2482 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2483 "%s,nowait,nodelay,server", device);
2484 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002485 }
aliguori59030a82009-04-05 18:43:41 +00002486#ifndef _WIN32
2487 else if (strcmp(device, "stdio") == 0) {
2488 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002489
aliguori59030a82009-04-05 18:43:41 +00002490 memset(&act, 0, sizeof(act));
2491 act.sa_handler = gdb_sigterm_handler;
2492 sigaction(SIGINT, &act, NULL);
2493 }
2494#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002495 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002496 if (!chr)
2497 return -1;
2498
Hans de Goede456d6062013-03-27 20:29:40 +01002499 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002500 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2501 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002502 }
2503
aliguori36556b22009-03-28 18:05:53 +00002504 s = gdbserver_state;
2505 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002506 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002507 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002508
aliguori36556b22009-03-28 18:05:53 +00002509 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2510
2511 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002512 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002513 mon_chr->chr_write = gdb_monitor_write;
2514 monitor_init(mon_chr, 0);
2515 } else {
2516 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002517 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002518 mon_chr = s->mon_chr;
2519 memset(s, 0, sizeof(GDBState));
2520 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002521 s->c_cpu = first_cpu;
2522 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002523 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002524 s->state = chr ? RS_IDLE : RS_INACTIVE;
2525 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002526 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002527
pbrook4046d912007-01-28 01:53:16 +00002528 return 0;
2529}
2530#endif