blob: bf98eb079b4cf19487ee9b65f9256f6681041ec3 [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
541/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
542 whatever the target description contains. Due to a historical mishap
543 the FPA registers appear in between core integer regs and the CPSR.
544 We hack round this by giving the FPA regs zero size when talking to a
545 newer gdb. */
pbrook56aebc82008-10-11 17:55:29 +0000546#define GDB_CORE_XML "arm-core.xml"
547
Andreas Färberf3840912012-02-20 06:44:56 +0100548static int cpu_gdb_read_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000549{
pbrook56aebc82008-10-11 17:55:29 +0000550 if (n < 16) {
551 /* Core integer register. */
552 GET_REG32(env->regs[n]);
553 }
554 if (n < 24) {
555 /* FPA registers. */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200556 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +0000557 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200558 }
pbrook56aebc82008-10-11 17:55:29 +0000559 memset(mem_buf, 0, 12);
560 return 12;
561 }
562 switch (n) {
563 case 24:
564 /* FPA status register. */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200565 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +0000566 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200567 }
pbrook56aebc82008-10-11 17:55:29 +0000568 GET_REG32(0);
569 case 25:
570 /* CPSR */
571 GET_REG32(cpsr_read(env));
572 }
573 /* Unknown register. */
574 return 0;
bellard1fddef42005-04-17 19:16:13 +0000575}
576
Andreas Färberf3840912012-02-20 06:44:56 +0100577static int cpu_gdb_write_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000578{
pbrook56aebc82008-10-11 17:55:29 +0000579 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000580
pbrook56aebc82008-10-11 17:55:29 +0000581 tmp = ldl_p(mem_buf);
582
583 /* Mask out low bit of PC to workaround gdb bugs. This will probably
584 cause problems if we ever implement the Jazelle DBX extensions. */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200585 if (n == 15) {
pbrook56aebc82008-10-11 17:55:29 +0000586 tmp &= ~1;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200587 }
pbrook56aebc82008-10-11 17:55:29 +0000588
589 if (n < 16) {
590 /* Core integer register. */
591 env->regs[n] = tmp;
592 return 4;
593 }
594 if (n < 24) { /* 16-23 */
595 /* FPA registers (ignored). */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200596 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +0000597 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200598 }
pbrook56aebc82008-10-11 17:55:29 +0000599 return 12;
600 }
601 switch (n) {
602 case 24:
603 /* FPA status register (ignored). */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200604 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +0000605 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200606 }
pbrook56aebc82008-10-11 17:55:29 +0000607 return 4;
608 case 25:
609 /* CPSR */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200610 cpsr_write(env, tmp, 0xffffffff);
pbrook56aebc82008-10-11 17:55:29 +0000611 return 4;
612 }
613 /* Unknown register. */
614 return 0;
bellard1fddef42005-04-17 19:16:13 +0000615}
pbrook56aebc82008-10-11 17:55:29 +0000616
pbrooke6e59062006-10-22 00:18:54 +0000617#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +0000618
pbrook56aebc82008-10-11 17:55:29 +0000619#define GDB_CORE_XML "cf-core.xml"
620
Andreas Färberf3840912012-02-20 06:44:56 +0100621static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000622{
pbrook56aebc82008-10-11 17:55:29 +0000623 if (n < 8) {
624 /* D0-D7 */
625 GET_REG32(env->dregs[n]);
626 } else if (n < 16) {
627 /* A0-A7 */
628 GET_REG32(env->aregs[n - 8]);
629 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200630 switch (n) {
631 case 16:
632 GET_REG32(env->sr);
633 case 17:
634 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000635 }
pbrooke6e59062006-10-22 00:18:54 +0000636 }
pbrook56aebc82008-10-11 17:55:29 +0000637 /* FP registers not included here because they vary between
638 ColdFire and m68k. Use XML bits for these. */
639 return 0;
pbrooke6e59062006-10-22 00:18:54 +0000640}
641
Andreas Färberf3840912012-02-20 06:44:56 +0100642static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000643{
pbrook56aebc82008-10-11 17:55:29 +0000644 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +0000645
pbrook56aebc82008-10-11 17:55:29 +0000646 tmp = ldl_p(mem_buf);
647
648 if (n < 8) {
649 /* D0-D7 */
650 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -0800651 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +0000652 /* A0-A7 */
653 env->aregs[n - 8] = tmp;
654 } else {
655 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200656 case 16:
657 env->sr = tmp;
658 break;
659 case 17:
660 env->pc = tmp;
661 break;
662 default:
663 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000664 }
pbrooke6e59062006-10-22 00:18:54 +0000665 }
pbrook56aebc82008-10-11 17:55:29 +0000666 return 4;
pbrooke6e59062006-10-22 00:18:54 +0000667}
bellard6f970bd2005-12-05 19:55:19 +0000668#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +0000669
Andreas Färberf3840912012-02-20 06:44:56 +0100670static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000671{
pbrook56aebc82008-10-11 17:55:29 +0000672 if (n < 32) {
673 GET_REGL(env->active_tc.gpr[n]);
674 }
675 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
676 if (n >= 38 && n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200677 if (env->CP0_Status & (1 << CP0St_FR)) {
678 GET_REGL(env->active_fpu.fpr[n - 38].d);
679 } else {
680 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
681 }
pbrook56aebc82008-10-11 17:55:29 +0000682 }
683 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200684 case 70:
685 GET_REGL((int32_t)env->active_fpu.fcr31);
686 case 71:
687 GET_REGL((int32_t)env->active_fpu.fcr0);
pbrook56aebc82008-10-11 17:55:29 +0000688 }
689 }
690 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200691 case 32:
692 GET_REGL((int32_t)env->CP0_Status);
693 case 33:
694 GET_REGL(env->active_tc.LO[0]);
695 case 34:
696 GET_REGL(env->active_tc.HI[0]);
697 case 35:
698 GET_REGL(env->CP0_BadVAddr);
699 case 36:
700 GET_REGL((int32_t)env->CP0_Cause);
701 case 37:
702 GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
703 case 72:
704 GET_REGL(0); /* fp */
705 case 89:
706 GET_REGL((int32_t)env->CP0_PRid);
pbrook56aebc82008-10-11 17:55:29 +0000707 }
708 if (n >= 73 && n <= 88) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200709 /* 16 embedded regs. */
710 GET_REGL(0);
pbrook56aebc82008-10-11 17:55:29 +0000711 }
ths36d23952007-02-28 22:37:42 +0000712
pbrook56aebc82008-10-11 17:55:29 +0000713 return 0;
bellard6f970bd2005-12-05 19:55:19 +0000714}
715
ths8e33c082006-12-11 19:22:27 +0000716/* convert MIPS rounding mode in FCR31 to IEEE library */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200717static unsigned int ieee_rm[] = {
ths8e33c082006-12-11 19:22:27 +0000718 float_round_nearest_even,
719 float_round_to_zero,
720 float_round_up,
721 float_round_down
Andreas Färber47d74ef2013-07-07 11:17:26 +0200722};
ths8e33c082006-12-11 19:22:27 +0000723#define RESTORE_ROUNDING_MODE \
Andreas Färber47d74ef2013-07-07 11:17:26 +0200724 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], \
725 &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +0000726
Andreas Färberf3840912012-02-20 06:44:56 +0100727static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000728{
pbrook56aebc82008-10-11 17:55:29 +0000729 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +0000730
pbrook56aebc82008-10-11 17:55:29 +0000731 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +0000732
pbrook56aebc82008-10-11 17:55:29 +0000733 if (n < 32) {
734 env->active_tc.gpr[n] = tmp;
735 return sizeof(target_ulong);
736 }
737 if (env->CP0_Config1 & (1 << CP0C1_FP)
738 && n >= 38 && n < 73) {
739 if (n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200740 if (env->CP0_Status & (1 << CP0St_FR)) {
741 env->active_fpu.fpr[n - 38].d = tmp;
742 } else {
743 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
744 }
pbrook56aebc82008-10-11 17:55:29 +0000745 }
746 switch (n) {
747 case 70:
748 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
749 /* set rounding mode */
750 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +0000751 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200752 case 71:
753 env->active_fpu.fcr0 = tmp;
754 break;
pbrook56aebc82008-10-11 17:55:29 +0000755 }
756 return sizeof(target_ulong);
757 }
758 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200759 case 32:
760 env->CP0_Status = tmp;
761 break;
762 case 33:
763 env->active_tc.LO[0] = tmp;
764 break;
765 case 34:
766 env->active_tc.HI[0] = tmp;
767 break;
768 case 35:
769 env->CP0_BadVAddr = tmp;
770 break;
771 case 36:
772 env->CP0_Cause = tmp;
773 break;
Nathan Froydff1d1972009-12-08 08:06:30 -0800774 case 37:
775 env->active_tc.PC = tmp & ~(target_ulong)1;
776 if (tmp & 1) {
777 env->hflags |= MIPS_HFLAG_M16;
778 } else {
779 env->hflags &= ~(MIPS_HFLAG_M16);
780 }
781 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200782 case 72: /* fp, ignored */
783 break;
784 default:
785 if (n > 89) {
786 return 0;
787 }
788 /* Other registers are readonly. Ignore writes. */
789 break;
pbrook56aebc82008-10-11 17:55:29 +0000790 }
791
792 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +0000793}
Jia Liufc043552012-07-20 15:50:50 +0800794#elif defined(TARGET_OPENRISC)
795
Jia Liufc043552012-07-20 15:50:50 +0800796static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
797{
798 if (n < 32) {
799 GET_REG32(env->gpr[n]);
800 } else {
801 switch (n) {
802 case 32: /* PPC */
803 GET_REG32(env->ppc);
Jia Liufc043552012-07-20 15:50:50 +0800804
805 case 33: /* NPC */
806 GET_REG32(env->npc);
Jia Liufc043552012-07-20 15:50:50 +0800807
808 case 34: /* SR */
809 GET_REG32(env->sr);
Jia Liufc043552012-07-20 15:50:50 +0800810
811 default:
812 break;
813 }
814 }
815 return 0;
816}
817
818static int cpu_gdb_write_register(CPUOpenRISCState *env,
819 uint8_t *mem_buf, int n)
820{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200821 OpenRISCCPU *cpu = openrisc_env_get_cpu(env);
822 CPUClass *cc = CPU_GET_CLASS(cpu);
Jia Liufc043552012-07-20 15:50:50 +0800823 uint32_t tmp;
824
Andreas Färbera0e372f2013-06-28 23:18:47 +0200825 if (n > cc->gdb_num_core_regs) {
Jia Liufc043552012-07-20 15:50:50 +0800826 return 0;
827 }
828
829 tmp = ldl_p(mem_buf);
830
831 if (n < 32) {
832 env->gpr[n] = tmp;
833 } else {
834 switch (n) {
835 case 32: /* PPC */
836 env->ppc = tmp;
837 break;
838
839 case 33: /* NPC */
840 env->npc = tmp;
841 break;
842
843 case 34: /* SR */
844 env->sr = tmp;
845 break;
846
847 default:
848 break;
849 }
850 }
851 return 4;
852}
bellardfdf9b3e2006-04-27 21:07:38 +0000853#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +0000854
855/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +0000856/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +0000857
Andreas Färberf3840912012-02-20 06:44:56 +0100858static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000859{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200860 switch (n) {
861 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +0000862 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
863 GET_REGL(env->gregs[n + 16]);
864 } else {
865 GET_REGL(env->gregs[n]);
866 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200867 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +0900868 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200869 case 16:
870 GET_REGL(env->pc);
871 case 17:
872 GET_REGL(env->pr);
873 case 18:
874 GET_REGL(env->gbr);
875 case 19:
876 GET_REGL(env->vbr);
877 case 20:
878 GET_REGL(env->mach);
879 case 21:
880 GET_REGL(env->macl);
881 case 22:
882 GET_REGL(env->sr);
883 case 23:
884 GET_REGL(env->fpul);
885 case 24:
886 GET_REGL(env->fpscr);
887 case 25 ... 40:
888 if (env->fpscr & FPSCR_FR) {
889 stfl_p(mem_buf, env->fregs[n - 9]);
890 } else {
891 stfl_p(mem_buf, env->fregs[n - 25]);
892 }
893 return 4;
894 case 41:
895 GET_REGL(env->ssr);
896 case 42:
897 GET_REGL(env->spc);
898 case 43 ... 50:
899 GET_REGL(env->gregs[n - 43]);
900 case 51 ... 58:
901 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +0000902 }
bellardfdf9b3e2006-04-27 21:07:38 +0000903
pbrook56aebc82008-10-11 17:55:29 +0000904 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +0000905}
906
Andreas Färberf3840912012-02-20 06:44:56 +0100907static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000908{
pbrook56aebc82008-10-11 17:55:29 +0000909 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +0200910 case 0 ... 7:
911 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
912 env->gregs[n + 16] = ldl_p(mem_buf);
913 } else {
914 env->gregs[n] = ldl_p(mem_buf);
915 }
916 break;
917 case 8 ... 15:
918 env->gregs[n] = ldl_p(mem_buf);
919 break;
920 case 16:
921 env->pc = ldl_p(mem_buf);
922 break;
923 case 17:
924 env->pr = ldl_p(mem_buf);
925 break;
926 case 18:
927 env->gbr = ldl_p(mem_buf);
928 break;
929 case 19:
930 env->vbr = ldl_p(mem_buf);
931 break;
932 case 20:
933 env->mach = ldl_p(mem_buf);
934 break;
935 case 21:
936 env->macl = ldl_p(mem_buf);
937 break;
938 case 22:
939 env->sr = ldl_p(mem_buf);
940 break;
941 case 23:
942 env->fpul = ldl_p(mem_buf);
943 break;
944 case 24:
945 env->fpscr = ldl_p(mem_buf);
946 break;
947 case 25 ... 40:
948 if (env->fpscr & FPSCR_FR) {
949 env->fregs[n - 9] = ldfl_p(mem_buf);
950 } else {
951 env->fregs[n - 25] = ldfl_p(mem_buf);
952 }
953 break;
954 case 41:
955 env->ssr = ldl_p(mem_buf);
956 break;
957 case 42:
958 env->spc = ldl_p(mem_buf);
959 break;
960 case 43 ... 50:
961 env->gregs[n - 43] = ldl_p(mem_buf);
962 break;
963 case 51 ... 58:
964 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
965 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200966 default:
967 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000968 }
969
970 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +0000971}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200972#elif defined (TARGET_MICROBLAZE)
973
Andreas Färberf3840912012-02-20 06:44:56 +0100974static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200975{
976 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200977 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200978 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200979 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200980 }
981 return 0;
982}
983
Andreas Färberf3840912012-02-20 06:44:56 +0100984static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200985{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200986 MicroBlazeCPU *cpu = mb_env_get_cpu(env);
987 CPUClass *cc = CPU_GET_CLASS(cpu);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200988 uint32_t tmp;
989
Andreas Färbera0e372f2013-06-28 23:18:47 +0200990 if (n > cc->gdb_num_core_regs) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200991 return 0;
992 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200993
994 tmp = ldl_p(mem_buf);
995
996 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200997 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +0200998 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200999 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001000 }
1001 return 4;
1002}
thsf1ccf902007-10-08 13:16:14 +00001003#elif defined (TARGET_CRIS)
1004
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001005static int
Andreas Färberf3840912012-02-20 06:44:56 +01001006read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001007{
1008 if (n < 15) {
1009 GET_REG32(env->regs[n]);
1010 }
1011
1012 if (n == 15) {
1013 GET_REG32(env->pc);
1014 }
1015
1016 if (n < 32) {
1017 switch (n) {
1018 case 16:
1019 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001020 case 17:
1021 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001022 case 20:
1023 case 21:
1024 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001025 default:
1026 if (n >= 23) {
1027 GET_REG32(env->pregs[n - 16]);
1028 }
1029 break;
1030 }
1031 }
1032 return 0;
1033}
1034
Andreas Färberf3840912012-02-20 06:44:56 +01001035static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001036{
pbrook56aebc82008-10-11 17:55:29 +00001037 uint8_t srs;
1038
Andreas Färber47d74ef2013-07-07 11:17:26 +02001039 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001040 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +02001041 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001042
pbrook56aebc82008-10-11 17:55:29 +00001043 srs = env->pregs[PR_SRS];
1044 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001045 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +00001046 }
1047
1048 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001049 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +00001050 }
1051 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001052 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +00001053 }
1054 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001055 case 16:
1056 GET_REG8(env->pregs[0]);
1057 case 17:
1058 GET_REG8(env->pregs[1]);
1059 case 18:
1060 GET_REG32(env->pregs[2]);
1061 case 19:
1062 GET_REG8(srs);
1063 case 20:
1064 GET_REG16(env->pregs[4]);
1065 case 32:
1066 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +00001067 }
1068
1069 return 0;
thsf1ccf902007-10-08 13:16:14 +00001070}
1071
Andreas Färberf3840912012-02-20 06:44:56 +01001072static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001073{
pbrook56aebc82008-10-11 17:55:29 +00001074 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001075
Andreas Färber47d74ef2013-07-07 11:17:26 +02001076 if (n > 49) {
1077 return 0;
1078 }
thsf1ccf902007-10-08 13:16:14 +00001079
pbrook56aebc82008-10-11 17:55:29 +00001080 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001081
pbrook56aebc82008-10-11 17:55:29 +00001082 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001083 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +00001084 }
thsf1ccf902007-10-08 13:16:14 +00001085
edgar_igld7b69672008-10-11 19:32:21 +00001086 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001087 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +00001088 }
1089
1090 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001091 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001092 case 16:
1093 return 1;
1094 case 17:
1095 return 1;
1096 case 18:
1097 env->pregs[PR_PID] = tmp;
1098 break;
1099 case 19:
1100 return 1;
1101 case 20:
1102 return 2;
1103 case 32:
1104 env->pc = tmp;
1105 break;
pbrook56aebc82008-10-11 17:55:29 +00001106 }
thsf1ccf902007-10-08 13:16:14 +00001107
pbrook56aebc82008-10-11 17:55:29 +00001108 return 4;
thsf1ccf902007-10-08 13:16:14 +00001109}
aurel3219bf5172008-12-07 23:26:32 +00001110#elif defined (TARGET_ALPHA)
1111
Andreas Färberf3840912012-02-20 06:44:56 +01001112static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001113{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001114 uint64_t val;
1115 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001116
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001117 switch (n) {
1118 case 0 ... 30:
1119 val = env->ir[n];
1120 break;
1121 case 32 ... 62:
1122 d.d = env->fir[n - 32];
1123 val = d.ll;
1124 break;
1125 case 63:
1126 val = cpu_alpha_load_fpcr(env);
1127 break;
1128 case 64:
1129 val = env->pc;
1130 break;
1131 case 66:
1132 val = env->unique;
1133 break;
1134 case 31:
1135 case 65:
1136 /* 31 really is the zero register; 65 is unassigned in the
1137 gdb protocol, but is still required to occupy 8 bytes. */
1138 val = 0;
1139 break;
1140 default:
1141 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001142 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001143 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001144}
1145
Andreas Färberf3840912012-02-20 06:44:56 +01001146static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001147{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001148 target_ulong tmp = ldtul_p(mem_buf);
1149 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001150
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001151 switch (n) {
1152 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001153 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001154 break;
1155 case 32 ... 62:
1156 d.ll = tmp;
1157 env->fir[n - 32] = d.d;
1158 break;
1159 case 63:
1160 cpu_alpha_store_fpcr(env, tmp);
1161 break;
1162 case 64:
1163 env->pc = tmp;
1164 break;
1165 case 66:
1166 env->unique = tmp;
1167 break;
1168 case 31:
1169 case 65:
1170 /* 31 really is the zero register; 65 is unassigned in the
1171 gdb protocol, but is still required to occupy 8 bytes. */
1172 break;
1173 default:
1174 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001175 }
aurel3219bf5172008-12-07 23:26:32 +00001176 return 8;
1177}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001178#elif defined (TARGET_S390X)
1179
Andreas Färberf3840912012-02-20 06:44:56 +01001180static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001181{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001182 uint64_t val;
1183 int cc_op;
1184
Alexander Grafafcb0e42009-12-05 12:44:29 +01001185 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001186 case S390_PSWM_REGNUM:
1187 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1188 val = deposit64(env->psw.mask, 44, 2, cc_op);
1189 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001190 case S390_PSWA_REGNUM:
1191 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001192 case S390_R0_REGNUM ... S390_R15_REGNUM:
1193 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001194 case S390_A0_REGNUM ... S390_A15_REGNUM:
1195 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001196 case S390_FPC_REGNUM:
1197 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001198 case S390_F0_REGNUM ... S390_F15_REGNUM:
1199 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +01001200 }
1201
1202 return 0;
1203}
1204
Andreas Färberf3840912012-02-20 06:44:56 +01001205static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001206{
1207 target_ulong tmpl;
1208 uint32_t tmp32;
1209 int r = 8;
1210 tmpl = ldtul_p(mem_buf);
1211 tmp32 = ldl_p(mem_buf);
1212
1213 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001214 case S390_PSWM_REGNUM:
1215 env->psw.mask = tmpl;
1216 env->cc_op = extract64(tmpl, 44, 2);
1217 break;
1218 case S390_PSWA_REGNUM:
1219 env->psw.addr = tmpl;
1220 break;
1221 case S390_R0_REGNUM ... S390_R15_REGNUM:
1222 env->regs[n-S390_R0_REGNUM] = tmpl;
1223 break;
1224 case S390_A0_REGNUM ... S390_A15_REGNUM:
1225 env->aregs[n-S390_A0_REGNUM] = tmp32;
1226 r = 4;
1227 break;
1228 case S390_FPC_REGNUM:
1229 env->fpc = tmp32;
1230 r = 4;
1231 break;
1232 case S390_F0_REGNUM ... S390_F15_REGNUM:
1233 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1234 break;
1235 default:
1236 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001237 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001238 return r;
1239}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001240#elif defined (TARGET_LM32)
1241
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001242#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001243
Andreas Färberf3840912012-02-20 06:44:56 +01001244static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001245{
1246 if (n < 32) {
1247 GET_REG32(env->regs[n]);
1248 } else {
1249 switch (n) {
1250 case 32:
1251 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001252 /* FIXME: put in right exception ID */
1253 case 33:
1254 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001255 case 34:
1256 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001257 case 35:
1258 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001259 case 36:
1260 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001261 case 37:
1262 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001263 case 38:
1264 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001265 }
1266 }
1267 return 0;
1268}
1269
Andreas Färberf3840912012-02-20 06:44:56 +01001270static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001271{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001272 LM32CPU *cpu = lm32_env_get_cpu(env);
1273 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001274 uint32_t tmp;
1275
Andreas Färbera0e372f2013-06-28 23:18:47 +02001276 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +01001277 return 0;
1278 }
1279
1280 tmp = ldl_p(mem_buf);
1281
1282 if (n < 32) {
1283 env->regs[n] = tmp;
1284 } else {
1285 switch (n) {
1286 case 32:
1287 env->pc = tmp;
1288 break;
1289 case 34:
1290 env->eba = tmp;
1291 break;
1292 case 35:
1293 env->deba = tmp;
1294 break;
1295 case 36:
1296 env->ie = tmp;
1297 break;
1298 case 37:
1299 lm32_pic_set_im(env->pic_state, tmp);
1300 break;
1301 case 38:
1302 lm32_pic_set_ip(env->pic_state, tmp);
1303 break;
1304 }
1305 }
1306 return 4;
1307}
Max Filippovccfcaba2011-09-06 03:55:52 +04001308#elif defined(TARGET_XTENSA)
1309
Andreas Färberf3840912012-02-20 06:44:56 +01001310static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001311{
1312 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1313
1314 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1315 return 0;
1316 }
1317
1318 switch (reg->type) {
1319 case 9: /*pc*/
1320 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +04001321
1322 case 1: /*ar*/
1323 xtensa_sync_phys_from_window(env);
1324 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001325
1326 case 2: /*SR*/
1327 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001328
1329 case 3: /*UR*/
1330 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001331
Max Filippovdd519cb2012-09-19 04:23:54 +04001332 case 4: /*f*/
1333 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +04001334
Max Filippovccfcaba2011-09-06 03:55:52 +04001335 case 8: /*a*/
1336 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001337
1338 default:
1339 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001340 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001341 return 0;
1342 }
1343}
1344
Andreas Färberf3840912012-02-20 06:44:56 +01001345static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001346{
1347 uint32_t tmp;
1348 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1349
1350 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1351 return 0;
1352 }
1353
1354 tmp = ldl_p(mem_buf);
1355
1356 switch (reg->type) {
1357 case 9: /*pc*/
1358 env->pc = tmp;
1359 break;
1360
1361 case 1: /*ar*/
1362 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1363 xtensa_sync_window_from_phys(env);
1364 break;
1365
1366 case 2: /*SR*/
1367 env->sregs[reg->targno & 0xff] = tmp;
1368 break;
1369
1370 case 3: /*UR*/
1371 env->uregs[reg->targno & 0xff] = tmp;
1372 break;
1373
Max Filippovdd519cb2012-09-19 04:23:54 +04001374 case 4: /*f*/
1375 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1376 break;
1377
Max Filippovccfcaba2011-09-06 03:55:52 +04001378 case 8: /*a*/
1379 env->regs[reg->targno & 0x0f] = tmp;
1380 break;
1381
1382 default:
1383 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001384 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001385 return 0;
1386 }
1387
1388 return 4;
1389}
bellard1fddef42005-04-17 19:16:13 +00001390#else
pbrook56aebc82008-10-11 17:55:29 +00001391
Andreas Färber9349b4f2012-03-14 01:38:32 +01001392static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001393{
1394 return 0;
1395}
1396
Andreas Färber9349b4f2012-03-14 01:38:32 +01001397static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001398{
pbrook56aebc82008-10-11 17:55:29 +00001399 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001400}
1401
1402#endif
bellardb4608c02003-06-27 17:34:32 +00001403
pbrook56aebc82008-10-11 17:55:29 +00001404#ifdef GDB_CORE_XML
1405/* Encode data using the encoding for 'x' packets. */
1406static int memtox(char *buf, const char *mem, int len)
1407{
1408 char *p = buf;
1409 char c;
1410
1411 while (len--) {
1412 c = *(mem++);
1413 switch (c) {
1414 case '#': case '$': case '*': case '}':
1415 *(p++) = '}';
1416 *(p++) = c ^ 0x20;
1417 break;
1418 default:
1419 *(p++) = c;
1420 break;
1421 }
1422 }
1423 return p - buf;
1424}
1425
aurel323faf7782008-12-07 23:26:17 +00001426static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001427{
pbrook56aebc82008-10-11 17:55:29 +00001428 size_t len;
1429 int i;
1430 const char *name;
1431 static char target_xml[1024];
1432
1433 len = 0;
1434 while (p[len] && p[len] != ':')
1435 len++;
1436 *newp = p + len;
1437
1438 name = NULL;
1439 if (strncmp(p, "target.xml", len) == 0) {
1440 /* Generate the XML description for this CPU. */
1441 if (!target_xml[0]) {
1442 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001443 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001444
blueswir15b3715b2008-10-25 11:18:12 +00001445 snprintf(target_xml, sizeof(target_xml),
1446 "<?xml version=\"1.0\"?>"
1447 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1448 "<target>"
1449 "<xi:include href=\"%s\"/>",
1450 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001451
Andreas Färbereac8b352013-06-28 21:11:37 +02001452 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001453 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1454 pstrcat(target_xml, sizeof(target_xml), r->xml);
1455 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001456 }
blueswir12dc766d2009-04-13 16:06:19 +00001457 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001458 }
1459 return target_xml;
1460 }
1461 for (i = 0; ; i++) {
1462 name = xml_builtin[i][0];
1463 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1464 break;
1465 }
1466 return name ? xml_builtin[i][1] : NULL;
1467}
1468#endif
1469
Andreas Färber385b9f02013-06-27 18:25:36 +02001470static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001471{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001472 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001473 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001474 GDBRegisterState *r;
1475
Andreas Färbera0e372f2013-06-28 23:18:47 +02001476 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001477 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001478 }
pbrook56aebc82008-10-11 17:55:29 +00001479
Andreas Färbereac8b352013-06-28 21:11:37 +02001480 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001481 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1482 return r->get_reg(env, mem_buf, reg - r->base_reg);
1483 }
1484 }
1485 return 0;
1486}
1487
Andreas Färber385b9f02013-06-27 18:25:36 +02001488static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001489{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001490 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001491 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001492 GDBRegisterState *r;
1493
Andreas Färbera0e372f2013-06-28 23:18:47 +02001494 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001495 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001496 }
pbrook56aebc82008-10-11 17:55:29 +00001497
Andreas Färbereac8b352013-06-28 21:11:37 +02001498 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001499 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1500 return r->set_reg(env, mem_buf, reg - r->base_reg);
1501 }
1502 }
1503 return 0;
1504}
1505
1506/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1507 specifies the first register number and these registers are included in
1508 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1509 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1510 */
1511
Andreas Färber22169d42013-06-28 21:27:39 +02001512void gdb_register_coprocessor(CPUState *cpu,
1513 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1514 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001515{
1516 GDBRegisterState *s;
1517 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001518
Andreas Färbereac8b352013-06-28 21:11:37 +02001519 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001520 while (*p) {
1521 /* Check for duplicates. */
1522 if (strcmp((*p)->xml, xml) == 0)
1523 return;
1524 p = &(*p)->next;
1525 }
Stefan Weil9643c252011-10-18 22:25:38 +02001526
1527 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001528 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02001529 s->num_regs = num_regs;
1530 s->get_reg = get_reg;
1531 s->set_reg = set_reg;
1532 s->xml = xml;
1533
pbrook56aebc82008-10-11 17:55:29 +00001534 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02001535 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00001536 *p = s;
1537 if (g_pos) {
1538 if (g_pos != s->base_reg) {
1539 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1540 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001541 }
1542 }
1543}
1544
aliguoria1d1bb32008-11-18 20:07:32 +00001545#ifndef CONFIG_USER_ONLY
1546static const int xlat_gdb_type[] = {
1547 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1548 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1549 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1550};
1551#endif
1552
aliguori880a7572008-11-18 20:30:24 +00001553static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001554{
Andreas Färber182735e2013-05-29 22:29:20 +02001555 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001556 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001557 int err = 0;
1558
Andreas Färber62278812013-06-27 17:12:06 +02001559 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001560 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001561 }
aliguorie22a25c2009-03-12 20:12:48 +00001562
aliguoria1d1bb32008-11-18 20:07:32 +00001563 switch (type) {
1564 case GDB_BREAKPOINT_SW:
1565 case GDB_BREAKPOINT_HW:
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 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1569 if (err)
1570 break;
1571 }
1572 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001573#ifndef CONFIG_USER_ONLY
1574 case GDB_WATCHPOINT_WRITE:
1575 case GDB_WATCHPOINT_READ:
1576 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001577 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1578 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001579 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1580 NULL);
1581 if (err)
1582 break;
1583 }
1584 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001585#endif
1586 default:
1587 return -ENOSYS;
1588 }
1589}
1590
aliguori880a7572008-11-18 20:30:24 +00001591static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001592{
Andreas Färber182735e2013-05-29 22:29:20 +02001593 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001594 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001595 int err = 0;
1596
Andreas Färber62278812013-06-27 17:12:06 +02001597 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001598 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001599 }
aliguorie22a25c2009-03-12 20:12:48 +00001600
aliguoria1d1bb32008-11-18 20:07:32 +00001601 switch (type) {
1602 case GDB_BREAKPOINT_SW:
1603 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001604 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1605 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001606 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1607 if (err)
1608 break;
1609 }
1610 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001611#ifndef CONFIG_USER_ONLY
1612 case GDB_WATCHPOINT_WRITE:
1613 case GDB_WATCHPOINT_READ:
1614 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001615 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1616 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001617 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1618 if (err)
1619 break;
1620 }
1621 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001622#endif
1623 default:
1624 return -ENOSYS;
1625 }
1626}
1627
aliguori880a7572008-11-18 20:30:24 +00001628static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001629{
Andreas Färber182735e2013-05-29 22:29:20 +02001630 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001631 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001632
aliguorie22a25c2009-03-12 20:12:48 +00001633 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001634 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001635 return;
1636 }
1637
Andreas Färber182735e2013-05-29 22:29:20 +02001638 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1639 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001640 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001641#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001642 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001643#endif
aliguori880a7572008-11-18 20:30:24 +00001644 }
aliguoria1d1bb32008-11-18 20:07:32 +00001645}
1646
aurel32fab9d282009-04-08 21:29:37 +00001647static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1648{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001649 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001650 CPUClass *cc = CPU_GET_CLASS(cpu);
1651
1652 cpu_synchronize_state(cpu);
1653 if (cc->set_pc) {
1654 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001655 }
aurel32fab9d282009-04-08 21:29:37 +00001656}
1657
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001658static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001659{
Andreas Färber0d342822012-12-17 07:12:13 +01001660 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001661
Andreas Färber182735e2013-05-29 22:29:20 +02001662 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001663 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001664 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001665 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001666 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001667
1668 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001669}
1670
aliguori880a7572008-11-18 20:30:24 +00001671static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001672{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001673 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001674 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001675 uint32_t thread;
1676 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001677 char buf[MAX_PACKET_LENGTH];
1678 uint8_t mem_buf[MAX_PACKET_LENGTH];
1679 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001680 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001681
bellard858693c2004-03-31 18:52:07 +00001682#ifdef DEBUG_GDB
1683 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001684#endif
bellard858693c2004-03-31 18:52:07 +00001685 p = line_buf;
1686 ch = *p++;
1687 switch(ch) {
1688 case '?':
bellard1fddef42005-04-17 19:16:13 +00001689 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001690 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001691 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001692 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001693 /* Remove all the breakpoints when this query is issued,
1694 * because gdb is doing and initial connect and the state
1695 * should be cleaned up.
1696 */
aliguori880a7572008-11-18 20:30:24 +00001697 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001698 break;
1699 case 'c':
1700 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001701 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001702 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001703 }
aurel32ca587a82008-12-18 22:44:13 +00001704 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001705 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001706 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001707 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001708 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1709 if (s->signal == -1)
1710 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001711 gdb_continue(s);
1712 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001713 case 'v':
1714 if (strncmp(p, "Cont", 4) == 0) {
1715 int res_signal, res_thread;
1716
1717 p += 4;
1718 if (*p == '?') {
1719 put_packet(s, "vCont;c;C;s;S");
1720 break;
1721 }
1722 res = 0;
1723 res_signal = 0;
1724 res_thread = 0;
1725 while (*p) {
1726 int action, signal;
1727
1728 if (*p++ != ';') {
1729 res = 0;
1730 break;
1731 }
1732 action = *p++;
1733 signal = 0;
1734 if (action == 'C' || action == 'S') {
1735 signal = strtoul(p, (char **)&p, 16);
1736 } else if (action != 'c' && action != 's') {
1737 res = 0;
1738 break;
1739 }
1740 thread = 0;
1741 if (*p == ':') {
1742 thread = strtoull(p+1, (char **)&p, 16);
1743 }
1744 action = tolower(action);
1745 if (res == 0 || (res == 'c' && action == 's')) {
1746 res = action;
1747 res_signal = signal;
1748 res_thread = thread;
1749 }
1750 }
1751 if (res) {
1752 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001753 cpu = find_cpu(res_thread);
1754 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001755 put_packet(s, "E22");
1756 break;
1757 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001758 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001759 }
1760 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001761 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001762 }
1763 s->signal = res_signal;
1764 gdb_continue(s);
1765 return RS_IDLE;
1766 }
1767 break;
1768 } else {
1769 goto unknown_command;
1770 }
edgar_igl7d03f822008-05-17 18:58:29 +00001771 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01001772#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00001773 /* Kill the target */
1774 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1775 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01001776#endif
edgar_igl7d03f822008-05-17 18:58:29 +00001777 case 'D':
1778 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001779 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03001780 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00001781 gdb_continue(s);
1782 put_packet(s, "OK");
1783 break;
bellard858693c2004-03-31 18:52:07 +00001784 case 's':
1785 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001786 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001787 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001788 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001789 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001790 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001791 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001792 case 'F':
1793 {
1794 target_ulong ret;
1795 target_ulong err;
1796
1797 ret = strtoull(p, (char **)&p, 16);
1798 if (*p == ',') {
1799 p++;
1800 err = strtoull(p, (char **)&p, 16);
1801 } else {
1802 err = 0;
1803 }
1804 if (*p == ',')
1805 p++;
1806 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001807 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001808 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00001809 s->current_syscall_cb = NULL;
1810 }
pbrooka2d1eba2007-01-28 03:10:55 +00001811 if (type == 'C') {
1812 put_packet(s, "T02");
1813 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001814 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001815 }
1816 }
1817 break;
bellard858693c2004-03-31 18:52:07 +00001818 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001819 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001820 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02001821 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001822 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001823 len += reg_size;
1824 }
1825 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001826 put_packet(s, buf);
1827 break;
1828 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001829 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00001830 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001831 len = strlen(p) / 2;
1832 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001833 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001834 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001835 len -= reg_size;
1836 registers += reg_size;
1837 }
bellard858693c2004-03-31 18:52:07 +00001838 put_packet(s, "OK");
1839 break;
1840 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001841 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001842 if (*p == ',')
1843 p++;
bellard9d9754a2006-06-25 15:32:37 +00001844 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001845 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001846 put_packet (s, "E14");
1847 } else {
1848 memtohex(buf, mem_buf, len);
1849 put_packet(s, buf);
1850 }
bellard858693c2004-03-31 18:52:07 +00001851 break;
1852 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001853 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001854 if (*p == ',')
1855 p++;
bellard9d9754a2006-06-25 15:32:37 +00001856 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001857 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001858 p++;
1859 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001860 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02001861 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00001862 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001863 } else {
bellard858693c2004-03-31 18:52:07 +00001864 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02001865 }
bellard858693c2004-03-31 18:52:07 +00001866 break;
pbrook56aebc82008-10-11 17:55:29 +00001867 case 'p':
1868 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1869 This works, but can be very slow. Anything new enough to
1870 understand XML also knows how to use this properly. */
1871 if (!gdb_has_xml)
1872 goto unknown_command;
1873 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001874 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001875 if (reg_size) {
1876 memtohex(buf, mem_buf, reg_size);
1877 put_packet(s, buf);
1878 } else {
1879 put_packet(s, "E14");
1880 }
1881 break;
1882 case 'P':
1883 if (!gdb_has_xml)
1884 goto unknown_command;
1885 addr = strtoull(p, (char **)&p, 16);
1886 if (*p == '=')
1887 p++;
1888 reg_size = strlen(p) / 2;
1889 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001890 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001891 put_packet(s, "OK");
1892 break;
bellard858693c2004-03-31 18:52:07 +00001893 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001894 case 'z':
1895 type = strtoul(p, (char **)&p, 16);
1896 if (*p == ',')
1897 p++;
bellard9d9754a2006-06-25 15:32:37 +00001898 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001899 if (*p == ',')
1900 p++;
bellard9d9754a2006-06-25 15:32:37 +00001901 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001902 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001903 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001904 else
aliguori880a7572008-11-18 20:30:24 +00001905 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001906 if (res >= 0)
1907 put_packet(s, "OK");
1908 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001909 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001910 else
1911 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001912 break;
aliguori880a7572008-11-18 20:30:24 +00001913 case 'H':
1914 type = *p++;
1915 thread = strtoull(p, (char **)&p, 16);
1916 if (thread == -1 || thread == 0) {
1917 put_packet(s, "OK");
1918 break;
1919 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001920 cpu = find_cpu(thread);
1921 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001922 put_packet(s, "E22");
1923 break;
1924 }
1925 switch (type) {
1926 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001927 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001928 put_packet(s, "OK");
1929 break;
1930 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001931 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001932 put_packet(s, "OK");
1933 break;
1934 default:
1935 put_packet(s, "E22");
1936 break;
1937 }
1938 break;
1939 case 'T':
1940 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001941 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001942
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001943 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001944 put_packet(s, "OK");
1945 } else {
aliguori880a7572008-11-18 20:30:24 +00001946 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001947 }
aliguori880a7572008-11-18 20:30:24 +00001948 break;
pbrook978efd62006-06-17 18:30:42 +00001949 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001950 case 'Q':
1951 /* parse any 'q' packets here */
1952 if (!strcmp(p,"qemu.sstepbits")) {
1953 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001954 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1955 SSTEP_ENABLE,
1956 SSTEP_NOIRQ,
1957 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001958 put_packet(s, buf);
1959 break;
1960 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1961 /* Display or change the sstep_flags */
1962 p += 10;
1963 if (*p != '=') {
1964 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001965 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001966 put_packet(s, buf);
1967 break;
1968 }
1969 p++;
1970 type = strtoul(p, (char **)&p, 16);
1971 sstep_flags = type;
1972 put_packet(s, "OK");
1973 break;
aliguori880a7572008-11-18 20:30:24 +00001974 } else if (strcmp(p,"C") == 0) {
1975 /* "Current thread" remains vague in the spec, so always return
1976 * the first CPU (gdb returns the first thread). */
1977 put_packet(s, "QC1");
1978 break;
1979 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001980 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001981 goto report_cpuinfo;
1982 } else if (strcmp(p,"sThreadInfo") == 0) {
1983 report_cpuinfo:
1984 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001985 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001986 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02001987 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00001988 } else
1989 put_packet(s, "l");
1990 break;
1991 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1992 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001993 cpu = find_cpu(thread);
1994 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001995 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001996 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01001997 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001998 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001999 memtohex(buf, mem_buf, len);
2000 put_packet(s, buf);
2001 }
aliguori880a7572008-11-18 20:30:24 +00002002 break;
edgar_igl60897d32008-05-09 08:25:14 +00002003 }
blueswir10b8a9882009-03-07 10:51:36 +00002004#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002005 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002006 CPUArchState *env = s->c_cpu->env_ptr;
2007 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00002008
blueswir1363a37d2008-08-21 17:58:08 +00002009 snprintf(buf, sizeof(buf),
2010 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2011 ";Bss=" TARGET_ABI_FMT_lx,
2012 ts->info->code_offset,
2013 ts->info->data_offset,
2014 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002015 put_packet(s, buf);
2016 break;
2017 }
blueswir10b8a9882009-03-07 10:51:36 +00002018#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002019 else if (strncmp(p, "Rcmd,", 5) == 0) {
2020 int len = strlen(p + 5);
2021
2022 if ((len % 2) != 0) {
2023 put_packet(s, "E01");
2024 break;
2025 }
2026 hextomem(mem_buf, p + 5, len);
2027 len = len / 2;
2028 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002029 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002030 put_packet(s, "OK");
2031 break;
2032 }
blueswir10b8a9882009-03-07 10:51:36 +00002033#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002034 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002035 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002036#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002037 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002038#endif
2039 put_packet(s, buf);
2040 break;
2041 }
2042#ifdef GDB_CORE_XML
2043 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2044 const char *xml;
2045 target_ulong total_len;
2046
2047 gdb_has_xml = 1;
2048 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002049 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002050 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002051 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002052 put_packet(s, buf);
2053 break;
2054 }
2055
2056 if (*p == ':')
2057 p++;
2058 addr = strtoul(p, (char **)&p, 16);
2059 if (*p == ',')
2060 p++;
2061 len = strtoul(p, (char **)&p, 16);
2062
2063 total_len = strlen(xml);
2064 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002065 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002066 put_packet(s, buf);
2067 break;
2068 }
2069 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2070 len = (MAX_PACKET_LENGTH - 5) / 2;
2071 if (len < total_len - addr) {
2072 buf[0] = 'm';
2073 len = memtox(buf + 1, xml + addr, len);
2074 } else {
2075 buf[0] = 'l';
2076 len = memtox(buf + 1, xml + addr, total_len - addr);
2077 }
2078 put_packet_binary(s, buf, len + 1);
2079 break;
2080 }
2081#endif
2082 /* Unrecognised 'q' command. */
2083 goto unknown_command;
2084
bellard858693c2004-03-31 18:52:07 +00002085 default:
pbrook56aebc82008-10-11 17:55:29 +00002086 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002087 /* put empty packet */
2088 buf[0] = '\0';
2089 put_packet(s, buf);
2090 break;
2091 }
2092 return RS_IDLE;
2093}
2094
Andreas Färber64f6b342013-05-27 02:06:09 +02002095void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00002096{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002097 gdbserver_state->c_cpu = cpu;
2098 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002099}
2100
bellard1fddef42005-04-17 19:16:13 +00002101#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002102static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002103{
aliguori880a7572008-11-18 20:30:24 +00002104 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002105 CPUArchState *env = s->c_cpu->env_ptr;
2106 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002107 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002108 const char *type;
bellard858693c2004-03-31 18:52:07 +00002109 int ret;
2110
Meador Ingecdb432b2012-03-15 17:49:45 +00002111 if (running || s->state == RS_INACTIVE) {
2112 return;
2113 }
2114 /* Is there a GDB syscall waiting to be sent? */
2115 if (s->current_syscall_cb) {
2116 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002117 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002118 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002119 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002120 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002121 if (env->watchpoint_hit) {
2122 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002123 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002124 type = "r";
2125 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002126 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002127 type = "a";
2128 break;
2129 default:
2130 type = "";
2131 break;
2132 }
aliguori880a7572008-11-18 20:30:24 +00002133 snprintf(buf, sizeof(buf),
2134 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002135 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002136 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002137 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002138 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002139 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002140 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002141 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002142 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002143 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002144 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002145 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002146 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002147 ret = GDB_SIGNAL_QUIT;
2148 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002149 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002150 ret = GDB_SIGNAL_IO;
2151 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002152 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002153 ret = GDB_SIGNAL_ALRM;
2154 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002155 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002156 ret = GDB_SIGNAL_ABRT;
2157 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002158 case RUN_STATE_SAVE_VM:
2159 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002160 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002161 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002162 ret = GDB_SIGNAL_XCPU;
2163 break;
2164 default:
2165 ret = GDB_SIGNAL_UNKNOWN;
2166 break;
bellardbbeb7b52006-04-23 18:42:15 +00002167 }
Andreas Färber0d342822012-12-17 07:12:13 +01002168 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002169
2170send_packet:
bellard858693c2004-03-31 18:52:07 +00002171 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002172
2173 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002174 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002175}
bellard1fddef42005-04-17 19:16:13 +00002176#endif
bellard858693c2004-03-31 18:52:07 +00002177
pbrooka2d1eba2007-01-28 03:10:55 +00002178/* Send a gdb syscall request.
2179 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002180 %x - target_ulong argument printed in hex.
2181 %lx - 64-bit argument printed in hex.
2182 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002183void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002184{
2185 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002186 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002187 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002188 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002189 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002190 GDBState *s;
2191
aliguori880a7572008-11-18 20:30:24 +00002192 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002193 if (!s)
2194 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002195 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002196#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002197 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002198#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002199 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002200 p = s->syscall_buf;
2201 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002202 *(p++) = 'F';
2203 while (*fmt) {
2204 if (*fmt == '%') {
2205 fmt++;
2206 switch (*fmt++) {
2207 case 'x':
2208 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002209 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002210 break;
pbrooka87295e2007-05-26 15:09:38 +00002211 case 'l':
2212 if (*(fmt++) != 'x')
2213 goto bad_format;
2214 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002215 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002216 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002217 case 's':
2218 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002219 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002220 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002221 break;
2222 default:
pbrooka87295e2007-05-26 15:09:38 +00002223 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002224 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2225 fmt - 1);
2226 break;
2227 }
2228 } else {
2229 *(p++) = *(fmt++);
2230 }
2231 }
pbrook8a93e022007-08-06 13:19:15 +00002232 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002233 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002234#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002235 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002236 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002237#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002238 /* In this case wait to send the syscall packet until notification that
2239 the CPU has stopped. This must be done because if the packet is sent
2240 now the reply from the syscall request could be received while the CPU
2241 is still in the running state, which can cause packets to be dropped
2242 and state transition 'T' packets to be sent while the syscall is still
2243 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002244 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002245#endif
2246}
2247
bellard6a00d602005-11-21 23:25:50 +00002248static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002249{
2250 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002251 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002252
bellard1fddef42005-04-17 19:16:13 +00002253#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002254 if (s->last_packet_len) {
2255 /* Waiting for a response to the last packet. If we see the start
2256 of a new command then abandon the previous response. */
2257 if (ch == '-') {
2258#ifdef DEBUG_GDB
2259 printf("Got NACK, retransmitting\n");
2260#endif
thsffe8ab82007-12-16 03:16:05 +00002261 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002262 }
2263#ifdef DEBUG_GDB
2264 else if (ch == '+')
2265 printf("Got ACK\n");
2266 else
2267 printf("Got '%c' when expecting ACK/NACK\n", ch);
2268#endif
2269 if (ch == '+' || ch == '$')
2270 s->last_packet_len = 0;
2271 if (ch != '$')
2272 return;
2273 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002274 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002275 /* when the CPU is running, we cannot do anything except stop
2276 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002277 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002278 } else
bellard1fddef42005-04-17 19:16:13 +00002279#endif
bellard41625032005-04-24 10:07:11 +00002280 {
bellard858693c2004-03-31 18:52:07 +00002281 switch(s->state) {
2282 case RS_IDLE:
2283 if (ch == '$') {
2284 s->line_buf_index = 0;
2285 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002286 }
2287 break;
bellard858693c2004-03-31 18:52:07 +00002288 case RS_GETLINE:
2289 if (ch == '#') {
2290 s->state = RS_CHKSUM1;
2291 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2292 s->state = RS_IDLE;
2293 } else {
2294 s->line_buf[s->line_buf_index++] = ch;
2295 }
2296 break;
2297 case RS_CHKSUM1:
2298 s->line_buf[s->line_buf_index] = '\0';
2299 s->line_csum = fromhex(ch) << 4;
2300 s->state = RS_CHKSUM2;
2301 break;
2302 case RS_CHKSUM2:
2303 s->line_csum |= fromhex(ch);
2304 csum = 0;
2305 for(i = 0; i < s->line_buf_index; i++) {
2306 csum += s->line_buf[i];
2307 }
2308 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002309 reply = '-';
2310 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002311 s->state = RS_IDLE;
2312 } else {
ths60fe76f2007-12-16 03:02:09 +00002313 reply = '+';
2314 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002315 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002316 }
bellardb4608c02003-06-27 17:34:32 +00002317 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002318 default:
2319 abort();
bellardb4608c02003-06-27 17:34:32 +00002320 }
2321 }
bellard858693c2004-03-31 18:52:07 +00002322}
2323
Paul Brook0e1c9c52010-06-16 13:03:51 +01002324/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002325void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002326{
2327 GDBState *s;
2328 char buf[4];
2329
2330 s = gdbserver_state;
2331 if (!s) {
2332 return;
2333 }
2334#ifdef CONFIG_USER_ONLY
2335 if (gdbserver_fd < 0 || s->fd < 0) {
2336 return;
2337 }
2338#endif
2339
2340 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2341 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002342
2343#ifndef CONFIG_USER_ONLY
2344 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002345 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002346 }
2347#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002348}
2349
bellard1fddef42005-04-17 19:16:13 +00002350#ifdef CONFIG_USER_ONLY
2351int
aurel32ca587a82008-12-18 22:44:13 +00002352gdb_queuesig (void)
2353{
2354 GDBState *s;
2355
2356 s = gdbserver_state;
2357
2358 if (gdbserver_fd < 0 || s->fd < 0)
2359 return 0;
2360 else
2361 return 1;
2362}
2363
2364int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002365gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002366{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002367 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002368 GDBState *s;
2369 char buf[256];
2370 int n;
bellard1fddef42005-04-17 19:16:13 +00002371
Andreas Färber5ca666c2013-06-24 19:20:57 +02002372 s = gdbserver_state;
2373 if (gdbserver_fd < 0 || s->fd < 0) {
2374 return sig;
bellard1fddef42005-04-17 19:16:13 +00002375 }
2376
Andreas Färber5ca666c2013-06-24 19:20:57 +02002377 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002378 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002379 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002380
Andreas Färber5ca666c2013-06-24 19:20:57 +02002381 if (sig != 0) {
2382 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2383 put_packet(s, buf);
2384 }
2385 /* put_packet() might have detected that the peer terminated the
2386 connection. */
2387 if (s->fd < 0) {
2388 return sig;
2389 }
2390
2391 sig = 0;
2392 s->state = RS_IDLE;
2393 s->running_state = 0;
2394 while (s->running_state == 0) {
2395 n = read(s->fd, buf, 256);
2396 if (n > 0) {
2397 int i;
2398
2399 for (i = 0; i < n; i++) {
2400 gdb_read_byte(s, buf[i]);
2401 }
2402 } else if (n == 0 || errno != EAGAIN) {
2403 /* XXX: Connection closed. Should probably wait for another
2404 connection before continuing. */
2405 return sig;
bellard1fddef42005-04-17 19:16:13 +00002406 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002407 }
2408 sig = s->signal;
2409 s->signal = 0;
2410 return sig;
bellard1fddef42005-04-17 19:16:13 +00002411}
bellarde9009672005-04-26 20:42:36 +00002412
aurel32ca587a82008-12-18 22:44:13 +00002413/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002414void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002415{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002416 GDBState *s;
2417 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002418
Andreas Färber5ca666c2013-06-24 19:20:57 +02002419 s = gdbserver_state;
2420 if (gdbserver_fd < 0 || s->fd < 0) {
2421 return;
2422 }
aurel32ca587a82008-12-18 22:44:13 +00002423
Andreas Färber5ca666c2013-06-24 19:20:57 +02002424 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2425 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002426}
bellard1fddef42005-04-17 19:16:13 +00002427
aliguori880a7572008-11-18 20:30:24 +00002428static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002429{
2430 GDBState *s;
2431 struct sockaddr_in sockaddr;
2432 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002433 int fd;
bellard858693c2004-03-31 18:52:07 +00002434
2435 for(;;) {
2436 len = sizeof(sockaddr);
2437 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2438 if (fd < 0 && errno != EINTR) {
2439 perror("accept");
2440 return;
2441 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002442#ifndef _WIN32
2443 fcntl(fd, F_SETFD, FD_CLOEXEC);
2444#endif
bellard858693c2004-03-31 18:52:07 +00002445 break;
2446 }
2447 }
2448
2449 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002450 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002451
Anthony Liguori7267c092011-08-20 22:09:37 -05002452 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002453 s->c_cpu = first_cpu;
2454 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002455 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002456 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002457
aliguori880a7572008-11-18 20:30:24 +00002458 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002459
bellard858693c2004-03-31 18:52:07 +00002460 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002461}
2462
2463static int gdbserver_open(int port)
2464{
2465 struct sockaddr_in sockaddr;
2466 int fd, val, ret;
2467
2468 fd = socket(PF_INET, SOCK_STREAM, 0);
2469 if (fd < 0) {
2470 perror("socket");
2471 return -1;
2472 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002473#ifndef _WIN32
2474 fcntl(fd, F_SETFD, FD_CLOEXEC);
2475#endif
bellard858693c2004-03-31 18:52:07 +00002476
2477 /* allow fast reuse */
2478 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002479 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002480
2481 sockaddr.sin_family = AF_INET;
2482 sockaddr.sin_port = htons(port);
2483 sockaddr.sin_addr.s_addr = 0;
2484 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2485 if (ret < 0) {
2486 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002487 close(fd);
bellard858693c2004-03-31 18:52:07 +00002488 return -1;
2489 }
2490 ret = listen(fd, 0);
2491 if (ret < 0) {
2492 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002493 close(fd);
bellard858693c2004-03-31 18:52:07 +00002494 return -1;
2495 }
bellard858693c2004-03-31 18:52:07 +00002496 return fd;
2497}
2498
2499int gdbserver_start(int port)
2500{
2501 gdbserver_fd = gdbserver_open(port);
2502 if (gdbserver_fd < 0)
2503 return -1;
2504 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002505 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002506 return 0;
2507}
aurel322b1319c2008-12-18 22:44:04 +00002508
2509/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002510void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002511{
2512 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002513 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002514 return;
2515 close(s->fd);
2516 s->fd = -1;
2517 cpu_breakpoint_remove_all(env, BP_GDB);
2518 cpu_watchpoint_remove_all(env, BP_GDB);
2519}
pbrook4046d912007-01-28 01:53:16 +00002520#else
thsaa1f17c2007-07-11 22:48:58 +00002521static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002522{
pbrook56aebc82008-10-11 17:55:29 +00002523 /* We can handle an arbitrarily large amount of data.
2524 Pick the maximum packet size, which is as good as anything. */
2525 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002526}
2527
thsaa1f17c2007-07-11 22:48:58 +00002528static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002529{
pbrook4046d912007-01-28 01:53:16 +00002530 int i;
2531
2532 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002533 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002534 }
2535}
2536
2537static void gdb_chr_event(void *opaque, int event)
2538{
2539 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302540 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002541 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002542 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002543 break;
2544 default:
2545 break;
2546 }
2547}
2548
aliguori8a34a0f2009-03-05 23:01:55 +00002549static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2550{
2551 char buf[MAX_PACKET_LENGTH];
2552
2553 buf[0] = 'O';
2554 if (len > (MAX_PACKET_LENGTH/2) - 1)
2555 len = (MAX_PACKET_LENGTH/2) - 1;
2556 memtohex(buf + 1, (uint8_t *)msg, len);
2557 put_packet(s, buf);
2558}
2559
2560static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2561{
2562 const char *p = (const char *)buf;
2563 int max_sz;
2564
2565 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2566 for (;;) {
2567 if (len <= max_sz) {
2568 gdb_monitor_output(gdbserver_state, p, len);
2569 break;
2570 }
2571 gdb_monitor_output(gdbserver_state, p, max_sz);
2572 p += max_sz;
2573 len -= max_sz;
2574 }
2575 return len;
2576}
2577
aliguori59030a82009-04-05 18:43:41 +00002578#ifndef _WIN32
2579static void gdb_sigterm_handler(int signal)
2580{
Luiz Capitulino13548692011-07-29 15:36:43 -03002581 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002582 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002583 }
aliguori59030a82009-04-05 18:43:41 +00002584}
2585#endif
2586
2587int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002588{
2589 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002590 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002591 CharDriverState *chr = NULL;
2592 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002593
aliguori59030a82009-04-05 18:43:41 +00002594 if (!device)
2595 return -1;
2596 if (strcmp(device, "none") != 0) {
2597 if (strstart(device, "tcp:", NULL)) {
2598 /* enforce required TCP attributes */
2599 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2600 "%s,nowait,nodelay,server", device);
2601 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002602 }
aliguori59030a82009-04-05 18:43:41 +00002603#ifndef _WIN32
2604 else if (strcmp(device, "stdio") == 0) {
2605 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002606
aliguori59030a82009-04-05 18:43:41 +00002607 memset(&act, 0, sizeof(act));
2608 act.sa_handler = gdb_sigterm_handler;
2609 sigaction(SIGINT, &act, NULL);
2610 }
2611#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002612 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002613 if (!chr)
2614 return -1;
2615
Hans de Goede456d6062013-03-27 20:29:40 +01002616 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002617 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2618 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002619 }
2620
aliguori36556b22009-03-28 18:05:53 +00002621 s = gdbserver_state;
2622 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002623 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002624 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002625
aliguori36556b22009-03-28 18:05:53 +00002626 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2627
2628 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002629 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002630 mon_chr->chr_write = gdb_monitor_write;
2631 monitor_init(mon_chr, 0);
2632 } else {
2633 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002634 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002635 mon_chr = s->mon_chr;
2636 memset(s, 0, sizeof(GDBState));
2637 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002638 s->c_cpu = first_cpu;
2639 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002640 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002641 s->state = chr ? RS_IDLE : RS_INACTIVE;
2642 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002643 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002644
pbrook4046d912007-01-28 01:53:16 +00002645 return 0;
2646}
2647#endif