blob: 90e54cb4e352b9cc5c241c2b4e4ee37e2167a9cb [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
Fabien Chouteau44520db2011-09-08 12:48:16 +020045#ifndef TARGET_CPU_MEMORY_RW_DEBUG
Andreas Färber9349b4f2012-03-14 01:38:32 +010046static inline int target_memory_rw_debug(CPUArchState *env, target_ulong addr,
Fabien Chouteau44520db2011-09-08 12:48:16 +020047 uint8_t *buf, int len, int is_write)
48{
49 return cpu_memory_rw_debug(env, addr, buf, len, is_write);
50}
51#else
52/* target_memory_rw_debug() defined in cpu.h */
53#endif
aurel32ca587a82008-12-18 22:44:13 +000054
55enum {
56 GDB_SIGNAL_0 = 0,
57 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010058 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000059 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010060 GDB_SIGNAL_ABRT = 6,
61 GDB_SIGNAL_ALRM = 14,
62 GDB_SIGNAL_IO = 23,
63 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000064 GDB_SIGNAL_UNKNOWN = 143
65};
66
67#ifdef CONFIG_USER_ONLY
68
69/* Map target signal numbers to GDB protocol signal numbers and vice
70 * versa. For user emulation's currently supported systems, we can
71 * assume most signals are defined.
72 */
73
74static int gdb_signal_table[] = {
75 0,
76 TARGET_SIGHUP,
77 TARGET_SIGINT,
78 TARGET_SIGQUIT,
79 TARGET_SIGILL,
80 TARGET_SIGTRAP,
81 TARGET_SIGABRT,
82 -1, /* SIGEMT */
83 TARGET_SIGFPE,
84 TARGET_SIGKILL,
85 TARGET_SIGBUS,
86 TARGET_SIGSEGV,
87 TARGET_SIGSYS,
88 TARGET_SIGPIPE,
89 TARGET_SIGALRM,
90 TARGET_SIGTERM,
91 TARGET_SIGURG,
92 TARGET_SIGSTOP,
93 TARGET_SIGTSTP,
94 TARGET_SIGCONT,
95 TARGET_SIGCHLD,
96 TARGET_SIGTTIN,
97 TARGET_SIGTTOU,
98 TARGET_SIGIO,
99 TARGET_SIGXCPU,
100 TARGET_SIGXFSZ,
101 TARGET_SIGVTALRM,
102 TARGET_SIGPROF,
103 TARGET_SIGWINCH,
104 -1, /* SIGLOST */
105 TARGET_SIGUSR1,
106 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000107#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000108 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000109#else
110 -1,
111#endif
aurel32ca587a82008-12-18 22:44:13 +0000112 -1, /* SIGPOLL */
113 -1,
114 -1,
115 -1,
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
123 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000124#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000125 __SIGRTMIN + 1,
126 __SIGRTMIN + 2,
127 __SIGRTMIN + 3,
128 __SIGRTMIN + 4,
129 __SIGRTMIN + 5,
130 __SIGRTMIN + 6,
131 __SIGRTMIN + 7,
132 __SIGRTMIN + 8,
133 __SIGRTMIN + 9,
134 __SIGRTMIN + 10,
135 __SIGRTMIN + 11,
136 __SIGRTMIN + 12,
137 __SIGRTMIN + 13,
138 __SIGRTMIN + 14,
139 __SIGRTMIN + 15,
140 __SIGRTMIN + 16,
141 __SIGRTMIN + 17,
142 __SIGRTMIN + 18,
143 __SIGRTMIN + 19,
144 __SIGRTMIN + 20,
145 __SIGRTMIN + 21,
146 __SIGRTMIN + 22,
147 __SIGRTMIN + 23,
148 __SIGRTMIN + 24,
149 __SIGRTMIN + 25,
150 __SIGRTMIN + 26,
151 __SIGRTMIN + 27,
152 __SIGRTMIN + 28,
153 __SIGRTMIN + 29,
154 __SIGRTMIN + 30,
155 __SIGRTMIN + 31,
156 -1, /* SIGCANCEL */
157 __SIGRTMIN,
158 __SIGRTMIN + 32,
159 __SIGRTMIN + 33,
160 __SIGRTMIN + 34,
161 __SIGRTMIN + 35,
162 __SIGRTMIN + 36,
163 __SIGRTMIN + 37,
164 __SIGRTMIN + 38,
165 __SIGRTMIN + 39,
166 __SIGRTMIN + 40,
167 __SIGRTMIN + 41,
168 __SIGRTMIN + 42,
169 __SIGRTMIN + 43,
170 __SIGRTMIN + 44,
171 __SIGRTMIN + 45,
172 __SIGRTMIN + 46,
173 __SIGRTMIN + 47,
174 __SIGRTMIN + 48,
175 __SIGRTMIN + 49,
176 __SIGRTMIN + 50,
177 __SIGRTMIN + 51,
178 __SIGRTMIN + 52,
179 __SIGRTMIN + 53,
180 __SIGRTMIN + 54,
181 __SIGRTMIN + 55,
182 __SIGRTMIN + 56,
183 __SIGRTMIN + 57,
184 __SIGRTMIN + 58,
185 __SIGRTMIN + 59,
186 __SIGRTMIN + 60,
187 __SIGRTMIN + 61,
188 __SIGRTMIN + 62,
189 __SIGRTMIN + 63,
190 __SIGRTMIN + 64,
191 __SIGRTMIN + 65,
192 __SIGRTMIN + 66,
193 __SIGRTMIN + 67,
194 __SIGRTMIN + 68,
195 __SIGRTMIN + 69,
196 __SIGRTMIN + 70,
197 __SIGRTMIN + 71,
198 __SIGRTMIN + 72,
199 __SIGRTMIN + 73,
200 __SIGRTMIN + 74,
201 __SIGRTMIN + 75,
202 __SIGRTMIN + 76,
203 __SIGRTMIN + 77,
204 __SIGRTMIN + 78,
205 __SIGRTMIN + 79,
206 __SIGRTMIN + 80,
207 __SIGRTMIN + 81,
208 __SIGRTMIN + 82,
209 __SIGRTMIN + 83,
210 __SIGRTMIN + 84,
211 __SIGRTMIN + 85,
212 __SIGRTMIN + 86,
213 __SIGRTMIN + 87,
214 __SIGRTMIN + 88,
215 __SIGRTMIN + 89,
216 __SIGRTMIN + 90,
217 __SIGRTMIN + 91,
218 __SIGRTMIN + 92,
219 __SIGRTMIN + 93,
220 __SIGRTMIN + 94,
221 __SIGRTMIN + 95,
222 -1, /* SIGINFO */
223 -1, /* UNKNOWN */
224 -1, /* DEFAULT */
225 -1,
226 -1,
227 -1,
228 -1,
229 -1,
230 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000231#endif
aurel32ca587a82008-12-18 22:44:13 +0000232};
bellard8f447cc2006-06-14 15:21:14 +0000233#else
aurel32ca587a82008-12-18 22:44:13 +0000234/* In system mode we only need SIGINT and SIGTRAP; other signals
235 are not yet supported. */
236
237enum {
238 TARGET_SIGINT = 2,
239 TARGET_SIGTRAP = 5
240};
241
242static int gdb_signal_table[] = {
243 -1,
244 -1,
245 TARGET_SIGINT,
246 -1,
247 -1,
248 TARGET_SIGTRAP
249};
bellard8f447cc2006-06-14 15:21:14 +0000250#endif
bellardb4608c02003-06-27 17:34:32 +0000251
aurel32ca587a82008-12-18 22:44:13 +0000252#ifdef CONFIG_USER_ONLY
253static int target_signal_to_gdb (int sig)
254{
255 int i;
256 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
257 if (gdb_signal_table[i] == sig)
258 return i;
259 return GDB_SIGNAL_UNKNOWN;
260}
261#endif
262
263static int gdb_signal_to_target (int sig)
264{
265 if (sig < ARRAY_SIZE (gdb_signal_table))
266 return gdb_signal_table[sig];
267 else
268 return -1;
269}
270
bellard4abe6152003-07-26 18:01:58 +0000271//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000272
pbrook56aebc82008-10-11 17:55:29 +0000273typedef struct GDBRegisterState {
274 int base_reg;
275 int num_regs;
276 gdb_reg_cb get_reg;
277 gdb_reg_cb set_reg;
278 const char *xml;
279 struct GDBRegisterState *next;
280} GDBRegisterState;
281
bellard858693c2004-03-31 18:52:07 +0000282enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000283 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000284 RS_IDLE,
285 RS_GETLINE,
286 RS_CHKSUM1,
287 RS_CHKSUM2,
288};
bellard858693c2004-03-31 18:52:07 +0000289typedef struct GDBState {
Andreas Färber9349b4f2012-03-14 01:38:32 +0100290 CPUArchState *c_cpu; /* current CPU for step/continue ops */
291 CPUArchState *g_cpu; /* current CPU for other ops */
292 CPUArchState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000293 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000294 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000295 int line_buf_index;
296 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000297 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000298 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000299 int signal;
bellard41625032005-04-24 10:07:11 +0000300#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000301 int fd;
bellard41625032005-04-24 10:07:11 +0000302 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000303#else
304 CharDriverState *chr;
aliguori8a34a0f2009-03-05 23:01:55 +0000305 CharDriverState *mon_chr;
bellard41625032005-04-24 10:07:11 +0000306#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000307 char syscall_buf[256];
308 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000309} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000310
edgar_igl60897d32008-05-09 08:25:14 +0000311/* By default use no IRQs and no timers while single stepping so as to
312 * make single stepping like an ICE HW step.
313 */
314static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
315
aliguori880a7572008-11-18 20:30:24 +0000316static GDBState *gdbserver_state;
317
pbrook56aebc82008-10-11 17:55:29 +0000318/* This is an ugly hack to cope with both new and old gdb.
319 If gdb sends qXfer:features:read then assume we're talking to a newish
320 gdb that understands target descriptions. */
321static int gdb_has_xml;
322
bellard1fddef42005-04-17 19:16:13 +0000323#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000324/* XXX: This is not thread safe. Do we care? */
325static int gdbserver_fd = -1;
326
bellard858693c2004-03-31 18:52:07 +0000327static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000328{
329 uint8_t ch;
330 int ret;
331
332 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000333 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000334 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000335 if (errno == ECONNRESET)
336 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000337 if (errno != EINTR && errno != EAGAIN)
338 return -1;
339 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000340 close(s->fd);
341 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000342 return -1;
343 } else {
344 break;
345 }
346 }
347 return ch;
348}
pbrook4046d912007-01-28 01:53:16 +0000349#endif
bellardb4608c02003-06-27 17:34:32 +0000350
blueswir1654efcf2009-04-18 07:29:59 +0000351static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000352 GDB_SYS_UNKNOWN,
353 GDB_SYS_ENABLED,
354 GDB_SYS_DISABLED,
355} gdb_syscall_mode;
356
357/* If gdb is connected when the first semihosting syscall occurs then use
358 remote gdb syscalls. Otherwise use native file IO. */
359int use_gdb_syscalls(void)
360{
361 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000362 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
363 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000364 }
365 return gdb_syscall_mode == GDB_SYS_ENABLED;
366}
367
edgar_iglba70a622008-03-14 06:10:42 +0000368/* Resume execution. */
369static inline void gdb_continue(GDBState *s)
370{
371#ifdef CONFIG_USER_ONLY
372 s->running_state = 1;
373#else
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200374 if (runstate_check(RUN_STATE_DEBUG)) {
375 vm_start();
376 }
edgar_iglba70a622008-03-14 06:10:42 +0000377#endif
378}
379
bellard858693c2004-03-31 18:52:07 +0000380static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000381{
pbrook4046d912007-01-28 01:53:16 +0000382#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000383 int ret;
384
385 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000386 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000387 if (ret < 0) {
388 if (errno != EINTR && errno != EAGAIN)
389 return;
390 } else {
391 buf += ret;
392 len -= ret;
393 }
394 }
pbrook4046d912007-01-28 01:53:16 +0000395#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500396 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000397#endif
bellardb4608c02003-06-27 17:34:32 +0000398}
399
400static inline int fromhex(int v)
401{
402 if (v >= '0' && v <= '9')
403 return v - '0';
404 else if (v >= 'A' && v <= 'F')
405 return v - 'A' + 10;
406 else if (v >= 'a' && v <= 'f')
407 return v - 'a' + 10;
408 else
409 return 0;
410}
411
412static inline int tohex(int v)
413{
414 if (v < 10)
415 return v + '0';
416 else
417 return v - 10 + 'a';
418}
419
420static void memtohex(char *buf, const uint8_t *mem, int len)
421{
422 int i, c;
423 char *q;
424 q = buf;
425 for(i = 0; i < len; i++) {
426 c = mem[i];
427 *q++ = tohex(c >> 4);
428 *q++ = tohex(c & 0xf);
429 }
430 *q = '\0';
431}
432
433static void hextomem(uint8_t *mem, const char *buf, int len)
434{
435 int i;
436
437 for(i = 0; i < len; i++) {
438 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
439 buf += 2;
440 }
441}
442
bellardb4608c02003-06-27 17:34:32 +0000443/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000444static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000445{
pbrook56aebc82008-10-11 17:55:29 +0000446 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000447 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000448
bellardb4608c02003-06-27 17:34:32 +0000449 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000450 p = s->last_packet;
451 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000452 memcpy(p, buf, len);
453 p += len;
bellardb4608c02003-06-27 17:34:32 +0000454 csum = 0;
455 for(i = 0; i < len; i++) {
456 csum += buf[i];
457 }
pbrook4046d912007-01-28 01:53:16 +0000458 *(p++) = '#';
459 *(p++) = tohex((csum >> 4) & 0xf);
460 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000461
pbrook4046d912007-01-28 01:53:16 +0000462 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000463 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000464
pbrook4046d912007-01-28 01:53:16 +0000465#ifdef CONFIG_USER_ONLY
466 i = get_char(s);
467 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000468 return -1;
pbrook4046d912007-01-28 01:53:16 +0000469 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000470 break;
pbrook4046d912007-01-28 01:53:16 +0000471#else
472 break;
473#endif
bellardb4608c02003-06-27 17:34:32 +0000474 }
475 return 0;
476}
477
pbrook56aebc82008-10-11 17:55:29 +0000478/* return -1 if error, 0 if OK */
479static int put_packet(GDBState *s, const char *buf)
480{
481#ifdef DEBUG_GDB
482 printf("reply='%s'\n", buf);
483#endif
484
485 return put_packet_binary(s, buf, strlen(buf));
486}
487
488/* The GDB remote protocol transfers values in target byte order. This means
489 we can use the raw memory access routines to access the value buffer.
490 Conveniently, these also handle the case where the buffer is mis-aligned.
491 */
492#define GET_REG8(val) do { \
493 stb_p(mem_buf, val); \
494 return 1; \
495 } while(0)
496#define GET_REG16(val) do { \
497 stw_p(mem_buf, val); \
498 return 2; \
499 } while(0)
500#define GET_REG32(val) do { \
501 stl_p(mem_buf, val); \
502 return 4; \
503 } while(0)
504#define GET_REG64(val) do { \
505 stq_p(mem_buf, val); \
506 return 8; \
507 } while(0)
508
509#if TARGET_LONG_BITS == 64
510#define GET_REGL(val) GET_REG64(val)
511#define ldtul_p(addr) ldq_p(addr)
512#else
513#define GET_REGL(val) GET_REG32(val)
514#define ldtul_p(addr) ldl_p(addr)
515#endif
516
edgar_iglfde3fd62008-05-09 08:50:01 +0000517#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000518
519#ifdef TARGET_X86_64
pbrook56aebc82008-10-11 17:55:29 +0000520static const int gpr_map[16] = {
bellard79808572008-05-09 14:40:22 +0000521 R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
pbrook56aebc82008-10-11 17:55:29 +0000522 8, 9, 10, 11, 12, 13, 14, 15
bellard79808572008-05-09 14:40:22 +0000523};
bellard79808572008-05-09 14:40:22 +0000524#else
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200525#define gpr_map gpr_map32
bellard79808572008-05-09 14:40:22 +0000526#endif
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200527static const int gpr_map32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
pbrook56aebc82008-10-11 17:55:29 +0000528
529#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
530
Jan Kiszkab1631e72009-06-27 09:53:51 +0200531#define IDX_IP_REG CPU_NB_REGS
532#define IDX_FLAGS_REG (IDX_IP_REG + 1)
533#define IDX_SEG_REGS (IDX_FLAGS_REG + 1)
534#define IDX_FP_REGS (IDX_SEG_REGS + 6)
535#define IDX_XMM_REGS (IDX_FP_REGS + 16)
536#define IDX_MXCSR_REG (IDX_XMM_REGS + CPU_NB_REGS)
537
Andreas Färberf3840912012-02-20 06:44:56 +0100538static int cpu_gdb_read_register(CPUX86State *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000539{
540 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200541 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
542 GET_REG64(env->regs[gpr_map[n]]);
543 } else if (n < CPU_NB_REGS32) {
544 GET_REG32(env->regs[gpr_map32[n]]);
545 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200546 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000547#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200548 /* FIXME: byteswap float values - after fixing fpregs layout. */
549 memcpy(mem_buf, &env->fpregs[n - IDX_FP_REGS], 10);
pbrook56aebc82008-10-11 17:55:29 +0000550#else
551 memset(mem_buf, 0, 10);
552#endif
553 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200554 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
555 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200556 if (n < CPU_NB_REGS32 ||
557 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
558 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
559 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
560 return 16;
561 }
pbrook56aebc82008-10-11 17:55:29 +0000562 } else {
pbrook56aebc82008-10-11 17:55:29 +0000563 switch (n) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200564 case IDX_IP_REG:
565 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
566 GET_REG64(env->eip);
567 } else {
568 GET_REG32(env->eip);
569 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200570 case IDX_FLAGS_REG: GET_REG32(env->eflags);
571
572 case IDX_SEG_REGS: GET_REG32(env->segs[R_CS].selector);
573 case IDX_SEG_REGS + 1: GET_REG32(env->segs[R_SS].selector);
574 case IDX_SEG_REGS + 2: GET_REG32(env->segs[R_DS].selector);
575 case IDX_SEG_REGS + 3: GET_REG32(env->segs[R_ES].selector);
576 case IDX_SEG_REGS + 4: GET_REG32(env->segs[R_FS].selector);
577 case IDX_SEG_REGS + 5: GET_REG32(env->segs[R_GS].selector);
578
579 case IDX_FP_REGS + 8: GET_REG32(env->fpuc);
580 case IDX_FP_REGS + 9: GET_REG32((env->fpus & ~0x3800) |
581 (env->fpstt & 0x7) << 11);
582 case IDX_FP_REGS + 10: GET_REG32(0); /* ftag */
583 case IDX_FP_REGS + 11: GET_REG32(0); /* fiseg */
584 case IDX_FP_REGS + 12: GET_REG32(0); /* fioff */
585 case IDX_FP_REGS + 13: GET_REG32(0); /* foseg */
586 case IDX_FP_REGS + 14: GET_REG32(0); /* fooff */
587 case IDX_FP_REGS + 15: GET_REG32(0); /* fop */
588
589 case IDX_MXCSR_REG: GET_REG32(env->mxcsr);
pbrook56aebc82008-10-11 17:55:29 +0000590 }
bellard79808572008-05-09 14:40:22 +0000591 }
pbrook56aebc82008-10-11 17:55:29 +0000592 return 0;
bellard79808572008-05-09 14:40:22 +0000593}
594
Andreas Färberf3840912012-02-20 06:44:56 +0100595static int cpu_x86_gdb_load_seg(CPUX86State *env, int sreg, uint8_t *mem_buf)
Jan Kiszka84273172009-06-27 09:53:51 +0200596{
597 uint16_t selector = ldl_p(mem_buf);
598
599 if (selector != env->segs[sreg].selector) {
600#if defined(CONFIG_USER_ONLY)
601 cpu_x86_load_seg(env, sreg, selector);
602#else
603 unsigned int limit, flags;
604 target_ulong base;
605
606 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
607 base = selector << 4;
608 limit = 0xffff;
609 flags = 0;
610 } else {
611 if (!cpu_x86_get_descr_debug(env, selector, &base, &limit, &flags))
612 return 4;
613 }
614 cpu_x86_load_seg_cache(env, sreg, selector, base, limit, flags);
615#endif
616 }
617 return 4;
618}
619
Andreas Färberf3840912012-02-20 06:44:56 +0100620static int cpu_gdb_write_register(CPUX86State *env, uint8_t *mem_buf, int n)
bellard79808572008-05-09 14:40:22 +0000621{
pbrook56aebc82008-10-11 17:55:29 +0000622 uint32_t tmp;
623
Jan Kiszkab1631e72009-06-27 09:53:51 +0200624 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200625 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
626 env->regs[gpr_map[n]] = ldtul_p(mem_buf);
627 return sizeof(target_ulong);
628 } else if (n < CPU_NB_REGS32) {
629 n = gpr_map32[n];
630 env->regs[n] &= ~0xffffffffUL;
631 env->regs[n] |= (uint32_t)ldl_p(mem_buf);
632 return 4;
633 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200634 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000635#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200636 /* FIXME: byteswap float values - after fixing fpregs layout. */
637 memcpy(&env->fpregs[n - IDX_FP_REGS], mem_buf, 10);
pbrook56aebc82008-10-11 17:55:29 +0000638#endif
639 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200640 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
641 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200642 if (n < CPU_NB_REGS32 ||
643 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
644 env->xmm_regs[n].XMM_Q(0) = ldq_p(mem_buf);
645 env->xmm_regs[n].XMM_Q(1) = ldq_p(mem_buf + 8);
646 return 16;
647 }
pbrook56aebc82008-10-11 17:55:29 +0000648 } else {
Jan Kiszkab1631e72009-06-27 09:53:51 +0200649 switch (n) {
650 case IDX_IP_REG:
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200651 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
652 env->eip = ldq_p(mem_buf);
653 return 8;
654 } else {
655 env->eip &= ~0xffffffffUL;
656 env->eip |= (uint32_t)ldl_p(mem_buf);
657 return 4;
658 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200659 case IDX_FLAGS_REG:
660 env->eflags = ldl_p(mem_buf);
661 return 4;
662
Jan Kiszka84273172009-06-27 09:53:51 +0200663 case IDX_SEG_REGS: return cpu_x86_gdb_load_seg(env, R_CS, mem_buf);
664 case IDX_SEG_REGS + 1: return cpu_x86_gdb_load_seg(env, R_SS, mem_buf);
665 case IDX_SEG_REGS + 2: return cpu_x86_gdb_load_seg(env, R_DS, mem_buf);
666 case IDX_SEG_REGS + 3: return cpu_x86_gdb_load_seg(env, R_ES, mem_buf);
667 case IDX_SEG_REGS + 4: return cpu_x86_gdb_load_seg(env, R_FS, mem_buf);
668 case IDX_SEG_REGS + 5: return cpu_x86_gdb_load_seg(env, R_GS, mem_buf);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200669
670 case IDX_FP_REGS + 8:
671 env->fpuc = ldl_p(mem_buf);
672 return 4;
673 case IDX_FP_REGS + 9:
674 tmp = ldl_p(mem_buf);
675 env->fpstt = (tmp >> 11) & 7;
676 env->fpus = tmp & ~0x3800;
677 return 4;
678 case IDX_FP_REGS + 10: /* ftag */ return 4;
679 case IDX_FP_REGS + 11: /* fiseg */ return 4;
680 case IDX_FP_REGS + 12: /* fioff */ return 4;
681 case IDX_FP_REGS + 13: /* foseg */ return 4;
682 case IDX_FP_REGS + 14: /* fooff */ return 4;
683 case IDX_FP_REGS + 15: /* fop */ return 4;
684
685 case IDX_MXCSR_REG:
686 env->mxcsr = ldl_p(mem_buf);
687 return 4;
bellard79808572008-05-09 14:40:22 +0000688 }
bellard79808572008-05-09 14:40:22 +0000689 }
pbrook56aebc82008-10-11 17:55:29 +0000690 /* Unrecognised register. */
691 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000692}
693
bellard9e62fd72004-01-05 22:49:06 +0000694#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000695
aurel32e571cb42009-01-24 15:07:42 +0000696/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
697 expects whatever the target description contains. Due to a
698 historical mishap the FP registers appear in between core integer
699 regs and PC, MSR, CR, and so forth. We hack round this by giving the
700 FP regs zero size when talking to a newer gdb. */
pbrook56aebc82008-10-11 17:55:29 +0000701#define NUM_CORE_REGS 71
aurel32e571cb42009-01-24 15:07:42 +0000702#if defined (TARGET_PPC64)
703#define GDB_CORE_XML "power64-core.xml"
704#else
705#define GDB_CORE_XML "power-core.xml"
706#endif
pbrook56aebc82008-10-11 17:55:29 +0000707
Andreas Färberf3840912012-02-20 06:44:56 +0100708static int cpu_gdb_read_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000709{
pbrook56aebc82008-10-11 17:55:29 +0000710 if (n < 32) {
711 /* gprs */
712 GET_REGL(env->gpr[n]);
713 } else if (n < 64) {
714 /* fprs */
aurel32e571cb42009-01-24 15:07:42 +0000715 if (gdb_has_xml)
716 return 0;
aurel328d4acf92008-11-30 16:23:18 +0000717 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000718 return 8;
719 } else {
720 switch (n) {
721 case 64: GET_REGL(env->nip);
722 case 65: GET_REGL(env->msr);
723 case 66:
724 {
725 uint32_t cr = 0;
726 int i;
727 for (i = 0; i < 8; i++)
728 cr |= env->crf[i] << (32 - ((i + 1) * 4));
729 GET_REG32(cr);
730 }
731 case 67: GET_REGL(env->lr);
732 case 68: GET_REGL(env->ctr);
aurel323d7b4172008-10-21 11:28:46 +0000733 case 69: GET_REGL(env->xer);
aurel32e571cb42009-01-24 15:07:42 +0000734 case 70:
735 {
736 if (gdb_has_xml)
737 return 0;
Fabien Chouteau5a576fb2011-09-01 04:56:00 +0000738 GET_REG32(env->fpscr);
aurel32e571cb42009-01-24 15:07:42 +0000739 }
pbrook56aebc82008-10-11 17:55:29 +0000740 }
bellard9e62fd72004-01-05 22:49:06 +0000741 }
pbrook56aebc82008-10-11 17:55:29 +0000742 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000743}
744
Andreas Färberf3840912012-02-20 06:44:56 +0100745static int cpu_gdb_write_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000746{
pbrook56aebc82008-10-11 17:55:29 +0000747 if (n < 32) {
748 /* gprs */
749 env->gpr[n] = ldtul_p(mem_buf);
750 return sizeof(target_ulong);
751 } else if (n < 64) {
752 /* fprs */
aurel32e571cb42009-01-24 15:07:42 +0000753 if (gdb_has_xml)
754 return 0;
aurel328d4acf92008-11-30 16:23:18 +0000755 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000756 return 8;
757 } else {
758 switch (n) {
759 case 64:
760 env->nip = ldtul_p(mem_buf);
761 return sizeof(target_ulong);
762 case 65:
763 ppc_store_msr(env, ldtul_p(mem_buf));
764 return sizeof(target_ulong);
765 case 66:
766 {
767 uint32_t cr = ldl_p(mem_buf);
768 int i;
769 for (i = 0; i < 8; i++)
770 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
771 return 4;
772 }
773 case 67:
774 env->lr = ldtul_p(mem_buf);
775 return sizeof(target_ulong);
776 case 68:
777 env->ctr = ldtul_p(mem_buf);
778 return sizeof(target_ulong);
779 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000780 env->xer = ldtul_p(mem_buf);
781 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000782 case 70:
783 /* fpscr */
aurel32e571cb42009-01-24 15:07:42 +0000784 if (gdb_has_xml)
785 return 0;
Fabien Chouteaud6478bc2013-03-19 07:41:53 +0000786 store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
787 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000788 }
bellard9e62fd72004-01-05 22:49:06 +0000789 }
pbrook56aebc82008-10-11 17:55:29 +0000790 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000791}
pbrook56aebc82008-10-11 17:55:29 +0000792
bellarde95c8d52004-09-30 22:22:08 +0000793#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000794
pbrook56aebc82008-10-11 17:55:29 +0000795#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
796#define NUM_CORE_REGS 86
797#else
blueswir15a377912009-01-13 16:28:01 +0000798#define NUM_CORE_REGS 72
pbrook56aebc82008-10-11 17:55:29 +0000799#endif
800
801#ifdef TARGET_ABI32
802#define GET_REGA(val) GET_REG32(val)
803#else
804#define GET_REGA(val) GET_REGL(val)
805#endif
806
Andreas Färberf3840912012-02-20 06:44:56 +0100807static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000808{
809 if (n < 8) {
810 /* g0..g7 */
811 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000812 }
pbrook56aebc82008-10-11 17:55:29 +0000813 if (n < 32) {
814 /* register window */
815 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000816 }
pbrook56aebc82008-10-11 17:55:29 +0000817#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
818 if (n < 64) {
819 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700820 if (n & 1) {
821 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
822 } else {
823 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
824 }
bellarde95c8d52004-09-30 22:22:08 +0000825 }
826 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000827 switch (n) {
828 case 64: GET_REGA(env->y);
Blue Swirl5a834bb2010-05-09 20:19:04 +0000829 case 65: GET_REGA(cpu_get_psr(env));
pbrook56aebc82008-10-11 17:55:29 +0000830 case 66: GET_REGA(env->wim);
831 case 67: GET_REGA(env->tbr);
832 case 68: GET_REGA(env->pc);
833 case 69: GET_REGA(env->npc);
834 case 70: GET_REGA(env->fsr);
835 case 71: GET_REGA(0); /* csr */
blueswir15a377912009-01-13 16:28:01 +0000836 default: GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000837 }
bellard34751872005-07-02 14:31:34 +0000838#else
pbrook56aebc82008-10-11 17:55:29 +0000839 if (n < 64) {
840 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700841 if (n & 1) {
842 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
843 } else {
844 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
845 }
bellard34751872005-07-02 14:31:34 +0000846 }
pbrook56aebc82008-10-11 17:55:29 +0000847 if (n < 80) {
848 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700849 GET_REG64(env->fpr[(n - 32) / 2].ll);
pbrook56aebc82008-10-11 17:55:29 +0000850 }
851 switch (n) {
852 case 80: GET_REGL(env->pc);
853 case 81: GET_REGL(env->npc);
Blue Swirl5a834bb2010-05-09 20:19:04 +0000854 case 82: GET_REGL((cpu_get_ccr(env) << 32) |
855 ((env->asi & 0xff) << 24) |
856 ((env->pstate & 0xfff) << 8) |
857 cpu_get_cwp64(env));
pbrook56aebc82008-10-11 17:55:29 +0000858 case 83: GET_REGL(env->fsr);
859 case 84: GET_REGL(env->fprs);
860 case 85: GET_REGL(env->y);
861 }
bellard34751872005-07-02 14:31:34 +0000862#endif
pbrook56aebc82008-10-11 17:55:29 +0000863 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000864}
865
Andreas Färberf3840912012-02-20 06:44:56 +0100866static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000867{
pbrook56aebc82008-10-11 17:55:29 +0000868#if defined(TARGET_ABI32)
869 abi_ulong tmp;
870
871 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000872#else
pbrook56aebc82008-10-11 17:55:29 +0000873 target_ulong tmp;
874
875 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000876#endif
bellarde95c8d52004-09-30 22:22:08 +0000877
pbrook56aebc82008-10-11 17:55:29 +0000878 if (n < 8) {
879 /* g0..g7 */
880 env->gregs[n] = tmp;
881 } else if (n < 32) {
882 /* register window */
883 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000884 }
pbrook56aebc82008-10-11 17:55:29 +0000885#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
886 else if (n < 64) {
887 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700888 /* f0-f31 */
889 if (n & 1) {
890 env->fpr[(n - 32) / 2].l.lower = tmp;
891 } else {
892 env->fpr[(n - 32) / 2].l.upper = tmp;
893 }
pbrook56aebc82008-10-11 17:55:29 +0000894 } else {
895 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
896 switch (n) {
897 case 64: env->y = tmp; break;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000898 case 65: cpu_put_psr(env, tmp); break;
pbrook56aebc82008-10-11 17:55:29 +0000899 case 66: env->wim = tmp; break;
900 case 67: env->tbr = tmp; break;
901 case 68: env->pc = tmp; break;
902 case 69: env->npc = tmp; break;
903 case 70: env->fsr = tmp; break;
904 default: return 0;
905 }
bellarde95c8d52004-09-30 22:22:08 +0000906 }
pbrook56aebc82008-10-11 17:55:29 +0000907 return 4;
bellard34751872005-07-02 14:31:34 +0000908#else
pbrook56aebc82008-10-11 17:55:29 +0000909 else if (n < 64) {
910 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700911 tmp = ldl_p(mem_buf);
912 if (n & 1) {
913 env->fpr[(n - 32) / 2].l.lower = tmp;
914 } else {
915 env->fpr[(n - 32) / 2].l.upper = tmp;
916 }
pbrook56aebc82008-10-11 17:55:29 +0000917 return 4;
918 } else if (n < 80) {
919 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700920 env->fpr[(n - 32) / 2].ll = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000921 } else {
922 switch (n) {
923 case 80: env->pc = tmp; break;
924 case 81: env->npc = tmp; break;
925 case 82:
Blue Swirl5a834bb2010-05-09 20:19:04 +0000926 cpu_put_ccr(env, tmp >> 32);
pbrook56aebc82008-10-11 17:55:29 +0000927 env->asi = (tmp >> 24) & 0xff;
928 env->pstate = (tmp >> 8) & 0xfff;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000929 cpu_put_cwp64(env, tmp & 0xff);
pbrook56aebc82008-10-11 17:55:29 +0000930 break;
931 case 83: env->fsr = tmp; break;
932 case 84: env->fprs = tmp; break;
933 case 85: env->y = tmp; break;
934 default: return 0;
935 }
bellard34751872005-07-02 14:31:34 +0000936 }
pbrook56aebc82008-10-11 17:55:29 +0000937 return 8;
bellard34751872005-07-02 14:31:34 +0000938#endif
bellard9e62fd72004-01-05 22:49:06 +0000939}
bellard1fddef42005-04-17 19:16:13 +0000940#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000941
942/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
943 whatever the target description contains. Due to a historical mishap
944 the FPA registers appear in between core integer regs and the CPSR.
945 We hack round this by giving the FPA regs zero size when talking to a
946 newer gdb. */
947#define NUM_CORE_REGS 26
948#define GDB_CORE_XML "arm-core.xml"
949
Andreas Färberf3840912012-02-20 06:44:56 +0100950static int cpu_gdb_read_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000951{
pbrook56aebc82008-10-11 17:55:29 +0000952 if (n < 16) {
953 /* Core integer register. */
954 GET_REG32(env->regs[n]);
955 }
956 if (n < 24) {
957 /* FPA registers. */
958 if (gdb_has_xml)
959 return 0;
960 memset(mem_buf, 0, 12);
961 return 12;
962 }
963 switch (n) {
964 case 24:
965 /* FPA status register. */
966 if (gdb_has_xml)
967 return 0;
968 GET_REG32(0);
969 case 25:
970 /* CPSR */
971 GET_REG32(cpsr_read(env));
972 }
973 /* Unknown register. */
974 return 0;
bellard1fddef42005-04-17 19:16:13 +0000975}
976
Andreas Färberf3840912012-02-20 06:44:56 +0100977static int cpu_gdb_write_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000978{
pbrook56aebc82008-10-11 17:55:29 +0000979 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000980
pbrook56aebc82008-10-11 17:55:29 +0000981 tmp = ldl_p(mem_buf);
982
983 /* Mask out low bit of PC to workaround gdb bugs. This will probably
984 cause problems if we ever implement the Jazelle DBX extensions. */
985 if (n == 15)
986 tmp &= ~1;
987
988 if (n < 16) {
989 /* Core integer register. */
990 env->regs[n] = tmp;
991 return 4;
992 }
993 if (n < 24) { /* 16-23 */
994 /* FPA registers (ignored). */
995 if (gdb_has_xml)
996 return 0;
997 return 12;
998 }
999 switch (n) {
1000 case 24:
1001 /* FPA status register (ignored). */
1002 if (gdb_has_xml)
1003 return 0;
1004 return 4;
1005 case 25:
1006 /* CPSR */
1007 cpsr_write (env, tmp, 0xffffffff);
1008 return 4;
1009 }
1010 /* Unknown register. */
1011 return 0;
bellard1fddef42005-04-17 19:16:13 +00001012}
pbrook56aebc82008-10-11 17:55:29 +00001013
pbrooke6e59062006-10-22 00:18:54 +00001014#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +00001015
1016#define NUM_CORE_REGS 18
1017
1018#define GDB_CORE_XML "cf-core.xml"
1019
Andreas Färberf3840912012-02-20 06:44:56 +01001020static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001021{
pbrook56aebc82008-10-11 17:55:29 +00001022 if (n < 8) {
1023 /* D0-D7 */
1024 GET_REG32(env->dregs[n]);
1025 } else if (n < 16) {
1026 /* A0-A7 */
1027 GET_REG32(env->aregs[n - 8]);
1028 } else {
1029 switch (n) {
1030 case 16: GET_REG32(env->sr);
1031 case 17: GET_REG32(env->pc);
1032 }
pbrooke6e59062006-10-22 00:18:54 +00001033 }
pbrook56aebc82008-10-11 17:55:29 +00001034 /* FP registers not included here because they vary between
1035 ColdFire and m68k. Use XML bits for these. */
1036 return 0;
pbrooke6e59062006-10-22 00:18:54 +00001037}
1038
Andreas Färberf3840912012-02-20 06:44:56 +01001039static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001040{
pbrook56aebc82008-10-11 17:55:29 +00001041 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +00001042
pbrook56aebc82008-10-11 17:55:29 +00001043 tmp = ldl_p(mem_buf);
1044
1045 if (n < 8) {
1046 /* D0-D7 */
1047 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -08001048 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +00001049 /* A0-A7 */
1050 env->aregs[n - 8] = tmp;
1051 } else {
1052 switch (n) {
1053 case 16: env->sr = tmp; break;
1054 case 17: env->pc = tmp; break;
1055 default: return 0;
1056 }
pbrooke6e59062006-10-22 00:18:54 +00001057 }
pbrook56aebc82008-10-11 17:55:29 +00001058 return 4;
pbrooke6e59062006-10-22 00:18:54 +00001059}
bellard6f970bd2005-12-05 19:55:19 +00001060#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +00001061
1062#define NUM_CORE_REGS 73
1063
Andreas Färberf3840912012-02-20 06:44:56 +01001064static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001065{
pbrook56aebc82008-10-11 17:55:29 +00001066 if (n < 32) {
1067 GET_REGL(env->active_tc.gpr[n]);
1068 }
1069 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1070 if (n >= 38 && n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001071 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001072 GET_REGL(env->active_fpu.fpr[n - 38].d);
ths7ac256b2007-10-25 21:30:37 +00001073 else
pbrook56aebc82008-10-11 17:55:29 +00001074 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
1075 }
1076 switch (n) {
1077 case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
1078 case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
1079 }
1080 }
1081 switch (n) {
1082 case 32: GET_REGL((int32_t)env->CP0_Status);
1083 case 33: GET_REGL(env->active_tc.LO[0]);
1084 case 34: GET_REGL(env->active_tc.HI[0]);
1085 case 35: GET_REGL(env->CP0_BadVAddr);
1086 case 36: GET_REGL((int32_t)env->CP0_Cause);
Nathan Froydff1d1972009-12-08 08:06:30 -08001087 case 37: GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
pbrook56aebc82008-10-11 17:55:29 +00001088 case 72: GET_REGL(0); /* fp */
1089 case 89: GET_REGL((int32_t)env->CP0_PRid);
1090 }
1091 if (n >= 73 && n <= 88) {
1092 /* 16 embedded regs. */
1093 GET_REGL(0);
1094 }
ths36d23952007-02-28 22:37:42 +00001095
pbrook56aebc82008-10-11 17:55:29 +00001096 return 0;
bellard6f970bd2005-12-05 19:55:19 +00001097}
1098
ths8e33c082006-12-11 19:22:27 +00001099/* convert MIPS rounding mode in FCR31 to IEEE library */
1100static unsigned int ieee_rm[] =
1101 {
1102 float_round_nearest_even,
1103 float_round_to_zero,
1104 float_round_up,
1105 float_round_down
1106 };
1107#define RESTORE_ROUNDING_MODE \
thsf01be152008-09-18 11:57:27 +00001108 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +00001109
Andreas Färberf3840912012-02-20 06:44:56 +01001110static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001111{
pbrook56aebc82008-10-11 17:55:29 +00001112 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +00001113
pbrook56aebc82008-10-11 17:55:29 +00001114 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001115
pbrook56aebc82008-10-11 17:55:29 +00001116 if (n < 32) {
1117 env->active_tc.gpr[n] = tmp;
1118 return sizeof(target_ulong);
1119 }
1120 if (env->CP0_Config1 & (1 << CP0C1_FP)
1121 && n >= 38 && n < 73) {
1122 if (n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001123 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001124 env->active_fpu.fpr[n - 38].d = tmp;
ths7ac256b2007-10-25 21:30:37 +00001125 else
pbrook56aebc82008-10-11 17:55:29 +00001126 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1127 }
1128 switch (n) {
1129 case 70:
1130 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1131 /* set rounding mode */
1132 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +00001133 break;
1134 case 71: env->active_fpu.fcr0 = tmp; break;
1135 }
1136 return sizeof(target_ulong);
1137 }
1138 switch (n) {
1139 case 32: env->CP0_Status = tmp; break;
1140 case 33: env->active_tc.LO[0] = tmp; break;
1141 case 34: env->active_tc.HI[0] = tmp; break;
1142 case 35: env->CP0_BadVAddr = tmp; break;
1143 case 36: env->CP0_Cause = tmp; break;
Nathan Froydff1d1972009-12-08 08:06:30 -08001144 case 37:
1145 env->active_tc.PC = tmp & ~(target_ulong)1;
1146 if (tmp & 1) {
1147 env->hflags |= MIPS_HFLAG_M16;
1148 } else {
1149 env->hflags &= ~(MIPS_HFLAG_M16);
1150 }
1151 break;
pbrook56aebc82008-10-11 17:55:29 +00001152 case 72: /* fp, ignored */ break;
1153 default:
1154 if (n > 89)
1155 return 0;
1156 /* Other registers are readonly. Ignore writes. */
1157 break;
1158 }
1159
1160 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001161}
Jia Liufc043552012-07-20 15:50:50 +08001162#elif defined(TARGET_OPENRISC)
1163
1164#define NUM_CORE_REGS (32 + 3)
1165
1166static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
1167{
1168 if (n < 32) {
1169 GET_REG32(env->gpr[n]);
1170 } else {
1171 switch (n) {
1172 case 32: /* PPC */
1173 GET_REG32(env->ppc);
1174 break;
1175
1176 case 33: /* NPC */
1177 GET_REG32(env->npc);
1178 break;
1179
1180 case 34: /* SR */
1181 GET_REG32(env->sr);
1182 break;
1183
1184 default:
1185 break;
1186 }
1187 }
1188 return 0;
1189}
1190
1191static int cpu_gdb_write_register(CPUOpenRISCState *env,
1192 uint8_t *mem_buf, int n)
1193{
1194 uint32_t tmp;
1195
1196 if (n > NUM_CORE_REGS) {
1197 return 0;
1198 }
1199
1200 tmp = ldl_p(mem_buf);
1201
1202 if (n < 32) {
1203 env->gpr[n] = tmp;
1204 } else {
1205 switch (n) {
1206 case 32: /* PPC */
1207 env->ppc = tmp;
1208 break;
1209
1210 case 33: /* NPC */
1211 env->npc = tmp;
1212 break;
1213
1214 case 34: /* SR */
1215 env->sr = tmp;
1216 break;
1217
1218 default:
1219 break;
1220 }
1221 }
1222 return 4;
1223}
bellardfdf9b3e2006-04-27 21:07:38 +00001224#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001225
1226/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001227/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001228
pbrook56aebc82008-10-11 17:55:29 +00001229#define NUM_CORE_REGS 59
1230
Andreas Färberf3840912012-02-20 06:44:56 +01001231static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001232{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001233 switch (n) {
1234 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +00001235 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1236 GET_REGL(env->gregs[n + 16]);
1237 } else {
1238 GET_REGL(env->gregs[n]);
1239 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001240 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001241 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001242 case 16:
1243 GET_REGL(env->pc);
1244 case 17:
1245 GET_REGL(env->pr);
1246 case 18:
1247 GET_REGL(env->gbr);
1248 case 19:
1249 GET_REGL(env->vbr);
1250 case 20:
1251 GET_REGL(env->mach);
1252 case 21:
1253 GET_REGL(env->macl);
1254 case 22:
1255 GET_REGL(env->sr);
1256 case 23:
1257 GET_REGL(env->fpul);
1258 case 24:
1259 GET_REGL(env->fpscr);
1260 case 25 ... 40:
1261 if (env->fpscr & FPSCR_FR) {
1262 stfl_p(mem_buf, env->fregs[n - 9]);
1263 } else {
1264 stfl_p(mem_buf, env->fregs[n - 25]);
1265 }
1266 return 4;
1267 case 41:
1268 GET_REGL(env->ssr);
1269 case 42:
1270 GET_REGL(env->spc);
1271 case 43 ... 50:
1272 GET_REGL(env->gregs[n - 43]);
1273 case 51 ... 58:
1274 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +00001275 }
bellardfdf9b3e2006-04-27 21:07:38 +00001276
pbrook56aebc82008-10-11 17:55:29 +00001277 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001278}
1279
Andreas Färberf3840912012-02-20 06:44:56 +01001280static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001281{
pbrook56aebc82008-10-11 17:55:29 +00001282 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001283 case 0 ... 7:
1284 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1285 env->gregs[n + 16] = ldl_p(mem_buf);
1286 } else {
1287 env->gregs[n] = ldl_p(mem_buf);
1288 }
1289 break;
1290 case 8 ... 15:
1291 env->gregs[n] = ldl_p(mem_buf);
1292 break;
1293 case 16:
1294 env->pc = ldl_p(mem_buf);
1295 break;
1296 case 17:
1297 env->pr = ldl_p(mem_buf);
1298 break;
1299 case 18:
1300 env->gbr = ldl_p(mem_buf);
1301 break;
1302 case 19:
1303 env->vbr = ldl_p(mem_buf);
1304 break;
1305 case 20:
1306 env->mach = ldl_p(mem_buf);
1307 break;
1308 case 21:
1309 env->macl = ldl_p(mem_buf);
1310 break;
1311 case 22:
1312 env->sr = ldl_p(mem_buf);
1313 break;
1314 case 23:
1315 env->fpul = ldl_p(mem_buf);
1316 break;
1317 case 24:
1318 env->fpscr = ldl_p(mem_buf);
1319 break;
1320 case 25 ... 40:
1321 if (env->fpscr & FPSCR_FR) {
1322 env->fregs[n - 9] = ldfl_p(mem_buf);
1323 } else {
1324 env->fregs[n - 25] = ldfl_p(mem_buf);
1325 }
1326 break;
1327 case 41:
1328 env->ssr = ldl_p(mem_buf);
1329 break;
1330 case 42:
1331 env->spc = ldl_p(mem_buf);
1332 break;
1333 case 43 ... 50:
1334 env->gregs[n - 43] = ldl_p(mem_buf);
1335 break;
1336 case 51 ... 58:
1337 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
1338 break;
pbrook56aebc82008-10-11 17:55:29 +00001339 default: return 0;
1340 }
1341
1342 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001343}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001344#elif defined (TARGET_MICROBLAZE)
1345
1346#define NUM_CORE_REGS (32 + 5)
1347
Andreas Färberf3840912012-02-20 06:44:56 +01001348static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001349{
1350 if (n < 32) {
1351 GET_REG32(env->regs[n]);
1352 } else {
1353 GET_REG32(env->sregs[n - 32]);
1354 }
1355 return 0;
1356}
1357
Andreas Färberf3840912012-02-20 06:44:56 +01001358static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001359{
1360 uint32_t tmp;
1361
1362 if (n > NUM_CORE_REGS)
1363 return 0;
1364
1365 tmp = ldl_p(mem_buf);
1366
1367 if (n < 32) {
1368 env->regs[n] = tmp;
1369 } else {
1370 env->sregs[n - 32] = tmp;
1371 }
1372 return 4;
1373}
thsf1ccf902007-10-08 13:16:14 +00001374#elif defined (TARGET_CRIS)
1375
pbrook56aebc82008-10-11 17:55:29 +00001376#define NUM_CORE_REGS 49
1377
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001378static int
Andreas Färberf3840912012-02-20 06:44:56 +01001379read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001380{
1381 if (n < 15) {
1382 GET_REG32(env->regs[n]);
1383 }
1384
1385 if (n == 15) {
1386 GET_REG32(env->pc);
1387 }
1388
1389 if (n < 32) {
1390 switch (n) {
1391 case 16:
1392 GET_REG8(env->pregs[n - 16]);
1393 break;
1394 case 17:
1395 GET_REG8(env->pregs[n - 16]);
1396 break;
1397 case 20:
1398 case 21:
1399 GET_REG16(env->pregs[n - 16]);
1400 break;
1401 default:
1402 if (n >= 23) {
1403 GET_REG32(env->pregs[n - 16]);
1404 }
1405 break;
1406 }
1407 }
1408 return 0;
1409}
1410
Andreas Färberf3840912012-02-20 06:44:56 +01001411static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001412{
pbrook56aebc82008-10-11 17:55:29 +00001413 uint8_t srs;
1414
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001415 if (env->pregs[PR_VR] < 32)
1416 return read_register_crisv10(env, mem_buf, n);
1417
pbrook56aebc82008-10-11 17:55:29 +00001418 srs = env->pregs[PR_SRS];
1419 if (n < 16) {
1420 GET_REG32(env->regs[n]);
1421 }
1422
1423 if (n >= 21 && n < 32) {
1424 GET_REG32(env->pregs[n - 16]);
1425 }
1426 if (n >= 33 && n < 49) {
1427 GET_REG32(env->sregs[srs][n - 33]);
1428 }
1429 switch (n) {
1430 case 16: GET_REG8(env->pregs[0]);
1431 case 17: GET_REG8(env->pregs[1]);
1432 case 18: GET_REG32(env->pregs[2]);
1433 case 19: GET_REG8(srs);
1434 case 20: GET_REG16(env->pregs[4]);
1435 case 32: GET_REG32(env->pc);
1436 }
1437
1438 return 0;
thsf1ccf902007-10-08 13:16:14 +00001439}
1440
Andreas Färberf3840912012-02-20 06:44:56 +01001441static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001442{
pbrook56aebc82008-10-11 17:55:29 +00001443 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001444
pbrook56aebc82008-10-11 17:55:29 +00001445 if (n > 49)
1446 return 0;
thsf1ccf902007-10-08 13:16:14 +00001447
pbrook56aebc82008-10-11 17:55:29 +00001448 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001449
pbrook56aebc82008-10-11 17:55:29 +00001450 if (n < 16) {
1451 env->regs[n] = tmp;
1452 }
thsf1ccf902007-10-08 13:16:14 +00001453
edgar_igld7b69672008-10-11 19:32:21 +00001454 if (n >= 21 && n < 32) {
1455 env->pregs[n - 16] = tmp;
1456 }
1457
1458 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001459 switch (n) {
1460 case 16: return 1;
1461 case 17: return 1;
edgar_igld7b69672008-10-11 19:32:21 +00001462 case 18: env->pregs[PR_PID] = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +00001463 case 19: return 1;
1464 case 20: return 2;
1465 case 32: env->pc = tmp; break;
1466 }
thsf1ccf902007-10-08 13:16:14 +00001467
pbrook56aebc82008-10-11 17:55:29 +00001468 return 4;
thsf1ccf902007-10-08 13:16:14 +00001469}
aurel3219bf5172008-12-07 23:26:32 +00001470#elif defined (TARGET_ALPHA)
1471
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001472#define NUM_CORE_REGS 67
aurel3219bf5172008-12-07 23:26:32 +00001473
Andreas Färberf3840912012-02-20 06:44:56 +01001474static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001475{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001476 uint64_t val;
1477 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001478
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001479 switch (n) {
1480 case 0 ... 30:
1481 val = env->ir[n];
1482 break;
1483 case 32 ... 62:
1484 d.d = env->fir[n - 32];
1485 val = d.ll;
1486 break;
1487 case 63:
1488 val = cpu_alpha_load_fpcr(env);
1489 break;
1490 case 64:
1491 val = env->pc;
1492 break;
1493 case 66:
1494 val = env->unique;
1495 break;
1496 case 31:
1497 case 65:
1498 /* 31 really is the zero register; 65 is unassigned in the
1499 gdb protocol, but is still required to occupy 8 bytes. */
1500 val = 0;
1501 break;
1502 default:
1503 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001504 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001505 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001506}
1507
Andreas Färberf3840912012-02-20 06:44:56 +01001508static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001509{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001510 target_ulong tmp = ldtul_p(mem_buf);
1511 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001512
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001513 switch (n) {
1514 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001515 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001516 break;
1517 case 32 ... 62:
1518 d.ll = tmp;
1519 env->fir[n - 32] = d.d;
1520 break;
1521 case 63:
1522 cpu_alpha_store_fpcr(env, tmp);
1523 break;
1524 case 64:
1525 env->pc = tmp;
1526 break;
1527 case 66:
1528 env->unique = tmp;
1529 break;
1530 case 31:
1531 case 65:
1532 /* 31 really is the zero register; 65 is unassigned in the
1533 gdb protocol, but is still required to occupy 8 bytes. */
1534 break;
1535 default:
1536 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001537 }
aurel3219bf5172008-12-07 23:26:32 +00001538 return 8;
1539}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001540#elif defined (TARGET_S390X)
1541
Richard Henderson6ee77b12012-08-23 10:44:45 -07001542#define NUM_CORE_REGS S390_NUM_REGS
Alexander Grafafcb0e42009-12-05 12:44:29 +01001543
Andreas Färberf3840912012-02-20 06:44:56 +01001544static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001545{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001546 uint64_t val;
1547 int cc_op;
1548
Alexander Grafafcb0e42009-12-05 12:44:29 +01001549 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001550 case S390_PSWM_REGNUM:
1551 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1552 val = deposit64(env->psw.mask, 44, 2, cc_op);
1553 GET_REGL(val);
1554 break;
1555 case S390_PSWA_REGNUM:
1556 GET_REGL(env->psw.addr);
1557 break;
1558 case S390_R0_REGNUM ... S390_R15_REGNUM:
1559 GET_REGL(env->regs[n-S390_R0_REGNUM]);
1560 break;
1561 case S390_A0_REGNUM ... S390_A15_REGNUM:
1562 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
1563 break;
1564 case S390_FPC_REGNUM:
1565 GET_REG32(env->fpc);
1566 break;
1567 case S390_F0_REGNUM ... S390_F15_REGNUM:
1568 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
1569 break;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001570 }
1571
1572 return 0;
1573}
1574
Andreas Färberf3840912012-02-20 06:44:56 +01001575static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001576{
1577 target_ulong tmpl;
1578 uint32_t tmp32;
1579 int r = 8;
1580 tmpl = ldtul_p(mem_buf);
1581 tmp32 = ldl_p(mem_buf);
1582
1583 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001584 case S390_PSWM_REGNUM:
1585 env->psw.mask = tmpl;
1586 env->cc_op = extract64(tmpl, 44, 2);
1587 break;
1588 case S390_PSWA_REGNUM:
1589 env->psw.addr = tmpl;
1590 break;
1591 case S390_R0_REGNUM ... S390_R15_REGNUM:
1592 env->regs[n-S390_R0_REGNUM] = tmpl;
1593 break;
1594 case S390_A0_REGNUM ... S390_A15_REGNUM:
1595 env->aregs[n-S390_A0_REGNUM] = tmp32;
1596 r = 4;
1597 break;
1598 case S390_FPC_REGNUM:
1599 env->fpc = tmp32;
1600 r = 4;
1601 break;
1602 case S390_F0_REGNUM ... S390_F15_REGNUM:
1603 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1604 break;
1605 default:
1606 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001607 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001608 return r;
1609}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001610#elif defined (TARGET_LM32)
1611
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001612#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001613#define NUM_CORE_REGS (32 + 7)
1614
Andreas Färberf3840912012-02-20 06:44:56 +01001615static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001616{
1617 if (n < 32) {
1618 GET_REG32(env->regs[n]);
1619 } else {
1620 switch (n) {
1621 case 32:
1622 GET_REG32(env->pc);
1623 break;
1624 /* FIXME: put in right exception ID */
1625 case 33:
1626 GET_REG32(0);
1627 break;
1628 case 34:
1629 GET_REG32(env->eba);
1630 break;
1631 case 35:
1632 GET_REG32(env->deba);
1633 break;
1634 case 36:
1635 GET_REG32(env->ie);
1636 break;
1637 case 37:
1638 GET_REG32(lm32_pic_get_im(env->pic_state));
1639 break;
1640 case 38:
1641 GET_REG32(lm32_pic_get_ip(env->pic_state));
1642 break;
1643 }
1644 }
1645 return 0;
1646}
1647
Andreas Färberf3840912012-02-20 06:44:56 +01001648static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001649{
1650 uint32_t tmp;
1651
1652 if (n > NUM_CORE_REGS) {
1653 return 0;
1654 }
1655
1656 tmp = ldl_p(mem_buf);
1657
1658 if (n < 32) {
1659 env->regs[n] = tmp;
1660 } else {
1661 switch (n) {
1662 case 32:
1663 env->pc = tmp;
1664 break;
1665 case 34:
1666 env->eba = tmp;
1667 break;
1668 case 35:
1669 env->deba = tmp;
1670 break;
1671 case 36:
1672 env->ie = tmp;
1673 break;
1674 case 37:
1675 lm32_pic_set_im(env->pic_state, tmp);
1676 break;
1677 case 38:
1678 lm32_pic_set_ip(env->pic_state, tmp);
1679 break;
1680 }
1681 }
1682 return 4;
1683}
Max Filippovccfcaba2011-09-06 03:55:52 +04001684#elif defined(TARGET_XTENSA)
1685
1686/* Use num_core_regs to see only non-privileged registers in an unmodified gdb.
1687 * Use num_regs to see all registers. gdb modification is required for that:
1688 * reset bit 0 in the 'flags' field of the registers definitions in the
1689 * gdb/xtensa-config.c inside gdb source tree or inside gdb overlay.
1690 */
1691#define NUM_CORE_REGS (env->config->gdb_regmap.num_regs)
1692#define num_g_regs NUM_CORE_REGS
1693
Andreas Färberf3840912012-02-20 06:44:56 +01001694static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001695{
1696 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1697
1698 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1699 return 0;
1700 }
1701
1702 switch (reg->type) {
1703 case 9: /*pc*/
1704 GET_REG32(env->pc);
1705 break;
1706
1707 case 1: /*ar*/
1708 xtensa_sync_phys_from_window(env);
1709 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
1710 break;
1711
1712 case 2: /*SR*/
1713 GET_REG32(env->sregs[reg->targno & 0xff]);
1714 break;
1715
1716 case 3: /*UR*/
1717 GET_REG32(env->uregs[reg->targno & 0xff]);
1718 break;
1719
Max Filippovdd519cb2012-09-19 04:23:54 +04001720 case 4: /*f*/
1721 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
1722 break;
1723
Max Filippovccfcaba2011-09-06 03:55:52 +04001724 case 8: /*a*/
1725 GET_REG32(env->regs[reg->targno & 0x0f]);
1726 break;
1727
1728 default:
1729 qemu_log("%s from reg %d of unsupported type %d\n",
1730 __func__, n, reg->type);
1731 return 0;
1732 }
1733}
1734
Andreas Färberf3840912012-02-20 06:44:56 +01001735static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001736{
1737 uint32_t tmp;
1738 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1739
1740 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1741 return 0;
1742 }
1743
1744 tmp = ldl_p(mem_buf);
1745
1746 switch (reg->type) {
1747 case 9: /*pc*/
1748 env->pc = tmp;
1749 break;
1750
1751 case 1: /*ar*/
1752 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1753 xtensa_sync_window_from_phys(env);
1754 break;
1755
1756 case 2: /*SR*/
1757 env->sregs[reg->targno & 0xff] = tmp;
1758 break;
1759
1760 case 3: /*UR*/
1761 env->uregs[reg->targno & 0xff] = tmp;
1762 break;
1763
Max Filippovdd519cb2012-09-19 04:23:54 +04001764 case 4: /*f*/
1765 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1766 break;
1767
Max Filippovccfcaba2011-09-06 03:55:52 +04001768 case 8: /*a*/
1769 env->regs[reg->targno & 0x0f] = tmp;
1770 break;
1771
1772 default:
1773 qemu_log("%s to reg %d of unsupported type %d\n",
1774 __func__, n, reg->type);
1775 return 0;
1776 }
1777
1778 return 4;
1779}
bellard1fddef42005-04-17 19:16:13 +00001780#else
pbrook56aebc82008-10-11 17:55:29 +00001781
1782#define NUM_CORE_REGS 0
1783
Andreas Färber9349b4f2012-03-14 01:38:32 +01001784static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001785{
1786 return 0;
1787}
1788
Andreas Färber9349b4f2012-03-14 01:38:32 +01001789static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001790{
pbrook56aebc82008-10-11 17:55:29 +00001791 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001792}
1793
1794#endif
bellardb4608c02003-06-27 17:34:32 +00001795
Max Filippovccfcaba2011-09-06 03:55:52 +04001796#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001797static int num_g_regs = NUM_CORE_REGS;
Max Filippovccfcaba2011-09-06 03:55:52 +04001798#endif
pbrook56aebc82008-10-11 17:55:29 +00001799
1800#ifdef GDB_CORE_XML
1801/* Encode data using the encoding for 'x' packets. */
1802static int memtox(char *buf, const char *mem, int len)
1803{
1804 char *p = buf;
1805 char c;
1806
1807 while (len--) {
1808 c = *(mem++);
1809 switch (c) {
1810 case '#': case '$': case '*': case '}':
1811 *(p++) = '}';
1812 *(p++) = c ^ 0x20;
1813 break;
1814 default:
1815 *(p++) = c;
1816 break;
1817 }
1818 }
1819 return p - buf;
1820}
1821
aurel323faf7782008-12-07 23:26:17 +00001822static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001823{
pbrook56aebc82008-10-11 17:55:29 +00001824 size_t len;
1825 int i;
1826 const char *name;
1827 static char target_xml[1024];
1828
1829 len = 0;
1830 while (p[len] && p[len] != ':')
1831 len++;
1832 *newp = p + len;
1833
1834 name = NULL;
1835 if (strncmp(p, "target.xml", len) == 0) {
1836 /* Generate the XML description for this CPU. */
1837 if (!target_xml[0]) {
1838 GDBRegisterState *r;
1839
blueswir15b3715b2008-10-25 11:18:12 +00001840 snprintf(target_xml, sizeof(target_xml),
1841 "<?xml version=\"1.0\"?>"
1842 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1843 "<target>"
1844 "<xi:include href=\"%s\"/>",
1845 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001846
aliguori880a7572008-11-18 20:30:24 +00001847 for (r = first_cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001848 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1849 pstrcat(target_xml, sizeof(target_xml), r->xml);
1850 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001851 }
blueswir12dc766d2009-04-13 16:06:19 +00001852 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001853 }
1854 return target_xml;
1855 }
1856 for (i = 0; ; i++) {
1857 name = xml_builtin[i][0];
1858 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1859 break;
1860 }
1861 return name ? xml_builtin[i][1] : NULL;
1862}
1863#endif
1864
Andreas Färber9349b4f2012-03-14 01:38:32 +01001865static int gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001866{
1867 GDBRegisterState *r;
1868
1869 if (reg < NUM_CORE_REGS)
1870 return cpu_gdb_read_register(env, mem_buf, reg);
1871
1872 for (r = env->gdb_regs; r; r = r->next) {
1873 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1874 return r->get_reg(env, mem_buf, reg - r->base_reg);
1875 }
1876 }
1877 return 0;
1878}
1879
Andreas Färber9349b4f2012-03-14 01:38:32 +01001880static int gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001881{
1882 GDBRegisterState *r;
1883
1884 if (reg < NUM_CORE_REGS)
1885 return cpu_gdb_write_register(env, mem_buf, reg);
1886
1887 for (r = env->gdb_regs; r; r = r->next) {
1888 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1889 return r->set_reg(env, mem_buf, reg - r->base_reg);
1890 }
1891 }
1892 return 0;
1893}
1894
Max Filippovccfcaba2011-09-06 03:55:52 +04001895#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001896/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1897 specifies the first register number and these registers are included in
1898 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1899 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1900 */
1901
Andreas Färber9349b4f2012-03-14 01:38:32 +01001902void gdb_register_coprocessor(CPUArchState * env,
pbrook56aebc82008-10-11 17:55:29 +00001903 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1904 int num_regs, const char *xml, int g_pos)
1905{
1906 GDBRegisterState *s;
1907 GDBRegisterState **p;
1908 static int last_reg = NUM_CORE_REGS;
1909
pbrook56aebc82008-10-11 17:55:29 +00001910 p = &env->gdb_regs;
1911 while (*p) {
1912 /* Check for duplicates. */
1913 if (strcmp((*p)->xml, xml) == 0)
1914 return;
1915 p = &(*p)->next;
1916 }
Stefan Weil9643c252011-10-18 22:25:38 +02001917
1918 s = g_new0(GDBRegisterState, 1);
1919 s->base_reg = last_reg;
1920 s->num_regs = num_regs;
1921 s->get_reg = get_reg;
1922 s->set_reg = set_reg;
1923 s->xml = xml;
1924
pbrook56aebc82008-10-11 17:55:29 +00001925 /* Add to end of list. */
1926 last_reg += num_regs;
1927 *p = s;
1928 if (g_pos) {
1929 if (g_pos != s->base_reg) {
1930 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1931 "Expected %d got %d\n", xml, g_pos, s->base_reg);
1932 } else {
1933 num_g_regs = last_reg;
1934 }
1935 }
1936}
Max Filippovccfcaba2011-09-06 03:55:52 +04001937#endif
pbrook56aebc82008-10-11 17:55:29 +00001938
aliguoria1d1bb32008-11-18 20:07:32 +00001939#ifndef CONFIG_USER_ONLY
1940static const int xlat_gdb_type[] = {
1941 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1942 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1943 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1944};
1945#endif
1946
aliguori880a7572008-11-18 20:30:24 +00001947static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001948{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001949 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001950 int err = 0;
1951
aliguorie22a25c2009-03-12 20:12:48 +00001952 if (kvm_enabled())
1953 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1954
aliguoria1d1bb32008-11-18 20:07:32 +00001955 switch (type) {
1956 case GDB_BREAKPOINT_SW:
1957 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001958 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1959 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1960 if (err)
1961 break;
1962 }
1963 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001964#ifndef CONFIG_USER_ONLY
1965 case GDB_WATCHPOINT_WRITE:
1966 case GDB_WATCHPOINT_READ:
1967 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001968 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1969 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1970 NULL);
1971 if (err)
1972 break;
1973 }
1974 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001975#endif
1976 default:
1977 return -ENOSYS;
1978 }
1979}
1980
aliguori880a7572008-11-18 20:30:24 +00001981static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001982{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001983 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001984 int err = 0;
1985
aliguorie22a25c2009-03-12 20:12:48 +00001986 if (kvm_enabled())
1987 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1988
aliguoria1d1bb32008-11-18 20:07:32 +00001989 switch (type) {
1990 case GDB_BREAKPOINT_SW:
1991 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001992 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1993 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1994 if (err)
1995 break;
1996 }
1997 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001998#ifndef CONFIG_USER_ONLY
1999 case GDB_WATCHPOINT_WRITE:
2000 case GDB_WATCHPOINT_READ:
2001 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00002002 for (env = first_cpu; env != NULL; env = env->next_cpu) {
2003 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
2004 if (err)
2005 break;
2006 }
2007 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002008#endif
2009 default:
2010 return -ENOSYS;
2011 }
2012}
2013
aliguori880a7572008-11-18 20:30:24 +00002014static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00002015{
Andreas Färber9349b4f2012-03-14 01:38:32 +01002016 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002017
aliguorie22a25c2009-03-12 20:12:48 +00002018 if (kvm_enabled()) {
2019 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
2020 return;
2021 }
2022
aliguori880a7572008-11-18 20:30:24 +00002023 for (env = first_cpu; env != NULL; env = env->next_cpu) {
2024 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002025#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00002026 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002027#endif
aliguori880a7572008-11-18 20:30:24 +00002028 }
aliguoria1d1bb32008-11-18 20:07:32 +00002029}
2030
aurel32fab9d282009-04-08 21:29:37 +00002031static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
2032{
Avi Kivity4c0960c2009-08-17 23:19:53 +03002033 cpu_synchronize_state(s->c_cpu);
Peter Maydella896d032012-03-12 06:24:45 +00002034#if defined(TARGET_I386)
aurel32fab9d282009-04-08 21:29:37 +00002035 s->c_cpu->eip = pc;
aurel32fab9d282009-04-08 21:29:37 +00002036#elif defined (TARGET_PPC)
2037 s->c_cpu->nip = pc;
2038#elif defined (TARGET_SPARC)
2039 s->c_cpu->pc = pc;
2040 s->c_cpu->npc = pc + 4;
2041#elif defined (TARGET_ARM)
2042 s->c_cpu->regs[15] = pc;
2043#elif defined (TARGET_SH4)
2044 s->c_cpu->pc = pc;
2045#elif defined (TARGET_MIPS)
Nathan Froydff1d1972009-12-08 08:06:30 -08002046 s->c_cpu->active_tc.PC = pc & ~(target_ulong)1;
2047 if (pc & 1) {
2048 s->c_cpu->hflags |= MIPS_HFLAG_M16;
2049 } else {
2050 s->c_cpu->hflags &= ~(MIPS_HFLAG_M16);
2051 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02002052#elif defined (TARGET_MICROBLAZE)
2053 s->c_cpu->sregs[SR_PC] = pc;
Jia Liufc043552012-07-20 15:50:50 +08002054#elif defined(TARGET_OPENRISC)
2055 s->c_cpu->pc = pc;
aurel32fab9d282009-04-08 21:29:37 +00002056#elif defined (TARGET_CRIS)
2057 s->c_cpu->pc = pc;
2058#elif defined (TARGET_ALPHA)
2059 s->c_cpu->pc = pc;
Alexander Grafafcb0e42009-12-05 12:44:29 +01002060#elif defined (TARGET_S390X)
Alexander Grafafcb0e42009-12-05 12:44:29 +01002061 s->c_cpu->psw.addr = pc;
Michael Walle0c45d3d2011-02-17 23:45:06 +01002062#elif defined (TARGET_LM32)
2063 s->c_cpu->pc = pc;
Max Filippovccfcaba2011-09-06 03:55:52 +04002064#elif defined(TARGET_XTENSA)
2065 s->c_cpu->pc = pc;
aurel32fab9d282009-04-08 21:29:37 +00002066#endif
2067}
2068
Andreas Färber9349b4f2012-03-14 01:38:32 +01002069static CPUArchState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002070{
Andreas Färber9349b4f2012-03-14 01:38:32 +01002071 CPUArchState *env;
Andreas Färber0d342822012-12-17 07:12:13 +01002072 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002073
2074 for (env = first_cpu; env != NULL; env = env->next_cpu) {
Andreas Färber0d342822012-12-17 07:12:13 +01002075 cpu = ENV_GET_CPU(env);
2076 if (cpu_index(cpu) == thread_id) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002077 return env;
2078 }
2079 }
2080
2081 return NULL;
2082}
2083
aliguori880a7572008-11-18 20:30:24 +00002084static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00002085{
Andreas Färber9349b4f2012-03-14 01:38:32 +01002086 CPUArchState *env;
bellardb4608c02003-06-27 17:34:32 +00002087 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002088 uint32_t thread;
2089 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00002090 char buf[MAX_PACKET_LENGTH];
2091 uint8_t mem_buf[MAX_PACKET_LENGTH];
2092 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00002093 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00002094
bellard858693c2004-03-31 18:52:07 +00002095#ifdef DEBUG_GDB
2096 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00002097#endif
bellard858693c2004-03-31 18:52:07 +00002098 p = line_buf;
2099 ch = *p++;
2100 switch(ch) {
2101 case '?':
bellard1fddef42005-04-17 19:16:13 +00002102 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00002103 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber0d342822012-12-17 07:12:13 +01002104 cpu_index(ENV_GET_CPU(s->c_cpu)));
bellard858693c2004-03-31 18:52:07 +00002105 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00002106 /* Remove all the breakpoints when this query is issued,
2107 * because gdb is doing and initial connect and the state
2108 * should be cleaned up.
2109 */
aliguori880a7572008-11-18 20:30:24 +00002110 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00002111 break;
2112 case 'c':
2113 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00002114 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002115 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002116 }
aurel32ca587a82008-12-18 22:44:13 +00002117 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00002118 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002119 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00002120 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00002121 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2122 if (s->signal == -1)
2123 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00002124 gdb_continue(s);
2125 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002126 case 'v':
2127 if (strncmp(p, "Cont", 4) == 0) {
2128 int res_signal, res_thread;
2129
2130 p += 4;
2131 if (*p == '?') {
2132 put_packet(s, "vCont;c;C;s;S");
2133 break;
2134 }
2135 res = 0;
2136 res_signal = 0;
2137 res_thread = 0;
2138 while (*p) {
2139 int action, signal;
2140
2141 if (*p++ != ';') {
2142 res = 0;
2143 break;
2144 }
2145 action = *p++;
2146 signal = 0;
2147 if (action == 'C' || action == 'S') {
2148 signal = strtoul(p, (char **)&p, 16);
2149 } else if (action != 'c' && action != 's') {
2150 res = 0;
2151 break;
2152 }
2153 thread = 0;
2154 if (*p == ':') {
2155 thread = strtoull(p+1, (char **)&p, 16);
2156 }
2157 action = tolower(action);
2158 if (res == 0 || (res == 'c' && action == 's')) {
2159 res = action;
2160 res_signal = signal;
2161 res_thread = thread;
2162 }
2163 }
2164 if (res) {
2165 if (res_thread != -1 && res_thread != 0) {
2166 env = find_cpu(res_thread);
2167 if (env == NULL) {
2168 put_packet(s, "E22");
2169 break;
2170 }
2171 s->c_cpu = env;
2172 }
2173 if (res == 's') {
2174 cpu_single_step(s->c_cpu, sstep_flags);
2175 }
2176 s->signal = res_signal;
2177 gdb_continue(s);
2178 return RS_IDLE;
2179 }
2180 break;
2181 } else {
2182 goto unknown_command;
2183 }
edgar_igl7d03f822008-05-17 18:58:29 +00002184 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002185#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002186 /* Kill the target */
2187 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2188 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002189#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002190 case 'D':
2191 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002192 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002193 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002194 gdb_continue(s);
2195 put_packet(s, "OK");
2196 break;
bellard858693c2004-03-31 18:52:07 +00002197 case 's':
2198 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002199 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002200 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002201 }
aliguori880a7572008-11-18 20:30:24 +00002202 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002203 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002204 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002205 case 'F':
2206 {
2207 target_ulong ret;
2208 target_ulong err;
2209
2210 ret = strtoull(p, (char **)&p, 16);
2211 if (*p == ',') {
2212 p++;
2213 err = strtoull(p, (char **)&p, 16);
2214 } else {
2215 err = 0;
2216 }
2217 if (*p == ',')
2218 p++;
2219 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002220 if (s->current_syscall_cb) {
2221 s->current_syscall_cb(s->c_cpu, ret, err);
2222 s->current_syscall_cb = NULL;
2223 }
pbrooka2d1eba2007-01-28 03:10:55 +00002224 if (type == 'C') {
2225 put_packet(s, "T02");
2226 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002227 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002228 }
2229 }
2230 break;
bellard858693c2004-03-31 18:52:07 +00002231 case 'g':
Avi Kivity4c0960c2009-08-17 23:19:53 +03002232 cpu_synchronize_state(s->g_cpu);
Max Filippovccfcaba2011-09-06 03:55:52 +04002233 env = s->g_cpu;
pbrook56aebc82008-10-11 17:55:29 +00002234 len = 0;
2235 for (addr = 0; addr < num_g_regs; addr++) {
aliguori880a7572008-11-18 20:30:24 +00002236 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002237 len += reg_size;
2238 }
2239 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002240 put_packet(s, buf);
2241 break;
2242 case 'G':
Avi Kivity4c0960c2009-08-17 23:19:53 +03002243 cpu_synchronize_state(s->g_cpu);
Max Filippovccfcaba2011-09-06 03:55:52 +04002244 env = s->g_cpu;
pbrook56aebc82008-10-11 17:55:29 +00002245 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002246 len = strlen(p) / 2;
2247 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00002248 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
aliguori880a7572008-11-18 20:30:24 +00002249 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002250 len -= reg_size;
2251 registers += reg_size;
2252 }
bellard858693c2004-03-31 18:52:07 +00002253 put_packet(s, "OK");
2254 break;
2255 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002256 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002257 if (*p == ',')
2258 p++;
bellard9d9754a2006-06-25 15:32:37 +00002259 len = strtoull(p, NULL, 16);
Fabien Chouteau44520db2011-09-08 12:48:16 +02002260 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002261 put_packet (s, "E14");
2262 } else {
2263 memtohex(buf, mem_buf, len);
2264 put_packet(s, buf);
2265 }
bellard858693c2004-03-31 18:52:07 +00002266 break;
2267 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002268 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002269 if (*p == ',')
2270 p++;
bellard9d9754a2006-06-25 15:32:37 +00002271 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002272 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002273 p++;
2274 hextomem(mem_buf, p, len);
Fabien Chouteau44520db2011-09-08 12:48:16 +02002275 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002276 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002277 } else {
bellard858693c2004-03-31 18:52:07 +00002278 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002279 }
bellard858693c2004-03-31 18:52:07 +00002280 break;
pbrook56aebc82008-10-11 17:55:29 +00002281 case 'p':
2282 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2283 This works, but can be very slow. Anything new enough to
2284 understand XML also knows how to use this properly. */
2285 if (!gdb_has_xml)
2286 goto unknown_command;
2287 addr = strtoull(p, (char **)&p, 16);
aliguori880a7572008-11-18 20:30:24 +00002288 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002289 if (reg_size) {
2290 memtohex(buf, mem_buf, reg_size);
2291 put_packet(s, buf);
2292 } else {
2293 put_packet(s, "E14");
2294 }
2295 break;
2296 case 'P':
2297 if (!gdb_has_xml)
2298 goto unknown_command;
2299 addr = strtoull(p, (char **)&p, 16);
2300 if (*p == '=')
2301 p++;
2302 reg_size = strlen(p) / 2;
2303 hextomem(mem_buf, p, reg_size);
aliguori880a7572008-11-18 20:30:24 +00002304 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002305 put_packet(s, "OK");
2306 break;
bellard858693c2004-03-31 18:52:07 +00002307 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002308 case 'z':
2309 type = strtoul(p, (char **)&p, 16);
2310 if (*p == ',')
2311 p++;
bellard9d9754a2006-06-25 15:32:37 +00002312 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002313 if (*p == ',')
2314 p++;
bellard9d9754a2006-06-25 15:32:37 +00002315 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002316 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002317 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002318 else
aliguori880a7572008-11-18 20:30:24 +00002319 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002320 if (res >= 0)
2321 put_packet(s, "OK");
2322 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002323 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002324 else
2325 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002326 break;
aliguori880a7572008-11-18 20:30:24 +00002327 case 'H':
2328 type = *p++;
2329 thread = strtoull(p, (char **)&p, 16);
2330 if (thread == -1 || thread == 0) {
2331 put_packet(s, "OK");
2332 break;
2333 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002334 env = find_cpu(thread);
aliguori880a7572008-11-18 20:30:24 +00002335 if (env == NULL) {
2336 put_packet(s, "E22");
2337 break;
2338 }
2339 switch (type) {
2340 case 'c':
2341 s->c_cpu = env;
2342 put_packet(s, "OK");
2343 break;
2344 case 'g':
2345 s->g_cpu = env;
2346 put_packet(s, "OK");
2347 break;
2348 default:
2349 put_packet(s, "E22");
2350 break;
2351 }
2352 break;
2353 case 'T':
2354 thread = strtoull(p, (char **)&p, 16);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002355 env = find_cpu(thread);
2356
2357 if (env != NULL) {
2358 put_packet(s, "OK");
2359 } else {
aliguori880a7572008-11-18 20:30:24 +00002360 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002361 }
aliguori880a7572008-11-18 20:30:24 +00002362 break;
pbrook978efd62006-06-17 18:30:42 +00002363 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002364 case 'Q':
2365 /* parse any 'q' packets here */
2366 if (!strcmp(p,"qemu.sstepbits")) {
2367 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002368 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2369 SSTEP_ENABLE,
2370 SSTEP_NOIRQ,
2371 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002372 put_packet(s, buf);
2373 break;
2374 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2375 /* Display or change the sstep_flags */
2376 p += 10;
2377 if (*p != '=') {
2378 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002379 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002380 put_packet(s, buf);
2381 break;
2382 }
2383 p++;
2384 type = strtoul(p, (char **)&p, 16);
2385 sstep_flags = type;
2386 put_packet(s, "OK");
2387 break;
aliguori880a7572008-11-18 20:30:24 +00002388 } else if (strcmp(p,"C") == 0) {
2389 /* "Current thread" remains vague in the spec, so always return
2390 * the first CPU (gdb returns the first thread). */
2391 put_packet(s, "QC1");
2392 break;
2393 } else if (strcmp(p,"fThreadInfo") == 0) {
2394 s->query_cpu = first_cpu;
2395 goto report_cpuinfo;
2396 } else if (strcmp(p,"sThreadInfo") == 0) {
2397 report_cpuinfo:
2398 if (s->query_cpu) {
Andreas Färber0d342822012-12-17 07:12:13 +01002399 snprintf(buf, sizeof(buf), "m%x",
2400 cpu_index(ENV_GET_CPU(s->query_cpu)));
aliguori880a7572008-11-18 20:30:24 +00002401 put_packet(s, buf);
2402 s->query_cpu = s->query_cpu->next_cpu;
2403 } else
2404 put_packet(s, "l");
2405 break;
2406 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2407 thread = strtoull(p+16, (char **)&p, 16);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002408 env = find_cpu(thread);
2409 if (env != NULL) {
Andreas Färber55e5c282012-12-17 06:18:02 +01002410 CPUState *cpu = ENV_GET_CPU(env);
Avi Kivity4c0960c2009-08-17 23:19:53 +03002411 cpu_synchronize_state(env);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002412 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01002413 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01002414 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002415 memtohex(buf, mem_buf, len);
2416 put_packet(s, buf);
2417 }
aliguori880a7572008-11-18 20:30:24 +00002418 break;
edgar_igl60897d32008-05-09 08:25:14 +00002419 }
blueswir10b8a9882009-03-07 10:51:36 +00002420#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002421 else if (strncmp(p, "Offsets", 7) == 0) {
aliguori880a7572008-11-18 20:30:24 +00002422 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00002423
blueswir1363a37d2008-08-21 17:58:08 +00002424 snprintf(buf, sizeof(buf),
2425 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2426 ";Bss=" TARGET_ABI_FMT_lx,
2427 ts->info->code_offset,
2428 ts->info->data_offset,
2429 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002430 put_packet(s, buf);
2431 break;
2432 }
blueswir10b8a9882009-03-07 10:51:36 +00002433#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002434 else if (strncmp(p, "Rcmd,", 5) == 0) {
2435 int len = strlen(p + 5);
2436
2437 if ((len % 2) != 0) {
2438 put_packet(s, "E01");
2439 break;
2440 }
2441 hextomem(mem_buf, p + 5, len);
2442 len = len / 2;
2443 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002444 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002445 put_packet(s, "OK");
2446 break;
2447 }
blueswir10b8a9882009-03-07 10:51:36 +00002448#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002449 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002450 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002451#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002452 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002453#endif
2454 put_packet(s, buf);
2455 break;
2456 }
2457#ifdef GDB_CORE_XML
2458 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2459 const char *xml;
2460 target_ulong total_len;
2461
2462 gdb_has_xml = 1;
2463 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002464 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002465 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002466 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002467 put_packet(s, buf);
2468 break;
2469 }
2470
2471 if (*p == ':')
2472 p++;
2473 addr = strtoul(p, (char **)&p, 16);
2474 if (*p == ',')
2475 p++;
2476 len = strtoul(p, (char **)&p, 16);
2477
2478 total_len = strlen(xml);
2479 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002480 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002481 put_packet(s, buf);
2482 break;
2483 }
2484 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2485 len = (MAX_PACKET_LENGTH - 5) / 2;
2486 if (len < total_len - addr) {
2487 buf[0] = 'm';
2488 len = memtox(buf + 1, xml + addr, len);
2489 } else {
2490 buf[0] = 'l';
2491 len = memtox(buf + 1, xml + addr, total_len - addr);
2492 }
2493 put_packet_binary(s, buf, len + 1);
2494 break;
2495 }
2496#endif
2497 /* Unrecognised 'q' command. */
2498 goto unknown_command;
2499
bellard858693c2004-03-31 18:52:07 +00002500 default:
pbrook56aebc82008-10-11 17:55:29 +00002501 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002502 /* put empty packet */
2503 buf[0] = '\0';
2504 put_packet(s, buf);
2505 break;
2506 }
2507 return RS_IDLE;
2508}
2509
Andreas Färber9349b4f2012-03-14 01:38:32 +01002510void gdb_set_stop_cpu(CPUArchState *env)
aliguori880a7572008-11-18 20:30:24 +00002511{
2512 gdbserver_state->c_cpu = env;
2513 gdbserver_state->g_cpu = env;
2514}
2515
bellard1fddef42005-04-17 19:16:13 +00002516#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002517static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002518{
aliguori880a7572008-11-18 20:30:24 +00002519 GDBState *s = gdbserver_state;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002520 CPUArchState *env = s->c_cpu;
Andreas Färber0d342822012-12-17 07:12:13 +01002521 CPUState *cpu = ENV_GET_CPU(env);
bellard858693c2004-03-31 18:52:07 +00002522 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002523 const char *type;
bellard858693c2004-03-31 18:52:07 +00002524 int ret;
2525
Meador Ingecdb432b2012-03-15 17:49:45 +00002526 if (running || s->state == RS_INACTIVE) {
2527 return;
2528 }
2529 /* Is there a GDB syscall waiting to be sent? */
2530 if (s->current_syscall_cb) {
2531 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002532 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002533 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002534 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002535 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002536 if (env->watchpoint_hit) {
2537 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002538 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002539 type = "r";
2540 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002541 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002542 type = "a";
2543 break;
2544 default:
2545 type = "";
2546 break;
2547 }
aliguori880a7572008-11-18 20:30:24 +00002548 snprintf(buf, sizeof(buf),
2549 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002550 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002551 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002552 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002553 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002554 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002555 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002556 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002557 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002558 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002559 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002560 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002561 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002562 ret = GDB_SIGNAL_QUIT;
2563 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002564 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002565 ret = GDB_SIGNAL_IO;
2566 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002567 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002568 ret = GDB_SIGNAL_ALRM;
2569 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002570 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002571 ret = GDB_SIGNAL_ABRT;
2572 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002573 case RUN_STATE_SAVE_VM:
2574 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002575 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002576 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002577 ret = GDB_SIGNAL_XCPU;
2578 break;
2579 default:
2580 ret = GDB_SIGNAL_UNKNOWN;
2581 break;
bellardbbeb7b52006-04-23 18:42:15 +00002582 }
Andreas Färber0d342822012-12-17 07:12:13 +01002583 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002584
2585send_packet:
bellard858693c2004-03-31 18:52:07 +00002586 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002587
2588 /* disable single step if it was enabled */
2589 cpu_single_step(env, 0);
bellard858693c2004-03-31 18:52:07 +00002590}
bellard1fddef42005-04-17 19:16:13 +00002591#endif
bellard858693c2004-03-31 18:52:07 +00002592
pbrooka2d1eba2007-01-28 03:10:55 +00002593/* Send a gdb syscall request.
2594 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002595 %x - target_ulong argument printed in hex.
2596 %lx - 64-bit argument printed in hex.
2597 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002598void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002599{
2600 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002601 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002602 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002603 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002604 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002605 GDBState *s;
2606
aliguori880a7572008-11-18 20:30:24 +00002607 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002608 if (!s)
2609 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002610 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002611#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002612 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002613#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002614 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002615 p = s->syscall_buf;
2616 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002617 *(p++) = 'F';
2618 while (*fmt) {
2619 if (*fmt == '%') {
2620 fmt++;
2621 switch (*fmt++) {
2622 case 'x':
2623 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002624 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002625 break;
pbrooka87295e2007-05-26 15:09:38 +00002626 case 'l':
2627 if (*(fmt++) != 'x')
2628 goto bad_format;
2629 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002630 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002631 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002632 case 's':
2633 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002634 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002635 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002636 break;
2637 default:
pbrooka87295e2007-05-26 15:09:38 +00002638 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002639 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2640 fmt - 1);
2641 break;
2642 }
2643 } else {
2644 *(p++) = *(fmt++);
2645 }
2646 }
pbrook8a93e022007-08-06 13:19:15 +00002647 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002648 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002649#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002650 put_packet(s, s->syscall_buf);
aliguori880a7572008-11-18 20:30:24 +00002651 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002652#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002653 /* In this case wait to send the syscall packet until notification that
2654 the CPU has stopped. This must be done because if the packet is sent
2655 now the reply from the syscall request could be received while the CPU
2656 is still in the running state, which can cause packets to be dropped
2657 and state transition 'T' packets to be sent while the syscall is still
2658 being processed. */
aurel323098dba2009-03-07 21:28:24 +00002659 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002660#endif
2661}
2662
bellard6a00d602005-11-21 23:25:50 +00002663static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002664{
2665 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002666 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002667
bellard1fddef42005-04-17 19:16:13 +00002668#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002669 if (s->last_packet_len) {
2670 /* Waiting for a response to the last packet. If we see the start
2671 of a new command then abandon the previous response. */
2672 if (ch == '-') {
2673#ifdef DEBUG_GDB
2674 printf("Got NACK, retransmitting\n");
2675#endif
thsffe8ab82007-12-16 03:16:05 +00002676 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002677 }
2678#ifdef DEBUG_GDB
2679 else if (ch == '+')
2680 printf("Got ACK\n");
2681 else
2682 printf("Got '%c' when expecting ACK/NACK\n", ch);
2683#endif
2684 if (ch == '+' || ch == '$')
2685 s->last_packet_len = 0;
2686 if (ch != '$')
2687 return;
2688 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002689 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002690 /* when the CPU is running, we cannot do anything except stop
2691 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002692 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002693 } else
bellard1fddef42005-04-17 19:16:13 +00002694#endif
bellard41625032005-04-24 10:07:11 +00002695 {
bellard858693c2004-03-31 18:52:07 +00002696 switch(s->state) {
2697 case RS_IDLE:
2698 if (ch == '$') {
2699 s->line_buf_index = 0;
2700 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002701 }
2702 break;
bellard858693c2004-03-31 18:52:07 +00002703 case RS_GETLINE:
2704 if (ch == '#') {
2705 s->state = RS_CHKSUM1;
2706 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2707 s->state = RS_IDLE;
2708 } else {
2709 s->line_buf[s->line_buf_index++] = ch;
2710 }
2711 break;
2712 case RS_CHKSUM1:
2713 s->line_buf[s->line_buf_index] = '\0';
2714 s->line_csum = fromhex(ch) << 4;
2715 s->state = RS_CHKSUM2;
2716 break;
2717 case RS_CHKSUM2:
2718 s->line_csum |= fromhex(ch);
2719 csum = 0;
2720 for(i = 0; i < s->line_buf_index; i++) {
2721 csum += s->line_buf[i];
2722 }
2723 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002724 reply = '-';
2725 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002726 s->state = RS_IDLE;
2727 } else {
ths60fe76f2007-12-16 03:02:09 +00002728 reply = '+';
2729 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002730 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002731 }
bellardb4608c02003-06-27 17:34:32 +00002732 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002733 default:
2734 abort();
bellardb4608c02003-06-27 17:34:32 +00002735 }
2736 }
bellard858693c2004-03-31 18:52:07 +00002737}
2738
Paul Brook0e1c9c52010-06-16 13:03:51 +01002739/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002740void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002741{
2742 GDBState *s;
2743 char buf[4];
2744
2745 s = gdbserver_state;
2746 if (!s) {
2747 return;
2748 }
2749#ifdef CONFIG_USER_ONLY
2750 if (gdbserver_fd < 0 || s->fd < 0) {
2751 return;
2752 }
2753#endif
2754
2755 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2756 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002757
2758#ifndef CONFIG_USER_ONLY
2759 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002760 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002761 }
2762#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002763}
2764
bellard1fddef42005-04-17 19:16:13 +00002765#ifdef CONFIG_USER_ONLY
2766int
aurel32ca587a82008-12-18 22:44:13 +00002767gdb_queuesig (void)
2768{
2769 GDBState *s;
2770
2771 s = gdbserver_state;
2772
2773 if (gdbserver_fd < 0 || s->fd < 0)
2774 return 0;
2775 else
2776 return 1;
2777}
2778
2779int
Andreas Färber9349b4f2012-03-14 01:38:32 +01002780gdb_handlesig (CPUArchState *env, int sig)
bellard1fddef42005-04-17 19:16:13 +00002781{
2782 GDBState *s;
2783 char buf[256];
2784 int n;
2785
aliguori880a7572008-11-18 20:30:24 +00002786 s = gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00002787 if (gdbserver_fd < 0 || s->fd < 0)
2788 return sig;
bellard1fddef42005-04-17 19:16:13 +00002789
2790 /* disable single step if it was enabled */
2791 cpu_single_step(env, 0);
2792 tb_flush(env);
2793
2794 if (sig != 0)
2795 {
aurel32ca587a82008-12-18 22:44:13 +00002796 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb (sig));
bellard1fddef42005-04-17 19:16:13 +00002797 put_packet(s, buf);
2798 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002799 /* put_packet() might have detected that the peer terminated the
2800 connection. */
2801 if (s->fd < 0)
2802 return sig;
bellard1fddef42005-04-17 19:16:13 +00002803
bellard1fddef42005-04-17 19:16:13 +00002804 sig = 0;
2805 s->state = RS_IDLE;
bellard41625032005-04-24 10:07:11 +00002806 s->running_state = 0;
2807 while (s->running_state == 0) {
bellard1fddef42005-04-17 19:16:13 +00002808 n = read (s->fd, buf, 256);
2809 if (n > 0)
2810 {
2811 int i;
2812
2813 for (i = 0; i < n; i++)
bellard6a00d602005-11-21 23:25:50 +00002814 gdb_read_byte (s, buf[i]);
bellard1fddef42005-04-17 19:16:13 +00002815 }
2816 else if (n == 0 || errno != EAGAIN)
2817 {
Stefan Weile7d81002011-12-10 00:19:46 +01002818 /* XXX: Connection closed. Should probably wait for another
bellard1fddef42005-04-17 19:16:13 +00002819 connection before continuing. */
2820 return sig;
2821 }
bellard41625032005-04-24 10:07:11 +00002822 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002823 sig = s->signal;
2824 s->signal = 0;
bellard1fddef42005-04-17 19:16:13 +00002825 return sig;
2826}
bellarde9009672005-04-26 20:42:36 +00002827
aurel32ca587a82008-12-18 22:44:13 +00002828/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002829void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002830{
2831 GDBState *s;
2832 char buf[4];
2833
2834 s = gdbserver_state;
2835 if (gdbserver_fd < 0 || s->fd < 0)
2836 return;
2837
2838 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb (sig));
2839 put_packet(s, buf);
2840}
bellard1fddef42005-04-17 19:16:13 +00002841
aliguori880a7572008-11-18 20:30:24 +00002842static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002843{
2844 GDBState *s;
2845 struct sockaddr_in sockaddr;
2846 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002847 int fd;
bellard858693c2004-03-31 18:52:07 +00002848
2849 for(;;) {
2850 len = sizeof(sockaddr);
2851 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2852 if (fd < 0 && errno != EINTR) {
2853 perror("accept");
2854 return;
2855 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002856#ifndef _WIN32
2857 fcntl(fd, F_SETFD, FD_CLOEXEC);
2858#endif
bellard858693c2004-03-31 18:52:07 +00002859 break;
2860 }
2861 }
2862
2863 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002864 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002865
Anthony Liguori7267c092011-08-20 22:09:37 -05002866 s = g_malloc0(sizeof(GDBState));
aliguori880a7572008-11-18 20:30:24 +00002867 s->c_cpu = first_cpu;
2868 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002869 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002870 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002871
aliguori880a7572008-11-18 20:30:24 +00002872 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002873
bellard858693c2004-03-31 18:52:07 +00002874 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002875}
2876
2877static int gdbserver_open(int port)
2878{
2879 struct sockaddr_in sockaddr;
2880 int fd, val, ret;
2881
2882 fd = socket(PF_INET, SOCK_STREAM, 0);
2883 if (fd < 0) {
2884 perror("socket");
2885 return -1;
2886 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002887#ifndef _WIN32
2888 fcntl(fd, F_SETFD, FD_CLOEXEC);
2889#endif
bellard858693c2004-03-31 18:52:07 +00002890
2891 /* allow fast reuse */
2892 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002893 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002894
2895 sockaddr.sin_family = AF_INET;
2896 sockaddr.sin_port = htons(port);
2897 sockaddr.sin_addr.s_addr = 0;
2898 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2899 if (ret < 0) {
2900 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002901 close(fd);
bellard858693c2004-03-31 18:52:07 +00002902 return -1;
2903 }
2904 ret = listen(fd, 0);
2905 if (ret < 0) {
2906 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002907 close(fd);
bellard858693c2004-03-31 18:52:07 +00002908 return -1;
2909 }
bellard858693c2004-03-31 18:52:07 +00002910 return fd;
2911}
2912
2913int gdbserver_start(int port)
2914{
2915 gdbserver_fd = gdbserver_open(port);
2916 if (gdbserver_fd < 0)
2917 return -1;
2918 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002919 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002920 return 0;
2921}
aurel322b1319c2008-12-18 22:44:04 +00002922
2923/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002924void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002925{
2926 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002927 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002928 return;
2929 close(s->fd);
2930 s->fd = -1;
2931 cpu_breakpoint_remove_all(env, BP_GDB);
2932 cpu_watchpoint_remove_all(env, BP_GDB);
2933}
pbrook4046d912007-01-28 01:53:16 +00002934#else
thsaa1f17c2007-07-11 22:48:58 +00002935static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002936{
pbrook56aebc82008-10-11 17:55:29 +00002937 /* We can handle an arbitrarily large amount of data.
2938 Pick the maximum packet size, which is as good as anything. */
2939 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002940}
2941
thsaa1f17c2007-07-11 22:48:58 +00002942static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002943{
pbrook4046d912007-01-28 01:53:16 +00002944 int i;
2945
2946 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002947 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002948 }
2949}
2950
2951static void gdb_chr_event(void *opaque, int event)
2952{
2953 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302954 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002955 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002956 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002957 break;
2958 default:
2959 break;
2960 }
2961}
2962
aliguori8a34a0f2009-03-05 23:01:55 +00002963static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2964{
2965 char buf[MAX_PACKET_LENGTH];
2966
2967 buf[0] = 'O';
2968 if (len > (MAX_PACKET_LENGTH/2) - 1)
2969 len = (MAX_PACKET_LENGTH/2) - 1;
2970 memtohex(buf + 1, (uint8_t *)msg, len);
2971 put_packet(s, buf);
2972}
2973
2974static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2975{
2976 const char *p = (const char *)buf;
2977 int max_sz;
2978
2979 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2980 for (;;) {
2981 if (len <= max_sz) {
2982 gdb_monitor_output(gdbserver_state, p, len);
2983 break;
2984 }
2985 gdb_monitor_output(gdbserver_state, p, max_sz);
2986 p += max_sz;
2987 len -= max_sz;
2988 }
2989 return len;
2990}
2991
aliguori59030a82009-04-05 18:43:41 +00002992#ifndef _WIN32
2993static void gdb_sigterm_handler(int signal)
2994{
Luiz Capitulino13548692011-07-29 15:36:43 -03002995 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002996 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002997 }
aliguori59030a82009-04-05 18:43:41 +00002998}
2999#endif
3000
3001int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00003002{
3003 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00003004 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00003005 CharDriverState *chr = NULL;
3006 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00003007
aliguori59030a82009-04-05 18:43:41 +00003008 if (!device)
3009 return -1;
3010 if (strcmp(device, "none") != 0) {
3011 if (strstart(device, "tcp:", NULL)) {
3012 /* enforce required TCP attributes */
3013 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
3014 "%s,nowait,nodelay,server", device);
3015 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00003016 }
aliguori59030a82009-04-05 18:43:41 +00003017#ifndef _WIN32
3018 else if (strcmp(device, "stdio") == 0) {
3019 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00003020
aliguori59030a82009-04-05 18:43:41 +00003021 memset(&act, 0, sizeof(act));
3022 act.sa_handler = gdb_sigterm_handler;
3023 sigaction(SIGINT, &act, NULL);
3024 }
3025#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05003026 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00003027 if (!chr)
3028 return -1;
3029
Hans de Goede456d6062013-03-27 20:29:40 +01003030 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00003031 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
3032 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00003033 }
3034
aliguori36556b22009-03-28 18:05:53 +00003035 s = gdbserver_state;
3036 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003037 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00003038 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00003039
aliguori36556b22009-03-28 18:05:53 +00003040 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3041
3042 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05003043 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00003044 mon_chr->chr_write = gdb_monitor_write;
3045 monitor_init(mon_chr, 0);
3046 } else {
3047 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05003048 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00003049 mon_chr = s->mon_chr;
3050 memset(s, 0, sizeof(GDBState));
3051 }
aliguori880a7572008-11-18 20:30:24 +00003052 s->c_cpu = first_cpu;
3053 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00003054 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00003055 s->state = chr ? RS_IDLE : RS_INACTIVE;
3056 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00003057 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00003058
pbrook4046d912007-01-28 01:53:16 +00003059 return 0;
3060}
3061#endif