blob: 22ab12c68cea3d6015a7d65da8fc7c2dc6f3b64c [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 Bonzini927d4872012-12-17 18:20:05 +010033#include "char/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
374 vm_start();
375#endif
376}
377
bellard858693c2004-03-31 18:52:07 +0000378static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000379{
pbrook4046d912007-01-28 01:53:16 +0000380#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000381 int ret;
382
383 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000384 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000385 if (ret < 0) {
386 if (errno != EINTR && errno != EAGAIN)
387 return;
388 } else {
389 buf += ret;
390 len -= ret;
391 }
392 }
pbrook4046d912007-01-28 01:53:16 +0000393#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500394 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000395#endif
bellardb4608c02003-06-27 17:34:32 +0000396}
397
398static inline int fromhex(int v)
399{
400 if (v >= '0' && v <= '9')
401 return v - '0';
402 else if (v >= 'A' && v <= 'F')
403 return v - 'A' + 10;
404 else if (v >= 'a' && v <= 'f')
405 return v - 'a' + 10;
406 else
407 return 0;
408}
409
410static inline int tohex(int v)
411{
412 if (v < 10)
413 return v + '0';
414 else
415 return v - 10 + 'a';
416}
417
418static void memtohex(char *buf, const uint8_t *mem, int len)
419{
420 int i, c;
421 char *q;
422 q = buf;
423 for(i = 0; i < len; i++) {
424 c = mem[i];
425 *q++ = tohex(c >> 4);
426 *q++ = tohex(c & 0xf);
427 }
428 *q = '\0';
429}
430
431static void hextomem(uint8_t *mem, const char *buf, int len)
432{
433 int i;
434
435 for(i = 0; i < len; i++) {
436 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
437 buf += 2;
438 }
439}
440
bellardb4608c02003-06-27 17:34:32 +0000441/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000442static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000443{
pbrook56aebc82008-10-11 17:55:29 +0000444 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000445 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000446
bellardb4608c02003-06-27 17:34:32 +0000447 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000448 p = s->last_packet;
449 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000450 memcpy(p, buf, len);
451 p += len;
bellardb4608c02003-06-27 17:34:32 +0000452 csum = 0;
453 for(i = 0; i < len; i++) {
454 csum += buf[i];
455 }
pbrook4046d912007-01-28 01:53:16 +0000456 *(p++) = '#';
457 *(p++) = tohex((csum >> 4) & 0xf);
458 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000459
pbrook4046d912007-01-28 01:53:16 +0000460 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000461 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000462
pbrook4046d912007-01-28 01:53:16 +0000463#ifdef CONFIG_USER_ONLY
464 i = get_char(s);
465 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000466 return -1;
pbrook4046d912007-01-28 01:53:16 +0000467 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000468 break;
pbrook4046d912007-01-28 01:53:16 +0000469#else
470 break;
471#endif
bellardb4608c02003-06-27 17:34:32 +0000472 }
473 return 0;
474}
475
pbrook56aebc82008-10-11 17:55:29 +0000476/* return -1 if error, 0 if OK */
477static int put_packet(GDBState *s, const char *buf)
478{
479#ifdef DEBUG_GDB
480 printf("reply='%s'\n", buf);
481#endif
482
483 return put_packet_binary(s, buf, strlen(buf));
484}
485
486/* The GDB remote protocol transfers values in target byte order. This means
487 we can use the raw memory access routines to access the value buffer.
488 Conveniently, these also handle the case where the buffer is mis-aligned.
489 */
490#define GET_REG8(val) do { \
491 stb_p(mem_buf, val); \
492 return 1; \
493 } while(0)
494#define GET_REG16(val) do { \
495 stw_p(mem_buf, val); \
496 return 2; \
497 } while(0)
498#define GET_REG32(val) do { \
499 stl_p(mem_buf, val); \
500 return 4; \
501 } while(0)
502#define GET_REG64(val) do { \
503 stq_p(mem_buf, val); \
504 return 8; \
505 } while(0)
506
507#if TARGET_LONG_BITS == 64
508#define GET_REGL(val) GET_REG64(val)
509#define ldtul_p(addr) ldq_p(addr)
510#else
511#define GET_REGL(val) GET_REG32(val)
512#define ldtul_p(addr) ldl_p(addr)
513#endif
514
edgar_iglfde3fd62008-05-09 08:50:01 +0000515#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000516
517#ifdef TARGET_X86_64
pbrook56aebc82008-10-11 17:55:29 +0000518static const int gpr_map[16] = {
bellard79808572008-05-09 14:40:22 +0000519 R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
pbrook56aebc82008-10-11 17:55:29 +0000520 8, 9, 10, 11, 12, 13, 14, 15
bellard79808572008-05-09 14:40:22 +0000521};
bellard79808572008-05-09 14:40:22 +0000522#else
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200523#define gpr_map gpr_map32
bellard79808572008-05-09 14:40:22 +0000524#endif
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200525static const int gpr_map32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
pbrook56aebc82008-10-11 17:55:29 +0000526
527#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
528
Jan Kiszkab1631e72009-06-27 09:53:51 +0200529#define IDX_IP_REG CPU_NB_REGS
530#define IDX_FLAGS_REG (IDX_IP_REG + 1)
531#define IDX_SEG_REGS (IDX_FLAGS_REG + 1)
532#define IDX_FP_REGS (IDX_SEG_REGS + 6)
533#define IDX_XMM_REGS (IDX_FP_REGS + 16)
534#define IDX_MXCSR_REG (IDX_XMM_REGS + CPU_NB_REGS)
535
Andreas Färberf3840912012-02-20 06:44:56 +0100536static int cpu_gdb_read_register(CPUX86State *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000537{
538 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200539 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
540 GET_REG64(env->regs[gpr_map[n]]);
541 } else if (n < CPU_NB_REGS32) {
542 GET_REG32(env->regs[gpr_map32[n]]);
543 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200544 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000545#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200546 /* FIXME: byteswap float values - after fixing fpregs layout. */
547 memcpy(mem_buf, &env->fpregs[n - IDX_FP_REGS], 10);
pbrook56aebc82008-10-11 17:55:29 +0000548#else
549 memset(mem_buf, 0, 10);
550#endif
551 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200552 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
553 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200554 if (n < CPU_NB_REGS32 ||
555 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
556 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
557 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
558 return 16;
559 }
pbrook56aebc82008-10-11 17:55:29 +0000560 } else {
pbrook56aebc82008-10-11 17:55:29 +0000561 switch (n) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200562 case IDX_IP_REG:
563 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
564 GET_REG64(env->eip);
565 } else {
566 GET_REG32(env->eip);
567 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200568 case IDX_FLAGS_REG: GET_REG32(env->eflags);
569
570 case IDX_SEG_REGS: GET_REG32(env->segs[R_CS].selector);
571 case IDX_SEG_REGS + 1: GET_REG32(env->segs[R_SS].selector);
572 case IDX_SEG_REGS + 2: GET_REG32(env->segs[R_DS].selector);
573 case IDX_SEG_REGS + 3: GET_REG32(env->segs[R_ES].selector);
574 case IDX_SEG_REGS + 4: GET_REG32(env->segs[R_FS].selector);
575 case IDX_SEG_REGS + 5: GET_REG32(env->segs[R_GS].selector);
576
577 case IDX_FP_REGS + 8: GET_REG32(env->fpuc);
578 case IDX_FP_REGS + 9: GET_REG32((env->fpus & ~0x3800) |
579 (env->fpstt & 0x7) << 11);
580 case IDX_FP_REGS + 10: GET_REG32(0); /* ftag */
581 case IDX_FP_REGS + 11: GET_REG32(0); /* fiseg */
582 case IDX_FP_REGS + 12: GET_REG32(0); /* fioff */
583 case IDX_FP_REGS + 13: GET_REG32(0); /* foseg */
584 case IDX_FP_REGS + 14: GET_REG32(0); /* fooff */
585 case IDX_FP_REGS + 15: GET_REG32(0); /* fop */
586
587 case IDX_MXCSR_REG: GET_REG32(env->mxcsr);
pbrook56aebc82008-10-11 17:55:29 +0000588 }
bellard79808572008-05-09 14:40:22 +0000589 }
pbrook56aebc82008-10-11 17:55:29 +0000590 return 0;
bellard79808572008-05-09 14:40:22 +0000591}
592
Andreas Färberf3840912012-02-20 06:44:56 +0100593static int cpu_x86_gdb_load_seg(CPUX86State *env, int sreg, uint8_t *mem_buf)
Jan Kiszka84273172009-06-27 09:53:51 +0200594{
595 uint16_t selector = ldl_p(mem_buf);
596
597 if (selector != env->segs[sreg].selector) {
598#if defined(CONFIG_USER_ONLY)
599 cpu_x86_load_seg(env, sreg, selector);
600#else
601 unsigned int limit, flags;
602 target_ulong base;
603
604 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
605 base = selector << 4;
606 limit = 0xffff;
607 flags = 0;
608 } else {
609 if (!cpu_x86_get_descr_debug(env, selector, &base, &limit, &flags))
610 return 4;
611 }
612 cpu_x86_load_seg_cache(env, sreg, selector, base, limit, flags);
613#endif
614 }
615 return 4;
616}
617
Andreas Färberf3840912012-02-20 06:44:56 +0100618static int cpu_gdb_write_register(CPUX86State *env, uint8_t *mem_buf, int n)
bellard79808572008-05-09 14:40:22 +0000619{
pbrook56aebc82008-10-11 17:55:29 +0000620 uint32_t tmp;
621
Jan Kiszkab1631e72009-06-27 09:53:51 +0200622 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200623 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
624 env->regs[gpr_map[n]] = ldtul_p(mem_buf);
625 return sizeof(target_ulong);
626 } else if (n < CPU_NB_REGS32) {
627 n = gpr_map32[n];
628 env->regs[n] &= ~0xffffffffUL;
629 env->regs[n] |= (uint32_t)ldl_p(mem_buf);
630 return 4;
631 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200632 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000633#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200634 /* FIXME: byteswap float values - after fixing fpregs layout. */
635 memcpy(&env->fpregs[n - IDX_FP_REGS], mem_buf, 10);
pbrook56aebc82008-10-11 17:55:29 +0000636#endif
637 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200638 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
639 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200640 if (n < CPU_NB_REGS32 ||
641 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
642 env->xmm_regs[n].XMM_Q(0) = ldq_p(mem_buf);
643 env->xmm_regs[n].XMM_Q(1) = ldq_p(mem_buf + 8);
644 return 16;
645 }
pbrook56aebc82008-10-11 17:55:29 +0000646 } else {
Jan Kiszkab1631e72009-06-27 09:53:51 +0200647 switch (n) {
648 case IDX_IP_REG:
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200649 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
650 env->eip = ldq_p(mem_buf);
651 return 8;
652 } else {
653 env->eip &= ~0xffffffffUL;
654 env->eip |= (uint32_t)ldl_p(mem_buf);
655 return 4;
656 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200657 case IDX_FLAGS_REG:
658 env->eflags = ldl_p(mem_buf);
659 return 4;
660
Jan Kiszka84273172009-06-27 09:53:51 +0200661 case IDX_SEG_REGS: return cpu_x86_gdb_load_seg(env, R_CS, mem_buf);
662 case IDX_SEG_REGS + 1: return cpu_x86_gdb_load_seg(env, R_SS, mem_buf);
663 case IDX_SEG_REGS + 2: return cpu_x86_gdb_load_seg(env, R_DS, mem_buf);
664 case IDX_SEG_REGS + 3: return cpu_x86_gdb_load_seg(env, R_ES, mem_buf);
665 case IDX_SEG_REGS + 4: return cpu_x86_gdb_load_seg(env, R_FS, mem_buf);
666 case IDX_SEG_REGS + 5: return cpu_x86_gdb_load_seg(env, R_GS, mem_buf);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200667
668 case IDX_FP_REGS + 8:
669 env->fpuc = ldl_p(mem_buf);
670 return 4;
671 case IDX_FP_REGS + 9:
672 tmp = ldl_p(mem_buf);
673 env->fpstt = (tmp >> 11) & 7;
674 env->fpus = tmp & ~0x3800;
675 return 4;
676 case IDX_FP_REGS + 10: /* ftag */ return 4;
677 case IDX_FP_REGS + 11: /* fiseg */ return 4;
678 case IDX_FP_REGS + 12: /* fioff */ return 4;
679 case IDX_FP_REGS + 13: /* foseg */ return 4;
680 case IDX_FP_REGS + 14: /* fooff */ return 4;
681 case IDX_FP_REGS + 15: /* fop */ return 4;
682
683 case IDX_MXCSR_REG:
684 env->mxcsr = ldl_p(mem_buf);
685 return 4;
bellard79808572008-05-09 14:40:22 +0000686 }
bellard79808572008-05-09 14:40:22 +0000687 }
pbrook56aebc82008-10-11 17:55:29 +0000688 /* Unrecognised register. */
689 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000690}
691
bellard9e62fd72004-01-05 22:49:06 +0000692#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000693
aurel32e571cb42009-01-24 15:07:42 +0000694/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
695 expects whatever the target description contains. Due to a
696 historical mishap the FP registers appear in between core integer
697 regs and PC, MSR, CR, and so forth. We hack round this by giving the
698 FP regs zero size when talking to a newer gdb. */
pbrook56aebc82008-10-11 17:55:29 +0000699#define NUM_CORE_REGS 71
aurel32e571cb42009-01-24 15:07:42 +0000700#if defined (TARGET_PPC64)
701#define GDB_CORE_XML "power64-core.xml"
702#else
703#define GDB_CORE_XML "power-core.xml"
704#endif
pbrook56aebc82008-10-11 17:55:29 +0000705
Andreas Färberf3840912012-02-20 06:44:56 +0100706static int cpu_gdb_read_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000707{
pbrook56aebc82008-10-11 17:55:29 +0000708 if (n < 32) {
709 /* gprs */
710 GET_REGL(env->gpr[n]);
711 } else if (n < 64) {
712 /* fprs */
aurel32e571cb42009-01-24 15:07:42 +0000713 if (gdb_has_xml)
714 return 0;
aurel328d4acf92008-11-30 16:23:18 +0000715 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000716 return 8;
717 } else {
718 switch (n) {
719 case 64: GET_REGL(env->nip);
720 case 65: GET_REGL(env->msr);
721 case 66:
722 {
723 uint32_t cr = 0;
724 int i;
725 for (i = 0; i < 8; i++)
726 cr |= env->crf[i] << (32 - ((i + 1) * 4));
727 GET_REG32(cr);
728 }
729 case 67: GET_REGL(env->lr);
730 case 68: GET_REGL(env->ctr);
aurel323d7b4172008-10-21 11:28:46 +0000731 case 69: GET_REGL(env->xer);
aurel32e571cb42009-01-24 15:07:42 +0000732 case 70:
733 {
734 if (gdb_has_xml)
735 return 0;
Fabien Chouteau5a576fb2011-09-01 04:56:00 +0000736 GET_REG32(env->fpscr);
aurel32e571cb42009-01-24 15:07:42 +0000737 }
pbrook56aebc82008-10-11 17:55:29 +0000738 }
bellard9e62fd72004-01-05 22:49:06 +0000739 }
pbrook56aebc82008-10-11 17:55:29 +0000740 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000741}
742
Andreas Färberf3840912012-02-20 06:44:56 +0100743static int cpu_gdb_write_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000744{
pbrook56aebc82008-10-11 17:55:29 +0000745 if (n < 32) {
746 /* gprs */
747 env->gpr[n] = ldtul_p(mem_buf);
748 return sizeof(target_ulong);
749 } else if (n < 64) {
750 /* fprs */
aurel32e571cb42009-01-24 15:07:42 +0000751 if (gdb_has_xml)
752 return 0;
aurel328d4acf92008-11-30 16:23:18 +0000753 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000754 return 8;
755 } else {
756 switch (n) {
757 case 64:
758 env->nip = ldtul_p(mem_buf);
759 return sizeof(target_ulong);
760 case 65:
761 ppc_store_msr(env, ldtul_p(mem_buf));
762 return sizeof(target_ulong);
763 case 66:
764 {
765 uint32_t cr = ldl_p(mem_buf);
766 int i;
767 for (i = 0; i < 8; i++)
768 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
769 return 4;
770 }
771 case 67:
772 env->lr = ldtul_p(mem_buf);
773 return sizeof(target_ulong);
774 case 68:
775 env->ctr = ldtul_p(mem_buf);
776 return sizeof(target_ulong);
777 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000778 env->xer = ldtul_p(mem_buf);
779 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000780 case 70:
781 /* fpscr */
aurel32e571cb42009-01-24 15:07:42 +0000782 if (gdb_has_xml)
783 return 0;
Fabien Chouteaud6478bc2013-03-19 07:41:53 +0000784 store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
785 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000786 }
bellard9e62fd72004-01-05 22:49:06 +0000787 }
pbrook56aebc82008-10-11 17:55:29 +0000788 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000789}
pbrook56aebc82008-10-11 17:55:29 +0000790
bellarde95c8d52004-09-30 22:22:08 +0000791#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000792
pbrook56aebc82008-10-11 17:55:29 +0000793#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
794#define NUM_CORE_REGS 86
795#else
blueswir15a377912009-01-13 16:28:01 +0000796#define NUM_CORE_REGS 72
pbrook56aebc82008-10-11 17:55:29 +0000797#endif
798
799#ifdef TARGET_ABI32
800#define GET_REGA(val) GET_REG32(val)
801#else
802#define GET_REGA(val) GET_REGL(val)
803#endif
804
Andreas Färberf3840912012-02-20 06:44:56 +0100805static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000806{
807 if (n < 8) {
808 /* g0..g7 */
809 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000810 }
pbrook56aebc82008-10-11 17:55:29 +0000811 if (n < 32) {
812 /* register window */
813 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000814 }
pbrook56aebc82008-10-11 17:55:29 +0000815#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
816 if (n < 64) {
817 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700818 if (n & 1) {
819 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
820 } else {
821 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
822 }
bellarde95c8d52004-09-30 22:22:08 +0000823 }
824 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000825 switch (n) {
826 case 64: GET_REGA(env->y);
Blue Swirl5a834bb2010-05-09 20:19:04 +0000827 case 65: GET_REGA(cpu_get_psr(env));
pbrook56aebc82008-10-11 17:55:29 +0000828 case 66: GET_REGA(env->wim);
829 case 67: GET_REGA(env->tbr);
830 case 68: GET_REGA(env->pc);
831 case 69: GET_REGA(env->npc);
832 case 70: GET_REGA(env->fsr);
833 case 71: GET_REGA(0); /* csr */
blueswir15a377912009-01-13 16:28:01 +0000834 default: GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000835 }
bellard34751872005-07-02 14:31:34 +0000836#else
pbrook56aebc82008-10-11 17:55:29 +0000837 if (n < 64) {
838 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700839 if (n & 1) {
840 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
841 } else {
842 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
843 }
bellard34751872005-07-02 14:31:34 +0000844 }
pbrook56aebc82008-10-11 17:55:29 +0000845 if (n < 80) {
846 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700847 GET_REG64(env->fpr[(n - 32) / 2].ll);
pbrook56aebc82008-10-11 17:55:29 +0000848 }
849 switch (n) {
850 case 80: GET_REGL(env->pc);
851 case 81: GET_REGL(env->npc);
Blue Swirl5a834bb2010-05-09 20:19:04 +0000852 case 82: GET_REGL((cpu_get_ccr(env) << 32) |
853 ((env->asi & 0xff) << 24) |
854 ((env->pstate & 0xfff) << 8) |
855 cpu_get_cwp64(env));
pbrook56aebc82008-10-11 17:55:29 +0000856 case 83: GET_REGL(env->fsr);
857 case 84: GET_REGL(env->fprs);
858 case 85: GET_REGL(env->y);
859 }
bellard34751872005-07-02 14:31:34 +0000860#endif
pbrook56aebc82008-10-11 17:55:29 +0000861 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000862}
863
Andreas Färberf3840912012-02-20 06:44:56 +0100864static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000865{
pbrook56aebc82008-10-11 17:55:29 +0000866#if defined(TARGET_ABI32)
867 abi_ulong tmp;
868
869 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000870#else
pbrook56aebc82008-10-11 17:55:29 +0000871 target_ulong tmp;
872
873 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000874#endif
bellarde95c8d52004-09-30 22:22:08 +0000875
pbrook56aebc82008-10-11 17:55:29 +0000876 if (n < 8) {
877 /* g0..g7 */
878 env->gregs[n] = tmp;
879 } else if (n < 32) {
880 /* register window */
881 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000882 }
pbrook56aebc82008-10-11 17:55:29 +0000883#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
884 else if (n < 64) {
885 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700886 /* f0-f31 */
887 if (n & 1) {
888 env->fpr[(n - 32) / 2].l.lower = tmp;
889 } else {
890 env->fpr[(n - 32) / 2].l.upper = tmp;
891 }
pbrook56aebc82008-10-11 17:55:29 +0000892 } else {
893 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
894 switch (n) {
895 case 64: env->y = tmp; break;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000896 case 65: cpu_put_psr(env, tmp); break;
pbrook56aebc82008-10-11 17:55:29 +0000897 case 66: env->wim = tmp; break;
898 case 67: env->tbr = tmp; break;
899 case 68: env->pc = tmp; break;
900 case 69: env->npc = tmp; break;
901 case 70: env->fsr = tmp; break;
902 default: return 0;
903 }
bellarde95c8d52004-09-30 22:22:08 +0000904 }
pbrook56aebc82008-10-11 17:55:29 +0000905 return 4;
bellard34751872005-07-02 14:31:34 +0000906#else
pbrook56aebc82008-10-11 17:55:29 +0000907 else if (n < 64) {
908 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700909 tmp = ldl_p(mem_buf);
910 if (n & 1) {
911 env->fpr[(n - 32) / 2].l.lower = tmp;
912 } else {
913 env->fpr[(n - 32) / 2].l.upper = tmp;
914 }
pbrook56aebc82008-10-11 17:55:29 +0000915 return 4;
916 } else if (n < 80) {
917 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700918 env->fpr[(n - 32) / 2].ll = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000919 } else {
920 switch (n) {
921 case 80: env->pc = tmp; break;
922 case 81: env->npc = tmp; break;
923 case 82:
Blue Swirl5a834bb2010-05-09 20:19:04 +0000924 cpu_put_ccr(env, tmp >> 32);
pbrook56aebc82008-10-11 17:55:29 +0000925 env->asi = (tmp >> 24) & 0xff;
926 env->pstate = (tmp >> 8) & 0xfff;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000927 cpu_put_cwp64(env, tmp & 0xff);
pbrook56aebc82008-10-11 17:55:29 +0000928 break;
929 case 83: env->fsr = tmp; break;
930 case 84: env->fprs = tmp; break;
931 case 85: env->y = tmp; break;
932 default: return 0;
933 }
bellard34751872005-07-02 14:31:34 +0000934 }
pbrook56aebc82008-10-11 17:55:29 +0000935 return 8;
bellard34751872005-07-02 14:31:34 +0000936#endif
bellard9e62fd72004-01-05 22:49:06 +0000937}
bellard1fddef42005-04-17 19:16:13 +0000938#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000939
940/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
941 whatever the target description contains. Due to a historical mishap
942 the FPA registers appear in between core integer regs and the CPSR.
943 We hack round this by giving the FPA regs zero size when talking to a
944 newer gdb. */
945#define NUM_CORE_REGS 26
946#define GDB_CORE_XML "arm-core.xml"
947
Andreas Färberf3840912012-02-20 06:44:56 +0100948static int cpu_gdb_read_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000949{
pbrook56aebc82008-10-11 17:55:29 +0000950 if (n < 16) {
951 /* Core integer register. */
952 GET_REG32(env->regs[n]);
953 }
954 if (n < 24) {
955 /* FPA registers. */
956 if (gdb_has_xml)
957 return 0;
958 memset(mem_buf, 0, 12);
959 return 12;
960 }
961 switch (n) {
962 case 24:
963 /* FPA status register. */
964 if (gdb_has_xml)
965 return 0;
966 GET_REG32(0);
967 case 25:
968 /* CPSR */
969 GET_REG32(cpsr_read(env));
970 }
971 /* Unknown register. */
972 return 0;
bellard1fddef42005-04-17 19:16:13 +0000973}
974
Andreas Färberf3840912012-02-20 06:44:56 +0100975static int cpu_gdb_write_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000976{
pbrook56aebc82008-10-11 17:55:29 +0000977 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000978
pbrook56aebc82008-10-11 17:55:29 +0000979 tmp = ldl_p(mem_buf);
980
981 /* Mask out low bit of PC to workaround gdb bugs. This will probably
982 cause problems if we ever implement the Jazelle DBX extensions. */
983 if (n == 15)
984 tmp &= ~1;
985
986 if (n < 16) {
987 /* Core integer register. */
988 env->regs[n] = tmp;
989 return 4;
990 }
991 if (n < 24) { /* 16-23 */
992 /* FPA registers (ignored). */
993 if (gdb_has_xml)
994 return 0;
995 return 12;
996 }
997 switch (n) {
998 case 24:
999 /* FPA status register (ignored). */
1000 if (gdb_has_xml)
1001 return 0;
1002 return 4;
1003 case 25:
1004 /* CPSR */
1005 cpsr_write (env, tmp, 0xffffffff);
1006 return 4;
1007 }
1008 /* Unknown register. */
1009 return 0;
bellard1fddef42005-04-17 19:16:13 +00001010}
pbrook56aebc82008-10-11 17:55:29 +00001011
pbrooke6e59062006-10-22 00:18:54 +00001012#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +00001013
1014#define NUM_CORE_REGS 18
1015
1016#define GDB_CORE_XML "cf-core.xml"
1017
Andreas Färberf3840912012-02-20 06:44:56 +01001018static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001019{
pbrook56aebc82008-10-11 17:55:29 +00001020 if (n < 8) {
1021 /* D0-D7 */
1022 GET_REG32(env->dregs[n]);
1023 } else if (n < 16) {
1024 /* A0-A7 */
1025 GET_REG32(env->aregs[n - 8]);
1026 } else {
1027 switch (n) {
1028 case 16: GET_REG32(env->sr);
1029 case 17: GET_REG32(env->pc);
1030 }
pbrooke6e59062006-10-22 00:18:54 +00001031 }
pbrook56aebc82008-10-11 17:55:29 +00001032 /* FP registers not included here because they vary between
1033 ColdFire and m68k. Use XML bits for these. */
1034 return 0;
pbrooke6e59062006-10-22 00:18:54 +00001035}
1036
Andreas Färberf3840912012-02-20 06:44:56 +01001037static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001038{
pbrook56aebc82008-10-11 17:55:29 +00001039 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +00001040
pbrook56aebc82008-10-11 17:55:29 +00001041 tmp = ldl_p(mem_buf);
1042
1043 if (n < 8) {
1044 /* D0-D7 */
1045 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -08001046 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +00001047 /* A0-A7 */
1048 env->aregs[n - 8] = tmp;
1049 } else {
1050 switch (n) {
1051 case 16: env->sr = tmp; break;
1052 case 17: env->pc = tmp; break;
1053 default: return 0;
1054 }
pbrooke6e59062006-10-22 00:18:54 +00001055 }
pbrook56aebc82008-10-11 17:55:29 +00001056 return 4;
pbrooke6e59062006-10-22 00:18:54 +00001057}
bellard6f970bd2005-12-05 19:55:19 +00001058#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +00001059
1060#define NUM_CORE_REGS 73
1061
Andreas Färberf3840912012-02-20 06:44:56 +01001062static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001063{
pbrook56aebc82008-10-11 17:55:29 +00001064 if (n < 32) {
1065 GET_REGL(env->active_tc.gpr[n]);
1066 }
1067 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1068 if (n >= 38 && n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001069 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001070 GET_REGL(env->active_fpu.fpr[n - 38].d);
ths7ac256b2007-10-25 21:30:37 +00001071 else
pbrook56aebc82008-10-11 17:55:29 +00001072 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
1073 }
1074 switch (n) {
1075 case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
1076 case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
1077 }
1078 }
1079 switch (n) {
1080 case 32: GET_REGL((int32_t)env->CP0_Status);
1081 case 33: GET_REGL(env->active_tc.LO[0]);
1082 case 34: GET_REGL(env->active_tc.HI[0]);
1083 case 35: GET_REGL(env->CP0_BadVAddr);
1084 case 36: GET_REGL((int32_t)env->CP0_Cause);
Nathan Froydff1d1972009-12-08 08:06:30 -08001085 case 37: GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
pbrook56aebc82008-10-11 17:55:29 +00001086 case 72: GET_REGL(0); /* fp */
1087 case 89: GET_REGL((int32_t)env->CP0_PRid);
1088 }
1089 if (n >= 73 && n <= 88) {
1090 /* 16 embedded regs. */
1091 GET_REGL(0);
1092 }
ths36d23952007-02-28 22:37:42 +00001093
pbrook56aebc82008-10-11 17:55:29 +00001094 return 0;
bellard6f970bd2005-12-05 19:55:19 +00001095}
1096
ths8e33c082006-12-11 19:22:27 +00001097/* convert MIPS rounding mode in FCR31 to IEEE library */
1098static unsigned int ieee_rm[] =
1099 {
1100 float_round_nearest_even,
1101 float_round_to_zero,
1102 float_round_up,
1103 float_round_down
1104 };
1105#define RESTORE_ROUNDING_MODE \
thsf01be152008-09-18 11:57:27 +00001106 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +00001107
Andreas Färberf3840912012-02-20 06:44:56 +01001108static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001109{
pbrook56aebc82008-10-11 17:55:29 +00001110 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +00001111
pbrook56aebc82008-10-11 17:55:29 +00001112 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001113
pbrook56aebc82008-10-11 17:55:29 +00001114 if (n < 32) {
1115 env->active_tc.gpr[n] = tmp;
1116 return sizeof(target_ulong);
1117 }
1118 if (env->CP0_Config1 & (1 << CP0C1_FP)
1119 && n >= 38 && n < 73) {
1120 if (n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001121 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001122 env->active_fpu.fpr[n - 38].d = tmp;
ths7ac256b2007-10-25 21:30:37 +00001123 else
pbrook56aebc82008-10-11 17:55:29 +00001124 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1125 }
1126 switch (n) {
1127 case 70:
1128 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1129 /* set rounding mode */
1130 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +00001131 break;
1132 case 71: env->active_fpu.fcr0 = tmp; break;
1133 }
1134 return sizeof(target_ulong);
1135 }
1136 switch (n) {
1137 case 32: env->CP0_Status = tmp; break;
1138 case 33: env->active_tc.LO[0] = tmp; break;
1139 case 34: env->active_tc.HI[0] = tmp; break;
1140 case 35: env->CP0_BadVAddr = tmp; break;
1141 case 36: env->CP0_Cause = tmp; break;
Nathan Froydff1d1972009-12-08 08:06:30 -08001142 case 37:
1143 env->active_tc.PC = tmp & ~(target_ulong)1;
1144 if (tmp & 1) {
1145 env->hflags |= MIPS_HFLAG_M16;
1146 } else {
1147 env->hflags &= ~(MIPS_HFLAG_M16);
1148 }
1149 break;
pbrook56aebc82008-10-11 17:55:29 +00001150 case 72: /* fp, ignored */ break;
1151 default:
1152 if (n > 89)
1153 return 0;
1154 /* Other registers are readonly. Ignore writes. */
1155 break;
1156 }
1157
1158 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001159}
Jia Liufc043552012-07-20 15:50:50 +08001160#elif defined(TARGET_OPENRISC)
1161
1162#define NUM_CORE_REGS (32 + 3)
1163
1164static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
1165{
1166 if (n < 32) {
1167 GET_REG32(env->gpr[n]);
1168 } else {
1169 switch (n) {
1170 case 32: /* PPC */
1171 GET_REG32(env->ppc);
1172 break;
1173
1174 case 33: /* NPC */
1175 GET_REG32(env->npc);
1176 break;
1177
1178 case 34: /* SR */
1179 GET_REG32(env->sr);
1180 break;
1181
1182 default:
1183 break;
1184 }
1185 }
1186 return 0;
1187}
1188
1189static int cpu_gdb_write_register(CPUOpenRISCState *env,
1190 uint8_t *mem_buf, int n)
1191{
1192 uint32_t tmp;
1193
1194 if (n > NUM_CORE_REGS) {
1195 return 0;
1196 }
1197
1198 tmp = ldl_p(mem_buf);
1199
1200 if (n < 32) {
1201 env->gpr[n] = tmp;
1202 } else {
1203 switch (n) {
1204 case 32: /* PPC */
1205 env->ppc = tmp;
1206 break;
1207
1208 case 33: /* NPC */
1209 env->npc = tmp;
1210 break;
1211
1212 case 34: /* SR */
1213 env->sr = tmp;
1214 break;
1215
1216 default:
1217 break;
1218 }
1219 }
1220 return 4;
1221}
bellardfdf9b3e2006-04-27 21:07:38 +00001222#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001223
1224/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001225/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001226
pbrook56aebc82008-10-11 17:55:29 +00001227#define NUM_CORE_REGS 59
1228
Andreas Färberf3840912012-02-20 06:44:56 +01001229static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001230{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001231 switch (n) {
1232 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +00001233 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1234 GET_REGL(env->gregs[n + 16]);
1235 } else {
1236 GET_REGL(env->gregs[n]);
1237 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001238 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001239 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001240 case 16:
1241 GET_REGL(env->pc);
1242 case 17:
1243 GET_REGL(env->pr);
1244 case 18:
1245 GET_REGL(env->gbr);
1246 case 19:
1247 GET_REGL(env->vbr);
1248 case 20:
1249 GET_REGL(env->mach);
1250 case 21:
1251 GET_REGL(env->macl);
1252 case 22:
1253 GET_REGL(env->sr);
1254 case 23:
1255 GET_REGL(env->fpul);
1256 case 24:
1257 GET_REGL(env->fpscr);
1258 case 25 ... 40:
1259 if (env->fpscr & FPSCR_FR) {
1260 stfl_p(mem_buf, env->fregs[n - 9]);
1261 } else {
1262 stfl_p(mem_buf, env->fregs[n - 25]);
1263 }
1264 return 4;
1265 case 41:
1266 GET_REGL(env->ssr);
1267 case 42:
1268 GET_REGL(env->spc);
1269 case 43 ... 50:
1270 GET_REGL(env->gregs[n - 43]);
1271 case 51 ... 58:
1272 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +00001273 }
bellardfdf9b3e2006-04-27 21:07:38 +00001274
pbrook56aebc82008-10-11 17:55:29 +00001275 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001276}
1277
Andreas Färberf3840912012-02-20 06:44:56 +01001278static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001279{
pbrook56aebc82008-10-11 17:55:29 +00001280 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001281 case 0 ... 7:
1282 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1283 env->gregs[n + 16] = ldl_p(mem_buf);
1284 } else {
1285 env->gregs[n] = ldl_p(mem_buf);
1286 }
1287 break;
1288 case 8 ... 15:
1289 env->gregs[n] = ldl_p(mem_buf);
1290 break;
1291 case 16:
1292 env->pc = ldl_p(mem_buf);
1293 break;
1294 case 17:
1295 env->pr = ldl_p(mem_buf);
1296 break;
1297 case 18:
1298 env->gbr = ldl_p(mem_buf);
1299 break;
1300 case 19:
1301 env->vbr = ldl_p(mem_buf);
1302 break;
1303 case 20:
1304 env->mach = ldl_p(mem_buf);
1305 break;
1306 case 21:
1307 env->macl = ldl_p(mem_buf);
1308 break;
1309 case 22:
1310 env->sr = ldl_p(mem_buf);
1311 break;
1312 case 23:
1313 env->fpul = ldl_p(mem_buf);
1314 break;
1315 case 24:
1316 env->fpscr = ldl_p(mem_buf);
1317 break;
1318 case 25 ... 40:
1319 if (env->fpscr & FPSCR_FR) {
1320 env->fregs[n - 9] = ldfl_p(mem_buf);
1321 } else {
1322 env->fregs[n - 25] = ldfl_p(mem_buf);
1323 }
1324 break;
1325 case 41:
1326 env->ssr = ldl_p(mem_buf);
1327 break;
1328 case 42:
1329 env->spc = ldl_p(mem_buf);
1330 break;
1331 case 43 ... 50:
1332 env->gregs[n - 43] = ldl_p(mem_buf);
1333 break;
1334 case 51 ... 58:
1335 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
1336 break;
pbrook56aebc82008-10-11 17:55:29 +00001337 default: return 0;
1338 }
1339
1340 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001341}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001342#elif defined (TARGET_MICROBLAZE)
1343
1344#define NUM_CORE_REGS (32 + 5)
1345
Andreas Färberf3840912012-02-20 06:44:56 +01001346static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001347{
1348 if (n < 32) {
1349 GET_REG32(env->regs[n]);
1350 } else {
1351 GET_REG32(env->sregs[n - 32]);
1352 }
1353 return 0;
1354}
1355
Andreas Färberf3840912012-02-20 06:44:56 +01001356static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001357{
1358 uint32_t tmp;
1359
1360 if (n > NUM_CORE_REGS)
1361 return 0;
1362
1363 tmp = ldl_p(mem_buf);
1364
1365 if (n < 32) {
1366 env->regs[n] = tmp;
1367 } else {
1368 env->sregs[n - 32] = tmp;
1369 }
1370 return 4;
1371}
thsf1ccf902007-10-08 13:16:14 +00001372#elif defined (TARGET_CRIS)
1373
pbrook56aebc82008-10-11 17:55:29 +00001374#define NUM_CORE_REGS 49
1375
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001376static int
Andreas Färberf3840912012-02-20 06:44:56 +01001377read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001378{
1379 if (n < 15) {
1380 GET_REG32(env->regs[n]);
1381 }
1382
1383 if (n == 15) {
1384 GET_REG32(env->pc);
1385 }
1386
1387 if (n < 32) {
1388 switch (n) {
1389 case 16:
1390 GET_REG8(env->pregs[n - 16]);
1391 break;
1392 case 17:
1393 GET_REG8(env->pregs[n - 16]);
1394 break;
1395 case 20:
1396 case 21:
1397 GET_REG16(env->pregs[n - 16]);
1398 break;
1399 default:
1400 if (n >= 23) {
1401 GET_REG32(env->pregs[n - 16]);
1402 }
1403 break;
1404 }
1405 }
1406 return 0;
1407}
1408
Andreas Färberf3840912012-02-20 06:44:56 +01001409static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001410{
pbrook56aebc82008-10-11 17:55:29 +00001411 uint8_t srs;
1412
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001413 if (env->pregs[PR_VR] < 32)
1414 return read_register_crisv10(env, mem_buf, n);
1415
pbrook56aebc82008-10-11 17:55:29 +00001416 srs = env->pregs[PR_SRS];
1417 if (n < 16) {
1418 GET_REG32(env->regs[n]);
1419 }
1420
1421 if (n >= 21 && n < 32) {
1422 GET_REG32(env->pregs[n - 16]);
1423 }
1424 if (n >= 33 && n < 49) {
1425 GET_REG32(env->sregs[srs][n - 33]);
1426 }
1427 switch (n) {
1428 case 16: GET_REG8(env->pregs[0]);
1429 case 17: GET_REG8(env->pregs[1]);
1430 case 18: GET_REG32(env->pregs[2]);
1431 case 19: GET_REG8(srs);
1432 case 20: GET_REG16(env->pregs[4]);
1433 case 32: GET_REG32(env->pc);
1434 }
1435
1436 return 0;
thsf1ccf902007-10-08 13:16:14 +00001437}
1438
Andreas Färberf3840912012-02-20 06:44:56 +01001439static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001440{
pbrook56aebc82008-10-11 17:55:29 +00001441 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001442
pbrook56aebc82008-10-11 17:55:29 +00001443 if (n > 49)
1444 return 0;
thsf1ccf902007-10-08 13:16:14 +00001445
pbrook56aebc82008-10-11 17:55:29 +00001446 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001447
pbrook56aebc82008-10-11 17:55:29 +00001448 if (n < 16) {
1449 env->regs[n] = tmp;
1450 }
thsf1ccf902007-10-08 13:16:14 +00001451
edgar_igld7b69672008-10-11 19:32:21 +00001452 if (n >= 21 && n < 32) {
1453 env->pregs[n - 16] = tmp;
1454 }
1455
1456 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001457 switch (n) {
1458 case 16: return 1;
1459 case 17: return 1;
edgar_igld7b69672008-10-11 19:32:21 +00001460 case 18: env->pregs[PR_PID] = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +00001461 case 19: return 1;
1462 case 20: return 2;
1463 case 32: env->pc = tmp; break;
1464 }
thsf1ccf902007-10-08 13:16:14 +00001465
pbrook56aebc82008-10-11 17:55:29 +00001466 return 4;
thsf1ccf902007-10-08 13:16:14 +00001467}
aurel3219bf5172008-12-07 23:26:32 +00001468#elif defined (TARGET_ALPHA)
1469
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001470#define NUM_CORE_REGS 67
aurel3219bf5172008-12-07 23:26:32 +00001471
Andreas Färberf3840912012-02-20 06:44:56 +01001472static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001473{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001474 uint64_t val;
1475 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001476
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001477 switch (n) {
1478 case 0 ... 30:
1479 val = env->ir[n];
1480 break;
1481 case 32 ... 62:
1482 d.d = env->fir[n - 32];
1483 val = d.ll;
1484 break;
1485 case 63:
1486 val = cpu_alpha_load_fpcr(env);
1487 break;
1488 case 64:
1489 val = env->pc;
1490 break;
1491 case 66:
1492 val = env->unique;
1493 break;
1494 case 31:
1495 case 65:
1496 /* 31 really is the zero register; 65 is unassigned in the
1497 gdb protocol, but is still required to occupy 8 bytes. */
1498 val = 0;
1499 break;
1500 default:
1501 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001502 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001503 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001504}
1505
Andreas Färberf3840912012-02-20 06:44:56 +01001506static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001507{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001508 target_ulong tmp = ldtul_p(mem_buf);
1509 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001510
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001511 switch (n) {
1512 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001513 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001514 break;
1515 case 32 ... 62:
1516 d.ll = tmp;
1517 env->fir[n - 32] = d.d;
1518 break;
1519 case 63:
1520 cpu_alpha_store_fpcr(env, tmp);
1521 break;
1522 case 64:
1523 env->pc = tmp;
1524 break;
1525 case 66:
1526 env->unique = tmp;
1527 break;
1528 case 31:
1529 case 65:
1530 /* 31 really is the zero register; 65 is unassigned in the
1531 gdb protocol, but is still required to occupy 8 bytes. */
1532 break;
1533 default:
1534 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001535 }
aurel3219bf5172008-12-07 23:26:32 +00001536 return 8;
1537}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001538#elif defined (TARGET_S390X)
1539
Richard Henderson6ee77b12012-08-23 10:44:45 -07001540#define NUM_CORE_REGS S390_NUM_REGS
Alexander Grafafcb0e42009-12-05 12:44:29 +01001541
Andreas Färberf3840912012-02-20 06:44:56 +01001542static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001543{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001544 uint64_t val;
1545 int cc_op;
1546
Alexander Grafafcb0e42009-12-05 12:44:29 +01001547 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001548 case S390_PSWM_REGNUM:
1549 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1550 val = deposit64(env->psw.mask, 44, 2, cc_op);
1551 GET_REGL(val);
1552 break;
1553 case S390_PSWA_REGNUM:
1554 GET_REGL(env->psw.addr);
1555 break;
1556 case S390_R0_REGNUM ... S390_R15_REGNUM:
1557 GET_REGL(env->regs[n-S390_R0_REGNUM]);
1558 break;
1559 case S390_A0_REGNUM ... S390_A15_REGNUM:
1560 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
1561 break;
1562 case S390_FPC_REGNUM:
1563 GET_REG32(env->fpc);
1564 break;
1565 case S390_F0_REGNUM ... S390_F15_REGNUM:
1566 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
1567 break;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001568 }
1569
1570 return 0;
1571}
1572
Andreas Färberf3840912012-02-20 06:44:56 +01001573static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001574{
1575 target_ulong tmpl;
1576 uint32_t tmp32;
1577 int r = 8;
1578 tmpl = ldtul_p(mem_buf);
1579 tmp32 = ldl_p(mem_buf);
1580
1581 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001582 case S390_PSWM_REGNUM:
1583 env->psw.mask = tmpl;
1584 env->cc_op = extract64(tmpl, 44, 2);
1585 break;
1586 case S390_PSWA_REGNUM:
1587 env->psw.addr = tmpl;
1588 break;
1589 case S390_R0_REGNUM ... S390_R15_REGNUM:
1590 env->regs[n-S390_R0_REGNUM] = tmpl;
1591 break;
1592 case S390_A0_REGNUM ... S390_A15_REGNUM:
1593 env->aregs[n-S390_A0_REGNUM] = tmp32;
1594 r = 4;
1595 break;
1596 case S390_FPC_REGNUM:
1597 env->fpc = tmp32;
1598 r = 4;
1599 break;
1600 case S390_F0_REGNUM ... S390_F15_REGNUM:
1601 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1602 break;
1603 default:
1604 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001605 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001606 return r;
1607}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001608#elif defined (TARGET_LM32)
1609
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001610#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001611#define NUM_CORE_REGS (32 + 7)
1612
Andreas Färberf3840912012-02-20 06:44:56 +01001613static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001614{
1615 if (n < 32) {
1616 GET_REG32(env->regs[n]);
1617 } else {
1618 switch (n) {
1619 case 32:
1620 GET_REG32(env->pc);
1621 break;
1622 /* FIXME: put in right exception ID */
1623 case 33:
1624 GET_REG32(0);
1625 break;
1626 case 34:
1627 GET_REG32(env->eba);
1628 break;
1629 case 35:
1630 GET_REG32(env->deba);
1631 break;
1632 case 36:
1633 GET_REG32(env->ie);
1634 break;
1635 case 37:
1636 GET_REG32(lm32_pic_get_im(env->pic_state));
1637 break;
1638 case 38:
1639 GET_REG32(lm32_pic_get_ip(env->pic_state));
1640 break;
1641 }
1642 }
1643 return 0;
1644}
1645
Andreas Färberf3840912012-02-20 06:44:56 +01001646static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001647{
1648 uint32_t tmp;
1649
1650 if (n > NUM_CORE_REGS) {
1651 return 0;
1652 }
1653
1654 tmp = ldl_p(mem_buf);
1655
1656 if (n < 32) {
1657 env->regs[n] = tmp;
1658 } else {
1659 switch (n) {
1660 case 32:
1661 env->pc = tmp;
1662 break;
1663 case 34:
1664 env->eba = tmp;
1665 break;
1666 case 35:
1667 env->deba = tmp;
1668 break;
1669 case 36:
1670 env->ie = tmp;
1671 break;
1672 case 37:
1673 lm32_pic_set_im(env->pic_state, tmp);
1674 break;
1675 case 38:
1676 lm32_pic_set_ip(env->pic_state, tmp);
1677 break;
1678 }
1679 }
1680 return 4;
1681}
Max Filippovccfcaba2011-09-06 03:55:52 +04001682#elif defined(TARGET_XTENSA)
1683
1684/* Use num_core_regs to see only non-privileged registers in an unmodified gdb.
1685 * Use num_regs to see all registers. gdb modification is required for that:
1686 * reset bit 0 in the 'flags' field of the registers definitions in the
1687 * gdb/xtensa-config.c inside gdb source tree or inside gdb overlay.
1688 */
1689#define NUM_CORE_REGS (env->config->gdb_regmap.num_regs)
1690#define num_g_regs NUM_CORE_REGS
1691
Andreas Färberf3840912012-02-20 06:44:56 +01001692static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001693{
1694 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1695
1696 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1697 return 0;
1698 }
1699
1700 switch (reg->type) {
1701 case 9: /*pc*/
1702 GET_REG32(env->pc);
1703 break;
1704
1705 case 1: /*ar*/
1706 xtensa_sync_phys_from_window(env);
1707 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
1708 break;
1709
1710 case 2: /*SR*/
1711 GET_REG32(env->sregs[reg->targno & 0xff]);
1712 break;
1713
1714 case 3: /*UR*/
1715 GET_REG32(env->uregs[reg->targno & 0xff]);
1716 break;
1717
Max Filippovdd519cb2012-09-19 04:23:54 +04001718 case 4: /*f*/
1719 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
1720 break;
1721
Max Filippovccfcaba2011-09-06 03:55:52 +04001722 case 8: /*a*/
1723 GET_REG32(env->regs[reg->targno & 0x0f]);
1724 break;
1725
1726 default:
1727 qemu_log("%s from reg %d of unsupported type %d\n",
1728 __func__, n, reg->type);
1729 return 0;
1730 }
1731}
1732
Andreas Färberf3840912012-02-20 06:44:56 +01001733static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001734{
1735 uint32_t tmp;
1736 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1737
1738 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1739 return 0;
1740 }
1741
1742 tmp = ldl_p(mem_buf);
1743
1744 switch (reg->type) {
1745 case 9: /*pc*/
1746 env->pc = tmp;
1747 break;
1748
1749 case 1: /*ar*/
1750 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1751 xtensa_sync_window_from_phys(env);
1752 break;
1753
1754 case 2: /*SR*/
1755 env->sregs[reg->targno & 0xff] = tmp;
1756 break;
1757
1758 case 3: /*UR*/
1759 env->uregs[reg->targno & 0xff] = tmp;
1760 break;
1761
Max Filippovdd519cb2012-09-19 04:23:54 +04001762 case 4: /*f*/
1763 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1764 break;
1765
Max Filippovccfcaba2011-09-06 03:55:52 +04001766 case 8: /*a*/
1767 env->regs[reg->targno & 0x0f] = tmp;
1768 break;
1769
1770 default:
1771 qemu_log("%s to reg %d of unsupported type %d\n",
1772 __func__, n, reg->type);
1773 return 0;
1774 }
1775
1776 return 4;
1777}
bellard1fddef42005-04-17 19:16:13 +00001778#else
pbrook56aebc82008-10-11 17:55:29 +00001779
1780#define NUM_CORE_REGS 0
1781
Andreas Färber9349b4f2012-03-14 01:38:32 +01001782static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001783{
1784 return 0;
1785}
1786
Andreas Färber9349b4f2012-03-14 01:38:32 +01001787static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001788{
pbrook56aebc82008-10-11 17:55:29 +00001789 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001790}
1791
1792#endif
bellardb4608c02003-06-27 17:34:32 +00001793
Max Filippovccfcaba2011-09-06 03:55:52 +04001794#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001795static int num_g_regs = NUM_CORE_REGS;
Max Filippovccfcaba2011-09-06 03:55:52 +04001796#endif
pbrook56aebc82008-10-11 17:55:29 +00001797
1798#ifdef GDB_CORE_XML
1799/* Encode data using the encoding for 'x' packets. */
1800static int memtox(char *buf, const char *mem, int len)
1801{
1802 char *p = buf;
1803 char c;
1804
1805 while (len--) {
1806 c = *(mem++);
1807 switch (c) {
1808 case '#': case '$': case '*': case '}':
1809 *(p++) = '}';
1810 *(p++) = c ^ 0x20;
1811 break;
1812 default:
1813 *(p++) = c;
1814 break;
1815 }
1816 }
1817 return p - buf;
1818}
1819
aurel323faf7782008-12-07 23:26:17 +00001820static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001821{
pbrook56aebc82008-10-11 17:55:29 +00001822 size_t len;
1823 int i;
1824 const char *name;
1825 static char target_xml[1024];
1826
1827 len = 0;
1828 while (p[len] && p[len] != ':')
1829 len++;
1830 *newp = p + len;
1831
1832 name = NULL;
1833 if (strncmp(p, "target.xml", len) == 0) {
1834 /* Generate the XML description for this CPU. */
1835 if (!target_xml[0]) {
1836 GDBRegisterState *r;
1837
blueswir15b3715b2008-10-25 11:18:12 +00001838 snprintf(target_xml, sizeof(target_xml),
1839 "<?xml version=\"1.0\"?>"
1840 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1841 "<target>"
1842 "<xi:include href=\"%s\"/>",
1843 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001844
aliguori880a7572008-11-18 20:30:24 +00001845 for (r = first_cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001846 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1847 pstrcat(target_xml, sizeof(target_xml), r->xml);
1848 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001849 }
blueswir12dc766d2009-04-13 16:06:19 +00001850 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001851 }
1852 return target_xml;
1853 }
1854 for (i = 0; ; i++) {
1855 name = xml_builtin[i][0];
1856 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1857 break;
1858 }
1859 return name ? xml_builtin[i][1] : NULL;
1860}
1861#endif
1862
Andreas Färber9349b4f2012-03-14 01:38:32 +01001863static int gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001864{
1865 GDBRegisterState *r;
1866
1867 if (reg < NUM_CORE_REGS)
1868 return cpu_gdb_read_register(env, mem_buf, reg);
1869
1870 for (r = env->gdb_regs; r; r = r->next) {
1871 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1872 return r->get_reg(env, mem_buf, reg - r->base_reg);
1873 }
1874 }
1875 return 0;
1876}
1877
Andreas Färber9349b4f2012-03-14 01:38:32 +01001878static int gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001879{
1880 GDBRegisterState *r;
1881
1882 if (reg < NUM_CORE_REGS)
1883 return cpu_gdb_write_register(env, mem_buf, reg);
1884
1885 for (r = env->gdb_regs; r; r = r->next) {
1886 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1887 return r->set_reg(env, mem_buf, reg - r->base_reg);
1888 }
1889 }
1890 return 0;
1891}
1892
Max Filippovccfcaba2011-09-06 03:55:52 +04001893#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001894/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1895 specifies the first register number and these registers are included in
1896 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1897 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1898 */
1899
Andreas Färber9349b4f2012-03-14 01:38:32 +01001900void gdb_register_coprocessor(CPUArchState * env,
pbrook56aebc82008-10-11 17:55:29 +00001901 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1902 int num_regs, const char *xml, int g_pos)
1903{
1904 GDBRegisterState *s;
1905 GDBRegisterState **p;
1906 static int last_reg = NUM_CORE_REGS;
1907
pbrook56aebc82008-10-11 17:55:29 +00001908 p = &env->gdb_regs;
1909 while (*p) {
1910 /* Check for duplicates. */
1911 if (strcmp((*p)->xml, xml) == 0)
1912 return;
1913 p = &(*p)->next;
1914 }
Stefan Weil9643c252011-10-18 22:25:38 +02001915
1916 s = g_new0(GDBRegisterState, 1);
1917 s->base_reg = last_reg;
1918 s->num_regs = num_regs;
1919 s->get_reg = get_reg;
1920 s->set_reg = set_reg;
1921 s->xml = xml;
1922
pbrook56aebc82008-10-11 17:55:29 +00001923 /* Add to end of list. */
1924 last_reg += num_regs;
1925 *p = s;
1926 if (g_pos) {
1927 if (g_pos != s->base_reg) {
1928 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1929 "Expected %d got %d\n", xml, g_pos, s->base_reg);
1930 } else {
1931 num_g_regs = last_reg;
1932 }
1933 }
1934}
Max Filippovccfcaba2011-09-06 03:55:52 +04001935#endif
pbrook56aebc82008-10-11 17:55:29 +00001936
aliguoria1d1bb32008-11-18 20:07:32 +00001937#ifndef CONFIG_USER_ONLY
1938static const int xlat_gdb_type[] = {
1939 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1940 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1941 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1942};
1943#endif
1944
aliguori880a7572008-11-18 20:30:24 +00001945static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001946{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001947 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001948 int err = 0;
1949
aliguorie22a25c2009-03-12 20:12:48 +00001950 if (kvm_enabled())
1951 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1952
aliguoria1d1bb32008-11-18 20:07:32 +00001953 switch (type) {
1954 case GDB_BREAKPOINT_SW:
1955 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001956 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1957 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1958 if (err)
1959 break;
1960 }
1961 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001962#ifndef CONFIG_USER_ONLY
1963 case GDB_WATCHPOINT_WRITE:
1964 case GDB_WATCHPOINT_READ:
1965 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001966 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1967 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1968 NULL);
1969 if (err)
1970 break;
1971 }
1972 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001973#endif
1974 default:
1975 return -ENOSYS;
1976 }
1977}
1978
aliguori880a7572008-11-18 20:30:24 +00001979static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001980{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001981 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001982 int err = 0;
1983
aliguorie22a25c2009-03-12 20:12:48 +00001984 if (kvm_enabled())
1985 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1986
aliguoria1d1bb32008-11-18 20:07:32 +00001987 switch (type) {
1988 case GDB_BREAKPOINT_SW:
1989 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001990 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1991 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1992 if (err)
1993 break;
1994 }
1995 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001996#ifndef CONFIG_USER_ONLY
1997 case GDB_WATCHPOINT_WRITE:
1998 case GDB_WATCHPOINT_READ:
1999 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00002000 for (env = first_cpu; env != NULL; env = env->next_cpu) {
2001 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
2002 if (err)
2003 break;
2004 }
2005 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00002006#endif
2007 default:
2008 return -ENOSYS;
2009 }
2010}
2011
aliguori880a7572008-11-18 20:30:24 +00002012static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00002013{
Andreas Färber9349b4f2012-03-14 01:38:32 +01002014 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00002015
aliguorie22a25c2009-03-12 20:12:48 +00002016 if (kvm_enabled()) {
2017 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
2018 return;
2019 }
2020
aliguori880a7572008-11-18 20:30:24 +00002021 for (env = first_cpu; env != NULL; env = env->next_cpu) {
2022 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002023#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00002024 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00002025#endif
aliguori880a7572008-11-18 20:30:24 +00002026 }
aliguoria1d1bb32008-11-18 20:07:32 +00002027}
2028
aurel32fab9d282009-04-08 21:29:37 +00002029static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
2030{
Avi Kivity4c0960c2009-08-17 23:19:53 +03002031 cpu_synchronize_state(s->c_cpu);
Peter Maydella896d032012-03-12 06:24:45 +00002032#if defined(TARGET_I386)
aurel32fab9d282009-04-08 21:29:37 +00002033 s->c_cpu->eip = pc;
aurel32fab9d282009-04-08 21:29:37 +00002034#elif defined (TARGET_PPC)
2035 s->c_cpu->nip = pc;
2036#elif defined (TARGET_SPARC)
2037 s->c_cpu->pc = pc;
2038 s->c_cpu->npc = pc + 4;
2039#elif defined (TARGET_ARM)
2040 s->c_cpu->regs[15] = pc;
2041#elif defined (TARGET_SH4)
2042 s->c_cpu->pc = pc;
2043#elif defined (TARGET_MIPS)
Nathan Froydff1d1972009-12-08 08:06:30 -08002044 s->c_cpu->active_tc.PC = pc & ~(target_ulong)1;
2045 if (pc & 1) {
2046 s->c_cpu->hflags |= MIPS_HFLAG_M16;
2047 } else {
2048 s->c_cpu->hflags &= ~(MIPS_HFLAG_M16);
2049 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02002050#elif defined (TARGET_MICROBLAZE)
2051 s->c_cpu->sregs[SR_PC] = pc;
Jia Liufc043552012-07-20 15:50:50 +08002052#elif defined(TARGET_OPENRISC)
2053 s->c_cpu->pc = pc;
aurel32fab9d282009-04-08 21:29:37 +00002054#elif defined (TARGET_CRIS)
2055 s->c_cpu->pc = pc;
2056#elif defined (TARGET_ALPHA)
2057 s->c_cpu->pc = pc;
Alexander Grafafcb0e42009-12-05 12:44:29 +01002058#elif defined (TARGET_S390X)
Alexander Grafafcb0e42009-12-05 12:44:29 +01002059 s->c_cpu->psw.addr = pc;
Michael Walle0c45d3d2011-02-17 23:45:06 +01002060#elif defined (TARGET_LM32)
2061 s->c_cpu->pc = pc;
Max Filippovccfcaba2011-09-06 03:55:52 +04002062#elif defined(TARGET_XTENSA)
2063 s->c_cpu->pc = pc;
aurel32fab9d282009-04-08 21:29:37 +00002064#endif
2065}
2066
Andreas Färber9349b4f2012-03-14 01:38:32 +01002067static CPUArchState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002068{
Andreas Färber9349b4f2012-03-14 01:38:32 +01002069 CPUArchState *env;
Andreas Färber0d342822012-12-17 07:12:13 +01002070 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002071
2072 for (env = first_cpu; env != NULL; env = env->next_cpu) {
Andreas Färber0d342822012-12-17 07:12:13 +01002073 cpu = ENV_GET_CPU(env);
2074 if (cpu_index(cpu) == thread_id) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002075 return env;
2076 }
2077 }
2078
2079 return NULL;
2080}
2081
aliguori880a7572008-11-18 20:30:24 +00002082static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00002083{
Andreas Färber9349b4f2012-03-14 01:38:32 +01002084 CPUArchState *env;
bellardb4608c02003-06-27 17:34:32 +00002085 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002086 uint32_t thread;
2087 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00002088 char buf[MAX_PACKET_LENGTH];
2089 uint8_t mem_buf[MAX_PACKET_LENGTH];
2090 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00002091 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00002092
bellard858693c2004-03-31 18:52:07 +00002093#ifdef DEBUG_GDB
2094 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00002095#endif
bellard858693c2004-03-31 18:52:07 +00002096 p = line_buf;
2097 ch = *p++;
2098 switch(ch) {
2099 case '?':
bellard1fddef42005-04-17 19:16:13 +00002100 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00002101 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber0d342822012-12-17 07:12:13 +01002102 cpu_index(ENV_GET_CPU(s->c_cpu)));
bellard858693c2004-03-31 18:52:07 +00002103 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00002104 /* Remove all the breakpoints when this query is issued,
2105 * because gdb is doing and initial connect and the state
2106 * should be cleaned up.
2107 */
aliguori880a7572008-11-18 20:30:24 +00002108 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00002109 break;
2110 case 'c':
2111 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00002112 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002113 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002114 }
aurel32ca587a82008-12-18 22:44:13 +00002115 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00002116 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002117 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00002118 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00002119 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2120 if (s->signal == -1)
2121 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00002122 gdb_continue(s);
2123 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002124 case 'v':
2125 if (strncmp(p, "Cont", 4) == 0) {
2126 int res_signal, res_thread;
2127
2128 p += 4;
2129 if (*p == '?') {
2130 put_packet(s, "vCont;c;C;s;S");
2131 break;
2132 }
2133 res = 0;
2134 res_signal = 0;
2135 res_thread = 0;
2136 while (*p) {
2137 int action, signal;
2138
2139 if (*p++ != ';') {
2140 res = 0;
2141 break;
2142 }
2143 action = *p++;
2144 signal = 0;
2145 if (action == 'C' || action == 'S') {
2146 signal = strtoul(p, (char **)&p, 16);
2147 } else if (action != 'c' && action != 's') {
2148 res = 0;
2149 break;
2150 }
2151 thread = 0;
2152 if (*p == ':') {
2153 thread = strtoull(p+1, (char **)&p, 16);
2154 }
2155 action = tolower(action);
2156 if (res == 0 || (res == 'c' && action == 's')) {
2157 res = action;
2158 res_signal = signal;
2159 res_thread = thread;
2160 }
2161 }
2162 if (res) {
2163 if (res_thread != -1 && res_thread != 0) {
2164 env = find_cpu(res_thread);
2165 if (env == NULL) {
2166 put_packet(s, "E22");
2167 break;
2168 }
2169 s->c_cpu = env;
2170 }
2171 if (res == 's') {
2172 cpu_single_step(s->c_cpu, sstep_flags);
2173 }
2174 s->signal = res_signal;
2175 gdb_continue(s);
2176 return RS_IDLE;
2177 }
2178 break;
2179 } else {
2180 goto unknown_command;
2181 }
edgar_igl7d03f822008-05-17 18:58:29 +00002182 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002183#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002184 /* Kill the target */
2185 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2186 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002187#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002188 case 'D':
2189 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002190 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002191 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002192 gdb_continue(s);
2193 put_packet(s, "OK");
2194 break;
bellard858693c2004-03-31 18:52:07 +00002195 case 's':
2196 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002197 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002198 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002199 }
aliguori880a7572008-11-18 20:30:24 +00002200 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002201 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002202 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002203 case 'F':
2204 {
2205 target_ulong ret;
2206 target_ulong err;
2207
2208 ret = strtoull(p, (char **)&p, 16);
2209 if (*p == ',') {
2210 p++;
2211 err = strtoull(p, (char **)&p, 16);
2212 } else {
2213 err = 0;
2214 }
2215 if (*p == ',')
2216 p++;
2217 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002218 if (s->current_syscall_cb) {
2219 s->current_syscall_cb(s->c_cpu, ret, err);
2220 s->current_syscall_cb = NULL;
2221 }
pbrooka2d1eba2007-01-28 03:10:55 +00002222 if (type == 'C') {
2223 put_packet(s, "T02");
2224 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002225 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002226 }
2227 }
2228 break;
bellard858693c2004-03-31 18:52:07 +00002229 case 'g':
Avi Kivity4c0960c2009-08-17 23:19:53 +03002230 cpu_synchronize_state(s->g_cpu);
Max Filippovccfcaba2011-09-06 03:55:52 +04002231 env = s->g_cpu;
pbrook56aebc82008-10-11 17:55:29 +00002232 len = 0;
2233 for (addr = 0; addr < num_g_regs; addr++) {
aliguori880a7572008-11-18 20:30:24 +00002234 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002235 len += reg_size;
2236 }
2237 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002238 put_packet(s, buf);
2239 break;
2240 case 'G':
Avi Kivity4c0960c2009-08-17 23:19:53 +03002241 cpu_synchronize_state(s->g_cpu);
Max Filippovccfcaba2011-09-06 03:55:52 +04002242 env = s->g_cpu;
pbrook56aebc82008-10-11 17:55:29 +00002243 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002244 len = strlen(p) / 2;
2245 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00002246 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
aliguori880a7572008-11-18 20:30:24 +00002247 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002248 len -= reg_size;
2249 registers += reg_size;
2250 }
bellard858693c2004-03-31 18:52:07 +00002251 put_packet(s, "OK");
2252 break;
2253 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002254 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002255 if (*p == ',')
2256 p++;
bellard9d9754a2006-06-25 15:32:37 +00002257 len = strtoull(p, NULL, 16);
Fabien Chouteau44520db2011-09-08 12:48:16 +02002258 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002259 put_packet (s, "E14");
2260 } else {
2261 memtohex(buf, mem_buf, len);
2262 put_packet(s, buf);
2263 }
bellard858693c2004-03-31 18:52:07 +00002264 break;
2265 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002266 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002267 if (*p == ',')
2268 p++;
bellard9d9754a2006-06-25 15:32:37 +00002269 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002270 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002271 p++;
2272 hextomem(mem_buf, p, len);
Fabien Chouteau44520db2011-09-08 12:48:16 +02002273 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002274 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002275 } else {
bellard858693c2004-03-31 18:52:07 +00002276 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002277 }
bellard858693c2004-03-31 18:52:07 +00002278 break;
pbrook56aebc82008-10-11 17:55:29 +00002279 case 'p':
2280 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2281 This works, but can be very slow. Anything new enough to
2282 understand XML also knows how to use this properly. */
2283 if (!gdb_has_xml)
2284 goto unknown_command;
2285 addr = strtoull(p, (char **)&p, 16);
aliguori880a7572008-11-18 20:30:24 +00002286 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002287 if (reg_size) {
2288 memtohex(buf, mem_buf, reg_size);
2289 put_packet(s, buf);
2290 } else {
2291 put_packet(s, "E14");
2292 }
2293 break;
2294 case 'P':
2295 if (!gdb_has_xml)
2296 goto unknown_command;
2297 addr = strtoull(p, (char **)&p, 16);
2298 if (*p == '=')
2299 p++;
2300 reg_size = strlen(p) / 2;
2301 hextomem(mem_buf, p, reg_size);
aliguori880a7572008-11-18 20:30:24 +00002302 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002303 put_packet(s, "OK");
2304 break;
bellard858693c2004-03-31 18:52:07 +00002305 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002306 case 'z':
2307 type = strtoul(p, (char **)&p, 16);
2308 if (*p == ',')
2309 p++;
bellard9d9754a2006-06-25 15:32:37 +00002310 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002311 if (*p == ',')
2312 p++;
bellard9d9754a2006-06-25 15:32:37 +00002313 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002314 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002315 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002316 else
aliguori880a7572008-11-18 20:30:24 +00002317 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002318 if (res >= 0)
2319 put_packet(s, "OK");
2320 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002321 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002322 else
2323 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002324 break;
aliguori880a7572008-11-18 20:30:24 +00002325 case 'H':
2326 type = *p++;
2327 thread = strtoull(p, (char **)&p, 16);
2328 if (thread == -1 || thread == 0) {
2329 put_packet(s, "OK");
2330 break;
2331 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002332 env = find_cpu(thread);
aliguori880a7572008-11-18 20:30:24 +00002333 if (env == NULL) {
2334 put_packet(s, "E22");
2335 break;
2336 }
2337 switch (type) {
2338 case 'c':
2339 s->c_cpu = env;
2340 put_packet(s, "OK");
2341 break;
2342 case 'g':
2343 s->g_cpu = env;
2344 put_packet(s, "OK");
2345 break;
2346 default:
2347 put_packet(s, "E22");
2348 break;
2349 }
2350 break;
2351 case 'T':
2352 thread = strtoull(p, (char **)&p, 16);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002353 env = find_cpu(thread);
2354
2355 if (env != NULL) {
2356 put_packet(s, "OK");
2357 } else {
aliguori880a7572008-11-18 20:30:24 +00002358 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002359 }
aliguori880a7572008-11-18 20:30:24 +00002360 break;
pbrook978efd62006-06-17 18:30:42 +00002361 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002362 case 'Q':
2363 /* parse any 'q' packets here */
2364 if (!strcmp(p,"qemu.sstepbits")) {
2365 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002366 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2367 SSTEP_ENABLE,
2368 SSTEP_NOIRQ,
2369 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002370 put_packet(s, buf);
2371 break;
2372 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2373 /* Display or change the sstep_flags */
2374 p += 10;
2375 if (*p != '=') {
2376 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002377 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002378 put_packet(s, buf);
2379 break;
2380 }
2381 p++;
2382 type = strtoul(p, (char **)&p, 16);
2383 sstep_flags = type;
2384 put_packet(s, "OK");
2385 break;
aliguori880a7572008-11-18 20:30:24 +00002386 } else if (strcmp(p,"C") == 0) {
2387 /* "Current thread" remains vague in the spec, so always return
2388 * the first CPU (gdb returns the first thread). */
2389 put_packet(s, "QC1");
2390 break;
2391 } else if (strcmp(p,"fThreadInfo") == 0) {
2392 s->query_cpu = first_cpu;
2393 goto report_cpuinfo;
2394 } else if (strcmp(p,"sThreadInfo") == 0) {
2395 report_cpuinfo:
2396 if (s->query_cpu) {
Andreas Färber0d342822012-12-17 07:12:13 +01002397 snprintf(buf, sizeof(buf), "m%x",
2398 cpu_index(ENV_GET_CPU(s->query_cpu)));
aliguori880a7572008-11-18 20:30:24 +00002399 put_packet(s, buf);
2400 s->query_cpu = s->query_cpu->next_cpu;
2401 } else
2402 put_packet(s, "l");
2403 break;
2404 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2405 thread = strtoull(p+16, (char **)&p, 16);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002406 env = find_cpu(thread);
2407 if (env != NULL) {
Andreas Färber55e5c282012-12-17 06:18:02 +01002408 CPUState *cpu = ENV_GET_CPU(env);
Avi Kivity4c0960c2009-08-17 23:19:53 +03002409 cpu_synchronize_state(env);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002410 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01002411 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01002412 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002413 memtohex(buf, mem_buf, len);
2414 put_packet(s, buf);
2415 }
aliguori880a7572008-11-18 20:30:24 +00002416 break;
edgar_igl60897d32008-05-09 08:25:14 +00002417 }
blueswir10b8a9882009-03-07 10:51:36 +00002418#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002419 else if (strncmp(p, "Offsets", 7) == 0) {
aliguori880a7572008-11-18 20:30:24 +00002420 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00002421
blueswir1363a37d2008-08-21 17:58:08 +00002422 snprintf(buf, sizeof(buf),
2423 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2424 ";Bss=" TARGET_ABI_FMT_lx,
2425 ts->info->code_offset,
2426 ts->info->data_offset,
2427 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002428 put_packet(s, buf);
2429 break;
2430 }
blueswir10b8a9882009-03-07 10:51:36 +00002431#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002432 else if (strncmp(p, "Rcmd,", 5) == 0) {
2433 int len = strlen(p + 5);
2434
2435 if ((len % 2) != 0) {
2436 put_packet(s, "E01");
2437 break;
2438 }
2439 hextomem(mem_buf, p + 5, len);
2440 len = len / 2;
2441 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002442 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002443 put_packet(s, "OK");
2444 break;
2445 }
blueswir10b8a9882009-03-07 10:51:36 +00002446#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002447 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002448 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002449#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002450 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002451#endif
2452 put_packet(s, buf);
2453 break;
2454 }
2455#ifdef GDB_CORE_XML
2456 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2457 const char *xml;
2458 target_ulong total_len;
2459
2460 gdb_has_xml = 1;
2461 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002462 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002463 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002464 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002465 put_packet(s, buf);
2466 break;
2467 }
2468
2469 if (*p == ':')
2470 p++;
2471 addr = strtoul(p, (char **)&p, 16);
2472 if (*p == ',')
2473 p++;
2474 len = strtoul(p, (char **)&p, 16);
2475
2476 total_len = strlen(xml);
2477 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002478 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002479 put_packet(s, buf);
2480 break;
2481 }
2482 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2483 len = (MAX_PACKET_LENGTH - 5) / 2;
2484 if (len < total_len - addr) {
2485 buf[0] = 'm';
2486 len = memtox(buf + 1, xml + addr, len);
2487 } else {
2488 buf[0] = 'l';
2489 len = memtox(buf + 1, xml + addr, total_len - addr);
2490 }
2491 put_packet_binary(s, buf, len + 1);
2492 break;
2493 }
2494#endif
2495 /* Unrecognised 'q' command. */
2496 goto unknown_command;
2497
bellard858693c2004-03-31 18:52:07 +00002498 default:
pbrook56aebc82008-10-11 17:55:29 +00002499 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002500 /* put empty packet */
2501 buf[0] = '\0';
2502 put_packet(s, buf);
2503 break;
2504 }
2505 return RS_IDLE;
2506}
2507
Andreas Färber9349b4f2012-03-14 01:38:32 +01002508void gdb_set_stop_cpu(CPUArchState *env)
aliguori880a7572008-11-18 20:30:24 +00002509{
2510 gdbserver_state->c_cpu = env;
2511 gdbserver_state->g_cpu = env;
2512}
2513
bellard1fddef42005-04-17 19:16:13 +00002514#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002515static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002516{
aliguori880a7572008-11-18 20:30:24 +00002517 GDBState *s = gdbserver_state;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002518 CPUArchState *env = s->c_cpu;
Andreas Färber0d342822012-12-17 07:12:13 +01002519 CPUState *cpu = ENV_GET_CPU(env);
bellard858693c2004-03-31 18:52:07 +00002520 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002521 const char *type;
bellard858693c2004-03-31 18:52:07 +00002522 int ret;
2523
Meador Ingecdb432b2012-03-15 17:49:45 +00002524 if (running || s->state == RS_INACTIVE) {
2525 return;
2526 }
2527 /* Is there a GDB syscall waiting to be sent? */
2528 if (s->current_syscall_cb) {
2529 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002530 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002531 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002532 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002533 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002534 if (env->watchpoint_hit) {
2535 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002536 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002537 type = "r";
2538 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002539 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002540 type = "a";
2541 break;
2542 default:
2543 type = "";
2544 break;
2545 }
aliguori880a7572008-11-18 20:30:24 +00002546 snprintf(buf, sizeof(buf),
2547 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002548 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002549 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002550 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002551 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002552 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002553 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002554 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002555 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002556 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002557 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002558 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002559 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002560 ret = GDB_SIGNAL_QUIT;
2561 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002562 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002563 ret = GDB_SIGNAL_IO;
2564 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002565 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002566 ret = GDB_SIGNAL_ALRM;
2567 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002568 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002569 ret = GDB_SIGNAL_ABRT;
2570 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002571 case RUN_STATE_SAVE_VM:
2572 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002573 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002574 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002575 ret = GDB_SIGNAL_XCPU;
2576 break;
2577 default:
2578 ret = GDB_SIGNAL_UNKNOWN;
2579 break;
bellardbbeb7b52006-04-23 18:42:15 +00002580 }
Andreas Färber0d342822012-12-17 07:12:13 +01002581 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002582
2583send_packet:
bellard858693c2004-03-31 18:52:07 +00002584 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002585
2586 /* disable single step if it was enabled */
2587 cpu_single_step(env, 0);
bellard858693c2004-03-31 18:52:07 +00002588}
bellard1fddef42005-04-17 19:16:13 +00002589#endif
bellard858693c2004-03-31 18:52:07 +00002590
pbrooka2d1eba2007-01-28 03:10:55 +00002591/* Send a gdb syscall request.
2592 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002593 %x - target_ulong argument printed in hex.
2594 %lx - 64-bit argument printed in hex.
2595 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002596void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002597{
2598 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002599 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002600 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002601 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002602 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002603 GDBState *s;
2604
aliguori880a7572008-11-18 20:30:24 +00002605 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002606 if (!s)
2607 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002608 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002609#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002610 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002611#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002612 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002613 p = s->syscall_buf;
2614 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002615 *(p++) = 'F';
2616 while (*fmt) {
2617 if (*fmt == '%') {
2618 fmt++;
2619 switch (*fmt++) {
2620 case 'x':
2621 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002622 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002623 break;
pbrooka87295e2007-05-26 15:09:38 +00002624 case 'l':
2625 if (*(fmt++) != 'x')
2626 goto bad_format;
2627 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002628 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002629 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002630 case 's':
2631 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002632 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002633 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002634 break;
2635 default:
pbrooka87295e2007-05-26 15:09:38 +00002636 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002637 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2638 fmt - 1);
2639 break;
2640 }
2641 } else {
2642 *(p++) = *(fmt++);
2643 }
2644 }
pbrook8a93e022007-08-06 13:19:15 +00002645 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002646 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002647#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002648 put_packet(s, s->syscall_buf);
aliguori880a7572008-11-18 20:30:24 +00002649 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002650#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002651 /* In this case wait to send the syscall packet until notification that
2652 the CPU has stopped. This must be done because if the packet is sent
2653 now the reply from the syscall request could be received while the CPU
2654 is still in the running state, which can cause packets to be dropped
2655 and state transition 'T' packets to be sent while the syscall is still
2656 being processed. */
aurel323098dba2009-03-07 21:28:24 +00002657 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002658#endif
2659}
2660
bellard6a00d602005-11-21 23:25:50 +00002661static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002662{
2663 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002664 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002665
bellard1fddef42005-04-17 19:16:13 +00002666#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002667 if (s->last_packet_len) {
2668 /* Waiting for a response to the last packet. If we see the start
2669 of a new command then abandon the previous response. */
2670 if (ch == '-') {
2671#ifdef DEBUG_GDB
2672 printf("Got NACK, retransmitting\n");
2673#endif
thsffe8ab82007-12-16 03:16:05 +00002674 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002675 }
2676#ifdef DEBUG_GDB
2677 else if (ch == '+')
2678 printf("Got ACK\n");
2679 else
2680 printf("Got '%c' when expecting ACK/NACK\n", ch);
2681#endif
2682 if (ch == '+' || ch == '$')
2683 s->last_packet_len = 0;
2684 if (ch != '$')
2685 return;
2686 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002687 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002688 /* when the CPU is running, we cannot do anything except stop
2689 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002690 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002691 } else
bellard1fddef42005-04-17 19:16:13 +00002692#endif
bellard41625032005-04-24 10:07:11 +00002693 {
bellard858693c2004-03-31 18:52:07 +00002694 switch(s->state) {
2695 case RS_IDLE:
2696 if (ch == '$') {
2697 s->line_buf_index = 0;
2698 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002699 }
2700 break;
bellard858693c2004-03-31 18:52:07 +00002701 case RS_GETLINE:
2702 if (ch == '#') {
2703 s->state = RS_CHKSUM1;
2704 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2705 s->state = RS_IDLE;
2706 } else {
2707 s->line_buf[s->line_buf_index++] = ch;
2708 }
2709 break;
2710 case RS_CHKSUM1:
2711 s->line_buf[s->line_buf_index] = '\0';
2712 s->line_csum = fromhex(ch) << 4;
2713 s->state = RS_CHKSUM2;
2714 break;
2715 case RS_CHKSUM2:
2716 s->line_csum |= fromhex(ch);
2717 csum = 0;
2718 for(i = 0; i < s->line_buf_index; i++) {
2719 csum += s->line_buf[i];
2720 }
2721 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002722 reply = '-';
2723 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002724 s->state = RS_IDLE;
2725 } else {
ths60fe76f2007-12-16 03:02:09 +00002726 reply = '+';
2727 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002728 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002729 }
bellardb4608c02003-06-27 17:34:32 +00002730 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002731 default:
2732 abort();
bellardb4608c02003-06-27 17:34:32 +00002733 }
2734 }
bellard858693c2004-03-31 18:52:07 +00002735}
2736
Paul Brook0e1c9c52010-06-16 13:03:51 +01002737/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002738void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002739{
2740 GDBState *s;
2741 char buf[4];
2742
2743 s = gdbserver_state;
2744 if (!s) {
2745 return;
2746 }
2747#ifdef CONFIG_USER_ONLY
2748 if (gdbserver_fd < 0 || s->fd < 0) {
2749 return;
2750 }
2751#endif
2752
2753 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2754 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002755
2756#ifndef CONFIG_USER_ONLY
2757 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002758 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002759 }
2760#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002761}
2762
bellard1fddef42005-04-17 19:16:13 +00002763#ifdef CONFIG_USER_ONLY
2764int
aurel32ca587a82008-12-18 22:44:13 +00002765gdb_queuesig (void)
2766{
2767 GDBState *s;
2768
2769 s = gdbserver_state;
2770
2771 if (gdbserver_fd < 0 || s->fd < 0)
2772 return 0;
2773 else
2774 return 1;
2775}
2776
2777int
Andreas Färber9349b4f2012-03-14 01:38:32 +01002778gdb_handlesig (CPUArchState *env, int sig)
bellard1fddef42005-04-17 19:16:13 +00002779{
2780 GDBState *s;
2781 char buf[256];
2782 int n;
2783
aliguori880a7572008-11-18 20:30:24 +00002784 s = gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00002785 if (gdbserver_fd < 0 || s->fd < 0)
2786 return sig;
bellard1fddef42005-04-17 19:16:13 +00002787
2788 /* disable single step if it was enabled */
2789 cpu_single_step(env, 0);
2790 tb_flush(env);
2791
2792 if (sig != 0)
2793 {
aurel32ca587a82008-12-18 22:44:13 +00002794 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb (sig));
bellard1fddef42005-04-17 19:16:13 +00002795 put_packet(s, buf);
2796 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002797 /* put_packet() might have detected that the peer terminated the
2798 connection. */
2799 if (s->fd < 0)
2800 return sig;
bellard1fddef42005-04-17 19:16:13 +00002801
bellard1fddef42005-04-17 19:16:13 +00002802 sig = 0;
2803 s->state = RS_IDLE;
bellard41625032005-04-24 10:07:11 +00002804 s->running_state = 0;
2805 while (s->running_state == 0) {
bellard1fddef42005-04-17 19:16:13 +00002806 n = read (s->fd, buf, 256);
2807 if (n > 0)
2808 {
2809 int i;
2810
2811 for (i = 0; i < n; i++)
bellard6a00d602005-11-21 23:25:50 +00002812 gdb_read_byte (s, buf[i]);
bellard1fddef42005-04-17 19:16:13 +00002813 }
2814 else if (n == 0 || errno != EAGAIN)
2815 {
Stefan Weile7d81002011-12-10 00:19:46 +01002816 /* XXX: Connection closed. Should probably wait for another
bellard1fddef42005-04-17 19:16:13 +00002817 connection before continuing. */
2818 return sig;
2819 }
bellard41625032005-04-24 10:07:11 +00002820 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002821 sig = s->signal;
2822 s->signal = 0;
bellard1fddef42005-04-17 19:16:13 +00002823 return sig;
2824}
bellarde9009672005-04-26 20:42:36 +00002825
aurel32ca587a82008-12-18 22:44:13 +00002826/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002827void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002828{
2829 GDBState *s;
2830 char buf[4];
2831
2832 s = gdbserver_state;
2833 if (gdbserver_fd < 0 || s->fd < 0)
2834 return;
2835
2836 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb (sig));
2837 put_packet(s, buf);
2838}
bellard1fddef42005-04-17 19:16:13 +00002839
aliguori880a7572008-11-18 20:30:24 +00002840static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002841{
2842 GDBState *s;
2843 struct sockaddr_in sockaddr;
2844 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002845 int fd;
bellard858693c2004-03-31 18:52:07 +00002846
2847 for(;;) {
2848 len = sizeof(sockaddr);
2849 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2850 if (fd < 0 && errno != EINTR) {
2851 perror("accept");
2852 return;
2853 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002854#ifndef _WIN32
2855 fcntl(fd, F_SETFD, FD_CLOEXEC);
2856#endif
bellard858693c2004-03-31 18:52:07 +00002857 break;
2858 }
2859 }
2860
2861 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002862 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002863
Anthony Liguori7267c092011-08-20 22:09:37 -05002864 s = g_malloc0(sizeof(GDBState));
aliguori880a7572008-11-18 20:30:24 +00002865 s->c_cpu = first_cpu;
2866 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002867 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002868 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002869
aliguori880a7572008-11-18 20:30:24 +00002870 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002871
bellard858693c2004-03-31 18:52:07 +00002872 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002873}
2874
2875static int gdbserver_open(int port)
2876{
2877 struct sockaddr_in sockaddr;
2878 int fd, val, ret;
2879
2880 fd = socket(PF_INET, SOCK_STREAM, 0);
2881 if (fd < 0) {
2882 perror("socket");
2883 return -1;
2884 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002885#ifndef _WIN32
2886 fcntl(fd, F_SETFD, FD_CLOEXEC);
2887#endif
bellard858693c2004-03-31 18:52:07 +00002888
2889 /* allow fast reuse */
2890 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002891 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002892
2893 sockaddr.sin_family = AF_INET;
2894 sockaddr.sin_port = htons(port);
2895 sockaddr.sin_addr.s_addr = 0;
2896 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2897 if (ret < 0) {
2898 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002899 close(fd);
bellard858693c2004-03-31 18:52:07 +00002900 return -1;
2901 }
2902 ret = listen(fd, 0);
2903 if (ret < 0) {
2904 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002905 close(fd);
bellard858693c2004-03-31 18:52:07 +00002906 return -1;
2907 }
bellard858693c2004-03-31 18:52:07 +00002908 return fd;
2909}
2910
2911int gdbserver_start(int port)
2912{
2913 gdbserver_fd = gdbserver_open(port);
2914 if (gdbserver_fd < 0)
2915 return -1;
2916 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002917 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002918 return 0;
2919}
aurel322b1319c2008-12-18 22:44:04 +00002920
2921/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002922void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002923{
2924 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002925 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002926 return;
2927 close(s->fd);
2928 s->fd = -1;
2929 cpu_breakpoint_remove_all(env, BP_GDB);
2930 cpu_watchpoint_remove_all(env, BP_GDB);
2931}
pbrook4046d912007-01-28 01:53:16 +00002932#else
thsaa1f17c2007-07-11 22:48:58 +00002933static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002934{
pbrook56aebc82008-10-11 17:55:29 +00002935 /* We can handle an arbitrarily large amount of data.
2936 Pick the maximum packet size, which is as good as anything. */
2937 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002938}
2939
thsaa1f17c2007-07-11 22:48:58 +00002940static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002941{
pbrook4046d912007-01-28 01:53:16 +00002942 int i;
2943
2944 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002945 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002946 }
2947}
2948
2949static void gdb_chr_event(void *opaque, int event)
2950{
2951 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302952 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002953 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002954 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002955 break;
2956 default:
2957 break;
2958 }
2959}
2960
aliguori8a34a0f2009-03-05 23:01:55 +00002961static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2962{
2963 char buf[MAX_PACKET_LENGTH];
2964
2965 buf[0] = 'O';
2966 if (len > (MAX_PACKET_LENGTH/2) - 1)
2967 len = (MAX_PACKET_LENGTH/2) - 1;
2968 memtohex(buf + 1, (uint8_t *)msg, len);
2969 put_packet(s, buf);
2970}
2971
2972static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2973{
2974 const char *p = (const char *)buf;
2975 int max_sz;
2976
2977 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2978 for (;;) {
2979 if (len <= max_sz) {
2980 gdb_monitor_output(gdbserver_state, p, len);
2981 break;
2982 }
2983 gdb_monitor_output(gdbserver_state, p, max_sz);
2984 p += max_sz;
2985 len -= max_sz;
2986 }
2987 return len;
2988}
2989
aliguori59030a82009-04-05 18:43:41 +00002990#ifndef _WIN32
2991static void gdb_sigterm_handler(int signal)
2992{
Luiz Capitulino13548692011-07-29 15:36:43 -03002993 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002994 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002995 }
aliguori59030a82009-04-05 18:43:41 +00002996}
2997#endif
2998
2999int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00003000{
3001 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00003002 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00003003 CharDriverState *chr = NULL;
3004 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00003005
aliguori59030a82009-04-05 18:43:41 +00003006 if (!device)
3007 return -1;
3008 if (strcmp(device, "none") != 0) {
3009 if (strstart(device, "tcp:", NULL)) {
3010 /* enforce required TCP attributes */
3011 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
3012 "%s,nowait,nodelay,server", device);
3013 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00003014 }
aliguori59030a82009-04-05 18:43:41 +00003015#ifndef _WIN32
3016 else if (strcmp(device, "stdio") == 0) {
3017 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00003018
aliguori59030a82009-04-05 18:43:41 +00003019 memset(&act, 0, sizeof(act));
3020 act.sa_handler = gdb_sigterm_handler;
3021 sigaction(SIGINT, &act, NULL);
3022 }
3023#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05003024 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00003025 if (!chr)
3026 return -1;
3027
Hans de Goede456d6062013-03-27 20:29:40 +01003028 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00003029 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
3030 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00003031 }
3032
aliguori36556b22009-03-28 18:05:53 +00003033 s = gdbserver_state;
3034 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003035 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00003036 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00003037
aliguori36556b22009-03-28 18:05:53 +00003038 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3039
3040 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05003041 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00003042 mon_chr->chr_write = gdb_monitor_write;
3043 monitor_init(mon_chr, 0);
3044 } else {
3045 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05003046 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00003047 mon_chr = s->mon_chr;
3048 memset(s, 0, sizeof(GDBState));
3049 }
aliguori880a7572008-11-18 20:30:24 +00003050 s->c_cpu = first_cpu;
3051 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00003052 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00003053 s->state = chr ? RS_IDLE : RS_INACTIVE;
3054 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00003055 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00003056
pbrook4046d912007-01-28 01:53:16 +00003057 return 0;
3058}
3059#endif