blob: 6a77a6696b4c62c1f29b114f0db5155362cd55e8 [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
aliguori8a34a0f2009-03-05 23:01:55 +000032#include "monitor.h"
pbrook87ecb682007-11-17 17:14:51 +000033#include "qemu-char.h"
34#include "sysemu.h"
35#include "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"
bellard8f447cc2006-06-14 15:21:14 +000041#include "qemu_socket.h"
aliguorie22a25c2009-03-12 20:12:48 +000042#include "kvm.h"
aurel32ca587a82008-12-18 22:44:13 +000043
Fabien Chouteau44520db2011-09-08 12:48:16 +020044#ifndef TARGET_CPU_MEMORY_RW_DEBUG
Andreas Färber9349b4f2012-03-14 01:38:32 +010045static inline int target_memory_rw_debug(CPUArchState *env, target_ulong addr,
Fabien Chouteau44520db2011-09-08 12:48:16 +020046 uint8_t *buf, int len, int is_write)
47{
48 return cpu_memory_rw_debug(env, addr, buf, len, is_write);
49}
50#else
51/* target_memory_rw_debug() defined in cpu.h */
52#endif
aurel32ca587a82008-12-18 22:44:13 +000053
54enum {
55 GDB_SIGNAL_0 = 0,
56 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010057 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000058 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010059 GDB_SIGNAL_ABRT = 6,
60 GDB_SIGNAL_ALRM = 14,
61 GDB_SIGNAL_IO = 23,
62 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000063 GDB_SIGNAL_UNKNOWN = 143
64};
65
66#ifdef CONFIG_USER_ONLY
67
68/* Map target signal numbers to GDB protocol signal numbers and vice
69 * versa. For user emulation's currently supported systems, we can
70 * assume most signals are defined.
71 */
72
73static int gdb_signal_table[] = {
74 0,
75 TARGET_SIGHUP,
76 TARGET_SIGINT,
77 TARGET_SIGQUIT,
78 TARGET_SIGILL,
79 TARGET_SIGTRAP,
80 TARGET_SIGABRT,
81 -1, /* SIGEMT */
82 TARGET_SIGFPE,
83 TARGET_SIGKILL,
84 TARGET_SIGBUS,
85 TARGET_SIGSEGV,
86 TARGET_SIGSYS,
87 TARGET_SIGPIPE,
88 TARGET_SIGALRM,
89 TARGET_SIGTERM,
90 TARGET_SIGURG,
91 TARGET_SIGSTOP,
92 TARGET_SIGTSTP,
93 TARGET_SIGCONT,
94 TARGET_SIGCHLD,
95 TARGET_SIGTTIN,
96 TARGET_SIGTTOU,
97 TARGET_SIGIO,
98 TARGET_SIGXCPU,
99 TARGET_SIGXFSZ,
100 TARGET_SIGVTALRM,
101 TARGET_SIGPROF,
102 TARGET_SIGWINCH,
103 -1, /* SIGLOST */
104 TARGET_SIGUSR1,
105 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000106#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000107 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000108#else
109 -1,
110#endif
aurel32ca587a82008-12-18 22:44:13 +0000111 -1, /* SIGPOLL */
112 -1,
113 -1,
114 -1,
115 -1,
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000123#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000124 __SIGRTMIN + 1,
125 __SIGRTMIN + 2,
126 __SIGRTMIN + 3,
127 __SIGRTMIN + 4,
128 __SIGRTMIN + 5,
129 __SIGRTMIN + 6,
130 __SIGRTMIN + 7,
131 __SIGRTMIN + 8,
132 __SIGRTMIN + 9,
133 __SIGRTMIN + 10,
134 __SIGRTMIN + 11,
135 __SIGRTMIN + 12,
136 __SIGRTMIN + 13,
137 __SIGRTMIN + 14,
138 __SIGRTMIN + 15,
139 __SIGRTMIN + 16,
140 __SIGRTMIN + 17,
141 __SIGRTMIN + 18,
142 __SIGRTMIN + 19,
143 __SIGRTMIN + 20,
144 __SIGRTMIN + 21,
145 __SIGRTMIN + 22,
146 __SIGRTMIN + 23,
147 __SIGRTMIN + 24,
148 __SIGRTMIN + 25,
149 __SIGRTMIN + 26,
150 __SIGRTMIN + 27,
151 __SIGRTMIN + 28,
152 __SIGRTMIN + 29,
153 __SIGRTMIN + 30,
154 __SIGRTMIN + 31,
155 -1, /* SIGCANCEL */
156 __SIGRTMIN,
157 __SIGRTMIN + 32,
158 __SIGRTMIN + 33,
159 __SIGRTMIN + 34,
160 __SIGRTMIN + 35,
161 __SIGRTMIN + 36,
162 __SIGRTMIN + 37,
163 __SIGRTMIN + 38,
164 __SIGRTMIN + 39,
165 __SIGRTMIN + 40,
166 __SIGRTMIN + 41,
167 __SIGRTMIN + 42,
168 __SIGRTMIN + 43,
169 __SIGRTMIN + 44,
170 __SIGRTMIN + 45,
171 __SIGRTMIN + 46,
172 __SIGRTMIN + 47,
173 __SIGRTMIN + 48,
174 __SIGRTMIN + 49,
175 __SIGRTMIN + 50,
176 __SIGRTMIN + 51,
177 __SIGRTMIN + 52,
178 __SIGRTMIN + 53,
179 __SIGRTMIN + 54,
180 __SIGRTMIN + 55,
181 __SIGRTMIN + 56,
182 __SIGRTMIN + 57,
183 __SIGRTMIN + 58,
184 __SIGRTMIN + 59,
185 __SIGRTMIN + 60,
186 __SIGRTMIN + 61,
187 __SIGRTMIN + 62,
188 __SIGRTMIN + 63,
189 __SIGRTMIN + 64,
190 __SIGRTMIN + 65,
191 __SIGRTMIN + 66,
192 __SIGRTMIN + 67,
193 __SIGRTMIN + 68,
194 __SIGRTMIN + 69,
195 __SIGRTMIN + 70,
196 __SIGRTMIN + 71,
197 __SIGRTMIN + 72,
198 __SIGRTMIN + 73,
199 __SIGRTMIN + 74,
200 __SIGRTMIN + 75,
201 __SIGRTMIN + 76,
202 __SIGRTMIN + 77,
203 __SIGRTMIN + 78,
204 __SIGRTMIN + 79,
205 __SIGRTMIN + 80,
206 __SIGRTMIN + 81,
207 __SIGRTMIN + 82,
208 __SIGRTMIN + 83,
209 __SIGRTMIN + 84,
210 __SIGRTMIN + 85,
211 __SIGRTMIN + 86,
212 __SIGRTMIN + 87,
213 __SIGRTMIN + 88,
214 __SIGRTMIN + 89,
215 __SIGRTMIN + 90,
216 __SIGRTMIN + 91,
217 __SIGRTMIN + 92,
218 __SIGRTMIN + 93,
219 __SIGRTMIN + 94,
220 __SIGRTMIN + 95,
221 -1, /* SIGINFO */
222 -1, /* UNKNOWN */
223 -1, /* DEFAULT */
224 -1,
225 -1,
226 -1,
227 -1,
228 -1,
229 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000230#endif
aurel32ca587a82008-12-18 22:44:13 +0000231};
bellard8f447cc2006-06-14 15:21:14 +0000232#else
aurel32ca587a82008-12-18 22:44:13 +0000233/* In system mode we only need SIGINT and SIGTRAP; other signals
234 are not yet supported. */
235
236enum {
237 TARGET_SIGINT = 2,
238 TARGET_SIGTRAP = 5
239};
240
241static int gdb_signal_table[] = {
242 -1,
243 -1,
244 TARGET_SIGINT,
245 -1,
246 -1,
247 TARGET_SIGTRAP
248};
bellard8f447cc2006-06-14 15:21:14 +0000249#endif
bellardb4608c02003-06-27 17:34:32 +0000250
aurel32ca587a82008-12-18 22:44:13 +0000251#ifdef CONFIG_USER_ONLY
252static int target_signal_to_gdb (int sig)
253{
254 int i;
255 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
256 if (gdb_signal_table[i] == sig)
257 return i;
258 return GDB_SIGNAL_UNKNOWN;
259}
260#endif
261
262static int gdb_signal_to_target (int sig)
263{
264 if (sig < ARRAY_SIZE (gdb_signal_table))
265 return gdb_signal_table[sig];
266 else
267 return -1;
268}
269
bellard4abe6152003-07-26 18:01:58 +0000270//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000271
pbrook56aebc82008-10-11 17:55:29 +0000272typedef struct GDBRegisterState {
273 int base_reg;
274 int num_regs;
275 gdb_reg_cb get_reg;
276 gdb_reg_cb set_reg;
277 const char *xml;
278 struct GDBRegisterState *next;
279} GDBRegisterState;
280
bellard858693c2004-03-31 18:52:07 +0000281enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000282 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000283 RS_IDLE,
284 RS_GETLINE,
285 RS_CHKSUM1,
286 RS_CHKSUM2,
287};
bellard858693c2004-03-31 18:52:07 +0000288typedef struct GDBState {
Andreas Färber9349b4f2012-03-14 01:38:32 +0100289 CPUArchState *c_cpu; /* current CPU for step/continue ops */
290 CPUArchState *g_cpu; /* current CPU for other ops */
291 CPUArchState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000292 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000293 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000294 int line_buf_index;
295 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000296 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000297 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000298 int signal;
bellard41625032005-04-24 10:07:11 +0000299#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000300 int fd;
bellard41625032005-04-24 10:07:11 +0000301 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000302#else
303 CharDriverState *chr;
aliguori8a34a0f2009-03-05 23:01:55 +0000304 CharDriverState *mon_chr;
bellard41625032005-04-24 10:07:11 +0000305#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000306 char syscall_buf[256];
307 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000308} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000309
edgar_igl60897d32008-05-09 08:25:14 +0000310/* By default use no IRQs and no timers while single stepping so as to
311 * make single stepping like an ICE HW step.
312 */
313static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
314
aliguori880a7572008-11-18 20:30:24 +0000315static GDBState *gdbserver_state;
316
pbrook56aebc82008-10-11 17:55:29 +0000317/* This is an ugly hack to cope with both new and old gdb.
318 If gdb sends qXfer:features:read then assume we're talking to a newish
319 gdb that understands target descriptions. */
320static int gdb_has_xml;
321
bellard1fddef42005-04-17 19:16:13 +0000322#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000323/* XXX: This is not thread safe. Do we care? */
324static int gdbserver_fd = -1;
325
bellard858693c2004-03-31 18:52:07 +0000326static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000327{
328 uint8_t ch;
329 int ret;
330
331 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000332 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000333 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000334 if (errno == ECONNRESET)
335 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000336 if (errno != EINTR && errno != EAGAIN)
337 return -1;
338 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000339 close(s->fd);
340 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000341 return -1;
342 } else {
343 break;
344 }
345 }
346 return ch;
347}
pbrook4046d912007-01-28 01:53:16 +0000348#endif
bellardb4608c02003-06-27 17:34:32 +0000349
blueswir1654efcf2009-04-18 07:29:59 +0000350static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000351 GDB_SYS_UNKNOWN,
352 GDB_SYS_ENABLED,
353 GDB_SYS_DISABLED,
354} gdb_syscall_mode;
355
356/* If gdb is connected when the first semihosting syscall occurs then use
357 remote gdb syscalls. Otherwise use native file IO. */
358int use_gdb_syscalls(void)
359{
360 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000361 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
362 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000363 }
364 return gdb_syscall_mode == GDB_SYS_ENABLED;
365}
366
edgar_iglba70a622008-03-14 06:10:42 +0000367/* Resume execution. */
368static inline void gdb_continue(GDBState *s)
369{
370#ifdef CONFIG_USER_ONLY
371 s->running_state = 1;
372#else
373 vm_start();
374#endif
375}
376
bellard858693c2004-03-31 18:52:07 +0000377static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000378{
pbrook4046d912007-01-28 01:53:16 +0000379#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000380 int ret;
381
382 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000383 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000384 if (ret < 0) {
385 if (errno != EINTR && errno != EAGAIN)
386 return;
387 } else {
388 buf += ret;
389 len -= ret;
390 }
391 }
pbrook4046d912007-01-28 01:53:16 +0000392#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500393 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000394#endif
bellardb4608c02003-06-27 17:34:32 +0000395}
396
397static inline int fromhex(int v)
398{
399 if (v >= '0' && v <= '9')
400 return v - '0';
401 else if (v >= 'A' && v <= 'F')
402 return v - 'A' + 10;
403 else if (v >= 'a' && v <= 'f')
404 return v - 'a' + 10;
405 else
406 return 0;
407}
408
409static inline int tohex(int v)
410{
411 if (v < 10)
412 return v + '0';
413 else
414 return v - 10 + 'a';
415}
416
417static void memtohex(char *buf, const uint8_t *mem, int len)
418{
419 int i, c;
420 char *q;
421 q = buf;
422 for(i = 0; i < len; i++) {
423 c = mem[i];
424 *q++ = tohex(c >> 4);
425 *q++ = tohex(c & 0xf);
426 }
427 *q = '\0';
428}
429
430static void hextomem(uint8_t *mem, const char *buf, int len)
431{
432 int i;
433
434 for(i = 0; i < len; i++) {
435 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
436 buf += 2;
437 }
438}
439
bellardb4608c02003-06-27 17:34:32 +0000440/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000441static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000442{
pbrook56aebc82008-10-11 17:55:29 +0000443 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000444 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000445
bellardb4608c02003-06-27 17:34:32 +0000446 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000447 p = s->last_packet;
448 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000449 memcpy(p, buf, len);
450 p += len;
bellardb4608c02003-06-27 17:34:32 +0000451 csum = 0;
452 for(i = 0; i < len; i++) {
453 csum += buf[i];
454 }
pbrook4046d912007-01-28 01:53:16 +0000455 *(p++) = '#';
456 *(p++) = tohex((csum >> 4) & 0xf);
457 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000458
pbrook4046d912007-01-28 01:53:16 +0000459 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000460 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000461
pbrook4046d912007-01-28 01:53:16 +0000462#ifdef CONFIG_USER_ONLY
463 i = get_char(s);
464 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000465 return -1;
pbrook4046d912007-01-28 01:53:16 +0000466 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000467 break;
pbrook4046d912007-01-28 01:53:16 +0000468#else
469 break;
470#endif
bellardb4608c02003-06-27 17:34:32 +0000471 }
472 return 0;
473}
474
pbrook56aebc82008-10-11 17:55:29 +0000475/* return -1 if error, 0 if OK */
476static int put_packet(GDBState *s, const char *buf)
477{
478#ifdef DEBUG_GDB
479 printf("reply='%s'\n", buf);
480#endif
481
482 return put_packet_binary(s, buf, strlen(buf));
483}
484
485/* The GDB remote protocol transfers values in target byte order. This means
486 we can use the raw memory access routines to access the value buffer.
487 Conveniently, these also handle the case where the buffer is mis-aligned.
488 */
489#define GET_REG8(val) do { \
490 stb_p(mem_buf, val); \
491 return 1; \
492 } while(0)
493#define GET_REG16(val) do { \
494 stw_p(mem_buf, val); \
495 return 2; \
496 } while(0)
497#define GET_REG32(val) do { \
498 stl_p(mem_buf, val); \
499 return 4; \
500 } while(0)
501#define GET_REG64(val) do { \
502 stq_p(mem_buf, val); \
503 return 8; \
504 } while(0)
505
506#if TARGET_LONG_BITS == 64
507#define GET_REGL(val) GET_REG64(val)
508#define ldtul_p(addr) ldq_p(addr)
509#else
510#define GET_REGL(val) GET_REG32(val)
511#define ldtul_p(addr) ldl_p(addr)
512#endif
513
edgar_iglfde3fd62008-05-09 08:50:01 +0000514#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000515
516#ifdef TARGET_X86_64
pbrook56aebc82008-10-11 17:55:29 +0000517static const int gpr_map[16] = {
bellard79808572008-05-09 14:40:22 +0000518 R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
pbrook56aebc82008-10-11 17:55:29 +0000519 8, 9, 10, 11, 12, 13, 14, 15
bellard79808572008-05-09 14:40:22 +0000520};
bellard79808572008-05-09 14:40:22 +0000521#else
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200522#define gpr_map gpr_map32
bellard79808572008-05-09 14:40:22 +0000523#endif
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200524static const int gpr_map32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
pbrook56aebc82008-10-11 17:55:29 +0000525
526#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
527
Jan Kiszkab1631e72009-06-27 09:53:51 +0200528#define IDX_IP_REG CPU_NB_REGS
529#define IDX_FLAGS_REG (IDX_IP_REG + 1)
530#define IDX_SEG_REGS (IDX_FLAGS_REG + 1)
531#define IDX_FP_REGS (IDX_SEG_REGS + 6)
532#define IDX_XMM_REGS (IDX_FP_REGS + 16)
533#define IDX_MXCSR_REG (IDX_XMM_REGS + CPU_NB_REGS)
534
Andreas Färberf3840912012-02-20 06:44:56 +0100535static int cpu_gdb_read_register(CPUX86State *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000536{
537 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200538 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
539 GET_REG64(env->regs[gpr_map[n]]);
540 } else if (n < CPU_NB_REGS32) {
541 GET_REG32(env->regs[gpr_map32[n]]);
542 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200543 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000544#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200545 /* FIXME: byteswap float values - after fixing fpregs layout. */
546 memcpy(mem_buf, &env->fpregs[n - IDX_FP_REGS], 10);
pbrook56aebc82008-10-11 17:55:29 +0000547#else
548 memset(mem_buf, 0, 10);
549#endif
550 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200551 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
552 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200553 if (n < CPU_NB_REGS32 ||
554 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
555 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
556 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
557 return 16;
558 }
pbrook56aebc82008-10-11 17:55:29 +0000559 } else {
pbrook56aebc82008-10-11 17:55:29 +0000560 switch (n) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200561 case IDX_IP_REG:
562 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
563 GET_REG64(env->eip);
564 } else {
565 GET_REG32(env->eip);
566 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200567 case IDX_FLAGS_REG: GET_REG32(env->eflags);
568
569 case IDX_SEG_REGS: GET_REG32(env->segs[R_CS].selector);
570 case IDX_SEG_REGS + 1: GET_REG32(env->segs[R_SS].selector);
571 case IDX_SEG_REGS + 2: GET_REG32(env->segs[R_DS].selector);
572 case IDX_SEG_REGS + 3: GET_REG32(env->segs[R_ES].selector);
573 case IDX_SEG_REGS + 4: GET_REG32(env->segs[R_FS].selector);
574 case IDX_SEG_REGS + 5: GET_REG32(env->segs[R_GS].selector);
575
576 case IDX_FP_REGS + 8: GET_REG32(env->fpuc);
577 case IDX_FP_REGS + 9: GET_REG32((env->fpus & ~0x3800) |
578 (env->fpstt & 0x7) << 11);
579 case IDX_FP_REGS + 10: GET_REG32(0); /* ftag */
580 case IDX_FP_REGS + 11: GET_REG32(0); /* fiseg */
581 case IDX_FP_REGS + 12: GET_REG32(0); /* fioff */
582 case IDX_FP_REGS + 13: GET_REG32(0); /* foseg */
583 case IDX_FP_REGS + 14: GET_REG32(0); /* fooff */
584 case IDX_FP_REGS + 15: GET_REG32(0); /* fop */
585
586 case IDX_MXCSR_REG: GET_REG32(env->mxcsr);
pbrook56aebc82008-10-11 17:55:29 +0000587 }
bellard79808572008-05-09 14:40:22 +0000588 }
pbrook56aebc82008-10-11 17:55:29 +0000589 return 0;
bellard79808572008-05-09 14:40:22 +0000590}
591
Andreas Färberf3840912012-02-20 06:44:56 +0100592static int cpu_x86_gdb_load_seg(CPUX86State *env, int sreg, uint8_t *mem_buf)
Jan Kiszka84273172009-06-27 09:53:51 +0200593{
594 uint16_t selector = ldl_p(mem_buf);
595
596 if (selector != env->segs[sreg].selector) {
597#if defined(CONFIG_USER_ONLY)
598 cpu_x86_load_seg(env, sreg, selector);
599#else
600 unsigned int limit, flags;
601 target_ulong base;
602
603 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
604 base = selector << 4;
605 limit = 0xffff;
606 flags = 0;
607 } else {
608 if (!cpu_x86_get_descr_debug(env, selector, &base, &limit, &flags))
609 return 4;
610 }
611 cpu_x86_load_seg_cache(env, sreg, selector, base, limit, flags);
612#endif
613 }
614 return 4;
615}
616
Andreas Färberf3840912012-02-20 06:44:56 +0100617static int cpu_gdb_write_register(CPUX86State *env, uint8_t *mem_buf, int n)
bellard79808572008-05-09 14:40:22 +0000618{
pbrook56aebc82008-10-11 17:55:29 +0000619 uint32_t tmp;
620
Jan Kiszkab1631e72009-06-27 09:53:51 +0200621 if (n < CPU_NB_REGS) {
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200622 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
623 env->regs[gpr_map[n]] = ldtul_p(mem_buf);
624 return sizeof(target_ulong);
625 } else if (n < CPU_NB_REGS32) {
626 n = gpr_map32[n];
627 env->regs[n] &= ~0xffffffffUL;
628 env->regs[n] |= (uint32_t)ldl_p(mem_buf);
629 return 4;
630 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200631 } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
pbrook56aebc82008-10-11 17:55:29 +0000632#ifdef USE_X86LDOUBLE
Jan Kiszkab1631e72009-06-27 09:53:51 +0200633 /* FIXME: byteswap float values - after fixing fpregs layout. */
634 memcpy(&env->fpregs[n - IDX_FP_REGS], mem_buf, 10);
pbrook56aebc82008-10-11 17:55:29 +0000635#endif
636 return 10;
Jan Kiszkab1631e72009-06-27 09:53:51 +0200637 } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
638 n -= IDX_XMM_REGS;
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200639 if (n < CPU_NB_REGS32 ||
640 (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
641 env->xmm_regs[n].XMM_Q(0) = ldq_p(mem_buf);
642 env->xmm_regs[n].XMM_Q(1) = ldq_p(mem_buf + 8);
643 return 16;
644 }
pbrook56aebc82008-10-11 17:55:29 +0000645 } else {
Jan Kiszkab1631e72009-06-27 09:53:51 +0200646 switch (n) {
647 case IDX_IP_REG:
Jan Kiszka5f30fa12009-09-17 18:14:13 +0200648 if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
649 env->eip = ldq_p(mem_buf);
650 return 8;
651 } else {
652 env->eip &= ~0xffffffffUL;
653 env->eip |= (uint32_t)ldl_p(mem_buf);
654 return 4;
655 }
Jan Kiszkab1631e72009-06-27 09:53:51 +0200656 case IDX_FLAGS_REG:
657 env->eflags = ldl_p(mem_buf);
658 return 4;
659
Jan Kiszka84273172009-06-27 09:53:51 +0200660 case IDX_SEG_REGS: return cpu_x86_gdb_load_seg(env, R_CS, mem_buf);
661 case IDX_SEG_REGS + 1: return cpu_x86_gdb_load_seg(env, R_SS, mem_buf);
662 case IDX_SEG_REGS + 2: return cpu_x86_gdb_load_seg(env, R_DS, mem_buf);
663 case IDX_SEG_REGS + 3: return cpu_x86_gdb_load_seg(env, R_ES, mem_buf);
664 case IDX_SEG_REGS + 4: return cpu_x86_gdb_load_seg(env, R_FS, mem_buf);
665 case IDX_SEG_REGS + 5: return cpu_x86_gdb_load_seg(env, R_GS, mem_buf);
Jan Kiszkab1631e72009-06-27 09:53:51 +0200666
667 case IDX_FP_REGS + 8:
668 env->fpuc = ldl_p(mem_buf);
669 return 4;
670 case IDX_FP_REGS + 9:
671 tmp = ldl_p(mem_buf);
672 env->fpstt = (tmp >> 11) & 7;
673 env->fpus = tmp & ~0x3800;
674 return 4;
675 case IDX_FP_REGS + 10: /* ftag */ return 4;
676 case IDX_FP_REGS + 11: /* fiseg */ return 4;
677 case IDX_FP_REGS + 12: /* fioff */ return 4;
678 case IDX_FP_REGS + 13: /* foseg */ return 4;
679 case IDX_FP_REGS + 14: /* fooff */ return 4;
680 case IDX_FP_REGS + 15: /* fop */ return 4;
681
682 case IDX_MXCSR_REG:
683 env->mxcsr = ldl_p(mem_buf);
684 return 4;
bellard79808572008-05-09 14:40:22 +0000685 }
bellard79808572008-05-09 14:40:22 +0000686 }
pbrook56aebc82008-10-11 17:55:29 +0000687 /* Unrecognised register. */
688 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000689}
690
bellard9e62fd72004-01-05 22:49:06 +0000691#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000692
aurel32e571cb42009-01-24 15:07:42 +0000693/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
694 expects whatever the target description contains. Due to a
695 historical mishap the FP registers appear in between core integer
696 regs and PC, MSR, CR, and so forth. We hack round this by giving the
697 FP regs zero size when talking to a newer gdb. */
pbrook56aebc82008-10-11 17:55:29 +0000698#define NUM_CORE_REGS 71
aurel32e571cb42009-01-24 15:07:42 +0000699#if defined (TARGET_PPC64)
700#define GDB_CORE_XML "power64-core.xml"
701#else
702#define GDB_CORE_XML "power-core.xml"
703#endif
pbrook56aebc82008-10-11 17:55:29 +0000704
Andreas Färberf3840912012-02-20 06:44:56 +0100705static int cpu_gdb_read_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000706{
pbrook56aebc82008-10-11 17:55:29 +0000707 if (n < 32) {
708 /* gprs */
709 GET_REGL(env->gpr[n]);
710 } else if (n < 64) {
711 /* fprs */
aurel32e571cb42009-01-24 15:07:42 +0000712 if (gdb_has_xml)
713 return 0;
aurel328d4acf92008-11-30 16:23:18 +0000714 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000715 return 8;
716 } else {
717 switch (n) {
718 case 64: GET_REGL(env->nip);
719 case 65: GET_REGL(env->msr);
720 case 66:
721 {
722 uint32_t cr = 0;
723 int i;
724 for (i = 0; i < 8; i++)
725 cr |= env->crf[i] << (32 - ((i + 1) * 4));
726 GET_REG32(cr);
727 }
728 case 67: GET_REGL(env->lr);
729 case 68: GET_REGL(env->ctr);
aurel323d7b4172008-10-21 11:28:46 +0000730 case 69: GET_REGL(env->xer);
aurel32e571cb42009-01-24 15:07:42 +0000731 case 70:
732 {
733 if (gdb_has_xml)
734 return 0;
Fabien Chouteau5a576fb2011-09-01 04:56:00 +0000735 GET_REG32(env->fpscr);
aurel32e571cb42009-01-24 15:07:42 +0000736 }
pbrook56aebc82008-10-11 17:55:29 +0000737 }
bellard9e62fd72004-01-05 22:49:06 +0000738 }
pbrook56aebc82008-10-11 17:55:29 +0000739 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000740}
741
Andreas Färberf3840912012-02-20 06:44:56 +0100742static int cpu_gdb_write_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000743{
pbrook56aebc82008-10-11 17:55:29 +0000744 if (n < 32) {
745 /* gprs */
746 env->gpr[n] = ldtul_p(mem_buf);
747 return sizeof(target_ulong);
748 } else if (n < 64) {
749 /* fprs */
aurel32e571cb42009-01-24 15:07:42 +0000750 if (gdb_has_xml)
751 return 0;
aurel328d4acf92008-11-30 16:23:18 +0000752 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000753 return 8;
754 } else {
755 switch (n) {
756 case 64:
757 env->nip = ldtul_p(mem_buf);
758 return sizeof(target_ulong);
759 case 65:
760 ppc_store_msr(env, ldtul_p(mem_buf));
761 return sizeof(target_ulong);
762 case 66:
763 {
764 uint32_t cr = ldl_p(mem_buf);
765 int i;
766 for (i = 0; i < 8; i++)
767 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
768 return 4;
769 }
770 case 67:
771 env->lr = ldtul_p(mem_buf);
772 return sizeof(target_ulong);
773 case 68:
774 env->ctr = ldtul_p(mem_buf);
775 return sizeof(target_ulong);
776 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000777 env->xer = ldtul_p(mem_buf);
778 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000779 case 70:
780 /* fpscr */
aurel32e571cb42009-01-24 15:07:42 +0000781 if (gdb_has_xml)
782 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000783 return 4;
784 }
bellard9e62fd72004-01-05 22:49:06 +0000785 }
pbrook56aebc82008-10-11 17:55:29 +0000786 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000787}
pbrook56aebc82008-10-11 17:55:29 +0000788
bellarde95c8d52004-09-30 22:22:08 +0000789#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000790
pbrook56aebc82008-10-11 17:55:29 +0000791#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
792#define NUM_CORE_REGS 86
793#else
blueswir15a377912009-01-13 16:28:01 +0000794#define NUM_CORE_REGS 72
pbrook56aebc82008-10-11 17:55:29 +0000795#endif
796
797#ifdef TARGET_ABI32
798#define GET_REGA(val) GET_REG32(val)
799#else
800#define GET_REGA(val) GET_REGL(val)
801#endif
802
Andreas Färberf3840912012-02-20 06:44:56 +0100803static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000804{
805 if (n < 8) {
806 /* g0..g7 */
807 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000808 }
pbrook56aebc82008-10-11 17:55:29 +0000809 if (n < 32) {
810 /* register window */
811 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000812 }
pbrook56aebc82008-10-11 17:55:29 +0000813#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
814 if (n < 64) {
815 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700816 if (n & 1) {
817 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
818 } else {
819 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
820 }
bellarde95c8d52004-09-30 22:22:08 +0000821 }
822 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000823 switch (n) {
824 case 64: GET_REGA(env->y);
Blue Swirl5a834bb2010-05-09 20:19:04 +0000825 case 65: GET_REGA(cpu_get_psr(env));
pbrook56aebc82008-10-11 17:55:29 +0000826 case 66: GET_REGA(env->wim);
827 case 67: GET_REGA(env->tbr);
828 case 68: GET_REGA(env->pc);
829 case 69: GET_REGA(env->npc);
830 case 70: GET_REGA(env->fsr);
831 case 71: GET_REGA(0); /* csr */
blueswir15a377912009-01-13 16:28:01 +0000832 default: GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000833 }
bellard34751872005-07-02 14:31:34 +0000834#else
pbrook56aebc82008-10-11 17:55:29 +0000835 if (n < 64) {
836 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700837 if (n & 1) {
838 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
839 } else {
840 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
841 }
bellard34751872005-07-02 14:31:34 +0000842 }
pbrook56aebc82008-10-11 17:55:29 +0000843 if (n < 80) {
844 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700845 GET_REG64(env->fpr[(n - 32) / 2].ll);
pbrook56aebc82008-10-11 17:55:29 +0000846 }
847 switch (n) {
848 case 80: GET_REGL(env->pc);
849 case 81: GET_REGL(env->npc);
Blue Swirl5a834bb2010-05-09 20:19:04 +0000850 case 82: GET_REGL((cpu_get_ccr(env) << 32) |
851 ((env->asi & 0xff) << 24) |
852 ((env->pstate & 0xfff) << 8) |
853 cpu_get_cwp64(env));
pbrook56aebc82008-10-11 17:55:29 +0000854 case 83: GET_REGL(env->fsr);
855 case 84: GET_REGL(env->fprs);
856 case 85: GET_REGL(env->y);
857 }
bellard34751872005-07-02 14:31:34 +0000858#endif
pbrook56aebc82008-10-11 17:55:29 +0000859 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000860}
861
Andreas Färberf3840912012-02-20 06:44:56 +0100862static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000863{
pbrook56aebc82008-10-11 17:55:29 +0000864#if defined(TARGET_ABI32)
865 abi_ulong tmp;
866
867 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000868#else
pbrook56aebc82008-10-11 17:55:29 +0000869 target_ulong tmp;
870
871 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000872#endif
bellarde95c8d52004-09-30 22:22:08 +0000873
pbrook56aebc82008-10-11 17:55:29 +0000874 if (n < 8) {
875 /* g0..g7 */
876 env->gregs[n] = tmp;
877 } else if (n < 32) {
878 /* register window */
879 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000880 }
pbrook56aebc82008-10-11 17:55:29 +0000881#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
882 else if (n < 64) {
883 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700884 /* f0-f31 */
885 if (n & 1) {
886 env->fpr[(n - 32) / 2].l.lower = tmp;
887 } else {
888 env->fpr[(n - 32) / 2].l.upper = tmp;
889 }
pbrook56aebc82008-10-11 17:55:29 +0000890 } else {
891 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
892 switch (n) {
893 case 64: env->y = tmp; break;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000894 case 65: cpu_put_psr(env, tmp); break;
pbrook56aebc82008-10-11 17:55:29 +0000895 case 66: env->wim = tmp; break;
896 case 67: env->tbr = tmp; break;
897 case 68: env->pc = tmp; break;
898 case 69: env->npc = tmp; break;
899 case 70: env->fsr = tmp; break;
900 default: return 0;
901 }
bellarde95c8d52004-09-30 22:22:08 +0000902 }
pbrook56aebc82008-10-11 17:55:29 +0000903 return 4;
bellard34751872005-07-02 14:31:34 +0000904#else
pbrook56aebc82008-10-11 17:55:29 +0000905 else if (n < 64) {
906 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700907 tmp = ldl_p(mem_buf);
908 if (n & 1) {
909 env->fpr[(n - 32) / 2].l.lower = tmp;
910 } else {
911 env->fpr[(n - 32) / 2].l.upper = tmp;
912 }
pbrook56aebc82008-10-11 17:55:29 +0000913 return 4;
914 } else if (n < 80) {
915 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700916 env->fpr[(n - 32) / 2].ll = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000917 } else {
918 switch (n) {
919 case 80: env->pc = tmp; break;
920 case 81: env->npc = tmp; break;
921 case 82:
Blue Swirl5a834bb2010-05-09 20:19:04 +0000922 cpu_put_ccr(env, tmp >> 32);
pbrook56aebc82008-10-11 17:55:29 +0000923 env->asi = (tmp >> 24) & 0xff;
924 env->pstate = (tmp >> 8) & 0xfff;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000925 cpu_put_cwp64(env, tmp & 0xff);
pbrook56aebc82008-10-11 17:55:29 +0000926 break;
927 case 83: env->fsr = tmp; break;
928 case 84: env->fprs = tmp; break;
929 case 85: env->y = tmp; break;
930 default: return 0;
931 }
bellard34751872005-07-02 14:31:34 +0000932 }
pbrook56aebc82008-10-11 17:55:29 +0000933 return 8;
bellard34751872005-07-02 14:31:34 +0000934#endif
bellard9e62fd72004-01-05 22:49:06 +0000935}
bellard1fddef42005-04-17 19:16:13 +0000936#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000937
938/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
939 whatever the target description contains. Due to a historical mishap
940 the FPA registers appear in between core integer regs and the CPSR.
941 We hack round this by giving the FPA regs zero size when talking to a
942 newer gdb. */
943#define NUM_CORE_REGS 26
944#define GDB_CORE_XML "arm-core.xml"
945
Andreas Färberf3840912012-02-20 06:44:56 +0100946static int cpu_gdb_read_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000947{
pbrook56aebc82008-10-11 17:55:29 +0000948 if (n < 16) {
949 /* Core integer register. */
950 GET_REG32(env->regs[n]);
951 }
952 if (n < 24) {
953 /* FPA registers. */
954 if (gdb_has_xml)
955 return 0;
956 memset(mem_buf, 0, 12);
957 return 12;
958 }
959 switch (n) {
960 case 24:
961 /* FPA status register. */
962 if (gdb_has_xml)
963 return 0;
964 GET_REG32(0);
965 case 25:
966 /* CPSR */
967 GET_REG32(cpsr_read(env));
968 }
969 /* Unknown register. */
970 return 0;
bellard1fddef42005-04-17 19:16:13 +0000971}
972
Andreas Färberf3840912012-02-20 06:44:56 +0100973static int cpu_gdb_write_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000974{
pbrook56aebc82008-10-11 17:55:29 +0000975 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000976
pbrook56aebc82008-10-11 17:55:29 +0000977 tmp = ldl_p(mem_buf);
978
979 /* Mask out low bit of PC to workaround gdb bugs. This will probably
980 cause problems if we ever implement the Jazelle DBX extensions. */
981 if (n == 15)
982 tmp &= ~1;
983
984 if (n < 16) {
985 /* Core integer register. */
986 env->regs[n] = tmp;
987 return 4;
988 }
989 if (n < 24) { /* 16-23 */
990 /* FPA registers (ignored). */
991 if (gdb_has_xml)
992 return 0;
993 return 12;
994 }
995 switch (n) {
996 case 24:
997 /* FPA status register (ignored). */
998 if (gdb_has_xml)
999 return 0;
1000 return 4;
1001 case 25:
1002 /* CPSR */
1003 cpsr_write (env, tmp, 0xffffffff);
1004 return 4;
1005 }
1006 /* Unknown register. */
1007 return 0;
bellard1fddef42005-04-17 19:16:13 +00001008}
pbrook56aebc82008-10-11 17:55:29 +00001009
pbrooke6e59062006-10-22 00:18:54 +00001010#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +00001011
1012#define NUM_CORE_REGS 18
1013
1014#define GDB_CORE_XML "cf-core.xml"
1015
Andreas Färberf3840912012-02-20 06:44:56 +01001016static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001017{
pbrook56aebc82008-10-11 17:55:29 +00001018 if (n < 8) {
1019 /* D0-D7 */
1020 GET_REG32(env->dregs[n]);
1021 } else if (n < 16) {
1022 /* A0-A7 */
1023 GET_REG32(env->aregs[n - 8]);
1024 } else {
1025 switch (n) {
1026 case 16: GET_REG32(env->sr);
1027 case 17: GET_REG32(env->pc);
1028 }
pbrooke6e59062006-10-22 00:18:54 +00001029 }
pbrook56aebc82008-10-11 17:55:29 +00001030 /* FP registers not included here because they vary between
1031 ColdFire and m68k. Use XML bits for these. */
1032 return 0;
pbrooke6e59062006-10-22 00:18:54 +00001033}
1034
Andreas Färberf3840912012-02-20 06:44:56 +01001035static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +00001036{
pbrook56aebc82008-10-11 17:55:29 +00001037 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +00001038
pbrook56aebc82008-10-11 17:55:29 +00001039 tmp = ldl_p(mem_buf);
1040
1041 if (n < 8) {
1042 /* D0-D7 */
1043 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -08001044 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +00001045 /* A0-A7 */
1046 env->aregs[n - 8] = tmp;
1047 } else {
1048 switch (n) {
1049 case 16: env->sr = tmp; break;
1050 case 17: env->pc = tmp; break;
1051 default: return 0;
1052 }
pbrooke6e59062006-10-22 00:18:54 +00001053 }
pbrook56aebc82008-10-11 17:55:29 +00001054 return 4;
pbrooke6e59062006-10-22 00:18:54 +00001055}
bellard6f970bd2005-12-05 19:55:19 +00001056#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +00001057
1058#define NUM_CORE_REGS 73
1059
Andreas Färberf3840912012-02-20 06:44:56 +01001060static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001061{
pbrook56aebc82008-10-11 17:55:29 +00001062 if (n < 32) {
1063 GET_REGL(env->active_tc.gpr[n]);
1064 }
1065 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1066 if (n >= 38 && n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001067 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001068 GET_REGL(env->active_fpu.fpr[n - 38].d);
ths7ac256b2007-10-25 21:30:37 +00001069 else
pbrook56aebc82008-10-11 17:55:29 +00001070 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
1071 }
1072 switch (n) {
1073 case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
1074 case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
1075 }
1076 }
1077 switch (n) {
1078 case 32: GET_REGL((int32_t)env->CP0_Status);
1079 case 33: GET_REGL(env->active_tc.LO[0]);
1080 case 34: GET_REGL(env->active_tc.HI[0]);
1081 case 35: GET_REGL(env->CP0_BadVAddr);
1082 case 36: GET_REGL((int32_t)env->CP0_Cause);
Nathan Froydff1d1972009-12-08 08:06:30 -08001083 case 37: GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
pbrook56aebc82008-10-11 17:55:29 +00001084 case 72: GET_REGL(0); /* fp */
1085 case 89: GET_REGL((int32_t)env->CP0_PRid);
1086 }
1087 if (n >= 73 && n <= 88) {
1088 /* 16 embedded regs. */
1089 GET_REGL(0);
1090 }
ths36d23952007-02-28 22:37:42 +00001091
pbrook56aebc82008-10-11 17:55:29 +00001092 return 0;
bellard6f970bd2005-12-05 19:55:19 +00001093}
1094
ths8e33c082006-12-11 19:22:27 +00001095/* convert MIPS rounding mode in FCR31 to IEEE library */
1096static unsigned int ieee_rm[] =
1097 {
1098 float_round_nearest_even,
1099 float_round_to_zero,
1100 float_round_up,
1101 float_round_down
1102 };
1103#define RESTORE_ROUNDING_MODE \
thsf01be152008-09-18 11:57:27 +00001104 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +00001105
Andreas Färberf3840912012-02-20 06:44:56 +01001106static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001107{
pbrook56aebc82008-10-11 17:55:29 +00001108 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +00001109
pbrook56aebc82008-10-11 17:55:29 +00001110 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001111
pbrook56aebc82008-10-11 17:55:29 +00001112 if (n < 32) {
1113 env->active_tc.gpr[n] = tmp;
1114 return sizeof(target_ulong);
1115 }
1116 if (env->CP0_Config1 & (1 << CP0C1_FP)
1117 && n >= 38 && n < 73) {
1118 if (n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001119 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001120 env->active_fpu.fpr[n - 38].d = tmp;
ths7ac256b2007-10-25 21:30:37 +00001121 else
pbrook56aebc82008-10-11 17:55:29 +00001122 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1123 }
1124 switch (n) {
1125 case 70:
1126 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1127 /* set rounding mode */
1128 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +00001129 break;
1130 case 71: env->active_fpu.fcr0 = tmp; break;
1131 }
1132 return sizeof(target_ulong);
1133 }
1134 switch (n) {
1135 case 32: env->CP0_Status = tmp; break;
1136 case 33: env->active_tc.LO[0] = tmp; break;
1137 case 34: env->active_tc.HI[0] = tmp; break;
1138 case 35: env->CP0_BadVAddr = tmp; break;
1139 case 36: env->CP0_Cause = tmp; break;
Nathan Froydff1d1972009-12-08 08:06:30 -08001140 case 37:
1141 env->active_tc.PC = tmp & ~(target_ulong)1;
1142 if (tmp & 1) {
1143 env->hflags |= MIPS_HFLAG_M16;
1144 } else {
1145 env->hflags &= ~(MIPS_HFLAG_M16);
1146 }
1147 break;
pbrook56aebc82008-10-11 17:55:29 +00001148 case 72: /* fp, ignored */ break;
1149 default:
1150 if (n > 89)
1151 return 0;
1152 /* Other registers are readonly. Ignore writes. */
1153 break;
1154 }
1155
1156 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001157}
bellardfdf9b3e2006-04-27 21:07:38 +00001158#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001159
1160/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001161/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001162
pbrook56aebc82008-10-11 17:55:29 +00001163#define NUM_CORE_REGS 59
1164
Andreas Färberf3840912012-02-20 06:44:56 +01001165static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001166{
pbrook56aebc82008-10-11 17:55:29 +00001167 if (n < 8) {
1168 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1169 GET_REGL(env->gregs[n + 16]);
1170 } else {
1171 GET_REGL(env->gregs[n]);
1172 }
1173 } else if (n < 16) {
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001174 GET_REGL(env->gregs[n]);
pbrook56aebc82008-10-11 17:55:29 +00001175 } else if (n >= 25 && n < 41) {
1176 GET_REGL(env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)]);
1177 } else if (n >= 43 && n < 51) {
1178 GET_REGL(env->gregs[n - 43]);
1179 } else if (n >= 51 && n < 59) {
1180 GET_REGL(env->gregs[n - (51 - 16)]);
1181 }
1182 switch (n) {
1183 case 16: GET_REGL(env->pc);
1184 case 17: GET_REGL(env->pr);
1185 case 18: GET_REGL(env->gbr);
1186 case 19: GET_REGL(env->vbr);
1187 case 20: GET_REGL(env->mach);
1188 case 21: GET_REGL(env->macl);
1189 case 22: GET_REGL(env->sr);
1190 case 23: GET_REGL(env->fpul);
1191 case 24: GET_REGL(env->fpscr);
1192 case 41: GET_REGL(env->ssr);
1193 case 42: GET_REGL(env->spc);
1194 }
bellardfdf9b3e2006-04-27 21:07:38 +00001195
pbrook56aebc82008-10-11 17:55:29 +00001196 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001197}
1198
Andreas Färberf3840912012-02-20 06:44:56 +01001199static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001200{
pbrook56aebc82008-10-11 17:55:29 +00001201 uint32_t tmp;
bellardfdf9b3e2006-04-27 21:07:38 +00001202
pbrook56aebc82008-10-11 17:55:29 +00001203 tmp = ldl_p(mem_buf);
1204
1205 if (n < 8) {
1206 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1207 env->gregs[n + 16] = tmp;
1208 } else {
1209 env->gregs[n] = tmp;
1210 }
1211 return 4;
1212 } else if (n < 16) {
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001213 env->gregs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +00001214 return 4;
1215 } else if (n >= 25 && n < 41) {
1216 env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)] = tmp;
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001217 return 4;
pbrook56aebc82008-10-11 17:55:29 +00001218 } else if (n >= 43 && n < 51) {
1219 env->gregs[n - 43] = tmp;
1220 return 4;
1221 } else if (n >= 51 && n < 59) {
1222 env->gregs[n - (51 - 16)] = tmp;
1223 return 4;
1224 }
1225 switch (n) {
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001226 case 16: env->pc = tmp; break;
1227 case 17: env->pr = tmp; break;
1228 case 18: env->gbr = tmp; break;
1229 case 19: env->vbr = tmp; break;
1230 case 20: env->mach = tmp; break;
1231 case 21: env->macl = tmp; break;
1232 case 22: env->sr = tmp; break;
1233 case 23: env->fpul = tmp; break;
1234 case 24: env->fpscr = tmp; break;
1235 case 41: env->ssr = tmp; break;
1236 case 42: env->spc = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +00001237 default: return 0;
1238 }
1239
1240 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001241}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001242#elif defined (TARGET_MICROBLAZE)
1243
1244#define NUM_CORE_REGS (32 + 5)
1245
Andreas Färberf3840912012-02-20 06:44:56 +01001246static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001247{
1248 if (n < 32) {
1249 GET_REG32(env->regs[n]);
1250 } else {
1251 GET_REG32(env->sregs[n - 32]);
1252 }
1253 return 0;
1254}
1255
Andreas Färberf3840912012-02-20 06:44:56 +01001256static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001257{
1258 uint32_t tmp;
1259
1260 if (n > NUM_CORE_REGS)
1261 return 0;
1262
1263 tmp = ldl_p(mem_buf);
1264
1265 if (n < 32) {
1266 env->regs[n] = tmp;
1267 } else {
1268 env->sregs[n - 32] = tmp;
1269 }
1270 return 4;
1271}
thsf1ccf902007-10-08 13:16:14 +00001272#elif defined (TARGET_CRIS)
1273
pbrook56aebc82008-10-11 17:55:29 +00001274#define NUM_CORE_REGS 49
1275
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001276static int
Andreas Färberf3840912012-02-20 06:44:56 +01001277read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001278{
1279 if (n < 15) {
1280 GET_REG32(env->regs[n]);
1281 }
1282
1283 if (n == 15) {
1284 GET_REG32(env->pc);
1285 }
1286
1287 if (n < 32) {
1288 switch (n) {
1289 case 16:
1290 GET_REG8(env->pregs[n - 16]);
1291 break;
1292 case 17:
1293 GET_REG8(env->pregs[n - 16]);
1294 break;
1295 case 20:
1296 case 21:
1297 GET_REG16(env->pregs[n - 16]);
1298 break;
1299 default:
1300 if (n >= 23) {
1301 GET_REG32(env->pregs[n - 16]);
1302 }
1303 break;
1304 }
1305 }
1306 return 0;
1307}
1308
Andreas Färberf3840912012-02-20 06:44:56 +01001309static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001310{
pbrook56aebc82008-10-11 17:55:29 +00001311 uint8_t srs;
1312
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001313 if (env->pregs[PR_VR] < 32)
1314 return read_register_crisv10(env, mem_buf, n);
1315
pbrook56aebc82008-10-11 17:55:29 +00001316 srs = env->pregs[PR_SRS];
1317 if (n < 16) {
1318 GET_REG32(env->regs[n]);
1319 }
1320
1321 if (n >= 21 && n < 32) {
1322 GET_REG32(env->pregs[n - 16]);
1323 }
1324 if (n >= 33 && n < 49) {
1325 GET_REG32(env->sregs[srs][n - 33]);
1326 }
1327 switch (n) {
1328 case 16: GET_REG8(env->pregs[0]);
1329 case 17: GET_REG8(env->pregs[1]);
1330 case 18: GET_REG32(env->pregs[2]);
1331 case 19: GET_REG8(srs);
1332 case 20: GET_REG16(env->pregs[4]);
1333 case 32: GET_REG32(env->pc);
1334 }
1335
1336 return 0;
thsf1ccf902007-10-08 13:16:14 +00001337}
1338
Andreas Färberf3840912012-02-20 06:44:56 +01001339static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001340{
pbrook56aebc82008-10-11 17:55:29 +00001341 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001342
pbrook56aebc82008-10-11 17:55:29 +00001343 if (n > 49)
1344 return 0;
thsf1ccf902007-10-08 13:16:14 +00001345
pbrook56aebc82008-10-11 17:55:29 +00001346 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001347
pbrook56aebc82008-10-11 17:55:29 +00001348 if (n < 16) {
1349 env->regs[n] = tmp;
1350 }
thsf1ccf902007-10-08 13:16:14 +00001351
edgar_igld7b69672008-10-11 19:32:21 +00001352 if (n >= 21 && n < 32) {
1353 env->pregs[n - 16] = tmp;
1354 }
1355
1356 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001357 switch (n) {
1358 case 16: return 1;
1359 case 17: return 1;
edgar_igld7b69672008-10-11 19:32:21 +00001360 case 18: env->pregs[PR_PID] = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +00001361 case 19: return 1;
1362 case 20: return 2;
1363 case 32: env->pc = tmp; break;
1364 }
thsf1ccf902007-10-08 13:16:14 +00001365
pbrook56aebc82008-10-11 17:55:29 +00001366 return 4;
thsf1ccf902007-10-08 13:16:14 +00001367}
aurel3219bf5172008-12-07 23:26:32 +00001368#elif defined (TARGET_ALPHA)
1369
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001370#define NUM_CORE_REGS 67
aurel3219bf5172008-12-07 23:26:32 +00001371
Andreas Färberf3840912012-02-20 06:44:56 +01001372static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001373{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001374 uint64_t val;
1375 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001376
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001377 switch (n) {
1378 case 0 ... 30:
1379 val = env->ir[n];
1380 break;
1381 case 32 ... 62:
1382 d.d = env->fir[n - 32];
1383 val = d.ll;
1384 break;
1385 case 63:
1386 val = cpu_alpha_load_fpcr(env);
1387 break;
1388 case 64:
1389 val = env->pc;
1390 break;
1391 case 66:
1392 val = env->unique;
1393 break;
1394 case 31:
1395 case 65:
1396 /* 31 really is the zero register; 65 is unassigned in the
1397 gdb protocol, but is still required to occupy 8 bytes. */
1398 val = 0;
1399 break;
1400 default:
1401 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001402 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001403 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001404}
1405
Andreas Färberf3840912012-02-20 06:44:56 +01001406static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001407{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001408 target_ulong tmp = ldtul_p(mem_buf);
1409 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001410
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001411 switch (n) {
1412 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001413 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001414 break;
1415 case 32 ... 62:
1416 d.ll = tmp;
1417 env->fir[n - 32] = d.d;
1418 break;
1419 case 63:
1420 cpu_alpha_store_fpcr(env, tmp);
1421 break;
1422 case 64:
1423 env->pc = tmp;
1424 break;
1425 case 66:
1426 env->unique = tmp;
1427 break;
1428 case 31:
1429 case 65:
1430 /* 31 really is the zero register; 65 is unassigned in the
1431 gdb protocol, but is still required to occupy 8 bytes. */
1432 break;
1433 default:
1434 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001435 }
aurel3219bf5172008-12-07 23:26:32 +00001436 return 8;
1437}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001438#elif defined (TARGET_S390X)
1439
1440#define NUM_CORE_REGS S390_NUM_TOTAL_REGS
1441
Andreas Färberf3840912012-02-20 06:44:56 +01001442static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001443{
1444 switch (n) {
1445 case S390_PSWM_REGNUM: GET_REGL(env->psw.mask); break;
1446 case S390_PSWA_REGNUM: GET_REGL(env->psw.addr); break;
1447 case S390_R0_REGNUM ... S390_R15_REGNUM:
1448 GET_REGL(env->regs[n-S390_R0_REGNUM]); break;
1449 case S390_A0_REGNUM ... S390_A15_REGNUM:
1450 GET_REG32(env->aregs[n-S390_A0_REGNUM]); break;
1451 case S390_FPC_REGNUM: GET_REG32(env->fpc); break;
1452 case S390_F0_REGNUM ... S390_F15_REGNUM:
1453 /* XXX */
1454 break;
1455 case S390_PC_REGNUM: GET_REGL(env->psw.addr); break;
Alexander Graf59467ba2011-03-23 10:58:07 +01001456 case S390_CC_REGNUM:
1457 env->cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst,
1458 env->cc_vr);
1459 GET_REG32(env->cc_op);
1460 break;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001461 }
1462
1463 return 0;
1464}
1465
Andreas Färberf3840912012-02-20 06:44:56 +01001466static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001467{
1468 target_ulong tmpl;
1469 uint32_t tmp32;
1470 int r = 8;
1471 tmpl = ldtul_p(mem_buf);
1472 tmp32 = ldl_p(mem_buf);
1473
1474 switch (n) {
1475 case S390_PSWM_REGNUM: env->psw.mask = tmpl; break;
1476 case S390_PSWA_REGNUM: env->psw.addr = tmpl; break;
1477 case S390_R0_REGNUM ... S390_R15_REGNUM:
1478 env->regs[n-S390_R0_REGNUM] = tmpl; break;
1479 case S390_A0_REGNUM ... S390_A15_REGNUM:
1480 env->aregs[n-S390_A0_REGNUM] = tmp32; r=4; break;
1481 case S390_FPC_REGNUM: env->fpc = tmp32; r=4; break;
1482 case S390_F0_REGNUM ... S390_F15_REGNUM:
1483 /* XXX */
1484 break;
1485 case S390_PC_REGNUM: env->psw.addr = tmpl; break;
Alexander Graf59467ba2011-03-23 10:58:07 +01001486 case S390_CC_REGNUM: env->cc_op = tmp32; r=4; break;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001487 }
1488
1489 return r;
1490}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001491#elif defined (TARGET_LM32)
1492
1493#include "hw/lm32_pic.h"
1494#define NUM_CORE_REGS (32 + 7)
1495
Andreas Färberf3840912012-02-20 06:44:56 +01001496static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001497{
1498 if (n < 32) {
1499 GET_REG32(env->regs[n]);
1500 } else {
1501 switch (n) {
1502 case 32:
1503 GET_REG32(env->pc);
1504 break;
1505 /* FIXME: put in right exception ID */
1506 case 33:
1507 GET_REG32(0);
1508 break;
1509 case 34:
1510 GET_REG32(env->eba);
1511 break;
1512 case 35:
1513 GET_REG32(env->deba);
1514 break;
1515 case 36:
1516 GET_REG32(env->ie);
1517 break;
1518 case 37:
1519 GET_REG32(lm32_pic_get_im(env->pic_state));
1520 break;
1521 case 38:
1522 GET_REG32(lm32_pic_get_ip(env->pic_state));
1523 break;
1524 }
1525 }
1526 return 0;
1527}
1528
Andreas Färberf3840912012-02-20 06:44:56 +01001529static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001530{
1531 uint32_t tmp;
1532
1533 if (n > NUM_CORE_REGS) {
1534 return 0;
1535 }
1536
1537 tmp = ldl_p(mem_buf);
1538
1539 if (n < 32) {
1540 env->regs[n] = tmp;
1541 } else {
1542 switch (n) {
1543 case 32:
1544 env->pc = tmp;
1545 break;
1546 case 34:
1547 env->eba = tmp;
1548 break;
1549 case 35:
1550 env->deba = tmp;
1551 break;
1552 case 36:
1553 env->ie = tmp;
1554 break;
1555 case 37:
1556 lm32_pic_set_im(env->pic_state, tmp);
1557 break;
1558 case 38:
1559 lm32_pic_set_ip(env->pic_state, tmp);
1560 break;
1561 }
1562 }
1563 return 4;
1564}
Max Filippovccfcaba2011-09-06 03:55:52 +04001565#elif defined(TARGET_XTENSA)
1566
1567/* Use num_core_regs to see only non-privileged registers in an unmodified gdb.
1568 * Use num_regs to see all registers. gdb modification is required for that:
1569 * reset bit 0 in the 'flags' field of the registers definitions in the
1570 * gdb/xtensa-config.c inside gdb source tree or inside gdb overlay.
1571 */
1572#define NUM_CORE_REGS (env->config->gdb_regmap.num_regs)
1573#define num_g_regs NUM_CORE_REGS
1574
Andreas Färberf3840912012-02-20 06:44:56 +01001575static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001576{
1577 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1578
1579 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1580 return 0;
1581 }
1582
1583 switch (reg->type) {
1584 case 9: /*pc*/
1585 GET_REG32(env->pc);
1586 break;
1587
1588 case 1: /*ar*/
1589 xtensa_sync_phys_from_window(env);
1590 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
1591 break;
1592
1593 case 2: /*SR*/
1594 GET_REG32(env->sregs[reg->targno & 0xff]);
1595 break;
1596
1597 case 3: /*UR*/
1598 GET_REG32(env->uregs[reg->targno & 0xff]);
1599 break;
1600
1601 case 8: /*a*/
1602 GET_REG32(env->regs[reg->targno & 0x0f]);
1603 break;
1604
1605 default:
1606 qemu_log("%s from reg %d of unsupported type %d\n",
1607 __func__, n, reg->type);
1608 return 0;
1609 }
1610}
1611
Andreas Färberf3840912012-02-20 06:44:56 +01001612static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001613{
1614 uint32_t tmp;
1615 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1616
1617 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1618 return 0;
1619 }
1620
1621 tmp = ldl_p(mem_buf);
1622
1623 switch (reg->type) {
1624 case 9: /*pc*/
1625 env->pc = tmp;
1626 break;
1627
1628 case 1: /*ar*/
1629 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1630 xtensa_sync_window_from_phys(env);
1631 break;
1632
1633 case 2: /*SR*/
1634 env->sregs[reg->targno & 0xff] = tmp;
1635 break;
1636
1637 case 3: /*UR*/
1638 env->uregs[reg->targno & 0xff] = tmp;
1639 break;
1640
1641 case 8: /*a*/
1642 env->regs[reg->targno & 0x0f] = tmp;
1643 break;
1644
1645 default:
1646 qemu_log("%s to reg %d of unsupported type %d\n",
1647 __func__, n, reg->type);
1648 return 0;
1649 }
1650
1651 return 4;
1652}
bellard1fddef42005-04-17 19:16:13 +00001653#else
pbrook56aebc82008-10-11 17:55:29 +00001654
1655#define NUM_CORE_REGS 0
1656
Andreas Färber9349b4f2012-03-14 01:38:32 +01001657static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001658{
1659 return 0;
1660}
1661
Andreas Färber9349b4f2012-03-14 01:38:32 +01001662static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001663{
pbrook56aebc82008-10-11 17:55:29 +00001664 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001665}
1666
1667#endif
bellardb4608c02003-06-27 17:34:32 +00001668
Max Filippovccfcaba2011-09-06 03:55:52 +04001669#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001670static int num_g_regs = NUM_CORE_REGS;
Max Filippovccfcaba2011-09-06 03:55:52 +04001671#endif
pbrook56aebc82008-10-11 17:55:29 +00001672
1673#ifdef GDB_CORE_XML
1674/* Encode data using the encoding for 'x' packets. */
1675static int memtox(char *buf, const char *mem, int len)
1676{
1677 char *p = buf;
1678 char c;
1679
1680 while (len--) {
1681 c = *(mem++);
1682 switch (c) {
1683 case '#': case '$': case '*': case '}':
1684 *(p++) = '}';
1685 *(p++) = c ^ 0x20;
1686 break;
1687 default:
1688 *(p++) = c;
1689 break;
1690 }
1691 }
1692 return p - buf;
1693}
1694
aurel323faf7782008-12-07 23:26:17 +00001695static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001696{
pbrook56aebc82008-10-11 17:55:29 +00001697 size_t len;
1698 int i;
1699 const char *name;
1700 static char target_xml[1024];
1701
1702 len = 0;
1703 while (p[len] && p[len] != ':')
1704 len++;
1705 *newp = p + len;
1706
1707 name = NULL;
1708 if (strncmp(p, "target.xml", len) == 0) {
1709 /* Generate the XML description for this CPU. */
1710 if (!target_xml[0]) {
1711 GDBRegisterState *r;
1712
blueswir15b3715b2008-10-25 11:18:12 +00001713 snprintf(target_xml, sizeof(target_xml),
1714 "<?xml version=\"1.0\"?>"
1715 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1716 "<target>"
1717 "<xi:include href=\"%s\"/>",
1718 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001719
aliguori880a7572008-11-18 20:30:24 +00001720 for (r = first_cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001721 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1722 pstrcat(target_xml, sizeof(target_xml), r->xml);
1723 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001724 }
blueswir12dc766d2009-04-13 16:06:19 +00001725 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001726 }
1727 return target_xml;
1728 }
1729 for (i = 0; ; i++) {
1730 name = xml_builtin[i][0];
1731 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1732 break;
1733 }
1734 return name ? xml_builtin[i][1] : NULL;
1735}
1736#endif
1737
Andreas Färber9349b4f2012-03-14 01:38:32 +01001738static int gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001739{
1740 GDBRegisterState *r;
1741
1742 if (reg < NUM_CORE_REGS)
1743 return cpu_gdb_read_register(env, mem_buf, reg);
1744
1745 for (r = env->gdb_regs; r; r = r->next) {
1746 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1747 return r->get_reg(env, mem_buf, reg - r->base_reg);
1748 }
1749 }
1750 return 0;
1751}
1752
Andreas Färber9349b4f2012-03-14 01:38:32 +01001753static int gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001754{
1755 GDBRegisterState *r;
1756
1757 if (reg < NUM_CORE_REGS)
1758 return cpu_gdb_write_register(env, mem_buf, reg);
1759
1760 for (r = env->gdb_regs; r; r = r->next) {
1761 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1762 return r->set_reg(env, mem_buf, reg - r->base_reg);
1763 }
1764 }
1765 return 0;
1766}
1767
Max Filippovccfcaba2011-09-06 03:55:52 +04001768#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001769/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1770 specifies the first register number and these registers are included in
1771 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1772 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1773 */
1774
Andreas Färber9349b4f2012-03-14 01:38:32 +01001775void gdb_register_coprocessor(CPUArchState * env,
pbrook56aebc82008-10-11 17:55:29 +00001776 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1777 int num_regs, const char *xml, int g_pos)
1778{
1779 GDBRegisterState *s;
1780 GDBRegisterState **p;
1781 static int last_reg = NUM_CORE_REGS;
1782
pbrook56aebc82008-10-11 17:55:29 +00001783 p = &env->gdb_regs;
1784 while (*p) {
1785 /* Check for duplicates. */
1786 if (strcmp((*p)->xml, xml) == 0)
1787 return;
1788 p = &(*p)->next;
1789 }
Stefan Weil9643c252011-10-18 22:25:38 +02001790
1791 s = g_new0(GDBRegisterState, 1);
1792 s->base_reg = last_reg;
1793 s->num_regs = num_regs;
1794 s->get_reg = get_reg;
1795 s->set_reg = set_reg;
1796 s->xml = xml;
1797
pbrook56aebc82008-10-11 17:55:29 +00001798 /* Add to end of list. */
1799 last_reg += num_regs;
1800 *p = s;
1801 if (g_pos) {
1802 if (g_pos != s->base_reg) {
1803 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1804 "Expected %d got %d\n", xml, g_pos, s->base_reg);
1805 } else {
1806 num_g_regs = last_reg;
1807 }
1808 }
1809}
Max Filippovccfcaba2011-09-06 03:55:52 +04001810#endif
pbrook56aebc82008-10-11 17:55:29 +00001811
aliguoria1d1bb32008-11-18 20:07:32 +00001812#ifndef CONFIG_USER_ONLY
1813static const int xlat_gdb_type[] = {
1814 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1815 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1816 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1817};
1818#endif
1819
aliguori880a7572008-11-18 20:30:24 +00001820static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001821{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001822 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001823 int err = 0;
1824
aliguorie22a25c2009-03-12 20:12:48 +00001825 if (kvm_enabled())
1826 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1827
aliguoria1d1bb32008-11-18 20:07:32 +00001828 switch (type) {
1829 case GDB_BREAKPOINT_SW:
1830 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001831 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1832 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1833 if (err)
1834 break;
1835 }
1836 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001837#ifndef CONFIG_USER_ONLY
1838 case GDB_WATCHPOINT_WRITE:
1839 case GDB_WATCHPOINT_READ:
1840 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001841 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1842 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1843 NULL);
1844 if (err)
1845 break;
1846 }
1847 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001848#endif
1849 default:
1850 return -ENOSYS;
1851 }
1852}
1853
aliguori880a7572008-11-18 20:30:24 +00001854static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001855{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001856 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001857 int err = 0;
1858
aliguorie22a25c2009-03-12 20:12:48 +00001859 if (kvm_enabled())
1860 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1861
aliguoria1d1bb32008-11-18 20:07:32 +00001862 switch (type) {
1863 case GDB_BREAKPOINT_SW:
1864 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001865 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1866 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1867 if (err)
1868 break;
1869 }
1870 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001871#ifndef CONFIG_USER_ONLY
1872 case GDB_WATCHPOINT_WRITE:
1873 case GDB_WATCHPOINT_READ:
1874 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001875 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1876 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1877 if (err)
1878 break;
1879 }
1880 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001881#endif
1882 default:
1883 return -ENOSYS;
1884 }
1885}
1886
aliguori880a7572008-11-18 20:30:24 +00001887static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001888{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001889 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001890
aliguorie22a25c2009-03-12 20:12:48 +00001891 if (kvm_enabled()) {
1892 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
1893 return;
1894 }
1895
aliguori880a7572008-11-18 20:30:24 +00001896 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1897 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001898#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001899 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001900#endif
aliguori880a7572008-11-18 20:30:24 +00001901 }
aliguoria1d1bb32008-11-18 20:07:32 +00001902}
1903
aurel32fab9d282009-04-08 21:29:37 +00001904static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1905{
Avi Kivity4c0960c2009-08-17 23:19:53 +03001906 cpu_synchronize_state(s->c_cpu);
Peter Maydella896d032012-03-12 06:24:45 +00001907#if defined(TARGET_I386)
aurel32fab9d282009-04-08 21:29:37 +00001908 s->c_cpu->eip = pc;
aurel32fab9d282009-04-08 21:29:37 +00001909#elif defined (TARGET_PPC)
1910 s->c_cpu->nip = pc;
1911#elif defined (TARGET_SPARC)
1912 s->c_cpu->pc = pc;
1913 s->c_cpu->npc = pc + 4;
1914#elif defined (TARGET_ARM)
1915 s->c_cpu->regs[15] = pc;
1916#elif defined (TARGET_SH4)
1917 s->c_cpu->pc = pc;
1918#elif defined (TARGET_MIPS)
Nathan Froydff1d1972009-12-08 08:06:30 -08001919 s->c_cpu->active_tc.PC = pc & ~(target_ulong)1;
1920 if (pc & 1) {
1921 s->c_cpu->hflags |= MIPS_HFLAG_M16;
1922 } else {
1923 s->c_cpu->hflags &= ~(MIPS_HFLAG_M16);
1924 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001925#elif defined (TARGET_MICROBLAZE)
1926 s->c_cpu->sregs[SR_PC] = pc;
aurel32fab9d282009-04-08 21:29:37 +00001927#elif defined (TARGET_CRIS)
1928 s->c_cpu->pc = pc;
1929#elif defined (TARGET_ALPHA)
1930 s->c_cpu->pc = pc;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001931#elif defined (TARGET_S390X)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001932 s->c_cpu->psw.addr = pc;
Michael Walle0c45d3d2011-02-17 23:45:06 +01001933#elif defined (TARGET_LM32)
1934 s->c_cpu->pc = pc;
Max Filippovccfcaba2011-09-06 03:55:52 +04001935#elif defined(TARGET_XTENSA)
1936 s->c_cpu->pc = pc;
aurel32fab9d282009-04-08 21:29:37 +00001937#endif
1938}
1939
Andreas Färber9349b4f2012-03-14 01:38:32 +01001940static inline int gdb_id(CPUArchState *env)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001941{
Juan Quintela2f7bb872009-07-27 16:13:24 +02001942#if defined(CONFIG_USER_ONLY) && defined(CONFIG_USE_NPTL)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001943 return env->host_tid;
1944#else
1945 return env->cpu_index + 1;
1946#endif
1947}
1948
Andreas Färber9349b4f2012-03-14 01:38:32 +01001949static CPUArchState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001950{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001951 CPUArchState *env;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001952
1953 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1954 if (gdb_id(env) == thread_id) {
1955 return env;
1956 }
1957 }
1958
1959 return NULL;
1960}
1961
aliguori880a7572008-11-18 20:30:24 +00001962static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001963{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001964 CPUArchState *env;
bellardb4608c02003-06-27 17:34:32 +00001965 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001966 uint32_t thread;
1967 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001968 char buf[MAX_PACKET_LENGTH];
1969 uint8_t mem_buf[MAX_PACKET_LENGTH];
1970 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001971 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001972
bellard858693c2004-03-31 18:52:07 +00001973#ifdef DEBUG_GDB
1974 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001975#endif
bellard858693c2004-03-31 18:52:07 +00001976 p = line_buf;
1977 ch = *p++;
1978 switch(ch) {
1979 case '?':
bellard1fddef42005-04-17 19:16:13 +00001980 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001981 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001982 gdb_id(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001983 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001984 /* Remove all the breakpoints when this query is issued,
1985 * because gdb is doing and initial connect and the state
1986 * should be cleaned up.
1987 */
aliguori880a7572008-11-18 20:30:24 +00001988 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001989 break;
1990 case 'c':
1991 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001992 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001993 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001994 }
aurel32ca587a82008-12-18 22:44:13 +00001995 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001996 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001997 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001998 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001999 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2000 if (s->signal == -1)
2001 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00002002 gdb_continue(s);
2003 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002004 case 'v':
2005 if (strncmp(p, "Cont", 4) == 0) {
2006 int res_signal, res_thread;
2007
2008 p += 4;
2009 if (*p == '?') {
2010 put_packet(s, "vCont;c;C;s;S");
2011 break;
2012 }
2013 res = 0;
2014 res_signal = 0;
2015 res_thread = 0;
2016 while (*p) {
2017 int action, signal;
2018
2019 if (*p++ != ';') {
2020 res = 0;
2021 break;
2022 }
2023 action = *p++;
2024 signal = 0;
2025 if (action == 'C' || action == 'S') {
2026 signal = strtoul(p, (char **)&p, 16);
2027 } else if (action != 'c' && action != 's') {
2028 res = 0;
2029 break;
2030 }
2031 thread = 0;
2032 if (*p == ':') {
2033 thread = strtoull(p+1, (char **)&p, 16);
2034 }
2035 action = tolower(action);
2036 if (res == 0 || (res == 'c' && action == 's')) {
2037 res = action;
2038 res_signal = signal;
2039 res_thread = thread;
2040 }
2041 }
2042 if (res) {
2043 if (res_thread != -1 && res_thread != 0) {
2044 env = find_cpu(res_thread);
2045 if (env == NULL) {
2046 put_packet(s, "E22");
2047 break;
2048 }
2049 s->c_cpu = env;
2050 }
2051 if (res == 's') {
2052 cpu_single_step(s->c_cpu, sstep_flags);
2053 }
2054 s->signal = res_signal;
2055 gdb_continue(s);
2056 return RS_IDLE;
2057 }
2058 break;
2059 } else {
2060 goto unknown_command;
2061 }
edgar_igl7d03f822008-05-17 18:58:29 +00002062 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002063#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002064 /* Kill the target */
2065 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2066 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002067#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002068 case 'D':
2069 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002070 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002071 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002072 gdb_continue(s);
2073 put_packet(s, "OK");
2074 break;
bellard858693c2004-03-31 18:52:07 +00002075 case 's':
2076 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002077 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002078 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002079 }
aliguori880a7572008-11-18 20:30:24 +00002080 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002081 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002082 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002083 case 'F':
2084 {
2085 target_ulong ret;
2086 target_ulong err;
2087
2088 ret = strtoull(p, (char **)&p, 16);
2089 if (*p == ',') {
2090 p++;
2091 err = strtoull(p, (char **)&p, 16);
2092 } else {
2093 err = 0;
2094 }
2095 if (*p == ',')
2096 p++;
2097 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002098 if (s->current_syscall_cb) {
2099 s->current_syscall_cb(s->c_cpu, ret, err);
2100 s->current_syscall_cb = NULL;
2101 }
pbrooka2d1eba2007-01-28 03:10:55 +00002102 if (type == 'C') {
2103 put_packet(s, "T02");
2104 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002105 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002106 }
2107 }
2108 break;
bellard858693c2004-03-31 18:52:07 +00002109 case 'g':
Avi Kivity4c0960c2009-08-17 23:19:53 +03002110 cpu_synchronize_state(s->g_cpu);
Max Filippovccfcaba2011-09-06 03:55:52 +04002111 env = s->g_cpu;
pbrook56aebc82008-10-11 17:55:29 +00002112 len = 0;
2113 for (addr = 0; addr < num_g_regs; addr++) {
aliguori880a7572008-11-18 20:30:24 +00002114 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002115 len += reg_size;
2116 }
2117 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002118 put_packet(s, buf);
2119 break;
2120 case 'G':
Avi Kivity4c0960c2009-08-17 23:19:53 +03002121 cpu_synchronize_state(s->g_cpu);
Max Filippovccfcaba2011-09-06 03:55:52 +04002122 env = s->g_cpu;
pbrook56aebc82008-10-11 17:55:29 +00002123 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002124 len = strlen(p) / 2;
2125 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00002126 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
aliguori880a7572008-11-18 20:30:24 +00002127 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002128 len -= reg_size;
2129 registers += reg_size;
2130 }
bellard858693c2004-03-31 18:52:07 +00002131 put_packet(s, "OK");
2132 break;
2133 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002134 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002135 if (*p == ',')
2136 p++;
bellard9d9754a2006-06-25 15:32:37 +00002137 len = strtoull(p, NULL, 16);
Fabien Chouteau44520db2011-09-08 12:48:16 +02002138 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002139 put_packet (s, "E14");
2140 } else {
2141 memtohex(buf, mem_buf, len);
2142 put_packet(s, buf);
2143 }
bellard858693c2004-03-31 18:52:07 +00002144 break;
2145 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002146 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002147 if (*p == ',')
2148 p++;
bellard9d9754a2006-06-25 15:32:37 +00002149 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002150 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002151 p++;
2152 hextomem(mem_buf, p, len);
Fabien Chouteau44520db2011-09-08 12:48:16 +02002153 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002154 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002155 } else {
bellard858693c2004-03-31 18:52:07 +00002156 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002157 }
bellard858693c2004-03-31 18:52:07 +00002158 break;
pbrook56aebc82008-10-11 17:55:29 +00002159 case 'p':
2160 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2161 This works, but can be very slow. Anything new enough to
2162 understand XML also knows how to use this properly. */
2163 if (!gdb_has_xml)
2164 goto unknown_command;
2165 addr = strtoull(p, (char **)&p, 16);
aliguori880a7572008-11-18 20:30:24 +00002166 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002167 if (reg_size) {
2168 memtohex(buf, mem_buf, reg_size);
2169 put_packet(s, buf);
2170 } else {
2171 put_packet(s, "E14");
2172 }
2173 break;
2174 case 'P':
2175 if (!gdb_has_xml)
2176 goto unknown_command;
2177 addr = strtoull(p, (char **)&p, 16);
2178 if (*p == '=')
2179 p++;
2180 reg_size = strlen(p) / 2;
2181 hextomem(mem_buf, p, reg_size);
aliguori880a7572008-11-18 20:30:24 +00002182 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002183 put_packet(s, "OK");
2184 break;
bellard858693c2004-03-31 18:52:07 +00002185 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002186 case 'z':
2187 type = strtoul(p, (char **)&p, 16);
2188 if (*p == ',')
2189 p++;
bellard9d9754a2006-06-25 15:32:37 +00002190 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002191 if (*p == ',')
2192 p++;
bellard9d9754a2006-06-25 15:32:37 +00002193 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002194 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002195 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002196 else
aliguori880a7572008-11-18 20:30:24 +00002197 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002198 if (res >= 0)
2199 put_packet(s, "OK");
2200 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002201 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002202 else
2203 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002204 break;
aliguori880a7572008-11-18 20:30:24 +00002205 case 'H':
2206 type = *p++;
2207 thread = strtoull(p, (char **)&p, 16);
2208 if (thread == -1 || thread == 0) {
2209 put_packet(s, "OK");
2210 break;
2211 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002212 env = find_cpu(thread);
aliguori880a7572008-11-18 20:30:24 +00002213 if (env == NULL) {
2214 put_packet(s, "E22");
2215 break;
2216 }
2217 switch (type) {
2218 case 'c':
2219 s->c_cpu = env;
2220 put_packet(s, "OK");
2221 break;
2222 case 'g':
2223 s->g_cpu = env;
2224 put_packet(s, "OK");
2225 break;
2226 default:
2227 put_packet(s, "E22");
2228 break;
2229 }
2230 break;
2231 case 'T':
2232 thread = strtoull(p, (char **)&p, 16);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002233 env = find_cpu(thread);
2234
2235 if (env != NULL) {
2236 put_packet(s, "OK");
2237 } else {
aliguori880a7572008-11-18 20:30:24 +00002238 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002239 }
aliguori880a7572008-11-18 20:30:24 +00002240 break;
pbrook978efd62006-06-17 18:30:42 +00002241 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002242 case 'Q':
2243 /* parse any 'q' packets here */
2244 if (!strcmp(p,"qemu.sstepbits")) {
2245 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002246 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2247 SSTEP_ENABLE,
2248 SSTEP_NOIRQ,
2249 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002250 put_packet(s, buf);
2251 break;
2252 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2253 /* Display or change the sstep_flags */
2254 p += 10;
2255 if (*p != '=') {
2256 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002257 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002258 put_packet(s, buf);
2259 break;
2260 }
2261 p++;
2262 type = strtoul(p, (char **)&p, 16);
2263 sstep_flags = type;
2264 put_packet(s, "OK");
2265 break;
aliguori880a7572008-11-18 20:30:24 +00002266 } else if (strcmp(p,"C") == 0) {
2267 /* "Current thread" remains vague in the spec, so always return
2268 * the first CPU (gdb returns the first thread). */
2269 put_packet(s, "QC1");
2270 break;
2271 } else if (strcmp(p,"fThreadInfo") == 0) {
2272 s->query_cpu = first_cpu;
2273 goto report_cpuinfo;
2274 } else if (strcmp(p,"sThreadInfo") == 0) {
2275 report_cpuinfo:
2276 if (s->query_cpu) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002277 snprintf(buf, sizeof(buf), "m%x", gdb_id(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00002278 put_packet(s, buf);
2279 s->query_cpu = s->query_cpu->next_cpu;
2280 } else
2281 put_packet(s, "l");
2282 break;
2283 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2284 thread = strtoull(p+16, (char **)&p, 16);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002285 env = find_cpu(thread);
2286 if (env != NULL) {
Avi Kivity4c0960c2009-08-17 23:19:53 +03002287 cpu_synchronize_state(env);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002288 len = snprintf((char *)mem_buf, sizeof(mem_buf),
2289 "CPU#%d [%s]", env->cpu_index,
2290 env->halted ? "halted " : "running");
2291 memtohex(buf, mem_buf, len);
2292 put_packet(s, buf);
2293 }
aliguori880a7572008-11-18 20:30:24 +00002294 break;
edgar_igl60897d32008-05-09 08:25:14 +00002295 }
blueswir10b8a9882009-03-07 10:51:36 +00002296#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002297 else if (strncmp(p, "Offsets", 7) == 0) {
aliguori880a7572008-11-18 20:30:24 +00002298 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00002299
blueswir1363a37d2008-08-21 17:58:08 +00002300 snprintf(buf, sizeof(buf),
2301 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2302 ";Bss=" TARGET_ABI_FMT_lx,
2303 ts->info->code_offset,
2304 ts->info->data_offset,
2305 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002306 put_packet(s, buf);
2307 break;
2308 }
blueswir10b8a9882009-03-07 10:51:36 +00002309#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002310 else if (strncmp(p, "Rcmd,", 5) == 0) {
2311 int len = strlen(p + 5);
2312
2313 if ((len % 2) != 0) {
2314 put_packet(s, "E01");
2315 break;
2316 }
2317 hextomem(mem_buf, p + 5, len);
2318 len = len / 2;
2319 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002320 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002321 put_packet(s, "OK");
2322 break;
2323 }
blueswir10b8a9882009-03-07 10:51:36 +00002324#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002325 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002326 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002327#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002328 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002329#endif
2330 put_packet(s, buf);
2331 break;
2332 }
2333#ifdef GDB_CORE_XML
2334 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2335 const char *xml;
2336 target_ulong total_len;
2337
2338 gdb_has_xml = 1;
2339 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002340 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002341 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002342 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002343 put_packet(s, buf);
2344 break;
2345 }
2346
2347 if (*p == ':')
2348 p++;
2349 addr = strtoul(p, (char **)&p, 16);
2350 if (*p == ',')
2351 p++;
2352 len = strtoul(p, (char **)&p, 16);
2353
2354 total_len = strlen(xml);
2355 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002356 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002357 put_packet(s, buf);
2358 break;
2359 }
2360 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2361 len = (MAX_PACKET_LENGTH - 5) / 2;
2362 if (len < total_len - addr) {
2363 buf[0] = 'm';
2364 len = memtox(buf + 1, xml + addr, len);
2365 } else {
2366 buf[0] = 'l';
2367 len = memtox(buf + 1, xml + addr, total_len - addr);
2368 }
2369 put_packet_binary(s, buf, len + 1);
2370 break;
2371 }
2372#endif
2373 /* Unrecognised 'q' command. */
2374 goto unknown_command;
2375
bellard858693c2004-03-31 18:52:07 +00002376 default:
pbrook56aebc82008-10-11 17:55:29 +00002377 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002378 /* put empty packet */
2379 buf[0] = '\0';
2380 put_packet(s, buf);
2381 break;
2382 }
2383 return RS_IDLE;
2384}
2385
Andreas Färber9349b4f2012-03-14 01:38:32 +01002386void gdb_set_stop_cpu(CPUArchState *env)
aliguori880a7572008-11-18 20:30:24 +00002387{
2388 gdbserver_state->c_cpu = env;
2389 gdbserver_state->g_cpu = env;
2390}
2391
bellard1fddef42005-04-17 19:16:13 +00002392#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002393static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002394{
aliguori880a7572008-11-18 20:30:24 +00002395 GDBState *s = gdbserver_state;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002396 CPUArchState *env = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002397 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002398 const char *type;
bellard858693c2004-03-31 18:52:07 +00002399 int ret;
2400
Meador Ingecdb432b2012-03-15 17:49:45 +00002401 if (running || s->state == RS_INACTIVE) {
2402 return;
2403 }
2404 /* Is there a GDB syscall waiting to be sent? */
2405 if (s->current_syscall_cb) {
2406 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002407 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002408 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002409 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002410 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002411 if (env->watchpoint_hit) {
2412 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002413 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002414 type = "r";
2415 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002416 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002417 type = "a";
2418 break;
2419 default:
2420 type = "";
2421 break;
2422 }
aliguori880a7572008-11-18 20:30:24 +00002423 snprintf(buf, sizeof(buf),
2424 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002425 GDB_SIGNAL_TRAP, gdb_id(env), type,
aliguori880a7572008-11-18 20:30:24 +00002426 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002427 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002428 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002429 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002430 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002431 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002432 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002433 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002434 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002435 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002436 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002437 ret = GDB_SIGNAL_QUIT;
2438 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002439 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002440 ret = GDB_SIGNAL_IO;
2441 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002442 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002443 ret = GDB_SIGNAL_ALRM;
2444 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002445 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002446 ret = GDB_SIGNAL_ABRT;
2447 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002448 case RUN_STATE_SAVE_VM:
2449 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002450 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002451 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002452 ret = GDB_SIGNAL_XCPU;
2453 break;
2454 default:
2455 ret = GDB_SIGNAL_UNKNOWN;
2456 break;
bellardbbeb7b52006-04-23 18:42:15 +00002457 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002458 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, gdb_id(env));
Jan Kiszka425189a2011-03-22 11:02:09 +01002459
2460send_packet:
bellard858693c2004-03-31 18:52:07 +00002461 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002462
2463 /* disable single step if it was enabled */
2464 cpu_single_step(env, 0);
bellard858693c2004-03-31 18:52:07 +00002465}
bellard1fddef42005-04-17 19:16:13 +00002466#endif
bellard858693c2004-03-31 18:52:07 +00002467
pbrooka2d1eba2007-01-28 03:10:55 +00002468/* Send a gdb syscall request.
2469 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002470 %x - target_ulong argument printed in hex.
2471 %lx - 64-bit argument printed in hex.
2472 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002473void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002474{
2475 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002476 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002477 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002478 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002479 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002480 GDBState *s;
2481
aliguori880a7572008-11-18 20:30:24 +00002482 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002483 if (!s)
2484 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002485 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002486#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002487 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002488#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002489 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002490 p = s->syscall_buf;
2491 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002492 *(p++) = 'F';
2493 while (*fmt) {
2494 if (*fmt == '%') {
2495 fmt++;
2496 switch (*fmt++) {
2497 case 'x':
2498 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002499 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002500 break;
pbrooka87295e2007-05-26 15:09:38 +00002501 case 'l':
2502 if (*(fmt++) != 'x')
2503 goto bad_format;
2504 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002505 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002506 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002507 case 's':
2508 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002509 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002510 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002511 break;
2512 default:
pbrooka87295e2007-05-26 15:09:38 +00002513 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002514 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2515 fmt - 1);
2516 break;
2517 }
2518 } else {
2519 *(p++) = *(fmt++);
2520 }
2521 }
pbrook8a93e022007-08-06 13:19:15 +00002522 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002523 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002524#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002525 put_packet(s, s->syscall_buf);
aliguori880a7572008-11-18 20:30:24 +00002526 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002527#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002528 /* In this case wait to send the syscall packet until notification that
2529 the CPU has stopped. This must be done because if the packet is sent
2530 now the reply from the syscall request could be received while the CPU
2531 is still in the running state, which can cause packets to be dropped
2532 and state transition 'T' packets to be sent while the syscall is still
2533 being processed. */
aurel323098dba2009-03-07 21:28:24 +00002534 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002535#endif
2536}
2537
bellard6a00d602005-11-21 23:25:50 +00002538static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002539{
2540 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002541 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002542
bellard1fddef42005-04-17 19:16:13 +00002543#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002544 if (s->last_packet_len) {
2545 /* Waiting for a response to the last packet. If we see the start
2546 of a new command then abandon the previous response. */
2547 if (ch == '-') {
2548#ifdef DEBUG_GDB
2549 printf("Got NACK, retransmitting\n");
2550#endif
thsffe8ab82007-12-16 03:16:05 +00002551 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002552 }
2553#ifdef DEBUG_GDB
2554 else if (ch == '+')
2555 printf("Got ACK\n");
2556 else
2557 printf("Got '%c' when expecting ACK/NACK\n", ch);
2558#endif
2559 if (ch == '+' || ch == '$')
2560 s->last_packet_len = 0;
2561 if (ch != '$')
2562 return;
2563 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002564 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002565 /* when the CPU is running, we cannot do anything except stop
2566 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002567 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002568 } else
bellard1fddef42005-04-17 19:16:13 +00002569#endif
bellard41625032005-04-24 10:07:11 +00002570 {
bellard858693c2004-03-31 18:52:07 +00002571 switch(s->state) {
2572 case RS_IDLE:
2573 if (ch == '$') {
2574 s->line_buf_index = 0;
2575 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002576 }
2577 break;
bellard858693c2004-03-31 18:52:07 +00002578 case RS_GETLINE:
2579 if (ch == '#') {
2580 s->state = RS_CHKSUM1;
2581 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2582 s->state = RS_IDLE;
2583 } else {
2584 s->line_buf[s->line_buf_index++] = ch;
2585 }
2586 break;
2587 case RS_CHKSUM1:
2588 s->line_buf[s->line_buf_index] = '\0';
2589 s->line_csum = fromhex(ch) << 4;
2590 s->state = RS_CHKSUM2;
2591 break;
2592 case RS_CHKSUM2:
2593 s->line_csum |= fromhex(ch);
2594 csum = 0;
2595 for(i = 0; i < s->line_buf_index; i++) {
2596 csum += s->line_buf[i];
2597 }
2598 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002599 reply = '-';
2600 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002601 s->state = RS_IDLE;
2602 } else {
ths60fe76f2007-12-16 03:02:09 +00002603 reply = '+';
2604 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002605 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002606 }
bellardb4608c02003-06-27 17:34:32 +00002607 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002608 default:
2609 abort();
bellardb4608c02003-06-27 17:34:32 +00002610 }
2611 }
bellard858693c2004-03-31 18:52:07 +00002612}
2613
Paul Brook0e1c9c52010-06-16 13:03:51 +01002614/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002615void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002616{
2617 GDBState *s;
2618 char buf[4];
2619
2620 s = gdbserver_state;
2621 if (!s) {
2622 return;
2623 }
2624#ifdef CONFIG_USER_ONLY
2625 if (gdbserver_fd < 0 || s->fd < 0) {
2626 return;
2627 }
2628#endif
2629
2630 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2631 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002632
2633#ifndef CONFIG_USER_ONLY
2634 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002635 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002636 }
2637#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002638}
2639
bellard1fddef42005-04-17 19:16:13 +00002640#ifdef CONFIG_USER_ONLY
2641int
aurel32ca587a82008-12-18 22:44:13 +00002642gdb_queuesig (void)
2643{
2644 GDBState *s;
2645
2646 s = gdbserver_state;
2647
2648 if (gdbserver_fd < 0 || s->fd < 0)
2649 return 0;
2650 else
2651 return 1;
2652}
2653
2654int
Andreas Färber9349b4f2012-03-14 01:38:32 +01002655gdb_handlesig (CPUArchState *env, int sig)
bellard1fddef42005-04-17 19:16:13 +00002656{
2657 GDBState *s;
2658 char buf[256];
2659 int n;
2660
aliguori880a7572008-11-18 20:30:24 +00002661 s = gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00002662 if (gdbserver_fd < 0 || s->fd < 0)
2663 return sig;
bellard1fddef42005-04-17 19:16:13 +00002664
2665 /* disable single step if it was enabled */
2666 cpu_single_step(env, 0);
2667 tb_flush(env);
2668
2669 if (sig != 0)
2670 {
aurel32ca587a82008-12-18 22:44:13 +00002671 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb (sig));
bellard1fddef42005-04-17 19:16:13 +00002672 put_packet(s, buf);
2673 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002674 /* put_packet() might have detected that the peer terminated the
2675 connection. */
2676 if (s->fd < 0)
2677 return sig;
bellard1fddef42005-04-17 19:16:13 +00002678
bellard1fddef42005-04-17 19:16:13 +00002679 sig = 0;
2680 s->state = RS_IDLE;
bellard41625032005-04-24 10:07:11 +00002681 s->running_state = 0;
2682 while (s->running_state == 0) {
bellard1fddef42005-04-17 19:16:13 +00002683 n = read (s->fd, buf, 256);
2684 if (n > 0)
2685 {
2686 int i;
2687
2688 for (i = 0; i < n; i++)
bellard6a00d602005-11-21 23:25:50 +00002689 gdb_read_byte (s, buf[i]);
bellard1fddef42005-04-17 19:16:13 +00002690 }
2691 else if (n == 0 || errno != EAGAIN)
2692 {
Stefan Weile7d81002011-12-10 00:19:46 +01002693 /* XXX: Connection closed. Should probably wait for another
bellard1fddef42005-04-17 19:16:13 +00002694 connection before continuing. */
2695 return sig;
2696 }
bellard41625032005-04-24 10:07:11 +00002697 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002698 sig = s->signal;
2699 s->signal = 0;
bellard1fddef42005-04-17 19:16:13 +00002700 return sig;
2701}
bellarde9009672005-04-26 20:42:36 +00002702
aurel32ca587a82008-12-18 22:44:13 +00002703/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002704void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002705{
2706 GDBState *s;
2707 char buf[4];
2708
2709 s = gdbserver_state;
2710 if (gdbserver_fd < 0 || s->fd < 0)
2711 return;
2712
2713 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb (sig));
2714 put_packet(s, buf);
2715}
bellard1fddef42005-04-17 19:16:13 +00002716
aliguori880a7572008-11-18 20:30:24 +00002717static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002718{
2719 GDBState *s;
2720 struct sockaddr_in sockaddr;
2721 socklen_t len;
2722 int val, fd;
2723
2724 for(;;) {
2725 len = sizeof(sockaddr);
2726 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2727 if (fd < 0 && errno != EINTR) {
2728 perror("accept");
2729 return;
2730 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002731#ifndef _WIN32
2732 fcntl(fd, F_SETFD, FD_CLOEXEC);
2733#endif
bellard858693c2004-03-31 18:52:07 +00002734 break;
2735 }
2736 }
2737
2738 /* set short latency */
2739 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00002740 setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
ths3b46e622007-09-17 08:09:54 +00002741
Anthony Liguori7267c092011-08-20 22:09:37 -05002742 s = g_malloc0(sizeof(GDBState));
aliguori880a7572008-11-18 20:30:24 +00002743 s->c_cpu = first_cpu;
2744 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002745 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002746 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002747
aliguori880a7572008-11-18 20:30:24 +00002748 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002749
bellard858693c2004-03-31 18:52:07 +00002750 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002751}
2752
2753static int gdbserver_open(int port)
2754{
2755 struct sockaddr_in sockaddr;
2756 int fd, val, ret;
2757
2758 fd = socket(PF_INET, SOCK_STREAM, 0);
2759 if (fd < 0) {
2760 perror("socket");
2761 return -1;
2762 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002763#ifndef _WIN32
2764 fcntl(fd, F_SETFD, FD_CLOEXEC);
2765#endif
bellard858693c2004-03-31 18:52:07 +00002766
2767 /* allow fast reuse */
2768 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00002769 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002770
2771 sockaddr.sin_family = AF_INET;
2772 sockaddr.sin_port = htons(port);
2773 sockaddr.sin_addr.s_addr = 0;
2774 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2775 if (ret < 0) {
2776 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002777 close(fd);
bellard858693c2004-03-31 18:52:07 +00002778 return -1;
2779 }
2780 ret = listen(fd, 0);
2781 if (ret < 0) {
2782 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002783 close(fd);
bellard858693c2004-03-31 18:52:07 +00002784 return -1;
2785 }
bellard858693c2004-03-31 18:52:07 +00002786 return fd;
2787}
2788
2789int gdbserver_start(int port)
2790{
2791 gdbserver_fd = gdbserver_open(port);
2792 if (gdbserver_fd < 0)
2793 return -1;
2794 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002795 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002796 return 0;
2797}
aurel322b1319c2008-12-18 22:44:04 +00002798
2799/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002800void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002801{
2802 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002803 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002804 return;
2805 close(s->fd);
2806 s->fd = -1;
2807 cpu_breakpoint_remove_all(env, BP_GDB);
2808 cpu_watchpoint_remove_all(env, BP_GDB);
2809}
pbrook4046d912007-01-28 01:53:16 +00002810#else
thsaa1f17c2007-07-11 22:48:58 +00002811static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002812{
pbrook56aebc82008-10-11 17:55:29 +00002813 /* We can handle an arbitrarily large amount of data.
2814 Pick the maximum packet size, which is as good as anything. */
2815 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002816}
2817
thsaa1f17c2007-07-11 22:48:58 +00002818static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002819{
pbrook4046d912007-01-28 01:53:16 +00002820 int i;
2821
2822 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002823 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002824 }
2825}
2826
2827static void gdb_chr_event(void *opaque, int event)
2828{
2829 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302830 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002831 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002832 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002833 break;
2834 default:
2835 break;
2836 }
2837}
2838
aliguori8a34a0f2009-03-05 23:01:55 +00002839static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2840{
2841 char buf[MAX_PACKET_LENGTH];
2842
2843 buf[0] = 'O';
2844 if (len > (MAX_PACKET_LENGTH/2) - 1)
2845 len = (MAX_PACKET_LENGTH/2) - 1;
2846 memtohex(buf + 1, (uint8_t *)msg, len);
2847 put_packet(s, buf);
2848}
2849
2850static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2851{
2852 const char *p = (const char *)buf;
2853 int max_sz;
2854
2855 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2856 for (;;) {
2857 if (len <= max_sz) {
2858 gdb_monitor_output(gdbserver_state, p, len);
2859 break;
2860 }
2861 gdb_monitor_output(gdbserver_state, p, max_sz);
2862 p += max_sz;
2863 len -= max_sz;
2864 }
2865 return len;
2866}
2867
aliguori59030a82009-04-05 18:43:41 +00002868#ifndef _WIN32
2869static void gdb_sigterm_handler(int signal)
2870{
Luiz Capitulino13548692011-07-29 15:36:43 -03002871 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002872 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002873 }
aliguori59030a82009-04-05 18:43:41 +00002874}
2875#endif
2876
2877int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002878{
2879 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002880 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002881 CharDriverState *chr = NULL;
2882 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002883
aliguori59030a82009-04-05 18:43:41 +00002884 if (!device)
2885 return -1;
2886 if (strcmp(device, "none") != 0) {
2887 if (strstart(device, "tcp:", NULL)) {
2888 /* enforce required TCP attributes */
2889 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2890 "%s,nowait,nodelay,server", device);
2891 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002892 }
aliguori59030a82009-04-05 18:43:41 +00002893#ifndef _WIN32
2894 else if (strcmp(device, "stdio") == 0) {
2895 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002896
aliguori59030a82009-04-05 18:43:41 +00002897 memset(&act, 0, sizeof(act));
2898 act.sa_handler = gdb_sigterm_handler;
2899 sigaction(SIGINT, &act, NULL);
2900 }
2901#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002902 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002903 if (!chr)
2904 return -1;
2905
2906 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2907 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002908 }
2909
aliguori36556b22009-03-28 18:05:53 +00002910 s = gdbserver_state;
2911 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002912 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002913 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002914
aliguori36556b22009-03-28 18:05:53 +00002915 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2916
2917 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002918 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002919 mon_chr->chr_write = gdb_monitor_write;
2920 monitor_init(mon_chr, 0);
2921 } else {
2922 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002923 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002924 mon_chr = s->mon_chr;
2925 memset(s, 0, sizeof(GDBState));
2926 }
aliguori880a7572008-11-18 20:30:24 +00002927 s->c_cpu = first_cpu;
2928 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002929 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002930 s->state = chr ? RS_IDLE : RS_INACTIVE;
2931 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002932 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002933
pbrook4046d912007-01-28 01:53:16 +00002934 return 0;
2935}
2936#endif