blob: 4879055c604642efe0dd4e9ac21dd22d7a0186aa [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
Jan Kiszkab1631e72009-06-27 09:53:51 +0200533#define IDX_IP_REG CPU_NB_REGS
534#define IDX_FLAGS_REG (IDX_IP_REG + 1)
535#define IDX_SEG_REGS (IDX_FLAGS_REG + 1)
536#define IDX_FP_REGS (IDX_SEG_REGS + 6)
537#define IDX_XMM_REGS (IDX_FP_REGS + 16)
538#define IDX_MXCSR_REG (IDX_XMM_REGS + CPU_NB_REGS)
539
Andreas Färberf3840912012-02-20 06:44:56 +0100540static int cpu_gdb_read_register(CPUX86State *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000541{
542 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200543 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
544 GET_REG64(env->regs[gpr_map[n]]);
545 } else if (n < CPU_NB_REGS32) {
546 GET_REG32(env->regs[gpr_map32[n]]);
547 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200548 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000549#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200550 /* FIXME: byteswap float values - after fixing fpregs layout. */
551 memcpy(mem_buf, &env->fpregs[n - IDX_FP_REGS], 10);
pbrook56aebc82008-10-11 17:55:29 +0000552#else
553 memset(mem_buf, 0, 10);
554#endif
555 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200556 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
557 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200558 if (n < CPU_NB_REGS32 ||
559 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
560 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
561 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
562 return 16;
563 }
pbrook56aebc82008-10-11 17:55:29 +0000564 } else {
pbrook56aebc82008-10-11 17:55:29 +0000565 switch (n) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200566 case IDX_IP_REG:
567 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
568 GET_REG64(env->eip);
569 } else {
570 GET_REG32(env->eip);
571 }
Andreas Färber47d74ef2013-07-07 11:17:26 +0200572 case IDX_FLAGS_REG:
573 GET_REG32(env->eflags);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200574
Andreas Färber47d74ef2013-07-07 11:17:26 +0200575 case IDX_SEG_REGS:
576 GET_REG32(env->segs[R_CS].selector);
577 case IDX_SEG_REGS + 1:
578 GET_REG32(env->segs[R_SS].selector);
579 case IDX_SEG_REGS + 2:
580 GET_REG32(env->segs[R_DS].selector);
581 case IDX_SEG_REGS + 3:
582 GET_REG32(env->segs[R_ES].selector);
583 case IDX_SEG_REGS + 4:
584 GET_REG32(env->segs[R_FS].selector);
585 case IDX_SEG_REGS + 5:
586 GET_REG32(env->segs[R_GS].selector);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200587
Andreas Färber47d74ef2013-07-07 11:17:26 +0200588 case IDX_FP_REGS + 8:
589 GET_REG32(env->fpuc);
590 case IDX_FP_REGS + 9:
591 GET_REG32((env->fpus & ~0x3800) |
592 (env->fpstt & 0x7) << 11);
593 case IDX_FP_REGS + 10:
594 GET_REG32(0); /* ftag */
595 case IDX_FP_REGS + 11:
596 GET_REG32(0); /* fiseg */
597 case IDX_FP_REGS + 12:
598 GET_REG32(0); /* fioff */
599 case IDX_FP_REGS + 13:
600 GET_REG32(0); /* foseg */
601 case IDX_FP_REGS + 14:
602 GET_REG32(0); /* fooff */
603 case IDX_FP_REGS + 15:
604 GET_REG32(0); /* fop */
Jan Kiszkab1631e72009-06-27 09:53:51 +0200605
Andreas Färber47d74ef2013-07-07 11:17:26 +0200606 case IDX_MXCSR_REG:
607 GET_REG32(env->mxcsr);
pbrook56aebc82008-10-11 17:55:29 +0000608 }
bellard79808572008-05-09 14:40:22 +0000609 }
pbrook56aebc82008-10-11 17:55:29 +0000610 return 0;
bellard79808572008-05-09 14:40:22 +0000611}
612
Andreas Färberf3840912012-02-20 06:44:56 +0100613static int cpu_x86_gdb_load_seg(CPUX86State *env, int sreg, uint8_t *mem_buf)
Jan Kiszka84273172009-06-27 09:53:51 +0200614{
615 uint16_t selector = ldl_p(mem_buf);
616
617 if (selector != env->segs[sreg].selector) {
618#if defined(CONFIG_USER_ONLY)
619 cpu_x86_load_seg(env, sreg, selector);
620#else
621 unsigned int limit, flags;
622 target_ulong base;
623
624 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
625 base = selector << 4;
626 limit = 0xffff;
627 flags = 0;
628 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200629 if (!cpu_x86_get_descr_debug(env, selector, &base, &limit,
630 &flags)) {
Jan Kiszka84273172009-06-27 09:53:51 +0200631 return 4;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200632 }
Jan Kiszka84273172009-06-27 09:53:51 +0200633 }
634 cpu_x86_load_seg_cache(env, sreg, selector, base, limit, flags);
635#endif
636 }
637 return 4;
638}
639
Andreas Färberf3840912012-02-20 06:44:56 +0100640static int cpu_gdb_write_register(CPUX86State *env, uint8_t *mem_buf, int n)
bellard79808572008-05-09 14:40:22 +0000641{
pbrook56aebc82008-10-11 17:55:29 +0000642 uint32_t tmp;
643
Jan Kiszkab1631e72009-06-27 09:53:51 +0200644 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200645 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
646 env->regs[gpr_map[n]] = ldtul_p(mem_buf);
647 return sizeof(target_ulong);
648 } else if (n < CPU_NB_REGS32) {
649 n = gpr_map32[n];
650 env->regs[n] &= ~0xffffffffUL;
651 env->regs[n] |= (uint32_t)ldl_p(mem_buf);
652 return 4;
653 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200654 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000655#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200656 /* FIXME: byteswap float values - after fixing fpregs layout. */
657 memcpy(&env->fpregs[n - IDX_FP_REGS], mem_buf, 10);
pbrook56aebc82008-10-11 17:55:29 +0000658#endif
659 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200660 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
661 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200662 if (n < CPU_NB_REGS32 ||
663 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
664 env->xmm_regs[n].XMM_Q(0) = ldq_p(mem_buf);
665 env->xmm_regs[n].XMM_Q(1) = ldq_p(mem_buf + 8);
666 return 16;
667 }
pbrook56aebc82008-10-11 17:55:29 +0000668 } else {
Jan Kiszkab1631e72009-06-27 09:53:51 +0200669 switch (n) {
670 case IDX_IP_REG:
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200671 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
672 env->eip = ldq_p(mem_buf);
673 return 8;
674 } else {
675 env->eip &= ~0xffffffffUL;
676 env->eip |= (uint32_t)ldl_p(mem_buf);
677 return 4;
678 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200679 case IDX_FLAGS_REG:
680 env->eflags = ldl_p(mem_buf);
681 return 4;
682
Andreas Färber47d74ef2013-07-07 11:17:26 +0200683 case IDX_SEG_REGS:
684 return cpu_x86_gdb_load_seg(env, R_CS, mem_buf);
685 case IDX_SEG_REGS + 1:
686 return cpu_x86_gdb_load_seg(env, R_SS, mem_buf);
687 case IDX_SEG_REGS + 2:
688 return cpu_x86_gdb_load_seg(env, R_DS, mem_buf);
689 case IDX_SEG_REGS + 3:
690 return cpu_x86_gdb_load_seg(env, R_ES, mem_buf);
691 case IDX_SEG_REGS + 4:
692 return cpu_x86_gdb_load_seg(env, R_FS, mem_buf);
693 case IDX_SEG_REGS + 5:
694 return cpu_x86_gdb_load_seg(env, R_GS, mem_buf);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200695
696 case IDX_FP_REGS + 8:
697 env->fpuc = ldl_p(mem_buf);
698 return 4;
699 case IDX_FP_REGS + 9:
700 tmp = ldl_p(mem_buf);
701 env->fpstt = (tmp >> 11) & 7;
702 env->fpus = tmp & ~0x3800;
703 return 4;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200704 case IDX_FP_REGS + 10: /* ftag */
705 return 4;
706 case IDX_FP_REGS + 11: /* fiseg */
707 return 4;
708 case IDX_FP_REGS + 12: /* fioff */
709 return 4;
710 case IDX_FP_REGS + 13: /* foseg */
711 return 4;
712 case IDX_FP_REGS + 14: /* fooff */
713 return 4;
714 case IDX_FP_REGS + 15: /* fop */
715 return 4;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200716
717 case IDX_MXCSR_REG:
718 env->mxcsr = ldl_p(mem_buf);
719 return 4;
bellard79808572008-05-09 14:40:22 +0000720 }
bellard79808572008-05-09 14:40:22 +0000721 }
pbrook56aebc82008-10-11 17:55:29 +0000722 /* Unrecognised register. */
723 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000724}
725
bellard9e62fd72004-01-05 22:49:06 +0000726#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000727
aurel32e571cb42009-01-24 15:07:42 +0000728/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
729 expects whatever the target description contains. Due to a
730 historical mishap the FP registers appear in between core integer
731 regs and PC, MSR, CR, and so forth. We hack round this by giving the
732 FP regs zero size when talking to a newer gdb. */
aurel32e571cb42009-01-24 15:07:42 +0000733#if defined (TARGET_PPC64)
734#define GDB_CORE_XML "power64-core.xml"
735#else
736#define GDB_CORE_XML "power-core.xml"
737#endif
pbrook56aebc82008-10-11 17:55:29 +0000738
Andreas Färberf3840912012-02-20 06:44:56 +0100739static int cpu_gdb_read_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000740{
pbrook56aebc82008-10-11 17:55:29 +0000741 if (n < 32) {
742 /* gprs */
743 GET_REGL(env->gpr[n]);
744 } else if (n < 64) {
745 /* fprs */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200746 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000747 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200748 }
aurel328d4acf92008-11-30 16:23:18 +0000749 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000750 return 8;
751 } else {
752 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200753 case 64:
754 GET_REGL(env->nip);
755 case 65:
756 GET_REGL(env->msr);
pbrook56aebc82008-10-11 17:55:29 +0000757 case 66:
758 {
759 uint32_t cr = 0;
760 int i;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200761 for (i = 0; i < 8; i++) {
pbrook56aebc82008-10-11 17:55:29 +0000762 cr |= env->crf[i] << (32 - ((i + 1) * 4));
Andreas Färber47d74ef2013-07-07 11:17:26 +0200763 }
pbrook56aebc82008-10-11 17:55:29 +0000764 GET_REG32(cr);
765 }
Andreas Färber47d74ef2013-07-07 11:17:26 +0200766 case 67:
767 GET_REGL(env->lr);
768 case 68:
769 GET_REGL(env->ctr);
770 case 69:
771 GET_REGL(env->xer);
aurel32e571cb42009-01-24 15:07:42 +0000772 case 70:
773 {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200774 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000775 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200776 }
Fabien Chouteau5a576fb2011-09-01 04:56:00 +0000777 GET_REG32(env->fpscr);
aurel32e571cb42009-01-24 15:07:42 +0000778 }
pbrook56aebc82008-10-11 17:55:29 +0000779 }
bellard9e62fd72004-01-05 22:49:06 +0000780 }
pbrook56aebc82008-10-11 17:55:29 +0000781 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000782}
783
Andreas Färberf3840912012-02-20 06:44:56 +0100784static int cpu_gdb_write_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000785{
pbrook56aebc82008-10-11 17:55:29 +0000786 if (n < 32) {
787 /* gprs */
788 env->gpr[n] = ldtul_p(mem_buf);
789 return sizeof(target_ulong);
790 } else if (n < 64) {
791 /* fprs */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200792 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000793 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200794 }
aurel328d4acf92008-11-30 16:23:18 +0000795 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000796 return 8;
797 } else {
798 switch (n) {
799 case 64:
800 env->nip = ldtul_p(mem_buf);
801 return sizeof(target_ulong);
802 case 65:
803 ppc_store_msr(env, ldtul_p(mem_buf));
804 return sizeof(target_ulong);
805 case 66:
806 {
807 uint32_t cr = ldl_p(mem_buf);
808 int i;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200809 for (i = 0; i < 8; i++) {
pbrook56aebc82008-10-11 17:55:29 +0000810 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200811 }
pbrook56aebc82008-10-11 17:55:29 +0000812 return 4;
813 }
814 case 67:
815 env->lr = ldtul_p(mem_buf);
816 return sizeof(target_ulong);
817 case 68:
818 env->ctr = ldtul_p(mem_buf);
819 return sizeof(target_ulong);
820 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000821 env->xer = ldtul_p(mem_buf);
822 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000823 case 70:
824 /* fpscr */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200825 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000826 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200827 }
Fabien Chouteaud6478bc2013-03-19 07:41:53 +0000828 store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
829 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000830 }
bellard9e62fd72004-01-05 22:49:06 +0000831 }
pbrook56aebc82008-10-11 17:55:29 +0000832 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000833}
pbrook56aebc82008-10-11 17:55:29 +0000834
bellarde95c8d52004-09-30 22:22:08 +0000835#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000836
pbrook56aebc82008-10-11 17:55:29 +0000837#ifdef TARGET_ABI32
838#define GET_REGA(val) GET_REG32(val)
839#else
840#define GET_REGA(val) GET_REGL(val)
841#endif
842
Andreas Färberf3840912012-02-20 06:44:56 +0100843static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000844{
845 if (n < 8) {
846 /* g0..g7 */
847 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000848 }
pbrook56aebc82008-10-11 17:55:29 +0000849 if (n < 32) {
850 /* register window */
851 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000852 }
pbrook56aebc82008-10-11 17:55:29 +0000853#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
854 if (n < 64) {
855 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700856 if (n & 1) {
857 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
858 } else {
859 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
860 }
bellarde95c8d52004-09-30 22:22:08 +0000861 }
862 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000863 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200864 case 64:
865 GET_REGA(env->y);
866 case 65:
867 GET_REGA(cpu_get_psr(env));
868 case 66:
869 GET_REGA(env->wim);
870 case 67:
871 GET_REGA(env->tbr);
872 case 68:
873 GET_REGA(env->pc);
874 case 69:
875 GET_REGA(env->npc);
876 case 70:
877 GET_REGA(env->fsr);
878 case 71:
879 GET_REGA(0); /* csr */
880 default:
881 GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000882 }
bellard34751872005-07-02 14:31:34 +0000883#else
pbrook56aebc82008-10-11 17:55:29 +0000884 if (n < 64) {
885 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700886 if (n & 1) {
887 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
888 } else {
889 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
890 }
bellard34751872005-07-02 14:31:34 +0000891 }
pbrook56aebc82008-10-11 17:55:29 +0000892 if (n < 80) {
893 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700894 GET_REG64(env->fpr[(n - 32) / 2].ll);
pbrook56aebc82008-10-11 17:55:29 +0000895 }
896 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200897 case 80:
898 GET_REGL(env->pc);
899 case 81:
900 GET_REGL(env->npc);
901 case 82:
902 GET_REGL((cpu_get_ccr(env) << 32) |
903 ((env->asi & 0xff) << 24) |
904 ((env->pstate & 0xfff) << 8) |
905 cpu_get_cwp64(env));
906 case 83:
907 GET_REGL(env->fsr);
908 case 84:
909 GET_REGL(env->fprs);
910 case 85:
911 GET_REGL(env->y);
pbrook56aebc82008-10-11 17:55:29 +0000912 }
bellard34751872005-07-02 14:31:34 +0000913#endif
pbrook56aebc82008-10-11 17:55:29 +0000914 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000915}
916
Andreas Färberf3840912012-02-20 06:44:56 +0100917static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000918{
pbrook56aebc82008-10-11 17:55:29 +0000919#if defined(TARGET_ABI32)
920 abi_ulong tmp;
921
922 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000923#else
pbrook56aebc82008-10-11 17:55:29 +0000924 target_ulong tmp;
925
926 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000927#endif
bellarde95c8d52004-09-30 22:22:08 +0000928
pbrook56aebc82008-10-11 17:55:29 +0000929 if (n < 8) {
930 /* g0..g7 */
931 env->gregs[n] = tmp;
932 } else if (n < 32) {
933 /* register window */
934 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000935 }
pbrook56aebc82008-10-11 17:55:29 +0000936#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
937 else if (n < 64) {
938 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700939 /* f0-f31 */
940 if (n & 1) {
941 env->fpr[(n - 32) / 2].l.lower = tmp;
942 } else {
943 env->fpr[(n - 32) / 2].l.upper = tmp;
944 }
pbrook56aebc82008-10-11 17:55:29 +0000945 } else {
946 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
947 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200948 case 64:
949 env->y = tmp;
950 break;
951 case 65:
952 cpu_put_psr(env, tmp);
953 break;
954 case 66:
955 env->wim = tmp;
956 break;
957 case 67:
958 env->tbr = tmp;
959 break;
960 case 68:
961 env->pc = tmp;
962 break;
963 case 69:
964 env->npc = tmp;
965 break;
966 case 70:
967 env->fsr = tmp;
968 break;
969 default:
970 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000971 }
bellarde95c8d52004-09-30 22:22:08 +0000972 }
pbrook56aebc82008-10-11 17:55:29 +0000973 return 4;
bellard34751872005-07-02 14:31:34 +0000974#else
pbrook56aebc82008-10-11 17:55:29 +0000975 else if (n < 64) {
976 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700977 tmp = ldl_p(mem_buf);
978 if (n & 1) {
979 env->fpr[(n - 32) / 2].l.lower = tmp;
980 } else {
981 env->fpr[(n - 32) / 2].l.upper = tmp;
982 }
pbrook56aebc82008-10-11 17:55:29 +0000983 return 4;
984 } else if (n < 80) {
985 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700986 env->fpr[(n - 32) / 2].ll = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000987 } else {
988 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200989 case 80:
990 env->pc = tmp;
991 break;
992 case 81:
993 env->npc = tmp;
994 break;
pbrook56aebc82008-10-11 17:55:29 +0000995 case 82:
Blue Swirl5a834bb2010-05-09 20:19:04 +0000996 cpu_put_ccr(env, tmp >> 32);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200997 env->asi = (tmp >> 24) & 0xff;
998 env->pstate = (tmp >> 8) & 0xfff;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000999 cpu_put_cwp64(env, tmp & 0xff);
Andreas Färber47d74ef2013-07-07 11:17:26 +02001000 break;
1001 case 83:
1002 env->fsr = tmp;
1003 break;
1004 case 84:
1005 env->fprs = tmp;
1006 break;
1007 case 85:
1008 env->y = tmp;
1009 break;
1010 default:
1011 return 0;
pbrook56aebc82008-10-11 17:55:29 +00001012 }
bellard34751872005-07-02 14:31:34 +00001013 }
pbrook56aebc82008-10-11 17:55:29 +00001014 return 8;
bellard34751872005-07-02 14:31:34 +00001015#endif
bellard9e62fd72004-01-05 22:49:06 +00001016}
bellard1fddef42005-04-17 19:16:13 +00001017#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +00001018
1019/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
1020 whatever the target description contains. Due to a historical mishap
1021 the FPA registers appear in between core integer regs and the CPSR.
1022 We hack round this by giving the FPA regs zero size when talking to a
1023 newer gdb. */
pbrook56aebc82008-10-11 17:55:29 +00001024#define GDB_CORE_XML "arm-core.xml"
1025
Andreas Färberf3840912012-02-20 06:44:56 +01001026static int cpu_gdb_read_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +00001027{
pbrook56aebc82008-10-11 17:55:29 +00001028 if (n < 16) {
1029 /* Core integer register. */
1030 GET_REG32(env->regs[n]);
1031 }
1032 if (n < 24) {
1033 /* FPA registers. */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001034 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +00001035 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001036 }
pbrook56aebc82008-10-11 17:55:29 +00001037 memset(mem_buf, 0, 12);
1038 return 12;
1039 }
1040 switch (n) {
1041 case 24:
1042 /* FPA status register. */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001043 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +00001044 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001045 }
pbrook56aebc82008-10-11 17:55:29 +00001046 GET_REG32(0);
1047 case 25:
1048 /* CPSR */
1049 GET_REG32(cpsr_read(env));
1050 }
1051 /* Unknown register. */
1052 return 0;
bellard1fddef42005-04-17 19:16:13 +00001053}
1054
Andreas Färberf3840912012-02-20 06:44:56 +01001055static int cpu_gdb_write_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +00001056{
pbrook56aebc82008-10-11 17:55:29 +00001057 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +00001058
pbrook56aebc82008-10-11 17:55:29 +00001059 tmp = ldl_p(mem_buf);
1060
1061 /* Mask out low bit of PC to workaround gdb bugs. This will probably
1062 cause problems if we ever implement the Jazelle DBX extensions. */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001063 if (n == 15) {
pbrook56aebc82008-10-11 17:55:29 +00001064 tmp &= ~1;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001065 }
pbrook56aebc82008-10-11 17:55:29 +00001066
1067 if (n < 16) {
1068 /* Core integer register. */
1069 env->regs[n] = tmp;
1070 return 4;
1071 }
1072 if (n < 24) { /* 16-23 */
1073 /* FPA registers (ignored). */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001074 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +00001075 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001076 }
pbrook56aebc82008-10-11 17:55:29 +00001077 return 12;
1078 }
1079 switch (n) {
1080 case 24:
1081 /* FPA status register (ignored). */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001082 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +00001083 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001084 }
pbrook56aebc82008-10-11 17:55:29 +00001085 return 4;
1086 case 25:
1087 /* CPSR */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001088 cpsr_write(env, tmp, 0xffffffff);
pbrook56aebc82008-10-11 17:55:29 +00001089 return 4;
1090 }
1091 /* Unknown register. */
1092 return 0;
bellard1fddef42005-04-17 19:16:13 +00001093}
pbrook56aebc82008-10-11 17:55:29 +00001094
pbrooke6e59062006-10-22 00:18:54 +00001095#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +00001096
pbrook56aebc82008-10-11 17:55:29 +00001097#define GDB_CORE_XML "cf-core.xml"
1098
Andreas Färberf3840912012-02-20 06:44:56 +01001099static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001100{
pbrook56aebc82008-10-11 17:55:29 +00001101 if (n < 8) {
1102 /* D0-D7 */
1103 GET_REG32(env->dregs[n]);
1104 } else if (n < 16) {
1105 /* A0-A7 */
1106 GET_REG32(env->aregs[n - 8]);
1107 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001108 switch (n) {
1109 case 16:
1110 GET_REG32(env->sr);
1111 case 17:
1112 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +00001113 }
pbrooke6e59062006-10-22 00:18:54 +00001114 }
pbrook56aebc82008-10-11 17:55:29 +00001115 /* FP registers not included here because they vary between
1116 ColdFire and m68k. Use XML bits for these. */
1117 return 0;
pbrooke6e59062006-10-22 00:18:54 +00001118}
1119
Andreas Färberf3840912012-02-20 06:44:56 +01001120static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001121{
pbrook56aebc82008-10-11 17:55:29 +00001122 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +00001123
pbrook56aebc82008-10-11 17:55:29 +00001124 tmp = ldl_p(mem_buf);
1125
1126 if (n < 8) {
1127 /* D0-D7 */
1128 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -08001129 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +00001130 /* A0-A7 */
1131 env->aregs[n - 8] = tmp;
1132 } else {
1133 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001134 case 16:
1135 env->sr = tmp;
1136 break;
1137 case 17:
1138 env->pc = tmp;
1139 break;
1140 default:
1141 return 0;
pbrook56aebc82008-10-11 17:55:29 +00001142 }
pbrooke6e59062006-10-22 00:18:54 +00001143 }
pbrook56aebc82008-10-11 17:55:29 +00001144 return 4;
pbrooke6e59062006-10-22 00:18:54 +00001145}
bellard6f970bd2005-12-05 19:55:19 +00001146#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +00001147
Andreas Färberf3840912012-02-20 06:44:56 +01001148static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001149{
pbrook56aebc82008-10-11 17:55:29 +00001150 if (n < 32) {
1151 GET_REGL(env->active_tc.gpr[n]);
1152 }
1153 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1154 if (n >= 38 && n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001155 if (env->CP0_Status & (1 << CP0St_FR)) {
1156 GET_REGL(env->active_fpu.fpr[n - 38].d);
1157 } else {
1158 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
1159 }
pbrook56aebc82008-10-11 17:55:29 +00001160 }
1161 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001162 case 70:
1163 GET_REGL((int32_t)env->active_fpu.fcr31);
1164 case 71:
1165 GET_REGL((int32_t)env->active_fpu.fcr0);
pbrook56aebc82008-10-11 17:55:29 +00001166 }
1167 }
1168 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001169 case 32:
1170 GET_REGL((int32_t)env->CP0_Status);
1171 case 33:
1172 GET_REGL(env->active_tc.LO[0]);
1173 case 34:
1174 GET_REGL(env->active_tc.HI[0]);
1175 case 35:
1176 GET_REGL(env->CP0_BadVAddr);
1177 case 36:
1178 GET_REGL((int32_t)env->CP0_Cause);
1179 case 37:
1180 GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
1181 case 72:
1182 GET_REGL(0); /* fp */
1183 case 89:
1184 GET_REGL((int32_t)env->CP0_PRid);
pbrook56aebc82008-10-11 17:55:29 +00001185 }
1186 if (n >= 73 && n <= 88) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001187 /* 16 embedded regs. */
1188 GET_REGL(0);
pbrook56aebc82008-10-11 17:55:29 +00001189 }
ths36d23952007-02-28 22:37:42 +00001190
pbrook56aebc82008-10-11 17:55:29 +00001191 return 0;
bellard6f970bd2005-12-05 19:55:19 +00001192}
1193
ths8e33c082006-12-11 19:22:27 +00001194/* convert MIPS rounding mode in FCR31 to IEEE library */
Andreas Färber47d74ef2013-07-07 11:17:26 +02001195static unsigned int ieee_rm[] = {
ths8e33c082006-12-11 19:22:27 +00001196 float_round_nearest_even,
1197 float_round_to_zero,
1198 float_round_up,
1199 float_round_down
Andreas Färber47d74ef2013-07-07 11:17:26 +02001200};
ths8e33c082006-12-11 19:22:27 +00001201#define RESTORE_ROUNDING_MODE \
Andreas Färber47d74ef2013-07-07 11:17:26 +02001202 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], \
1203 &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +00001204
Andreas Färberf3840912012-02-20 06:44:56 +01001205static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001206{
pbrook56aebc82008-10-11 17:55:29 +00001207 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +00001208
pbrook56aebc82008-10-11 17:55:29 +00001209 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001210
pbrook56aebc82008-10-11 17:55:29 +00001211 if (n < 32) {
1212 env->active_tc.gpr[n] = tmp;
1213 return sizeof(target_ulong);
1214 }
1215 if (env->CP0_Config1 & (1 << CP0C1_FP)
1216 && n >= 38 && n < 73) {
1217 if (n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001218 if (env->CP0_Status & (1 << CP0St_FR)) {
1219 env->active_fpu.fpr[n - 38].d = tmp;
1220 } else {
1221 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1222 }
pbrook56aebc82008-10-11 17:55:29 +00001223 }
1224 switch (n) {
1225 case 70:
1226 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1227 /* set rounding mode */
1228 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +00001229 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001230 case 71:
1231 env->active_fpu.fcr0 = tmp;
1232 break;
pbrook56aebc82008-10-11 17:55:29 +00001233 }
1234 return sizeof(target_ulong);
1235 }
1236 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001237 case 32:
1238 env->CP0_Status = tmp;
1239 break;
1240 case 33:
1241 env->active_tc.LO[0] = tmp;
1242 break;
1243 case 34:
1244 env->active_tc.HI[0] = tmp;
1245 break;
1246 case 35:
1247 env->CP0_BadVAddr = tmp;
1248 break;
1249 case 36:
1250 env->CP0_Cause = tmp;
1251 break;
Nathan Froydff1d1972009-12-08 08:06:30 -08001252 case 37:
1253 env->active_tc.PC = tmp & ~(target_ulong)1;
1254 if (tmp & 1) {
1255 env->hflags |= MIPS_HFLAG_M16;
1256 } else {
1257 env->hflags &= ~(MIPS_HFLAG_M16);
1258 }
1259 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001260 case 72: /* fp, ignored */
1261 break;
1262 default:
1263 if (n > 89) {
1264 return 0;
1265 }
1266 /* Other registers are readonly. Ignore writes. */
1267 break;
pbrook56aebc82008-10-11 17:55:29 +00001268 }
1269
1270 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001271}
Jia Liufc043552012-07-20 15:50:50 +08001272#elif defined(TARGET_OPENRISC)
1273
Jia Liufc043552012-07-20 15:50:50 +08001274static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
1275{
1276 if (n < 32) {
1277 GET_REG32(env->gpr[n]);
1278 } else {
1279 switch (n) {
1280 case 32: /* PPC */
1281 GET_REG32(env->ppc);
Jia Liufc043552012-07-20 15:50:50 +08001282
1283 case 33: /* NPC */
1284 GET_REG32(env->npc);
Jia Liufc043552012-07-20 15:50:50 +08001285
1286 case 34: /* SR */
1287 GET_REG32(env->sr);
Jia Liufc043552012-07-20 15:50:50 +08001288
1289 default:
1290 break;
1291 }
1292 }
1293 return 0;
1294}
1295
1296static int cpu_gdb_write_register(CPUOpenRISCState *env,
1297 uint8_t *mem_buf, int n)
1298{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001299 OpenRISCCPU *cpu = openrisc_env_get_cpu(env);
1300 CPUClass *cc = CPU_GET_CLASS(cpu);
Jia Liufc043552012-07-20 15:50:50 +08001301 uint32_t tmp;
1302
Andreas Färbera0e372f2013-06-28 23:18:47 +02001303 if (n > cc->gdb_num_core_regs) {
Jia Liufc043552012-07-20 15:50:50 +08001304 return 0;
1305 }
1306
1307 tmp = ldl_p(mem_buf);
1308
1309 if (n < 32) {
1310 env->gpr[n] = tmp;
1311 } else {
1312 switch (n) {
1313 case 32: /* PPC */
1314 env->ppc = tmp;
1315 break;
1316
1317 case 33: /* NPC */
1318 env->npc = tmp;
1319 break;
1320
1321 case 34: /* SR */
1322 env->sr = tmp;
1323 break;
1324
1325 default:
1326 break;
1327 }
1328 }
1329 return 4;
1330}
bellardfdf9b3e2006-04-27 21:07:38 +00001331#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001332
1333/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001334/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001335
Andreas Färberf3840912012-02-20 06:44:56 +01001336static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001337{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001338 switch (n) {
1339 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +00001340 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1341 GET_REGL(env->gregs[n + 16]);
1342 } else {
1343 GET_REGL(env->gregs[n]);
1344 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001345 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001346 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001347 case 16:
1348 GET_REGL(env->pc);
1349 case 17:
1350 GET_REGL(env->pr);
1351 case 18:
1352 GET_REGL(env->gbr);
1353 case 19:
1354 GET_REGL(env->vbr);
1355 case 20:
1356 GET_REGL(env->mach);
1357 case 21:
1358 GET_REGL(env->macl);
1359 case 22:
1360 GET_REGL(env->sr);
1361 case 23:
1362 GET_REGL(env->fpul);
1363 case 24:
1364 GET_REGL(env->fpscr);
1365 case 25 ... 40:
1366 if (env->fpscr & FPSCR_FR) {
1367 stfl_p(mem_buf, env->fregs[n - 9]);
1368 } else {
1369 stfl_p(mem_buf, env->fregs[n - 25]);
1370 }
1371 return 4;
1372 case 41:
1373 GET_REGL(env->ssr);
1374 case 42:
1375 GET_REGL(env->spc);
1376 case 43 ... 50:
1377 GET_REGL(env->gregs[n - 43]);
1378 case 51 ... 58:
1379 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +00001380 }
bellardfdf9b3e2006-04-27 21:07:38 +00001381
pbrook56aebc82008-10-11 17:55:29 +00001382 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001383}
1384
Andreas Färberf3840912012-02-20 06:44:56 +01001385static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001386{
pbrook56aebc82008-10-11 17:55:29 +00001387 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001388 case 0 ... 7:
1389 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1390 env->gregs[n + 16] = ldl_p(mem_buf);
1391 } else {
1392 env->gregs[n] = ldl_p(mem_buf);
1393 }
1394 break;
1395 case 8 ... 15:
1396 env->gregs[n] = ldl_p(mem_buf);
1397 break;
1398 case 16:
1399 env->pc = ldl_p(mem_buf);
1400 break;
1401 case 17:
1402 env->pr = ldl_p(mem_buf);
1403 break;
1404 case 18:
1405 env->gbr = ldl_p(mem_buf);
1406 break;
1407 case 19:
1408 env->vbr = ldl_p(mem_buf);
1409 break;
1410 case 20:
1411 env->mach = ldl_p(mem_buf);
1412 break;
1413 case 21:
1414 env->macl = ldl_p(mem_buf);
1415 break;
1416 case 22:
1417 env->sr = ldl_p(mem_buf);
1418 break;
1419 case 23:
1420 env->fpul = ldl_p(mem_buf);
1421 break;
1422 case 24:
1423 env->fpscr = ldl_p(mem_buf);
1424 break;
1425 case 25 ... 40:
1426 if (env->fpscr & FPSCR_FR) {
1427 env->fregs[n - 9] = ldfl_p(mem_buf);
1428 } else {
1429 env->fregs[n - 25] = ldfl_p(mem_buf);
1430 }
1431 break;
1432 case 41:
1433 env->ssr = ldl_p(mem_buf);
1434 break;
1435 case 42:
1436 env->spc = ldl_p(mem_buf);
1437 break;
1438 case 43 ... 50:
1439 env->gregs[n - 43] = ldl_p(mem_buf);
1440 break;
1441 case 51 ... 58:
1442 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
1443 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001444 default:
1445 return 0;
pbrook56aebc82008-10-11 17:55:29 +00001446 }
1447
1448 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001449}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001450#elif defined (TARGET_MICROBLAZE)
1451
Andreas Färberf3840912012-02-20 06:44:56 +01001452static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001453{
1454 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001455 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001456 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001457 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001458 }
1459 return 0;
1460}
1461
Andreas Färberf3840912012-02-20 06:44:56 +01001462static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001463{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001464 MicroBlazeCPU *cpu = mb_env_get_cpu(env);
1465 CPUClass *cc = CPU_GET_CLASS(cpu);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001466 uint32_t tmp;
1467
Andreas Färbera0e372f2013-06-28 23:18:47 +02001468 if (n > cc->gdb_num_core_regs) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001469 return 0;
1470 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001471
1472 tmp = ldl_p(mem_buf);
1473
1474 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001475 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001476 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001477 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001478 }
1479 return 4;
1480}
thsf1ccf902007-10-08 13:16:14 +00001481#elif defined (TARGET_CRIS)
1482
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001483static int
Andreas Färberf3840912012-02-20 06:44:56 +01001484read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001485{
1486 if (n < 15) {
1487 GET_REG32(env->regs[n]);
1488 }
1489
1490 if (n == 15) {
1491 GET_REG32(env->pc);
1492 }
1493
1494 if (n < 32) {
1495 switch (n) {
1496 case 16:
1497 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001498 case 17:
1499 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001500 case 20:
1501 case 21:
1502 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001503 default:
1504 if (n >= 23) {
1505 GET_REG32(env->pregs[n - 16]);
1506 }
1507 break;
1508 }
1509 }
1510 return 0;
1511}
1512
Andreas Färberf3840912012-02-20 06:44:56 +01001513static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001514{
pbrook56aebc82008-10-11 17:55:29 +00001515 uint8_t srs;
1516
Andreas Färber47d74ef2013-07-07 11:17:26 +02001517 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001518 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +02001519 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001520
pbrook56aebc82008-10-11 17:55:29 +00001521 srs = env->pregs[PR_SRS];
1522 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001523 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +00001524 }
1525
1526 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001527 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +00001528 }
1529 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001530 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +00001531 }
1532 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001533 case 16:
1534 GET_REG8(env->pregs[0]);
1535 case 17:
1536 GET_REG8(env->pregs[1]);
1537 case 18:
1538 GET_REG32(env->pregs[2]);
1539 case 19:
1540 GET_REG8(srs);
1541 case 20:
1542 GET_REG16(env->pregs[4]);
1543 case 32:
1544 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +00001545 }
1546
1547 return 0;
thsf1ccf902007-10-08 13:16:14 +00001548}
1549
Andreas Färberf3840912012-02-20 06:44:56 +01001550static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001551{
pbrook56aebc82008-10-11 17:55:29 +00001552 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001553
Andreas Färber47d74ef2013-07-07 11:17:26 +02001554 if (n > 49) {
1555 return 0;
1556 }
thsf1ccf902007-10-08 13:16:14 +00001557
pbrook56aebc82008-10-11 17:55:29 +00001558 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001559
pbrook56aebc82008-10-11 17:55:29 +00001560 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001561 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +00001562 }
thsf1ccf902007-10-08 13:16:14 +00001563
edgar_igld7b69672008-10-11 19:32:21 +00001564 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001565 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +00001566 }
1567
1568 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001569 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001570 case 16:
1571 return 1;
1572 case 17:
1573 return 1;
1574 case 18:
1575 env->pregs[PR_PID] = tmp;
1576 break;
1577 case 19:
1578 return 1;
1579 case 20:
1580 return 2;
1581 case 32:
1582 env->pc = tmp;
1583 break;
pbrook56aebc82008-10-11 17:55:29 +00001584 }
thsf1ccf902007-10-08 13:16:14 +00001585
pbrook56aebc82008-10-11 17:55:29 +00001586 return 4;
thsf1ccf902007-10-08 13:16:14 +00001587}
aurel3219bf5172008-12-07 23:26:32 +00001588#elif defined (TARGET_ALPHA)
1589
Andreas Färberf3840912012-02-20 06:44:56 +01001590static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001591{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001592 uint64_t val;
1593 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001594
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001595 switch (n) {
1596 case 0 ... 30:
1597 val = env->ir[n];
1598 break;
1599 case 32 ... 62:
1600 d.d = env->fir[n - 32];
1601 val = d.ll;
1602 break;
1603 case 63:
1604 val = cpu_alpha_load_fpcr(env);
1605 break;
1606 case 64:
1607 val = env->pc;
1608 break;
1609 case 66:
1610 val = env->unique;
1611 break;
1612 case 31:
1613 case 65:
1614 /* 31 really is the zero register; 65 is unassigned in the
1615 gdb protocol, but is still required to occupy 8 bytes. */
1616 val = 0;
1617 break;
1618 default:
1619 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001620 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001621 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001622}
1623
Andreas Färberf3840912012-02-20 06:44:56 +01001624static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001625{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001626 target_ulong tmp = ldtul_p(mem_buf);
1627 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001628
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001629 switch (n) {
1630 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001631 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001632 break;
1633 case 32 ... 62:
1634 d.ll = tmp;
1635 env->fir[n - 32] = d.d;
1636 break;
1637 case 63:
1638 cpu_alpha_store_fpcr(env, tmp);
1639 break;
1640 case 64:
1641 env->pc = tmp;
1642 break;
1643 case 66:
1644 env->unique = tmp;
1645 break;
1646 case 31:
1647 case 65:
1648 /* 31 really is the zero register; 65 is unassigned in the
1649 gdb protocol, but is still required to occupy 8 bytes. */
1650 break;
1651 default:
1652 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001653 }
aurel3219bf5172008-12-07 23:26:32 +00001654 return 8;
1655}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001656#elif defined (TARGET_S390X)
1657
Andreas Färberf3840912012-02-20 06:44:56 +01001658static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001659{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001660 uint64_t val;
1661 int cc_op;
1662
Alexander Grafafcb0e42009-12-05 12:44:29 +01001663 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001664 case S390_PSWM_REGNUM:
1665 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1666 val = deposit64(env->psw.mask, 44, 2, cc_op);
1667 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001668 case S390_PSWA_REGNUM:
1669 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001670 case S390_R0_REGNUM ... S390_R15_REGNUM:
1671 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001672 case S390_A0_REGNUM ... S390_A15_REGNUM:
1673 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001674 case S390_FPC_REGNUM:
1675 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001676 case S390_F0_REGNUM ... S390_F15_REGNUM:
1677 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +01001678 }
1679
1680 return 0;
1681}
1682
Andreas Färberf3840912012-02-20 06:44:56 +01001683static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001684{
1685 target_ulong tmpl;
1686 uint32_t tmp32;
1687 int r = 8;
1688 tmpl = ldtul_p(mem_buf);
1689 tmp32 = ldl_p(mem_buf);
1690
1691 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001692 case S390_PSWM_REGNUM:
1693 env->psw.mask = tmpl;
1694 env->cc_op = extract64(tmpl, 44, 2);
1695 break;
1696 case S390_PSWA_REGNUM:
1697 env->psw.addr = tmpl;
1698 break;
1699 case S390_R0_REGNUM ... S390_R15_REGNUM:
1700 env->regs[n-S390_R0_REGNUM] = tmpl;
1701 break;
1702 case S390_A0_REGNUM ... S390_A15_REGNUM:
1703 env->aregs[n-S390_A0_REGNUM] = tmp32;
1704 r = 4;
1705 break;
1706 case S390_FPC_REGNUM:
1707 env->fpc = tmp32;
1708 r = 4;
1709 break;
1710 case S390_F0_REGNUM ... S390_F15_REGNUM:
1711 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1712 break;
1713 default:
1714 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001715 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001716 return r;
1717}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001718#elif defined (TARGET_LM32)
1719
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001720#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001721
Andreas Färberf3840912012-02-20 06:44:56 +01001722static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001723{
1724 if (n < 32) {
1725 GET_REG32(env->regs[n]);
1726 } else {
1727 switch (n) {
1728 case 32:
1729 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001730 /* FIXME: put in right exception ID */
1731 case 33:
1732 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001733 case 34:
1734 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001735 case 35:
1736 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001737 case 36:
1738 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001739 case 37:
1740 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001741 case 38:
1742 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001743 }
1744 }
1745 return 0;
1746}
1747
Andreas Färberf3840912012-02-20 06:44:56 +01001748static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001749{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001750 LM32CPU *cpu = lm32_env_get_cpu(env);
1751 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001752 uint32_t tmp;
1753
Andreas Färbera0e372f2013-06-28 23:18:47 +02001754 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +01001755 return 0;
1756 }
1757
1758 tmp = ldl_p(mem_buf);
1759
1760 if (n < 32) {
1761 env->regs[n] = tmp;
1762 } else {
1763 switch (n) {
1764 case 32:
1765 env->pc = tmp;
1766 break;
1767 case 34:
1768 env->eba = tmp;
1769 break;
1770 case 35:
1771 env->deba = tmp;
1772 break;
1773 case 36:
1774 env->ie = tmp;
1775 break;
1776 case 37:
1777 lm32_pic_set_im(env->pic_state, tmp);
1778 break;
1779 case 38:
1780 lm32_pic_set_ip(env->pic_state, tmp);
1781 break;
1782 }
1783 }
1784 return 4;
1785}
Max Filippovccfcaba2011-09-06 03:55:52 +04001786#elif defined(TARGET_XTENSA)
1787
Andreas Färberf3840912012-02-20 06:44:56 +01001788static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001789{
1790 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1791
1792 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1793 return 0;
1794 }
1795
1796 switch (reg->type) {
1797 case 9: /*pc*/
1798 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +04001799
1800 case 1: /*ar*/
1801 xtensa_sync_phys_from_window(env);
1802 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001803
1804 case 2: /*SR*/
1805 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001806
1807 case 3: /*UR*/
1808 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001809
Max Filippovdd519cb2012-09-19 04:23:54 +04001810 case 4: /*f*/
1811 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +04001812
Max Filippovccfcaba2011-09-06 03:55:52 +04001813 case 8: /*a*/
1814 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001815
1816 default:
1817 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001818 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001819 return 0;
1820 }
1821}
1822
Andreas Färberf3840912012-02-20 06:44:56 +01001823static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001824{
1825 uint32_t tmp;
1826 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1827
1828 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1829 return 0;
1830 }
1831
1832 tmp = ldl_p(mem_buf);
1833
1834 switch (reg->type) {
1835 case 9: /*pc*/
1836 env->pc = tmp;
1837 break;
1838
1839 case 1: /*ar*/
1840 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1841 xtensa_sync_window_from_phys(env);
1842 break;
1843
1844 case 2: /*SR*/
1845 env->sregs[reg->targno & 0xff] = tmp;
1846 break;
1847
1848 case 3: /*UR*/
1849 env->uregs[reg->targno & 0xff] = tmp;
1850 break;
1851
Max Filippovdd519cb2012-09-19 04:23:54 +04001852 case 4: /*f*/
1853 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1854 break;
1855
Max Filippovccfcaba2011-09-06 03:55:52 +04001856 case 8: /*a*/
1857 env->regs[reg->targno & 0x0f] = tmp;
1858 break;
1859
1860 default:
1861 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001862 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001863 return 0;
1864 }
1865
1866 return 4;
1867}
bellard1fddef42005-04-17 19:16:13 +00001868#else
pbrook56aebc82008-10-11 17:55:29 +00001869
Andreas Färber9349b4f2012-03-14 01:38:32 +01001870static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001871{
1872 return 0;
1873}
1874
Andreas Färber9349b4f2012-03-14 01:38:32 +01001875static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001876{
pbrook56aebc82008-10-11 17:55:29 +00001877 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001878}
1879
1880#endif
bellardb4608c02003-06-27 17:34:32 +00001881
pbrook56aebc82008-10-11 17:55:29 +00001882#ifdef GDB_CORE_XML
1883/* Encode data using the encoding for 'x' packets. */
1884static int memtox(char *buf, const char *mem, int len)
1885{
1886 char *p = buf;
1887 char c;
1888
1889 while (len--) {
1890 c = *(mem++);
1891 switch (c) {
1892 case '#': case '$': case '*': case '}':
1893 *(p++) = '}';
1894 *(p++) = c ^ 0x20;
1895 break;
1896 default:
1897 *(p++) = c;
1898 break;
1899 }
1900 }
1901 return p - buf;
1902}
1903
aurel323faf7782008-12-07 23:26:17 +00001904static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001905{
pbrook56aebc82008-10-11 17:55:29 +00001906 size_t len;
1907 int i;
1908 const char *name;
1909 static char target_xml[1024];
1910
1911 len = 0;
1912 while (p[len] && p[len] != ':')
1913 len++;
1914 *newp = p + len;
1915
1916 name = NULL;
1917 if (strncmp(p, "target.xml", len) == 0) {
1918 /* Generate the XML description for this CPU. */
1919 if (!target_xml[0]) {
1920 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001921 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001922
blueswir15b3715b2008-10-25 11:18:12 +00001923 snprintf(target_xml, sizeof(target_xml),
1924 "<?xml version=\"1.0\"?>"
1925 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1926 "<target>"
1927 "<xi:include href=\"%s\"/>",
1928 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001929
Andreas Färbereac8b352013-06-28 21:11:37 +02001930 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001931 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1932 pstrcat(target_xml, sizeof(target_xml), r->xml);
1933 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001934 }
blueswir12dc766d2009-04-13 16:06:19 +00001935 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001936 }
1937 return target_xml;
1938 }
1939 for (i = 0; ; i++) {
1940 name = xml_builtin[i][0];
1941 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1942 break;
1943 }
1944 return name ? xml_builtin[i][1] : NULL;
1945}
1946#endif
1947
Andreas Färber385b9f02013-06-27 18:25:36 +02001948static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001949{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001950 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001951 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001952 GDBRegisterState *r;
1953
Andreas Färbera0e372f2013-06-28 23:18:47 +02001954 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001955 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001956 }
pbrook56aebc82008-10-11 17:55:29 +00001957
Andreas Färbereac8b352013-06-28 21:11:37 +02001958 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001959 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1960 return r->get_reg(env, mem_buf, reg - r->base_reg);
1961 }
1962 }
1963 return 0;
1964}
1965
Andreas Färber385b9f02013-06-27 18:25:36 +02001966static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001967{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001968 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001969 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001970 GDBRegisterState *r;
1971
Andreas Färbera0e372f2013-06-28 23:18:47 +02001972 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001973 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001974 }
pbrook56aebc82008-10-11 17:55:29 +00001975
Andreas Färbereac8b352013-06-28 21:11:37 +02001976 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001977 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1978 return r->set_reg(env, mem_buf, reg - r->base_reg);
1979 }
1980 }
1981 return 0;
1982}
1983
1984/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1985 specifies the first register number and these registers are included in
1986 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1987 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1988 */
1989
Andreas Färber22169d42013-06-28 21:27:39 +02001990void gdb_register_coprocessor(CPUState *cpu,
1991 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1992 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001993{
1994 GDBRegisterState *s;
1995 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001996
Andreas Färbereac8b352013-06-28 21:11:37 +02001997 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001998 while (*p) {
1999 /* Check for duplicates. */
2000 if (strcmp((*p)->xml, xml) == 0)
2001 return;
2002 p = &(*p)->next;
2003 }
Stefan Weil9643c252011-10-18 22:25:38 +02002004
2005 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02002006 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02002007 s->num_regs = num_regs;
2008 s->get_reg = get_reg;
2009 s->set_reg = set_reg;
2010 s->xml = xml;
2011
pbrook56aebc82008-10-11 17:55:29 +00002012 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02002013 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00002014 *p = s;
2015 if (g_pos) {
2016 if (g_pos != s->base_reg) {
2017 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
2018 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00002019 }
2020 }
2021}
2022
aliguoria1d1bb32008-11-18 20:07:32 +00002023#ifndef CONFIG_USER_ONLY
2024static const int xlat_gdb_type[] = {
2025 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
2026 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
2027 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
2028};
2029#endif
2030
aliguori880a7572008-11-18 20:30:24 +00002031static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00002032{
Andreas Färber182735e2013-05-29 22:29:20 +02002033 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002034 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002035 int err = 0;
2036
Andreas Färber62278812013-06-27 17:12:06 +02002037 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002038 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02002039 }
aliguorie22a25c2009-03-12 20:12:48 +00002040
aliguoria1d1bb32008-11-18 20:07:32 +00002041 switch (type) {
2042 case GDB_BREAKPOINT_SW:
2043 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02002044 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2045 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002046 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
2047 if (err)
2048 break;
2049 }
2050 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002051#ifndef CONFIG_USER_ONLY
2052 case GDB_WATCHPOINT_WRITE:
2053 case GDB_WATCHPOINT_READ:
2054 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02002055 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2056 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002057 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
2058 NULL);
2059 if (err)
2060 break;
2061 }
2062 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002063#endif
2064 default:
2065 return -ENOSYS;
2066 }
2067}
2068
aliguori880a7572008-11-18 20:30:24 +00002069static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00002070{
Andreas Färber182735e2013-05-29 22:29:20 +02002071 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002072 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002073 int err = 0;
2074
Andreas Färber62278812013-06-27 17:12:06 +02002075 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002076 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02002077 }
aliguorie22a25c2009-03-12 20:12:48 +00002078
aliguoria1d1bb32008-11-18 20:07:32 +00002079 switch (type) {
2080 case GDB_BREAKPOINT_SW:
2081 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02002082 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2083 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002084 err = cpu_breakpoint_remove(env, addr, BP_GDB);
2085 if (err)
2086 break;
2087 }
2088 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002089#ifndef CONFIG_USER_ONLY
2090 case GDB_WATCHPOINT_WRITE:
2091 case GDB_WATCHPOINT_READ:
2092 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02002093 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2094 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002095 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
2096 if (err)
2097 break;
2098 }
2099 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002100#endif
2101 default:
2102 return -ENOSYS;
2103 }
2104}
2105
aliguori880a7572008-11-18 20:30:24 +00002106static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00002107{
Andreas Färber182735e2013-05-29 22:29:20 +02002108 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002109 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002110
aliguorie22a25c2009-03-12 20:12:48 +00002111 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002112 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00002113 return;
2114 }
2115
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 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002119#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00002120 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002121#endif
aliguori880a7572008-11-18 20:30:24 +00002122 }
aliguoria1d1bb32008-11-18 20:07:32 +00002123}
2124
aurel32fab9d282009-04-08 21:29:37 +00002125static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
2126{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002127 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02002128 CPUClass *cc = CPU_GET_CLASS(cpu);
2129
2130 cpu_synchronize_state(cpu);
2131 if (cc->set_pc) {
2132 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08002133 }
aurel32fab9d282009-04-08 21:29:37 +00002134}
2135
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002136static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002137{
Andreas Färber0d342822012-12-17 07:12:13 +01002138 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002139
Andreas Färber182735e2013-05-29 22:29:20 +02002140 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02002141 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002142 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02002143 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002144 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02002145
2146 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002147}
2148
aliguori880a7572008-11-18 20:30:24 +00002149static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00002150{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002151 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00002152 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002153 uint32_t thread;
2154 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00002155 char buf[MAX_PACKET_LENGTH];
2156 uint8_t mem_buf[MAX_PACKET_LENGTH];
2157 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00002158 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00002159
bellard858693c2004-03-31 18:52:07 +00002160#ifdef DEBUG_GDB
2161 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00002162#endif
bellard858693c2004-03-31 18:52:07 +00002163 p = line_buf;
2164 ch = *p++;
2165 switch(ch) {
2166 case '?':
bellard1fddef42005-04-17 19:16:13 +00002167 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00002168 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002169 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00002170 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00002171 /* Remove all the breakpoints when this query is issued,
2172 * because gdb is doing and initial connect and the state
2173 * should be cleaned up.
2174 */
aliguori880a7572008-11-18 20:30:24 +00002175 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00002176 break;
2177 case 'c':
2178 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00002179 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002180 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002181 }
aurel32ca587a82008-12-18 22:44:13 +00002182 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00002183 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002184 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00002185 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00002186 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2187 if (s->signal == -1)
2188 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00002189 gdb_continue(s);
2190 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002191 case 'v':
2192 if (strncmp(p, "Cont", 4) == 0) {
2193 int res_signal, res_thread;
2194
2195 p += 4;
2196 if (*p == '?') {
2197 put_packet(s, "vCont;c;C;s;S");
2198 break;
2199 }
2200 res = 0;
2201 res_signal = 0;
2202 res_thread = 0;
2203 while (*p) {
2204 int action, signal;
2205
2206 if (*p++ != ';') {
2207 res = 0;
2208 break;
2209 }
2210 action = *p++;
2211 signal = 0;
2212 if (action == 'C' || action == 'S') {
2213 signal = strtoul(p, (char **)&p, 16);
2214 } else if (action != 'c' && action != 's') {
2215 res = 0;
2216 break;
2217 }
2218 thread = 0;
2219 if (*p == ':') {
2220 thread = strtoull(p+1, (char **)&p, 16);
2221 }
2222 action = tolower(action);
2223 if (res == 0 || (res == 'c' && action == 's')) {
2224 res = action;
2225 res_signal = signal;
2226 res_thread = thread;
2227 }
2228 }
2229 if (res) {
2230 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002231 cpu = find_cpu(res_thread);
2232 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002233 put_packet(s, "E22");
2234 break;
2235 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002236 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002237 }
2238 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002239 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002240 }
2241 s->signal = res_signal;
2242 gdb_continue(s);
2243 return RS_IDLE;
2244 }
2245 break;
2246 } else {
2247 goto unknown_command;
2248 }
edgar_igl7d03f822008-05-17 18:58:29 +00002249 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002250#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002251 /* Kill the target */
2252 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2253 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002254#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002255 case 'D':
2256 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002257 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002258 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002259 gdb_continue(s);
2260 put_packet(s, "OK");
2261 break;
bellard858693c2004-03-31 18:52:07 +00002262 case 's':
2263 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002264 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002265 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002266 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002267 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002268 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002269 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002270 case 'F':
2271 {
2272 target_ulong ret;
2273 target_ulong err;
2274
2275 ret = strtoull(p, (char **)&p, 16);
2276 if (*p == ',') {
2277 p++;
2278 err = strtoull(p, (char **)&p, 16);
2279 } else {
2280 err = 0;
2281 }
2282 if (*p == ',')
2283 p++;
2284 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002285 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002286 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00002287 s->current_syscall_cb = NULL;
2288 }
pbrooka2d1eba2007-01-28 03:10:55 +00002289 if (type == 'C') {
2290 put_packet(s, "T02");
2291 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002292 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002293 }
2294 }
2295 break;
bellard858693c2004-03-31 18:52:07 +00002296 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002297 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00002298 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02002299 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002300 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002301 len += reg_size;
2302 }
2303 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002304 put_packet(s, buf);
2305 break;
2306 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002307 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00002308 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002309 len = strlen(p) / 2;
2310 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02002311 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002312 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002313 len -= reg_size;
2314 registers += reg_size;
2315 }
bellard858693c2004-03-31 18:52:07 +00002316 put_packet(s, "OK");
2317 break;
2318 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002319 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002320 if (*p == ',')
2321 p++;
bellard9d9754a2006-06-25 15:32:37 +00002322 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002323 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002324 put_packet (s, "E14");
2325 } else {
2326 memtohex(buf, mem_buf, len);
2327 put_packet(s, buf);
2328 }
bellard858693c2004-03-31 18:52:07 +00002329 break;
2330 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002331 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002332 if (*p == ',')
2333 p++;
bellard9d9754a2006-06-25 15:32:37 +00002334 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002335 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002336 p++;
2337 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002338 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02002339 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002340 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002341 } else {
bellard858693c2004-03-31 18:52:07 +00002342 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002343 }
bellard858693c2004-03-31 18:52:07 +00002344 break;
pbrook56aebc82008-10-11 17:55:29 +00002345 case 'p':
2346 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2347 This works, but can be very slow. Anything new enough to
2348 understand XML also knows how to use this properly. */
2349 if (!gdb_has_xml)
2350 goto unknown_command;
2351 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002352 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002353 if (reg_size) {
2354 memtohex(buf, mem_buf, reg_size);
2355 put_packet(s, buf);
2356 } else {
2357 put_packet(s, "E14");
2358 }
2359 break;
2360 case 'P':
2361 if (!gdb_has_xml)
2362 goto unknown_command;
2363 addr = strtoull(p, (char **)&p, 16);
2364 if (*p == '=')
2365 p++;
2366 reg_size = strlen(p) / 2;
2367 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002368 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002369 put_packet(s, "OK");
2370 break;
bellard858693c2004-03-31 18:52:07 +00002371 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002372 case 'z':
2373 type = strtoul(p, (char **)&p, 16);
2374 if (*p == ',')
2375 p++;
bellard9d9754a2006-06-25 15:32:37 +00002376 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002377 if (*p == ',')
2378 p++;
bellard9d9754a2006-06-25 15:32:37 +00002379 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002380 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002381 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002382 else
aliguori880a7572008-11-18 20:30:24 +00002383 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002384 if (res >= 0)
2385 put_packet(s, "OK");
2386 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002387 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002388 else
2389 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002390 break;
aliguori880a7572008-11-18 20:30:24 +00002391 case 'H':
2392 type = *p++;
2393 thread = strtoull(p, (char **)&p, 16);
2394 if (thread == -1 || thread == 0) {
2395 put_packet(s, "OK");
2396 break;
2397 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002398 cpu = find_cpu(thread);
2399 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00002400 put_packet(s, "E22");
2401 break;
2402 }
2403 switch (type) {
2404 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002405 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002406 put_packet(s, "OK");
2407 break;
2408 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002409 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002410 put_packet(s, "OK");
2411 break;
2412 default:
2413 put_packet(s, "E22");
2414 break;
2415 }
2416 break;
2417 case 'T':
2418 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002419 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002420
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002421 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002422 put_packet(s, "OK");
2423 } else {
aliguori880a7572008-11-18 20:30:24 +00002424 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002425 }
aliguori880a7572008-11-18 20:30:24 +00002426 break;
pbrook978efd62006-06-17 18:30:42 +00002427 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002428 case 'Q':
2429 /* parse any 'q' packets here */
2430 if (!strcmp(p,"qemu.sstepbits")) {
2431 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002432 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2433 SSTEP_ENABLE,
2434 SSTEP_NOIRQ,
2435 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002436 put_packet(s, buf);
2437 break;
2438 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2439 /* Display or change the sstep_flags */
2440 p += 10;
2441 if (*p != '=') {
2442 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002443 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002444 put_packet(s, buf);
2445 break;
2446 }
2447 p++;
2448 type = strtoul(p, (char **)&p, 16);
2449 sstep_flags = type;
2450 put_packet(s, "OK");
2451 break;
aliguori880a7572008-11-18 20:30:24 +00002452 } else if (strcmp(p,"C") == 0) {
2453 /* "Current thread" remains vague in the spec, so always return
2454 * the first CPU (gdb returns the first thread). */
2455 put_packet(s, "QC1");
2456 break;
2457 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02002458 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00002459 goto report_cpuinfo;
2460 } else if (strcmp(p,"sThreadInfo") == 0) {
2461 report_cpuinfo:
2462 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02002463 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00002464 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02002465 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00002466 } else
2467 put_packet(s, "l");
2468 break;
2469 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2470 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002471 cpu = find_cpu(thread);
2472 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02002473 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002474 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01002475 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01002476 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002477 memtohex(buf, mem_buf, len);
2478 put_packet(s, buf);
2479 }
aliguori880a7572008-11-18 20:30:24 +00002480 break;
edgar_igl60897d32008-05-09 08:25:14 +00002481 }
blueswir10b8a9882009-03-07 10:51:36 +00002482#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002483 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002484 CPUArchState *env = s->c_cpu->env_ptr;
2485 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00002486
blueswir1363a37d2008-08-21 17:58:08 +00002487 snprintf(buf, sizeof(buf),
2488 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2489 ";Bss=" TARGET_ABI_FMT_lx,
2490 ts->info->code_offset,
2491 ts->info->data_offset,
2492 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002493 put_packet(s, buf);
2494 break;
2495 }
blueswir10b8a9882009-03-07 10:51:36 +00002496#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002497 else if (strncmp(p, "Rcmd,", 5) == 0) {
2498 int len = strlen(p + 5);
2499
2500 if ((len % 2) != 0) {
2501 put_packet(s, "E01");
2502 break;
2503 }
2504 hextomem(mem_buf, p + 5, len);
2505 len = len / 2;
2506 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002507 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002508 put_packet(s, "OK");
2509 break;
2510 }
blueswir10b8a9882009-03-07 10:51:36 +00002511#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002512 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002513 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002514#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002515 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002516#endif
2517 put_packet(s, buf);
2518 break;
2519 }
2520#ifdef GDB_CORE_XML
2521 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2522 const char *xml;
2523 target_ulong total_len;
2524
2525 gdb_has_xml = 1;
2526 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002527 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002528 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002529 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002530 put_packet(s, buf);
2531 break;
2532 }
2533
2534 if (*p == ':')
2535 p++;
2536 addr = strtoul(p, (char **)&p, 16);
2537 if (*p == ',')
2538 p++;
2539 len = strtoul(p, (char **)&p, 16);
2540
2541 total_len = strlen(xml);
2542 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002543 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002544 put_packet(s, buf);
2545 break;
2546 }
2547 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2548 len = (MAX_PACKET_LENGTH - 5) / 2;
2549 if (len < total_len - addr) {
2550 buf[0] = 'm';
2551 len = memtox(buf + 1, xml + addr, len);
2552 } else {
2553 buf[0] = 'l';
2554 len = memtox(buf + 1, xml + addr, total_len - addr);
2555 }
2556 put_packet_binary(s, buf, len + 1);
2557 break;
2558 }
2559#endif
2560 /* Unrecognised 'q' command. */
2561 goto unknown_command;
2562
bellard858693c2004-03-31 18:52:07 +00002563 default:
pbrook56aebc82008-10-11 17:55:29 +00002564 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002565 /* put empty packet */
2566 buf[0] = '\0';
2567 put_packet(s, buf);
2568 break;
2569 }
2570 return RS_IDLE;
2571}
2572
Andreas Färber64f6b342013-05-27 02:06:09 +02002573void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00002574{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002575 gdbserver_state->c_cpu = cpu;
2576 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002577}
2578
bellard1fddef42005-04-17 19:16:13 +00002579#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002580static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002581{
aliguori880a7572008-11-18 20:30:24 +00002582 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002583 CPUArchState *env = s->c_cpu->env_ptr;
2584 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002585 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002586 const char *type;
bellard858693c2004-03-31 18:52:07 +00002587 int ret;
2588
Meador Ingecdb432b2012-03-15 17:49:45 +00002589 if (running || s->state == RS_INACTIVE) {
2590 return;
2591 }
2592 /* Is there a GDB syscall waiting to be sent? */
2593 if (s->current_syscall_cb) {
2594 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002595 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002596 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002597 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002598 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002599 if (env->watchpoint_hit) {
2600 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002601 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002602 type = "r";
2603 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002604 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002605 type = "a";
2606 break;
2607 default:
2608 type = "";
2609 break;
2610 }
aliguori880a7572008-11-18 20:30:24 +00002611 snprintf(buf, sizeof(buf),
2612 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002613 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002614 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002615 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002616 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002617 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002618 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002619 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002620 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002621 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002622 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002623 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002624 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002625 ret = GDB_SIGNAL_QUIT;
2626 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002627 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002628 ret = GDB_SIGNAL_IO;
2629 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002630 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002631 ret = GDB_SIGNAL_ALRM;
2632 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002633 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002634 ret = GDB_SIGNAL_ABRT;
2635 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002636 case RUN_STATE_SAVE_VM:
2637 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002638 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002639 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002640 ret = GDB_SIGNAL_XCPU;
2641 break;
2642 default:
2643 ret = GDB_SIGNAL_UNKNOWN;
2644 break;
bellardbbeb7b52006-04-23 18:42:15 +00002645 }
Andreas Färber0d342822012-12-17 07:12:13 +01002646 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002647
2648send_packet:
bellard858693c2004-03-31 18:52:07 +00002649 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002650
2651 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002652 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002653}
bellard1fddef42005-04-17 19:16:13 +00002654#endif
bellard858693c2004-03-31 18:52:07 +00002655
pbrooka2d1eba2007-01-28 03:10:55 +00002656/* Send a gdb syscall request.
2657 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002658 %x - target_ulong argument printed in hex.
2659 %lx - 64-bit argument printed in hex.
2660 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002661void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002662{
2663 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002664 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002665 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002666 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002667 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002668 GDBState *s;
2669
aliguori880a7572008-11-18 20:30:24 +00002670 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002671 if (!s)
2672 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002673 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002674#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002675 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002676#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002677 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002678 p = s->syscall_buf;
2679 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002680 *(p++) = 'F';
2681 while (*fmt) {
2682 if (*fmt == '%') {
2683 fmt++;
2684 switch (*fmt++) {
2685 case 'x':
2686 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002687 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002688 break;
pbrooka87295e2007-05-26 15:09:38 +00002689 case 'l':
2690 if (*(fmt++) != 'x')
2691 goto bad_format;
2692 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002693 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002694 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002695 case 's':
2696 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002697 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002698 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002699 break;
2700 default:
pbrooka87295e2007-05-26 15:09:38 +00002701 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002702 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2703 fmt - 1);
2704 break;
2705 }
2706 } else {
2707 *(p++) = *(fmt++);
2708 }
2709 }
pbrook8a93e022007-08-06 13:19:15 +00002710 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002711 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002712#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002713 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002714 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002715#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002716 /* In this case wait to send the syscall packet until notification that
2717 the CPU has stopped. This must be done because if the packet is sent
2718 now the reply from the syscall request could be received while the CPU
2719 is still in the running state, which can cause packets to be dropped
2720 and state transition 'T' packets to be sent while the syscall is still
2721 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002722 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002723#endif
2724}
2725
bellard6a00d602005-11-21 23:25:50 +00002726static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002727{
2728 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002729 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002730
bellard1fddef42005-04-17 19:16:13 +00002731#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002732 if (s->last_packet_len) {
2733 /* Waiting for a response to the last packet. If we see the start
2734 of a new command then abandon the previous response. */
2735 if (ch == '-') {
2736#ifdef DEBUG_GDB
2737 printf("Got NACK, retransmitting\n");
2738#endif
thsffe8ab82007-12-16 03:16:05 +00002739 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002740 }
2741#ifdef DEBUG_GDB
2742 else if (ch == '+')
2743 printf("Got ACK\n");
2744 else
2745 printf("Got '%c' when expecting ACK/NACK\n", ch);
2746#endif
2747 if (ch == '+' || ch == '$')
2748 s->last_packet_len = 0;
2749 if (ch != '$')
2750 return;
2751 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002752 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002753 /* when the CPU is running, we cannot do anything except stop
2754 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002755 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002756 } else
bellard1fddef42005-04-17 19:16:13 +00002757#endif
bellard41625032005-04-24 10:07:11 +00002758 {
bellard858693c2004-03-31 18:52:07 +00002759 switch(s->state) {
2760 case RS_IDLE:
2761 if (ch == '$') {
2762 s->line_buf_index = 0;
2763 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002764 }
2765 break;
bellard858693c2004-03-31 18:52:07 +00002766 case RS_GETLINE:
2767 if (ch == '#') {
2768 s->state = RS_CHKSUM1;
2769 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2770 s->state = RS_IDLE;
2771 } else {
2772 s->line_buf[s->line_buf_index++] = ch;
2773 }
2774 break;
2775 case RS_CHKSUM1:
2776 s->line_buf[s->line_buf_index] = '\0';
2777 s->line_csum = fromhex(ch) << 4;
2778 s->state = RS_CHKSUM2;
2779 break;
2780 case RS_CHKSUM2:
2781 s->line_csum |= fromhex(ch);
2782 csum = 0;
2783 for(i = 0; i < s->line_buf_index; i++) {
2784 csum += s->line_buf[i];
2785 }
2786 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002787 reply = '-';
2788 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002789 s->state = RS_IDLE;
2790 } else {
ths60fe76f2007-12-16 03:02:09 +00002791 reply = '+';
2792 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002793 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002794 }
bellardb4608c02003-06-27 17:34:32 +00002795 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002796 default:
2797 abort();
bellardb4608c02003-06-27 17:34:32 +00002798 }
2799 }
bellard858693c2004-03-31 18:52:07 +00002800}
2801
Paul Brook0e1c9c52010-06-16 13:03:51 +01002802/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002803void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002804{
2805 GDBState *s;
2806 char buf[4];
2807
2808 s = gdbserver_state;
2809 if (!s) {
2810 return;
2811 }
2812#ifdef CONFIG_USER_ONLY
2813 if (gdbserver_fd < 0 || s->fd < 0) {
2814 return;
2815 }
2816#endif
2817
2818 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2819 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002820
2821#ifndef CONFIG_USER_ONLY
2822 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002823 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002824 }
2825#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002826}
2827
bellard1fddef42005-04-17 19:16:13 +00002828#ifdef CONFIG_USER_ONLY
2829int
aurel32ca587a82008-12-18 22:44:13 +00002830gdb_queuesig (void)
2831{
2832 GDBState *s;
2833
2834 s = gdbserver_state;
2835
2836 if (gdbserver_fd < 0 || s->fd < 0)
2837 return 0;
2838 else
2839 return 1;
2840}
2841
2842int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002843gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002844{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002845 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002846 GDBState *s;
2847 char buf[256];
2848 int n;
bellard1fddef42005-04-17 19:16:13 +00002849
Andreas Färber5ca666c2013-06-24 19:20:57 +02002850 s = gdbserver_state;
2851 if (gdbserver_fd < 0 || s->fd < 0) {
2852 return sig;
bellard1fddef42005-04-17 19:16:13 +00002853 }
2854
Andreas Färber5ca666c2013-06-24 19:20:57 +02002855 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002856 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002857 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002858
Andreas Färber5ca666c2013-06-24 19:20:57 +02002859 if (sig != 0) {
2860 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2861 put_packet(s, buf);
2862 }
2863 /* put_packet() might have detected that the peer terminated the
2864 connection. */
2865 if (s->fd < 0) {
2866 return sig;
2867 }
2868
2869 sig = 0;
2870 s->state = RS_IDLE;
2871 s->running_state = 0;
2872 while (s->running_state == 0) {
2873 n = read(s->fd, buf, 256);
2874 if (n > 0) {
2875 int i;
2876
2877 for (i = 0; i < n; i++) {
2878 gdb_read_byte(s, buf[i]);
2879 }
2880 } else if (n == 0 || errno != EAGAIN) {
2881 /* XXX: Connection closed. Should probably wait for another
2882 connection before continuing. */
2883 return sig;
bellard1fddef42005-04-17 19:16:13 +00002884 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002885 }
2886 sig = s->signal;
2887 s->signal = 0;
2888 return sig;
bellard1fddef42005-04-17 19:16:13 +00002889}
bellarde9009672005-04-26 20:42:36 +00002890
aurel32ca587a82008-12-18 22:44:13 +00002891/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002892void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002893{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002894 GDBState *s;
2895 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002896
Andreas Färber5ca666c2013-06-24 19:20:57 +02002897 s = gdbserver_state;
2898 if (gdbserver_fd < 0 || s->fd < 0) {
2899 return;
2900 }
aurel32ca587a82008-12-18 22:44:13 +00002901
Andreas Färber5ca666c2013-06-24 19:20:57 +02002902 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2903 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002904}
bellard1fddef42005-04-17 19:16:13 +00002905
aliguori880a7572008-11-18 20:30:24 +00002906static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002907{
2908 GDBState *s;
2909 struct sockaddr_in sockaddr;
2910 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002911 int fd;
bellard858693c2004-03-31 18:52:07 +00002912
2913 for(;;) {
2914 len = sizeof(sockaddr);
2915 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2916 if (fd < 0 && errno != EINTR) {
2917 perror("accept");
2918 return;
2919 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002920#ifndef _WIN32
2921 fcntl(fd, F_SETFD, FD_CLOEXEC);
2922#endif
bellard858693c2004-03-31 18:52:07 +00002923 break;
2924 }
2925 }
2926
2927 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002928 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002929
Anthony Liguori7267c092011-08-20 22:09:37 -05002930 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002931 s->c_cpu = first_cpu;
2932 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002933 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002934 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002935
aliguori880a7572008-11-18 20:30:24 +00002936 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002937
bellard858693c2004-03-31 18:52:07 +00002938 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002939}
2940
2941static int gdbserver_open(int port)
2942{
2943 struct sockaddr_in sockaddr;
2944 int fd, val, ret;
2945
2946 fd = socket(PF_INET, SOCK_STREAM, 0);
2947 if (fd < 0) {
2948 perror("socket");
2949 return -1;
2950 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002951#ifndef _WIN32
2952 fcntl(fd, F_SETFD, FD_CLOEXEC);
2953#endif
bellard858693c2004-03-31 18:52:07 +00002954
2955 /* allow fast reuse */
2956 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002957 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002958
2959 sockaddr.sin_family = AF_INET;
2960 sockaddr.sin_port = htons(port);
2961 sockaddr.sin_addr.s_addr = 0;
2962 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2963 if (ret < 0) {
2964 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002965 close(fd);
bellard858693c2004-03-31 18:52:07 +00002966 return -1;
2967 }
2968 ret = listen(fd, 0);
2969 if (ret < 0) {
2970 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002971 close(fd);
bellard858693c2004-03-31 18:52:07 +00002972 return -1;
2973 }
bellard858693c2004-03-31 18:52:07 +00002974 return fd;
2975}
2976
2977int gdbserver_start(int port)
2978{
2979 gdbserver_fd = gdbserver_open(port);
2980 if (gdbserver_fd < 0)
2981 return -1;
2982 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002983 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002984 return 0;
2985}
aurel322b1319c2008-12-18 22:44:04 +00002986
2987/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002988void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002989{
2990 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002991 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002992 return;
2993 close(s->fd);
2994 s->fd = -1;
2995 cpu_breakpoint_remove_all(env, BP_GDB);
2996 cpu_watchpoint_remove_all(env, BP_GDB);
2997}
pbrook4046d912007-01-28 01:53:16 +00002998#else
thsaa1f17c2007-07-11 22:48:58 +00002999static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00003000{
pbrook56aebc82008-10-11 17:55:29 +00003001 /* We can handle an arbitrarily large amount of data.
3002 Pick the maximum packet size, which is as good as anything. */
3003 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00003004}
3005
thsaa1f17c2007-07-11 22:48:58 +00003006static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00003007{
pbrook4046d912007-01-28 01:53:16 +00003008 int i;
3009
3010 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00003011 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00003012 }
3013}
3014
3015static void gdb_chr_event(void *opaque, int event)
3016{
3017 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05303018 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03003019 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00003020 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00003021 break;
3022 default:
3023 break;
3024 }
3025}
3026
aliguori8a34a0f2009-03-05 23:01:55 +00003027static void gdb_monitor_output(GDBState *s, const char *msg, int len)
3028{
3029 char buf[MAX_PACKET_LENGTH];
3030
3031 buf[0] = 'O';
3032 if (len > (MAX_PACKET_LENGTH/2) - 1)
3033 len = (MAX_PACKET_LENGTH/2) - 1;
3034 memtohex(buf + 1, (uint8_t *)msg, len);
3035 put_packet(s, buf);
3036}
3037
3038static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
3039{
3040 const char *p = (const char *)buf;
3041 int max_sz;
3042
3043 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
3044 for (;;) {
3045 if (len <= max_sz) {
3046 gdb_monitor_output(gdbserver_state, p, len);
3047 break;
3048 }
3049 gdb_monitor_output(gdbserver_state, p, max_sz);
3050 p += max_sz;
3051 len -= max_sz;
3052 }
3053 return len;
3054}
3055
aliguori59030a82009-04-05 18:43:41 +00003056#ifndef _WIN32
3057static void gdb_sigterm_handler(int signal)
3058{
Luiz Capitulino13548692011-07-29 15:36:43 -03003059 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03003060 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01003061 }
aliguori59030a82009-04-05 18:43:41 +00003062}
3063#endif
3064
3065int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00003066{
3067 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00003068 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00003069 CharDriverState *chr = NULL;
3070 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00003071
aliguori59030a82009-04-05 18:43:41 +00003072 if (!device)
3073 return -1;
3074 if (strcmp(device, "none") != 0) {
3075 if (strstart(device, "tcp:", NULL)) {
3076 /* enforce required TCP attributes */
3077 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
3078 "%s,nowait,nodelay,server", device);
3079 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00003080 }
aliguori59030a82009-04-05 18:43:41 +00003081#ifndef _WIN32
3082 else if (strcmp(device, "stdio") == 0) {
3083 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00003084
aliguori59030a82009-04-05 18:43:41 +00003085 memset(&act, 0, sizeof(act));
3086 act.sa_handler = gdb_sigterm_handler;
3087 sigaction(SIGINT, &act, NULL);
3088 }
3089#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05003090 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00003091 if (!chr)
3092 return -1;
3093
Hans de Goede456d6062013-03-27 20:29:40 +01003094 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00003095 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
3096 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00003097 }
3098
aliguori36556b22009-03-28 18:05:53 +00003099 s = gdbserver_state;
3100 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003101 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00003102 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00003103
aliguori36556b22009-03-28 18:05:53 +00003104 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3105
3106 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05003107 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00003108 mon_chr->chr_write = gdb_monitor_write;
3109 monitor_init(mon_chr, 0);
3110 } else {
3111 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05003112 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00003113 mon_chr = s->mon_chr;
3114 memset(s, 0, sizeof(GDBState));
3115 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02003116 s->c_cpu = first_cpu;
3117 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00003118 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00003119 s->state = chr ? RS_IDLE : RS_INACTIVE;
3120 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00003121 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00003122
pbrook4046d912007-01-28 01:53:16 +00003123 return 0;
3124}
3125#endif