blob: cd25c066ec4104864a2968c3b9ac9f1b01671c10 [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);
1298 break;
1299
1300 case 33: /* NPC */
1301 GET_REG32(env->npc);
1302 break;
1303
1304 case 34: /* SR */
1305 GET_REG32(env->sr);
1306 break;
1307
1308 default:
1309 break;
1310 }
1311 }
1312 return 0;
1313}
1314
1315static int cpu_gdb_write_register(CPUOpenRISCState *env,
1316 uint8_t *mem_buf, int n)
1317{
1318 uint32_t tmp;
1319
1320 if (n > NUM_CORE_REGS) {
1321 return 0;
1322 }
1323
1324 tmp = ldl_p(mem_buf);
1325
1326 if (n < 32) {
1327 env->gpr[n] = tmp;
1328 } else {
1329 switch (n) {
1330 case 32: /* PPC */
1331 env->ppc = tmp;
1332 break;
1333
1334 case 33: /* NPC */
1335 env->npc = tmp;
1336 break;
1337
1338 case 34: /* SR */
1339 env->sr = tmp;
1340 break;
1341
1342 default:
1343 break;
1344 }
1345 }
1346 return 4;
1347}
bellardfdf9b3e2006-04-27 21:07:38 +00001348#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001349
1350/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001351/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001352
pbrook56aebc82008-10-11 17:55:29 +00001353#define NUM_CORE_REGS 59
1354
Andreas Färberf3840912012-02-20 06:44:56 +01001355static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001356{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001357 switch (n) {
1358 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +00001359 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1360 GET_REGL(env->gregs[n + 16]);
1361 } else {
1362 GET_REGL(env->gregs[n]);
1363 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001364 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001365 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001366 case 16:
1367 GET_REGL(env->pc);
1368 case 17:
1369 GET_REGL(env->pr);
1370 case 18:
1371 GET_REGL(env->gbr);
1372 case 19:
1373 GET_REGL(env->vbr);
1374 case 20:
1375 GET_REGL(env->mach);
1376 case 21:
1377 GET_REGL(env->macl);
1378 case 22:
1379 GET_REGL(env->sr);
1380 case 23:
1381 GET_REGL(env->fpul);
1382 case 24:
1383 GET_REGL(env->fpscr);
1384 case 25 ... 40:
1385 if (env->fpscr & FPSCR_FR) {
1386 stfl_p(mem_buf, env->fregs[n - 9]);
1387 } else {
1388 stfl_p(mem_buf, env->fregs[n - 25]);
1389 }
1390 return 4;
1391 case 41:
1392 GET_REGL(env->ssr);
1393 case 42:
1394 GET_REGL(env->spc);
1395 case 43 ... 50:
1396 GET_REGL(env->gregs[n - 43]);
1397 case 51 ... 58:
1398 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +00001399 }
bellardfdf9b3e2006-04-27 21:07:38 +00001400
pbrook56aebc82008-10-11 17:55:29 +00001401 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001402}
1403
Andreas Färberf3840912012-02-20 06:44:56 +01001404static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001405{
pbrook56aebc82008-10-11 17:55:29 +00001406 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001407 case 0 ... 7:
1408 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1409 env->gregs[n + 16] = ldl_p(mem_buf);
1410 } else {
1411 env->gregs[n] = ldl_p(mem_buf);
1412 }
1413 break;
1414 case 8 ... 15:
1415 env->gregs[n] = ldl_p(mem_buf);
1416 break;
1417 case 16:
1418 env->pc = ldl_p(mem_buf);
1419 break;
1420 case 17:
1421 env->pr = ldl_p(mem_buf);
1422 break;
1423 case 18:
1424 env->gbr = ldl_p(mem_buf);
1425 break;
1426 case 19:
1427 env->vbr = ldl_p(mem_buf);
1428 break;
1429 case 20:
1430 env->mach = ldl_p(mem_buf);
1431 break;
1432 case 21:
1433 env->macl = ldl_p(mem_buf);
1434 break;
1435 case 22:
1436 env->sr = ldl_p(mem_buf);
1437 break;
1438 case 23:
1439 env->fpul = ldl_p(mem_buf);
1440 break;
1441 case 24:
1442 env->fpscr = ldl_p(mem_buf);
1443 break;
1444 case 25 ... 40:
1445 if (env->fpscr & FPSCR_FR) {
1446 env->fregs[n - 9] = ldfl_p(mem_buf);
1447 } else {
1448 env->fregs[n - 25] = ldfl_p(mem_buf);
1449 }
1450 break;
1451 case 41:
1452 env->ssr = ldl_p(mem_buf);
1453 break;
1454 case 42:
1455 env->spc = ldl_p(mem_buf);
1456 break;
1457 case 43 ... 50:
1458 env->gregs[n - 43] = ldl_p(mem_buf);
1459 break;
1460 case 51 ... 58:
1461 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
1462 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001463 default:
1464 return 0;
pbrook56aebc82008-10-11 17:55:29 +00001465 }
1466
1467 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001468}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001469#elif defined (TARGET_MICROBLAZE)
1470
1471#define NUM_CORE_REGS (32 + 5)
1472
Andreas Färberf3840912012-02-20 06:44:56 +01001473static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001474{
1475 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001476 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001477 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001478 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001479 }
1480 return 0;
1481}
1482
Andreas Färberf3840912012-02-20 06:44:56 +01001483static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001484{
1485 uint32_t tmp;
1486
Andreas Färber47d74ef2013-07-07 11:17:26 +02001487 if (n > NUM_CORE_REGS) {
1488 return 0;
1489 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001490
1491 tmp = ldl_p(mem_buf);
1492
1493 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001494 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001495 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001496 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001497 }
1498 return 4;
1499}
thsf1ccf902007-10-08 13:16:14 +00001500#elif defined (TARGET_CRIS)
1501
pbrook56aebc82008-10-11 17:55:29 +00001502#define NUM_CORE_REGS 49
1503
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001504static int
Andreas Färberf3840912012-02-20 06:44:56 +01001505read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001506{
1507 if (n < 15) {
1508 GET_REG32(env->regs[n]);
1509 }
1510
1511 if (n == 15) {
1512 GET_REG32(env->pc);
1513 }
1514
1515 if (n < 32) {
1516 switch (n) {
1517 case 16:
1518 GET_REG8(env->pregs[n - 16]);
1519 break;
1520 case 17:
1521 GET_REG8(env->pregs[n - 16]);
1522 break;
1523 case 20:
1524 case 21:
1525 GET_REG16(env->pregs[n - 16]);
1526 break;
1527 default:
1528 if (n >= 23) {
1529 GET_REG32(env->pregs[n - 16]);
1530 }
1531 break;
1532 }
1533 }
1534 return 0;
1535}
1536
Andreas Färberf3840912012-02-20 06:44:56 +01001537static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001538{
pbrook56aebc82008-10-11 17:55:29 +00001539 uint8_t srs;
1540
Andreas Färber47d74ef2013-07-07 11:17:26 +02001541 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001542 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +02001543 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001544
pbrook56aebc82008-10-11 17:55:29 +00001545 srs = env->pregs[PR_SRS];
1546 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001547 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +00001548 }
1549
1550 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001551 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +00001552 }
1553 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001554 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +00001555 }
1556 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001557 case 16:
1558 GET_REG8(env->pregs[0]);
1559 case 17:
1560 GET_REG8(env->pregs[1]);
1561 case 18:
1562 GET_REG32(env->pregs[2]);
1563 case 19:
1564 GET_REG8(srs);
1565 case 20:
1566 GET_REG16(env->pregs[4]);
1567 case 32:
1568 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +00001569 }
1570
1571 return 0;
thsf1ccf902007-10-08 13:16:14 +00001572}
1573
Andreas Färberf3840912012-02-20 06:44:56 +01001574static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001575{
pbrook56aebc82008-10-11 17:55:29 +00001576 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001577
Andreas Färber47d74ef2013-07-07 11:17:26 +02001578 if (n > 49) {
1579 return 0;
1580 }
thsf1ccf902007-10-08 13:16:14 +00001581
pbrook56aebc82008-10-11 17:55:29 +00001582 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001583
pbrook56aebc82008-10-11 17:55:29 +00001584 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001585 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +00001586 }
thsf1ccf902007-10-08 13:16:14 +00001587
edgar_igld7b69672008-10-11 19:32:21 +00001588 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001589 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +00001590 }
1591
1592 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001593 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001594 case 16:
1595 return 1;
1596 case 17:
1597 return 1;
1598 case 18:
1599 env->pregs[PR_PID] = tmp;
1600 break;
1601 case 19:
1602 return 1;
1603 case 20:
1604 return 2;
1605 case 32:
1606 env->pc = tmp;
1607 break;
pbrook56aebc82008-10-11 17:55:29 +00001608 }
thsf1ccf902007-10-08 13:16:14 +00001609
pbrook56aebc82008-10-11 17:55:29 +00001610 return 4;
thsf1ccf902007-10-08 13:16:14 +00001611}
aurel3219bf5172008-12-07 23:26:32 +00001612#elif defined (TARGET_ALPHA)
1613
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001614#define NUM_CORE_REGS 67
aurel3219bf5172008-12-07 23:26:32 +00001615
Andreas Färberf3840912012-02-20 06:44:56 +01001616static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001617{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001618 uint64_t val;
1619 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001620
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001621 switch (n) {
1622 case 0 ... 30:
1623 val = env->ir[n];
1624 break;
1625 case 32 ... 62:
1626 d.d = env->fir[n - 32];
1627 val = d.ll;
1628 break;
1629 case 63:
1630 val = cpu_alpha_load_fpcr(env);
1631 break;
1632 case 64:
1633 val = env->pc;
1634 break;
1635 case 66:
1636 val = env->unique;
1637 break;
1638 case 31:
1639 case 65:
1640 /* 31 really is the zero register; 65 is unassigned in the
1641 gdb protocol, but is still required to occupy 8 bytes. */
1642 val = 0;
1643 break;
1644 default:
1645 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001646 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001647 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001648}
1649
Andreas Färberf3840912012-02-20 06:44:56 +01001650static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001651{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001652 target_ulong tmp = ldtul_p(mem_buf);
1653 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001654
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001655 switch (n) {
1656 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001657 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001658 break;
1659 case 32 ... 62:
1660 d.ll = tmp;
1661 env->fir[n - 32] = d.d;
1662 break;
1663 case 63:
1664 cpu_alpha_store_fpcr(env, tmp);
1665 break;
1666 case 64:
1667 env->pc = tmp;
1668 break;
1669 case 66:
1670 env->unique = tmp;
1671 break;
1672 case 31:
1673 case 65:
1674 /* 31 really is the zero register; 65 is unassigned in the
1675 gdb protocol, but is still required to occupy 8 bytes. */
1676 break;
1677 default:
1678 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001679 }
aurel3219bf5172008-12-07 23:26:32 +00001680 return 8;
1681}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001682#elif defined (TARGET_S390X)
1683
Richard Henderson6ee77b12012-08-23 10:44:45 -07001684#define NUM_CORE_REGS S390_NUM_REGS
Alexander Grafafcb0e42009-12-05 12:44:29 +01001685
Andreas Färberf3840912012-02-20 06:44:56 +01001686static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001687{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001688 uint64_t val;
1689 int cc_op;
1690
Alexander Grafafcb0e42009-12-05 12:44:29 +01001691 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001692 case S390_PSWM_REGNUM:
1693 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1694 val = deposit64(env->psw.mask, 44, 2, cc_op);
1695 GET_REGL(val);
1696 break;
1697 case S390_PSWA_REGNUM:
1698 GET_REGL(env->psw.addr);
1699 break;
1700 case S390_R0_REGNUM ... S390_R15_REGNUM:
1701 GET_REGL(env->regs[n-S390_R0_REGNUM]);
1702 break;
1703 case S390_A0_REGNUM ... S390_A15_REGNUM:
1704 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
1705 break;
1706 case S390_FPC_REGNUM:
1707 GET_REG32(env->fpc);
1708 break;
1709 case S390_F0_REGNUM ... S390_F15_REGNUM:
1710 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
1711 break;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001712 }
1713
1714 return 0;
1715}
1716
Andreas Färberf3840912012-02-20 06:44:56 +01001717static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001718{
1719 target_ulong tmpl;
1720 uint32_t tmp32;
1721 int r = 8;
1722 tmpl = ldtul_p(mem_buf);
1723 tmp32 = ldl_p(mem_buf);
1724
1725 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001726 case S390_PSWM_REGNUM:
1727 env->psw.mask = tmpl;
1728 env->cc_op = extract64(tmpl, 44, 2);
1729 break;
1730 case S390_PSWA_REGNUM:
1731 env->psw.addr = tmpl;
1732 break;
1733 case S390_R0_REGNUM ... S390_R15_REGNUM:
1734 env->regs[n-S390_R0_REGNUM] = tmpl;
1735 break;
1736 case S390_A0_REGNUM ... S390_A15_REGNUM:
1737 env->aregs[n-S390_A0_REGNUM] = tmp32;
1738 r = 4;
1739 break;
1740 case S390_FPC_REGNUM:
1741 env->fpc = tmp32;
1742 r = 4;
1743 break;
1744 case S390_F0_REGNUM ... S390_F15_REGNUM:
1745 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1746 break;
1747 default:
1748 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001749 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001750 return r;
1751}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001752#elif defined (TARGET_LM32)
1753
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001754#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001755#define NUM_CORE_REGS (32 + 7)
1756
Andreas Färberf3840912012-02-20 06:44:56 +01001757static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001758{
1759 if (n < 32) {
1760 GET_REG32(env->regs[n]);
1761 } else {
1762 switch (n) {
1763 case 32:
1764 GET_REG32(env->pc);
1765 break;
1766 /* FIXME: put in right exception ID */
1767 case 33:
1768 GET_REG32(0);
1769 break;
1770 case 34:
1771 GET_REG32(env->eba);
1772 break;
1773 case 35:
1774 GET_REG32(env->deba);
1775 break;
1776 case 36:
1777 GET_REG32(env->ie);
1778 break;
1779 case 37:
1780 GET_REG32(lm32_pic_get_im(env->pic_state));
1781 break;
1782 case 38:
1783 GET_REG32(lm32_pic_get_ip(env->pic_state));
1784 break;
1785 }
1786 }
1787 return 0;
1788}
1789
Andreas Färberf3840912012-02-20 06:44:56 +01001790static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001791{
1792 uint32_t tmp;
1793
1794 if (n > NUM_CORE_REGS) {
1795 return 0;
1796 }
1797
1798 tmp = ldl_p(mem_buf);
1799
1800 if (n < 32) {
1801 env->regs[n] = tmp;
1802 } else {
1803 switch (n) {
1804 case 32:
1805 env->pc = tmp;
1806 break;
1807 case 34:
1808 env->eba = tmp;
1809 break;
1810 case 35:
1811 env->deba = tmp;
1812 break;
1813 case 36:
1814 env->ie = tmp;
1815 break;
1816 case 37:
1817 lm32_pic_set_im(env->pic_state, tmp);
1818 break;
1819 case 38:
1820 lm32_pic_set_ip(env->pic_state, tmp);
1821 break;
1822 }
1823 }
1824 return 4;
1825}
Max Filippovccfcaba2011-09-06 03:55:52 +04001826#elif defined(TARGET_XTENSA)
1827
1828/* Use num_core_regs to see only non-privileged registers in an unmodified gdb.
1829 * Use num_regs to see all registers. gdb modification is required for that:
1830 * reset bit 0 in the 'flags' field of the registers definitions in the
1831 * gdb/xtensa-config.c inside gdb source tree or inside gdb overlay.
1832 */
1833#define NUM_CORE_REGS (env->config->gdb_regmap.num_regs)
1834#define num_g_regs NUM_CORE_REGS
1835
Andreas Färberf3840912012-02-20 06:44:56 +01001836static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001837{
1838 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1839
1840 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1841 return 0;
1842 }
1843
1844 switch (reg->type) {
1845 case 9: /*pc*/
1846 GET_REG32(env->pc);
1847 break;
1848
1849 case 1: /*ar*/
1850 xtensa_sync_phys_from_window(env);
1851 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
1852 break;
1853
1854 case 2: /*SR*/
1855 GET_REG32(env->sregs[reg->targno & 0xff]);
1856 break;
1857
1858 case 3: /*UR*/
1859 GET_REG32(env->uregs[reg->targno & 0xff]);
1860 break;
1861
Max Filippovdd519cb2012-09-19 04:23:54 +04001862 case 4: /*f*/
1863 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
1864 break;
1865
Max Filippovccfcaba2011-09-06 03:55:52 +04001866 case 8: /*a*/
1867 GET_REG32(env->regs[reg->targno & 0x0f]);
1868 break;
1869
1870 default:
1871 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001872 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001873 return 0;
1874 }
1875}
1876
Andreas Färberf3840912012-02-20 06:44:56 +01001877static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001878{
1879 uint32_t tmp;
1880 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1881
1882 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1883 return 0;
1884 }
1885
1886 tmp = ldl_p(mem_buf);
1887
1888 switch (reg->type) {
1889 case 9: /*pc*/
1890 env->pc = tmp;
1891 break;
1892
1893 case 1: /*ar*/
1894 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1895 xtensa_sync_window_from_phys(env);
1896 break;
1897
1898 case 2: /*SR*/
1899 env->sregs[reg->targno & 0xff] = tmp;
1900 break;
1901
1902 case 3: /*UR*/
1903 env->uregs[reg->targno & 0xff] = tmp;
1904 break;
1905
Max Filippovdd519cb2012-09-19 04:23:54 +04001906 case 4: /*f*/
1907 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1908 break;
1909
Max Filippovccfcaba2011-09-06 03:55:52 +04001910 case 8: /*a*/
1911 env->regs[reg->targno & 0x0f] = tmp;
1912 break;
1913
1914 default:
1915 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001916 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001917 return 0;
1918 }
1919
1920 return 4;
1921}
bellard1fddef42005-04-17 19:16:13 +00001922#else
pbrook56aebc82008-10-11 17:55:29 +00001923
1924#define NUM_CORE_REGS 0
1925
Andreas Färber9349b4f2012-03-14 01:38:32 +01001926static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001927{
1928 return 0;
1929}
1930
Andreas Färber9349b4f2012-03-14 01:38:32 +01001931static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001932{
pbrook56aebc82008-10-11 17:55:29 +00001933 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001934}
1935
1936#endif
bellardb4608c02003-06-27 17:34:32 +00001937
Max Filippovccfcaba2011-09-06 03:55:52 +04001938#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001939static int num_g_regs = NUM_CORE_REGS;
Max Filippovccfcaba2011-09-06 03:55:52 +04001940#endif
pbrook56aebc82008-10-11 17:55:29 +00001941
1942#ifdef GDB_CORE_XML
1943/* Encode data using the encoding for 'x' packets. */
1944static int memtox(char *buf, const char *mem, int len)
1945{
1946 char *p = buf;
1947 char c;
1948
1949 while (len--) {
1950 c = *(mem++);
1951 switch (c) {
1952 case '#': case '$': case '*': case '}':
1953 *(p++) = '}';
1954 *(p++) = c ^ 0x20;
1955 break;
1956 default:
1957 *(p++) = c;
1958 break;
1959 }
1960 }
1961 return p - buf;
1962}
1963
aurel323faf7782008-12-07 23:26:17 +00001964static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001965{
pbrook56aebc82008-10-11 17:55:29 +00001966 size_t len;
1967 int i;
1968 const char *name;
1969 static char target_xml[1024];
1970
1971 len = 0;
1972 while (p[len] && p[len] != ':')
1973 len++;
1974 *newp = p + len;
1975
1976 name = NULL;
1977 if (strncmp(p, "target.xml", len) == 0) {
1978 /* Generate the XML description for this CPU. */
1979 if (!target_xml[0]) {
1980 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001981 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001982
blueswir15b3715b2008-10-25 11:18:12 +00001983 snprintf(target_xml, sizeof(target_xml),
1984 "<?xml version=\"1.0\"?>"
1985 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1986 "<target>"
1987 "<xi:include href=\"%s\"/>",
1988 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001989
Andreas Färbereac8b352013-06-28 21:11:37 +02001990 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001991 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1992 pstrcat(target_xml, sizeof(target_xml), r->xml);
1993 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001994 }
blueswir12dc766d2009-04-13 16:06:19 +00001995 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001996 }
1997 return target_xml;
1998 }
1999 for (i = 0; ; i++) {
2000 name = xml_builtin[i][0];
2001 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
2002 break;
2003 }
2004 return name ? xml_builtin[i][1] : NULL;
2005}
2006#endif
2007
Andreas Färber385b9f02013-06-27 18:25:36 +02002008static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00002009{
Andreas Färber385b9f02013-06-27 18:25:36 +02002010 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00002011 GDBRegisterState *r;
2012
2013 if (reg < NUM_CORE_REGS)
2014 return cpu_gdb_read_register(env, mem_buf, reg);
2015
Andreas Färbereac8b352013-06-28 21:11:37 +02002016 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00002017 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
2018 return r->get_reg(env, mem_buf, reg - r->base_reg);
2019 }
2020 }
2021 return 0;
2022}
2023
Andreas Färber385b9f02013-06-27 18:25:36 +02002024static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00002025{
Andreas Färber385b9f02013-06-27 18:25:36 +02002026 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00002027 GDBRegisterState *r;
2028
2029 if (reg < NUM_CORE_REGS)
2030 return cpu_gdb_write_register(env, mem_buf, reg);
2031
Andreas Färbereac8b352013-06-28 21:11:37 +02002032 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00002033 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
2034 return r->set_reg(env, mem_buf, reg - r->base_reg);
2035 }
2036 }
2037 return 0;
2038}
2039
Max Filippovccfcaba2011-09-06 03:55:52 +04002040#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00002041/* Register a supplemental set of CPU registers. If g_pos is nonzero it
2042 specifies the first register number and these registers are included in
2043 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
2044 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
2045 */
2046
Andreas Färber22169d42013-06-28 21:27:39 +02002047void gdb_register_coprocessor(CPUState *cpu,
2048 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
2049 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00002050{
2051 GDBRegisterState *s;
2052 GDBRegisterState **p;
2053 static int last_reg = NUM_CORE_REGS;
2054
Andreas Färbereac8b352013-06-28 21:11:37 +02002055 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00002056 while (*p) {
2057 /* Check for duplicates. */
2058 if (strcmp((*p)->xml, xml) == 0)
2059 return;
2060 p = &(*p)->next;
2061 }
Stefan Weil9643c252011-10-18 22:25:38 +02002062
2063 s = g_new0(GDBRegisterState, 1);
2064 s->base_reg = last_reg;
2065 s->num_regs = num_regs;
2066 s->get_reg = get_reg;
2067 s->set_reg = set_reg;
2068 s->xml = xml;
2069
pbrook56aebc82008-10-11 17:55:29 +00002070 /* Add to end of list. */
2071 last_reg += num_regs;
2072 *p = s;
2073 if (g_pos) {
2074 if (g_pos != s->base_reg) {
2075 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
2076 "Expected %d got %d\n", xml, g_pos, s->base_reg);
2077 } else {
2078 num_g_regs = last_reg;
2079 }
2080 }
2081}
Max Filippovccfcaba2011-09-06 03:55:52 +04002082#endif
pbrook56aebc82008-10-11 17:55:29 +00002083
aliguoria1d1bb32008-11-18 20:07:32 +00002084#ifndef CONFIG_USER_ONLY
2085static const int xlat_gdb_type[] = {
2086 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
2087 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
2088 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
2089};
2090#endif
2091
aliguori880a7572008-11-18 20:30:24 +00002092static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00002093{
Andreas Färber182735e2013-05-29 22:29:20 +02002094 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002095 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002096 int err = 0;
2097
Andreas Färber62278812013-06-27 17:12:06 +02002098 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002099 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02002100 }
aliguorie22a25c2009-03-12 20:12:48 +00002101
aliguoria1d1bb32008-11-18 20:07:32 +00002102 switch (type) {
2103 case GDB_BREAKPOINT_SW:
2104 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02002105 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2106 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002107 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
2108 if (err)
2109 break;
2110 }
2111 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002112#ifndef CONFIG_USER_ONLY
2113 case GDB_WATCHPOINT_WRITE:
2114 case GDB_WATCHPOINT_READ:
2115 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02002116 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2117 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002118 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
2119 NULL);
2120 if (err)
2121 break;
2122 }
2123 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002124#endif
2125 default:
2126 return -ENOSYS;
2127 }
2128}
2129
aliguori880a7572008-11-18 20:30:24 +00002130static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00002131{
Andreas Färber182735e2013-05-29 22:29:20 +02002132 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002133 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002134 int err = 0;
2135
Andreas Färber62278812013-06-27 17:12:06 +02002136 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002137 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02002138 }
aliguorie22a25c2009-03-12 20:12:48 +00002139
aliguoria1d1bb32008-11-18 20:07:32 +00002140 switch (type) {
2141 case GDB_BREAKPOINT_SW:
2142 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02002143 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2144 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002145 err = cpu_breakpoint_remove(env, addr, BP_GDB);
2146 if (err)
2147 break;
2148 }
2149 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002150#ifndef CONFIG_USER_ONLY
2151 case GDB_WATCHPOINT_WRITE:
2152 case GDB_WATCHPOINT_READ:
2153 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02002154 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2155 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002156 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
2157 if (err)
2158 break;
2159 }
2160 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002161#endif
2162 default:
2163 return -ENOSYS;
2164 }
2165}
2166
aliguori880a7572008-11-18 20:30:24 +00002167static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00002168{
Andreas Färber182735e2013-05-29 22:29:20 +02002169 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002170 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002171
aliguorie22a25c2009-03-12 20:12:48 +00002172 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002173 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00002174 return;
2175 }
2176
Andreas Färber182735e2013-05-29 22:29:20 +02002177 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2178 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002179 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002180#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00002181 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002182#endif
aliguori880a7572008-11-18 20:30:24 +00002183 }
aliguoria1d1bb32008-11-18 20:07:32 +00002184}
2185
aurel32fab9d282009-04-08 21:29:37 +00002186static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
2187{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002188 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02002189 CPUClass *cc = CPU_GET_CLASS(cpu);
2190
2191 cpu_synchronize_state(cpu);
2192 if (cc->set_pc) {
2193 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08002194 }
aurel32fab9d282009-04-08 21:29:37 +00002195}
2196
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002197static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002198{
Andreas Färber0d342822012-12-17 07:12:13 +01002199 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002200
Andreas Färber182735e2013-05-29 22:29:20 +02002201 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02002202 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002203 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02002204 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002205 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02002206
2207 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002208}
2209
aliguori880a7572008-11-18 20:30:24 +00002210static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00002211{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002212#ifdef TARGET_XTENSA
Andreas Färber9349b4f2012-03-14 01:38:32 +01002213 CPUArchState *env;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002214#endif
2215 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00002216 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002217 uint32_t thread;
2218 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00002219 char buf[MAX_PACKET_LENGTH];
2220 uint8_t mem_buf[MAX_PACKET_LENGTH];
2221 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00002222 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00002223
bellard858693c2004-03-31 18:52:07 +00002224#ifdef DEBUG_GDB
2225 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00002226#endif
bellard858693c2004-03-31 18:52:07 +00002227 p = line_buf;
2228 ch = *p++;
2229 switch(ch) {
2230 case '?':
bellard1fddef42005-04-17 19:16:13 +00002231 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00002232 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002233 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00002234 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00002235 /* Remove all the breakpoints when this query is issued,
2236 * because gdb is doing and initial connect and the state
2237 * should be cleaned up.
2238 */
aliguori880a7572008-11-18 20:30:24 +00002239 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00002240 break;
2241 case 'c':
2242 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00002243 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002244 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002245 }
aurel32ca587a82008-12-18 22:44:13 +00002246 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00002247 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002248 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00002249 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00002250 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2251 if (s->signal == -1)
2252 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00002253 gdb_continue(s);
2254 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002255 case 'v':
2256 if (strncmp(p, "Cont", 4) == 0) {
2257 int res_signal, res_thread;
2258
2259 p += 4;
2260 if (*p == '?') {
2261 put_packet(s, "vCont;c;C;s;S");
2262 break;
2263 }
2264 res = 0;
2265 res_signal = 0;
2266 res_thread = 0;
2267 while (*p) {
2268 int action, signal;
2269
2270 if (*p++ != ';') {
2271 res = 0;
2272 break;
2273 }
2274 action = *p++;
2275 signal = 0;
2276 if (action == 'C' || action == 'S') {
2277 signal = strtoul(p, (char **)&p, 16);
2278 } else if (action != 'c' && action != 's') {
2279 res = 0;
2280 break;
2281 }
2282 thread = 0;
2283 if (*p == ':') {
2284 thread = strtoull(p+1, (char **)&p, 16);
2285 }
2286 action = tolower(action);
2287 if (res == 0 || (res == 'c' && action == 's')) {
2288 res = action;
2289 res_signal = signal;
2290 res_thread = thread;
2291 }
2292 }
2293 if (res) {
2294 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002295 cpu = find_cpu(res_thread);
2296 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002297 put_packet(s, "E22");
2298 break;
2299 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002300 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002301 }
2302 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002303 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002304 }
2305 s->signal = res_signal;
2306 gdb_continue(s);
2307 return RS_IDLE;
2308 }
2309 break;
2310 } else {
2311 goto unknown_command;
2312 }
edgar_igl7d03f822008-05-17 18:58:29 +00002313 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002314#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002315 /* Kill the target */
2316 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2317 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002318#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002319 case 'D':
2320 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002321 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002322 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002323 gdb_continue(s);
2324 put_packet(s, "OK");
2325 break;
bellard858693c2004-03-31 18:52:07 +00002326 case 's':
2327 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002328 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002329 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002330 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002331 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002332 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002333 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002334 case 'F':
2335 {
2336 target_ulong ret;
2337 target_ulong err;
2338
2339 ret = strtoull(p, (char **)&p, 16);
2340 if (*p == ',') {
2341 p++;
2342 err = strtoull(p, (char **)&p, 16);
2343 } else {
2344 err = 0;
2345 }
2346 if (*p == ',')
2347 p++;
2348 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002349 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002350 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00002351 s->current_syscall_cb = NULL;
2352 }
pbrooka2d1eba2007-01-28 03:10:55 +00002353 if (type == 'C') {
2354 put_packet(s, "T02");
2355 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002356 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002357 }
2358 }
2359 break;
bellard858693c2004-03-31 18:52:07 +00002360 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002361 cpu_synchronize_state(s->g_cpu);
2362#ifdef TARGET_XTENSA
2363 env = s->g_cpu->env_ptr;
2364#endif
pbrook56aebc82008-10-11 17:55:29 +00002365 len = 0;
2366 for (addr = 0; addr < num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002367 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002368 len += reg_size;
2369 }
2370 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002371 put_packet(s, buf);
2372 break;
2373 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002374 cpu_synchronize_state(s->g_cpu);
2375#ifdef TARGET_XTENSA
2376 env = s->g_cpu->env_ptr;
2377#endif
pbrook56aebc82008-10-11 17:55:29 +00002378 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002379 len = strlen(p) / 2;
2380 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00002381 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002382 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002383 len -= reg_size;
2384 registers += reg_size;
2385 }
bellard858693c2004-03-31 18:52:07 +00002386 put_packet(s, "OK");
2387 break;
2388 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002389 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002390 if (*p == ',')
2391 p++;
bellard9d9754a2006-06-25 15:32:37 +00002392 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002393 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002394 put_packet (s, "E14");
2395 } else {
2396 memtohex(buf, mem_buf, len);
2397 put_packet(s, buf);
2398 }
bellard858693c2004-03-31 18:52:07 +00002399 break;
2400 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002401 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002402 if (*p == ',')
2403 p++;
bellard9d9754a2006-06-25 15:32:37 +00002404 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002405 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002406 p++;
2407 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002408 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02002409 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002410 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002411 } else {
bellard858693c2004-03-31 18:52:07 +00002412 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002413 }
bellard858693c2004-03-31 18:52:07 +00002414 break;
pbrook56aebc82008-10-11 17:55:29 +00002415 case 'p':
2416 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2417 This works, but can be very slow. Anything new enough to
2418 understand XML also knows how to use this properly. */
2419 if (!gdb_has_xml)
2420 goto unknown_command;
2421 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002422 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002423 if (reg_size) {
2424 memtohex(buf, mem_buf, reg_size);
2425 put_packet(s, buf);
2426 } else {
2427 put_packet(s, "E14");
2428 }
2429 break;
2430 case 'P':
2431 if (!gdb_has_xml)
2432 goto unknown_command;
2433 addr = strtoull(p, (char **)&p, 16);
2434 if (*p == '=')
2435 p++;
2436 reg_size = strlen(p) / 2;
2437 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002438 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002439 put_packet(s, "OK");
2440 break;
bellard858693c2004-03-31 18:52:07 +00002441 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002442 case 'z':
2443 type = strtoul(p, (char **)&p, 16);
2444 if (*p == ',')
2445 p++;
bellard9d9754a2006-06-25 15:32:37 +00002446 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002447 if (*p == ',')
2448 p++;
bellard9d9754a2006-06-25 15:32:37 +00002449 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002450 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002451 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002452 else
aliguori880a7572008-11-18 20:30:24 +00002453 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002454 if (res >= 0)
2455 put_packet(s, "OK");
2456 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002457 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002458 else
2459 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002460 break;
aliguori880a7572008-11-18 20:30:24 +00002461 case 'H':
2462 type = *p++;
2463 thread = strtoull(p, (char **)&p, 16);
2464 if (thread == -1 || thread == 0) {
2465 put_packet(s, "OK");
2466 break;
2467 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002468 cpu = find_cpu(thread);
2469 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00002470 put_packet(s, "E22");
2471 break;
2472 }
2473 switch (type) {
2474 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002475 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002476 put_packet(s, "OK");
2477 break;
2478 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002479 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002480 put_packet(s, "OK");
2481 break;
2482 default:
2483 put_packet(s, "E22");
2484 break;
2485 }
2486 break;
2487 case 'T':
2488 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002489 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002490
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002491 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002492 put_packet(s, "OK");
2493 } else {
aliguori880a7572008-11-18 20:30:24 +00002494 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002495 }
aliguori880a7572008-11-18 20:30:24 +00002496 break;
pbrook978efd62006-06-17 18:30:42 +00002497 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002498 case 'Q':
2499 /* parse any 'q' packets here */
2500 if (!strcmp(p,"qemu.sstepbits")) {
2501 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002502 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2503 SSTEP_ENABLE,
2504 SSTEP_NOIRQ,
2505 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002506 put_packet(s, buf);
2507 break;
2508 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2509 /* Display or change the sstep_flags */
2510 p += 10;
2511 if (*p != '=') {
2512 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002513 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002514 put_packet(s, buf);
2515 break;
2516 }
2517 p++;
2518 type = strtoul(p, (char **)&p, 16);
2519 sstep_flags = type;
2520 put_packet(s, "OK");
2521 break;
aliguori880a7572008-11-18 20:30:24 +00002522 } else if (strcmp(p,"C") == 0) {
2523 /* "Current thread" remains vague in the spec, so always return
2524 * the first CPU (gdb returns the first thread). */
2525 put_packet(s, "QC1");
2526 break;
2527 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02002528 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00002529 goto report_cpuinfo;
2530 } else if (strcmp(p,"sThreadInfo") == 0) {
2531 report_cpuinfo:
2532 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02002533 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00002534 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02002535 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00002536 } else
2537 put_packet(s, "l");
2538 break;
2539 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2540 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002541 cpu = find_cpu(thread);
2542 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02002543 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002544 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01002545 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01002546 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002547 memtohex(buf, mem_buf, len);
2548 put_packet(s, buf);
2549 }
aliguori880a7572008-11-18 20:30:24 +00002550 break;
edgar_igl60897d32008-05-09 08:25:14 +00002551 }
blueswir10b8a9882009-03-07 10:51:36 +00002552#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002553 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002554 CPUArchState *env = s->c_cpu->env_ptr;
2555 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00002556
blueswir1363a37d2008-08-21 17:58:08 +00002557 snprintf(buf, sizeof(buf),
2558 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2559 ";Bss=" TARGET_ABI_FMT_lx,
2560 ts->info->code_offset,
2561 ts->info->data_offset,
2562 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002563 put_packet(s, buf);
2564 break;
2565 }
blueswir10b8a9882009-03-07 10:51:36 +00002566#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002567 else if (strncmp(p, "Rcmd,", 5) == 0) {
2568 int len = strlen(p + 5);
2569
2570 if ((len % 2) != 0) {
2571 put_packet(s, "E01");
2572 break;
2573 }
2574 hextomem(mem_buf, p + 5, len);
2575 len = len / 2;
2576 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002577 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002578 put_packet(s, "OK");
2579 break;
2580 }
blueswir10b8a9882009-03-07 10:51:36 +00002581#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002582 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002583 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002584#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002585 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002586#endif
2587 put_packet(s, buf);
2588 break;
2589 }
2590#ifdef GDB_CORE_XML
2591 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2592 const char *xml;
2593 target_ulong total_len;
2594
2595 gdb_has_xml = 1;
2596 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002597 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002598 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002599 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002600 put_packet(s, buf);
2601 break;
2602 }
2603
2604 if (*p == ':')
2605 p++;
2606 addr = strtoul(p, (char **)&p, 16);
2607 if (*p == ',')
2608 p++;
2609 len = strtoul(p, (char **)&p, 16);
2610
2611 total_len = strlen(xml);
2612 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002613 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002614 put_packet(s, buf);
2615 break;
2616 }
2617 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2618 len = (MAX_PACKET_LENGTH - 5) / 2;
2619 if (len < total_len - addr) {
2620 buf[0] = 'm';
2621 len = memtox(buf + 1, xml + addr, len);
2622 } else {
2623 buf[0] = 'l';
2624 len = memtox(buf + 1, xml + addr, total_len - addr);
2625 }
2626 put_packet_binary(s, buf, len + 1);
2627 break;
2628 }
2629#endif
2630 /* Unrecognised 'q' command. */
2631 goto unknown_command;
2632
bellard858693c2004-03-31 18:52:07 +00002633 default:
pbrook56aebc82008-10-11 17:55:29 +00002634 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002635 /* put empty packet */
2636 buf[0] = '\0';
2637 put_packet(s, buf);
2638 break;
2639 }
2640 return RS_IDLE;
2641}
2642
Andreas Färber64f6b342013-05-27 02:06:09 +02002643void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00002644{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002645 gdbserver_state->c_cpu = cpu;
2646 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002647}
2648
bellard1fddef42005-04-17 19:16:13 +00002649#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002650static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002651{
aliguori880a7572008-11-18 20:30:24 +00002652 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002653 CPUArchState *env = s->c_cpu->env_ptr;
2654 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002655 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002656 const char *type;
bellard858693c2004-03-31 18:52:07 +00002657 int ret;
2658
Meador Ingecdb432b2012-03-15 17:49:45 +00002659 if (running || s->state == RS_INACTIVE) {
2660 return;
2661 }
2662 /* Is there a GDB syscall waiting to be sent? */
2663 if (s->current_syscall_cb) {
2664 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002665 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002666 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002667 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002668 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002669 if (env->watchpoint_hit) {
2670 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002671 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002672 type = "r";
2673 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002674 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002675 type = "a";
2676 break;
2677 default:
2678 type = "";
2679 break;
2680 }
aliguori880a7572008-11-18 20:30:24 +00002681 snprintf(buf, sizeof(buf),
2682 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002683 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002684 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002685 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002686 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002687 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002688 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002689 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002690 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002691 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002692 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002693 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002694 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002695 ret = GDB_SIGNAL_QUIT;
2696 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002697 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002698 ret = GDB_SIGNAL_IO;
2699 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002700 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002701 ret = GDB_SIGNAL_ALRM;
2702 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002703 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002704 ret = GDB_SIGNAL_ABRT;
2705 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002706 case RUN_STATE_SAVE_VM:
2707 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002708 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002709 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002710 ret = GDB_SIGNAL_XCPU;
2711 break;
2712 default:
2713 ret = GDB_SIGNAL_UNKNOWN;
2714 break;
bellardbbeb7b52006-04-23 18:42:15 +00002715 }
Andreas Färber0d342822012-12-17 07:12:13 +01002716 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002717
2718send_packet:
bellard858693c2004-03-31 18:52:07 +00002719 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002720
2721 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002722 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002723}
bellard1fddef42005-04-17 19:16:13 +00002724#endif
bellard858693c2004-03-31 18:52:07 +00002725
pbrooka2d1eba2007-01-28 03:10:55 +00002726/* Send a gdb syscall request.
2727 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002728 %x - target_ulong argument printed in hex.
2729 %lx - 64-bit argument printed in hex.
2730 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002731void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002732{
2733 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002734 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002735 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002736 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002737 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002738 GDBState *s;
2739
aliguori880a7572008-11-18 20:30:24 +00002740 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002741 if (!s)
2742 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002743 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002744#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002745 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002746#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002747 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002748 p = s->syscall_buf;
2749 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002750 *(p++) = 'F';
2751 while (*fmt) {
2752 if (*fmt == '%') {
2753 fmt++;
2754 switch (*fmt++) {
2755 case 'x':
2756 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002757 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002758 break;
pbrooka87295e2007-05-26 15:09:38 +00002759 case 'l':
2760 if (*(fmt++) != 'x')
2761 goto bad_format;
2762 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002763 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002764 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002765 case 's':
2766 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002767 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002768 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002769 break;
2770 default:
pbrooka87295e2007-05-26 15:09:38 +00002771 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002772 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2773 fmt - 1);
2774 break;
2775 }
2776 } else {
2777 *(p++) = *(fmt++);
2778 }
2779 }
pbrook8a93e022007-08-06 13:19:15 +00002780 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002781 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002782#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002783 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002784 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002785#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002786 /* In this case wait to send the syscall packet until notification that
2787 the CPU has stopped. This must be done because if the packet is sent
2788 now the reply from the syscall request could be received while the CPU
2789 is still in the running state, which can cause packets to be dropped
2790 and state transition 'T' packets to be sent while the syscall is still
2791 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002792 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002793#endif
2794}
2795
bellard6a00d602005-11-21 23:25:50 +00002796static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002797{
2798 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002799 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002800
bellard1fddef42005-04-17 19:16:13 +00002801#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002802 if (s->last_packet_len) {
2803 /* Waiting for a response to the last packet. If we see the start
2804 of a new command then abandon the previous response. */
2805 if (ch == '-') {
2806#ifdef DEBUG_GDB
2807 printf("Got NACK, retransmitting\n");
2808#endif
thsffe8ab82007-12-16 03:16:05 +00002809 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002810 }
2811#ifdef DEBUG_GDB
2812 else if (ch == '+')
2813 printf("Got ACK\n");
2814 else
2815 printf("Got '%c' when expecting ACK/NACK\n", ch);
2816#endif
2817 if (ch == '+' || ch == '$')
2818 s->last_packet_len = 0;
2819 if (ch != '$')
2820 return;
2821 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002822 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002823 /* when the CPU is running, we cannot do anything except stop
2824 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002825 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002826 } else
bellard1fddef42005-04-17 19:16:13 +00002827#endif
bellard41625032005-04-24 10:07:11 +00002828 {
bellard858693c2004-03-31 18:52:07 +00002829 switch(s->state) {
2830 case RS_IDLE:
2831 if (ch == '$') {
2832 s->line_buf_index = 0;
2833 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002834 }
2835 break;
bellard858693c2004-03-31 18:52:07 +00002836 case RS_GETLINE:
2837 if (ch == '#') {
2838 s->state = RS_CHKSUM1;
2839 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2840 s->state = RS_IDLE;
2841 } else {
2842 s->line_buf[s->line_buf_index++] = ch;
2843 }
2844 break;
2845 case RS_CHKSUM1:
2846 s->line_buf[s->line_buf_index] = '\0';
2847 s->line_csum = fromhex(ch) << 4;
2848 s->state = RS_CHKSUM2;
2849 break;
2850 case RS_CHKSUM2:
2851 s->line_csum |= fromhex(ch);
2852 csum = 0;
2853 for(i = 0; i < s->line_buf_index; i++) {
2854 csum += s->line_buf[i];
2855 }
2856 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002857 reply = '-';
2858 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002859 s->state = RS_IDLE;
2860 } else {
ths60fe76f2007-12-16 03:02:09 +00002861 reply = '+';
2862 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002863 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002864 }
bellardb4608c02003-06-27 17:34:32 +00002865 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002866 default:
2867 abort();
bellardb4608c02003-06-27 17:34:32 +00002868 }
2869 }
bellard858693c2004-03-31 18:52:07 +00002870}
2871
Paul Brook0e1c9c52010-06-16 13:03:51 +01002872/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002873void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002874{
2875 GDBState *s;
2876 char buf[4];
2877
2878 s = gdbserver_state;
2879 if (!s) {
2880 return;
2881 }
2882#ifdef CONFIG_USER_ONLY
2883 if (gdbserver_fd < 0 || s->fd < 0) {
2884 return;
2885 }
2886#endif
2887
2888 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2889 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002890
2891#ifndef CONFIG_USER_ONLY
2892 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002893 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002894 }
2895#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002896}
2897
bellard1fddef42005-04-17 19:16:13 +00002898#ifdef CONFIG_USER_ONLY
2899int
aurel32ca587a82008-12-18 22:44:13 +00002900gdb_queuesig (void)
2901{
2902 GDBState *s;
2903
2904 s = gdbserver_state;
2905
2906 if (gdbserver_fd < 0 || s->fd < 0)
2907 return 0;
2908 else
2909 return 1;
2910}
2911
2912int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002913gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002914{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002915 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002916 GDBState *s;
2917 char buf[256];
2918 int n;
bellard1fddef42005-04-17 19:16:13 +00002919
Andreas Färber5ca666c2013-06-24 19:20:57 +02002920 s = gdbserver_state;
2921 if (gdbserver_fd < 0 || s->fd < 0) {
2922 return sig;
bellard1fddef42005-04-17 19:16:13 +00002923 }
2924
Andreas Färber5ca666c2013-06-24 19:20:57 +02002925 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002926 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002927 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002928
Andreas Färber5ca666c2013-06-24 19:20:57 +02002929 if (sig != 0) {
2930 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2931 put_packet(s, buf);
2932 }
2933 /* put_packet() might have detected that the peer terminated the
2934 connection. */
2935 if (s->fd < 0) {
2936 return sig;
2937 }
2938
2939 sig = 0;
2940 s->state = RS_IDLE;
2941 s->running_state = 0;
2942 while (s->running_state == 0) {
2943 n = read(s->fd, buf, 256);
2944 if (n > 0) {
2945 int i;
2946
2947 for (i = 0; i < n; i++) {
2948 gdb_read_byte(s, buf[i]);
2949 }
2950 } else if (n == 0 || errno != EAGAIN) {
2951 /* XXX: Connection closed. Should probably wait for another
2952 connection before continuing. */
2953 return sig;
bellard1fddef42005-04-17 19:16:13 +00002954 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002955 }
2956 sig = s->signal;
2957 s->signal = 0;
2958 return sig;
bellard1fddef42005-04-17 19:16:13 +00002959}
bellarde9009672005-04-26 20:42:36 +00002960
aurel32ca587a82008-12-18 22:44:13 +00002961/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002962void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002963{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002964 GDBState *s;
2965 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002966
Andreas Färber5ca666c2013-06-24 19:20:57 +02002967 s = gdbserver_state;
2968 if (gdbserver_fd < 0 || s->fd < 0) {
2969 return;
2970 }
aurel32ca587a82008-12-18 22:44:13 +00002971
Andreas Färber5ca666c2013-06-24 19:20:57 +02002972 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2973 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002974}
bellard1fddef42005-04-17 19:16:13 +00002975
aliguori880a7572008-11-18 20:30:24 +00002976static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002977{
2978 GDBState *s;
2979 struct sockaddr_in sockaddr;
2980 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002981 int fd;
bellard858693c2004-03-31 18:52:07 +00002982
2983 for(;;) {
2984 len = sizeof(sockaddr);
2985 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2986 if (fd < 0 && errno != EINTR) {
2987 perror("accept");
2988 return;
2989 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002990#ifndef _WIN32
2991 fcntl(fd, F_SETFD, FD_CLOEXEC);
2992#endif
bellard858693c2004-03-31 18:52:07 +00002993 break;
2994 }
2995 }
2996
2997 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002998 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002999
Anthony Liguori7267c092011-08-20 22:09:37 -05003000 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02003001 s->c_cpu = first_cpu;
3002 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00003003 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00003004 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00003005
aliguori880a7572008-11-18 20:30:24 +00003006 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00003007
bellard858693c2004-03-31 18:52:07 +00003008 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00003009}
3010
3011static int gdbserver_open(int port)
3012{
3013 struct sockaddr_in sockaddr;
3014 int fd, val, ret;
3015
3016 fd = socket(PF_INET, SOCK_STREAM, 0);
3017 if (fd < 0) {
3018 perror("socket");
3019 return -1;
3020 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01003021#ifndef _WIN32
3022 fcntl(fd, F_SETFD, FD_CLOEXEC);
3023#endif
bellard858693c2004-03-31 18:52:07 +00003024
3025 /* allow fast reuse */
3026 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01003027 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00003028
3029 sockaddr.sin_family = AF_INET;
3030 sockaddr.sin_port = htons(port);
3031 sockaddr.sin_addr.s_addr = 0;
3032 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
3033 if (ret < 0) {
3034 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00003035 close(fd);
bellard858693c2004-03-31 18:52:07 +00003036 return -1;
3037 }
3038 ret = listen(fd, 0);
3039 if (ret < 0) {
3040 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00003041 close(fd);
bellard858693c2004-03-31 18:52:07 +00003042 return -1;
3043 }
bellard858693c2004-03-31 18:52:07 +00003044 return fd;
3045}
3046
3047int gdbserver_start(int port)
3048{
3049 gdbserver_fd = gdbserver_open(port);
3050 if (gdbserver_fd < 0)
3051 return -1;
3052 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00003053 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00003054 return 0;
3055}
aurel322b1319c2008-12-18 22:44:04 +00003056
3057/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01003058void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00003059{
3060 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00003061 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00003062 return;
3063 close(s->fd);
3064 s->fd = -1;
3065 cpu_breakpoint_remove_all(env, BP_GDB);
3066 cpu_watchpoint_remove_all(env, BP_GDB);
3067}
pbrook4046d912007-01-28 01:53:16 +00003068#else
thsaa1f17c2007-07-11 22:48:58 +00003069static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00003070{
pbrook56aebc82008-10-11 17:55:29 +00003071 /* We can handle an arbitrarily large amount of data.
3072 Pick the maximum packet size, which is as good as anything. */
3073 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00003074}
3075
thsaa1f17c2007-07-11 22:48:58 +00003076static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00003077{
pbrook4046d912007-01-28 01:53:16 +00003078 int i;
3079
3080 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00003081 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00003082 }
3083}
3084
3085static void gdb_chr_event(void *opaque, int event)
3086{
3087 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05303088 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03003089 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00003090 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00003091 break;
3092 default:
3093 break;
3094 }
3095}
3096
aliguori8a34a0f2009-03-05 23:01:55 +00003097static void gdb_monitor_output(GDBState *s, const char *msg, int len)
3098{
3099 char buf[MAX_PACKET_LENGTH];
3100
3101 buf[0] = 'O';
3102 if (len > (MAX_PACKET_LENGTH/2) - 1)
3103 len = (MAX_PACKET_LENGTH/2) - 1;
3104 memtohex(buf + 1, (uint8_t *)msg, len);
3105 put_packet(s, buf);
3106}
3107
3108static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
3109{
3110 const char *p = (const char *)buf;
3111 int max_sz;
3112
3113 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
3114 for (;;) {
3115 if (len <= max_sz) {
3116 gdb_monitor_output(gdbserver_state, p, len);
3117 break;
3118 }
3119 gdb_monitor_output(gdbserver_state, p, max_sz);
3120 p += max_sz;
3121 len -= max_sz;
3122 }
3123 return len;
3124}
3125
aliguori59030a82009-04-05 18:43:41 +00003126#ifndef _WIN32
3127static void gdb_sigterm_handler(int signal)
3128{
Luiz Capitulino13548692011-07-29 15:36:43 -03003129 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03003130 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01003131 }
aliguori59030a82009-04-05 18:43:41 +00003132}
3133#endif
3134
3135int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00003136{
3137 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00003138 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00003139 CharDriverState *chr = NULL;
3140 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00003141
aliguori59030a82009-04-05 18:43:41 +00003142 if (!device)
3143 return -1;
3144 if (strcmp(device, "none") != 0) {
3145 if (strstart(device, "tcp:", NULL)) {
3146 /* enforce required TCP attributes */
3147 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
3148 "%s,nowait,nodelay,server", device);
3149 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00003150 }
aliguori59030a82009-04-05 18:43:41 +00003151#ifndef _WIN32
3152 else if (strcmp(device, "stdio") == 0) {
3153 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00003154
aliguori59030a82009-04-05 18:43:41 +00003155 memset(&act, 0, sizeof(act));
3156 act.sa_handler = gdb_sigterm_handler;
3157 sigaction(SIGINT, &act, NULL);
3158 }
3159#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05003160 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00003161 if (!chr)
3162 return -1;
3163
Hans de Goede456d6062013-03-27 20:29:40 +01003164 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00003165 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
3166 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00003167 }
3168
aliguori36556b22009-03-28 18:05:53 +00003169 s = gdbserver_state;
3170 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003171 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00003172 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00003173
aliguori36556b22009-03-28 18:05:53 +00003174 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3175
3176 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05003177 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00003178 mon_chr->chr_write = gdb_monitor_write;
3179 monitor_init(mon_chr, 0);
3180 } else {
3181 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05003182 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00003183 mon_chr = s->mon_chr;
3184 memset(s, 0, sizeof(GDBState));
3185 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02003186 s->c_cpu = first_cpu;
3187 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00003188 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00003189 s->state = chr ? RS_IDLE : RS_INACTIVE;
3190 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00003191 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00003192
pbrook4046d912007-01-28 01:53:16 +00003193 return 0;
3194}
3195#endif