blob: 9ede3de7aec6fe2873b2d05005446231def13d04 [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
523#ifdef TARGET_X86_64
pbrook56aebc82008-10-11 17:55:29 +0000524static const int gpr_map[16] = {
bellard79808572008-05-09 14:40:22 +0000525 R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
pbrook56aebc82008-10-11 17:55:29 +0000526 8, 9, 10, 11, 12, 13, 14, 15
bellard79808572008-05-09 14:40:22 +0000527};
bellard79808572008-05-09 14:40:22 +0000528#else
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200529#define gpr_map gpr_map32
bellard79808572008-05-09 14:40:22 +0000530#endif
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200531static const int gpr_map32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
pbrook56aebc82008-10-11 17:55:29 +0000532
533#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
534
Jan Kiszkab1631e72009-06-27 09:53:51 +0200535#define IDX_IP_REG CPU_NB_REGS
536#define IDX_FLAGS_REG (IDX_IP_REG + 1)
537#define IDX_SEG_REGS (IDX_FLAGS_REG + 1)
538#define IDX_FP_REGS (IDX_SEG_REGS + 6)
539#define IDX_XMM_REGS (IDX_FP_REGS + 16)
540#define IDX_MXCSR_REG (IDX_XMM_REGS + CPU_NB_REGS)
541
Andreas Färberf3840912012-02-20 06:44:56 +0100542static int cpu_gdb_read_register(CPUX86State *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000543{
544 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200545 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
546 GET_REG64(env->regs[gpr_map[n]]);
547 } else if (n < CPU_NB_REGS32) {
548 GET_REG32(env->regs[gpr_map32[n]]);
549 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200550 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000551#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200552 /* FIXME: byteswap float values - after fixing fpregs layout. */
553 memcpy(mem_buf, &env->fpregs[n - IDX_FP_REGS], 10);
pbrook56aebc82008-10-11 17:55:29 +0000554#else
555 memset(mem_buf, 0, 10);
556#endif
557 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200558 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
559 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200560 if (n < CPU_NB_REGS32 ||
561 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
562 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
563 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
564 return 16;
565 }
pbrook56aebc82008-10-11 17:55:29 +0000566 } else {
pbrook56aebc82008-10-11 17:55:29 +0000567 switch (n) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200568 case IDX_IP_REG:
569 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
570 GET_REG64(env->eip);
571 } else {
572 GET_REG32(env->eip);
573 }
Andreas Färber47d74ef2013-07-07 11:17:26 +0200574 case IDX_FLAGS_REG:
575 GET_REG32(env->eflags);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200576
Andreas Färber47d74ef2013-07-07 11:17:26 +0200577 case IDX_SEG_REGS:
578 GET_REG32(env->segs[R_CS].selector);
579 case IDX_SEG_REGS + 1:
580 GET_REG32(env->segs[R_SS].selector);
581 case IDX_SEG_REGS + 2:
582 GET_REG32(env->segs[R_DS].selector);
583 case IDX_SEG_REGS + 3:
584 GET_REG32(env->segs[R_ES].selector);
585 case IDX_SEG_REGS + 4:
586 GET_REG32(env->segs[R_FS].selector);
587 case IDX_SEG_REGS + 5:
588 GET_REG32(env->segs[R_GS].selector);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200589
Andreas Färber47d74ef2013-07-07 11:17:26 +0200590 case IDX_FP_REGS + 8:
591 GET_REG32(env->fpuc);
592 case IDX_FP_REGS + 9:
593 GET_REG32((env->fpus & ~0x3800) |
594 (env->fpstt & 0x7) << 11);
595 case IDX_FP_REGS + 10:
596 GET_REG32(0); /* ftag */
597 case IDX_FP_REGS + 11:
598 GET_REG32(0); /* fiseg */
599 case IDX_FP_REGS + 12:
600 GET_REG32(0); /* fioff */
601 case IDX_FP_REGS + 13:
602 GET_REG32(0); /* foseg */
603 case IDX_FP_REGS + 14:
604 GET_REG32(0); /* fooff */
605 case IDX_FP_REGS + 15:
606 GET_REG32(0); /* fop */
Jan Kiszkab1631e72009-06-27 09:53:51 +0200607
Andreas Färber47d74ef2013-07-07 11:17:26 +0200608 case IDX_MXCSR_REG:
609 GET_REG32(env->mxcsr);
pbrook56aebc82008-10-11 17:55:29 +0000610 }
bellard79808572008-05-09 14:40:22 +0000611 }
pbrook56aebc82008-10-11 17:55:29 +0000612 return 0;
bellard79808572008-05-09 14:40:22 +0000613}
614
Andreas Färberf3840912012-02-20 06:44:56 +0100615static int cpu_x86_gdb_load_seg(CPUX86State *env, int sreg, uint8_t *mem_buf)
Jan Kiszka84273172009-06-27 09:53:51 +0200616{
617 uint16_t selector = ldl_p(mem_buf);
618
619 if (selector != env->segs[sreg].selector) {
620#if defined(CONFIG_USER_ONLY)
621 cpu_x86_load_seg(env, sreg, selector);
622#else
623 unsigned int limit, flags;
624 target_ulong base;
625
626 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
627 base = selector << 4;
628 limit = 0xffff;
629 flags = 0;
630 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200631 if (!cpu_x86_get_descr_debug(env, selector, &base, &limit,
632 &flags)) {
Jan Kiszka84273172009-06-27 09:53:51 +0200633 return 4;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200634 }
Jan Kiszka84273172009-06-27 09:53:51 +0200635 }
636 cpu_x86_load_seg_cache(env, sreg, selector, base, limit, flags);
637#endif
638 }
639 return 4;
640}
641
Andreas Färberf3840912012-02-20 06:44:56 +0100642static int cpu_gdb_write_register(CPUX86State *env, uint8_t *mem_buf, int n)
bellard79808572008-05-09 14:40:22 +0000643{
pbrook56aebc82008-10-11 17:55:29 +0000644 uint32_t tmp;
645
Jan Kiszkab1631e72009-06-27 09:53:51 +0200646 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200647 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
648 env->regs[gpr_map[n]] = ldtul_p(mem_buf);
649 return sizeof(target_ulong);
650 } else if (n < CPU_NB_REGS32) {
651 n = gpr_map32[n];
652 env->regs[n] &= ~0xffffffffUL;
653 env->regs[n] |= (uint32_t)ldl_p(mem_buf);
654 return 4;
655 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200656 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000657#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200658 /* FIXME: byteswap float values - after fixing fpregs layout. */
659 memcpy(&env->fpregs[n - IDX_FP_REGS], mem_buf, 10);
pbrook56aebc82008-10-11 17:55:29 +0000660#endif
661 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200662 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
663 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200664 if (n < CPU_NB_REGS32 ||
665 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
666 env->xmm_regs[n].XMM_Q(0) = ldq_p(mem_buf);
667 env->xmm_regs[n].XMM_Q(1) = ldq_p(mem_buf + 8);
668 return 16;
669 }
pbrook56aebc82008-10-11 17:55:29 +0000670 } else {
Jan Kiszkab1631e72009-06-27 09:53:51 +0200671 switch (n) {
672 case IDX_IP_REG:
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200673 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
674 env->eip = ldq_p(mem_buf);
675 return 8;
676 } else {
677 env->eip &= ~0xffffffffUL;
678 env->eip |= (uint32_t)ldl_p(mem_buf);
679 return 4;
680 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200681 case IDX_FLAGS_REG:
682 env->eflags = ldl_p(mem_buf);
683 return 4;
684
Andreas Färber47d74ef2013-07-07 11:17:26 +0200685 case IDX_SEG_REGS:
686 return cpu_x86_gdb_load_seg(env, R_CS, mem_buf);
687 case IDX_SEG_REGS + 1:
688 return cpu_x86_gdb_load_seg(env, R_SS, mem_buf);
689 case IDX_SEG_REGS + 2:
690 return cpu_x86_gdb_load_seg(env, R_DS, mem_buf);
691 case IDX_SEG_REGS + 3:
692 return cpu_x86_gdb_load_seg(env, R_ES, mem_buf);
693 case IDX_SEG_REGS + 4:
694 return cpu_x86_gdb_load_seg(env, R_FS, mem_buf);
695 case IDX_SEG_REGS + 5:
696 return cpu_x86_gdb_load_seg(env, R_GS, mem_buf);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200697
698 case IDX_FP_REGS + 8:
699 env->fpuc = ldl_p(mem_buf);
700 return 4;
701 case IDX_FP_REGS + 9:
702 tmp = ldl_p(mem_buf);
703 env->fpstt = (tmp >> 11) & 7;
704 env->fpus = tmp & ~0x3800;
705 return 4;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200706 case IDX_FP_REGS + 10: /* ftag */
707 return 4;
708 case IDX_FP_REGS + 11: /* fiseg */
709 return 4;
710 case IDX_FP_REGS + 12: /* fioff */
711 return 4;
712 case IDX_FP_REGS + 13: /* foseg */
713 return 4;
714 case IDX_FP_REGS + 14: /* fooff */
715 return 4;
716 case IDX_FP_REGS + 15: /* fop */
717 return 4;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200718
719 case IDX_MXCSR_REG:
720 env->mxcsr = ldl_p(mem_buf);
721 return 4;
bellard79808572008-05-09 14:40:22 +0000722 }
bellard79808572008-05-09 14:40:22 +0000723 }
pbrook56aebc82008-10-11 17:55:29 +0000724 /* Unrecognised register. */
725 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000726}
727
bellard9e62fd72004-01-05 22:49:06 +0000728#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000729
aurel32e571cb42009-01-24 15:07:42 +0000730/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
731 expects whatever the target description contains. Due to a
732 historical mishap the FP registers appear in between core integer
733 regs and PC, MSR, CR, and so forth. We hack round this by giving the
734 FP regs zero size when talking to a newer gdb. */
pbrook56aebc82008-10-11 17:55:29 +0000735#define NUM_CORE_REGS 71
aurel32e571cb42009-01-24 15:07:42 +0000736#if defined (TARGET_PPC64)
737#define GDB_CORE_XML "power64-core.xml"
738#else
739#define GDB_CORE_XML "power-core.xml"
740#endif
pbrook56aebc82008-10-11 17:55:29 +0000741
Andreas Färberf3840912012-02-20 06:44:56 +0100742static int cpu_gdb_read_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000743{
pbrook56aebc82008-10-11 17:55:29 +0000744 if (n < 32) {
745 /* gprs */
746 GET_REGL(env->gpr[n]);
747 } else if (n < 64) {
748 /* fprs */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200749 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000750 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200751 }
aurel328d4acf92008-11-30 16:23:18 +0000752 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000753 return 8;
754 } else {
755 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200756 case 64:
757 GET_REGL(env->nip);
758 case 65:
759 GET_REGL(env->msr);
pbrook56aebc82008-10-11 17:55:29 +0000760 case 66:
761 {
762 uint32_t cr = 0;
763 int i;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200764 for (i = 0; i < 8; i++) {
pbrook56aebc82008-10-11 17:55:29 +0000765 cr |= env->crf[i] << (32 - ((i + 1) * 4));
Andreas Färber47d74ef2013-07-07 11:17:26 +0200766 }
pbrook56aebc82008-10-11 17:55:29 +0000767 GET_REG32(cr);
768 }
Andreas Färber47d74ef2013-07-07 11:17:26 +0200769 case 67:
770 GET_REGL(env->lr);
771 case 68:
772 GET_REGL(env->ctr);
773 case 69:
774 GET_REGL(env->xer);
aurel32e571cb42009-01-24 15:07:42 +0000775 case 70:
776 {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200777 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000778 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200779 }
Fabien Chouteau5a576fb2011-09-01 04:56:00 +0000780 GET_REG32(env->fpscr);
aurel32e571cb42009-01-24 15:07:42 +0000781 }
pbrook56aebc82008-10-11 17:55:29 +0000782 }
bellard9e62fd72004-01-05 22:49:06 +0000783 }
pbrook56aebc82008-10-11 17:55:29 +0000784 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000785}
786
Andreas Färberf3840912012-02-20 06:44:56 +0100787static int cpu_gdb_write_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000788{
pbrook56aebc82008-10-11 17:55:29 +0000789 if (n < 32) {
790 /* gprs */
791 env->gpr[n] = ldtul_p(mem_buf);
792 return sizeof(target_ulong);
793 } else if (n < 64) {
794 /* fprs */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200795 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000796 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200797 }
aurel328d4acf92008-11-30 16:23:18 +0000798 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000799 return 8;
800 } else {
801 switch (n) {
802 case 64:
803 env->nip = ldtul_p(mem_buf);
804 return sizeof(target_ulong);
805 case 65:
806 ppc_store_msr(env, ldtul_p(mem_buf));
807 return sizeof(target_ulong);
808 case 66:
809 {
810 uint32_t cr = ldl_p(mem_buf);
811 int i;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200812 for (i = 0; i < 8; i++) {
pbrook56aebc82008-10-11 17:55:29 +0000813 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200814 }
pbrook56aebc82008-10-11 17:55:29 +0000815 return 4;
816 }
817 case 67:
818 env->lr = ldtul_p(mem_buf);
819 return sizeof(target_ulong);
820 case 68:
821 env->ctr = ldtul_p(mem_buf);
822 return sizeof(target_ulong);
823 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000824 env->xer = ldtul_p(mem_buf);
825 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000826 case 70:
827 /* fpscr */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200828 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000829 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200830 }
Fabien Chouteaud6478bc2013-03-19 07:41:53 +0000831 store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
832 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000833 }
bellard9e62fd72004-01-05 22:49:06 +0000834 }
pbrook56aebc82008-10-11 17:55:29 +0000835 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000836}
pbrook56aebc82008-10-11 17:55:29 +0000837
bellarde95c8d52004-09-30 22:22:08 +0000838#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000839
pbrook56aebc82008-10-11 17:55:29 +0000840#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
841#define NUM_CORE_REGS 86
842#else
blueswir15a377912009-01-13 16:28:01 +0000843#define NUM_CORE_REGS 72
pbrook56aebc82008-10-11 17:55:29 +0000844#endif
845
846#ifdef TARGET_ABI32
847#define GET_REGA(val) GET_REG32(val)
848#else
849#define GET_REGA(val) GET_REGL(val)
850#endif
851
Andreas Färberf3840912012-02-20 06:44:56 +0100852static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000853{
854 if (n < 8) {
855 /* g0..g7 */
856 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000857 }
pbrook56aebc82008-10-11 17:55:29 +0000858 if (n < 32) {
859 /* register window */
860 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000861 }
pbrook56aebc82008-10-11 17:55:29 +0000862#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
863 if (n < 64) {
864 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700865 if (n & 1) {
866 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
867 } else {
868 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
869 }
bellarde95c8d52004-09-30 22:22:08 +0000870 }
871 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000872 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200873 case 64:
874 GET_REGA(env->y);
875 case 65:
876 GET_REGA(cpu_get_psr(env));
877 case 66:
878 GET_REGA(env->wim);
879 case 67:
880 GET_REGA(env->tbr);
881 case 68:
882 GET_REGA(env->pc);
883 case 69:
884 GET_REGA(env->npc);
885 case 70:
886 GET_REGA(env->fsr);
887 case 71:
888 GET_REGA(0); /* csr */
889 default:
890 GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000891 }
bellard34751872005-07-02 14:31:34 +0000892#else
pbrook56aebc82008-10-11 17:55:29 +0000893 if (n < 64) {
894 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700895 if (n & 1) {
896 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
897 } else {
898 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
899 }
bellard34751872005-07-02 14:31:34 +0000900 }
pbrook56aebc82008-10-11 17:55:29 +0000901 if (n < 80) {
902 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700903 GET_REG64(env->fpr[(n - 32) / 2].ll);
pbrook56aebc82008-10-11 17:55:29 +0000904 }
905 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200906 case 80:
907 GET_REGL(env->pc);
908 case 81:
909 GET_REGL(env->npc);
910 case 82:
911 GET_REGL((cpu_get_ccr(env) << 32) |
912 ((env->asi & 0xff) << 24) |
913 ((env->pstate & 0xfff) << 8) |
914 cpu_get_cwp64(env));
915 case 83:
916 GET_REGL(env->fsr);
917 case 84:
918 GET_REGL(env->fprs);
919 case 85:
920 GET_REGL(env->y);
pbrook56aebc82008-10-11 17:55:29 +0000921 }
bellard34751872005-07-02 14:31:34 +0000922#endif
pbrook56aebc82008-10-11 17:55:29 +0000923 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000924}
925
Andreas Färberf3840912012-02-20 06:44:56 +0100926static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000927{
pbrook56aebc82008-10-11 17:55:29 +0000928#if defined(TARGET_ABI32)
929 abi_ulong tmp;
930
931 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000932#else
pbrook56aebc82008-10-11 17:55:29 +0000933 target_ulong tmp;
934
935 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000936#endif
bellarde95c8d52004-09-30 22:22:08 +0000937
pbrook56aebc82008-10-11 17:55:29 +0000938 if (n < 8) {
939 /* g0..g7 */
940 env->gregs[n] = tmp;
941 } else if (n < 32) {
942 /* register window */
943 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000944 }
pbrook56aebc82008-10-11 17:55:29 +0000945#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
946 else if (n < 64) {
947 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700948 /* f0-f31 */
949 if (n & 1) {
950 env->fpr[(n - 32) / 2].l.lower = tmp;
951 } else {
952 env->fpr[(n - 32) / 2].l.upper = tmp;
953 }
pbrook56aebc82008-10-11 17:55:29 +0000954 } else {
955 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
956 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200957 case 64:
958 env->y = tmp;
959 break;
960 case 65:
961 cpu_put_psr(env, tmp);
962 break;
963 case 66:
964 env->wim = tmp;
965 break;
966 case 67:
967 env->tbr = tmp;
968 break;
969 case 68:
970 env->pc = tmp;
971 break;
972 case 69:
973 env->npc = tmp;
974 break;
975 case 70:
976 env->fsr = tmp;
977 break;
978 default:
979 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000980 }
bellarde95c8d52004-09-30 22:22:08 +0000981 }
pbrook56aebc82008-10-11 17:55:29 +0000982 return 4;
bellard34751872005-07-02 14:31:34 +0000983#else
pbrook56aebc82008-10-11 17:55:29 +0000984 else if (n < 64) {
985 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700986 tmp = ldl_p(mem_buf);
987 if (n & 1) {
988 env->fpr[(n - 32) / 2].l.lower = tmp;
989 } else {
990 env->fpr[(n - 32) / 2].l.upper = tmp;
991 }
pbrook56aebc82008-10-11 17:55:29 +0000992 return 4;
993 } else if (n < 80) {
994 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700995 env->fpr[(n - 32) / 2].ll = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000996 } else {
997 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200998 case 80:
999 env->pc = tmp;
1000 break;
1001 case 81:
1002 env->npc = tmp;
1003 break;
pbrook56aebc82008-10-11 17:55:29 +00001004 case 82:
Blue Swirl5a834bb2010-05-09 20:19:04 +00001005 cpu_put_ccr(env, tmp >> 32);
Andreas Färber47d74ef2013-07-07 11:17:26 +02001006 env->asi = (tmp >> 24) & 0xff;
1007 env->pstate = (tmp >> 8) & 0xfff;
Blue Swirl5a834bb2010-05-09 20:19:04 +00001008 cpu_put_cwp64(env, tmp & 0xff);
Andreas Färber47d74ef2013-07-07 11:17:26 +02001009 break;
1010 case 83:
1011 env->fsr = tmp;
1012 break;
1013 case 84:
1014 env->fprs = tmp;
1015 break;
1016 case 85:
1017 env->y = tmp;
1018 break;
1019 default:
1020 return 0;
pbrook56aebc82008-10-11 17:55:29 +00001021 }
bellard34751872005-07-02 14:31:34 +00001022 }
pbrook56aebc82008-10-11 17:55:29 +00001023 return 8;
bellard34751872005-07-02 14:31:34 +00001024#endif
bellard9e62fd72004-01-05 22:49:06 +00001025}
bellard1fddef42005-04-17 19:16:13 +00001026#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +00001027
1028/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
1029 whatever the target description contains. Due to a historical mishap
1030 the FPA registers appear in between core integer regs and the CPSR.
1031 We hack round this by giving the FPA regs zero size when talking to a
1032 newer gdb. */
1033#define NUM_CORE_REGS 26
1034#define GDB_CORE_XML "arm-core.xml"
1035
Andreas Färberf3840912012-02-20 06:44:56 +01001036static int cpu_gdb_read_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +00001037{
pbrook56aebc82008-10-11 17:55:29 +00001038 if (n < 16) {
1039 /* Core integer register. */
1040 GET_REG32(env->regs[n]);
1041 }
1042 if (n < 24) {
1043 /* FPA registers. */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001044 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +00001045 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001046 }
pbrook56aebc82008-10-11 17:55:29 +00001047 memset(mem_buf, 0, 12);
1048 return 12;
1049 }
1050 switch (n) {
1051 case 24:
1052 /* FPA status register. */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001053 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +00001054 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001055 }
pbrook56aebc82008-10-11 17:55:29 +00001056 GET_REG32(0);
1057 case 25:
1058 /* CPSR */
1059 GET_REG32(cpsr_read(env));
1060 }
1061 /* Unknown register. */
1062 return 0;
bellard1fddef42005-04-17 19:16:13 +00001063}
1064
Andreas Färberf3840912012-02-20 06:44:56 +01001065static int cpu_gdb_write_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +00001066{
pbrook56aebc82008-10-11 17:55:29 +00001067 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +00001068
pbrook56aebc82008-10-11 17:55:29 +00001069 tmp = ldl_p(mem_buf);
1070
1071 /* Mask out low bit of PC to workaround gdb bugs. This will probably
1072 cause problems if we ever implement the Jazelle DBX extensions. */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001073 if (n == 15) {
pbrook56aebc82008-10-11 17:55:29 +00001074 tmp &= ~1;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001075 }
pbrook56aebc82008-10-11 17:55:29 +00001076
1077 if (n < 16) {
1078 /* Core integer register. */
1079 env->regs[n] = tmp;
1080 return 4;
1081 }
1082 if (n < 24) { /* 16-23 */
1083 /* FPA registers (ignored). */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001084 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +00001085 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001086 }
pbrook56aebc82008-10-11 17:55:29 +00001087 return 12;
1088 }
1089 switch (n) {
1090 case 24:
1091 /* FPA status register (ignored). */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001092 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +00001093 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001094 }
pbrook56aebc82008-10-11 17:55:29 +00001095 return 4;
1096 case 25:
1097 /* CPSR */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001098 cpsr_write(env, tmp, 0xffffffff);
pbrook56aebc82008-10-11 17:55:29 +00001099 return 4;
1100 }
1101 /* Unknown register. */
1102 return 0;
bellard1fddef42005-04-17 19:16:13 +00001103}
pbrook56aebc82008-10-11 17:55:29 +00001104
pbrooke6e59062006-10-22 00:18:54 +00001105#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +00001106
1107#define NUM_CORE_REGS 18
1108
1109#define GDB_CORE_XML "cf-core.xml"
1110
Andreas Färberf3840912012-02-20 06:44:56 +01001111static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001112{
pbrook56aebc82008-10-11 17:55:29 +00001113 if (n < 8) {
1114 /* D0-D7 */
1115 GET_REG32(env->dregs[n]);
1116 } else if (n < 16) {
1117 /* A0-A7 */
1118 GET_REG32(env->aregs[n - 8]);
1119 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001120 switch (n) {
1121 case 16:
1122 GET_REG32(env->sr);
1123 case 17:
1124 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +00001125 }
pbrooke6e59062006-10-22 00:18:54 +00001126 }
pbrook56aebc82008-10-11 17:55:29 +00001127 /* FP registers not included here because they vary between
1128 ColdFire and m68k. Use XML bits for these. */
1129 return 0;
pbrooke6e59062006-10-22 00:18:54 +00001130}
1131
Andreas Färberf3840912012-02-20 06:44:56 +01001132static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001133{
pbrook56aebc82008-10-11 17:55:29 +00001134 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +00001135
pbrook56aebc82008-10-11 17:55:29 +00001136 tmp = ldl_p(mem_buf);
1137
1138 if (n < 8) {
1139 /* D0-D7 */
1140 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -08001141 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +00001142 /* A0-A7 */
1143 env->aregs[n - 8] = tmp;
1144 } else {
1145 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001146 case 16:
1147 env->sr = tmp;
1148 break;
1149 case 17:
1150 env->pc = tmp;
1151 break;
1152 default:
1153 return 0;
pbrook56aebc82008-10-11 17:55:29 +00001154 }
pbrooke6e59062006-10-22 00:18:54 +00001155 }
pbrook56aebc82008-10-11 17:55:29 +00001156 return 4;
pbrooke6e59062006-10-22 00:18:54 +00001157}
bellard6f970bd2005-12-05 19:55:19 +00001158#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +00001159
1160#define NUM_CORE_REGS 73
1161
Andreas Färberf3840912012-02-20 06:44:56 +01001162static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001163{
pbrook56aebc82008-10-11 17:55:29 +00001164 if (n < 32) {
1165 GET_REGL(env->active_tc.gpr[n]);
1166 }
1167 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1168 if (n >= 38 && n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001169 if (env->CP0_Status & (1 << CP0St_FR)) {
1170 GET_REGL(env->active_fpu.fpr[n - 38].d);
1171 } else {
1172 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
1173 }
pbrook56aebc82008-10-11 17:55:29 +00001174 }
1175 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001176 case 70:
1177 GET_REGL((int32_t)env->active_fpu.fcr31);
1178 case 71:
1179 GET_REGL((int32_t)env->active_fpu.fcr0);
pbrook56aebc82008-10-11 17:55:29 +00001180 }
1181 }
1182 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001183 case 32:
1184 GET_REGL((int32_t)env->CP0_Status);
1185 case 33:
1186 GET_REGL(env->active_tc.LO[0]);
1187 case 34:
1188 GET_REGL(env->active_tc.HI[0]);
1189 case 35:
1190 GET_REGL(env->CP0_BadVAddr);
1191 case 36:
1192 GET_REGL((int32_t)env->CP0_Cause);
1193 case 37:
1194 GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
1195 case 72:
1196 GET_REGL(0); /* fp */
1197 case 89:
1198 GET_REGL((int32_t)env->CP0_PRid);
pbrook56aebc82008-10-11 17:55:29 +00001199 }
1200 if (n >= 73 && n <= 88) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001201 /* 16 embedded regs. */
1202 GET_REGL(0);
pbrook56aebc82008-10-11 17:55:29 +00001203 }
ths36d23952007-02-28 22:37:42 +00001204
pbrook56aebc82008-10-11 17:55:29 +00001205 return 0;
bellard6f970bd2005-12-05 19:55:19 +00001206}
1207
ths8e33c082006-12-11 19:22:27 +00001208/* convert MIPS rounding mode in FCR31 to IEEE library */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001209static unsigned int ieee_rm[] = {
ths8e33c082006-12-11 19:22:27 +00001210 float_round_nearest_even,
1211 float_round_to_zero,
1212 float_round_up,
1213 float_round_down
Andreas Färber47d74ef2013-07-07 11:17:26 +02001214};
ths8e33c082006-12-11 19:22:27 +00001215#define RESTORE_ROUNDING_MODE \
Andreas Färber47d74ef2013-07-07 11:17:26 +02001216 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], \
1217 &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +00001218
Andreas Färberf3840912012-02-20 06:44:56 +01001219static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001220{
pbrook56aebc82008-10-11 17:55:29 +00001221 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +00001222
pbrook56aebc82008-10-11 17:55:29 +00001223 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001224
pbrook56aebc82008-10-11 17:55:29 +00001225 if (n < 32) {
1226 env->active_tc.gpr[n] = tmp;
1227 return sizeof(target_ulong);
1228 }
1229 if (env->CP0_Config1 & (1 << CP0C1_FP)
1230 && n >= 38 && n < 73) {
1231 if (n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001232 if (env->CP0_Status & (1 << CP0St_FR)) {
1233 env->active_fpu.fpr[n - 38].d = tmp;
1234 } else {
1235 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1236 }
pbrook56aebc82008-10-11 17:55:29 +00001237 }
1238 switch (n) {
1239 case 70:
1240 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1241 /* set rounding mode */
1242 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +00001243 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001244 case 71:
1245 env->active_fpu.fcr0 = tmp;
1246 break;
pbrook56aebc82008-10-11 17:55:29 +00001247 }
1248 return sizeof(target_ulong);
1249 }
1250 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001251 case 32:
1252 env->CP0_Status = tmp;
1253 break;
1254 case 33:
1255 env->active_tc.LO[0] = tmp;
1256 break;
1257 case 34:
1258 env->active_tc.HI[0] = tmp;
1259 break;
1260 case 35:
1261 env->CP0_BadVAddr = tmp;
1262 break;
1263 case 36:
1264 env->CP0_Cause = tmp;
1265 break;
Nathan Froydff1d1972009-12-08 08:06:30 -08001266 case 37:
1267 env->active_tc.PC = tmp & ~(target_ulong)1;
1268 if (tmp & 1) {
1269 env->hflags |= MIPS_HFLAG_M16;
1270 } else {
1271 env->hflags &= ~(MIPS_HFLAG_M16);
1272 }
1273 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001274 case 72: /* fp, ignored */
1275 break;
1276 default:
1277 if (n > 89) {
1278 return 0;
1279 }
1280 /* Other registers are readonly. Ignore writes. */
1281 break;
pbrook56aebc82008-10-11 17:55:29 +00001282 }
1283
1284 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001285}
Jia Liufc043552012-07-20 15:50:50 +08001286#elif defined(TARGET_OPENRISC)
1287
1288#define NUM_CORE_REGS (32 + 3)
1289
1290static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
1291{
1292 if (n < 32) {
1293 GET_REG32(env->gpr[n]);
1294 } else {
1295 switch (n) {
1296 case 32: /* PPC */
1297 GET_REG32(env->ppc);
Jia Liufc043552012-07-20 15:50:50 +08001298
1299 case 33: /* NPC */
1300 GET_REG32(env->npc);
Jia Liufc043552012-07-20 15:50:50 +08001301
1302 case 34: /* SR */
1303 GET_REG32(env->sr);
Jia Liufc043552012-07-20 15:50:50 +08001304
1305 default:
1306 break;
1307 }
1308 }
1309 return 0;
1310}
1311
1312static int cpu_gdb_write_register(CPUOpenRISCState *env,
1313 uint8_t *mem_buf, int n)
1314{
1315 uint32_t tmp;
1316
1317 if (n > NUM_CORE_REGS) {
1318 return 0;
1319 }
1320
1321 tmp = ldl_p(mem_buf);
1322
1323 if (n < 32) {
1324 env->gpr[n] = tmp;
1325 } else {
1326 switch (n) {
1327 case 32: /* PPC */
1328 env->ppc = tmp;
1329 break;
1330
1331 case 33: /* NPC */
1332 env->npc = tmp;
1333 break;
1334
1335 case 34: /* SR */
1336 env->sr = tmp;
1337 break;
1338
1339 default:
1340 break;
1341 }
1342 }
1343 return 4;
1344}
bellardfdf9b3e2006-04-27 21:07:38 +00001345#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001346
1347/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001348/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001349
pbrook56aebc82008-10-11 17:55:29 +00001350#define NUM_CORE_REGS 59
1351
Andreas Färberf3840912012-02-20 06:44:56 +01001352static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001353{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001354 switch (n) {
1355 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +00001356 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1357 GET_REGL(env->gregs[n + 16]);
1358 } else {
1359 GET_REGL(env->gregs[n]);
1360 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001361 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001362 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001363 case 16:
1364 GET_REGL(env->pc);
1365 case 17:
1366 GET_REGL(env->pr);
1367 case 18:
1368 GET_REGL(env->gbr);
1369 case 19:
1370 GET_REGL(env->vbr);
1371 case 20:
1372 GET_REGL(env->mach);
1373 case 21:
1374 GET_REGL(env->macl);
1375 case 22:
1376 GET_REGL(env->sr);
1377 case 23:
1378 GET_REGL(env->fpul);
1379 case 24:
1380 GET_REGL(env->fpscr);
1381 case 25 ... 40:
1382 if (env->fpscr & FPSCR_FR) {
1383 stfl_p(mem_buf, env->fregs[n - 9]);
1384 } else {
1385 stfl_p(mem_buf, env->fregs[n - 25]);
1386 }
1387 return 4;
1388 case 41:
1389 GET_REGL(env->ssr);
1390 case 42:
1391 GET_REGL(env->spc);
1392 case 43 ... 50:
1393 GET_REGL(env->gregs[n - 43]);
1394 case 51 ... 58:
1395 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +00001396 }
bellardfdf9b3e2006-04-27 21:07:38 +00001397
pbrook56aebc82008-10-11 17:55:29 +00001398 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001399}
1400
Andreas Färberf3840912012-02-20 06:44:56 +01001401static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001402{
pbrook56aebc82008-10-11 17:55:29 +00001403 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001404 case 0 ... 7:
1405 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1406 env->gregs[n + 16] = ldl_p(mem_buf);
1407 } else {
1408 env->gregs[n] = ldl_p(mem_buf);
1409 }
1410 break;
1411 case 8 ... 15:
1412 env->gregs[n] = ldl_p(mem_buf);
1413 break;
1414 case 16:
1415 env->pc = ldl_p(mem_buf);
1416 break;
1417 case 17:
1418 env->pr = ldl_p(mem_buf);
1419 break;
1420 case 18:
1421 env->gbr = ldl_p(mem_buf);
1422 break;
1423 case 19:
1424 env->vbr = ldl_p(mem_buf);
1425 break;
1426 case 20:
1427 env->mach = ldl_p(mem_buf);
1428 break;
1429 case 21:
1430 env->macl = ldl_p(mem_buf);
1431 break;
1432 case 22:
1433 env->sr = ldl_p(mem_buf);
1434 break;
1435 case 23:
1436 env->fpul = ldl_p(mem_buf);
1437 break;
1438 case 24:
1439 env->fpscr = ldl_p(mem_buf);
1440 break;
1441 case 25 ... 40:
1442 if (env->fpscr & FPSCR_FR) {
1443 env->fregs[n - 9] = ldfl_p(mem_buf);
1444 } else {
1445 env->fregs[n - 25] = ldfl_p(mem_buf);
1446 }
1447 break;
1448 case 41:
1449 env->ssr = ldl_p(mem_buf);
1450 break;
1451 case 42:
1452 env->spc = ldl_p(mem_buf);
1453 break;
1454 case 43 ... 50:
1455 env->gregs[n - 43] = ldl_p(mem_buf);
1456 break;
1457 case 51 ... 58:
1458 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
1459 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001460 default:
1461 return 0;
pbrook56aebc82008-10-11 17:55:29 +00001462 }
1463
1464 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001465}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001466#elif defined (TARGET_MICROBLAZE)
1467
1468#define NUM_CORE_REGS (32 + 5)
1469
Andreas Färberf3840912012-02-20 06:44:56 +01001470static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001471{
1472 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001473 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001474 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001475 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001476 }
1477 return 0;
1478}
1479
Andreas Färberf3840912012-02-20 06:44:56 +01001480static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001481{
1482 uint32_t tmp;
1483
Andreas Färber47d74ef2013-07-07 11:17:26 +02001484 if (n > NUM_CORE_REGS) {
1485 return 0;
1486 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001487
1488 tmp = ldl_p(mem_buf);
1489
1490 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001491 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001492 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001493 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001494 }
1495 return 4;
1496}
thsf1ccf902007-10-08 13:16:14 +00001497#elif defined (TARGET_CRIS)
1498
pbrook56aebc82008-10-11 17:55:29 +00001499#define NUM_CORE_REGS 49
1500
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001501static int
Andreas Färberf3840912012-02-20 06:44:56 +01001502read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001503{
1504 if (n < 15) {
1505 GET_REG32(env->regs[n]);
1506 }
1507
1508 if (n == 15) {
1509 GET_REG32(env->pc);
1510 }
1511
1512 if (n < 32) {
1513 switch (n) {
1514 case 16:
1515 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001516 case 17:
1517 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001518 case 20:
1519 case 21:
1520 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001521 default:
1522 if (n >= 23) {
1523 GET_REG32(env->pregs[n - 16]);
1524 }
1525 break;
1526 }
1527 }
1528 return 0;
1529}
1530
Andreas Färberf3840912012-02-20 06:44:56 +01001531static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001532{
pbrook56aebc82008-10-11 17:55:29 +00001533 uint8_t srs;
1534
Andreas Färber47d74ef2013-07-07 11:17:26 +02001535 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001536 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +02001537 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001538
pbrook56aebc82008-10-11 17:55:29 +00001539 srs = env->pregs[PR_SRS];
1540 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001541 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +00001542 }
1543
1544 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001545 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +00001546 }
1547 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001548 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +00001549 }
1550 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001551 case 16:
1552 GET_REG8(env->pregs[0]);
1553 case 17:
1554 GET_REG8(env->pregs[1]);
1555 case 18:
1556 GET_REG32(env->pregs[2]);
1557 case 19:
1558 GET_REG8(srs);
1559 case 20:
1560 GET_REG16(env->pregs[4]);
1561 case 32:
1562 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +00001563 }
1564
1565 return 0;
thsf1ccf902007-10-08 13:16:14 +00001566}
1567
Andreas Färberf3840912012-02-20 06:44:56 +01001568static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001569{
pbrook56aebc82008-10-11 17:55:29 +00001570 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001571
Andreas Färber47d74ef2013-07-07 11:17:26 +02001572 if (n > 49) {
1573 return 0;
1574 }
thsf1ccf902007-10-08 13:16:14 +00001575
pbrook56aebc82008-10-11 17:55:29 +00001576 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001577
pbrook56aebc82008-10-11 17:55:29 +00001578 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001579 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +00001580 }
thsf1ccf902007-10-08 13:16:14 +00001581
edgar_igld7b69672008-10-11 19:32:21 +00001582 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001583 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +00001584 }
1585
1586 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001587 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001588 case 16:
1589 return 1;
1590 case 17:
1591 return 1;
1592 case 18:
1593 env->pregs[PR_PID] = tmp;
1594 break;
1595 case 19:
1596 return 1;
1597 case 20:
1598 return 2;
1599 case 32:
1600 env->pc = tmp;
1601 break;
pbrook56aebc82008-10-11 17:55:29 +00001602 }
thsf1ccf902007-10-08 13:16:14 +00001603
pbrook56aebc82008-10-11 17:55:29 +00001604 return 4;
thsf1ccf902007-10-08 13:16:14 +00001605}
aurel3219bf5172008-12-07 23:26:32 +00001606#elif defined (TARGET_ALPHA)
1607
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001608#define NUM_CORE_REGS 67
aurel3219bf5172008-12-07 23:26:32 +00001609
Andreas Färberf3840912012-02-20 06:44:56 +01001610static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001611{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001612 uint64_t val;
1613 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001614
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001615 switch (n) {
1616 case 0 ... 30:
1617 val = env->ir[n];
1618 break;
1619 case 32 ... 62:
1620 d.d = env->fir[n - 32];
1621 val = d.ll;
1622 break;
1623 case 63:
1624 val = cpu_alpha_load_fpcr(env);
1625 break;
1626 case 64:
1627 val = env->pc;
1628 break;
1629 case 66:
1630 val = env->unique;
1631 break;
1632 case 31:
1633 case 65:
1634 /* 31 really is the zero register; 65 is unassigned in the
1635 gdb protocol, but is still required to occupy 8 bytes. */
1636 val = 0;
1637 break;
1638 default:
1639 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001640 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001641 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001642}
1643
Andreas Färberf3840912012-02-20 06:44:56 +01001644static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001645{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001646 target_ulong tmp = ldtul_p(mem_buf);
1647 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001648
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001649 switch (n) {
1650 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001651 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001652 break;
1653 case 32 ... 62:
1654 d.ll = tmp;
1655 env->fir[n - 32] = d.d;
1656 break;
1657 case 63:
1658 cpu_alpha_store_fpcr(env, tmp);
1659 break;
1660 case 64:
1661 env->pc = tmp;
1662 break;
1663 case 66:
1664 env->unique = tmp;
1665 break;
1666 case 31:
1667 case 65:
1668 /* 31 really is the zero register; 65 is unassigned in the
1669 gdb protocol, but is still required to occupy 8 bytes. */
1670 break;
1671 default:
1672 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001673 }
aurel3219bf5172008-12-07 23:26:32 +00001674 return 8;
1675}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001676#elif defined (TARGET_S390X)
1677
Richard Henderson6ee77b12012-08-23 10:44:45 -07001678#define NUM_CORE_REGS S390_NUM_REGS
Alexander Grafafcb0e42009-12-05 12:44:29 +01001679
Andreas Färberf3840912012-02-20 06:44:56 +01001680static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001681{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001682 uint64_t val;
1683 int cc_op;
1684
Alexander Grafafcb0e42009-12-05 12:44:29 +01001685 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001686 case S390_PSWM_REGNUM:
1687 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1688 val = deposit64(env->psw.mask, 44, 2, cc_op);
1689 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001690 case S390_PSWA_REGNUM:
1691 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001692 case S390_R0_REGNUM ... S390_R15_REGNUM:
1693 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001694 case S390_A0_REGNUM ... S390_A15_REGNUM:
1695 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001696 case S390_FPC_REGNUM:
1697 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001698 case S390_F0_REGNUM ... S390_F15_REGNUM:
1699 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +01001700 }
1701
1702 return 0;
1703}
1704
Andreas Färberf3840912012-02-20 06:44:56 +01001705static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001706{
1707 target_ulong tmpl;
1708 uint32_t tmp32;
1709 int r = 8;
1710 tmpl = ldtul_p(mem_buf);
1711 tmp32 = ldl_p(mem_buf);
1712
1713 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001714 case S390_PSWM_REGNUM:
1715 env->psw.mask = tmpl;
1716 env->cc_op = extract64(tmpl, 44, 2);
1717 break;
1718 case S390_PSWA_REGNUM:
1719 env->psw.addr = tmpl;
1720 break;
1721 case S390_R0_REGNUM ... S390_R15_REGNUM:
1722 env->regs[n-S390_R0_REGNUM] = tmpl;
1723 break;
1724 case S390_A0_REGNUM ... S390_A15_REGNUM:
1725 env->aregs[n-S390_A0_REGNUM] = tmp32;
1726 r = 4;
1727 break;
1728 case S390_FPC_REGNUM:
1729 env->fpc = tmp32;
1730 r = 4;
1731 break;
1732 case S390_F0_REGNUM ... S390_F15_REGNUM:
1733 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1734 break;
1735 default:
1736 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001737 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001738 return r;
1739}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001740#elif defined (TARGET_LM32)
1741
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001742#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001743#define NUM_CORE_REGS (32 + 7)
1744
Andreas Färberf3840912012-02-20 06:44:56 +01001745static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001746{
1747 if (n < 32) {
1748 GET_REG32(env->regs[n]);
1749 } else {
1750 switch (n) {
1751 case 32:
1752 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001753 /* FIXME: put in right exception ID */
1754 case 33:
1755 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001756 case 34:
1757 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001758 case 35:
1759 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001760 case 36:
1761 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001762 case 37:
1763 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001764 case 38:
1765 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001766 }
1767 }
1768 return 0;
1769}
1770
Andreas Färberf3840912012-02-20 06:44:56 +01001771static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001772{
1773 uint32_t tmp;
1774
1775 if (n > NUM_CORE_REGS) {
1776 return 0;
1777 }
1778
1779 tmp = ldl_p(mem_buf);
1780
1781 if (n < 32) {
1782 env->regs[n] = tmp;
1783 } else {
1784 switch (n) {
1785 case 32:
1786 env->pc = tmp;
1787 break;
1788 case 34:
1789 env->eba = tmp;
1790 break;
1791 case 35:
1792 env->deba = tmp;
1793 break;
1794 case 36:
1795 env->ie = tmp;
1796 break;
1797 case 37:
1798 lm32_pic_set_im(env->pic_state, tmp);
1799 break;
1800 case 38:
1801 lm32_pic_set_ip(env->pic_state, tmp);
1802 break;
1803 }
1804 }
1805 return 4;
1806}
Max Filippovccfcaba2011-09-06 03:55:52 +04001807#elif defined(TARGET_XTENSA)
1808
1809/* Use num_core_regs to see only non-privileged registers in an unmodified gdb.
1810 * Use num_regs to see all registers. gdb modification is required for that:
1811 * reset bit 0 in the 'flags' field of the registers definitions in the
1812 * gdb/xtensa-config.c inside gdb source tree or inside gdb overlay.
1813 */
1814#define NUM_CORE_REGS (env->config->gdb_regmap.num_regs)
1815#define num_g_regs NUM_CORE_REGS
1816
Andreas Färberf3840912012-02-20 06:44:56 +01001817static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001818{
1819 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1820
1821 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1822 return 0;
1823 }
1824
1825 switch (reg->type) {
1826 case 9: /*pc*/
1827 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +04001828
1829 case 1: /*ar*/
1830 xtensa_sync_phys_from_window(env);
1831 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001832
1833 case 2: /*SR*/
1834 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001835
1836 case 3: /*UR*/
1837 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001838
Max Filippovdd519cb2012-09-19 04:23:54 +04001839 case 4: /*f*/
1840 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +04001841
Max Filippovccfcaba2011-09-06 03:55:52 +04001842 case 8: /*a*/
1843 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001844
1845 default:
1846 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001847 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001848 return 0;
1849 }
1850}
1851
Andreas Färberf3840912012-02-20 06:44:56 +01001852static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001853{
1854 uint32_t tmp;
1855 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1856
1857 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1858 return 0;
1859 }
1860
1861 tmp = ldl_p(mem_buf);
1862
1863 switch (reg->type) {
1864 case 9: /*pc*/
1865 env->pc = tmp;
1866 break;
1867
1868 case 1: /*ar*/
1869 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1870 xtensa_sync_window_from_phys(env);
1871 break;
1872
1873 case 2: /*SR*/
1874 env->sregs[reg->targno & 0xff] = tmp;
1875 break;
1876
1877 case 3: /*UR*/
1878 env->uregs[reg->targno & 0xff] = tmp;
1879 break;
1880
Max Filippovdd519cb2012-09-19 04:23:54 +04001881 case 4: /*f*/
1882 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1883 break;
1884
Max Filippovccfcaba2011-09-06 03:55:52 +04001885 case 8: /*a*/
1886 env->regs[reg->targno & 0x0f] = tmp;
1887 break;
1888
1889 default:
1890 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001891 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001892 return 0;
1893 }
1894
1895 return 4;
1896}
bellard1fddef42005-04-17 19:16:13 +00001897#else
pbrook56aebc82008-10-11 17:55:29 +00001898
1899#define NUM_CORE_REGS 0
1900
Andreas Färber9349b4f2012-03-14 01:38:32 +01001901static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001902{
1903 return 0;
1904}
1905
Andreas Färber9349b4f2012-03-14 01:38:32 +01001906static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001907{
pbrook56aebc82008-10-11 17:55:29 +00001908 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001909}
1910
1911#endif
bellardb4608c02003-06-27 17:34:32 +00001912
Max Filippovccfcaba2011-09-06 03:55:52 +04001913#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001914static int num_g_regs = NUM_CORE_REGS;
Max Filippovccfcaba2011-09-06 03:55:52 +04001915#endif
pbrook56aebc82008-10-11 17:55:29 +00001916
1917#ifdef GDB_CORE_XML
1918/* Encode data using the encoding for 'x' packets. */
1919static int memtox(char *buf, const char *mem, int len)
1920{
1921 char *p = buf;
1922 char c;
1923
1924 while (len--) {
1925 c = *(mem++);
1926 switch (c) {
1927 case '#': case '$': case '*': case '}':
1928 *(p++) = '}';
1929 *(p++) = c ^ 0x20;
1930 break;
1931 default:
1932 *(p++) = c;
1933 break;
1934 }
1935 }
1936 return p - buf;
1937}
1938
aurel323faf7782008-12-07 23:26:17 +00001939static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001940{
pbrook56aebc82008-10-11 17:55:29 +00001941 size_t len;
1942 int i;
1943 const char *name;
1944 static char target_xml[1024];
1945
1946 len = 0;
1947 while (p[len] && p[len] != ':')
1948 len++;
1949 *newp = p + len;
1950
1951 name = NULL;
1952 if (strncmp(p, "target.xml", len) == 0) {
1953 /* Generate the XML description for this CPU. */
1954 if (!target_xml[0]) {
1955 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001956 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001957
blueswir15b3715b2008-10-25 11:18:12 +00001958 snprintf(target_xml, sizeof(target_xml),
1959 "<?xml version=\"1.0\"?>"
1960 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1961 "<target>"
1962 "<xi:include href=\"%s\"/>",
1963 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001964
Andreas Färbereac8b352013-06-28 21:11:37 +02001965 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001966 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1967 pstrcat(target_xml, sizeof(target_xml), r->xml);
1968 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001969 }
blueswir12dc766d2009-04-13 16:06:19 +00001970 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001971 }
1972 return target_xml;
1973 }
1974 for (i = 0; ; i++) {
1975 name = xml_builtin[i][0];
1976 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1977 break;
1978 }
1979 return name ? xml_builtin[i][1] : NULL;
1980}
1981#endif
1982
Andreas Färber385b9f02013-06-27 18:25:36 +02001983static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001984{
Andreas Färber385b9f02013-06-27 18:25:36 +02001985 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001986 GDBRegisterState *r;
1987
1988 if (reg < NUM_CORE_REGS)
1989 return cpu_gdb_read_register(env, mem_buf, reg);
1990
Andreas Färbereac8b352013-06-28 21:11:37 +02001991 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001992 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1993 return r->get_reg(env, mem_buf, reg - r->base_reg);
1994 }
1995 }
1996 return 0;
1997}
1998
Andreas Färber385b9f02013-06-27 18:25:36 +02001999static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00002000{
Andreas Färber385b9f02013-06-27 18:25:36 +02002001 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00002002 GDBRegisterState *r;
2003
2004 if (reg < NUM_CORE_REGS)
2005 return cpu_gdb_write_register(env, mem_buf, reg);
2006
Andreas Färbereac8b352013-06-28 21:11:37 +02002007 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00002008 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
2009 return r->set_reg(env, mem_buf, reg - r->base_reg);
2010 }
2011 }
2012 return 0;
2013}
2014
Max Filippovccfcaba2011-09-06 03:55:52 +04002015#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00002016/* Register a supplemental set of CPU registers. If g_pos is nonzero it
2017 specifies the first register number and these registers are included in
2018 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
2019 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
2020 */
2021
Andreas Färber22169d42013-06-28 21:27:39 +02002022void gdb_register_coprocessor(CPUState *cpu,
2023 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
2024 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00002025{
2026 GDBRegisterState *s;
2027 GDBRegisterState **p;
2028 static int last_reg = NUM_CORE_REGS;
2029
Andreas Färbereac8b352013-06-28 21:11:37 +02002030 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00002031 while (*p) {
2032 /* Check for duplicates. */
2033 if (strcmp((*p)->xml, xml) == 0)
2034 return;
2035 p = &(*p)->next;
2036 }
Stefan Weil9643c252011-10-18 22:25:38 +02002037
2038 s = g_new0(GDBRegisterState, 1);
2039 s->base_reg = last_reg;
2040 s->num_regs = num_regs;
2041 s->get_reg = get_reg;
2042 s->set_reg = set_reg;
2043 s->xml = xml;
2044
pbrook56aebc82008-10-11 17:55:29 +00002045 /* Add to end of list. */
2046 last_reg += num_regs;
2047 *p = s;
2048 if (g_pos) {
2049 if (g_pos != s->base_reg) {
2050 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
2051 "Expected %d got %d\n", xml, g_pos, s->base_reg);
2052 } else {
2053 num_g_regs = last_reg;
2054 }
2055 }
2056}
Max Filippovccfcaba2011-09-06 03:55:52 +04002057#endif
pbrook56aebc82008-10-11 17:55:29 +00002058
aliguoria1d1bb32008-11-18 20:07:32 +00002059#ifndef CONFIG_USER_ONLY
2060static const int xlat_gdb_type[] = {
2061 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
2062 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
2063 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
2064};
2065#endif
2066
aliguori880a7572008-11-18 20:30:24 +00002067static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00002068{
Andreas Färber182735e2013-05-29 22:29:20 +02002069 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002070 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002071 int err = 0;
2072
Andreas Färber62278812013-06-27 17:12:06 +02002073 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002074 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02002075 }
aliguorie22a25c2009-03-12 20:12:48 +00002076
aliguoria1d1bb32008-11-18 20:07:32 +00002077 switch (type) {
2078 case GDB_BREAKPOINT_SW:
2079 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02002080 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2081 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002082 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
2083 if (err)
2084 break;
2085 }
2086 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002087#ifndef CONFIG_USER_ONLY
2088 case GDB_WATCHPOINT_WRITE:
2089 case GDB_WATCHPOINT_READ:
2090 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02002091 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2092 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002093 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
2094 NULL);
2095 if (err)
2096 break;
2097 }
2098 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002099#endif
2100 default:
2101 return -ENOSYS;
2102 }
2103}
2104
aliguori880a7572008-11-18 20:30:24 +00002105static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00002106{
Andreas Färber182735e2013-05-29 22:29:20 +02002107 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002108 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002109 int err = 0;
2110
Andreas Färber62278812013-06-27 17:12:06 +02002111 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002112 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02002113 }
aliguorie22a25c2009-03-12 20:12:48 +00002114
aliguoria1d1bb32008-11-18 20:07:32 +00002115 switch (type) {
2116 case GDB_BREAKPOINT_SW:
2117 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02002118 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2119 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002120 err = cpu_breakpoint_remove(env, addr, BP_GDB);
2121 if (err)
2122 break;
2123 }
2124 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002125#ifndef CONFIG_USER_ONLY
2126 case GDB_WATCHPOINT_WRITE:
2127 case GDB_WATCHPOINT_READ:
2128 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02002129 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2130 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002131 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
2132 if (err)
2133 break;
2134 }
2135 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002136#endif
2137 default:
2138 return -ENOSYS;
2139 }
2140}
2141
aliguori880a7572008-11-18 20:30:24 +00002142static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00002143{
Andreas Färber182735e2013-05-29 22:29:20 +02002144 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002145 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002146
aliguorie22a25c2009-03-12 20:12:48 +00002147 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002148 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00002149 return;
2150 }
2151
Andreas Färber182735e2013-05-29 22:29:20 +02002152 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2153 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002154 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002155#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00002156 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002157#endif
aliguori880a7572008-11-18 20:30:24 +00002158 }
aliguoria1d1bb32008-11-18 20:07:32 +00002159}
2160
aurel32fab9d282009-04-08 21:29:37 +00002161static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
2162{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002163 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02002164 CPUClass *cc = CPU_GET_CLASS(cpu);
2165
2166 cpu_synchronize_state(cpu);
2167 if (cc->set_pc) {
2168 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08002169 }
aurel32fab9d282009-04-08 21:29:37 +00002170}
2171
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002172static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002173{
Andreas Färber0d342822012-12-17 07:12:13 +01002174 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002175
Andreas Färber182735e2013-05-29 22:29:20 +02002176 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02002177 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002178 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02002179 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002180 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02002181
2182 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002183}
2184
aliguori880a7572008-11-18 20:30:24 +00002185static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00002186{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002187#ifdef TARGET_XTENSA
Andreas Färber9349b4f2012-03-14 01:38:32 +01002188 CPUArchState *env;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002189#endif
2190 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00002191 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002192 uint32_t thread;
2193 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00002194 char buf[MAX_PACKET_LENGTH];
2195 uint8_t mem_buf[MAX_PACKET_LENGTH];
2196 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00002197 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00002198
bellard858693c2004-03-31 18:52:07 +00002199#ifdef DEBUG_GDB
2200 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00002201#endif
bellard858693c2004-03-31 18:52:07 +00002202 p = line_buf;
2203 ch = *p++;
2204 switch(ch) {
2205 case '?':
bellard1fddef42005-04-17 19:16:13 +00002206 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00002207 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002208 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00002209 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00002210 /* Remove all the breakpoints when this query is issued,
2211 * because gdb is doing and initial connect and the state
2212 * should be cleaned up.
2213 */
aliguori880a7572008-11-18 20:30:24 +00002214 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00002215 break;
2216 case 'c':
2217 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00002218 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002219 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002220 }
aurel32ca587a82008-12-18 22:44:13 +00002221 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00002222 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002223 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00002224 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00002225 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2226 if (s->signal == -1)
2227 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00002228 gdb_continue(s);
2229 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002230 case 'v':
2231 if (strncmp(p, "Cont", 4) == 0) {
2232 int res_signal, res_thread;
2233
2234 p += 4;
2235 if (*p == '?') {
2236 put_packet(s, "vCont;c;C;s;S");
2237 break;
2238 }
2239 res = 0;
2240 res_signal = 0;
2241 res_thread = 0;
2242 while (*p) {
2243 int action, signal;
2244
2245 if (*p++ != ';') {
2246 res = 0;
2247 break;
2248 }
2249 action = *p++;
2250 signal = 0;
2251 if (action == 'C' || action == 'S') {
2252 signal = strtoul(p, (char **)&p, 16);
2253 } else if (action != 'c' && action != 's') {
2254 res = 0;
2255 break;
2256 }
2257 thread = 0;
2258 if (*p == ':') {
2259 thread = strtoull(p+1, (char **)&p, 16);
2260 }
2261 action = tolower(action);
2262 if (res == 0 || (res == 'c' && action == 's')) {
2263 res = action;
2264 res_signal = signal;
2265 res_thread = thread;
2266 }
2267 }
2268 if (res) {
2269 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002270 cpu = find_cpu(res_thread);
2271 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002272 put_packet(s, "E22");
2273 break;
2274 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002275 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002276 }
2277 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002278 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002279 }
2280 s->signal = res_signal;
2281 gdb_continue(s);
2282 return RS_IDLE;
2283 }
2284 break;
2285 } else {
2286 goto unknown_command;
2287 }
edgar_igl7d03f822008-05-17 18:58:29 +00002288 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002289#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002290 /* Kill the target */
2291 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2292 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002293#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002294 case 'D':
2295 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002296 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002297 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002298 gdb_continue(s);
2299 put_packet(s, "OK");
2300 break;
bellard858693c2004-03-31 18:52:07 +00002301 case 's':
2302 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002303 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002304 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002305 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002306 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002307 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002308 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002309 case 'F':
2310 {
2311 target_ulong ret;
2312 target_ulong err;
2313
2314 ret = strtoull(p, (char **)&p, 16);
2315 if (*p == ',') {
2316 p++;
2317 err = strtoull(p, (char **)&p, 16);
2318 } else {
2319 err = 0;
2320 }
2321 if (*p == ',')
2322 p++;
2323 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002324 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002325 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00002326 s->current_syscall_cb = NULL;
2327 }
pbrooka2d1eba2007-01-28 03:10:55 +00002328 if (type == 'C') {
2329 put_packet(s, "T02");
2330 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002331 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002332 }
2333 }
2334 break;
bellard858693c2004-03-31 18:52:07 +00002335 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002336 cpu_synchronize_state(s->g_cpu);
2337#ifdef TARGET_XTENSA
2338 env = s->g_cpu->env_ptr;
2339#endif
pbrook56aebc82008-10-11 17:55:29 +00002340 len = 0;
2341 for (addr = 0; addr < num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002342 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002343 len += reg_size;
2344 }
2345 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002346 put_packet(s, buf);
2347 break;
2348 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002349 cpu_synchronize_state(s->g_cpu);
2350#ifdef TARGET_XTENSA
2351 env = s->g_cpu->env_ptr;
2352#endif
pbrook56aebc82008-10-11 17:55:29 +00002353 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002354 len = strlen(p) / 2;
2355 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00002356 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002357 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002358 len -= reg_size;
2359 registers += reg_size;
2360 }
bellard858693c2004-03-31 18:52:07 +00002361 put_packet(s, "OK");
2362 break;
2363 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002364 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002365 if (*p == ',')
2366 p++;
bellard9d9754a2006-06-25 15:32:37 +00002367 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002368 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002369 put_packet (s, "E14");
2370 } else {
2371 memtohex(buf, mem_buf, len);
2372 put_packet(s, buf);
2373 }
bellard858693c2004-03-31 18:52:07 +00002374 break;
2375 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002376 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002377 if (*p == ',')
2378 p++;
bellard9d9754a2006-06-25 15:32:37 +00002379 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002380 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002381 p++;
2382 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002383 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02002384 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002385 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002386 } else {
bellard858693c2004-03-31 18:52:07 +00002387 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002388 }
bellard858693c2004-03-31 18:52:07 +00002389 break;
pbrook56aebc82008-10-11 17:55:29 +00002390 case 'p':
2391 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2392 This works, but can be very slow. Anything new enough to
2393 understand XML also knows how to use this properly. */
2394 if (!gdb_has_xml)
2395 goto unknown_command;
2396 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002397 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002398 if (reg_size) {
2399 memtohex(buf, mem_buf, reg_size);
2400 put_packet(s, buf);
2401 } else {
2402 put_packet(s, "E14");
2403 }
2404 break;
2405 case 'P':
2406 if (!gdb_has_xml)
2407 goto unknown_command;
2408 addr = strtoull(p, (char **)&p, 16);
2409 if (*p == '=')
2410 p++;
2411 reg_size = strlen(p) / 2;
2412 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002413 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002414 put_packet(s, "OK");
2415 break;
bellard858693c2004-03-31 18:52:07 +00002416 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002417 case 'z':
2418 type = strtoul(p, (char **)&p, 16);
2419 if (*p == ',')
2420 p++;
bellard9d9754a2006-06-25 15:32:37 +00002421 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002422 if (*p == ',')
2423 p++;
bellard9d9754a2006-06-25 15:32:37 +00002424 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002425 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002426 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002427 else
aliguori880a7572008-11-18 20:30:24 +00002428 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002429 if (res >= 0)
2430 put_packet(s, "OK");
2431 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002432 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002433 else
2434 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002435 break;
aliguori880a7572008-11-18 20:30:24 +00002436 case 'H':
2437 type = *p++;
2438 thread = strtoull(p, (char **)&p, 16);
2439 if (thread == -1 || thread == 0) {
2440 put_packet(s, "OK");
2441 break;
2442 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002443 cpu = find_cpu(thread);
2444 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00002445 put_packet(s, "E22");
2446 break;
2447 }
2448 switch (type) {
2449 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002450 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002451 put_packet(s, "OK");
2452 break;
2453 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002454 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002455 put_packet(s, "OK");
2456 break;
2457 default:
2458 put_packet(s, "E22");
2459 break;
2460 }
2461 break;
2462 case 'T':
2463 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002464 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002465
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002466 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002467 put_packet(s, "OK");
2468 } else {
aliguori880a7572008-11-18 20:30:24 +00002469 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002470 }
aliguori880a7572008-11-18 20:30:24 +00002471 break;
pbrook978efd62006-06-17 18:30:42 +00002472 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002473 case 'Q':
2474 /* parse any 'q' packets here */
2475 if (!strcmp(p,"qemu.sstepbits")) {
2476 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002477 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2478 SSTEP_ENABLE,
2479 SSTEP_NOIRQ,
2480 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002481 put_packet(s, buf);
2482 break;
2483 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2484 /* Display or change the sstep_flags */
2485 p += 10;
2486 if (*p != '=') {
2487 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002488 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002489 put_packet(s, buf);
2490 break;
2491 }
2492 p++;
2493 type = strtoul(p, (char **)&p, 16);
2494 sstep_flags = type;
2495 put_packet(s, "OK");
2496 break;
aliguori880a7572008-11-18 20:30:24 +00002497 } else if (strcmp(p,"C") == 0) {
2498 /* "Current thread" remains vague in the spec, so always return
2499 * the first CPU (gdb returns the first thread). */
2500 put_packet(s, "QC1");
2501 break;
2502 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02002503 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00002504 goto report_cpuinfo;
2505 } else if (strcmp(p,"sThreadInfo") == 0) {
2506 report_cpuinfo:
2507 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02002508 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00002509 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02002510 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00002511 } else
2512 put_packet(s, "l");
2513 break;
2514 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2515 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002516 cpu = find_cpu(thread);
2517 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02002518 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002519 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01002520 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01002521 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002522 memtohex(buf, mem_buf, len);
2523 put_packet(s, buf);
2524 }
aliguori880a7572008-11-18 20:30:24 +00002525 break;
edgar_igl60897d32008-05-09 08:25:14 +00002526 }
blueswir10b8a9882009-03-07 10:51:36 +00002527#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002528 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002529 CPUArchState *env = s->c_cpu->env_ptr;
2530 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00002531
blueswir1363a37d2008-08-21 17:58:08 +00002532 snprintf(buf, sizeof(buf),
2533 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2534 ";Bss=" TARGET_ABI_FMT_lx,
2535 ts->info->code_offset,
2536 ts->info->data_offset,
2537 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002538 put_packet(s, buf);
2539 break;
2540 }
blueswir10b8a9882009-03-07 10:51:36 +00002541#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002542 else if (strncmp(p, "Rcmd,", 5) == 0) {
2543 int len = strlen(p + 5);
2544
2545 if ((len % 2) != 0) {
2546 put_packet(s, "E01");
2547 break;
2548 }
2549 hextomem(mem_buf, p + 5, len);
2550 len = len / 2;
2551 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002552 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002553 put_packet(s, "OK");
2554 break;
2555 }
blueswir10b8a9882009-03-07 10:51:36 +00002556#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002557 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002558 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002559#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002560 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002561#endif
2562 put_packet(s, buf);
2563 break;
2564 }
2565#ifdef GDB_CORE_XML
2566 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2567 const char *xml;
2568 target_ulong total_len;
2569
2570 gdb_has_xml = 1;
2571 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002572 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002573 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002574 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002575 put_packet(s, buf);
2576 break;
2577 }
2578
2579 if (*p == ':')
2580 p++;
2581 addr = strtoul(p, (char **)&p, 16);
2582 if (*p == ',')
2583 p++;
2584 len = strtoul(p, (char **)&p, 16);
2585
2586 total_len = strlen(xml);
2587 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002588 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002589 put_packet(s, buf);
2590 break;
2591 }
2592 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2593 len = (MAX_PACKET_LENGTH - 5) / 2;
2594 if (len < total_len - addr) {
2595 buf[0] = 'm';
2596 len = memtox(buf + 1, xml + addr, len);
2597 } else {
2598 buf[0] = 'l';
2599 len = memtox(buf + 1, xml + addr, total_len - addr);
2600 }
2601 put_packet_binary(s, buf, len + 1);
2602 break;
2603 }
2604#endif
2605 /* Unrecognised 'q' command. */
2606 goto unknown_command;
2607
bellard858693c2004-03-31 18:52:07 +00002608 default:
pbrook56aebc82008-10-11 17:55:29 +00002609 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002610 /* put empty packet */
2611 buf[0] = '\0';
2612 put_packet(s, buf);
2613 break;
2614 }
2615 return RS_IDLE;
2616}
2617
Andreas Färber64f6b342013-05-27 02:06:09 +02002618void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00002619{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002620 gdbserver_state->c_cpu = cpu;
2621 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002622}
2623
bellard1fddef42005-04-17 19:16:13 +00002624#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002625static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002626{
aliguori880a7572008-11-18 20:30:24 +00002627 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002628 CPUArchState *env = s->c_cpu->env_ptr;
2629 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002630 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002631 const char *type;
bellard858693c2004-03-31 18:52:07 +00002632 int ret;
2633
Meador Ingecdb432b2012-03-15 17:49:45 +00002634 if (running || s->state == RS_INACTIVE) {
2635 return;
2636 }
2637 /* Is there a GDB syscall waiting to be sent? */
2638 if (s->current_syscall_cb) {
2639 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002640 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002641 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002642 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002643 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002644 if (env->watchpoint_hit) {
2645 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002646 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002647 type = "r";
2648 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002649 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002650 type = "a";
2651 break;
2652 default:
2653 type = "";
2654 break;
2655 }
aliguori880a7572008-11-18 20:30:24 +00002656 snprintf(buf, sizeof(buf),
2657 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002658 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002659 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002660 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002661 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002662 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002663 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002664 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002665 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002666 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002667 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002668 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002669 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002670 ret = GDB_SIGNAL_QUIT;
2671 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002672 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002673 ret = GDB_SIGNAL_IO;
2674 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002675 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002676 ret = GDB_SIGNAL_ALRM;
2677 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002678 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002679 ret = GDB_SIGNAL_ABRT;
2680 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002681 case RUN_STATE_SAVE_VM:
2682 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002683 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002684 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002685 ret = GDB_SIGNAL_XCPU;
2686 break;
2687 default:
2688 ret = GDB_SIGNAL_UNKNOWN;
2689 break;
bellardbbeb7b52006-04-23 18:42:15 +00002690 }
Andreas Färber0d342822012-12-17 07:12:13 +01002691 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002692
2693send_packet:
bellard858693c2004-03-31 18:52:07 +00002694 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002695
2696 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002697 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002698}
bellard1fddef42005-04-17 19:16:13 +00002699#endif
bellard858693c2004-03-31 18:52:07 +00002700
pbrooka2d1eba2007-01-28 03:10:55 +00002701/* Send a gdb syscall request.
2702 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002703 %x - target_ulong argument printed in hex.
2704 %lx - 64-bit argument printed in hex.
2705 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002706void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002707{
2708 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002709 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002710 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002711 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002712 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002713 GDBState *s;
2714
aliguori880a7572008-11-18 20:30:24 +00002715 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002716 if (!s)
2717 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002718 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002719#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002720 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002721#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002722 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002723 p = s->syscall_buf;
2724 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002725 *(p++) = 'F';
2726 while (*fmt) {
2727 if (*fmt == '%') {
2728 fmt++;
2729 switch (*fmt++) {
2730 case 'x':
2731 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002732 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002733 break;
pbrooka87295e2007-05-26 15:09:38 +00002734 case 'l':
2735 if (*(fmt++) != 'x')
2736 goto bad_format;
2737 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002738 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002739 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002740 case 's':
2741 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002742 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002743 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002744 break;
2745 default:
pbrooka87295e2007-05-26 15:09:38 +00002746 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002747 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2748 fmt - 1);
2749 break;
2750 }
2751 } else {
2752 *(p++) = *(fmt++);
2753 }
2754 }
pbrook8a93e022007-08-06 13:19:15 +00002755 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002756 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002757#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002758 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002759 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002760#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002761 /* In this case wait to send the syscall packet until notification that
2762 the CPU has stopped. This must be done because if the packet is sent
2763 now the reply from the syscall request could be received while the CPU
2764 is still in the running state, which can cause packets to be dropped
2765 and state transition 'T' packets to be sent while the syscall is still
2766 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002767 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002768#endif
2769}
2770
bellard6a00d602005-11-21 23:25:50 +00002771static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002772{
2773 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002774 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002775
bellard1fddef42005-04-17 19:16:13 +00002776#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002777 if (s->last_packet_len) {
2778 /* Waiting for a response to the last packet. If we see the start
2779 of a new command then abandon the previous response. */
2780 if (ch == '-') {
2781#ifdef DEBUG_GDB
2782 printf("Got NACK, retransmitting\n");
2783#endif
thsffe8ab82007-12-16 03:16:05 +00002784 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002785 }
2786#ifdef DEBUG_GDB
2787 else if (ch == '+')
2788 printf("Got ACK\n");
2789 else
2790 printf("Got '%c' when expecting ACK/NACK\n", ch);
2791#endif
2792 if (ch == '+' || ch == '$')
2793 s->last_packet_len = 0;
2794 if (ch != '$')
2795 return;
2796 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002797 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002798 /* when the CPU is running, we cannot do anything except stop
2799 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002800 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002801 } else
bellard1fddef42005-04-17 19:16:13 +00002802#endif
bellard41625032005-04-24 10:07:11 +00002803 {
bellard858693c2004-03-31 18:52:07 +00002804 switch(s->state) {
2805 case RS_IDLE:
2806 if (ch == '$') {
2807 s->line_buf_index = 0;
2808 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002809 }
2810 break;
bellard858693c2004-03-31 18:52:07 +00002811 case RS_GETLINE:
2812 if (ch == '#') {
2813 s->state = RS_CHKSUM1;
2814 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2815 s->state = RS_IDLE;
2816 } else {
2817 s->line_buf[s->line_buf_index++] = ch;
2818 }
2819 break;
2820 case RS_CHKSUM1:
2821 s->line_buf[s->line_buf_index] = '\0';
2822 s->line_csum = fromhex(ch) << 4;
2823 s->state = RS_CHKSUM2;
2824 break;
2825 case RS_CHKSUM2:
2826 s->line_csum |= fromhex(ch);
2827 csum = 0;
2828 for(i = 0; i < s->line_buf_index; i++) {
2829 csum += s->line_buf[i];
2830 }
2831 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002832 reply = '-';
2833 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002834 s->state = RS_IDLE;
2835 } else {
ths60fe76f2007-12-16 03:02:09 +00002836 reply = '+';
2837 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002838 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002839 }
bellardb4608c02003-06-27 17:34:32 +00002840 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002841 default:
2842 abort();
bellardb4608c02003-06-27 17:34:32 +00002843 }
2844 }
bellard858693c2004-03-31 18:52:07 +00002845}
2846
Paul Brook0e1c9c52010-06-16 13:03:51 +01002847/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002848void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002849{
2850 GDBState *s;
2851 char buf[4];
2852
2853 s = gdbserver_state;
2854 if (!s) {
2855 return;
2856 }
2857#ifdef CONFIG_USER_ONLY
2858 if (gdbserver_fd < 0 || s->fd < 0) {
2859 return;
2860 }
2861#endif
2862
2863 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2864 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002865
2866#ifndef CONFIG_USER_ONLY
2867 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002868 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002869 }
2870#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002871}
2872
bellard1fddef42005-04-17 19:16:13 +00002873#ifdef CONFIG_USER_ONLY
2874int
aurel32ca587a82008-12-18 22:44:13 +00002875gdb_queuesig (void)
2876{
2877 GDBState *s;
2878
2879 s = gdbserver_state;
2880
2881 if (gdbserver_fd < 0 || s->fd < 0)
2882 return 0;
2883 else
2884 return 1;
2885}
2886
2887int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002888gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002889{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002890 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002891 GDBState *s;
2892 char buf[256];
2893 int n;
bellard1fddef42005-04-17 19:16:13 +00002894
Andreas Färber5ca666c2013-06-24 19:20:57 +02002895 s = gdbserver_state;
2896 if (gdbserver_fd < 0 || s->fd < 0) {
2897 return sig;
bellard1fddef42005-04-17 19:16:13 +00002898 }
2899
Andreas Färber5ca666c2013-06-24 19:20:57 +02002900 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002901 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002902 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002903
Andreas Färber5ca666c2013-06-24 19:20:57 +02002904 if (sig != 0) {
2905 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2906 put_packet(s, buf);
2907 }
2908 /* put_packet() might have detected that the peer terminated the
2909 connection. */
2910 if (s->fd < 0) {
2911 return sig;
2912 }
2913
2914 sig = 0;
2915 s->state = RS_IDLE;
2916 s->running_state = 0;
2917 while (s->running_state == 0) {
2918 n = read(s->fd, buf, 256);
2919 if (n > 0) {
2920 int i;
2921
2922 for (i = 0; i < n; i++) {
2923 gdb_read_byte(s, buf[i]);
2924 }
2925 } else if (n == 0 || errno != EAGAIN) {
2926 /* XXX: Connection closed. Should probably wait for another
2927 connection before continuing. */
2928 return sig;
bellard1fddef42005-04-17 19:16:13 +00002929 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002930 }
2931 sig = s->signal;
2932 s->signal = 0;
2933 return sig;
bellard1fddef42005-04-17 19:16:13 +00002934}
bellarde9009672005-04-26 20:42:36 +00002935
aurel32ca587a82008-12-18 22:44:13 +00002936/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002937void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002938{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002939 GDBState *s;
2940 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002941
Andreas Färber5ca666c2013-06-24 19:20:57 +02002942 s = gdbserver_state;
2943 if (gdbserver_fd < 0 || s->fd < 0) {
2944 return;
2945 }
aurel32ca587a82008-12-18 22:44:13 +00002946
Andreas Färber5ca666c2013-06-24 19:20:57 +02002947 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2948 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002949}
bellard1fddef42005-04-17 19:16:13 +00002950
aliguori880a7572008-11-18 20:30:24 +00002951static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002952{
2953 GDBState *s;
2954 struct sockaddr_in sockaddr;
2955 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002956 int fd;
bellard858693c2004-03-31 18:52:07 +00002957
2958 for(;;) {
2959 len = sizeof(sockaddr);
2960 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2961 if (fd < 0 && errno != EINTR) {
2962 perror("accept");
2963 return;
2964 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002965#ifndef _WIN32
2966 fcntl(fd, F_SETFD, FD_CLOEXEC);
2967#endif
bellard858693c2004-03-31 18:52:07 +00002968 break;
2969 }
2970 }
2971
2972 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002973 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002974
Anthony Liguori7267c092011-08-20 22:09:37 -05002975 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002976 s->c_cpu = first_cpu;
2977 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002978 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002979 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002980
aliguori880a7572008-11-18 20:30:24 +00002981 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002982
bellard858693c2004-03-31 18:52:07 +00002983 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002984}
2985
2986static int gdbserver_open(int port)
2987{
2988 struct sockaddr_in sockaddr;
2989 int fd, val, ret;
2990
2991 fd = socket(PF_INET, SOCK_STREAM, 0);
2992 if (fd < 0) {
2993 perror("socket");
2994 return -1;
2995 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002996#ifndef _WIN32
2997 fcntl(fd, F_SETFD, FD_CLOEXEC);
2998#endif
bellard858693c2004-03-31 18:52:07 +00002999
3000 /* allow fast reuse */
3001 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01003002 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00003003
3004 sockaddr.sin_family = AF_INET;
3005 sockaddr.sin_port = htons(port);
3006 sockaddr.sin_addr.s_addr = 0;
3007 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
3008 if (ret < 0) {
3009 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00003010 close(fd);
bellard858693c2004-03-31 18:52:07 +00003011 return -1;
3012 }
3013 ret = listen(fd, 0);
3014 if (ret < 0) {
3015 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00003016 close(fd);
bellard858693c2004-03-31 18:52:07 +00003017 return -1;
3018 }
bellard858693c2004-03-31 18:52:07 +00003019 return fd;
3020}
3021
3022int gdbserver_start(int port)
3023{
3024 gdbserver_fd = gdbserver_open(port);
3025 if (gdbserver_fd < 0)
3026 return -1;
3027 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00003028 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00003029 return 0;
3030}
aurel322b1319c2008-12-18 22:44:04 +00003031
3032/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01003033void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00003034{
3035 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00003036 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00003037 return;
3038 close(s->fd);
3039 s->fd = -1;
3040 cpu_breakpoint_remove_all(env, BP_GDB);
3041 cpu_watchpoint_remove_all(env, BP_GDB);
3042}
pbrook4046d912007-01-28 01:53:16 +00003043#else
thsaa1f17c2007-07-11 22:48:58 +00003044static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00003045{
pbrook56aebc82008-10-11 17:55:29 +00003046 /* We can handle an arbitrarily large amount of data.
3047 Pick the maximum packet size, which is as good as anything. */
3048 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00003049}
3050
thsaa1f17c2007-07-11 22:48:58 +00003051static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00003052{
pbrook4046d912007-01-28 01:53:16 +00003053 int i;
3054
3055 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00003056 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00003057 }
3058}
3059
3060static void gdb_chr_event(void *opaque, int event)
3061{
3062 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05303063 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03003064 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00003065 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00003066 break;
3067 default:
3068 break;
3069 }
3070}
3071
aliguori8a34a0f2009-03-05 23:01:55 +00003072static void gdb_monitor_output(GDBState *s, const char *msg, int len)
3073{
3074 char buf[MAX_PACKET_LENGTH];
3075
3076 buf[0] = 'O';
3077 if (len > (MAX_PACKET_LENGTH/2) - 1)
3078 len = (MAX_PACKET_LENGTH/2) - 1;
3079 memtohex(buf + 1, (uint8_t *)msg, len);
3080 put_packet(s, buf);
3081}
3082
3083static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
3084{
3085 const char *p = (const char *)buf;
3086 int max_sz;
3087
3088 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
3089 for (;;) {
3090 if (len <= max_sz) {
3091 gdb_monitor_output(gdbserver_state, p, len);
3092 break;
3093 }
3094 gdb_monitor_output(gdbserver_state, p, max_sz);
3095 p += max_sz;
3096 len -= max_sz;
3097 }
3098 return len;
3099}
3100
aliguori59030a82009-04-05 18:43:41 +00003101#ifndef _WIN32
3102static void gdb_sigterm_handler(int signal)
3103{
Luiz Capitulino13548692011-07-29 15:36:43 -03003104 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03003105 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01003106 }
aliguori59030a82009-04-05 18:43:41 +00003107}
3108#endif
3109
3110int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00003111{
3112 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00003113 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00003114 CharDriverState *chr = NULL;
3115 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00003116
aliguori59030a82009-04-05 18:43:41 +00003117 if (!device)
3118 return -1;
3119 if (strcmp(device, "none") != 0) {
3120 if (strstart(device, "tcp:", NULL)) {
3121 /* enforce required TCP attributes */
3122 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
3123 "%s,nowait,nodelay,server", device);
3124 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00003125 }
aliguori59030a82009-04-05 18:43:41 +00003126#ifndef _WIN32
3127 else if (strcmp(device, "stdio") == 0) {
3128 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00003129
aliguori59030a82009-04-05 18:43:41 +00003130 memset(&act, 0, sizeof(act));
3131 act.sa_handler = gdb_sigterm_handler;
3132 sigaction(SIGINT, &act, NULL);
3133 }
3134#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05003135 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00003136 if (!chr)
3137 return -1;
3138
Hans de Goede456d6062013-03-27 20:29:40 +01003139 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00003140 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
3141 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00003142 }
3143
aliguori36556b22009-03-28 18:05:53 +00003144 s = gdbserver_state;
3145 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003146 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00003147 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00003148
aliguori36556b22009-03-28 18:05:53 +00003149 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3150
3151 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05003152 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00003153 mon_chr->chr_write = gdb_monitor_write;
3154 monitor_init(mon_chr, 0);
3155 } else {
3156 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05003157 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00003158 mon_chr = s->mon_chr;
3159 memset(s, 0, sizeof(GDBState));
3160 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02003161 s->c_cpu = first_cpu;
3162 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00003163 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00003164 s->state = chr ? RS_IDLE : RS_INACTIVE;
3165 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00003166 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00003167
pbrook4046d912007-01-28 01:53:16 +00003168 return 0;
3169}
3170#endif