blob: ab030b5dcbcbedad7c5f82deda5fcd6af153b599 [file] [log] [blame]
bellardb4608c02003-06-27 17:34:32 +00001/*
2 * gdb server stub
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard34751872005-07-02 14:31:34 +00004 * Copyright (c) 2003-2005 Fabrice Bellard
bellardb4608c02003-06-27 17:34:32 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
Blue Swirl8167ee82009-07-16 20:47:01 +000017 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
bellardb4608c02003-06-27 17:34:32 +000018 */
pbrook978efd62006-06-17 18:30:42 +000019#include "config.h"
pbrook56aebc82008-10-11 17:55:29 +000020#include "qemu-common.h"
bellard1fddef42005-04-17 19:16:13 +000021#ifdef CONFIG_USER_ONLY
22#include <stdlib.h>
23#include <stdio.h>
24#include <stdarg.h>
25#include <string.h>
26#include <errno.h>
27#include <unistd.h>
pbrook978efd62006-06-17 18:30:42 +000028#include <fcntl.h>
bellard1fddef42005-04-17 19:16:13 +000029
30#include "qemu.h"
31#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010032#include "monitor/monitor.h"
Paolo Bonzinidccfcd02013-04-08 16:55:25 +020033#include "sysemu/char.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010034#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010035#include "exec/gdbstub.h"
bellard1fddef42005-04-17 19:16:13 +000036#endif
bellard67b915a2004-03-31 23:37:16 +000037
pbrook56aebc82008-10-11 17:55:29 +000038#define MAX_PACKET_LENGTH 4096
39
Blue Swirl2b41f102011-06-19 20:38:22 +000040#include "cpu.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010041#include "qemu/sockets.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010042#include "sysemu/kvm.h"
Richard Henderson6ee77b12012-08-23 10:44:45 -070043#include "qemu/bitops.h"
aurel32ca587a82008-12-18 22:44:13 +000044
Andreas Färberf3659ee2013-06-27 19:09:09 +020045static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
46 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020047{
Andreas Färberf3659ee2013-06-27 19:09:09 +020048 CPUClass *cc = CPU_GET_CLASS(cpu);
49
50 if (cc->memory_rw_debug) {
51 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
52 }
53 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020054}
aurel32ca587a82008-12-18 22:44:13 +000055
56enum {
57 GDB_SIGNAL_0 = 0,
58 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010059 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000060 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010061 GDB_SIGNAL_ABRT = 6,
62 GDB_SIGNAL_ALRM = 14,
63 GDB_SIGNAL_IO = 23,
64 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000065 GDB_SIGNAL_UNKNOWN = 143
66};
67
68#ifdef CONFIG_USER_ONLY
69
70/* Map target signal numbers to GDB protocol signal numbers and vice
71 * versa. For user emulation's currently supported systems, we can
72 * assume most signals are defined.
73 */
74
75static int gdb_signal_table[] = {
76 0,
77 TARGET_SIGHUP,
78 TARGET_SIGINT,
79 TARGET_SIGQUIT,
80 TARGET_SIGILL,
81 TARGET_SIGTRAP,
82 TARGET_SIGABRT,
83 -1, /* SIGEMT */
84 TARGET_SIGFPE,
85 TARGET_SIGKILL,
86 TARGET_SIGBUS,
87 TARGET_SIGSEGV,
88 TARGET_SIGSYS,
89 TARGET_SIGPIPE,
90 TARGET_SIGALRM,
91 TARGET_SIGTERM,
92 TARGET_SIGURG,
93 TARGET_SIGSTOP,
94 TARGET_SIGTSTP,
95 TARGET_SIGCONT,
96 TARGET_SIGCHLD,
97 TARGET_SIGTTIN,
98 TARGET_SIGTTOU,
99 TARGET_SIGIO,
100 TARGET_SIGXCPU,
101 TARGET_SIGXFSZ,
102 TARGET_SIGVTALRM,
103 TARGET_SIGPROF,
104 TARGET_SIGWINCH,
105 -1, /* SIGLOST */
106 TARGET_SIGUSR1,
107 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000108#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000109 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000110#else
111 -1,
112#endif
aurel32ca587a82008-12-18 22:44:13 +0000113 -1, /* SIGPOLL */
114 -1,
115 -1,
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
123 -1,
124 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000125#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000126 __SIGRTMIN + 1,
127 __SIGRTMIN + 2,
128 __SIGRTMIN + 3,
129 __SIGRTMIN + 4,
130 __SIGRTMIN + 5,
131 __SIGRTMIN + 6,
132 __SIGRTMIN + 7,
133 __SIGRTMIN + 8,
134 __SIGRTMIN + 9,
135 __SIGRTMIN + 10,
136 __SIGRTMIN + 11,
137 __SIGRTMIN + 12,
138 __SIGRTMIN + 13,
139 __SIGRTMIN + 14,
140 __SIGRTMIN + 15,
141 __SIGRTMIN + 16,
142 __SIGRTMIN + 17,
143 __SIGRTMIN + 18,
144 __SIGRTMIN + 19,
145 __SIGRTMIN + 20,
146 __SIGRTMIN + 21,
147 __SIGRTMIN + 22,
148 __SIGRTMIN + 23,
149 __SIGRTMIN + 24,
150 __SIGRTMIN + 25,
151 __SIGRTMIN + 26,
152 __SIGRTMIN + 27,
153 __SIGRTMIN + 28,
154 __SIGRTMIN + 29,
155 __SIGRTMIN + 30,
156 __SIGRTMIN + 31,
157 -1, /* SIGCANCEL */
158 __SIGRTMIN,
159 __SIGRTMIN + 32,
160 __SIGRTMIN + 33,
161 __SIGRTMIN + 34,
162 __SIGRTMIN + 35,
163 __SIGRTMIN + 36,
164 __SIGRTMIN + 37,
165 __SIGRTMIN + 38,
166 __SIGRTMIN + 39,
167 __SIGRTMIN + 40,
168 __SIGRTMIN + 41,
169 __SIGRTMIN + 42,
170 __SIGRTMIN + 43,
171 __SIGRTMIN + 44,
172 __SIGRTMIN + 45,
173 __SIGRTMIN + 46,
174 __SIGRTMIN + 47,
175 __SIGRTMIN + 48,
176 __SIGRTMIN + 49,
177 __SIGRTMIN + 50,
178 __SIGRTMIN + 51,
179 __SIGRTMIN + 52,
180 __SIGRTMIN + 53,
181 __SIGRTMIN + 54,
182 __SIGRTMIN + 55,
183 __SIGRTMIN + 56,
184 __SIGRTMIN + 57,
185 __SIGRTMIN + 58,
186 __SIGRTMIN + 59,
187 __SIGRTMIN + 60,
188 __SIGRTMIN + 61,
189 __SIGRTMIN + 62,
190 __SIGRTMIN + 63,
191 __SIGRTMIN + 64,
192 __SIGRTMIN + 65,
193 __SIGRTMIN + 66,
194 __SIGRTMIN + 67,
195 __SIGRTMIN + 68,
196 __SIGRTMIN + 69,
197 __SIGRTMIN + 70,
198 __SIGRTMIN + 71,
199 __SIGRTMIN + 72,
200 __SIGRTMIN + 73,
201 __SIGRTMIN + 74,
202 __SIGRTMIN + 75,
203 __SIGRTMIN + 76,
204 __SIGRTMIN + 77,
205 __SIGRTMIN + 78,
206 __SIGRTMIN + 79,
207 __SIGRTMIN + 80,
208 __SIGRTMIN + 81,
209 __SIGRTMIN + 82,
210 __SIGRTMIN + 83,
211 __SIGRTMIN + 84,
212 __SIGRTMIN + 85,
213 __SIGRTMIN + 86,
214 __SIGRTMIN + 87,
215 __SIGRTMIN + 88,
216 __SIGRTMIN + 89,
217 __SIGRTMIN + 90,
218 __SIGRTMIN + 91,
219 __SIGRTMIN + 92,
220 __SIGRTMIN + 93,
221 __SIGRTMIN + 94,
222 __SIGRTMIN + 95,
223 -1, /* SIGINFO */
224 -1, /* UNKNOWN */
225 -1, /* DEFAULT */
226 -1,
227 -1,
228 -1,
229 -1,
230 -1,
231 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000232#endif
aurel32ca587a82008-12-18 22:44:13 +0000233};
bellard8f447cc2006-06-14 15:21:14 +0000234#else
aurel32ca587a82008-12-18 22:44:13 +0000235/* In system mode we only need SIGINT and SIGTRAP; other signals
236 are not yet supported. */
237
238enum {
239 TARGET_SIGINT = 2,
240 TARGET_SIGTRAP = 5
241};
242
243static int gdb_signal_table[] = {
244 -1,
245 -1,
246 TARGET_SIGINT,
247 -1,
248 -1,
249 TARGET_SIGTRAP
250};
bellard8f447cc2006-06-14 15:21:14 +0000251#endif
bellardb4608c02003-06-27 17:34:32 +0000252
aurel32ca587a82008-12-18 22:44:13 +0000253#ifdef CONFIG_USER_ONLY
254static int target_signal_to_gdb (int sig)
255{
256 int i;
257 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
258 if (gdb_signal_table[i] == sig)
259 return i;
260 return GDB_SIGNAL_UNKNOWN;
261}
262#endif
263
264static int gdb_signal_to_target (int sig)
265{
266 if (sig < ARRAY_SIZE (gdb_signal_table))
267 return gdb_signal_table[sig];
268 else
269 return -1;
270}
271
bellard4abe6152003-07-26 18:01:58 +0000272//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000273
pbrook56aebc82008-10-11 17:55:29 +0000274typedef struct GDBRegisterState {
275 int base_reg;
276 int num_regs;
277 gdb_reg_cb get_reg;
278 gdb_reg_cb set_reg;
279 const char *xml;
280 struct GDBRegisterState *next;
281} GDBRegisterState;
282
bellard858693c2004-03-31 18:52:07 +0000283enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000284 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000285 RS_IDLE,
286 RS_GETLINE,
287 RS_CHKSUM1,
288 RS_CHKSUM2,
289};
bellard858693c2004-03-31 18:52:07 +0000290typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200291 CPUState *c_cpu; /* current CPU for step/continue ops */
292 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200293 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000294 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000295 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000296 int line_buf_index;
297 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000298 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000299 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000300 int signal;
bellard41625032005-04-24 10:07:11 +0000301#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000302 int fd;
bellard41625032005-04-24 10:07:11 +0000303 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000304#else
305 CharDriverState *chr;
aliguori8a34a0f2009-03-05 23:01:55 +0000306 CharDriverState *mon_chr;
bellard41625032005-04-24 10:07:11 +0000307#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000308 char syscall_buf[256];
309 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000310} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000311
edgar_igl60897d32008-05-09 08:25:14 +0000312/* By default use no IRQs and no timers while single stepping so as to
313 * make single stepping like an ICE HW step.
314 */
315static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
316
aliguori880a7572008-11-18 20:30:24 +0000317static GDBState *gdbserver_state;
318
pbrook56aebc82008-10-11 17:55:29 +0000319/* This is an ugly hack to cope with both new and old gdb.
320 If gdb sends qXfer:features:read then assume we're talking to a newish
321 gdb that understands target descriptions. */
322static int gdb_has_xml;
323
bellard1fddef42005-04-17 19:16:13 +0000324#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000325/* XXX: This is not thread safe. Do we care? */
326static int gdbserver_fd = -1;
327
bellard858693c2004-03-31 18:52:07 +0000328static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000329{
330 uint8_t ch;
331 int ret;
332
333 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000334 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000335 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000336 if (errno == ECONNRESET)
337 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000338 if (errno != EINTR && errno != EAGAIN)
339 return -1;
340 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000341 close(s->fd);
342 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000343 return -1;
344 } else {
345 break;
346 }
347 }
348 return ch;
349}
pbrook4046d912007-01-28 01:53:16 +0000350#endif
bellardb4608c02003-06-27 17:34:32 +0000351
blueswir1654efcf2009-04-18 07:29:59 +0000352static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000353 GDB_SYS_UNKNOWN,
354 GDB_SYS_ENABLED,
355 GDB_SYS_DISABLED,
356} gdb_syscall_mode;
357
358/* If gdb is connected when the first semihosting syscall occurs then use
359 remote gdb syscalls. Otherwise use native file IO. */
360int use_gdb_syscalls(void)
361{
362 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000363 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
364 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000365 }
366 return gdb_syscall_mode == GDB_SYS_ENABLED;
367}
368
edgar_iglba70a622008-03-14 06:10:42 +0000369/* Resume execution. */
370static inline void gdb_continue(GDBState *s)
371{
372#ifdef CONFIG_USER_ONLY
373 s->running_state = 1;
374#else
Paolo Bonzinibc7d0e62013-06-03 17:06:55 +0200375 if (runstate_check(RUN_STATE_GUEST_PANICKED)) {
376 runstate_set(RUN_STATE_DEBUG);
377 }
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200378 if (!runstate_needs_reset()) {
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200379 vm_start();
380 }
edgar_iglba70a622008-03-14 06:10:42 +0000381#endif
382}
383
bellard858693c2004-03-31 18:52:07 +0000384static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000385{
pbrook4046d912007-01-28 01:53:16 +0000386#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000387 int ret;
388
389 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000390 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000391 if (ret < 0) {
392 if (errno != EINTR && errno != EAGAIN)
393 return;
394 } else {
395 buf += ret;
396 len -= ret;
397 }
398 }
pbrook4046d912007-01-28 01:53:16 +0000399#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500400 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000401#endif
bellardb4608c02003-06-27 17:34:32 +0000402}
403
404static inline int fromhex(int v)
405{
406 if (v >= '0' && v <= '9')
407 return v - '0';
408 else if (v >= 'A' && v <= 'F')
409 return v - 'A' + 10;
410 else if (v >= 'a' && v <= 'f')
411 return v - 'a' + 10;
412 else
413 return 0;
414}
415
416static inline int tohex(int v)
417{
418 if (v < 10)
419 return v + '0';
420 else
421 return v - 10 + 'a';
422}
423
424static void memtohex(char *buf, const uint8_t *mem, int len)
425{
426 int i, c;
427 char *q;
428 q = buf;
429 for(i = 0; i < len; i++) {
430 c = mem[i];
431 *q++ = tohex(c >> 4);
432 *q++ = tohex(c & 0xf);
433 }
434 *q = '\0';
435}
436
437static void hextomem(uint8_t *mem, const char *buf, int len)
438{
439 int i;
440
441 for(i = 0; i < len; i++) {
442 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
443 buf += 2;
444 }
445}
446
bellardb4608c02003-06-27 17:34:32 +0000447/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000448static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000449{
pbrook56aebc82008-10-11 17:55:29 +0000450 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000451 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000452
bellardb4608c02003-06-27 17:34:32 +0000453 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000454 p = s->last_packet;
455 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000456 memcpy(p, buf, len);
457 p += len;
bellardb4608c02003-06-27 17:34:32 +0000458 csum = 0;
459 for(i = 0; i < len; i++) {
460 csum += buf[i];
461 }
pbrook4046d912007-01-28 01:53:16 +0000462 *(p++) = '#';
463 *(p++) = tohex((csum >> 4) & 0xf);
464 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000465
pbrook4046d912007-01-28 01:53:16 +0000466 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000467 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000468
pbrook4046d912007-01-28 01:53:16 +0000469#ifdef CONFIG_USER_ONLY
470 i = get_char(s);
471 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000472 return -1;
pbrook4046d912007-01-28 01:53:16 +0000473 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000474 break;
pbrook4046d912007-01-28 01:53:16 +0000475#else
476 break;
477#endif
bellardb4608c02003-06-27 17:34:32 +0000478 }
479 return 0;
480}
481
pbrook56aebc82008-10-11 17:55:29 +0000482/* return -1 if error, 0 if OK */
483static int put_packet(GDBState *s, const char *buf)
484{
485#ifdef DEBUG_GDB
486 printf("reply='%s'\n", buf);
487#endif
488
489 return put_packet_binary(s, buf, strlen(buf));
490}
491
492/* The GDB remote protocol transfers values in target byte order. This means
493 we can use the raw memory access routines to access the value buffer.
494 Conveniently, these also handle the case where the buffer is mis-aligned.
495 */
496#define GET_REG8(val) do { \
497 stb_p(mem_buf, val); \
498 return 1; \
499 } while(0)
500#define GET_REG16(val) do { \
501 stw_p(mem_buf, val); \
502 return 2; \
503 } while(0)
504#define GET_REG32(val) do { \
505 stl_p(mem_buf, val); \
506 return 4; \
507 } while(0)
508#define GET_REG64(val) do { \
509 stq_p(mem_buf, val); \
510 return 8; \
511 } while(0)
512
513#if TARGET_LONG_BITS == 64
514#define GET_REGL(val) GET_REG64(val)
515#define ldtul_p(addr) ldq_p(addr)
516#else
517#define GET_REGL(val) GET_REG32(val)
518#define ldtul_p(addr) ldl_p(addr)
519#endif
520
edgar_iglfde3fd62008-05-09 08:50:01 +0000521#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000522
Andreas Färberf20f9df2013-07-07 12:07:54 +0200523#include "target-i386/gdbstub.c"
bellard6da41ea2004-01-04 15:48:38 +0000524
bellard9e62fd72004-01-05 22:49:06 +0000525#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000526
aurel32e571cb42009-01-24 15:07:42 +0000527#if defined (TARGET_PPC64)
528#define GDB_CORE_XML "power64-core.xml"
529#else
530#define GDB_CORE_XML "power-core.xml"
531#endif
pbrook56aebc82008-10-11 17:55:29 +0000532
Andreas Färber0980bfa2013-07-07 12:26:33 +0200533#include "target-ppc/gdbstub.c"
pbrook56aebc82008-10-11 17:55:29 +0000534
bellarde95c8d52004-09-30 22:22:08 +0000535#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000536
Andreas Färberd19c87f2013-07-07 12:29:26 +0200537#include "target-sparc/gdbstub.c"
pbrook56aebc82008-10-11 17:55:29 +0000538
bellard1fddef42005-04-17 19:16:13 +0000539#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000540
pbrook56aebc82008-10-11 17:55:29 +0000541#define GDB_CORE_XML "arm-core.xml"
542
Andreas Färber58850da2013-07-07 12:32:15 +0200543#include "target-arm/gdbstub.c"
pbrook56aebc82008-10-11 17:55:29 +0000544
pbrooke6e59062006-10-22 00:18:54 +0000545#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +0000546
pbrook56aebc82008-10-11 17:55:29 +0000547#define GDB_CORE_XML "cf-core.xml"
548
Andreas Färberc88de142013-07-07 12:33:56 +0200549#include "target-m68k/gdbstub.c"
pbrooke6e59062006-10-22 00:18:54 +0000550
bellard6f970bd2005-12-05 19:55:19 +0000551#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +0000552
Andreas Färber814ac262013-07-07 12:38:42 +0200553#include "target-mips/gdbstub.c"
ths36d23952007-02-28 22:37:42 +0000554
Jia Liufc043552012-07-20 15:50:50 +0800555#elif defined(TARGET_OPENRISC)
556
Andreas Färber30028732013-07-07 12:40:38 +0200557#include "target-openrisc/gdbstub.c"
Jia Liufc043552012-07-20 15:50:50 +0800558
bellardfdf9b3e2006-04-27 21:07:38 +0000559#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +0000560
Andreas Färber2f937732013-07-07 12:42:52 +0200561#include "target-sh4/gdbstub.c"
ths6ef99fc2007-05-13 16:36:24 +0000562
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200563#elif defined (TARGET_MICROBLAZE)
564
Andreas Färbereabfc232013-07-07 12:45:47 +0200565#include "target-microblaze/gdbstub.c"
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200566
thsf1ccf902007-10-08 13:16:14 +0000567#elif defined (TARGET_CRIS)
568
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100569static int
Andreas Färberf3840912012-02-20 06:44:56 +0100570read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100571{
572 if (n < 15) {
573 GET_REG32(env->regs[n]);
574 }
575
576 if (n == 15) {
577 GET_REG32(env->pc);
578 }
579
580 if (n < 32) {
581 switch (n) {
582 case 16:
583 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100584 case 17:
585 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100586 case 20:
587 case 21:
588 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100589 default:
590 if (n >= 23) {
591 GET_REG32(env->pregs[n - 16]);
592 }
593 break;
594 }
595 }
596 return 0;
597}
598
Andreas Färberf3840912012-02-20 06:44:56 +0100599static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000600{
pbrook56aebc82008-10-11 17:55:29 +0000601 uint8_t srs;
602
Andreas Färber47d74ef2013-07-07 11:17:26 +0200603 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100604 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200605 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100606
pbrook56aebc82008-10-11 17:55:29 +0000607 srs = env->pregs[PR_SRS];
608 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200609 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +0000610 }
611
612 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200613 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +0000614 }
615 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200616 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +0000617 }
618 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200619 case 16:
620 GET_REG8(env->pregs[0]);
621 case 17:
622 GET_REG8(env->pregs[1]);
623 case 18:
624 GET_REG32(env->pregs[2]);
625 case 19:
626 GET_REG8(srs);
627 case 20:
628 GET_REG16(env->pregs[4]);
629 case 32:
630 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000631 }
632
633 return 0;
thsf1ccf902007-10-08 13:16:14 +0000634}
635
Andreas Färberf3840912012-02-20 06:44:56 +0100636static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000637{
pbrook56aebc82008-10-11 17:55:29 +0000638 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +0000639
Andreas Färber47d74ef2013-07-07 11:17:26 +0200640 if (n > 49) {
641 return 0;
642 }
thsf1ccf902007-10-08 13:16:14 +0000643
pbrook56aebc82008-10-11 17:55:29 +0000644 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +0000645
pbrook56aebc82008-10-11 17:55:29 +0000646 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200647 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000648 }
thsf1ccf902007-10-08 13:16:14 +0000649
edgar_igld7b69672008-10-11 19:32:21 +0000650 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200651 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +0000652 }
653
654 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +0000655 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200656 case 16:
657 return 1;
658 case 17:
659 return 1;
660 case 18:
661 env->pregs[PR_PID] = tmp;
662 break;
663 case 19:
664 return 1;
665 case 20:
666 return 2;
667 case 32:
668 env->pc = tmp;
669 break;
pbrook56aebc82008-10-11 17:55:29 +0000670 }
thsf1ccf902007-10-08 13:16:14 +0000671
pbrook56aebc82008-10-11 17:55:29 +0000672 return 4;
thsf1ccf902007-10-08 13:16:14 +0000673}
aurel3219bf5172008-12-07 23:26:32 +0000674#elif defined (TARGET_ALPHA)
675
Andreas Färberf3840912012-02-20 06:44:56 +0100676static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000677{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800678 uint64_t val;
679 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000680
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800681 switch (n) {
682 case 0 ... 30:
683 val = env->ir[n];
684 break;
685 case 32 ... 62:
686 d.d = env->fir[n - 32];
687 val = d.ll;
688 break;
689 case 63:
690 val = cpu_alpha_load_fpcr(env);
691 break;
692 case 64:
693 val = env->pc;
694 break;
695 case 66:
696 val = env->unique;
697 break;
698 case 31:
699 case 65:
700 /* 31 really is the zero register; 65 is unassigned in the
701 gdb protocol, but is still required to occupy 8 bytes. */
702 val = 0;
703 break;
704 default:
705 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000706 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800707 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +0000708}
709
Andreas Färberf3840912012-02-20 06:44:56 +0100710static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +0000711{
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800712 target_ulong tmp = ldtul_p(mem_buf);
713 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +0000714
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800715 switch (n) {
716 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +0000717 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -0800718 break;
719 case 32 ... 62:
720 d.ll = tmp;
721 env->fir[n - 32] = d.d;
722 break;
723 case 63:
724 cpu_alpha_store_fpcr(env, tmp);
725 break;
726 case 64:
727 env->pc = tmp;
728 break;
729 case 66:
730 env->unique = tmp;
731 break;
732 case 31:
733 case 65:
734 /* 31 really is the zero register; 65 is unassigned in the
735 gdb protocol, but is still required to occupy 8 bytes. */
736 break;
737 default:
738 return 0;
aurel3219bf5172008-12-07 23:26:32 +0000739 }
aurel3219bf5172008-12-07 23:26:32 +0000740 return 8;
741}
Alexander Grafafcb0e42009-12-05 12:44:29 +0100742#elif defined (TARGET_S390X)
743
Andreas Färberf3840912012-02-20 06:44:56 +0100744static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100745{
Richard Henderson6ee77b12012-08-23 10:44:45 -0700746 uint64_t val;
747 int cc_op;
748
Alexander Grafafcb0e42009-12-05 12:44:29 +0100749 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700750 case S390_PSWM_REGNUM:
751 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
752 val = deposit64(env->psw.mask, 44, 2, cc_op);
753 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700754 case S390_PSWA_REGNUM:
755 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700756 case S390_R0_REGNUM ... S390_R15_REGNUM:
757 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700758 case S390_A0_REGNUM ... S390_A15_REGNUM:
759 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700760 case S390_FPC_REGNUM:
761 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -0700762 case S390_F0_REGNUM ... S390_F15_REGNUM:
763 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +0100764 }
765
766 return 0;
767}
768
Andreas Färberf3840912012-02-20 06:44:56 +0100769static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +0100770{
771 target_ulong tmpl;
772 uint32_t tmp32;
773 int r = 8;
774 tmpl = ldtul_p(mem_buf);
775 tmp32 = ldl_p(mem_buf);
776
777 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -0700778 case S390_PSWM_REGNUM:
779 env->psw.mask = tmpl;
780 env->cc_op = extract64(tmpl, 44, 2);
781 break;
782 case S390_PSWA_REGNUM:
783 env->psw.addr = tmpl;
784 break;
785 case S390_R0_REGNUM ... S390_R15_REGNUM:
786 env->regs[n-S390_R0_REGNUM] = tmpl;
787 break;
788 case S390_A0_REGNUM ... S390_A15_REGNUM:
789 env->aregs[n-S390_A0_REGNUM] = tmp32;
790 r = 4;
791 break;
792 case S390_FPC_REGNUM:
793 env->fpc = tmp32;
794 r = 4;
795 break;
796 case S390_F0_REGNUM ... S390_F15_REGNUM:
797 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
798 break;
799 default:
800 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +0100801 }
Alexander Grafafcb0e42009-12-05 12:44:29 +0100802 return r;
803}
Michael Walle0c45d3d2011-02-17 23:45:06 +0100804#elif defined (TARGET_LM32)
805
Paolo Bonzini0d09e412013-02-05 17:06:20 +0100806#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +0100807
Andreas Färberf3840912012-02-20 06:44:56 +0100808static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100809{
810 if (n < 32) {
811 GET_REG32(env->regs[n]);
812 } else {
813 switch (n) {
814 case 32:
815 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100816 /* FIXME: put in right exception ID */
817 case 33:
818 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100819 case 34:
820 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100821 case 35:
822 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100823 case 36:
824 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100825 case 37:
826 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100827 case 38:
828 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +0100829 }
830 }
831 return 0;
832}
833
Andreas Färberf3840912012-02-20 06:44:56 +0100834static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +0100835{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200836 LM32CPU *cpu = lm32_env_get_cpu(env);
837 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +0100838 uint32_t tmp;
839
Andreas Färbera0e372f2013-06-28 23:18:47 +0200840 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +0100841 return 0;
842 }
843
844 tmp = ldl_p(mem_buf);
845
846 if (n < 32) {
847 env->regs[n] = tmp;
848 } else {
849 switch (n) {
850 case 32:
851 env->pc = tmp;
852 break;
853 case 34:
854 env->eba = tmp;
855 break;
856 case 35:
857 env->deba = tmp;
858 break;
859 case 36:
860 env->ie = tmp;
861 break;
862 case 37:
863 lm32_pic_set_im(env->pic_state, tmp);
864 break;
865 case 38:
866 lm32_pic_set_ip(env->pic_state, tmp);
867 break;
868 }
869 }
870 return 4;
871}
Max Filippovccfcaba2011-09-06 03:55:52 +0400872#elif defined(TARGET_XTENSA)
873
Andreas Färberf3840912012-02-20 06:44:56 +0100874static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400875{
876 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
877
878 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
879 return 0;
880 }
881
882 switch (reg->type) {
883 case 9: /*pc*/
884 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +0400885
886 case 1: /*ar*/
887 xtensa_sync_phys_from_window(env);
888 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400889
890 case 2: /*SR*/
891 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400892
893 case 3: /*UR*/
894 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400895
Max Filippovdd519cb2012-09-19 04:23:54 +0400896 case 4: /*f*/
897 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +0400898
Max Filippovccfcaba2011-09-06 03:55:52 +0400899 case 8: /*a*/
900 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +0400901
902 default:
903 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200904 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400905 return 0;
906 }
907}
908
Andreas Färberf3840912012-02-20 06:44:56 +0100909static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +0400910{
911 uint32_t tmp;
912 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
913
914 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
915 return 0;
916 }
917
918 tmp = ldl_p(mem_buf);
919
920 switch (reg->type) {
921 case 9: /*pc*/
922 env->pc = tmp;
923 break;
924
925 case 1: /*ar*/
926 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
927 xtensa_sync_window_from_phys(env);
928 break;
929
930 case 2: /*SR*/
931 env->sregs[reg->targno & 0xff] = tmp;
932 break;
933
934 case 3: /*UR*/
935 env->uregs[reg->targno & 0xff] = tmp;
936 break;
937
Max Filippovdd519cb2012-09-19 04:23:54 +0400938 case 4: /*f*/
939 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
940 break;
941
Max Filippovccfcaba2011-09-06 03:55:52 +0400942 case 8: /*a*/
943 env->regs[reg->targno & 0x0f] = tmp;
944 break;
945
946 default:
947 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +0200948 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +0400949 return 0;
950 }
951
952 return 4;
953}
bellard1fddef42005-04-17 19:16:13 +0000954#else
pbrook56aebc82008-10-11 17:55:29 +0000955
Andreas Färber9349b4f2012-03-14 01:38:32 +0100956static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000957{
958 return 0;
959}
960
Andreas Färber9349b4f2012-03-14 01:38:32 +0100961static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +0000962{
pbrook56aebc82008-10-11 17:55:29 +0000963 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000964}
965
966#endif
bellardb4608c02003-06-27 17:34:32 +0000967
pbrook56aebc82008-10-11 17:55:29 +0000968#ifdef GDB_CORE_XML
969/* Encode data using the encoding for 'x' packets. */
970static int memtox(char *buf, const char *mem, int len)
971{
972 char *p = buf;
973 char c;
974
975 while (len--) {
976 c = *(mem++);
977 switch (c) {
978 case '#': case '$': case '*': case '}':
979 *(p++) = '}';
980 *(p++) = c ^ 0x20;
981 break;
982 default:
983 *(p++) = c;
984 break;
985 }
986 }
987 return p - buf;
988}
989
aurel323faf7782008-12-07 23:26:17 +0000990static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +0000991{
pbrook56aebc82008-10-11 17:55:29 +0000992 size_t len;
993 int i;
994 const char *name;
995 static char target_xml[1024];
996
997 len = 0;
998 while (p[len] && p[len] != ':')
999 len++;
1000 *newp = p + len;
1001
1002 name = NULL;
1003 if (strncmp(p, "target.xml", len) == 0) {
1004 /* Generate the XML description for this CPU. */
1005 if (!target_xml[0]) {
1006 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001007 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001008
blueswir15b3715b2008-10-25 11:18:12 +00001009 snprintf(target_xml, sizeof(target_xml),
1010 "<?xml version=\"1.0\"?>"
1011 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1012 "<target>"
1013 "<xi:include href=\"%s\"/>",
1014 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001015
Andreas Färbereac8b352013-06-28 21:11:37 +02001016 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001017 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1018 pstrcat(target_xml, sizeof(target_xml), r->xml);
1019 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001020 }
blueswir12dc766d2009-04-13 16:06:19 +00001021 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001022 }
1023 return target_xml;
1024 }
1025 for (i = 0; ; i++) {
1026 name = xml_builtin[i][0];
1027 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1028 break;
1029 }
1030 return name ? xml_builtin[i][1] : NULL;
1031}
1032#endif
1033
Andreas Färber385b9f02013-06-27 18:25:36 +02001034static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001035{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001036 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001037 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001038 GDBRegisterState *r;
1039
Andreas Färbera0e372f2013-06-28 23:18:47 +02001040 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001041 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001042 }
pbrook56aebc82008-10-11 17:55:29 +00001043
Andreas Färbereac8b352013-06-28 21:11:37 +02001044 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001045 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1046 return r->get_reg(env, mem_buf, reg - r->base_reg);
1047 }
1048 }
1049 return 0;
1050}
1051
Andreas Färber385b9f02013-06-27 18:25:36 +02001052static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001053{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001054 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001055 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001056 GDBRegisterState *r;
1057
Andreas Färbera0e372f2013-06-28 23:18:47 +02001058 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001059 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001060 }
pbrook56aebc82008-10-11 17:55:29 +00001061
Andreas Färbereac8b352013-06-28 21:11:37 +02001062 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001063 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1064 return r->set_reg(env, mem_buf, reg - r->base_reg);
1065 }
1066 }
1067 return 0;
1068}
1069
1070/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1071 specifies the first register number and these registers are included in
1072 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1073 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1074 */
1075
Andreas Färber22169d42013-06-28 21:27:39 +02001076void gdb_register_coprocessor(CPUState *cpu,
1077 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1078 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001079{
1080 GDBRegisterState *s;
1081 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001082
Andreas Färbereac8b352013-06-28 21:11:37 +02001083 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001084 while (*p) {
1085 /* Check for duplicates. */
1086 if (strcmp((*p)->xml, xml) == 0)
1087 return;
1088 p = &(*p)->next;
1089 }
Stefan Weil9643c252011-10-18 22:25:38 +02001090
1091 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001092 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02001093 s->num_regs = num_regs;
1094 s->get_reg = get_reg;
1095 s->set_reg = set_reg;
1096 s->xml = xml;
1097
pbrook56aebc82008-10-11 17:55:29 +00001098 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02001099 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00001100 *p = s;
1101 if (g_pos) {
1102 if (g_pos != s->base_reg) {
1103 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1104 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001105 }
1106 }
1107}
1108
aliguoria1d1bb32008-11-18 20:07:32 +00001109#ifndef CONFIG_USER_ONLY
1110static const int xlat_gdb_type[] = {
1111 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1112 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1113 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1114};
1115#endif
1116
aliguori880a7572008-11-18 20:30:24 +00001117static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001118{
Andreas Färber182735e2013-05-29 22:29:20 +02001119 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001120 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001121 int err = 0;
1122
Andreas Färber62278812013-06-27 17:12:06 +02001123 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001124 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001125 }
aliguorie22a25c2009-03-12 20:12:48 +00001126
aliguoria1d1bb32008-11-18 20:07:32 +00001127 switch (type) {
1128 case GDB_BREAKPOINT_SW:
1129 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001130 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1131 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001132 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1133 if (err)
1134 break;
1135 }
1136 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001137#ifndef CONFIG_USER_ONLY
1138 case GDB_WATCHPOINT_WRITE:
1139 case GDB_WATCHPOINT_READ:
1140 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001141 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1142 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001143 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1144 NULL);
1145 if (err)
1146 break;
1147 }
1148 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001149#endif
1150 default:
1151 return -ENOSYS;
1152 }
1153}
1154
aliguori880a7572008-11-18 20:30:24 +00001155static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001156{
Andreas Färber182735e2013-05-29 22:29:20 +02001157 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001158 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001159 int err = 0;
1160
Andreas Färber62278812013-06-27 17:12:06 +02001161 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001162 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001163 }
aliguorie22a25c2009-03-12 20:12:48 +00001164
aliguoria1d1bb32008-11-18 20:07:32 +00001165 switch (type) {
1166 case GDB_BREAKPOINT_SW:
1167 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001168 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1169 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001170 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1171 if (err)
1172 break;
1173 }
1174 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001175#ifndef CONFIG_USER_ONLY
1176 case GDB_WATCHPOINT_WRITE:
1177 case GDB_WATCHPOINT_READ:
1178 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001179 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1180 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001181 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1182 if (err)
1183 break;
1184 }
1185 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001186#endif
1187 default:
1188 return -ENOSYS;
1189 }
1190}
1191
aliguori880a7572008-11-18 20:30:24 +00001192static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001193{
Andreas Färber182735e2013-05-29 22:29:20 +02001194 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001195 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001196
aliguorie22a25c2009-03-12 20:12:48 +00001197 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001198 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001199 return;
1200 }
1201
Andreas Färber182735e2013-05-29 22:29:20 +02001202 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1203 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001204 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001205#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001206 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001207#endif
aliguori880a7572008-11-18 20:30:24 +00001208 }
aliguoria1d1bb32008-11-18 20:07:32 +00001209}
1210
aurel32fab9d282009-04-08 21:29:37 +00001211static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1212{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001213 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001214 CPUClass *cc = CPU_GET_CLASS(cpu);
1215
1216 cpu_synchronize_state(cpu);
1217 if (cc->set_pc) {
1218 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001219 }
aurel32fab9d282009-04-08 21:29:37 +00001220}
1221
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001222static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001223{
Andreas Färber0d342822012-12-17 07:12:13 +01001224 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001225
Andreas Färber182735e2013-05-29 22:29:20 +02001226 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001227 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001228 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001229 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001230 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001231
1232 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001233}
1234
aliguori880a7572008-11-18 20:30:24 +00001235static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001236{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001237 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001238 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001239 uint32_t thread;
1240 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001241 char buf[MAX_PACKET_LENGTH];
1242 uint8_t mem_buf[MAX_PACKET_LENGTH];
1243 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001244 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001245
bellard858693c2004-03-31 18:52:07 +00001246#ifdef DEBUG_GDB
1247 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001248#endif
bellard858693c2004-03-31 18:52:07 +00001249 p = line_buf;
1250 ch = *p++;
1251 switch(ch) {
1252 case '?':
bellard1fddef42005-04-17 19:16:13 +00001253 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001254 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001255 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001256 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001257 /* Remove all the breakpoints when this query is issued,
1258 * because gdb is doing and initial connect and the state
1259 * should be cleaned up.
1260 */
aliguori880a7572008-11-18 20:30:24 +00001261 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001262 break;
1263 case 'c':
1264 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001265 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001266 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001267 }
aurel32ca587a82008-12-18 22:44:13 +00001268 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001269 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001270 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001271 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001272 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1273 if (s->signal == -1)
1274 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001275 gdb_continue(s);
1276 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001277 case 'v':
1278 if (strncmp(p, "Cont", 4) == 0) {
1279 int res_signal, res_thread;
1280
1281 p += 4;
1282 if (*p == '?') {
1283 put_packet(s, "vCont;c;C;s;S");
1284 break;
1285 }
1286 res = 0;
1287 res_signal = 0;
1288 res_thread = 0;
1289 while (*p) {
1290 int action, signal;
1291
1292 if (*p++ != ';') {
1293 res = 0;
1294 break;
1295 }
1296 action = *p++;
1297 signal = 0;
1298 if (action == 'C' || action == 'S') {
1299 signal = strtoul(p, (char **)&p, 16);
1300 } else if (action != 'c' && action != 's') {
1301 res = 0;
1302 break;
1303 }
1304 thread = 0;
1305 if (*p == ':') {
1306 thread = strtoull(p+1, (char **)&p, 16);
1307 }
1308 action = tolower(action);
1309 if (res == 0 || (res == 'c' && action == 's')) {
1310 res = action;
1311 res_signal = signal;
1312 res_thread = thread;
1313 }
1314 }
1315 if (res) {
1316 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001317 cpu = find_cpu(res_thread);
1318 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001319 put_packet(s, "E22");
1320 break;
1321 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001322 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001323 }
1324 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001325 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001326 }
1327 s->signal = res_signal;
1328 gdb_continue(s);
1329 return RS_IDLE;
1330 }
1331 break;
1332 } else {
1333 goto unknown_command;
1334 }
edgar_igl7d03f822008-05-17 18:58:29 +00001335 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001336#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001337 /* Kill the target */
1338 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1339 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001340#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001341 case 'D':
1342 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001343 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001344 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001345 gdb_continue(s);
1346 put_packet(s, "OK");
1347 break;
bellard858693c2004-03-31 18:52:07 +00001348 case 's':
1349 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001350 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001351 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001352 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001353 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001354 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001355 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001356 case 'F':
1357 {
1358 target_ulong ret;
1359 target_ulong err;
1360
1361 ret = strtoull(p, (char **)&p, 16);
1362 if (*p == ',') {
1363 p++;
1364 err = strtoull(p, (char **)&p, 16);
1365 } else {
1366 err = 0;
1367 }
1368 if (*p == ',')
1369 p++;
1370 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001371 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001372 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001373 s->current_syscall_cb = NULL;
1374 }
pbrooka2d1eba2007-01-28 03:10:55 +00001375 if (type == 'C') {
1376 put_packet(s, "T02");
1377 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001378 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001379 }
1380 }
1381 break;
bellard858693c2004-03-31 18:52:07 +00001382 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001383 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001384 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001385 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001386 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001387 len += reg_size;
1388 }
1389 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001390 put_packet(s, buf);
1391 break;
1392 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001393 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001394 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001395 len = strlen(p) / 2;
1396 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001397 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001398 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001399 len -= reg_size;
1400 registers += reg_size;
1401 }
bellard858693c2004-03-31 18:52:07 +00001402 put_packet(s, "OK");
1403 break;
1404 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001405 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001406 if (*p == ',')
1407 p++;
bellard9d9754a2006-06-25 15:32:37 +00001408 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001409 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001410 put_packet (s, "E14");
1411 } else {
1412 memtohex(buf, mem_buf, len);
1413 put_packet(s, buf);
1414 }
bellard858693c2004-03-31 18:52:07 +00001415 break;
1416 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001417 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001418 if (*p == ',')
1419 p++;
bellard9d9754a2006-06-25 15:32:37 +00001420 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001421 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001422 p++;
1423 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001424 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001425 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001426 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001427 } else {
bellard858693c2004-03-31 18:52:07 +00001428 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001429 }
bellard858693c2004-03-31 18:52:07 +00001430 break;
pbrook56aebc82008-10-11 17:55:29 +00001431 case 'p':
1432 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1433 This works, but can be very slow. Anything new enough to
1434 understand XML also knows how to use this properly. */
1435 if (!gdb_has_xml)
1436 goto unknown_command;
1437 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001438 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001439 if (reg_size) {
1440 memtohex(buf, mem_buf, reg_size);
1441 put_packet(s, buf);
1442 } else {
1443 put_packet(s, "E14");
1444 }
1445 break;
1446 case 'P':
1447 if (!gdb_has_xml)
1448 goto unknown_command;
1449 addr = strtoull(p, (char **)&p, 16);
1450 if (*p == '=')
1451 p++;
1452 reg_size = strlen(p) / 2;
1453 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001454 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001455 put_packet(s, "OK");
1456 break;
bellard858693c2004-03-31 18:52:07 +00001457 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001458 case 'z':
1459 type = strtoul(p, (char **)&p, 16);
1460 if (*p == ',')
1461 p++;
bellard9d9754a2006-06-25 15:32:37 +00001462 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001463 if (*p == ',')
1464 p++;
bellard9d9754a2006-06-25 15:32:37 +00001465 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001466 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001467 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001468 else
aliguori880a7572008-11-18 20:30:24 +00001469 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001470 if (res >= 0)
1471 put_packet(s, "OK");
1472 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001473 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001474 else
1475 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001476 break;
aliguori880a7572008-11-18 20:30:24 +00001477 case 'H':
1478 type = *p++;
1479 thread = strtoull(p, (char **)&p, 16);
1480 if (thread == -1 || thread == 0) {
1481 put_packet(s, "OK");
1482 break;
1483 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001484 cpu = find_cpu(thread);
1485 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001486 put_packet(s, "E22");
1487 break;
1488 }
1489 switch (type) {
1490 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001491 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001492 put_packet(s, "OK");
1493 break;
1494 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001495 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001496 put_packet(s, "OK");
1497 break;
1498 default:
1499 put_packet(s, "E22");
1500 break;
1501 }
1502 break;
1503 case 'T':
1504 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001505 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001506
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001507 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001508 put_packet(s, "OK");
1509 } else {
aliguori880a7572008-11-18 20:30:24 +00001510 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001511 }
aliguori880a7572008-11-18 20:30:24 +00001512 break;
pbrook978efd62006-06-17 18:30:42 +00001513 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001514 case 'Q':
1515 /* parse any 'q' packets here */
1516 if (!strcmp(p,"qemu.sstepbits")) {
1517 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001518 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1519 SSTEP_ENABLE,
1520 SSTEP_NOIRQ,
1521 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001522 put_packet(s, buf);
1523 break;
1524 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1525 /* Display or change the sstep_flags */
1526 p += 10;
1527 if (*p != '=') {
1528 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001529 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001530 put_packet(s, buf);
1531 break;
1532 }
1533 p++;
1534 type = strtoul(p, (char **)&p, 16);
1535 sstep_flags = type;
1536 put_packet(s, "OK");
1537 break;
aliguori880a7572008-11-18 20:30:24 +00001538 } else if (strcmp(p,"C") == 0) {
1539 /* "Current thread" remains vague in the spec, so always return
1540 * the first CPU (gdb returns the first thread). */
1541 put_packet(s, "QC1");
1542 break;
1543 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001544 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001545 goto report_cpuinfo;
1546 } else if (strcmp(p,"sThreadInfo") == 0) {
1547 report_cpuinfo:
1548 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001549 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001550 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001551 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001552 } else
1553 put_packet(s, "l");
1554 break;
1555 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1556 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001557 cpu = find_cpu(thread);
1558 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001559 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001560 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001561 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001562 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001563 memtohex(buf, mem_buf, len);
1564 put_packet(s, buf);
1565 }
aliguori880a7572008-11-18 20:30:24 +00001566 break;
edgar_igl60897d32008-05-09 08:25:14 +00001567 }
blueswir10b8a9882009-03-07 10:51:36 +00001568#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001569 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001570 CPUArchState *env = s->c_cpu->env_ptr;
1571 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001572
blueswir1363a37d2008-08-21 17:58:08 +00001573 snprintf(buf, sizeof(buf),
1574 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1575 ";Bss=" TARGET_ABI_FMT_lx,
1576 ts->info->code_offset,
1577 ts->info->data_offset,
1578 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001579 put_packet(s, buf);
1580 break;
1581 }
blueswir10b8a9882009-03-07 10:51:36 +00001582#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001583 else if (strncmp(p, "Rcmd,", 5) == 0) {
1584 int len = strlen(p + 5);
1585
1586 if ((len % 2) != 0) {
1587 put_packet(s, "E01");
1588 break;
1589 }
1590 hextomem(mem_buf, p + 5, len);
1591 len = len / 2;
1592 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001593 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001594 put_packet(s, "OK");
1595 break;
1596 }
blueswir10b8a9882009-03-07 10:51:36 +00001597#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001598 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001599 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001600#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001601 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001602#endif
1603 put_packet(s, buf);
1604 break;
1605 }
1606#ifdef GDB_CORE_XML
1607 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1608 const char *xml;
1609 target_ulong total_len;
1610
1611 gdb_has_xml = 1;
1612 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001613 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001614 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001615 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001616 put_packet(s, buf);
1617 break;
1618 }
1619
1620 if (*p == ':')
1621 p++;
1622 addr = strtoul(p, (char **)&p, 16);
1623 if (*p == ',')
1624 p++;
1625 len = strtoul(p, (char **)&p, 16);
1626
1627 total_len = strlen(xml);
1628 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001629 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001630 put_packet(s, buf);
1631 break;
1632 }
1633 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1634 len = (MAX_PACKET_LENGTH - 5) / 2;
1635 if (len < total_len - addr) {
1636 buf[0] = 'm';
1637 len = memtox(buf + 1, xml + addr, len);
1638 } else {
1639 buf[0] = 'l';
1640 len = memtox(buf + 1, xml + addr, total_len - addr);
1641 }
1642 put_packet_binary(s, buf, len + 1);
1643 break;
1644 }
1645#endif
1646 /* Unrecognised 'q' command. */
1647 goto unknown_command;
1648
bellard858693c2004-03-31 18:52:07 +00001649 default:
pbrook56aebc82008-10-11 17:55:29 +00001650 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001651 /* put empty packet */
1652 buf[0] = '\0';
1653 put_packet(s, buf);
1654 break;
1655 }
1656 return RS_IDLE;
1657}
1658
Andreas Färber64f6b342013-05-27 02:06:09 +02001659void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001660{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001661 gdbserver_state->c_cpu = cpu;
1662 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001663}
1664
bellard1fddef42005-04-17 19:16:13 +00001665#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001666static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001667{
aliguori880a7572008-11-18 20:30:24 +00001668 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001669 CPUArchState *env = s->c_cpu->env_ptr;
1670 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001671 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001672 const char *type;
bellard858693c2004-03-31 18:52:07 +00001673 int ret;
1674
Meador Ingecdb432b2012-03-15 17:49:45 +00001675 if (running || s->state == RS_INACTIVE) {
1676 return;
1677 }
1678 /* Is there a GDB syscall waiting to be sent? */
1679 if (s->current_syscall_cb) {
1680 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001681 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001682 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001683 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001684 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00001685 if (env->watchpoint_hit) {
1686 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001687 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001688 type = "r";
1689 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001690 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001691 type = "a";
1692 break;
1693 default:
1694 type = "";
1695 break;
1696 }
aliguori880a7572008-11-18 20:30:24 +00001697 snprintf(buf, sizeof(buf),
1698 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001699 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00001700 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00001701 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001702 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001703 }
Jan Kiszka425189a2011-03-22 11:02:09 +01001704 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001705 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001706 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001707 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001708 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001709 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001710 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001711 ret = GDB_SIGNAL_QUIT;
1712 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001713 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001714 ret = GDB_SIGNAL_IO;
1715 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001716 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001717 ret = GDB_SIGNAL_ALRM;
1718 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001719 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001720 ret = GDB_SIGNAL_ABRT;
1721 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001722 case RUN_STATE_SAVE_VM:
1723 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001724 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001725 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001726 ret = GDB_SIGNAL_XCPU;
1727 break;
1728 default:
1729 ret = GDB_SIGNAL_UNKNOWN;
1730 break;
bellardbbeb7b52006-04-23 18:42:15 +00001731 }
Andreas Färber0d342822012-12-17 07:12:13 +01001732 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001733
1734send_packet:
bellard858693c2004-03-31 18:52:07 +00001735 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001736
1737 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001738 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001739}
bellard1fddef42005-04-17 19:16:13 +00001740#endif
bellard858693c2004-03-31 18:52:07 +00001741
pbrooka2d1eba2007-01-28 03:10:55 +00001742/* Send a gdb syscall request.
1743 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001744 %x - target_ulong argument printed in hex.
1745 %lx - 64-bit argument printed in hex.
1746 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001747void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001748{
1749 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00001750 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001751 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001752 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001753 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001754 GDBState *s;
1755
aliguori880a7572008-11-18 20:30:24 +00001756 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001757 if (!s)
1758 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001759 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001760#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001761 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001762#endif
pbrooka2d1eba2007-01-28 03:10:55 +00001763 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00001764 p = s->syscall_buf;
1765 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001766 *(p++) = 'F';
1767 while (*fmt) {
1768 if (*fmt == '%') {
1769 fmt++;
1770 switch (*fmt++) {
1771 case 'x':
1772 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001773 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001774 break;
pbrooka87295e2007-05-26 15:09:38 +00001775 case 'l':
1776 if (*(fmt++) != 'x')
1777 goto bad_format;
1778 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001779 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001780 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001781 case 's':
1782 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001783 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001784 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001785 break;
1786 default:
pbrooka87295e2007-05-26 15:09:38 +00001787 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001788 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1789 fmt - 1);
1790 break;
1791 }
1792 } else {
1793 *(p++) = *(fmt++);
1794 }
1795 }
pbrook8a93e022007-08-06 13:19:15 +00001796 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001797 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00001798#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001799 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001800 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001801#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001802 /* In this case wait to send the syscall packet until notification that
1803 the CPU has stopped. This must be done because if the packet is sent
1804 now the reply from the syscall request could be received while the CPU
1805 is still in the running state, which can cause packets to be dropped
1806 and state transition 'T' packets to be sent while the syscall is still
1807 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001808 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001809#endif
1810}
1811
bellard6a00d602005-11-21 23:25:50 +00001812static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001813{
1814 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001815 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001816
bellard1fddef42005-04-17 19:16:13 +00001817#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001818 if (s->last_packet_len) {
1819 /* Waiting for a response to the last packet. If we see the start
1820 of a new command then abandon the previous response. */
1821 if (ch == '-') {
1822#ifdef DEBUG_GDB
1823 printf("Got NACK, retransmitting\n");
1824#endif
thsffe8ab82007-12-16 03:16:05 +00001825 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001826 }
1827#ifdef DEBUG_GDB
1828 else if (ch == '+')
1829 printf("Got ACK\n");
1830 else
1831 printf("Got '%c' when expecting ACK/NACK\n", ch);
1832#endif
1833 if (ch == '+' || ch == '$')
1834 s->last_packet_len = 0;
1835 if (ch != '$')
1836 return;
1837 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001838 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001839 /* when the CPU is running, we cannot do anything except stop
1840 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001841 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001842 } else
bellard1fddef42005-04-17 19:16:13 +00001843#endif
bellard41625032005-04-24 10:07:11 +00001844 {
bellard858693c2004-03-31 18:52:07 +00001845 switch(s->state) {
1846 case RS_IDLE:
1847 if (ch == '$') {
1848 s->line_buf_index = 0;
1849 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001850 }
1851 break;
bellard858693c2004-03-31 18:52:07 +00001852 case RS_GETLINE:
1853 if (ch == '#') {
1854 s->state = RS_CHKSUM1;
1855 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1856 s->state = RS_IDLE;
1857 } else {
1858 s->line_buf[s->line_buf_index++] = ch;
1859 }
1860 break;
1861 case RS_CHKSUM1:
1862 s->line_buf[s->line_buf_index] = '\0';
1863 s->line_csum = fromhex(ch) << 4;
1864 s->state = RS_CHKSUM2;
1865 break;
1866 case RS_CHKSUM2:
1867 s->line_csum |= fromhex(ch);
1868 csum = 0;
1869 for(i = 0; i < s->line_buf_index; i++) {
1870 csum += s->line_buf[i];
1871 }
1872 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001873 reply = '-';
1874 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001875 s->state = RS_IDLE;
1876 } else {
ths60fe76f2007-12-16 03:02:09 +00001877 reply = '+';
1878 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001879 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001880 }
bellardb4608c02003-06-27 17:34:32 +00001881 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001882 default:
1883 abort();
bellardb4608c02003-06-27 17:34:32 +00001884 }
1885 }
bellard858693c2004-03-31 18:52:07 +00001886}
1887
Paul Brook0e1c9c52010-06-16 13:03:51 +01001888/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001889void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001890{
1891 GDBState *s;
1892 char buf[4];
1893
1894 s = gdbserver_state;
1895 if (!s) {
1896 return;
1897 }
1898#ifdef CONFIG_USER_ONLY
1899 if (gdbserver_fd < 0 || s->fd < 0) {
1900 return;
1901 }
1902#endif
1903
1904 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1905 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001906
1907#ifndef CONFIG_USER_ONLY
1908 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05001909 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001910 }
1911#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001912}
1913
bellard1fddef42005-04-17 19:16:13 +00001914#ifdef CONFIG_USER_ONLY
1915int
aurel32ca587a82008-12-18 22:44:13 +00001916gdb_queuesig (void)
1917{
1918 GDBState *s;
1919
1920 s = gdbserver_state;
1921
1922 if (gdbserver_fd < 0 || s->fd < 0)
1923 return 0;
1924 else
1925 return 1;
1926}
1927
1928int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001929gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001930{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001931 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001932 GDBState *s;
1933 char buf[256];
1934 int n;
bellard1fddef42005-04-17 19:16:13 +00001935
Andreas Färber5ca666c2013-06-24 19:20:57 +02001936 s = gdbserver_state;
1937 if (gdbserver_fd < 0 || s->fd < 0) {
1938 return sig;
bellard1fddef42005-04-17 19:16:13 +00001939 }
1940
Andreas Färber5ca666c2013-06-24 19:20:57 +02001941 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001942 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02001943 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00001944
Andreas Färber5ca666c2013-06-24 19:20:57 +02001945 if (sig != 0) {
1946 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1947 put_packet(s, buf);
1948 }
1949 /* put_packet() might have detected that the peer terminated the
1950 connection. */
1951 if (s->fd < 0) {
1952 return sig;
1953 }
1954
1955 sig = 0;
1956 s->state = RS_IDLE;
1957 s->running_state = 0;
1958 while (s->running_state == 0) {
1959 n = read(s->fd, buf, 256);
1960 if (n > 0) {
1961 int i;
1962
1963 for (i = 0; i < n; i++) {
1964 gdb_read_byte(s, buf[i]);
1965 }
1966 } else if (n == 0 || errno != EAGAIN) {
1967 /* XXX: Connection closed. Should probably wait for another
1968 connection before continuing. */
1969 return sig;
bellard1fddef42005-04-17 19:16:13 +00001970 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001971 }
1972 sig = s->signal;
1973 s->signal = 0;
1974 return sig;
bellard1fddef42005-04-17 19:16:13 +00001975}
bellarde9009672005-04-26 20:42:36 +00001976
aurel32ca587a82008-12-18 22:44:13 +00001977/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001978void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001979{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001980 GDBState *s;
1981 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001982
Andreas Färber5ca666c2013-06-24 19:20:57 +02001983 s = gdbserver_state;
1984 if (gdbserver_fd < 0 || s->fd < 0) {
1985 return;
1986 }
aurel32ca587a82008-12-18 22:44:13 +00001987
Andreas Färber5ca666c2013-06-24 19:20:57 +02001988 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1989 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001990}
bellard1fddef42005-04-17 19:16:13 +00001991
aliguori880a7572008-11-18 20:30:24 +00001992static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001993{
1994 GDBState *s;
1995 struct sockaddr_in sockaddr;
1996 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001997 int fd;
bellard858693c2004-03-31 18:52:07 +00001998
1999 for(;;) {
2000 len = sizeof(sockaddr);
2001 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2002 if (fd < 0 && errno != EINTR) {
2003 perror("accept");
2004 return;
2005 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002006#ifndef _WIN32
2007 fcntl(fd, F_SETFD, FD_CLOEXEC);
2008#endif
bellard858693c2004-03-31 18:52:07 +00002009 break;
2010 }
2011 }
2012
2013 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002014 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002015
Anthony Liguori7267c092011-08-20 22:09:37 -05002016 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002017 s->c_cpu = first_cpu;
2018 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002019 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002020 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002021
aliguori880a7572008-11-18 20:30:24 +00002022 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002023
bellard858693c2004-03-31 18:52:07 +00002024 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002025}
2026
2027static int gdbserver_open(int port)
2028{
2029 struct sockaddr_in sockaddr;
2030 int fd, val, ret;
2031
2032 fd = socket(PF_INET, SOCK_STREAM, 0);
2033 if (fd < 0) {
2034 perror("socket");
2035 return -1;
2036 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002037#ifndef _WIN32
2038 fcntl(fd, F_SETFD, FD_CLOEXEC);
2039#endif
bellard858693c2004-03-31 18:52:07 +00002040
2041 /* allow fast reuse */
2042 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002043 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002044
2045 sockaddr.sin_family = AF_INET;
2046 sockaddr.sin_port = htons(port);
2047 sockaddr.sin_addr.s_addr = 0;
2048 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2049 if (ret < 0) {
2050 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002051 close(fd);
bellard858693c2004-03-31 18:52:07 +00002052 return -1;
2053 }
2054 ret = listen(fd, 0);
2055 if (ret < 0) {
2056 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002057 close(fd);
bellard858693c2004-03-31 18:52:07 +00002058 return -1;
2059 }
bellard858693c2004-03-31 18:52:07 +00002060 return fd;
2061}
2062
2063int gdbserver_start(int port)
2064{
2065 gdbserver_fd = gdbserver_open(port);
2066 if (gdbserver_fd < 0)
2067 return -1;
2068 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002069 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002070 return 0;
2071}
aurel322b1319c2008-12-18 22:44:04 +00002072
2073/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002074void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002075{
2076 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002077 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002078 return;
2079 close(s->fd);
2080 s->fd = -1;
2081 cpu_breakpoint_remove_all(env, BP_GDB);
2082 cpu_watchpoint_remove_all(env, BP_GDB);
2083}
pbrook4046d912007-01-28 01:53:16 +00002084#else
thsaa1f17c2007-07-11 22:48:58 +00002085static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002086{
pbrook56aebc82008-10-11 17:55:29 +00002087 /* We can handle an arbitrarily large amount of data.
2088 Pick the maximum packet size, which is as good as anything. */
2089 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002090}
2091
thsaa1f17c2007-07-11 22:48:58 +00002092static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002093{
pbrook4046d912007-01-28 01:53:16 +00002094 int i;
2095
2096 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002097 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002098 }
2099}
2100
2101static void gdb_chr_event(void *opaque, int event)
2102{
2103 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302104 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002105 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002106 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002107 break;
2108 default:
2109 break;
2110 }
2111}
2112
aliguori8a34a0f2009-03-05 23:01:55 +00002113static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2114{
2115 char buf[MAX_PACKET_LENGTH];
2116
2117 buf[0] = 'O';
2118 if (len > (MAX_PACKET_LENGTH/2) - 1)
2119 len = (MAX_PACKET_LENGTH/2) - 1;
2120 memtohex(buf + 1, (uint8_t *)msg, len);
2121 put_packet(s, buf);
2122}
2123
2124static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2125{
2126 const char *p = (const char *)buf;
2127 int max_sz;
2128
2129 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2130 for (;;) {
2131 if (len <= max_sz) {
2132 gdb_monitor_output(gdbserver_state, p, len);
2133 break;
2134 }
2135 gdb_monitor_output(gdbserver_state, p, max_sz);
2136 p += max_sz;
2137 len -= max_sz;
2138 }
2139 return len;
2140}
2141
aliguori59030a82009-04-05 18:43:41 +00002142#ifndef _WIN32
2143static void gdb_sigterm_handler(int signal)
2144{
Luiz Capitulino13548692011-07-29 15:36:43 -03002145 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002146 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002147 }
aliguori59030a82009-04-05 18:43:41 +00002148}
2149#endif
2150
2151int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002152{
2153 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002154 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002155 CharDriverState *chr = NULL;
2156 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002157
aliguori59030a82009-04-05 18:43:41 +00002158 if (!device)
2159 return -1;
2160 if (strcmp(device, "none") != 0) {
2161 if (strstart(device, "tcp:", NULL)) {
2162 /* enforce required TCP attributes */
2163 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2164 "%s,nowait,nodelay,server", device);
2165 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002166 }
aliguori59030a82009-04-05 18:43:41 +00002167#ifndef _WIN32
2168 else if (strcmp(device, "stdio") == 0) {
2169 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002170
aliguori59030a82009-04-05 18:43:41 +00002171 memset(&act, 0, sizeof(act));
2172 act.sa_handler = gdb_sigterm_handler;
2173 sigaction(SIGINT, &act, NULL);
2174 }
2175#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002176 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002177 if (!chr)
2178 return -1;
2179
Hans de Goede456d6062013-03-27 20:29:40 +01002180 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002181 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2182 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002183 }
2184
aliguori36556b22009-03-28 18:05:53 +00002185 s = gdbserver_state;
2186 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002187 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002188 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002189
aliguori36556b22009-03-28 18:05:53 +00002190 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2191
2192 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002193 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002194 mon_chr->chr_write = gdb_monitor_write;
2195 monitor_init(mon_chr, 0);
2196 } else {
2197 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002198 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002199 mon_chr = s->mon_chr;
2200 memset(s, 0, sizeof(GDBState));
2201 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002202 s->c_cpu = first_cpu;
2203 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002204 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002205 s->state = chr ? RS_IDLE : RS_INACTIVE;
2206 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002207 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002208
pbrook4046d912007-01-28 01:53:16 +00002209 return 0;
2210}
2211#endif