blob: e58d06ead94ec14c507db79f588bb0253d47174c [file] [log] [blame]
bellardb4608c02003-06-27 17:34:32 +00001/*
2 * gdb server stub
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard34751872005-07-02 14:31:34 +00004 * Copyright (c) 2003-2005 Fabrice Bellard
bellardb4608c02003-06-27 17:34:32 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
Blue Swirl8167ee82009-07-16 20:47:01 +000017 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
bellardb4608c02003-06-27 17:34:32 +000018 */
pbrook978efd62006-06-17 18:30:42 +000019#include "config.h"
pbrook56aebc82008-10-11 17:55:29 +000020#include "qemu-common.h"
bellard1fddef42005-04-17 19:16:13 +000021#ifdef CONFIG_USER_ONLY
22#include <stdlib.h>
23#include <stdio.h>
24#include <stdarg.h>
25#include <string.h>
26#include <errno.h>
27#include <unistd.h>
pbrook978efd62006-06-17 18:30:42 +000028#include <fcntl.h>
bellard1fddef42005-04-17 19:16:13 +000029
30#include "qemu.h"
31#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010032#include "monitor/monitor.h"
Paolo Bonzinidccfcd02013-04-08 16:55:25 +020033#include "sysemu/char.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010034#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010035#include "exec/gdbstub.h"
bellard1fddef42005-04-17 19:16:13 +000036#endif
bellard67b915a2004-03-31 23:37:16 +000037
pbrook56aebc82008-10-11 17:55:29 +000038#define MAX_PACKET_LENGTH 4096
39
Blue Swirl2b41f102011-06-19 20:38:22 +000040#include "cpu.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010041#include "qemu/sockets.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010042#include "sysemu/kvm.h"
Richard Henderson6ee77b12012-08-23 10:44:45 -070043#include "qemu/bitops.h"
aurel32ca587a82008-12-18 22:44:13 +000044
Andreas Färberf3659ee2013-06-27 19:09:09 +020045static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
46 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020047{
Andreas Färberf3659ee2013-06-27 19:09:09 +020048 CPUClass *cc = CPU_GET_CLASS(cpu);
49
50 if (cc->memory_rw_debug) {
51 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
52 }
53 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020054}
aurel32ca587a82008-12-18 22:44:13 +000055
56enum {
57 GDB_SIGNAL_0 = 0,
58 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010059 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000060 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010061 GDB_SIGNAL_ABRT = 6,
62 GDB_SIGNAL_ALRM = 14,
63 GDB_SIGNAL_IO = 23,
64 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000065 GDB_SIGNAL_UNKNOWN = 143
66};
67
68#ifdef CONFIG_USER_ONLY
69
70/* Map target signal numbers to GDB protocol signal numbers and vice
71 * versa. For user emulation's currently supported systems, we can
72 * assume most signals are defined.
73 */
74
75static int gdb_signal_table[] = {
76 0,
77 TARGET_SIGHUP,
78 TARGET_SIGINT,
79 TARGET_SIGQUIT,
80 TARGET_SIGILL,
81 TARGET_SIGTRAP,
82 TARGET_SIGABRT,
83 -1, /* SIGEMT */
84 TARGET_SIGFPE,
85 TARGET_SIGKILL,
86 TARGET_SIGBUS,
87 TARGET_SIGSEGV,
88 TARGET_SIGSYS,
89 TARGET_SIGPIPE,
90 TARGET_SIGALRM,
91 TARGET_SIGTERM,
92 TARGET_SIGURG,
93 TARGET_SIGSTOP,
94 TARGET_SIGTSTP,
95 TARGET_SIGCONT,
96 TARGET_SIGCHLD,
97 TARGET_SIGTTIN,
98 TARGET_SIGTTOU,
99 TARGET_SIGIO,
100 TARGET_SIGXCPU,
101 TARGET_SIGXFSZ,
102 TARGET_SIGVTALRM,
103 TARGET_SIGPROF,
104 TARGET_SIGWINCH,
105 -1, /* SIGLOST */
106 TARGET_SIGUSR1,
107 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000108#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000109 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000110#else
111 -1,
112#endif
aurel32ca587a82008-12-18 22:44:13 +0000113 -1, /* SIGPOLL */
114 -1,
115 -1,
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
123 -1,
124 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000125#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000126 __SIGRTMIN + 1,
127 __SIGRTMIN + 2,
128 __SIGRTMIN + 3,
129 __SIGRTMIN + 4,
130 __SIGRTMIN + 5,
131 __SIGRTMIN + 6,
132 __SIGRTMIN + 7,
133 __SIGRTMIN + 8,
134 __SIGRTMIN + 9,
135 __SIGRTMIN + 10,
136 __SIGRTMIN + 11,
137 __SIGRTMIN + 12,
138 __SIGRTMIN + 13,
139 __SIGRTMIN + 14,
140 __SIGRTMIN + 15,
141 __SIGRTMIN + 16,
142 __SIGRTMIN + 17,
143 __SIGRTMIN + 18,
144 __SIGRTMIN + 19,
145 __SIGRTMIN + 20,
146 __SIGRTMIN + 21,
147 __SIGRTMIN + 22,
148 __SIGRTMIN + 23,
149 __SIGRTMIN + 24,
150 __SIGRTMIN + 25,
151 __SIGRTMIN + 26,
152 __SIGRTMIN + 27,
153 __SIGRTMIN + 28,
154 __SIGRTMIN + 29,
155 __SIGRTMIN + 30,
156 __SIGRTMIN + 31,
157 -1, /* SIGCANCEL */
158 __SIGRTMIN,
159 __SIGRTMIN + 32,
160 __SIGRTMIN + 33,
161 __SIGRTMIN + 34,
162 __SIGRTMIN + 35,
163 __SIGRTMIN + 36,
164 __SIGRTMIN + 37,
165 __SIGRTMIN + 38,
166 __SIGRTMIN + 39,
167 __SIGRTMIN + 40,
168 __SIGRTMIN + 41,
169 __SIGRTMIN + 42,
170 __SIGRTMIN + 43,
171 __SIGRTMIN + 44,
172 __SIGRTMIN + 45,
173 __SIGRTMIN + 46,
174 __SIGRTMIN + 47,
175 __SIGRTMIN + 48,
176 __SIGRTMIN + 49,
177 __SIGRTMIN + 50,
178 __SIGRTMIN + 51,
179 __SIGRTMIN + 52,
180 __SIGRTMIN + 53,
181 __SIGRTMIN + 54,
182 __SIGRTMIN + 55,
183 __SIGRTMIN + 56,
184 __SIGRTMIN + 57,
185 __SIGRTMIN + 58,
186 __SIGRTMIN + 59,
187 __SIGRTMIN + 60,
188 __SIGRTMIN + 61,
189 __SIGRTMIN + 62,
190 __SIGRTMIN + 63,
191 __SIGRTMIN + 64,
192 __SIGRTMIN + 65,
193 __SIGRTMIN + 66,
194 __SIGRTMIN + 67,
195 __SIGRTMIN + 68,
196 __SIGRTMIN + 69,
197 __SIGRTMIN + 70,
198 __SIGRTMIN + 71,
199 __SIGRTMIN + 72,
200 __SIGRTMIN + 73,
201 __SIGRTMIN + 74,
202 __SIGRTMIN + 75,
203 __SIGRTMIN + 76,
204 __SIGRTMIN + 77,
205 __SIGRTMIN + 78,
206 __SIGRTMIN + 79,
207 __SIGRTMIN + 80,
208 __SIGRTMIN + 81,
209 __SIGRTMIN + 82,
210 __SIGRTMIN + 83,
211 __SIGRTMIN + 84,
212 __SIGRTMIN + 85,
213 __SIGRTMIN + 86,
214 __SIGRTMIN + 87,
215 __SIGRTMIN + 88,
216 __SIGRTMIN + 89,
217 __SIGRTMIN + 90,
218 __SIGRTMIN + 91,
219 __SIGRTMIN + 92,
220 __SIGRTMIN + 93,
221 __SIGRTMIN + 94,
222 __SIGRTMIN + 95,
223 -1, /* SIGINFO */
224 -1, /* UNKNOWN */
225 -1, /* DEFAULT */
226 -1,
227 -1,
228 -1,
229 -1,
230 -1,
231 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000232#endif
aurel32ca587a82008-12-18 22:44:13 +0000233};
bellard8f447cc2006-06-14 15:21:14 +0000234#else
aurel32ca587a82008-12-18 22:44:13 +0000235/* In system mode we only need SIGINT and SIGTRAP; other signals
236 are not yet supported. */
237
238enum {
239 TARGET_SIGINT = 2,
240 TARGET_SIGTRAP = 5
241};
242
243static int gdb_signal_table[] = {
244 -1,
245 -1,
246 TARGET_SIGINT,
247 -1,
248 -1,
249 TARGET_SIGTRAP
250};
bellard8f447cc2006-06-14 15:21:14 +0000251#endif
bellardb4608c02003-06-27 17:34:32 +0000252
aurel32ca587a82008-12-18 22:44:13 +0000253#ifdef CONFIG_USER_ONLY
254static int target_signal_to_gdb (int sig)
255{
256 int i;
257 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
258 if (gdb_signal_table[i] == sig)
259 return i;
260 return GDB_SIGNAL_UNKNOWN;
261}
262#endif
263
264static int gdb_signal_to_target (int sig)
265{
266 if (sig < ARRAY_SIZE (gdb_signal_table))
267 return gdb_signal_table[sig];
268 else
269 return -1;
270}
271
bellard4abe6152003-07-26 18:01:58 +0000272//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000273
pbrook56aebc82008-10-11 17:55:29 +0000274typedef struct GDBRegisterState {
275 int base_reg;
276 int num_regs;
277 gdb_reg_cb get_reg;
278 gdb_reg_cb set_reg;
279 const char *xml;
280 struct GDBRegisterState *next;
281} GDBRegisterState;
282
bellard858693c2004-03-31 18:52:07 +0000283enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000284 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000285 RS_IDLE,
286 RS_GETLINE,
287 RS_CHKSUM1,
288 RS_CHKSUM2,
289};
bellard858693c2004-03-31 18:52:07 +0000290typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200291 CPUState *c_cpu; /* current CPU for step/continue ops */
292 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200293 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000294 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000295 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000296 int line_buf_index;
297 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000298 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000299 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000300 int signal;
bellard41625032005-04-24 10:07:11 +0000301#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000302 int fd;
bellard41625032005-04-24 10:07:11 +0000303 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000304#else
305 CharDriverState *chr;
aliguori8a34a0f2009-03-05 23:01:55 +0000306 CharDriverState *mon_chr;
bellard41625032005-04-24 10:07:11 +0000307#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000308 char syscall_buf[256];
309 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000310} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000311
edgar_igl60897d32008-05-09 08:25:14 +0000312/* By default use no IRQs and no timers while single stepping so as to
313 * make single stepping like an ICE HW step.
314 */
315static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
316
aliguori880a7572008-11-18 20:30:24 +0000317static GDBState *gdbserver_state;
318
pbrook56aebc82008-10-11 17:55:29 +0000319/* This is an ugly hack to cope with both new and old gdb.
320 If gdb sends qXfer:features:read then assume we're talking to a newish
321 gdb that understands target descriptions. */
322static int gdb_has_xml;
323
bellard1fddef42005-04-17 19:16:13 +0000324#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000325/* XXX: This is not thread safe. Do we care? */
326static int gdbserver_fd = -1;
327
bellard858693c2004-03-31 18:52:07 +0000328static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000329{
330 uint8_t ch;
331 int ret;
332
333 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000334 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000335 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000336 if (errno == ECONNRESET)
337 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000338 if (errno != EINTR && errno != EAGAIN)
339 return -1;
340 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000341 close(s->fd);
342 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000343 return -1;
344 } else {
345 break;
346 }
347 }
348 return ch;
349}
pbrook4046d912007-01-28 01:53:16 +0000350#endif
bellardb4608c02003-06-27 17:34:32 +0000351
blueswir1654efcf2009-04-18 07:29:59 +0000352static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000353 GDB_SYS_UNKNOWN,
354 GDB_SYS_ENABLED,
355 GDB_SYS_DISABLED,
356} gdb_syscall_mode;
357
358/* If gdb is connected when the first semihosting syscall occurs then use
359 remote gdb syscalls. Otherwise use native file IO. */
360int use_gdb_syscalls(void)
361{
362 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000363 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
364 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000365 }
366 return gdb_syscall_mode == GDB_SYS_ENABLED;
367}
368
edgar_iglba70a622008-03-14 06:10:42 +0000369/* Resume execution. */
370static inline void gdb_continue(GDBState *s)
371{
372#ifdef CONFIG_USER_ONLY
373 s->running_state = 1;
374#else
Paolo Bonzinibc7d0e62013-06-03 17:06:55 +0200375 if (runstate_check(RUN_STATE_GUEST_PANICKED)) {
376 runstate_set(RUN_STATE_DEBUG);
377 }
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200378 if (!runstate_needs_reset()) {
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200379 vm_start();
380 }
edgar_iglba70a622008-03-14 06:10:42 +0000381#endif
382}
383
bellard858693c2004-03-31 18:52:07 +0000384static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000385{
pbrook4046d912007-01-28 01:53:16 +0000386#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000387 int ret;
388
389 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000390 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000391 if (ret < 0) {
392 if (errno != EINTR && errno != EAGAIN)
393 return;
394 } else {
395 buf += ret;
396 len -= ret;
397 }
398 }
pbrook4046d912007-01-28 01:53:16 +0000399#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500400 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000401#endif
bellardb4608c02003-06-27 17:34:32 +0000402}
403
404static inline int fromhex(int v)
405{
406 if (v >= '0' && v <= '9')
407 return v - '0';
408 else if (v >= 'A' && v <= 'F')
409 return v - 'A' + 10;
410 else if (v >= 'a' && v <= 'f')
411 return v - 'a' + 10;
412 else
413 return 0;
414}
415
416static inline int tohex(int v)
417{
418 if (v < 10)
419 return v + '0';
420 else
421 return v - 10 + 'a';
422}
423
424static void memtohex(char *buf, const uint8_t *mem, int len)
425{
426 int i, c;
427 char *q;
428 q = buf;
429 for(i = 0; i < len; i++) {
430 c = mem[i];
431 *q++ = tohex(c >> 4);
432 *q++ = tohex(c & 0xf);
433 }
434 *q = '\0';
435}
436
437static void hextomem(uint8_t *mem, const char *buf, int len)
438{
439 int i;
440
441 for(i = 0; i < len; i++) {
442 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
443 buf += 2;
444 }
445}
446
bellardb4608c02003-06-27 17:34:32 +0000447/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000448static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000449{
pbrook56aebc82008-10-11 17:55:29 +0000450 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000451 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000452
bellardb4608c02003-06-27 17:34:32 +0000453 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000454 p = s->last_packet;
455 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000456 memcpy(p, buf, len);
457 p += len;
bellardb4608c02003-06-27 17:34:32 +0000458 csum = 0;
459 for(i = 0; i < len; i++) {
460 csum += buf[i];
461 }
pbrook4046d912007-01-28 01:53:16 +0000462 *(p++) = '#';
463 *(p++) = tohex((csum >> 4) & 0xf);
464 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000465
pbrook4046d912007-01-28 01:53:16 +0000466 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000467 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000468
pbrook4046d912007-01-28 01:53:16 +0000469#ifdef CONFIG_USER_ONLY
470 i = get_char(s);
471 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000472 return -1;
pbrook4046d912007-01-28 01:53:16 +0000473 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000474 break;
pbrook4046d912007-01-28 01:53:16 +0000475#else
476 break;
477#endif
bellardb4608c02003-06-27 17:34:32 +0000478 }
479 return 0;
480}
481
pbrook56aebc82008-10-11 17:55:29 +0000482/* return -1 if error, 0 if OK */
483static int put_packet(GDBState *s, const char *buf)
484{
485#ifdef DEBUG_GDB
486 printf("reply='%s'\n", buf);
487#endif
488
489 return put_packet_binary(s, buf, strlen(buf));
490}
491
492/* The GDB remote protocol transfers values in target byte order. This means
493 we can use the raw memory access routines to access the value buffer.
494 Conveniently, these also handle the case where the buffer is mis-aligned.
495 */
496#define GET_REG8(val) do { \
497 stb_p(mem_buf, val); \
498 return 1; \
499 } while(0)
500#define GET_REG16(val) do { \
501 stw_p(mem_buf, val); \
502 return 2; \
503 } while(0)
504#define GET_REG32(val) do { \
505 stl_p(mem_buf, val); \
506 return 4; \
507 } while(0)
508#define GET_REG64(val) do { \
509 stq_p(mem_buf, val); \
510 return 8; \
511 } while(0)
512
513#if TARGET_LONG_BITS == 64
514#define GET_REGL(val) GET_REG64(val)
515#define ldtul_p(addr) ldq_p(addr)
516#else
517#define GET_REGL(val) GET_REG32(val)
518#define ldtul_p(addr) ldl_p(addr)
519#endif
520
edgar_iglfde3fd62008-05-09 08:50:01 +0000521#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000522
523#ifdef TARGET_X86_64
pbrook56aebc82008-10-11 17:55:29 +0000524static const int gpr_map[16] = {
bellard79808572008-05-09 14:40:22 +0000525 R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
pbrook56aebc82008-10-11 17:55:29 +0000526 8, 9, 10, 11, 12, 13, 14, 15
bellard79808572008-05-09 14:40:22 +0000527};
bellard79808572008-05-09 14:40:22 +0000528#else
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200529#define gpr_map gpr_map32
bellard79808572008-05-09 14:40:22 +0000530#endif
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200531static const int gpr_map32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
pbrook56aebc82008-10-11 17:55:29 +0000532
533#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
534
Jan Kiszkab1631e72009-06-27 09:53:51 +0200535#define IDX_IP_REG CPU_NB_REGS
536#define IDX_FLAGS_REG (IDX_IP_REG + 1)
537#define IDX_SEG_REGS (IDX_FLAGS_REG + 1)
538#define IDX_FP_REGS (IDX_SEG_REGS + 6)
539#define IDX_XMM_REGS (IDX_FP_REGS + 16)
540#define IDX_MXCSR_REG (IDX_XMM_REGS + CPU_NB_REGS)
541
Andreas Färberf3840912012-02-20 06:44:56 +0100542static int cpu_gdb_read_register(CPUX86State *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000543{
544 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200545 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
546 GET_REG64(env->regs[gpr_map[n]]);
547 } else if (n < CPU_NB_REGS32) {
548 GET_REG32(env->regs[gpr_map32[n]]);
549 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200550 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000551#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200552 /* FIXME: byteswap float values - after fixing fpregs layout. */
553 memcpy(mem_buf, &env->fpregs[n - IDX_FP_REGS], 10);
pbrook56aebc82008-10-11 17:55:29 +0000554#else
555 memset(mem_buf, 0, 10);
556#endif
557 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200558 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
559 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200560 if (n < CPU_NB_REGS32 ||
561 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
562 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
563 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
564 return 16;
565 }
pbrook56aebc82008-10-11 17:55:29 +0000566 } else {
pbrook56aebc82008-10-11 17:55:29 +0000567 switch (n) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200568 case IDX_IP_REG:
569 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
570 GET_REG64(env->eip);
571 } else {
572 GET_REG32(env->eip);
573 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200574 case IDX_FLAGS_REG: GET_REG32(env->eflags);
575
576 case IDX_SEG_REGS: GET_REG32(env->segs[R_CS].selector);
577 case IDX_SEG_REGS + 1: GET_REG32(env->segs[R_SS].selector);
578 case IDX_SEG_REGS + 2: GET_REG32(env->segs[R_DS].selector);
579 case IDX_SEG_REGS + 3: GET_REG32(env->segs[R_ES].selector);
580 case IDX_SEG_REGS + 4: GET_REG32(env->segs[R_FS].selector);
581 case IDX_SEG_REGS + 5: GET_REG32(env->segs[R_GS].selector);
582
583 case IDX_FP_REGS + 8: GET_REG32(env->fpuc);
584 case IDX_FP_REGS + 9: GET_REG32((env->fpus & ~0x3800) |
585 (env->fpstt & 0x7) << 11);
586 case IDX_FP_REGS + 10: GET_REG32(0); /* ftag */
587 case IDX_FP_REGS + 11: GET_REG32(0); /* fiseg */
588 case IDX_FP_REGS + 12: GET_REG32(0); /* fioff */
589 case IDX_FP_REGS + 13: GET_REG32(0); /* foseg */
590 case IDX_FP_REGS + 14: GET_REG32(0); /* fooff */
591 case IDX_FP_REGS + 15: GET_REG32(0); /* fop */
592
593 case IDX_MXCSR_REG: GET_REG32(env->mxcsr);
pbrook56aebc82008-10-11 17:55:29 +0000594 }
bellard79808572008-05-09 14:40:22 +0000595 }
pbrook56aebc82008-10-11 17:55:29 +0000596 return 0;
bellard79808572008-05-09 14:40:22 +0000597}
598
Andreas Färberf3840912012-02-20 06:44:56 +0100599static int cpu_x86_gdb_load_seg(CPUX86State *env, int sreg, uint8_t *mem_buf)
Jan Kiszka84273172009-06-27 09:53:51 +0200600{
601 uint16_t selector = ldl_p(mem_buf);
602
603 if (selector != env->segs[sreg].selector) {
604#if defined(CONFIG_USER_ONLY)
605 cpu_x86_load_seg(env, sreg, selector);
606#else
607 unsigned int limit, flags;
608 target_ulong base;
609
610 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
611 base = selector << 4;
612 limit = 0xffff;
613 flags = 0;
614 } else {
615 if (!cpu_x86_get_descr_debug(env, selector, &base, &limit, &flags))
616 return 4;
617 }
618 cpu_x86_load_seg_cache(env, sreg, selector, base, limit, flags);
619#endif
620 }
621 return 4;
622}
623
Andreas Färberf3840912012-02-20 06:44:56 +0100624static int cpu_gdb_write_register(CPUX86State *env, uint8_t *mem_buf, int n)
bellard79808572008-05-09 14:40:22 +0000625{
pbrook56aebc82008-10-11 17:55:29 +0000626 uint32_t tmp;
627
Jan Kiszkab1631e72009-06-27 09:53:51 +0200628 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200629 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
630 env->regs[gpr_map[n]] = ldtul_p(mem_buf);
631 return sizeof(target_ulong);
632 } else if (n < CPU_NB_REGS32) {
633 n = gpr_map32[n];
634 env->regs[n] &= ~0xffffffffUL;
635 env->regs[n] |= (uint32_t)ldl_p(mem_buf);
636 return 4;
637 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200638 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000639#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200640 /* FIXME: byteswap float values - after fixing fpregs layout. */
641 memcpy(&env->fpregs[n - IDX_FP_REGS], mem_buf, 10);
pbrook56aebc82008-10-11 17:55:29 +0000642#endif
643 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200644 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
645 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200646 if (n < CPU_NB_REGS32 ||
647 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
648 env->xmm_regs[n].XMM_Q(0) = ldq_p(mem_buf);
649 env->xmm_regs[n].XMM_Q(1) = ldq_p(mem_buf + 8);
650 return 16;
651 }
pbrook56aebc82008-10-11 17:55:29 +0000652 } else {
Jan Kiszkab1631e72009-06-27 09:53:51 +0200653 switch (n) {
654 case IDX_IP_REG:
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200655 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
656 env->eip = ldq_p(mem_buf);
657 return 8;
658 } else {
659 env->eip &= ~0xffffffffUL;
660 env->eip |= (uint32_t)ldl_p(mem_buf);
661 return 4;
662 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200663 case IDX_FLAGS_REG:
664 env->eflags = ldl_p(mem_buf);
665 return 4;
666
Jan Kiszka84273172009-06-27 09:53:51 +0200667 case IDX_SEG_REGS: return cpu_x86_gdb_load_seg(env, R_CS, mem_buf);
668 case IDX_SEG_REGS + 1: return cpu_x86_gdb_load_seg(env, R_SS, mem_buf);
669 case IDX_SEG_REGS + 2: return cpu_x86_gdb_load_seg(env, R_DS, mem_buf);
670 case IDX_SEG_REGS + 3: return cpu_x86_gdb_load_seg(env, R_ES, mem_buf);
671 case IDX_SEG_REGS + 4: return cpu_x86_gdb_load_seg(env, R_FS, mem_buf);
672 case IDX_SEG_REGS + 5: return cpu_x86_gdb_load_seg(env, R_GS, mem_buf);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200673
674 case IDX_FP_REGS + 8:
675 env->fpuc = ldl_p(mem_buf);
676 return 4;
677 case IDX_FP_REGS + 9:
678 tmp = ldl_p(mem_buf);
679 env->fpstt = (tmp >> 11) & 7;
680 env->fpus = tmp & ~0x3800;
681 return 4;
682 case IDX_FP_REGS + 10: /* ftag */ return 4;
683 case IDX_FP_REGS + 11: /* fiseg */ return 4;
684 case IDX_FP_REGS + 12: /* fioff */ return 4;
685 case IDX_FP_REGS + 13: /* foseg */ return 4;
686 case IDX_FP_REGS + 14: /* fooff */ return 4;
687 case IDX_FP_REGS + 15: /* fop */ return 4;
688
689 case IDX_MXCSR_REG:
690 env->mxcsr = ldl_p(mem_buf);
691 return 4;
bellard79808572008-05-09 14:40:22 +0000692 }
bellard79808572008-05-09 14:40:22 +0000693 }
pbrook56aebc82008-10-11 17:55:29 +0000694 /* Unrecognised register. */
695 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000696}
697
bellard9e62fd72004-01-05 22:49:06 +0000698#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000699
aurel32e571cb42009-01-24 15:07:42 +0000700/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
701 expects whatever the target description contains. Due to a
702 historical mishap the FP registers appear in between core integer
703 regs and PC, MSR, CR, and so forth. We hack round this by giving the
704 FP regs zero size when talking to a newer gdb. */
pbrook56aebc82008-10-11 17:55:29 +0000705#define NUM_CORE_REGS 71
aurel32e571cb42009-01-24 15:07:42 +0000706#if defined (TARGET_PPC64)
707#define GDB_CORE_XML "power64-core.xml"
708#else
709#define GDB_CORE_XML "power-core.xml"
710#endif
pbrook56aebc82008-10-11 17:55:29 +0000711
Andreas Färberf3840912012-02-20 06:44:56 +0100712static int cpu_gdb_read_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000713{
pbrook56aebc82008-10-11 17:55:29 +0000714 if (n < 32) {
715 /* gprs */
716 GET_REGL(env->gpr[n]);
717 } else if (n < 64) {
718 /* fprs */
aurel32e571cb42009-01-24 15:07:42 +0000719 if (gdb_has_xml)
720 return 0;
aurel328d4acf92008-11-30 16:23:18 +0000721 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000722 return 8;
723 } else {
724 switch (n) {
725 case 64: GET_REGL(env->nip);
726 case 65: GET_REGL(env->msr);
727 case 66:
728 {
729 uint32_t cr = 0;
730 int i;
731 for (i = 0; i < 8; i++)
732 cr |= env->crf[i] << (32 - ((i + 1) * 4));
733 GET_REG32(cr);
734 }
735 case 67: GET_REGL(env->lr);
736 case 68: GET_REGL(env->ctr);
aurel323d7b4172008-10-21 11:28:46 +0000737 case 69: GET_REGL(env->xer);
aurel32e571cb42009-01-24 15:07:42 +0000738 case 70:
739 {
740 if (gdb_has_xml)
741 return 0;
Fabien Chouteau5a576fb2011-09-01 04:56:00 +0000742 GET_REG32(env->fpscr);
aurel32e571cb42009-01-24 15:07:42 +0000743 }
pbrook56aebc82008-10-11 17:55:29 +0000744 }
bellard9e62fd72004-01-05 22:49:06 +0000745 }
pbrook56aebc82008-10-11 17:55:29 +0000746 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000747}
748
Andreas Färberf3840912012-02-20 06:44:56 +0100749static int cpu_gdb_write_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000750{
pbrook56aebc82008-10-11 17:55:29 +0000751 if (n < 32) {
752 /* gprs */
753 env->gpr[n] = ldtul_p(mem_buf);
754 return sizeof(target_ulong);
755 } else if (n < 64) {
756 /* fprs */
aurel32e571cb42009-01-24 15:07:42 +0000757 if (gdb_has_xml)
758 return 0;
aurel328d4acf92008-11-30 16:23:18 +0000759 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000760 return 8;
761 } else {
762 switch (n) {
763 case 64:
764 env->nip = ldtul_p(mem_buf);
765 return sizeof(target_ulong);
766 case 65:
767 ppc_store_msr(env, ldtul_p(mem_buf));
768 return sizeof(target_ulong);
769 case 66:
770 {
771 uint32_t cr = ldl_p(mem_buf);
772 int i;
773 for (i = 0; i < 8; i++)
774 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
775 return 4;
776 }
777 case 67:
778 env->lr = ldtul_p(mem_buf);
779 return sizeof(target_ulong);
780 case 68:
781 env->ctr = ldtul_p(mem_buf);
782 return sizeof(target_ulong);
783 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000784 env->xer = ldtul_p(mem_buf);
785 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000786 case 70:
787 /* fpscr */
aurel32e571cb42009-01-24 15:07:42 +0000788 if (gdb_has_xml)
789 return 0;
Fabien Chouteaud6478bc2013-03-19 07:41:53 +0000790 store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
791 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000792 }
bellard9e62fd72004-01-05 22:49:06 +0000793 }
pbrook56aebc82008-10-11 17:55:29 +0000794 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000795}
pbrook56aebc82008-10-11 17:55:29 +0000796
bellarde95c8d52004-09-30 22:22:08 +0000797#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000798
pbrook56aebc82008-10-11 17:55:29 +0000799#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
800#define NUM_CORE_REGS 86
801#else
blueswir15a377912009-01-13 16:28:01 +0000802#define NUM_CORE_REGS 72
pbrook56aebc82008-10-11 17:55:29 +0000803#endif
804
805#ifdef TARGET_ABI32
806#define GET_REGA(val) GET_REG32(val)
807#else
808#define GET_REGA(val) GET_REGL(val)
809#endif
810
Andreas Färberf3840912012-02-20 06:44:56 +0100811static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000812{
813 if (n < 8) {
814 /* g0..g7 */
815 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000816 }
pbrook56aebc82008-10-11 17:55:29 +0000817 if (n < 32) {
818 /* register window */
819 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000820 }
pbrook56aebc82008-10-11 17:55:29 +0000821#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
822 if (n < 64) {
823 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700824 if (n & 1) {
825 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
826 } else {
827 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
828 }
bellarde95c8d52004-09-30 22:22:08 +0000829 }
830 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000831 switch (n) {
832 case 64: GET_REGA(env->y);
Blue Swirl5a834bb2010-05-09 20:19:04 +0000833 case 65: GET_REGA(cpu_get_psr(env));
pbrook56aebc82008-10-11 17:55:29 +0000834 case 66: GET_REGA(env->wim);
835 case 67: GET_REGA(env->tbr);
836 case 68: GET_REGA(env->pc);
837 case 69: GET_REGA(env->npc);
838 case 70: GET_REGA(env->fsr);
839 case 71: GET_REGA(0); /* csr */
blueswir15a377912009-01-13 16:28:01 +0000840 default: GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000841 }
bellard34751872005-07-02 14:31:34 +0000842#else
pbrook56aebc82008-10-11 17:55:29 +0000843 if (n < 64) {
844 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700845 if (n & 1) {
846 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
847 } else {
848 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
849 }
bellard34751872005-07-02 14:31:34 +0000850 }
pbrook56aebc82008-10-11 17:55:29 +0000851 if (n < 80) {
852 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700853 GET_REG64(env->fpr[(n - 32) / 2].ll);
pbrook56aebc82008-10-11 17:55:29 +0000854 }
855 switch (n) {
856 case 80: GET_REGL(env->pc);
857 case 81: GET_REGL(env->npc);
Blue Swirl5a834bb2010-05-09 20:19:04 +0000858 case 82: GET_REGL((cpu_get_ccr(env) << 32) |
859 ((env->asi & 0xff) << 24) |
860 ((env->pstate & 0xfff) << 8) |
861 cpu_get_cwp64(env));
pbrook56aebc82008-10-11 17:55:29 +0000862 case 83: GET_REGL(env->fsr);
863 case 84: GET_REGL(env->fprs);
864 case 85: GET_REGL(env->y);
865 }
bellard34751872005-07-02 14:31:34 +0000866#endif
pbrook56aebc82008-10-11 17:55:29 +0000867 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000868}
869
Andreas Färberf3840912012-02-20 06:44:56 +0100870static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000871{
pbrook56aebc82008-10-11 17:55:29 +0000872#if defined(TARGET_ABI32)
873 abi_ulong tmp;
874
875 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000876#else
pbrook56aebc82008-10-11 17:55:29 +0000877 target_ulong tmp;
878
879 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000880#endif
bellarde95c8d52004-09-30 22:22:08 +0000881
pbrook56aebc82008-10-11 17:55:29 +0000882 if (n < 8) {
883 /* g0..g7 */
884 env->gregs[n] = tmp;
885 } else if (n < 32) {
886 /* register window */
887 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000888 }
pbrook56aebc82008-10-11 17:55:29 +0000889#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
890 else if (n < 64) {
891 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700892 /* f0-f31 */
893 if (n & 1) {
894 env->fpr[(n - 32) / 2].l.lower = tmp;
895 } else {
896 env->fpr[(n - 32) / 2].l.upper = tmp;
897 }
pbrook56aebc82008-10-11 17:55:29 +0000898 } else {
899 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
900 switch (n) {
901 case 64: env->y = tmp; break;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000902 case 65: cpu_put_psr(env, tmp); break;
pbrook56aebc82008-10-11 17:55:29 +0000903 case 66: env->wim = tmp; break;
904 case 67: env->tbr = tmp; break;
905 case 68: env->pc = tmp; break;
906 case 69: env->npc = tmp; break;
907 case 70: env->fsr = tmp; break;
908 default: return 0;
909 }
bellarde95c8d52004-09-30 22:22:08 +0000910 }
pbrook56aebc82008-10-11 17:55:29 +0000911 return 4;
bellard34751872005-07-02 14:31:34 +0000912#else
pbrook56aebc82008-10-11 17:55:29 +0000913 else if (n < 64) {
914 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700915 tmp = ldl_p(mem_buf);
916 if (n & 1) {
917 env->fpr[(n - 32) / 2].l.lower = tmp;
918 } else {
919 env->fpr[(n - 32) / 2].l.upper = tmp;
920 }
pbrook56aebc82008-10-11 17:55:29 +0000921 return 4;
922 } else if (n < 80) {
923 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700924 env->fpr[(n - 32) / 2].ll = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000925 } else {
926 switch (n) {
927 case 80: env->pc = tmp; break;
928 case 81: env->npc = tmp; break;
929 case 82:
Blue Swirl5a834bb2010-05-09 20:19:04 +0000930 cpu_put_ccr(env, tmp >> 32);
pbrook56aebc82008-10-11 17:55:29 +0000931 env->asi = (tmp >> 24) & 0xff;
932 env->pstate = (tmp >> 8) & 0xfff;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000933 cpu_put_cwp64(env, tmp & 0xff);
pbrook56aebc82008-10-11 17:55:29 +0000934 break;
935 case 83: env->fsr = tmp; break;
936 case 84: env->fprs = tmp; break;
937 case 85: env->y = tmp; break;
938 default: return 0;
939 }
bellard34751872005-07-02 14:31:34 +0000940 }
pbrook56aebc82008-10-11 17:55:29 +0000941 return 8;
bellard34751872005-07-02 14:31:34 +0000942#endif
bellard9e62fd72004-01-05 22:49:06 +0000943}
bellard1fddef42005-04-17 19:16:13 +0000944#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000945
946/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
947 whatever the target description contains. Due to a historical mishap
948 the FPA registers appear in between core integer regs and the CPSR.
949 We hack round this by giving the FPA regs zero size when talking to a
950 newer gdb. */
951#define NUM_CORE_REGS 26
952#define GDB_CORE_XML "arm-core.xml"
953
Andreas Färberf3840912012-02-20 06:44:56 +0100954static int cpu_gdb_read_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000955{
pbrook56aebc82008-10-11 17:55:29 +0000956 if (n < 16) {
957 /* Core integer register. */
958 GET_REG32(env->regs[n]);
959 }
960 if (n < 24) {
961 /* FPA registers. */
962 if (gdb_has_xml)
963 return 0;
964 memset(mem_buf, 0, 12);
965 return 12;
966 }
967 switch (n) {
968 case 24:
969 /* FPA status register. */
970 if (gdb_has_xml)
971 return 0;
972 GET_REG32(0);
973 case 25:
974 /* CPSR */
975 GET_REG32(cpsr_read(env));
976 }
977 /* Unknown register. */
978 return 0;
bellard1fddef42005-04-17 19:16:13 +0000979}
980
Andreas Färberf3840912012-02-20 06:44:56 +0100981static int cpu_gdb_write_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000982{
pbrook56aebc82008-10-11 17:55:29 +0000983 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000984
pbrook56aebc82008-10-11 17:55:29 +0000985 tmp = ldl_p(mem_buf);
986
987 /* Mask out low bit of PC to workaround gdb bugs. This will probably
988 cause problems if we ever implement the Jazelle DBX extensions. */
989 if (n == 15)
990 tmp &= ~1;
991
992 if (n < 16) {
993 /* Core integer register. */
994 env->regs[n] = tmp;
995 return 4;
996 }
997 if (n < 24) { /* 16-23 */
998 /* FPA registers (ignored). */
999 if (gdb_has_xml)
1000 return 0;
1001 return 12;
1002 }
1003 switch (n) {
1004 case 24:
1005 /* FPA status register (ignored). */
1006 if (gdb_has_xml)
1007 return 0;
1008 return 4;
1009 case 25:
1010 /* CPSR */
1011 cpsr_write (env, tmp, 0xffffffff);
1012 return 4;
1013 }
1014 /* Unknown register. */
1015 return 0;
bellard1fddef42005-04-17 19:16:13 +00001016}
pbrook56aebc82008-10-11 17:55:29 +00001017
pbrooke6e59062006-10-22 00:18:54 +00001018#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +00001019
1020#define NUM_CORE_REGS 18
1021
1022#define GDB_CORE_XML "cf-core.xml"
1023
Andreas Färberf3840912012-02-20 06:44:56 +01001024static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001025{
pbrook56aebc82008-10-11 17:55:29 +00001026 if (n < 8) {
1027 /* D0-D7 */
1028 GET_REG32(env->dregs[n]);
1029 } else if (n < 16) {
1030 /* A0-A7 */
1031 GET_REG32(env->aregs[n - 8]);
1032 } else {
1033 switch (n) {
1034 case 16: GET_REG32(env->sr);
1035 case 17: GET_REG32(env->pc);
1036 }
pbrooke6e59062006-10-22 00:18:54 +00001037 }
pbrook56aebc82008-10-11 17:55:29 +00001038 /* FP registers not included here because they vary between
1039 ColdFire and m68k. Use XML bits for these. */
1040 return 0;
pbrooke6e59062006-10-22 00:18:54 +00001041}
1042
Andreas Färberf3840912012-02-20 06:44:56 +01001043static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001044{
pbrook56aebc82008-10-11 17:55:29 +00001045 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +00001046
pbrook56aebc82008-10-11 17:55:29 +00001047 tmp = ldl_p(mem_buf);
1048
1049 if (n < 8) {
1050 /* D0-D7 */
1051 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -08001052 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +00001053 /* A0-A7 */
1054 env->aregs[n - 8] = tmp;
1055 } else {
1056 switch (n) {
1057 case 16: env->sr = tmp; break;
1058 case 17: env->pc = tmp; break;
1059 default: return 0;
1060 }
pbrooke6e59062006-10-22 00:18:54 +00001061 }
pbrook56aebc82008-10-11 17:55:29 +00001062 return 4;
pbrooke6e59062006-10-22 00:18:54 +00001063}
bellard6f970bd2005-12-05 19:55:19 +00001064#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +00001065
1066#define NUM_CORE_REGS 73
1067
Andreas Färberf3840912012-02-20 06:44:56 +01001068static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001069{
pbrook56aebc82008-10-11 17:55:29 +00001070 if (n < 32) {
1071 GET_REGL(env->active_tc.gpr[n]);
1072 }
1073 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1074 if (n >= 38 && n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001075 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001076 GET_REGL(env->active_fpu.fpr[n - 38].d);
ths7ac256b2007-10-25 21:30:37 +00001077 else
pbrook56aebc82008-10-11 17:55:29 +00001078 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
1079 }
1080 switch (n) {
1081 case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
1082 case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
1083 }
1084 }
1085 switch (n) {
1086 case 32: GET_REGL((int32_t)env->CP0_Status);
1087 case 33: GET_REGL(env->active_tc.LO[0]);
1088 case 34: GET_REGL(env->active_tc.HI[0]);
1089 case 35: GET_REGL(env->CP0_BadVAddr);
1090 case 36: GET_REGL((int32_t)env->CP0_Cause);
Nathan Froydff1d1972009-12-08 08:06:30 -08001091 case 37: GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
pbrook56aebc82008-10-11 17:55:29 +00001092 case 72: GET_REGL(0); /* fp */
1093 case 89: GET_REGL((int32_t)env->CP0_PRid);
1094 }
1095 if (n >= 73 && n <= 88) {
1096 /* 16 embedded regs. */
1097 GET_REGL(0);
1098 }
ths36d23952007-02-28 22:37:42 +00001099
pbrook56aebc82008-10-11 17:55:29 +00001100 return 0;
bellard6f970bd2005-12-05 19:55:19 +00001101}
1102
ths8e33c082006-12-11 19:22:27 +00001103/* convert MIPS rounding mode in FCR31 to IEEE library */
1104static unsigned int ieee_rm[] =
1105 {
1106 float_round_nearest_even,
1107 float_round_to_zero,
1108 float_round_up,
1109 float_round_down
1110 };
1111#define RESTORE_ROUNDING_MODE \
thsf01be152008-09-18 11:57:27 +00001112 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +00001113
Andreas Färberf3840912012-02-20 06:44:56 +01001114static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001115{
pbrook56aebc82008-10-11 17:55:29 +00001116 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +00001117
pbrook56aebc82008-10-11 17:55:29 +00001118 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001119
pbrook56aebc82008-10-11 17:55:29 +00001120 if (n < 32) {
1121 env->active_tc.gpr[n] = tmp;
1122 return sizeof(target_ulong);
1123 }
1124 if (env->CP0_Config1 & (1 << CP0C1_FP)
1125 && n >= 38 && n < 73) {
1126 if (n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001127 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001128 env->active_fpu.fpr[n - 38].d = tmp;
ths7ac256b2007-10-25 21:30:37 +00001129 else
pbrook56aebc82008-10-11 17:55:29 +00001130 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1131 }
1132 switch (n) {
1133 case 70:
1134 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1135 /* set rounding mode */
1136 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +00001137 break;
1138 case 71: env->active_fpu.fcr0 = tmp; break;
1139 }
1140 return sizeof(target_ulong);
1141 }
1142 switch (n) {
1143 case 32: env->CP0_Status = tmp; break;
1144 case 33: env->active_tc.LO[0] = tmp; break;
1145 case 34: env->active_tc.HI[0] = tmp; break;
1146 case 35: env->CP0_BadVAddr = tmp; break;
1147 case 36: env->CP0_Cause = tmp; break;
Nathan Froydff1d1972009-12-08 08:06:30 -08001148 case 37:
1149 env->active_tc.PC = tmp & ~(target_ulong)1;
1150 if (tmp & 1) {
1151 env->hflags |= MIPS_HFLAG_M16;
1152 } else {
1153 env->hflags &= ~(MIPS_HFLAG_M16);
1154 }
1155 break;
pbrook56aebc82008-10-11 17:55:29 +00001156 case 72: /* fp, ignored */ break;
1157 default:
1158 if (n > 89)
1159 return 0;
1160 /* Other registers are readonly. Ignore writes. */
1161 break;
1162 }
1163
1164 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001165}
Jia Liufc043552012-07-20 15:50:50 +08001166#elif defined(TARGET_OPENRISC)
1167
1168#define NUM_CORE_REGS (32 + 3)
1169
1170static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
1171{
1172 if (n < 32) {
1173 GET_REG32(env->gpr[n]);
1174 } else {
1175 switch (n) {
1176 case 32: /* PPC */
1177 GET_REG32(env->ppc);
1178 break;
1179
1180 case 33: /* NPC */
1181 GET_REG32(env->npc);
1182 break;
1183
1184 case 34: /* SR */
1185 GET_REG32(env->sr);
1186 break;
1187
1188 default:
1189 break;
1190 }
1191 }
1192 return 0;
1193}
1194
1195static int cpu_gdb_write_register(CPUOpenRISCState *env,
1196 uint8_t *mem_buf, int n)
1197{
1198 uint32_t tmp;
1199
1200 if (n > NUM_CORE_REGS) {
1201 return 0;
1202 }
1203
1204 tmp = ldl_p(mem_buf);
1205
1206 if (n < 32) {
1207 env->gpr[n] = tmp;
1208 } else {
1209 switch (n) {
1210 case 32: /* PPC */
1211 env->ppc = tmp;
1212 break;
1213
1214 case 33: /* NPC */
1215 env->npc = tmp;
1216 break;
1217
1218 case 34: /* SR */
1219 env->sr = tmp;
1220 break;
1221
1222 default:
1223 break;
1224 }
1225 }
1226 return 4;
1227}
bellardfdf9b3e2006-04-27 21:07:38 +00001228#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001229
1230/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001231/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001232
pbrook56aebc82008-10-11 17:55:29 +00001233#define NUM_CORE_REGS 59
1234
Andreas Färberf3840912012-02-20 06:44:56 +01001235static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001236{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001237 switch (n) {
1238 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +00001239 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1240 GET_REGL(env->gregs[n + 16]);
1241 } else {
1242 GET_REGL(env->gregs[n]);
1243 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001244 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001245 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001246 case 16:
1247 GET_REGL(env->pc);
1248 case 17:
1249 GET_REGL(env->pr);
1250 case 18:
1251 GET_REGL(env->gbr);
1252 case 19:
1253 GET_REGL(env->vbr);
1254 case 20:
1255 GET_REGL(env->mach);
1256 case 21:
1257 GET_REGL(env->macl);
1258 case 22:
1259 GET_REGL(env->sr);
1260 case 23:
1261 GET_REGL(env->fpul);
1262 case 24:
1263 GET_REGL(env->fpscr);
1264 case 25 ... 40:
1265 if (env->fpscr & FPSCR_FR) {
1266 stfl_p(mem_buf, env->fregs[n - 9]);
1267 } else {
1268 stfl_p(mem_buf, env->fregs[n - 25]);
1269 }
1270 return 4;
1271 case 41:
1272 GET_REGL(env->ssr);
1273 case 42:
1274 GET_REGL(env->spc);
1275 case 43 ... 50:
1276 GET_REGL(env->gregs[n - 43]);
1277 case 51 ... 58:
1278 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +00001279 }
bellardfdf9b3e2006-04-27 21:07:38 +00001280
pbrook56aebc82008-10-11 17:55:29 +00001281 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001282}
1283
Andreas Färberf3840912012-02-20 06:44:56 +01001284static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001285{
pbrook56aebc82008-10-11 17:55:29 +00001286 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001287 case 0 ... 7:
1288 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1289 env->gregs[n + 16] = ldl_p(mem_buf);
1290 } else {
1291 env->gregs[n] = ldl_p(mem_buf);
1292 }
1293 break;
1294 case 8 ... 15:
1295 env->gregs[n] = ldl_p(mem_buf);
1296 break;
1297 case 16:
1298 env->pc = ldl_p(mem_buf);
1299 break;
1300 case 17:
1301 env->pr = ldl_p(mem_buf);
1302 break;
1303 case 18:
1304 env->gbr = ldl_p(mem_buf);
1305 break;
1306 case 19:
1307 env->vbr = ldl_p(mem_buf);
1308 break;
1309 case 20:
1310 env->mach = ldl_p(mem_buf);
1311 break;
1312 case 21:
1313 env->macl = ldl_p(mem_buf);
1314 break;
1315 case 22:
1316 env->sr = ldl_p(mem_buf);
1317 break;
1318 case 23:
1319 env->fpul = ldl_p(mem_buf);
1320 break;
1321 case 24:
1322 env->fpscr = ldl_p(mem_buf);
1323 break;
1324 case 25 ... 40:
1325 if (env->fpscr & FPSCR_FR) {
1326 env->fregs[n - 9] = ldfl_p(mem_buf);
1327 } else {
1328 env->fregs[n - 25] = ldfl_p(mem_buf);
1329 }
1330 break;
1331 case 41:
1332 env->ssr = ldl_p(mem_buf);
1333 break;
1334 case 42:
1335 env->spc = ldl_p(mem_buf);
1336 break;
1337 case 43 ... 50:
1338 env->gregs[n - 43] = ldl_p(mem_buf);
1339 break;
1340 case 51 ... 58:
1341 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
1342 break;
pbrook56aebc82008-10-11 17:55:29 +00001343 default: return 0;
1344 }
1345
1346 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001347}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001348#elif defined (TARGET_MICROBLAZE)
1349
1350#define NUM_CORE_REGS (32 + 5)
1351
Andreas Färberf3840912012-02-20 06:44:56 +01001352static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001353{
1354 if (n < 32) {
1355 GET_REG32(env->regs[n]);
1356 } else {
1357 GET_REG32(env->sregs[n - 32]);
1358 }
1359 return 0;
1360}
1361
Andreas Färberf3840912012-02-20 06:44:56 +01001362static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001363{
1364 uint32_t tmp;
1365
1366 if (n > NUM_CORE_REGS)
1367 return 0;
1368
1369 tmp = ldl_p(mem_buf);
1370
1371 if (n < 32) {
1372 env->regs[n] = tmp;
1373 } else {
1374 env->sregs[n - 32] = tmp;
1375 }
1376 return 4;
1377}
thsf1ccf902007-10-08 13:16:14 +00001378#elif defined (TARGET_CRIS)
1379
pbrook56aebc82008-10-11 17:55:29 +00001380#define NUM_CORE_REGS 49
1381
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001382static int
Andreas Färberf3840912012-02-20 06:44:56 +01001383read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001384{
1385 if (n < 15) {
1386 GET_REG32(env->regs[n]);
1387 }
1388
1389 if (n == 15) {
1390 GET_REG32(env->pc);
1391 }
1392
1393 if (n < 32) {
1394 switch (n) {
1395 case 16:
1396 GET_REG8(env->pregs[n - 16]);
1397 break;
1398 case 17:
1399 GET_REG8(env->pregs[n - 16]);
1400 break;
1401 case 20:
1402 case 21:
1403 GET_REG16(env->pregs[n - 16]);
1404 break;
1405 default:
1406 if (n >= 23) {
1407 GET_REG32(env->pregs[n - 16]);
1408 }
1409 break;
1410 }
1411 }
1412 return 0;
1413}
1414
Andreas Färberf3840912012-02-20 06:44:56 +01001415static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001416{
pbrook56aebc82008-10-11 17:55:29 +00001417 uint8_t srs;
1418
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001419 if (env->pregs[PR_VR] < 32)
1420 return read_register_crisv10(env, mem_buf, n);
1421
pbrook56aebc82008-10-11 17:55:29 +00001422 srs = env->pregs[PR_SRS];
1423 if (n < 16) {
1424 GET_REG32(env->regs[n]);
1425 }
1426
1427 if (n >= 21 && n < 32) {
1428 GET_REG32(env->pregs[n - 16]);
1429 }
1430 if (n >= 33 && n < 49) {
1431 GET_REG32(env->sregs[srs][n - 33]);
1432 }
1433 switch (n) {
1434 case 16: GET_REG8(env->pregs[0]);
1435 case 17: GET_REG8(env->pregs[1]);
1436 case 18: GET_REG32(env->pregs[2]);
1437 case 19: GET_REG8(srs);
1438 case 20: GET_REG16(env->pregs[4]);
1439 case 32: GET_REG32(env->pc);
1440 }
1441
1442 return 0;
thsf1ccf902007-10-08 13:16:14 +00001443}
1444
Andreas Färberf3840912012-02-20 06:44:56 +01001445static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001446{
pbrook56aebc82008-10-11 17:55:29 +00001447 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001448
pbrook56aebc82008-10-11 17:55:29 +00001449 if (n > 49)
1450 return 0;
thsf1ccf902007-10-08 13:16:14 +00001451
pbrook56aebc82008-10-11 17:55:29 +00001452 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001453
pbrook56aebc82008-10-11 17:55:29 +00001454 if (n < 16) {
1455 env->regs[n] = tmp;
1456 }
thsf1ccf902007-10-08 13:16:14 +00001457
edgar_igld7b69672008-10-11 19:32:21 +00001458 if (n >= 21 && n < 32) {
1459 env->pregs[n - 16] = tmp;
1460 }
1461
1462 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001463 switch (n) {
1464 case 16: return 1;
1465 case 17: return 1;
edgar_igld7b69672008-10-11 19:32:21 +00001466 case 18: env->pregs[PR_PID] = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +00001467 case 19: return 1;
1468 case 20: return 2;
1469 case 32: env->pc = tmp; break;
1470 }
thsf1ccf902007-10-08 13:16:14 +00001471
pbrook56aebc82008-10-11 17:55:29 +00001472 return 4;
thsf1ccf902007-10-08 13:16:14 +00001473}
aurel3219bf5172008-12-07 23:26:32 +00001474#elif defined (TARGET_ALPHA)
1475
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001476#define NUM_CORE_REGS 67
aurel3219bf5172008-12-07 23:26:32 +00001477
Andreas Färberf3840912012-02-20 06:44:56 +01001478static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001479{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001480 uint64_t val;
1481 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001482
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001483 switch (n) {
1484 case 0 ... 30:
1485 val = env->ir[n];
1486 break;
1487 case 32 ... 62:
1488 d.d = env->fir[n - 32];
1489 val = d.ll;
1490 break;
1491 case 63:
1492 val = cpu_alpha_load_fpcr(env);
1493 break;
1494 case 64:
1495 val = env->pc;
1496 break;
1497 case 66:
1498 val = env->unique;
1499 break;
1500 case 31:
1501 case 65:
1502 /* 31 really is the zero register; 65 is unassigned in the
1503 gdb protocol, but is still required to occupy 8 bytes. */
1504 val = 0;
1505 break;
1506 default:
1507 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001508 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001509 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001510}
1511
Andreas Färberf3840912012-02-20 06:44:56 +01001512static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001513{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001514 target_ulong tmp = ldtul_p(mem_buf);
1515 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001516
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001517 switch (n) {
1518 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001519 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001520 break;
1521 case 32 ... 62:
1522 d.ll = tmp;
1523 env->fir[n - 32] = d.d;
1524 break;
1525 case 63:
1526 cpu_alpha_store_fpcr(env, tmp);
1527 break;
1528 case 64:
1529 env->pc = tmp;
1530 break;
1531 case 66:
1532 env->unique = tmp;
1533 break;
1534 case 31:
1535 case 65:
1536 /* 31 really is the zero register; 65 is unassigned in the
1537 gdb protocol, but is still required to occupy 8 bytes. */
1538 break;
1539 default:
1540 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001541 }
aurel3219bf5172008-12-07 23:26:32 +00001542 return 8;
1543}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001544#elif defined (TARGET_S390X)
1545
Richard Henderson6ee77b12012-08-23 10:44:45 -07001546#define NUM_CORE_REGS S390_NUM_REGS
Alexander Grafafcb0e42009-12-05 12:44:29 +01001547
Andreas Färberf3840912012-02-20 06:44:56 +01001548static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001549{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001550 uint64_t val;
1551 int cc_op;
1552
Alexander Grafafcb0e42009-12-05 12:44:29 +01001553 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001554 case S390_PSWM_REGNUM:
1555 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1556 val = deposit64(env->psw.mask, 44, 2, cc_op);
1557 GET_REGL(val);
1558 break;
1559 case S390_PSWA_REGNUM:
1560 GET_REGL(env->psw.addr);
1561 break;
1562 case S390_R0_REGNUM ... S390_R15_REGNUM:
1563 GET_REGL(env->regs[n-S390_R0_REGNUM]);
1564 break;
1565 case S390_A0_REGNUM ... S390_A15_REGNUM:
1566 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
1567 break;
1568 case S390_FPC_REGNUM:
1569 GET_REG32(env->fpc);
1570 break;
1571 case S390_F0_REGNUM ... S390_F15_REGNUM:
1572 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
1573 break;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001574 }
1575
1576 return 0;
1577}
1578
Andreas Färberf3840912012-02-20 06:44:56 +01001579static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001580{
1581 target_ulong tmpl;
1582 uint32_t tmp32;
1583 int r = 8;
1584 tmpl = ldtul_p(mem_buf);
1585 tmp32 = ldl_p(mem_buf);
1586
1587 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001588 case S390_PSWM_REGNUM:
1589 env->psw.mask = tmpl;
1590 env->cc_op = extract64(tmpl, 44, 2);
1591 break;
1592 case S390_PSWA_REGNUM:
1593 env->psw.addr = tmpl;
1594 break;
1595 case S390_R0_REGNUM ... S390_R15_REGNUM:
1596 env->regs[n-S390_R0_REGNUM] = tmpl;
1597 break;
1598 case S390_A0_REGNUM ... S390_A15_REGNUM:
1599 env->aregs[n-S390_A0_REGNUM] = tmp32;
1600 r = 4;
1601 break;
1602 case S390_FPC_REGNUM:
1603 env->fpc = tmp32;
1604 r = 4;
1605 break;
1606 case S390_F0_REGNUM ... S390_F15_REGNUM:
1607 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1608 break;
1609 default:
1610 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001611 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001612 return r;
1613}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001614#elif defined (TARGET_LM32)
1615
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001616#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001617#define NUM_CORE_REGS (32 + 7)
1618
Andreas Färberf3840912012-02-20 06:44:56 +01001619static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001620{
1621 if (n < 32) {
1622 GET_REG32(env->regs[n]);
1623 } else {
1624 switch (n) {
1625 case 32:
1626 GET_REG32(env->pc);
1627 break;
1628 /* FIXME: put in right exception ID */
1629 case 33:
1630 GET_REG32(0);
1631 break;
1632 case 34:
1633 GET_REG32(env->eba);
1634 break;
1635 case 35:
1636 GET_REG32(env->deba);
1637 break;
1638 case 36:
1639 GET_REG32(env->ie);
1640 break;
1641 case 37:
1642 GET_REG32(lm32_pic_get_im(env->pic_state));
1643 break;
1644 case 38:
1645 GET_REG32(lm32_pic_get_ip(env->pic_state));
1646 break;
1647 }
1648 }
1649 return 0;
1650}
1651
Andreas Färberf3840912012-02-20 06:44:56 +01001652static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001653{
1654 uint32_t tmp;
1655
1656 if (n > NUM_CORE_REGS) {
1657 return 0;
1658 }
1659
1660 tmp = ldl_p(mem_buf);
1661
1662 if (n < 32) {
1663 env->regs[n] = tmp;
1664 } else {
1665 switch (n) {
1666 case 32:
1667 env->pc = tmp;
1668 break;
1669 case 34:
1670 env->eba = tmp;
1671 break;
1672 case 35:
1673 env->deba = tmp;
1674 break;
1675 case 36:
1676 env->ie = tmp;
1677 break;
1678 case 37:
1679 lm32_pic_set_im(env->pic_state, tmp);
1680 break;
1681 case 38:
1682 lm32_pic_set_ip(env->pic_state, tmp);
1683 break;
1684 }
1685 }
1686 return 4;
1687}
Max Filippovccfcaba2011-09-06 03:55:52 +04001688#elif defined(TARGET_XTENSA)
1689
1690/* Use num_core_regs to see only non-privileged registers in an unmodified gdb.
1691 * Use num_regs to see all registers. gdb modification is required for that:
1692 * reset bit 0 in the 'flags' field of the registers definitions in the
1693 * gdb/xtensa-config.c inside gdb source tree or inside gdb overlay.
1694 */
1695#define NUM_CORE_REGS (env->config->gdb_regmap.num_regs)
1696#define num_g_regs NUM_CORE_REGS
1697
Andreas Färberf3840912012-02-20 06:44:56 +01001698static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001699{
1700 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1701
1702 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1703 return 0;
1704 }
1705
1706 switch (reg->type) {
1707 case 9: /*pc*/
1708 GET_REG32(env->pc);
1709 break;
1710
1711 case 1: /*ar*/
1712 xtensa_sync_phys_from_window(env);
1713 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
1714 break;
1715
1716 case 2: /*SR*/
1717 GET_REG32(env->sregs[reg->targno & 0xff]);
1718 break;
1719
1720 case 3: /*UR*/
1721 GET_REG32(env->uregs[reg->targno & 0xff]);
1722 break;
1723
Max Filippovdd519cb2012-09-19 04:23:54 +04001724 case 4: /*f*/
1725 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
1726 break;
1727
Max Filippovccfcaba2011-09-06 03:55:52 +04001728 case 8: /*a*/
1729 GET_REG32(env->regs[reg->targno & 0x0f]);
1730 break;
1731
1732 default:
1733 qemu_log("%s from reg %d of unsupported type %d\n",
1734 __func__, n, reg->type);
1735 return 0;
1736 }
1737}
1738
Andreas Färberf3840912012-02-20 06:44:56 +01001739static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001740{
1741 uint32_t tmp;
1742 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1743
1744 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1745 return 0;
1746 }
1747
1748 tmp = ldl_p(mem_buf);
1749
1750 switch (reg->type) {
1751 case 9: /*pc*/
1752 env->pc = tmp;
1753 break;
1754
1755 case 1: /*ar*/
1756 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1757 xtensa_sync_window_from_phys(env);
1758 break;
1759
1760 case 2: /*SR*/
1761 env->sregs[reg->targno & 0xff] = tmp;
1762 break;
1763
1764 case 3: /*UR*/
1765 env->uregs[reg->targno & 0xff] = tmp;
1766 break;
1767
Max Filippovdd519cb2012-09-19 04:23:54 +04001768 case 4: /*f*/
1769 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1770 break;
1771
Max Filippovccfcaba2011-09-06 03:55:52 +04001772 case 8: /*a*/
1773 env->regs[reg->targno & 0x0f] = tmp;
1774 break;
1775
1776 default:
1777 qemu_log("%s to reg %d of unsupported type %d\n",
1778 __func__, n, reg->type);
1779 return 0;
1780 }
1781
1782 return 4;
1783}
bellard1fddef42005-04-17 19:16:13 +00001784#else
pbrook56aebc82008-10-11 17:55:29 +00001785
1786#define NUM_CORE_REGS 0
1787
Andreas Färber9349b4f2012-03-14 01:38:32 +01001788static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001789{
1790 return 0;
1791}
1792
Andreas Färber9349b4f2012-03-14 01:38:32 +01001793static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001794{
pbrook56aebc82008-10-11 17:55:29 +00001795 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001796}
1797
1798#endif
bellardb4608c02003-06-27 17:34:32 +00001799
Max Filippovccfcaba2011-09-06 03:55:52 +04001800#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001801static int num_g_regs = NUM_CORE_REGS;
Max Filippovccfcaba2011-09-06 03:55:52 +04001802#endif
pbrook56aebc82008-10-11 17:55:29 +00001803
1804#ifdef GDB_CORE_XML
1805/* Encode data using the encoding for 'x' packets. */
1806static int memtox(char *buf, const char *mem, int len)
1807{
1808 char *p = buf;
1809 char c;
1810
1811 while (len--) {
1812 c = *(mem++);
1813 switch (c) {
1814 case '#': case '$': case '*': case '}':
1815 *(p++) = '}';
1816 *(p++) = c ^ 0x20;
1817 break;
1818 default:
1819 *(p++) = c;
1820 break;
1821 }
1822 }
1823 return p - buf;
1824}
1825
aurel323faf7782008-12-07 23:26:17 +00001826static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001827{
pbrook56aebc82008-10-11 17:55:29 +00001828 size_t len;
1829 int i;
1830 const char *name;
1831 static char target_xml[1024];
1832
1833 len = 0;
1834 while (p[len] && p[len] != ':')
1835 len++;
1836 *newp = p + len;
1837
1838 name = NULL;
1839 if (strncmp(p, "target.xml", len) == 0) {
1840 /* Generate the XML description for this CPU. */
1841 if (!target_xml[0]) {
1842 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001843 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001844
blueswir15b3715b2008-10-25 11:18:12 +00001845 snprintf(target_xml, sizeof(target_xml),
1846 "<?xml version=\"1.0\"?>"
1847 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1848 "<target>"
1849 "<xi:include href=\"%s\"/>",
1850 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001851
Andreas Färbereac8b352013-06-28 21:11:37 +02001852 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001853 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1854 pstrcat(target_xml, sizeof(target_xml), r->xml);
1855 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001856 }
blueswir12dc766d2009-04-13 16:06:19 +00001857 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001858 }
1859 return target_xml;
1860 }
1861 for (i = 0; ; i++) {
1862 name = xml_builtin[i][0];
1863 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1864 break;
1865 }
1866 return name ? xml_builtin[i][1] : NULL;
1867}
1868#endif
1869
Andreas Färber385b9f02013-06-27 18:25:36 +02001870static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001871{
Andreas Färber385b9f02013-06-27 18:25:36 +02001872 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001873 GDBRegisterState *r;
1874
1875 if (reg < NUM_CORE_REGS)
1876 return cpu_gdb_read_register(env, mem_buf, reg);
1877
Andreas Färbereac8b352013-06-28 21:11:37 +02001878 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001879 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1880 return r->get_reg(env, mem_buf, reg - r->base_reg);
1881 }
1882 }
1883 return 0;
1884}
1885
Andreas Färber385b9f02013-06-27 18:25:36 +02001886static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001887{
Andreas Färber385b9f02013-06-27 18:25:36 +02001888 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001889 GDBRegisterState *r;
1890
1891 if (reg < NUM_CORE_REGS)
1892 return cpu_gdb_write_register(env, mem_buf, reg);
1893
Andreas Färbereac8b352013-06-28 21:11:37 +02001894 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001895 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1896 return r->set_reg(env, mem_buf, reg - r->base_reg);
1897 }
1898 }
1899 return 0;
1900}
1901
Max Filippovccfcaba2011-09-06 03:55:52 +04001902#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001903/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1904 specifies the first register number and these registers are included in
1905 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1906 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1907 */
1908
Andreas Färber9349b4f2012-03-14 01:38:32 +01001909void gdb_register_coprocessor(CPUArchState * env,
pbrook56aebc82008-10-11 17:55:29 +00001910 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1911 int num_regs, const char *xml, int g_pos)
1912{
Andreas Färbereac8b352013-06-28 21:11:37 +02001913 CPUState *cpu = ENV_GET_CPU(env);
pbrook56aebc82008-10-11 17:55:29 +00001914 GDBRegisterState *s;
1915 GDBRegisterState **p;
1916 static int last_reg = NUM_CORE_REGS;
1917
Andreas Färbereac8b352013-06-28 21:11:37 +02001918 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001919 while (*p) {
1920 /* Check for duplicates. */
1921 if (strcmp((*p)->xml, xml) == 0)
1922 return;
1923 p = &(*p)->next;
1924 }
Stefan Weil9643c252011-10-18 22:25:38 +02001925
1926 s = g_new0(GDBRegisterState, 1);
1927 s->base_reg = last_reg;
1928 s->num_regs = num_regs;
1929 s->get_reg = get_reg;
1930 s->set_reg = set_reg;
1931 s->xml = xml;
1932
pbrook56aebc82008-10-11 17:55:29 +00001933 /* Add to end of list. */
1934 last_reg += num_regs;
1935 *p = s;
1936 if (g_pos) {
1937 if (g_pos != s->base_reg) {
1938 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1939 "Expected %d got %d\n", xml, g_pos, s->base_reg);
1940 } else {
1941 num_g_regs = last_reg;
1942 }
1943 }
1944}
Max Filippovccfcaba2011-09-06 03:55:52 +04001945#endif
pbrook56aebc82008-10-11 17:55:29 +00001946
aliguoria1d1bb32008-11-18 20:07:32 +00001947#ifndef CONFIG_USER_ONLY
1948static const int xlat_gdb_type[] = {
1949 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1950 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1951 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1952};
1953#endif
1954
aliguori880a7572008-11-18 20:30:24 +00001955static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001956{
Andreas Färber182735e2013-05-29 22:29:20 +02001957 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001958 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001959 int err = 0;
1960
Andreas Färber62278812013-06-27 17:12:06 +02001961 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001962 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001963 }
aliguorie22a25c2009-03-12 20:12:48 +00001964
aliguoria1d1bb32008-11-18 20:07:32 +00001965 switch (type) {
1966 case GDB_BREAKPOINT_SW:
1967 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001968 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1969 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001970 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1971 if (err)
1972 break;
1973 }
1974 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001975#ifndef CONFIG_USER_ONLY
1976 case GDB_WATCHPOINT_WRITE:
1977 case GDB_WATCHPOINT_READ:
1978 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001979 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1980 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001981 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1982 NULL);
1983 if (err)
1984 break;
1985 }
1986 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001987#endif
1988 default:
1989 return -ENOSYS;
1990 }
1991}
1992
aliguori880a7572008-11-18 20:30:24 +00001993static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001994{
Andreas Färber182735e2013-05-29 22:29:20 +02001995 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001996 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001997 int err = 0;
1998
Andreas Färber62278812013-06-27 17:12:06 +02001999 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002000 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02002001 }
aliguorie22a25c2009-03-12 20:12:48 +00002002
aliguoria1d1bb32008-11-18 20:07:32 +00002003 switch (type) {
2004 case GDB_BREAKPOINT_SW:
2005 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02002006 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2007 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002008 err = cpu_breakpoint_remove(env, addr, BP_GDB);
2009 if (err)
2010 break;
2011 }
2012 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002013#ifndef CONFIG_USER_ONLY
2014 case GDB_WATCHPOINT_WRITE:
2015 case GDB_WATCHPOINT_READ:
2016 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02002017 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2018 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002019 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
2020 if (err)
2021 break;
2022 }
2023 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002024#endif
2025 default:
2026 return -ENOSYS;
2027 }
2028}
2029
aliguori880a7572008-11-18 20:30:24 +00002030static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00002031{
Andreas Färber182735e2013-05-29 22:29:20 +02002032 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002033 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002034
aliguorie22a25c2009-03-12 20:12:48 +00002035 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002036 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00002037 return;
2038 }
2039
Andreas Färber182735e2013-05-29 22:29:20 +02002040 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2041 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00002042 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002043#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00002044 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002045#endif
aliguori880a7572008-11-18 20:30:24 +00002046 }
aliguoria1d1bb32008-11-18 20:07:32 +00002047}
2048
aurel32fab9d282009-04-08 21:29:37 +00002049static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
2050{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002051 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02002052 CPUClass *cc = CPU_GET_CLASS(cpu);
2053
2054 cpu_synchronize_state(cpu);
2055 if (cc->set_pc) {
2056 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08002057 }
aurel32fab9d282009-04-08 21:29:37 +00002058}
2059
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002060static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002061{
Andreas Färber0d342822012-12-17 07:12:13 +01002062 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002063
Andreas Färber182735e2013-05-29 22:29:20 +02002064 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02002065 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002066 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02002067 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002068 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02002069
2070 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002071}
2072
aliguori880a7572008-11-18 20:30:24 +00002073static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00002074{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002075#ifdef TARGET_XTENSA
Andreas Färber9349b4f2012-03-14 01:38:32 +01002076 CPUArchState *env;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002077#endif
2078 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00002079 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002080 uint32_t thread;
2081 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00002082 char buf[MAX_PACKET_LENGTH];
2083 uint8_t mem_buf[MAX_PACKET_LENGTH];
2084 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00002085 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00002086
bellard858693c2004-03-31 18:52:07 +00002087#ifdef DEBUG_GDB
2088 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00002089#endif
bellard858693c2004-03-31 18:52:07 +00002090 p = line_buf;
2091 ch = *p++;
2092 switch(ch) {
2093 case '?':
bellard1fddef42005-04-17 19:16:13 +00002094 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00002095 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002096 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00002097 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00002098 /* Remove all the breakpoints when this query is issued,
2099 * because gdb is doing and initial connect and the state
2100 * should be cleaned up.
2101 */
aliguori880a7572008-11-18 20:30:24 +00002102 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00002103 break;
2104 case 'c':
2105 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00002106 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002107 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002108 }
aurel32ca587a82008-12-18 22:44:13 +00002109 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00002110 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002111 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00002112 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00002113 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2114 if (s->signal == -1)
2115 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00002116 gdb_continue(s);
2117 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002118 case 'v':
2119 if (strncmp(p, "Cont", 4) == 0) {
2120 int res_signal, res_thread;
2121
2122 p += 4;
2123 if (*p == '?') {
2124 put_packet(s, "vCont;c;C;s;S");
2125 break;
2126 }
2127 res = 0;
2128 res_signal = 0;
2129 res_thread = 0;
2130 while (*p) {
2131 int action, signal;
2132
2133 if (*p++ != ';') {
2134 res = 0;
2135 break;
2136 }
2137 action = *p++;
2138 signal = 0;
2139 if (action == 'C' || action == 'S') {
2140 signal = strtoul(p, (char **)&p, 16);
2141 } else if (action != 'c' && action != 's') {
2142 res = 0;
2143 break;
2144 }
2145 thread = 0;
2146 if (*p == ':') {
2147 thread = strtoull(p+1, (char **)&p, 16);
2148 }
2149 action = tolower(action);
2150 if (res == 0 || (res == 'c' && action == 's')) {
2151 res = action;
2152 res_signal = signal;
2153 res_thread = thread;
2154 }
2155 }
2156 if (res) {
2157 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002158 cpu = find_cpu(res_thread);
2159 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002160 put_packet(s, "E22");
2161 break;
2162 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002163 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002164 }
2165 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002166 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002167 }
2168 s->signal = res_signal;
2169 gdb_continue(s);
2170 return RS_IDLE;
2171 }
2172 break;
2173 } else {
2174 goto unknown_command;
2175 }
edgar_igl7d03f822008-05-17 18:58:29 +00002176 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002177#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002178 /* Kill the target */
2179 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2180 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002181#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002182 case 'D':
2183 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002184 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002185 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002186 gdb_continue(s);
2187 put_packet(s, "OK");
2188 break;
bellard858693c2004-03-31 18:52:07 +00002189 case 's':
2190 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002191 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002192 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002193 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002194 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002195 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002196 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002197 case 'F':
2198 {
2199 target_ulong ret;
2200 target_ulong err;
2201
2202 ret = strtoull(p, (char **)&p, 16);
2203 if (*p == ',') {
2204 p++;
2205 err = strtoull(p, (char **)&p, 16);
2206 } else {
2207 err = 0;
2208 }
2209 if (*p == ',')
2210 p++;
2211 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002212 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002213 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00002214 s->current_syscall_cb = NULL;
2215 }
pbrooka2d1eba2007-01-28 03:10:55 +00002216 if (type == 'C') {
2217 put_packet(s, "T02");
2218 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002219 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002220 }
2221 }
2222 break;
bellard858693c2004-03-31 18:52:07 +00002223 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002224 cpu_synchronize_state(s->g_cpu);
2225#ifdef TARGET_XTENSA
2226 env = s->g_cpu->env_ptr;
2227#endif
pbrook56aebc82008-10-11 17:55:29 +00002228 len = 0;
2229 for (addr = 0; addr < num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002230 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002231 len += reg_size;
2232 }
2233 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002234 put_packet(s, buf);
2235 break;
2236 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002237 cpu_synchronize_state(s->g_cpu);
2238#ifdef TARGET_XTENSA
2239 env = s->g_cpu->env_ptr;
2240#endif
pbrook56aebc82008-10-11 17:55:29 +00002241 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002242 len = strlen(p) / 2;
2243 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00002244 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002245 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002246 len -= reg_size;
2247 registers += reg_size;
2248 }
bellard858693c2004-03-31 18:52:07 +00002249 put_packet(s, "OK");
2250 break;
2251 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002252 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002253 if (*p == ',')
2254 p++;
bellard9d9754a2006-06-25 15:32:37 +00002255 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002256 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002257 put_packet (s, "E14");
2258 } else {
2259 memtohex(buf, mem_buf, len);
2260 put_packet(s, buf);
2261 }
bellard858693c2004-03-31 18:52:07 +00002262 break;
2263 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002264 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002265 if (*p == ',')
2266 p++;
bellard9d9754a2006-06-25 15:32:37 +00002267 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002268 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002269 p++;
2270 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002271 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02002272 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002273 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002274 } else {
bellard858693c2004-03-31 18:52:07 +00002275 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002276 }
bellard858693c2004-03-31 18:52:07 +00002277 break;
pbrook56aebc82008-10-11 17:55:29 +00002278 case 'p':
2279 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2280 This works, but can be very slow. Anything new enough to
2281 understand XML also knows how to use this properly. */
2282 if (!gdb_has_xml)
2283 goto unknown_command;
2284 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002285 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002286 if (reg_size) {
2287 memtohex(buf, mem_buf, reg_size);
2288 put_packet(s, buf);
2289 } else {
2290 put_packet(s, "E14");
2291 }
2292 break;
2293 case 'P':
2294 if (!gdb_has_xml)
2295 goto unknown_command;
2296 addr = strtoull(p, (char **)&p, 16);
2297 if (*p == '=')
2298 p++;
2299 reg_size = strlen(p) / 2;
2300 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002301 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002302 put_packet(s, "OK");
2303 break;
bellard858693c2004-03-31 18:52:07 +00002304 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002305 case 'z':
2306 type = strtoul(p, (char **)&p, 16);
2307 if (*p == ',')
2308 p++;
bellard9d9754a2006-06-25 15:32:37 +00002309 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002310 if (*p == ',')
2311 p++;
bellard9d9754a2006-06-25 15:32:37 +00002312 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002313 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002314 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002315 else
aliguori880a7572008-11-18 20:30:24 +00002316 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002317 if (res >= 0)
2318 put_packet(s, "OK");
2319 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002320 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002321 else
2322 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002323 break;
aliguori880a7572008-11-18 20:30:24 +00002324 case 'H':
2325 type = *p++;
2326 thread = strtoull(p, (char **)&p, 16);
2327 if (thread == -1 || thread == 0) {
2328 put_packet(s, "OK");
2329 break;
2330 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002331 cpu = find_cpu(thread);
2332 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00002333 put_packet(s, "E22");
2334 break;
2335 }
2336 switch (type) {
2337 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002338 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002339 put_packet(s, "OK");
2340 break;
2341 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002342 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002343 put_packet(s, "OK");
2344 break;
2345 default:
2346 put_packet(s, "E22");
2347 break;
2348 }
2349 break;
2350 case 'T':
2351 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002352 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002353
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002354 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002355 put_packet(s, "OK");
2356 } else {
aliguori880a7572008-11-18 20:30:24 +00002357 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002358 }
aliguori880a7572008-11-18 20:30:24 +00002359 break;
pbrook978efd62006-06-17 18:30:42 +00002360 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002361 case 'Q':
2362 /* parse any 'q' packets here */
2363 if (!strcmp(p,"qemu.sstepbits")) {
2364 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002365 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2366 SSTEP_ENABLE,
2367 SSTEP_NOIRQ,
2368 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002369 put_packet(s, buf);
2370 break;
2371 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2372 /* Display or change the sstep_flags */
2373 p += 10;
2374 if (*p != '=') {
2375 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002376 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002377 put_packet(s, buf);
2378 break;
2379 }
2380 p++;
2381 type = strtoul(p, (char **)&p, 16);
2382 sstep_flags = type;
2383 put_packet(s, "OK");
2384 break;
aliguori880a7572008-11-18 20:30:24 +00002385 } else if (strcmp(p,"C") == 0) {
2386 /* "Current thread" remains vague in the spec, so always return
2387 * the first CPU (gdb returns the first thread). */
2388 put_packet(s, "QC1");
2389 break;
2390 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02002391 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00002392 goto report_cpuinfo;
2393 } else if (strcmp(p,"sThreadInfo") == 0) {
2394 report_cpuinfo:
2395 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02002396 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00002397 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02002398 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00002399 } else
2400 put_packet(s, "l");
2401 break;
2402 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2403 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002404 cpu = find_cpu(thread);
2405 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02002406 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002407 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01002408 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01002409 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002410 memtohex(buf, mem_buf, len);
2411 put_packet(s, buf);
2412 }
aliguori880a7572008-11-18 20:30:24 +00002413 break;
edgar_igl60897d32008-05-09 08:25:14 +00002414 }
blueswir10b8a9882009-03-07 10:51:36 +00002415#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002416 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002417 CPUArchState *env = s->c_cpu->env_ptr;
2418 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00002419
blueswir1363a37d2008-08-21 17:58:08 +00002420 snprintf(buf, sizeof(buf),
2421 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2422 ";Bss=" TARGET_ABI_FMT_lx,
2423 ts->info->code_offset,
2424 ts->info->data_offset,
2425 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002426 put_packet(s, buf);
2427 break;
2428 }
blueswir10b8a9882009-03-07 10:51:36 +00002429#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002430 else if (strncmp(p, "Rcmd,", 5) == 0) {
2431 int len = strlen(p + 5);
2432
2433 if ((len % 2) != 0) {
2434 put_packet(s, "E01");
2435 break;
2436 }
2437 hextomem(mem_buf, p + 5, len);
2438 len = len / 2;
2439 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002440 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002441 put_packet(s, "OK");
2442 break;
2443 }
blueswir10b8a9882009-03-07 10:51:36 +00002444#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002445 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002446 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002447#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002448 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002449#endif
2450 put_packet(s, buf);
2451 break;
2452 }
2453#ifdef GDB_CORE_XML
2454 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2455 const char *xml;
2456 target_ulong total_len;
2457
2458 gdb_has_xml = 1;
2459 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002460 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002461 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002462 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002463 put_packet(s, buf);
2464 break;
2465 }
2466
2467 if (*p == ':')
2468 p++;
2469 addr = strtoul(p, (char **)&p, 16);
2470 if (*p == ',')
2471 p++;
2472 len = strtoul(p, (char **)&p, 16);
2473
2474 total_len = strlen(xml);
2475 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002476 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002477 put_packet(s, buf);
2478 break;
2479 }
2480 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2481 len = (MAX_PACKET_LENGTH - 5) / 2;
2482 if (len < total_len - addr) {
2483 buf[0] = 'm';
2484 len = memtox(buf + 1, xml + addr, len);
2485 } else {
2486 buf[0] = 'l';
2487 len = memtox(buf + 1, xml + addr, total_len - addr);
2488 }
2489 put_packet_binary(s, buf, len + 1);
2490 break;
2491 }
2492#endif
2493 /* Unrecognised 'q' command. */
2494 goto unknown_command;
2495
bellard858693c2004-03-31 18:52:07 +00002496 default:
pbrook56aebc82008-10-11 17:55:29 +00002497 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002498 /* put empty packet */
2499 buf[0] = '\0';
2500 put_packet(s, buf);
2501 break;
2502 }
2503 return RS_IDLE;
2504}
2505
Andreas Färber64f6b342013-05-27 02:06:09 +02002506void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00002507{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002508 gdbserver_state->c_cpu = cpu;
2509 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002510}
2511
bellard1fddef42005-04-17 19:16:13 +00002512#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002513static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002514{
aliguori880a7572008-11-18 20:30:24 +00002515 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002516 CPUArchState *env = s->c_cpu->env_ptr;
2517 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002518 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002519 const char *type;
bellard858693c2004-03-31 18:52:07 +00002520 int ret;
2521
Meador Ingecdb432b2012-03-15 17:49:45 +00002522 if (running || s->state == RS_INACTIVE) {
2523 return;
2524 }
2525 /* Is there a GDB syscall waiting to be sent? */
2526 if (s->current_syscall_cb) {
2527 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002528 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002529 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002530 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002531 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002532 if (env->watchpoint_hit) {
2533 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002534 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002535 type = "r";
2536 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002537 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002538 type = "a";
2539 break;
2540 default:
2541 type = "";
2542 break;
2543 }
aliguori880a7572008-11-18 20:30:24 +00002544 snprintf(buf, sizeof(buf),
2545 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002546 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002547 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002548 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002549 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002550 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002551 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002552 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002553 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002554 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002555 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002556 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002557 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002558 ret = GDB_SIGNAL_QUIT;
2559 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002560 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002561 ret = GDB_SIGNAL_IO;
2562 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002563 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002564 ret = GDB_SIGNAL_ALRM;
2565 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002566 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002567 ret = GDB_SIGNAL_ABRT;
2568 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002569 case RUN_STATE_SAVE_VM:
2570 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002571 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002572 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002573 ret = GDB_SIGNAL_XCPU;
2574 break;
2575 default:
2576 ret = GDB_SIGNAL_UNKNOWN;
2577 break;
bellardbbeb7b52006-04-23 18:42:15 +00002578 }
Andreas Färber0d342822012-12-17 07:12:13 +01002579 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002580
2581send_packet:
bellard858693c2004-03-31 18:52:07 +00002582 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002583
2584 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002585 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002586}
bellard1fddef42005-04-17 19:16:13 +00002587#endif
bellard858693c2004-03-31 18:52:07 +00002588
pbrooka2d1eba2007-01-28 03:10:55 +00002589/* Send a gdb syscall request.
2590 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002591 %x - target_ulong argument printed in hex.
2592 %lx - 64-bit argument printed in hex.
2593 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002594void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002595{
2596 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002597 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002598 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002599 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002600 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002601 GDBState *s;
2602
aliguori880a7572008-11-18 20:30:24 +00002603 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002604 if (!s)
2605 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002606 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002607#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002608 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002609#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002610 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002611 p = s->syscall_buf;
2612 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002613 *(p++) = 'F';
2614 while (*fmt) {
2615 if (*fmt == '%') {
2616 fmt++;
2617 switch (*fmt++) {
2618 case 'x':
2619 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002620 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002621 break;
pbrooka87295e2007-05-26 15:09:38 +00002622 case 'l':
2623 if (*(fmt++) != 'x')
2624 goto bad_format;
2625 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002626 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002627 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002628 case 's':
2629 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002630 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002631 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002632 break;
2633 default:
pbrooka87295e2007-05-26 15:09:38 +00002634 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002635 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2636 fmt - 1);
2637 break;
2638 }
2639 } else {
2640 *(p++) = *(fmt++);
2641 }
2642 }
pbrook8a93e022007-08-06 13:19:15 +00002643 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002644 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002645#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002646 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002647 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002648#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002649 /* In this case wait to send the syscall packet until notification that
2650 the CPU has stopped. This must be done because if the packet is sent
2651 now the reply from the syscall request could be received while the CPU
2652 is still in the running state, which can cause packets to be dropped
2653 and state transition 'T' packets to be sent while the syscall is still
2654 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002655 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002656#endif
2657}
2658
bellard6a00d602005-11-21 23:25:50 +00002659static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002660{
2661 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002662 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002663
bellard1fddef42005-04-17 19:16:13 +00002664#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002665 if (s->last_packet_len) {
2666 /* Waiting for a response to the last packet. If we see the start
2667 of a new command then abandon the previous response. */
2668 if (ch == '-') {
2669#ifdef DEBUG_GDB
2670 printf("Got NACK, retransmitting\n");
2671#endif
thsffe8ab82007-12-16 03:16:05 +00002672 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002673 }
2674#ifdef DEBUG_GDB
2675 else if (ch == '+')
2676 printf("Got ACK\n");
2677 else
2678 printf("Got '%c' when expecting ACK/NACK\n", ch);
2679#endif
2680 if (ch == '+' || ch == '$')
2681 s->last_packet_len = 0;
2682 if (ch != '$')
2683 return;
2684 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002685 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002686 /* when the CPU is running, we cannot do anything except stop
2687 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002688 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002689 } else
bellard1fddef42005-04-17 19:16:13 +00002690#endif
bellard41625032005-04-24 10:07:11 +00002691 {
bellard858693c2004-03-31 18:52:07 +00002692 switch(s->state) {
2693 case RS_IDLE:
2694 if (ch == '$') {
2695 s->line_buf_index = 0;
2696 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002697 }
2698 break;
bellard858693c2004-03-31 18:52:07 +00002699 case RS_GETLINE:
2700 if (ch == '#') {
2701 s->state = RS_CHKSUM1;
2702 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2703 s->state = RS_IDLE;
2704 } else {
2705 s->line_buf[s->line_buf_index++] = ch;
2706 }
2707 break;
2708 case RS_CHKSUM1:
2709 s->line_buf[s->line_buf_index] = '\0';
2710 s->line_csum = fromhex(ch) << 4;
2711 s->state = RS_CHKSUM2;
2712 break;
2713 case RS_CHKSUM2:
2714 s->line_csum |= fromhex(ch);
2715 csum = 0;
2716 for(i = 0; i < s->line_buf_index; i++) {
2717 csum += s->line_buf[i];
2718 }
2719 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002720 reply = '-';
2721 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002722 s->state = RS_IDLE;
2723 } else {
ths60fe76f2007-12-16 03:02:09 +00002724 reply = '+';
2725 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002726 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002727 }
bellardb4608c02003-06-27 17:34:32 +00002728 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002729 default:
2730 abort();
bellardb4608c02003-06-27 17:34:32 +00002731 }
2732 }
bellard858693c2004-03-31 18:52:07 +00002733}
2734
Paul Brook0e1c9c52010-06-16 13:03:51 +01002735/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002736void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002737{
2738 GDBState *s;
2739 char buf[4];
2740
2741 s = gdbserver_state;
2742 if (!s) {
2743 return;
2744 }
2745#ifdef CONFIG_USER_ONLY
2746 if (gdbserver_fd < 0 || s->fd < 0) {
2747 return;
2748 }
2749#endif
2750
2751 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2752 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002753
2754#ifndef CONFIG_USER_ONLY
2755 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002756 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002757 }
2758#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002759}
2760
bellard1fddef42005-04-17 19:16:13 +00002761#ifdef CONFIG_USER_ONLY
2762int
aurel32ca587a82008-12-18 22:44:13 +00002763gdb_queuesig (void)
2764{
2765 GDBState *s;
2766
2767 s = gdbserver_state;
2768
2769 if (gdbserver_fd < 0 || s->fd < 0)
2770 return 0;
2771 else
2772 return 1;
2773}
2774
2775int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002776gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002777{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002778 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002779 GDBState *s;
2780 char buf[256];
2781 int n;
bellard1fddef42005-04-17 19:16:13 +00002782
Andreas Färber5ca666c2013-06-24 19:20:57 +02002783 s = gdbserver_state;
2784 if (gdbserver_fd < 0 || s->fd < 0) {
2785 return sig;
bellard1fddef42005-04-17 19:16:13 +00002786 }
2787
Andreas Färber5ca666c2013-06-24 19:20:57 +02002788 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002789 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002790 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002791
Andreas Färber5ca666c2013-06-24 19:20:57 +02002792 if (sig != 0) {
2793 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2794 put_packet(s, buf);
2795 }
2796 /* put_packet() might have detected that the peer terminated the
2797 connection. */
2798 if (s->fd < 0) {
2799 return sig;
2800 }
2801
2802 sig = 0;
2803 s->state = RS_IDLE;
2804 s->running_state = 0;
2805 while (s->running_state == 0) {
2806 n = read(s->fd, buf, 256);
2807 if (n > 0) {
2808 int i;
2809
2810 for (i = 0; i < n; i++) {
2811 gdb_read_byte(s, buf[i]);
2812 }
2813 } else if (n == 0 || errno != EAGAIN) {
2814 /* XXX: Connection closed. Should probably wait for another
2815 connection before continuing. */
2816 return sig;
bellard1fddef42005-04-17 19:16:13 +00002817 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002818 }
2819 sig = s->signal;
2820 s->signal = 0;
2821 return sig;
bellard1fddef42005-04-17 19:16:13 +00002822}
bellarde9009672005-04-26 20:42:36 +00002823
aurel32ca587a82008-12-18 22:44:13 +00002824/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002825void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002826{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002827 GDBState *s;
2828 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002829
Andreas Färber5ca666c2013-06-24 19:20:57 +02002830 s = gdbserver_state;
2831 if (gdbserver_fd < 0 || s->fd < 0) {
2832 return;
2833 }
aurel32ca587a82008-12-18 22:44:13 +00002834
Andreas Färber5ca666c2013-06-24 19:20:57 +02002835 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2836 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002837}
bellard1fddef42005-04-17 19:16:13 +00002838
aliguori880a7572008-11-18 20:30:24 +00002839static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002840{
2841 GDBState *s;
2842 struct sockaddr_in sockaddr;
2843 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002844 int fd;
bellard858693c2004-03-31 18:52:07 +00002845
2846 for(;;) {
2847 len = sizeof(sockaddr);
2848 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2849 if (fd < 0 && errno != EINTR) {
2850 perror("accept");
2851 return;
2852 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002853#ifndef _WIN32
2854 fcntl(fd, F_SETFD, FD_CLOEXEC);
2855#endif
bellard858693c2004-03-31 18:52:07 +00002856 break;
2857 }
2858 }
2859
2860 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002861 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002862
Anthony Liguori7267c092011-08-20 22:09:37 -05002863 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002864 s->c_cpu = first_cpu;
2865 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002866 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002867 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002868
aliguori880a7572008-11-18 20:30:24 +00002869 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002870
bellard858693c2004-03-31 18:52:07 +00002871 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002872}
2873
2874static int gdbserver_open(int port)
2875{
2876 struct sockaddr_in sockaddr;
2877 int fd, val, ret;
2878
2879 fd = socket(PF_INET, SOCK_STREAM, 0);
2880 if (fd < 0) {
2881 perror("socket");
2882 return -1;
2883 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002884#ifndef _WIN32
2885 fcntl(fd, F_SETFD, FD_CLOEXEC);
2886#endif
bellard858693c2004-03-31 18:52:07 +00002887
2888 /* allow fast reuse */
2889 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002890 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002891
2892 sockaddr.sin_family = AF_INET;
2893 sockaddr.sin_port = htons(port);
2894 sockaddr.sin_addr.s_addr = 0;
2895 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2896 if (ret < 0) {
2897 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002898 close(fd);
bellard858693c2004-03-31 18:52:07 +00002899 return -1;
2900 }
2901 ret = listen(fd, 0);
2902 if (ret < 0) {
2903 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002904 close(fd);
bellard858693c2004-03-31 18:52:07 +00002905 return -1;
2906 }
bellard858693c2004-03-31 18:52:07 +00002907 return fd;
2908}
2909
2910int gdbserver_start(int port)
2911{
2912 gdbserver_fd = gdbserver_open(port);
2913 if (gdbserver_fd < 0)
2914 return -1;
2915 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002916 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002917 return 0;
2918}
aurel322b1319c2008-12-18 22:44:04 +00002919
2920/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002921void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002922{
2923 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002924 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002925 return;
2926 close(s->fd);
2927 s->fd = -1;
2928 cpu_breakpoint_remove_all(env, BP_GDB);
2929 cpu_watchpoint_remove_all(env, BP_GDB);
2930}
pbrook4046d912007-01-28 01:53:16 +00002931#else
thsaa1f17c2007-07-11 22:48:58 +00002932static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002933{
pbrook56aebc82008-10-11 17:55:29 +00002934 /* We can handle an arbitrarily large amount of data.
2935 Pick the maximum packet size, which is as good as anything. */
2936 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002937}
2938
thsaa1f17c2007-07-11 22:48:58 +00002939static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002940{
pbrook4046d912007-01-28 01:53:16 +00002941 int i;
2942
2943 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002944 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002945 }
2946}
2947
2948static void gdb_chr_event(void *opaque, int event)
2949{
2950 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302951 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002952 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002953 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002954 break;
2955 default:
2956 break;
2957 }
2958}
2959
aliguori8a34a0f2009-03-05 23:01:55 +00002960static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2961{
2962 char buf[MAX_PACKET_LENGTH];
2963
2964 buf[0] = 'O';
2965 if (len > (MAX_PACKET_LENGTH/2) - 1)
2966 len = (MAX_PACKET_LENGTH/2) - 1;
2967 memtohex(buf + 1, (uint8_t *)msg, len);
2968 put_packet(s, buf);
2969}
2970
2971static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2972{
2973 const char *p = (const char *)buf;
2974 int max_sz;
2975
2976 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2977 for (;;) {
2978 if (len <= max_sz) {
2979 gdb_monitor_output(gdbserver_state, p, len);
2980 break;
2981 }
2982 gdb_monitor_output(gdbserver_state, p, max_sz);
2983 p += max_sz;
2984 len -= max_sz;
2985 }
2986 return len;
2987}
2988
aliguori59030a82009-04-05 18:43:41 +00002989#ifndef _WIN32
2990static void gdb_sigterm_handler(int signal)
2991{
Luiz Capitulino13548692011-07-29 15:36:43 -03002992 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002993 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002994 }
aliguori59030a82009-04-05 18:43:41 +00002995}
2996#endif
2997
2998int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002999{
3000 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00003001 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00003002 CharDriverState *chr = NULL;
3003 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00003004
aliguori59030a82009-04-05 18:43:41 +00003005 if (!device)
3006 return -1;
3007 if (strcmp(device, "none") != 0) {
3008 if (strstart(device, "tcp:", NULL)) {
3009 /* enforce required TCP attributes */
3010 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
3011 "%s,nowait,nodelay,server", device);
3012 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00003013 }
aliguori59030a82009-04-05 18:43:41 +00003014#ifndef _WIN32
3015 else if (strcmp(device, "stdio") == 0) {
3016 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00003017
aliguori59030a82009-04-05 18:43:41 +00003018 memset(&act, 0, sizeof(act));
3019 act.sa_handler = gdb_sigterm_handler;
3020 sigaction(SIGINT, &act, NULL);
3021 }
3022#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05003023 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00003024 if (!chr)
3025 return -1;
3026
Hans de Goede456d6062013-03-27 20:29:40 +01003027 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00003028 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
3029 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00003030 }
3031
aliguori36556b22009-03-28 18:05:53 +00003032 s = gdbserver_state;
3033 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003034 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00003035 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00003036
aliguori36556b22009-03-28 18:05:53 +00003037 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3038
3039 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05003040 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00003041 mon_chr->chr_write = gdb_monitor_write;
3042 monitor_init(mon_chr, 0);
3043 } else {
3044 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05003045 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00003046 mon_chr = s->mon_chr;
3047 memset(s, 0, sizeof(GDBState));
3048 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02003049 s->c_cpu = first_cpu;
3050 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00003051 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00003052 s->state = chr ? RS_IDLE : RS_INACTIVE;
3053 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00003054 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00003055
pbrook4046d912007-01-28 01:53:16 +00003056 return 0;
3057}
3058#endif