blob: 73e64117d73d74c3cb1b7e3928d14aecd49d7fbd [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ärberf3840912012-02-20 06:44:56 +0100549static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000550{
pbrook56aebc82008-10-11 17:55:29 +0000551 if (n < 8) {
552 /* D0-D7 */
553 GET_REG32(env->dregs[n]);
554 } else if (n < 16) {
555 /* A0-A7 */
556 GET_REG32(env->aregs[n - 8]);
557 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200558 switch (n) {
559 case 16:
560 GET_REG32(env->sr);
561 case 17:
562 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000563 }
pbrooke6e59062006-10-22 00:18:54 +0000564 }
pbrook56aebc82008-10-11 17:55:29 +0000565 /* FP registers not included here because they vary between
566 ColdFire and m68k. Use XML bits for these. */
567 return 0;
pbrooke6e59062006-10-22 00:18:54 +0000568}
569
Andreas Färberf3840912012-02-20 06:44:56 +0100570static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000571{
pbrook56aebc82008-10-11 17:55:29 +0000572 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +0000573
pbrook56aebc82008-10-11 17:55:29 +0000574 tmp = ldl_p(mem_buf);
575
576 if (n < 8) {
577 /* D0-D7 */
578 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -0800579 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +0000580 /* A0-A7 */
581 env->aregs[n - 8] = tmp;
582 } else {
583 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200584 case 16:
585 env->sr = tmp;
586 break;
587 case 17:
588 env->pc = tmp;
589 break;
590 default:
591 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000592 }
pbrooke6e59062006-10-22 00:18:54 +0000593 }
pbrook56aebc82008-10-11 17:55:29 +0000594 return 4;
pbrooke6e59062006-10-22 00:18:54 +0000595}
bellard6f970bd2005-12-05 19:55:19 +0000596#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +0000597
Andreas Färberf3840912012-02-20 06:44:56 +0100598static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000599{
pbrook56aebc82008-10-11 17:55:29 +0000600 if (n < 32) {
601 GET_REGL(env->active_tc.gpr[n]);
602 }
603 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
604 if (n >= 38 && n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200605 if (env->CP0_Status & (1 << CP0St_FR)) {
606 GET_REGL(env->active_fpu.fpr[n - 38].d);
607 } else {
608 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
609 }
pbrook56aebc82008-10-11 17:55:29 +0000610 }
611 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200612 case 70:
613 GET_REGL((int32_t)env->active_fpu.fcr31);
614 case 71:
615 GET_REGL((int32_t)env->active_fpu.fcr0);
pbrook56aebc82008-10-11 17:55:29 +0000616 }
617 }
618 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200619 case 32:
620 GET_REGL((int32_t)env->CP0_Status);
621 case 33:
622 GET_REGL(env->active_tc.LO[0]);
623 case 34:
624 GET_REGL(env->active_tc.HI[0]);
625 case 35:
626 GET_REGL(env->CP0_BadVAddr);
627 case 36:
628 GET_REGL((int32_t)env->CP0_Cause);
629 case 37:
630 GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
631 case 72:
632 GET_REGL(0); /* fp */
633 case 89:
634 GET_REGL((int32_t)env->CP0_PRid);
pbrook56aebc82008-10-11 17:55:29 +0000635 }
636 if (n >= 73 && n <= 88) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200637 /* 16 embedded regs. */
638 GET_REGL(0);
pbrook56aebc82008-10-11 17:55:29 +0000639 }
ths36d23952007-02-28 22:37:42 +0000640
pbrook56aebc82008-10-11 17:55:29 +0000641 return 0;
bellard6f970bd2005-12-05 19:55:19 +0000642}
643
ths8e33c082006-12-11 19:22:27 +0000644/* convert MIPS rounding mode in FCR31 to IEEE library */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200645static unsigned int ieee_rm[] = {
ths8e33c082006-12-11 19:22:27 +0000646 float_round_nearest_even,
647 float_round_to_zero,
648 float_round_up,
649 float_round_down
Andreas Färber47d74ef2013-07-07 11:17:26 +0200650};
ths8e33c082006-12-11 19:22:27 +0000651#define RESTORE_ROUNDING_MODE \
Andreas Färber47d74ef2013-07-07 11:17:26 +0200652 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], \
653 &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +0000654
Andreas Färberf3840912012-02-20 06:44:56 +0100655static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000656{
pbrook56aebc82008-10-11 17:55:29 +0000657 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +0000658
pbrook56aebc82008-10-11 17:55:29 +0000659 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +0000660
pbrook56aebc82008-10-11 17:55:29 +0000661 if (n < 32) {
662 env->active_tc.gpr[n] = tmp;
663 return sizeof(target_ulong);
664 }
665 if (env->CP0_Config1 & (1 << CP0C1_FP)
666 && n >= 38 && n < 73) {
667 if (n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200668 if (env->CP0_Status & (1 << CP0St_FR)) {
669 env->active_fpu.fpr[n - 38].d = tmp;
670 } else {
671 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
672 }
pbrook56aebc82008-10-11 17:55:29 +0000673 }
674 switch (n) {
675 case 70:
676 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
677 /* set rounding mode */
678 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +0000679 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200680 case 71:
681 env->active_fpu.fcr0 = tmp;
682 break;
pbrook56aebc82008-10-11 17:55:29 +0000683 }
684 return sizeof(target_ulong);
685 }
686 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200687 case 32:
688 env->CP0_Status = tmp;
689 break;
690 case 33:
691 env->active_tc.LO[0] = tmp;
692 break;
693 case 34:
694 env->active_tc.HI[0] = tmp;
695 break;
696 case 35:
697 env->CP0_BadVAddr = tmp;
698 break;
699 case 36:
700 env->CP0_Cause = tmp;
701 break;
Nathan Froydff1d1972009-12-08 08:06:30 -0800702 case 37:
703 env->active_tc.PC = tmp & ~(target_ulong)1;
704 if (tmp & 1) {
705 env->hflags |= MIPS_HFLAG_M16;
706 } else {
707 env->hflags &= ~(MIPS_HFLAG_M16);
708 }
709 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200710 case 72: /* fp, ignored */
711 break;
712 default:
713 if (n > 89) {
714 return 0;
715 }
716 /* Other registers are readonly. Ignore writes. */
717 break;
pbrook56aebc82008-10-11 17:55:29 +0000718 }
719
720 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +0000721}
Jia Liufc043552012-07-20 15:50:50 +0800722#elif defined(TARGET_OPENRISC)
723
Jia Liufc043552012-07-20 15:50:50 +0800724static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
725{
726 if (n < 32) {
727 GET_REG32(env->gpr[n]);
728 } else {
729 switch (n) {
730 case 32: /* PPC */
731 GET_REG32(env->ppc);
Jia Liufc043552012-07-20 15:50:50 +0800732
733 case 33: /* NPC */
734 GET_REG32(env->npc);
Jia Liufc043552012-07-20 15:50:50 +0800735
736 case 34: /* SR */
737 GET_REG32(env->sr);
Jia Liufc043552012-07-20 15:50:50 +0800738
739 default:
740 break;
741 }
742 }
743 return 0;
744}
745
746static int cpu_gdb_write_register(CPUOpenRISCState *env,
747 uint8_t *mem_buf, int n)
748{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200749 OpenRISCCPU *cpu = openrisc_env_get_cpu(env);
750 CPUClass *cc = CPU_GET_CLASS(cpu);
Jia Liufc043552012-07-20 15:50:50 +0800751 uint32_t tmp;
752
Andreas Färbera0e372f2013-06-28 23:18:47 +0200753 if (n > cc->gdb_num_core_regs) {
Jia Liufc043552012-07-20 15:50:50 +0800754 return 0;
755 }
756
757 tmp = ldl_p(mem_buf);
758
759 if (n < 32) {
760 env->gpr[n] = tmp;
761 } else {
762 switch (n) {
763 case 32: /* PPC */
764 env->ppc = tmp;
765 break;
766
767 case 33: /* NPC */
768 env->npc = tmp;
769 break;
770
771 case 34: /* SR */
772 env->sr = tmp;
773 break;
774
775 default:
776 break;
777 }
778 }
779 return 4;
780}
bellardfdf9b3e2006-04-27 21:07:38 +0000781#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +0000782
783/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +0000784/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +0000785
Andreas Färberf3840912012-02-20 06:44:56 +0100786static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000787{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200788 switch (n) {
789 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +0000790 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
791 GET_REGL(env->gregs[n + 16]);
792 } else {
793 GET_REGL(env->gregs[n]);
794 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200795 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +0900796 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200797 case 16:
798 GET_REGL(env->pc);
799 case 17:
800 GET_REGL(env->pr);
801 case 18:
802 GET_REGL(env->gbr);
803 case 19:
804 GET_REGL(env->vbr);
805 case 20:
806 GET_REGL(env->mach);
807 case 21:
808 GET_REGL(env->macl);
809 case 22:
810 GET_REGL(env->sr);
811 case 23:
812 GET_REGL(env->fpul);
813 case 24:
814 GET_REGL(env->fpscr);
815 case 25 ... 40:
816 if (env->fpscr & FPSCR_FR) {
817 stfl_p(mem_buf, env->fregs[n - 9]);
818 } else {
819 stfl_p(mem_buf, env->fregs[n - 25]);
820 }
821 return 4;
822 case 41:
823 GET_REGL(env->ssr);
824 case 42:
825 GET_REGL(env->spc);
826 case 43 ... 50:
827 GET_REGL(env->gregs[n - 43]);
828 case 51 ... 58:
829 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +0000830 }
bellardfdf9b3e2006-04-27 21:07:38 +0000831
pbrook56aebc82008-10-11 17:55:29 +0000832 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +0000833}
834
Andreas Färberf3840912012-02-20 06:44:56 +0100835static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000836{
pbrook56aebc82008-10-11 17:55:29 +0000837 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200838 case 0 ... 7:
839 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
840 env->gregs[n + 16] = ldl_p(mem_buf);
841 } else {
842 env->gregs[n] = ldl_p(mem_buf);
843 }
844 break;
845 case 8 ... 15:
846 env->gregs[n] = ldl_p(mem_buf);
847 break;
848 case 16:
849 env->pc = ldl_p(mem_buf);
850 break;
851 case 17:
852 env->pr = ldl_p(mem_buf);
853 break;
854 case 18:
855 env->gbr = ldl_p(mem_buf);
856 break;
857 case 19:
858 env->vbr = ldl_p(mem_buf);
859 break;
860 case 20:
861 env->mach = ldl_p(mem_buf);
862 break;
863 case 21:
864 env->macl = ldl_p(mem_buf);
865 break;
866 case 22:
867 env->sr = ldl_p(mem_buf);
868 break;
869 case 23:
870 env->fpul = ldl_p(mem_buf);
871 break;
872 case 24:
873 env->fpscr = ldl_p(mem_buf);
874 break;
875 case 25 ... 40:
876 if (env->fpscr & FPSCR_FR) {
877 env->fregs[n - 9] = ldfl_p(mem_buf);
878 } else {
879 env->fregs[n - 25] = ldfl_p(mem_buf);
880 }
881 break;
882 case 41:
883 env->ssr = ldl_p(mem_buf);
884 break;
885 case 42:
886 env->spc = ldl_p(mem_buf);
887 break;
888 case 43 ... 50:
889 env->gregs[n - 43] = ldl_p(mem_buf);
890 break;
891 case 51 ... 58:
892 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
893 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200894 default:
895 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000896 }
897
898 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +0000899}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200900#elif defined (TARGET_MICROBLAZE)
901
Andreas Färberf3840912012-02-20 06:44:56 +0100902static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200903{
904 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200905 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200906 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200907 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200908 }
909 return 0;
910}
911
Andreas Färberf3840912012-02-20 06:44:56 +0100912static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200913{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200914 MicroBlazeCPU *cpu = mb_env_get_cpu(env);
915 CPUClass *cc = CPU_GET_CLASS(cpu);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200916 uint32_t tmp;
917
Andreas Färbera0e372f2013-06-28 23:18:47 +0200918 if (n > cc->gdb_num_core_regs) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200919 return 0;
920 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200921
922 tmp = ldl_p(mem_buf);
923
924 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200925 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200926 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200927 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200928 }
929 return 4;
930}
thsf1ccf902007-10-08 13:16:14 +0000931#elif defined (TARGET_CRIS)
932
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100933static int
Andreas Färberf3840912012-02-20 06:44:56 +0100934read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100935{
936 if (n < 15) {
937 GET_REG32(env->regs[n]);
938 }
939
940 if (n == 15) {
941 GET_REG32(env->pc);
942 }
943
944 if (n < 32) {
945 switch (n) {
946 case 16:
947 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100948 case 17:
949 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100950 case 20:
951 case 21:
952 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100953 default:
954 if (n >= 23) {
955 GET_REG32(env->pregs[n - 16]);
956 }
957 break;
958 }
959 }
960 return 0;
961}
962
Andreas Färberf3840912012-02-20 06:44:56 +0100963static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000964{
pbrook56aebc82008-10-11 17:55:29 +0000965 uint8_t srs;
966
Andreas Färber47d74ef2013-07-07 11:17:26 +0200967 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100968 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200969 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +0100970
pbrook56aebc82008-10-11 17:55:29 +0000971 srs = env->pregs[PR_SRS];
972 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200973 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +0000974 }
975
976 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200977 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +0000978 }
979 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200980 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +0000981 }
982 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200983 case 16:
984 GET_REG8(env->pregs[0]);
985 case 17:
986 GET_REG8(env->pregs[1]);
987 case 18:
988 GET_REG32(env->pregs[2]);
989 case 19:
990 GET_REG8(srs);
991 case 20:
992 GET_REG16(env->pregs[4]);
993 case 32:
994 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000995 }
996
997 return 0;
thsf1ccf902007-10-08 13:16:14 +0000998}
999
Andreas Färberf3840912012-02-20 06:44:56 +01001000static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001001{
pbrook56aebc82008-10-11 17:55:29 +00001002 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001003
Andreas Färber47d74ef2013-07-07 11:17:26 +02001004 if (n > 49) {
1005 return 0;
1006 }
thsf1ccf902007-10-08 13:16:14 +00001007
pbrook56aebc82008-10-11 17:55:29 +00001008 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001009
pbrook56aebc82008-10-11 17:55:29 +00001010 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001011 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +00001012 }
thsf1ccf902007-10-08 13:16:14 +00001013
edgar_igld7b69672008-10-11 19:32:21 +00001014 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001015 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +00001016 }
1017
1018 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001019 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001020 case 16:
1021 return 1;
1022 case 17:
1023 return 1;
1024 case 18:
1025 env->pregs[PR_PID] = tmp;
1026 break;
1027 case 19:
1028 return 1;
1029 case 20:
1030 return 2;
1031 case 32:
1032 env->pc = tmp;
1033 break;
pbrook56aebc82008-10-11 17:55:29 +00001034 }
thsf1ccf902007-10-08 13:16:14 +00001035
pbrook56aebc82008-10-11 17:55:29 +00001036 return 4;
thsf1ccf902007-10-08 13:16:14 +00001037}
aurel3219bf5172008-12-07 23:26:32 +00001038#elif defined (TARGET_ALPHA)
1039
Andreas Färberf3840912012-02-20 06:44:56 +01001040static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001041{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001042 uint64_t val;
1043 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001044
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001045 switch (n) {
1046 case 0 ... 30:
1047 val = env->ir[n];
1048 break;
1049 case 32 ... 62:
1050 d.d = env->fir[n - 32];
1051 val = d.ll;
1052 break;
1053 case 63:
1054 val = cpu_alpha_load_fpcr(env);
1055 break;
1056 case 64:
1057 val = env->pc;
1058 break;
1059 case 66:
1060 val = env->unique;
1061 break;
1062 case 31:
1063 case 65:
1064 /* 31 really is the zero register; 65 is unassigned in the
1065 gdb protocol, but is still required to occupy 8 bytes. */
1066 val = 0;
1067 break;
1068 default:
1069 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001070 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001071 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001072}
1073
Andreas Färberf3840912012-02-20 06:44:56 +01001074static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001075{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001076 target_ulong tmp = ldtul_p(mem_buf);
1077 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001078
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001079 switch (n) {
1080 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001081 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001082 break;
1083 case 32 ... 62:
1084 d.ll = tmp;
1085 env->fir[n - 32] = d.d;
1086 break;
1087 case 63:
1088 cpu_alpha_store_fpcr(env, tmp);
1089 break;
1090 case 64:
1091 env->pc = tmp;
1092 break;
1093 case 66:
1094 env->unique = tmp;
1095 break;
1096 case 31:
1097 case 65:
1098 /* 31 really is the zero register; 65 is unassigned in the
1099 gdb protocol, but is still required to occupy 8 bytes. */
1100 break;
1101 default:
1102 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001103 }
aurel3219bf5172008-12-07 23:26:32 +00001104 return 8;
1105}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001106#elif defined (TARGET_S390X)
1107
Andreas Färberf3840912012-02-20 06:44:56 +01001108static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001109{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001110 uint64_t val;
1111 int cc_op;
1112
Alexander Grafafcb0e42009-12-05 12:44:29 +01001113 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001114 case S390_PSWM_REGNUM:
1115 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1116 val = deposit64(env->psw.mask, 44, 2, cc_op);
1117 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001118 case S390_PSWA_REGNUM:
1119 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001120 case S390_R0_REGNUM ... S390_R15_REGNUM:
1121 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001122 case S390_A0_REGNUM ... S390_A15_REGNUM:
1123 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001124 case S390_FPC_REGNUM:
1125 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001126 case S390_F0_REGNUM ... S390_F15_REGNUM:
1127 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +01001128 }
1129
1130 return 0;
1131}
1132
Andreas Färberf3840912012-02-20 06:44:56 +01001133static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001134{
1135 target_ulong tmpl;
1136 uint32_t tmp32;
1137 int r = 8;
1138 tmpl = ldtul_p(mem_buf);
1139 tmp32 = ldl_p(mem_buf);
1140
1141 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001142 case S390_PSWM_REGNUM:
1143 env->psw.mask = tmpl;
1144 env->cc_op = extract64(tmpl, 44, 2);
1145 break;
1146 case S390_PSWA_REGNUM:
1147 env->psw.addr = tmpl;
1148 break;
1149 case S390_R0_REGNUM ... S390_R15_REGNUM:
1150 env->regs[n-S390_R0_REGNUM] = tmpl;
1151 break;
1152 case S390_A0_REGNUM ... S390_A15_REGNUM:
1153 env->aregs[n-S390_A0_REGNUM] = tmp32;
1154 r = 4;
1155 break;
1156 case S390_FPC_REGNUM:
1157 env->fpc = tmp32;
1158 r = 4;
1159 break;
1160 case S390_F0_REGNUM ... S390_F15_REGNUM:
1161 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1162 break;
1163 default:
1164 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001165 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001166 return r;
1167}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001168#elif defined (TARGET_LM32)
1169
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001170#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001171
Andreas Färberf3840912012-02-20 06:44:56 +01001172static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001173{
1174 if (n < 32) {
1175 GET_REG32(env->regs[n]);
1176 } else {
1177 switch (n) {
1178 case 32:
1179 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001180 /* FIXME: put in right exception ID */
1181 case 33:
1182 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001183 case 34:
1184 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001185 case 35:
1186 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001187 case 36:
1188 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001189 case 37:
1190 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001191 case 38:
1192 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001193 }
1194 }
1195 return 0;
1196}
1197
Andreas Färberf3840912012-02-20 06:44:56 +01001198static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001199{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001200 LM32CPU *cpu = lm32_env_get_cpu(env);
1201 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001202 uint32_t tmp;
1203
Andreas Färbera0e372f2013-06-28 23:18:47 +02001204 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +01001205 return 0;
1206 }
1207
1208 tmp = ldl_p(mem_buf);
1209
1210 if (n < 32) {
1211 env->regs[n] = tmp;
1212 } else {
1213 switch (n) {
1214 case 32:
1215 env->pc = tmp;
1216 break;
1217 case 34:
1218 env->eba = tmp;
1219 break;
1220 case 35:
1221 env->deba = tmp;
1222 break;
1223 case 36:
1224 env->ie = tmp;
1225 break;
1226 case 37:
1227 lm32_pic_set_im(env->pic_state, tmp);
1228 break;
1229 case 38:
1230 lm32_pic_set_ip(env->pic_state, tmp);
1231 break;
1232 }
1233 }
1234 return 4;
1235}
Max Filippovccfcaba2011-09-06 03:55:52 +04001236#elif defined(TARGET_XTENSA)
1237
Andreas Färberf3840912012-02-20 06:44:56 +01001238static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001239{
1240 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1241
1242 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1243 return 0;
1244 }
1245
1246 switch (reg->type) {
1247 case 9: /*pc*/
1248 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +04001249
1250 case 1: /*ar*/
1251 xtensa_sync_phys_from_window(env);
1252 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001253
1254 case 2: /*SR*/
1255 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001256
1257 case 3: /*UR*/
1258 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001259
Max Filippovdd519cb2012-09-19 04:23:54 +04001260 case 4: /*f*/
1261 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +04001262
Max Filippovccfcaba2011-09-06 03:55:52 +04001263 case 8: /*a*/
1264 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001265
1266 default:
1267 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001268 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001269 return 0;
1270 }
1271}
1272
Andreas Färberf3840912012-02-20 06:44:56 +01001273static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001274{
1275 uint32_t tmp;
1276 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1277
1278 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1279 return 0;
1280 }
1281
1282 tmp = ldl_p(mem_buf);
1283
1284 switch (reg->type) {
1285 case 9: /*pc*/
1286 env->pc = tmp;
1287 break;
1288
1289 case 1: /*ar*/
1290 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1291 xtensa_sync_window_from_phys(env);
1292 break;
1293
1294 case 2: /*SR*/
1295 env->sregs[reg->targno & 0xff] = tmp;
1296 break;
1297
1298 case 3: /*UR*/
1299 env->uregs[reg->targno & 0xff] = tmp;
1300 break;
1301
Max Filippovdd519cb2012-09-19 04:23:54 +04001302 case 4: /*f*/
1303 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1304 break;
1305
Max Filippovccfcaba2011-09-06 03:55:52 +04001306 case 8: /*a*/
1307 env->regs[reg->targno & 0x0f] = tmp;
1308 break;
1309
1310 default:
1311 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001312 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001313 return 0;
1314 }
1315
1316 return 4;
1317}
bellard1fddef42005-04-17 19:16:13 +00001318#else
pbrook56aebc82008-10-11 17:55:29 +00001319
Andreas Färber9349b4f2012-03-14 01:38:32 +01001320static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001321{
1322 return 0;
1323}
1324
Andreas Färber9349b4f2012-03-14 01:38:32 +01001325static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001326{
pbrook56aebc82008-10-11 17:55:29 +00001327 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001328}
1329
1330#endif
bellardb4608c02003-06-27 17:34:32 +00001331
pbrook56aebc82008-10-11 17:55:29 +00001332#ifdef GDB_CORE_XML
1333/* Encode data using the encoding for 'x' packets. */
1334static int memtox(char *buf, const char *mem, int len)
1335{
1336 char *p = buf;
1337 char c;
1338
1339 while (len--) {
1340 c = *(mem++);
1341 switch (c) {
1342 case '#': case '$': case '*': case '}':
1343 *(p++) = '}';
1344 *(p++) = c ^ 0x20;
1345 break;
1346 default:
1347 *(p++) = c;
1348 break;
1349 }
1350 }
1351 return p - buf;
1352}
1353
aurel323faf7782008-12-07 23:26:17 +00001354static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001355{
pbrook56aebc82008-10-11 17:55:29 +00001356 size_t len;
1357 int i;
1358 const char *name;
1359 static char target_xml[1024];
1360
1361 len = 0;
1362 while (p[len] && p[len] != ':')
1363 len++;
1364 *newp = p + len;
1365
1366 name = NULL;
1367 if (strncmp(p, "target.xml", len) == 0) {
1368 /* Generate the XML description for this CPU. */
1369 if (!target_xml[0]) {
1370 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001371 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001372
blueswir15b3715b2008-10-25 11:18:12 +00001373 snprintf(target_xml, sizeof(target_xml),
1374 "<?xml version=\"1.0\"?>"
1375 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1376 "<target>"
1377 "<xi:include href=\"%s\"/>",
1378 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001379
Andreas Färbereac8b352013-06-28 21:11:37 +02001380 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001381 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1382 pstrcat(target_xml, sizeof(target_xml), r->xml);
1383 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001384 }
blueswir12dc766d2009-04-13 16:06:19 +00001385 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001386 }
1387 return target_xml;
1388 }
1389 for (i = 0; ; i++) {
1390 name = xml_builtin[i][0];
1391 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1392 break;
1393 }
1394 return name ? xml_builtin[i][1] : NULL;
1395}
1396#endif
1397
Andreas Färber385b9f02013-06-27 18:25:36 +02001398static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001399{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001400 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001401 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001402 GDBRegisterState *r;
1403
Andreas Färbera0e372f2013-06-28 23:18:47 +02001404 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001405 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001406 }
pbrook56aebc82008-10-11 17:55:29 +00001407
Andreas Färbereac8b352013-06-28 21:11:37 +02001408 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001409 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1410 return r->get_reg(env, mem_buf, reg - r->base_reg);
1411 }
1412 }
1413 return 0;
1414}
1415
Andreas Färber385b9f02013-06-27 18:25:36 +02001416static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001417{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001418 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001419 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001420 GDBRegisterState *r;
1421
Andreas Färbera0e372f2013-06-28 23:18:47 +02001422 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001423 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001424 }
pbrook56aebc82008-10-11 17:55:29 +00001425
Andreas Färbereac8b352013-06-28 21:11:37 +02001426 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001427 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1428 return r->set_reg(env, mem_buf, reg - r->base_reg);
1429 }
1430 }
1431 return 0;
1432}
1433
1434/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1435 specifies the first register number and these registers are included in
1436 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1437 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1438 */
1439
Andreas Färber22169d42013-06-28 21:27:39 +02001440void gdb_register_coprocessor(CPUState *cpu,
1441 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1442 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001443{
1444 GDBRegisterState *s;
1445 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001446
Andreas Färbereac8b352013-06-28 21:11:37 +02001447 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001448 while (*p) {
1449 /* Check for duplicates. */
1450 if (strcmp((*p)->xml, xml) == 0)
1451 return;
1452 p = &(*p)->next;
1453 }
Stefan Weil9643c252011-10-18 22:25:38 +02001454
1455 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001456 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02001457 s->num_regs = num_regs;
1458 s->get_reg = get_reg;
1459 s->set_reg = set_reg;
1460 s->xml = xml;
1461
pbrook56aebc82008-10-11 17:55:29 +00001462 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02001463 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00001464 *p = s;
1465 if (g_pos) {
1466 if (g_pos != s->base_reg) {
1467 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1468 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001469 }
1470 }
1471}
1472
aliguoria1d1bb32008-11-18 20:07:32 +00001473#ifndef CONFIG_USER_ONLY
1474static const int xlat_gdb_type[] = {
1475 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1476 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1477 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1478};
1479#endif
1480
aliguori880a7572008-11-18 20:30:24 +00001481static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001482{
Andreas Färber182735e2013-05-29 22:29:20 +02001483 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001484 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001485 int err = 0;
1486
Andreas Färber62278812013-06-27 17:12:06 +02001487 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001488 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001489 }
aliguorie22a25c2009-03-12 20:12:48 +00001490
aliguoria1d1bb32008-11-18 20:07:32 +00001491 switch (type) {
1492 case GDB_BREAKPOINT_SW:
1493 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001494 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1495 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001496 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1497 if (err)
1498 break;
1499 }
1500 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001501#ifndef CONFIG_USER_ONLY
1502 case GDB_WATCHPOINT_WRITE:
1503 case GDB_WATCHPOINT_READ:
1504 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001505 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1506 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001507 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1508 NULL);
1509 if (err)
1510 break;
1511 }
1512 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001513#endif
1514 default:
1515 return -ENOSYS;
1516 }
1517}
1518
aliguori880a7572008-11-18 20:30:24 +00001519static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001520{
Andreas Färber182735e2013-05-29 22:29:20 +02001521 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001522 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001523 int err = 0;
1524
Andreas Färber62278812013-06-27 17:12:06 +02001525 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001526 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001527 }
aliguorie22a25c2009-03-12 20:12:48 +00001528
aliguoria1d1bb32008-11-18 20:07:32 +00001529 switch (type) {
1530 case GDB_BREAKPOINT_SW:
1531 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001532 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1533 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001534 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1535 if (err)
1536 break;
1537 }
1538 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001539#ifndef CONFIG_USER_ONLY
1540 case GDB_WATCHPOINT_WRITE:
1541 case GDB_WATCHPOINT_READ:
1542 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001543 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1544 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001545 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1546 if (err)
1547 break;
1548 }
1549 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001550#endif
1551 default:
1552 return -ENOSYS;
1553 }
1554}
1555
aliguori880a7572008-11-18 20:30:24 +00001556static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001557{
Andreas Färber182735e2013-05-29 22:29:20 +02001558 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001559 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001560
aliguorie22a25c2009-03-12 20:12:48 +00001561 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001562 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001563 return;
1564 }
1565
Andreas Färber182735e2013-05-29 22:29:20 +02001566 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1567 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001568 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001569#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001570 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001571#endif
aliguori880a7572008-11-18 20:30:24 +00001572 }
aliguoria1d1bb32008-11-18 20:07:32 +00001573}
1574
aurel32fab9d282009-04-08 21:29:37 +00001575static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1576{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001577 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001578 CPUClass *cc = CPU_GET_CLASS(cpu);
1579
1580 cpu_synchronize_state(cpu);
1581 if (cc->set_pc) {
1582 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001583 }
aurel32fab9d282009-04-08 21:29:37 +00001584}
1585
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001586static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001587{
Andreas Färber0d342822012-12-17 07:12:13 +01001588 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001589
Andreas Färber182735e2013-05-29 22:29:20 +02001590 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001591 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001592 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001593 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001594 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001595
1596 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001597}
1598
aliguori880a7572008-11-18 20:30:24 +00001599static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001600{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001601 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001602 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001603 uint32_t thread;
1604 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001605 char buf[MAX_PACKET_LENGTH];
1606 uint8_t mem_buf[MAX_PACKET_LENGTH];
1607 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001608 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001609
bellard858693c2004-03-31 18:52:07 +00001610#ifdef DEBUG_GDB
1611 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001612#endif
bellard858693c2004-03-31 18:52:07 +00001613 p = line_buf;
1614 ch = *p++;
1615 switch(ch) {
1616 case '?':
bellard1fddef42005-04-17 19:16:13 +00001617 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001618 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001619 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001620 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001621 /* Remove all the breakpoints when this query is issued,
1622 * because gdb is doing and initial connect and the state
1623 * should be cleaned up.
1624 */
aliguori880a7572008-11-18 20:30:24 +00001625 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001626 break;
1627 case 'c':
1628 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001629 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001630 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001631 }
aurel32ca587a82008-12-18 22:44:13 +00001632 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001633 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001634 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001635 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001636 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1637 if (s->signal == -1)
1638 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001639 gdb_continue(s);
1640 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001641 case 'v':
1642 if (strncmp(p, "Cont", 4) == 0) {
1643 int res_signal, res_thread;
1644
1645 p += 4;
1646 if (*p == '?') {
1647 put_packet(s, "vCont;c;C;s;S");
1648 break;
1649 }
1650 res = 0;
1651 res_signal = 0;
1652 res_thread = 0;
1653 while (*p) {
1654 int action, signal;
1655
1656 if (*p++ != ';') {
1657 res = 0;
1658 break;
1659 }
1660 action = *p++;
1661 signal = 0;
1662 if (action == 'C' || action == 'S') {
1663 signal = strtoul(p, (char **)&p, 16);
1664 } else if (action != 'c' && action != 's') {
1665 res = 0;
1666 break;
1667 }
1668 thread = 0;
1669 if (*p == ':') {
1670 thread = strtoull(p+1, (char **)&p, 16);
1671 }
1672 action = tolower(action);
1673 if (res == 0 || (res == 'c' && action == 's')) {
1674 res = action;
1675 res_signal = signal;
1676 res_thread = thread;
1677 }
1678 }
1679 if (res) {
1680 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001681 cpu = find_cpu(res_thread);
1682 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001683 put_packet(s, "E22");
1684 break;
1685 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001686 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001687 }
1688 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001689 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001690 }
1691 s->signal = res_signal;
1692 gdb_continue(s);
1693 return RS_IDLE;
1694 }
1695 break;
1696 } else {
1697 goto unknown_command;
1698 }
edgar_igl7d03f822008-05-17 18:58:29 +00001699 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001700#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001701 /* Kill the target */
1702 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1703 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001704#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001705 case 'D':
1706 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001707 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001708 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001709 gdb_continue(s);
1710 put_packet(s, "OK");
1711 break;
bellard858693c2004-03-31 18:52:07 +00001712 case 's':
1713 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001714 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001715 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001716 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001717 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001718 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001719 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001720 case 'F':
1721 {
1722 target_ulong ret;
1723 target_ulong err;
1724
1725 ret = strtoull(p, (char **)&p, 16);
1726 if (*p == ',') {
1727 p++;
1728 err = strtoull(p, (char **)&p, 16);
1729 } else {
1730 err = 0;
1731 }
1732 if (*p == ',')
1733 p++;
1734 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001735 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001736 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001737 s->current_syscall_cb = NULL;
1738 }
pbrooka2d1eba2007-01-28 03:10:55 +00001739 if (type == 'C') {
1740 put_packet(s, "T02");
1741 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001742 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001743 }
1744 }
1745 break;
bellard858693c2004-03-31 18:52:07 +00001746 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001747 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001748 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001749 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001750 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001751 len += reg_size;
1752 }
1753 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001754 put_packet(s, buf);
1755 break;
1756 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001757 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001758 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001759 len = strlen(p) / 2;
1760 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001761 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001762 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001763 len -= reg_size;
1764 registers += reg_size;
1765 }
bellard858693c2004-03-31 18:52:07 +00001766 put_packet(s, "OK");
1767 break;
1768 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001769 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001770 if (*p == ',')
1771 p++;
bellard9d9754a2006-06-25 15:32:37 +00001772 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001773 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001774 put_packet (s, "E14");
1775 } else {
1776 memtohex(buf, mem_buf, len);
1777 put_packet(s, buf);
1778 }
bellard858693c2004-03-31 18:52:07 +00001779 break;
1780 case 'M':
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);
bellardb328f872005-01-17 22:03:16 +00001785 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001786 p++;
1787 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001788 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001789 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001790 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001791 } else {
bellard858693c2004-03-31 18:52:07 +00001792 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001793 }
bellard858693c2004-03-31 18:52:07 +00001794 break;
pbrook56aebc82008-10-11 17:55:29 +00001795 case 'p':
1796 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1797 This works, but can be very slow. Anything new enough to
1798 understand XML also knows how to use this properly. */
1799 if (!gdb_has_xml)
1800 goto unknown_command;
1801 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001802 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001803 if (reg_size) {
1804 memtohex(buf, mem_buf, reg_size);
1805 put_packet(s, buf);
1806 } else {
1807 put_packet(s, "E14");
1808 }
1809 break;
1810 case 'P':
1811 if (!gdb_has_xml)
1812 goto unknown_command;
1813 addr = strtoull(p, (char **)&p, 16);
1814 if (*p == '=')
1815 p++;
1816 reg_size = strlen(p) / 2;
1817 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001818 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001819 put_packet(s, "OK");
1820 break;
bellard858693c2004-03-31 18:52:07 +00001821 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001822 case 'z':
1823 type = strtoul(p, (char **)&p, 16);
1824 if (*p == ',')
1825 p++;
bellard9d9754a2006-06-25 15:32:37 +00001826 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001827 if (*p == ',')
1828 p++;
bellard9d9754a2006-06-25 15:32:37 +00001829 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001830 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001831 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001832 else
aliguori880a7572008-11-18 20:30:24 +00001833 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001834 if (res >= 0)
1835 put_packet(s, "OK");
1836 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001837 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001838 else
1839 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001840 break;
aliguori880a7572008-11-18 20:30:24 +00001841 case 'H':
1842 type = *p++;
1843 thread = strtoull(p, (char **)&p, 16);
1844 if (thread == -1 || thread == 0) {
1845 put_packet(s, "OK");
1846 break;
1847 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001848 cpu = find_cpu(thread);
1849 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001850 put_packet(s, "E22");
1851 break;
1852 }
1853 switch (type) {
1854 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001855 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001856 put_packet(s, "OK");
1857 break;
1858 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001859 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001860 put_packet(s, "OK");
1861 break;
1862 default:
1863 put_packet(s, "E22");
1864 break;
1865 }
1866 break;
1867 case 'T':
1868 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001869 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001870
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001871 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001872 put_packet(s, "OK");
1873 } else {
aliguori880a7572008-11-18 20:30:24 +00001874 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001875 }
aliguori880a7572008-11-18 20:30:24 +00001876 break;
pbrook978efd62006-06-17 18:30:42 +00001877 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001878 case 'Q':
1879 /* parse any 'q' packets here */
1880 if (!strcmp(p,"qemu.sstepbits")) {
1881 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001882 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1883 SSTEP_ENABLE,
1884 SSTEP_NOIRQ,
1885 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001886 put_packet(s, buf);
1887 break;
1888 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1889 /* Display or change the sstep_flags */
1890 p += 10;
1891 if (*p != '=') {
1892 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001893 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001894 put_packet(s, buf);
1895 break;
1896 }
1897 p++;
1898 type = strtoul(p, (char **)&p, 16);
1899 sstep_flags = type;
1900 put_packet(s, "OK");
1901 break;
aliguori880a7572008-11-18 20:30:24 +00001902 } else if (strcmp(p,"C") == 0) {
1903 /* "Current thread" remains vague in the spec, so always return
1904 * the first CPU (gdb returns the first thread). */
1905 put_packet(s, "QC1");
1906 break;
1907 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001908 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001909 goto report_cpuinfo;
1910 } else if (strcmp(p,"sThreadInfo") == 0) {
1911 report_cpuinfo:
1912 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001913 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001914 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001915 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001916 } else
1917 put_packet(s, "l");
1918 break;
1919 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1920 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001921 cpu = find_cpu(thread);
1922 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001923 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001924 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001925 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001926 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001927 memtohex(buf, mem_buf, len);
1928 put_packet(s, buf);
1929 }
aliguori880a7572008-11-18 20:30:24 +00001930 break;
edgar_igl60897d32008-05-09 08:25:14 +00001931 }
blueswir10b8a9882009-03-07 10:51:36 +00001932#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00001933 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001934 CPUArchState *env = s->c_cpu->env_ptr;
1935 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00001936
blueswir1363a37d2008-08-21 17:58:08 +00001937 snprintf(buf, sizeof(buf),
1938 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1939 ";Bss=" TARGET_ABI_FMT_lx,
1940 ts->info->code_offset,
1941 ts->info->data_offset,
1942 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001943 put_packet(s, buf);
1944 break;
1945 }
blueswir10b8a9882009-03-07 10:51:36 +00001946#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001947 else if (strncmp(p, "Rcmd,", 5) == 0) {
1948 int len = strlen(p + 5);
1949
1950 if ((len % 2) != 0) {
1951 put_packet(s, "E01");
1952 break;
1953 }
1954 hextomem(mem_buf, p + 5, len);
1955 len = len / 2;
1956 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001957 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001958 put_packet(s, "OK");
1959 break;
1960 }
blueswir10b8a9882009-03-07 10:51:36 +00001961#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00001962 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001963 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001964#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00001965 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00001966#endif
1967 put_packet(s, buf);
1968 break;
1969 }
1970#ifdef GDB_CORE_XML
1971 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1972 const char *xml;
1973 target_ulong total_len;
1974
1975 gdb_has_xml = 1;
1976 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001977 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001978 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001979 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001980 put_packet(s, buf);
1981 break;
1982 }
1983
1984 if (*p == ':')
1985 p++;
1986 addr = strtoul(p, (char **)&p, 16);
1987 if (*p == ',')
1988 p++;
1989 len = strtoul(p, (char **)&p, 16);
1990
1991 total_len = strlen(xml);
1992 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001993 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001994 put_packet(s, buf);
1995 break;
1996 }
1997 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1998 len = (MAX_PACKET_LENGTH - 5) / 2;
1999 if (len < total_len - addr) {
2000 buf[0] = 'm';
2001 len = memtox(buf + 1, xml + addr, len);
2002 } else {
2003 buf[0] = 'l';
2004 len = memtox(buf + 1, xml + addr, total_len - addr);
2005 }
2006 put_packet_binary(s, buf, len + 1);
2007 break;
2008 }
2009#endif
2010 /* Unrecognised 'q' command. */
2011 goto unknown_command;
2012
bellard858693c2004-03-31 18:52:07 +00002013 default:
pbrook56aebc82008-10-11 17:55:29 +00002014 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002015 /* put empty packet */
2016 buf[0] = '\0';
2017 put_packet(s, buf);
2018 break;
2019 }
2020 return RS_IDLE;
2021}
2022
Andreas Färber64f6b342013-05-27 02:06:09 +02002023void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00002024{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002025 gdbserver_state->c_cpu = cpu;
2026 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002027}
2028
bellard1fddef42005-04-17 19:16:13 +00002029#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002030static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002031{
aliguori880a7572008-11-18 20:30:24 +00002032 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002033 CPUArchState *env = s->c_cpu->env_ptr;
2034 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002035 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002036 const char *type;
bellard858693c2004-03-31 18:52:07 +00002037 int ret;
2038
Meador Ingecdb432b2012-03-15 17:49:45 +00002039 if (running || s->state == RS_INACTIVE) {
2040 return;
2041 }
2042 /* Is there a GDB syscall waiting to be sent? */
2043 if (s->current_syscall_cb) {
2044 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002045 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002046 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002047 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002048 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002049 if (env->watchpoint_hit) {
2050 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002051 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002052 type = "r";
2053 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002054 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002055 type = "a";
2056 break;
2057 default:
2058 type = "";
2059 break;
2060 }
aliguori880a7572008-11-18 20:30:24 +00002061 snprintf(buf, sizeof(buf),
2062 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002063 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002064 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002065 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002066 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002067 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002068 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002069 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002070 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002071 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002072 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002073 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002074 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002075 ret = GDB_SIGNAL_QUIT;
2076 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002077 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002078 ret = GDB_SIGNAL_IO;
2079 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002080 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002081 ret = GDB_SIGNAL_ALRM;
2082 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002083 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002084 ret = GDB_SIGNAL_ABRT;
2085 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002086 case RUN_STATE_SAVE_VM:
2087 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002088 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002089 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002090 ret = GDB_SIGNAL_XCPU;
2091 break;
2092 default:
2093 ret = GDB_SIGNAL_UNKNOWN;
2094 break;
bellardbbeb7b52006-04-23 18:42:15 +00002095 }
Andreas Färber0d342822012-12-17 07:12:13 +01002096 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002097
2098send_packet:
bellard858693c2004-03-31 18:52:07 +00002099 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002100
2101 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002102 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002103}
bellard1fddef42005-04-17 19:16:13 +00002104#endif
bellard858693c2004-03-31 18:52:07 +00002105
pbrooka2d1eba2007-01-28 03:10:55 +00002106/* Send a gdb syscall request.
2107 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002108 %x - target_ulong argument printed in hex.
2109 %lx - 64-bit argument printed in hex.
2110 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002111void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002112{
2113 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002114 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002115 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002116 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002117 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002118 GDBState *s;
2119
aliguori880a7572008-11-18 20:30:24 +00002120 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002121 if (!s)
2122 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002123 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002124#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002125 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002126#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002127 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002128 p = s->syscall_buf;
2129 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002130 *(p++) = 'F';
2131 while (*fmt) {
2132 if (*fmt == '%') {
2133 fmt++;
2134 switch (*fmt++) {
2135 case 'x':
2136 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002137 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002138 break;
pbrooka87295e2007-05-26 15:09:38 +00002139 case 'l':
2140 if (*(fmt++) != 'x')
2141 goto bad_format;
2142 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002143 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002144 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002145 case 's':
2146 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002147 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002148 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002149 break;
2150 default:
pbrooka87295e2007-05-26 15:09:38 +00002151 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002152 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2153 fmt - 1);
2154 break;
2155 }
2156 } else {
2157 *(p++) = *(fmt++);
2158 }
2159 }
pbrook8a93e022007-08-06 13:19:15 +00002160 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002161 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002162#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002163 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002164 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002165#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002166 /* In this case wait to send the syscall packet until notification that
2167 the CPU has stopped. This must be done because if the packet is sent
2168 now the reply from the syscall request could be received while the CPU
2169 is still in the running state, which can cause packets to be dropped
2170 and state transition 'T' packets to be sent while the syscall is still
2171 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002172 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002173#endif
2174}
2175
bellard6a00d602005-11-21 23:25:50 +00002176static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002177{
2178 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002179 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002180
bellard1fddef42005-04-17 19:16:13 +00002181#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002182 if (s->last_packet_len) {
2183 /* Waiting for a response to the last packet. If we see the start
2184 of a new command then abandon the previous response. */
2185 if (ch == '-') {
2186#ifdef DEBUG_GDB
2187 printf("Got NACK, retransmitting\n");
2188#endif
thsffe8ab82007-12-16 03:16:05 +00002189 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002190 }
2191#ifdef DEBUG_GDB
2192 else if (ch == '+')
2193 printf("Got ACK\n");
2194 else
2195 printf("Got '%c' when expecting ACK/NACK\n", ch);
2196#endif
2197 if (ch == '+' || ch == '$')
2198 s->last_packet_len = 0;
2199 if (ch != '$')
2200 return;
2201 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002202 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002203 /* when the CPU is running, we cannot do anything except stop
2204 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002205 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002206 } else
bellard1fddef42005-04-17 19:16:13 +00002207#endif
bellard41625032005-04-24 10:07:11 +00002208 {
bellard858693c2004-03-31 18:52:07 +00002209 switch(s->state) {
2210 case RS_IDLE:
2211 if (ch == '$') {
2212 s->line_buf_index = 0;
2213 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002214 }
2215 break;
bellard858693c2004-03-31 18:52:07 +00002216 case RS_GETLINE:
2217 if (ch == '#') {
2218 s->state = RS_CHKSUM1;
2219 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2220 s->state = RS_IDLE;
2221 } else {
2222 s->line_buf[s->line_buf_index++] = ch;
2223 }
2224 break;
2225 case RS_CHKSUM1:
2226 s->line_buf[s->line_buf_index] = '\0';
2227 s->line_csum = fromhex(ch) << 4;
2228 s->state = RS_CHKSUM2;
2229 break;
2230 case RS_CHKSUM2:
2231 s->line_csum |= fromhex(ch);
2232 csum = 0;
2233 for(i = 0; i < s->line_buf_index; i++) {
2234 csum += s->line_buf[i];
2235 }
2236 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002237 reply = '-';
2238 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002239 s->state = RS_IDLE;
2240 } else {
ths60fe76f2007-12-16 03:02:09 +00002241 reply = '+';
2242 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002243 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002244 }
bellardb4608c02003-06-27 17:34:32 +00002245 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002246 default:
2247 abort();
bellardb4608c02003-06-27 17:34:32 +00002248 }
2249 }
bellard858693c2004-03-31 18:52:07 +00002250}
2251
Paul Brook0e1c9c52010-06-16 13:03:51 +01002252/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002253void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002254{
2255 GDBState *s;
2256 char buf[4];
2257
2258 s = gdbserver_state;
2259 if (!s) {
2260 return;
2261 }
2262#ifdef CONFIG_USER_ONLY
2263 if (gdbserver_fd < 0 || s->fd < 0) {
2264 return;
2265 }
2266#endif
2267
2268 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2269 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002270
2271#ifndef CONFIG_USER_ONLY
2272 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002273 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002274 }
2275#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002276}
2277
bellard1fddef42005-04-17 19:16:13 +00002278#ifdef CONFIG_USER_ONLY
2279int
aurel32ca587a82008-12-18 22:44:13 +00002280gdb_queuesig (void)
2281{
2282 GDBState *s;
2283
2284 s = gdbserver_state;
2285
2286 if (gdbserver_fd < 0 || s->fd < 0)
2287 return 0;
2288 else
2289 return 1;
2290}
2291
2292int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002293gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002294{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002295 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002296 GDBState *s;
2297 char buf[256];
2298 int n;
bellard1fddef42005-04-17 19:16:13 +00002299
Andreas Färber5ca666c2013-06-24 19:20:57 +02002300 s = gdbserver_state;
2301 if (gdbserver_fd < 0 || s->fd < 0) {
2302 return sig;
bellard1fddef42005-04-17 19:16:13 +00002303 }
2304
Andreas Färber5ca666c2013-06-24 19:20:57 +02002305 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002306 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002307 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002308
Andreas Färber5ca666c2013-06-24 19:20:57 +02002309 if (sig != 0) {
2310 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2311 put_packet(s, buf);
2312 }
2313 /* put_packet() might have detected that the peer terminated the
2314 connection. */
2315 if (s->fd < 0) {
2316 return sig;
2317 }
2318
2319 sig = 0;
2320 s->state = RS_IDLE;
2321 s->running_state = 0;
2322 while (s->running_state == 0) {
2323 n = read(s->fd, buf, 256);
2324 if (n > 0) {
2325 int i;
2326
2327 for (i = 0; i < n; i++) {
2328 gdb_read_byte(s, buf[i]);
2329 }
2330 } else if (n == 0 || errno != EAGAIN) {
2331 /* XXX: Connection closed. Should probably wait for another
2332 connection before continuing. */
2333 return sig;
bellard1fddef42005-04-17 19:16:13 +00002334 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002335 }
2336 sig = s->signal;
2337 s->signal = 0;
2338 return sig;
bellard1fddef42005-04-17 19:16:13 +00002339}
bellarde9009672005-04-26 20:42:36 +00002340
aurel32ca587a82008-12-18 22:44:13 +00002341/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002342void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002343{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002344 GDBState *s;
2345 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002346
Andreas Färber5ca666c2013-06-24 19:20:57 +02002347 s = gdbserver_state;
2348 if (gdbserver_fd < 0 || s->fd < 0) {
2349 return;
2350 }
aurel32ca587a82008-12-18 22:44:13 +00002351
Andreas Färber5ca666c2013-06-24 19:20:57 +02002352 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2353 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002354}
bellard1fddef42005-04-17 19:16:13 +00002355
aliguori880a7572008-11-18 20:30:24 +00002356static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002357{
2358 GDBState *s;
2359 struct sockaddr_in sockaddr;
2360 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002361 int fd;
bellard858693c2004-03-31 18:52:07 +00002362
2363 for(;;) {
2364 len = sizeof(sockaddr);
2365 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2366 if (fd < 0 && errno != EINTR) {
2367 perror("accept");
2368 return;
2369 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002370#ifndef _WIN32
2371 fcntl(fd, F_SETFD, FD_CLOEXEC);
2372#endif
bellard858693c2004-03-31 18:52:07 +00002373 break;
2374 }
2375 }
2376
2377 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002378 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002379
Anthony Liguori7267c092011-08-20 22:09:37 -05002380 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002381 s->c_cpu = first_cpu;
2382 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002383 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002384 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002385
aliguori880a7572008-11-18 20:30:24 +00002386 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002387
bellard858693c2004-03-31 18:52:07 +00002388 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002389}
2390
2391static int gdbserver_open(int port)
2392{
2393 struct sockaddr_in sockaddr;
2394 int fd, val, ret;
2395
2396 fd = socket(PF_INET, SOCK_STREAM, 0);
2397 if (fd < 0) {
2398 perror("socket");
2399 return -1;
2400 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002401#ifndef _WIN32
2402 fcntl(fd, F_SETFD, FD_CLOEXEC);
2403#endif
bellard858693c2004-03-31 18:52:07 +00002404
2405 /* allow fast reuse */
2406 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002407 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002408
2409 sockaddr.sin_family = AF_INET;
2410 sockaddr.sin_port = htons(port);
2411 sockaddr.sin_addr.s_addr = 0;
2412 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2413 if (ret < 0) {
2414 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002415 close(fd);
bellard858693c2004-03-31 18:52:07 +00002416 return -1;
2417 }
2418 ret = listen(fd, 0);
2419 if (ret < 0) {
2420 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002421 close(fd);
bellard858693c2004-03-31 18:52:07 +00002422 return -1;
2423 }
bellard858693c2004-03-31 18:52:07 +00002424 return fd;
2425}
2426
2427int gdbserver_start(int port)
2428{
2429 gdbserver_fd = gdbserver_open(port);
2430 if (gdbserver_fd < 0)
2431 return -1;
2432 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002433 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002434 return 0;
2435}
aurel322b1319c2008-12-18 22:44:04 +00002436
2437/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002438void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002439{
2440 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002441 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002442 return;
2443 close(s->fd);
2444 s->fd = -1;
2445 cpu_breakpoint_remove_all(env, BP_GDB);
2446 cpu_watchpoint_remove_all(env, BP_GDB);
2447}
pbrook4046d912007-01-28 01:53:16 +00002448#else
thsaa1f17c2007-07-11 22:48:58 +00002449static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002450{
pbrook56aebc82008-10-11 17:55:29 +00002451 /* We can handle an arbitrarily large amount of data.
2452 Pick the maximum packet size, which is as good as anything. */
2453 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002454}
2455
thsaa1f17c2007-07-11 22:48:58 +00002456static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002457{
pbrook4046d912007-01-28 01:53:16 +00002458 int i;
2459
2460 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002461 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002462 }
2463}
2464
2465static void gdb_chr_event(void *opaque, int event)
2466{
2467 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302468 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002469 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002470 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002471 break;
2472 default:
2473 break;
2474 }
2475}
2476
aliguori8a34a0f2009-03-05 23:01:55 +00002477static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2478{
2479 char buf[MAX_PACKET_LENGTH];
2480
2481 buf[0] = 'O';
2482 if (len > (MAX_PACKET_LENGTH/2) - 1)
2483 len = (MAX_PACKET_LENGTH/2) - 1;
2484 memtohex(buf + 1, (uint8_t *)msg, len);
2485 put_packet(s, buf);
2486}
2487
2488static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2489{
2490 const char *p = (const char *)buf;
2491 int max_sz;
2492
2493 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2494 for (;;) {
2495 if (len <= max_sz) {
2496 gdb_monitor_output(gdbserver_state, p, len);
2497 break;
2498 }
2499 gdb_monitor_output(gdbserver_state, p, max_sz);
2500 p += max_sz;
2501 len -= max_sz;
2502 }
2503 return len;
2504}
2505
aliguori59030a82009-04-05 18:43:41 +00002506#ifndef _WIN32
2507static void gdb_sigterm_handler(int signal)
2508{
Luiz Capitulino13548692011-07-29 15:36:43 -03002509 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002510 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002511 }
aliguori59030a82009-04-05 18:43:41 +00002512}
2513#endif
2514
2515int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002516{
2517 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002518 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002519 CharDriverState *chr = NULL;
2520 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002521
aliguori59030a82009-04-05 18:43:41 +00002522 if (!device)
2523 return -1;
2524 if (strcmp(device, "none") != 0) {
2525 if (strstart(device, "tcp:", NULL)) {
2526 /* enforce required TCP attributes */
2527 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2528 "%s,nowait,nodelay,server", device);
2529 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002530 }
aliguori59030a82009-04-05 18:43:41 +00002531#ifndef _WIN32
2532 else if (strcmp(device, "stdio") == 0) {
2533 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002534
aliguori59030a82009-04-05 18:43:41 +00002535 memset(&act, 0, sizeof(act));
2536 act.sa_handler = gdb_sigterm_handler;
2537 sigaction(SIGINT, &act, NULL);
2538 }
2539#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002540 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002541 if (!chr)
2542 return -1;
2543
Hans de Goede456d6062013-03-27 20:29:40 +01002544 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002545 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2546 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002547 }
2548
aliguori36556b22009-03-28 18:05:53 +00002549 s = gdbserver_state;
2550 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002551 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002552 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002553
aliguori36556b22009-03-28 18:05:53 +00002554 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2555
2556 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002557 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002558 mon_chr->chr_write = gdb_monitor_write;
2559 monitor_init(mon_chr, 0);
2560 } else {
2561 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002562 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002563 mon_chr = s->mon_chr;
2564 memset(s, 0, sizeof(GDBState));
2565 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002566 s->c_cpu = first_cpu;
2567 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002568 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002569 s->state = chr ? RS_IDLE : RS_INACTIVE;
2570 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002571 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002572
pbrook4046d912007-01-28 01:53:16 +00002573 return 0;
2574}
2575#endif