blob: a91709f27121ee2bcbf851d44345c41e702623b7 [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}
Jia Liufc043552012-07-20 15:50:50 +08001158#elif defined(TARGET_OPENRISC)
1159
1160#define NUM_CORE_REGS (32 + 3)
1161
1162static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
1163{
1164 if (n < 32) {
1165 GET_REG32(env->gpr[n]);
1166 } else {
1167 switch (n) {
1168 case 32: /* PPC */
1169 GET_REG32(env->ppc);
1170 break;
1171
1172 case 33: /* NPC */
1173 GET_REG32(env->npc);
1174 break;
1175
1176 case 34: /* SR */
1177 GET_REG32(env->sr);
1178 break;
1179
1180 default:
1181 break;
1182 }
1183 }
1184 return 0;
1185}
1186
1187static int cpu_gdb_write_register(CPUOpenRISCState *env,
1188 uint8_t *mem_buf, int n)
1189{
1190 uint32_t tmp;
1191
1192 if (n > NUM_CORE_REGS) {
1193 return 0;
1194 }
1195
1196 tmp = ldl_p(mem_buf);
1197
1198 if (n < 32) {
1199 env->gpr[n] = tmp;
1200 } else {
1201 switch (n) {
1202 case 32: /* PPC */
1203 env->ppc = tmp;
1204 break;
1205
1206 case 33: /* NPC */
1207 env->npc = tmp;
1208 break;
1209
1210 case 34: /* SR */
1211 env->sr = tmp;
1212 break;
1213
1214 default:
1215 break;
1216 }
1217 }
1218 return 4;
1219}
bellardfdf9b3e2006-04-27 21:07:38 +00001220#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001221
1222/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001223/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001224
pbrook56aebc82008-10-11 17:55:29 +00001225#define NUM_CORE_REGS 59
1226
Andreas Färberf3840912012-02-20 06:44:56 +01001227static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001228{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001229 switch (n) {
1230 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +00001231 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1232 GET_REGL(env->gregs[n + 16]);
1233 } else {
1234 GET_REGL(env->gregs[n]);
1235 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001236 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001237 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001238 case 16:
1239 GET_REGL(env->pc);
1240 case 17:
1241 GET_REGL(env->pr);
1242 case 18:
1243 GET_REGL(env->gbr);
1244 case 19:
1245 GET_REGL(env->vbr);
1246 case 20:
1247 GET_REGL(env->mach);
1248 case 21:
1249 GET_REGL(env->macl);
1250 case 22:
1251 GET_REGL(env->sr);
1252 case 23:
1253 GET_REGL(env->fpul);
1254 case 24:
1255 GET_REGL(env->fpscr);
1256 case 25 ... 40:
1257 if (env->fpscr & FPSCR_FR) {
1258 stfl_p(mem_buf, env->fregs[n - 9]);
1259 } else {
1260 stfl_p(mem_buf, env->fregs[n - 25]);
1261 }
1262 return 4;
1263 case 41:
1264 GET_REGL(env->ssr);
1265 case 42:
1266 GET_REGL(env->spc);
1267 case 43 ... 50:
1268 GET_REGL(env->gregs[n - 43]);
1269 case 51 ... 58:
1270 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +00001271 }
bellardfdf9b3e2006-04-27 21:07:38 +00001272
pbrook56aebc82008-10-11 17:55:29 +00001273 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001274}
1275
Andreas Färberf3840912012-02-20 06:44:56 +01001276static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001277{
pbrook56aebc82008-10-11 17:55:29 +00001278 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001279 case 0 ... 7:
1280 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1281 env->gregs[n + 16] = ldl_p(mem_buf);
1282 } else {
1283 env->gregs[n] = ldl_p(mem_buf);
1284 }
1285 break;
1286 case 8 ... 15:
1287 env->gregs[n] = ldl_p(mem_buf);
1288 break;
1289 case 16:
1290 env->pc = ldl_p(mem_buf);
1291 break;
1292 case 17:
1293 env->pr = ldl_p(mem_buf);
1294 break;
1295 case 18:
1296 env->gbr = ldl_p(mem_buf);
1297 break;
1298 case 19:
1299 env->vbr = ldl_p(mem_buf);
1300 break;
1301 case 20:
1302 env->mach = ldl_p(mem_buf);
1303 break;
1304 case 21:
1305 env->macl = ldl_p(mem_buf);
1306 break;
1307 case 22:
1308 env->sr = ldl_p(mem_buf);
1309 break;
1310 case 23:
1311 env->fpul = ldl_p(mem_buf);
1312 break;
1313 case 24:
1314 env->fpscr = ldl_p(mem_buf);
1315 break;
1316 case 25 ... 40:
1317 if (env->fpscr & FPSCR_FR) {
1318 env->fregs[n - 9] = ldfl_p(mem_buf);
1319 } else {
1320 env->fregs[n - 25] = ldfl_p(mem_buf);
1321 }
1322 break;
1323 case 41:
1324 env->ssr = ldl_p(mem_buf);
1325 break;
1326 case 42:
1327 env->spc = ldl_p(mem_buf);
1328 break;
1329 case 43 ... 50:
1330 env->gregs[n - 43] = ldl_p(mem_buf);
1331 break;
1332 case 51 ... 58:
1333 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
1334 break;
pbrook56aebc82008-10-11 17:55:29 +00001335 default: return 0;
1336 }
1337
1338 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001339}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001340#elif defined (TARGET_MICROBLAZE)
1341
1342#define NUM_CORE_REGS (32 + 5)
1343
Andreas Färberf3840912012-02-20 06:44:56 +01001344static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001345{
1346 if (n < 32) {
1347 GET_REG32(env->regs[n]);
1348 } else {
1349 GET_REG32(env->sregs[n - 32]);
1350 }
1351 return 0;
1352}
1353
Andreas Färberf3840912012-02-20 06:44:56 +01001354static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001355{
1356 uint32_t tmp;
1357
1358 if (n > NUM_CORE_REGS)
1359 return 0;
1360
1361 tmp = ldl_p(mem_buf);
1362
1363 if (n < 32) {
1364 env->regs[n] = tmp;
1365 } else {
1366 env->sregs[n - 32] = tmp;
1367 }
1368 return 4;
1369}
thsf1ccf902007-10-08 13:16:14 +00001370#elif defined (TARGET_CRIS)
1371
pbrook56aebc82008-10-11 17:55:29 +00001372#define NUM_CORE_REGS 49
1373
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001374static int
Andreas Färberf3840912012-02-20 06:44:56 +01001375read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001376{
1377 if (n < 15) {
1378 GET_REG32(env->regs[n]);
1379 }
1380
1381 if (n == 15) {
1382 GET_REG32(env->pc);
1383 }
1384
1385 if (n < 32) {
1386 switch (n) {
1387 case 16:
1388 GET_REG8(env->pregs[n - 16]);
1389 break;
1390 case 17:
1391 GET_REG8(env->pregs[n - 16]);
1392 break;
1393 case 20:
1394 case 21:
1395 GET_REG16(env->pregs[n - 16]);
1396 break;
1397 default:
1398 if (n >= 23) {
1399 GET_REG32(env->pregs[n - 16]);
1400 }
1401 break;
1402 }
1403 }
1404 return 0;
1405}
1406
Andreas Färberf3840912012-02-20 06:44:56 +01001407static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001408{
pbrook56aebc82008-10-11 17:55:29 +00001409 uint8_t srs;
1410
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001411 if (env->pregs[PR_VR] < 32)
1412 return read_register_crisv10(env, mem_buf, n);
1413
pbrook56aebc82008-10-11 17:55:29 +00001414 srs = env->pregs[PR_SRS];
1415 if (n < 16) {
1416 GET_REG32(env->regs[n]);
1417 }
1418
1419 if (n >= 21 && n < 32) {
1420 GET_REG32(env->pregs[n - 16]);
1421 }
1422 if (n >= 33 && n < 49) {
1423 GET_REG32(env->sregs[srs][n - 33]);
1424 }
1425 switch (n) {
1426 case 16: GET_REG8(env->pregs[0]);
1427 case 17: GET_REG8(env->pregs[1]);
1428 case 18: GET_REG32(env->pregs[2]);
1429 case 19: GET_REG8(srs);
1430 case 20: GET_REG16(env->pregs[4]);
1431 case 32: GET_REG32(env->pc);
1432 }
1433
1434 return 0;
thsf1ccf902007-10-08 13:16:14 +00001435}
1436
Andreas Färberf3840912012-02-20 06:44:56 +01001437static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001438{
pbrook56aebc82008-10-11 17:55:29 +00001439 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001440
pbrook56aebc82008-10-11 17:55:29 +00001441 if (n > 49)
1442 return 0;
thsf1ccf902007-10-08 13:16:14 +00001443
pbrook56aebc82008-10-11 17:55:29 +00001444 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001445
pbrook56aebc82008-10-11 17:55:29 +00001446 if (n < 16) {
1447 env->regs[n] = tmp;
1448 }
thsf1ccf902007-10-08 13:16:14 +00001449
edgar_igld7b69672008-10-11 19:32:21 +00001450 if (n >= 21 && n < 32) {
1451 env->pregs[n - 16] = tmp;
1452 }
1453
1454 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001455 switch (n) {
1456 case 16: return 1;
1457 case 17: return 1;
edgar_igld7b69672008-10-11 19:32:21 +00001458 case 18: env->pregs[PR_PID] = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +00001459 case 19: return 1;
1460 case 20: return 2;
1461 case 32: env->pc = tmp; break;
1462 }
thsf1ccf902007-10-08 13:16:14 +00001463
pbrook56aebc82008-10-11 17:55:29 +00001464 return 4;
thsf1ccf902007-10-08 13:16:14 +00001465}
aurel3219bf5172008-12-07 23:26:32 +00001466#elif defined (TARGET_ALPHA)
1467
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001468#define NUM_CORE_REGS 67
aurel3219bf5172008-12-07 23:26:32 +00001469
Andreas Färberf3840912012-02-20 06:44:56 +01001470static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001471{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001472 uint64_t val;
1473 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001474
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001475 switch (n) {
1476 case 0 ... 30:
1477 val = env->ir[n];
1478 break;
1479 case 32 ... 62:
1480 d.d = env->fir[n - 32];
1481 val = d.ll;
1482 break;
1483 case 63:
1484 val = cpu_alpha_load_fpcr(env);
1485 break;
1486 case 64:
1487 val = env->pc;
1488 break;
1489 case 66:
1490 val = env->unique;
1491 break;
1492 case 31:
1493 case 65:
1494 /* 31 really is the zero register; 65 is unassigned in the
1495 gdb protocol, but is still required to occupy 8 bytes. */
1496 val = 0;
1497 break;
1498 default:
1499 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001500 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001501 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001502}
1503
Andreas Färberf3840912012-02-20 06:44:56 +01001504static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001505{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001506 target_ulong tmp = ldtul_p(mem_buf);
1507 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001508
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001509 switch (n) {
1510 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001511 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001512 break;
1513 case 32 ... 62:
1514 d.ll = tmp;
1515 env->fir[n - 32] = d.d;
1516 break;
1517 case 63:
1518 cpu_alpha_store_fpcr(env, tmp);
1519 break;
1520 case 64:
1521 env->pc = tmp;
1522 break;
1523 case 66:
1524 env->unique = tmp;
1525 break;
1526 case 31:
1527 case 65:
1528 /* 31 really is the zero register; 65 is unassigned in the
1529 gdb protocol, but is still required to occupy 8 bytes. */
1530 break;
1531 default:
1532 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001533 }
aurel3219bf5172008-12-07 23:26:32 +00001534 return 8;
1535}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001536#elif defined (TARGET_S390X)
1537
1538#define NUM_CORE_REGS S390_NUM_TOTAL_REGS
1539
Andreas Färberf3840912012-02-20 06:44:56 +01001540static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001541{
1542 switch (n) {
1543 case S390_PSWM_REGNUM: GET_REGL(env->psw.mask); break;
1544 case S390_PSWA_REGNUM: GET_REGL(env->psw.addr); break;
1545 case S390_R0_REGNUM ... S390_R15_REGNUM:
1546 GET_REGL(env->regs[n-S390_R0_REGNUM]); break;
1547 case S390_A0_REGNUM ... S390_A15_REGNUM:
1548 GET_REG32(env->aregs[n-S390_A0_REGNUM]); break;
1549 case S390_FPC_REGNUM: GET_REG32(env->fpc); break;
1550 case S390_F0_REGNUM ... S390_F15_REGNUM:
1551 /* XXX */
1552 break;
1553 case S390_PC_REGNUM: GET_REGL(env->psw.addr); break;
Alexander Graf59467ba2011-03-23 10:58:07 +01001554 case S390_CC_REGNUM:
1555 env->cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst,
1556 env->cc_vr);
1557 GET_REG32(env->cc_op);
1558 break;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001559 }
1560
1561 return 0;
1562}
1563
Andreas Färberf3840912012-02-20 06:44:56 +01001564static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001565{
1566 target_ulong tmpl;
1567 uint32_t tmp32;
1568 int r = 8;
1569 tmpl = ldtul_p(mem_buf);
1570 tmp32 = ldl_p(mem_buf);
1571
1572 switch (n) {
1573 case S390_PSWM_REGNUM: env->psw.mask = tmpl; break;
1574 case S390_PSWA_REGNUM: env->psw.addr = tmpl; break;
1575 case S390_R0_REGNUM ... S390_R15_REGNUM:
1576 env->regs[n-S390_R0_REGNUM] = tmpl; break;
1577 case S390_A0_REGNUM ... S390_A15_REGNUM:
1578 env->aregs[n-S390_A0_REGNUM] = tmp32; r=4; break;
1579 case S390_FPC_REGNUM: env->fpc = tmp32; r=4; break;
1580 case S390_F0_REGNUM ... S390_F15_REGNUM:
1581 /* XXX */
1582 break;
1583 case S390_PC_REGNUM: env->psw.addr = tmpl; break;
Alexander Graf59467ba2011-03-23 10:58:07 +01001584 case S390_CC_REGNUM: env->cc_op = tmp32; r=4; break;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001585 }
1586
1587 return r;
1588}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001589#elif defined (TARGET_LM32)
1590
1591#include "hw/lm32_pic.h"
1592#define NUM_CORE_REGS (32 + 7)
1593
Andreas Färberf3840912012-02-20 06:44:56 +01001594static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001595{
1596 if (n < 32) {
1597 GET_REG32(env->regs[n]);
1598 } else {
1599 switch (n) {
1600 case 32:
1601 GET_REG32(env->pc);
1602 break;
1603 /* FIXME: put in right exception ID */
1604 case 33:
1605 GET_REG32(0);
1606 break;
1607 case 34:
1608 GET_REG32(env->eba);
1609 break;
1610 case 35:
1611 GET_REG32(env->deba);
1612 break;
1613 case 36:
1614 GET_REG32(env->ie);
1615 break;
1616 case 37:
1617 GET_REG32(lm32_pic_get_im(env->pic_state));
1618 break;
1619 case 38:
1620 GET_REG32(lm32_pic_get_ip(env->pic_state));
1621 break;
1622 }
1623 }
1624 return 0;
1625}
1626
Andreas Färberf3840912012-02-20 06:44:56 +01001627static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001628{
1629 uint32_t tmp;
1630
1631 if (n > NUM_CORE_REGS) {
1632 return 0;
1633 }
1634
1635 tmp = ldl_p(mem_buf);
1636
1637 if (n < 32) {
1638 env->regs[n] = tmp;
1639 } else {
1640 switch (n) {
1641 case 32:
1642 env->pc = tmp;
1643 break;
1644 case 34:
1645 env->eba = tmp;
1646 break;
1647 case 35:
1648 env->deba = tmp;
1649 break;
1650 case 36:
1651 env->ie = tmp;
1652 break;
1653 case 37:
1654 lm32_pic_set_im(env->pic_state, tmp);
1655 break;
1656 case 38:
1657 lm32_pic_set_ip(env->pic_state, tmp);
1658 break;
1659 }
1660 }
1661 return 4;
1662}
Max Filippovccfcaba2011-09-06 03:55:52 +04001663#elif defined(TARGET_XTENSA)
1664
1665/* Use num_core_regs to see only non-privileged registers in an unmodified gdb.
1666 * Use num_regs to see all registers. gdb modification is required for that:
1667 * reset bit 0 in the 'flags' field of the registers definitions in the
1668 * gdb/xtensa-config.c inside gdb source tree or inside gdb overlay.
1669 */
1670#define NUM_CORE_REGS (env->config->gdb_regmap.num_regs)
1671#define num_g_regs NUM_CORE_REGS
1672
Andreas Färberf3840912012-02-20 06:44:56 +01001673static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001674{
1675 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1676
1677 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1678 return 0;
1679 }
1680
1681 switch (reg->type) {
1682 case 9: /*pc*/
1683 GET_REG32(env->pc);
1684 break;
1685
1686 case 1: /*ar*/
1687 xtensa_sync_phys_from_window(env);
1688 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
1689 break;
1690
1691 case 2: /*SR*/
1692 GET_REG32(env->sregs[reg->targno & 0xff]);
1693 break;
1694
1695 case 3: /*UR*/
1696 GET_REG32(env->uregs[reg->targno & 0xff]);
1697 break;
1698
1699 case 8: /*a*/
1700 GET_REG32(env->regs[reg->targno & 0x0f]);
1701 break;
1702
1703 default:
1704 qemu_log("%s from reg %d of unsupported type %d\n",
1705 __func__, n, reg->type);
1706 return 0;
1707 }
1708}
1709
Andreas Färberf3840912012-02-20 06:44:56 +01001710static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001711{
1712 uint32_t tmp;
1713 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1714
1715 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1716 return 0;
1717 }
1718
1719 tmp = ldl_p(mem_buf);
1720
1721 switch (reg->type) {
1722 case 9: /*pc*/
1723 env->pc = tmp;
1724 break;
1725
1726 case 1: /*ar*/
1727 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1728 xtensa_sync_window_from_phys(env);
1729 break;
1730
1731 case 2: /*SR*/
1732 env->sregs[reg->targno & 0xff] = tmp;
1733 break;
1734
1735 case 3: /*UR*/
1736 env->uregs[reg->targno & 0xff] = tmp;
1737 break;
1738
1739 case 8: /*a*/
1740 env->regs[reg->targno & 0x0f] = tmp;
1741 break;
1742
1743 default:
1744 qemu_log("%s to reg %d of unsupported type %d\n",
1745 __func__, n, reg->type);
1746 return 0;
1747 }
1748
1749 return 4;
1750}
bellard1fddef42005-04-17 19:16:13 +00001751#else
pbrook56aebc82008-10-11 17:55:29 +00001752
1753#define NUM_CORE_REGS 0
1754
Andreas Färber9349b4f2012-03-14 01:38:32 +01001755static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001756{
1757 return 0;
1758}
1759
Andreas Färber9349b4f2012-03-14 01:38:32 +01001760static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001761{
pbrook56aebc82008-10-11 17:55:29 +00001762 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001763}
1764
1765#endif
bellardb4608c02003-06-27 17:34:32 +00001766
Max Filippovccfcaba2011-09-06 03:55:52 +04001767#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001768static int num_g_regs = NUM_CORE_REGS;
Max Filippovccfcaba2011-09-06 03:55:52 +04001769#endif
pbrook56aebc82008-10-11 17:55:29 +00001770
1771#ifdef GDB_CORE_XML
1772/* Encode data using the encoding for 'x' packets. */
1773static int memtox(char *buf, const char *mem, int len)
1774{
1775 char *p = buf;
1776 char c;
1777
1778 while (len--) {
1779 c = *(mem++);
1780 switch (c) {
1781 case '#': case '$': case '*': case '}':
1782 *(p++) = '}';
1783 *(p++) = c ^ 0x20;
1784 break;
1785 default:
1786 *(p++) = c;
1787 break;
1788 }
1789 }
1790 return p - buf;
1791}
1792
aurel323faf7782008-12-07 23:26:17 +00001793static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001794{
pbrook56aebc82008-10-11 17:55:29 +00001795 size_t len;
1796 int i;
1797 const char *name;
1798 static char target_xml[1024];
1799
1800 len = 0;
1801 while (p[len] && p[len] != ':')
1802 len++;
1803 *newp = p + len;
1804
1805 name = NULL;
1806 if (strncmp(p, "target.xml", len) == 0) {
1807 /* Generate the XML description for this CPU. */
1808 if (!target_xml[0]) {
1809 GDBRegisterState *r;
1810
blueswir15b3715b2008-10-25 11:18:12 +00001811 snprintf(target_xml, sizeof(target_xml),
1812 "<?xml version=\"1.0\"?>"
1813 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1814 "<target>"
1815 "<xi:include href=\"%s\"/>",
1816 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001817
aliguori880a7572008-11-18 20:30:24 +00001818 for (r = first_cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001819 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1820 pstrcat(target_xml, sizeof(target_xml), r->xml);
1821 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001822 }
blueswir12dc766d2009-04-13 16:06:19 +00001823 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001824 }
1825 return target_xml;
1826 }
1827 for (i = 0; ; i++) {
1828 name = xml_builtin[i][0];
1829 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1830 break;
1831 }
1832 return name ? xml_builtin[i][1] : NULL;
1833}
1834#endif
1835
Andreas Färber9349b4f2012-03-14 01:38:32 +01001836static int gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001837{
1838 GDBRegisterState *r;
1839
1840 if (reg < NUM_CORE_REGS)
1841 return cpu_gdb_read_register(env, mem_buf, reg);
1842
1843 for (r = env->gdb_regs; r; r = r->next) {
1844 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1845 return r->get_reg(env, mem_buf, reg - r->base_reg);
1846 }
1847 }
1848 return 0;
1849}
1850
Andreas Färber9349b4f2012-03-14 01:38:32 +01001851static int gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001852{
1853 GDBRegisterState *r;
1854
1855 if (reg < NUM_CORE_REGS)
1856 return cpu_gdb_write_register(env, mem_buf, reg);
1857
1858 for (r = env->gdb_regs; r; r = r->next) {
1859 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1860 return r->set_reg(env, mem_buf, reg - r->base_reg);
1861 }
1862 }
1863 return 0;
1864}
1865
Max Filippovccfcaba2011-09-06 03:55:52 +04001866#if !defined(TARGET_XTENSA)
pbrook56aebc82008-10-11 17:55:29 +00001867/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1868 specifies the first register number and these registers are included in
1869 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1870 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1871 */
1872
Andreas Färber9349b4f2012-03-14 01:38:32 +01001873void gdb_register_coprocessor(CPUArchState * env,
pbrook56aebc82008-10-11 17:55:29 +00001874 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1875 int num_regs, const char *xml, int g_pos)
1876{
1877 GDBRegisterState *s;
1878 GDBRegisterState **p;
1879 static int last_reg = NUM_CORE_REGS;
1880
pbrook56aebc82008-10-11 17:55:29 +00001881 p = &env->gdb_regs;
1882 while (*p) {
1883 /* Check for duplicates. */
1884 if (strcmp((*p)->xml, xml) == 0)
1885 return;
1886 p = &(*p)->next;
1887 }
Stefan Weil9643c252011-10-18 22:25:38 +02001888
1889 s = g_new0(GDBRegisterState, 1);
1890 s->base_reg = last_reg;
1891 s->num_regs = num_regs;
1892 s->get_reg = get_reg;
1893 s->set_reg = set_reg;
1894 s->xml = xml;
1895
pbrook56aebc82008-10-11 17:55:29 +00001896 /* Add to end of list. */
1897 last_reg += num_regs;
1898 *p = s;
1899 if (g_pos) {
1900 if (g_pos != s->base_reg) {
1901 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1902 "Expected %d got %d\n", xml, g_pos, s->base_reg);
1903 } else {
1904 num_g_regs = last_reg;
1905 }
1906 }
1907}
Max Filippovccfcaba2011-09-06 03:55:52 +04001908#endif
pbrook56aebc82008-10-11 17:55:29 +00001909
aliguoria1d1bb32008-11-18 20:07:32 +00001910#ifndef CONFIG_USER_ONLY
1911static const int xlat_gdb_type[] = {
1912 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1913 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1914 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1915};
1916#endif
1917
aliguori880a7572008-11-18 20:30:24 +00001918static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001919{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001920 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001921 int err = 0;
1922
aliguorie22a25c2009-03-12 20:12:48 +00001923 if (kvm_enabled())
1924 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1925
aliguoria1d1bb32008-11-18 20:07:32 +00001926 switch (type) {
1927 case GDB_BREAKPOINT_SW:
1928 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001929 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1930 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1931 if (err)
1932 break;
1933 }
1934 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001935#ifndef CONFIG_USER_ONLY
1936 case GDB_WATCHPOINT_WRITE:
1937 case GDB_WATCHPOINT_READ:
1938 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001939 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1940 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1941 NULL);
1942 if (err)
1943 break;
1944 }
1945 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001946#endif
1947 default:
1948 return -ENOSYS;
1949 }
1950}
1951
aliguori880a7572008-11-18 20:30:24 +00001952static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001953{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001954 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001955 int err = 0;
1956
aliguorie22a25c2009-03-12 20:12:48 +00001957 if (kvm_enabled())
1958 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1959
aliguoria1d1bb32008-11-18 20:07:32 +00001960 switch (type) {
1961 case GDB_BREAKPOINT_SW:
1962 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001963 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1964 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1965 if (err)
1966 break;
1967 }
1968 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001969#ifndef CONFIG_USER_ONLY
1970 case GDB_WATCHPOINT_WRITE:
1971 case GDB_WATCHPOINT_READ:
1972 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001973 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1974 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1975 if (err)
1976 break;
1977 }
1978 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001979#endif
1980 default:
1981 return -ENOSYS;
1982 }
1983}
1984
aliguori880a7572008-11-18 20:30:24 +00001985static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001986{
Andreas Färber9349b4f2012-03-14 01:38:32 +01001987 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001988
aliguorie22a25c2009-03-12 20:12:48 +00001989 if (kvm_enabled()) {
1990 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
1991 return;
1992 }
1993
aliguori880a7572008-11-18 20:30:24 +00001994 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1995 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001996#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001997 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001998#endif
aliguori880a7572008-11-18 20:30:24 +00001999 }
aliguoria1d1bb32008-11-18 20:07:32 +00002000}
2001
aurel32fab9d282009-04-08 21:29:37 +00002002static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
2003{
Avi Kivity4c0960c2009-08-17 23:19:53 +03002004 cpu_synchronize_state(s->c_cpu);
Peter Maydella896d032012-03-12 06:24:45 +00002005#if defined(TARGET_I386)
aurel32fab9d282009-04-08 21:29:37 +00002006 s->c_cpu->eip = pc;
aurel32fab9d282009-04-08 21:29:37 +00002007#elif defined (TARGET_PPC)
2008 s->c_cpu->nip = pc;
2009#elif defined (TARGET_SPARC)
2010 s->c_cpu->pc = pc;
2011 s->c_cpu->npc = pc + 4;
2012#elif defined (TARGET_ARM)
2013 s->c_cpu->regs[15] = pc;
2014#elif defined (TARGET_SH4)
2015 s->c_cpu->pc = pc;
2016#elif defined (TARGET_MIPS)
Nathan Froydff1d1972009-12-08 08:06:30 -08002017 s->c_cpu->active_tc.PC = pc & ~(target_ulong)1;
2018 if (pc & 1) {
2019 s->c_cpu->hflags |= MIPS_HFLAG_M16;
2020 } else {
2021 s->c_cpu->hflags &= ~(MIPS_HFLAG_M16);
2022 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02002023#elif defined (TARGET_MICROBLAZE)
2024 s->c_cpu->sregs[SR_PC] = pc;
Jia Liufc043552012-07-20 15:50:50 +08002025#elif defined(TARGET_OPENRISC)
2026 s->c_cpu->pc = pc;
aurel32fab9d282009-04-08 21:29:37 +00002027#elif defined (TARGET_CRIS)
2028 s->c_cpu->pc = pc;
2029#elif defined (TARGET_ALPHA)
2030 s->c_cpu->pc = pc;
Alexander Grafafcb0e42009-12-05 12:44:29 +01002031#elif defined (TARGET_S390X)
Alexander Grafafcb0e42009-12-05 12:44:29 +01002032 s->c_cpu->psw.addr = pc;
Michael Walle0c45d3d2011-02-17 23:45:06 +01002033#elif defined (TARGET_LM32)
2034 s->c_cpu->pc = pc;
Max Filippovccfcaba2011-09-06 03:55:52 +04002035#elif defined(TARGET_XTENSA)
2036 s->c_cpu->pc = pc;
aurel32fab9d282009-04-08 21:29:37 +00002037#endif
2038}
2039
Andreas Färber9349b4f2012-03-14 01:38:32 +01002040static CPUArchState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002041{
Andreas Färber9349b4f2012-03-14 01:38:32 +01002042 CPUArchState *env;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002043
2044 for (env = first_cpu; env != NULL; env = env->next_cpu) {
Wen Congyang68f47302012-05-07 12:10:05 +08002045 if (cpu_index(env) == thread_id) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002046 return env;
2047 }
2048 }
2049
2050 return NULL;
2051}
2052
aliguori880a7572008-11-18 20:30:24 +00002053static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00002054{
Andreas Färber9349b4f2012-03-14 01:38:32 +01002055 CPUArchState *env;
bellardb4608c02003-06-27 17:34:32 +00002056 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002057 uint32_t thread;
2058 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00002059 char buf[MAX_PACKET_LENGTH];
2060 uint8_t mem_buf[MAX_PACKET_LENGTH];
2061 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00002062 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00002063
bellard858693c2004-03-31 18:52:07 +00002064#ifdef DEBUG_GDB
2065 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00002066#endif
bellard858693c2004-03-31 18:52:07 +00002067 p = line_buf;
2068 ch = *p++;
2069 switch(ch) {
2070 case '?':
bellard1fddef42005-04-17 19:16:13 +00002071 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00002072 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Wen Congyang68f47302012-05-07 12:10:05 +08002073 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00002074 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00002075 /* Remove all the breakpoints when this query is issued,
2076 * because gdb is doing and initial connect and the state
2077 * should be cleaned up.
2078 */
aliguori880a7572008-11-18 20:30:24 +00002079 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00002080 break;
2081 case 'c':
2082 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00002083 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002084 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002085 }
aurel32ca587a82008-12-18 22:44:13 +00002086 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00002087 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002088 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00002089 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00002090 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2091 if (s->signal == -1)
2092 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00002093 gdb_continue(s);
2094 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002095 case 'v':
2096 if (strncmp(p, "Cont", 4) == 0) {
2097 int res_signal, res_thread;
2098
2099 p += 4;
2100 if (*p == '?') {
2101 put_packet(s, "vCont;c;C;s;S");
2102 break;
2103 }
2104 res = 0;
2105 res_signal = 0;
2106 res_thread = 0;
2107 while (*p) {
2108 int action, signal;
2109
2110 if (*p++ != ';') {
2111 res = 0;
2112 break;
2113 }
2114 action = *p++;
2115 signal = 0;
2116 if (action == 'C' || action == 'S') {
2117 signal = strtoul(p, (char **)&p, 16);
2118 } else if (action != 'c' && action != 's') {
2119 res = 0;
2120 break;
2121 }
2122 thread = 0;
2123 if (*p == ':') {
2124 thread = strtoull(p+1, (char **)&p, 16);
2125 }
2126 action = tolower(action);
2127 if (res == 0 || (res == 'c' && action == 's')) {
2128 res = action;
2129 res_signal = signal;
2130 res_thread = thread;
2131 }
2132 }
2133 if (res) {
2134 if (res_thread != -1 && res_thread != 0) {
2135 env = find_cpu(res_thread);
2136 if (env == NULL) {
2137 put_packet(s, "E22");
2138 break;
2139 }
2140 s->c_cpu = env;
2141 }
2142 if (res == 's') {
2143 cpu_single_step(s->c_cpu, sstep_flags);
2144 }
2145 s->signal = res_signal;
2146 gdb_continue(s);
2147 return RS_IDLE;
2148 }
2149 break;
2150 } else {
2151 goto unknown_command;
2152 }
edgar_igl7d03f822008-05-17 18:58:29 +00002153 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002154#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002155 /* Kill the target */
2156 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2157 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002158#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002159 case 'D':
2160 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002161 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002162 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002163 gdb_continue(s);
2164 put_packet(s, "OK");
2165 break;
bellard858693c2004-03-31 18:52:07 +00002166 case 's':
2167 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002168 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002169 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002170 }
aliguori880a7572008-11-18 20:30:24 +00002171 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002172 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002173 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002174 case 'F':
2175 {
2176 target_ulong ret;
2177 target_ulong err;
2178
2179 ret = strtoull(p, (char **)&p, 16);
2180 if (*p == ',') {
2181 p++;
2182 err = strtoull(p, (char **)&p, 16);
2183 } else {
2184 err = 0;
2185 }
2186 if (*p == ',')
2187 p++;
2188 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002189 if (s->current_syscall_cb) {
2190 s->current_syscall_cb(s->c_cpu, ret, err);
2191 s->current_syscall_cb = NULL;
2192 }
pbrooka2d1eba2007-01-28 03:10:55 +00002193 if (type == 'C') {
2194 put_packet(s, "T02");
2195 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002196 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002197 }
2198 }
2199 break;
bellard858693c2004-03-31 18:52:07 +00002200 case 'g':
Avi Kivity4c0960c2009-08-17 23:19:53 +03002201 cpu_synchronize_state(s->g_cpu);
Max Filippovccfcaba2011-09-06 03:55:52 +04002202 env = s->g_cpu;
pbrook56aebc82008-10-11 17:55:29 +00002203 len = 0;
2204 for (addr = 0; addr < num_g_regs; addr++) {
aliguori880a7572008-11-18 20:30:24 +00002205 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002206 len += reg_size;
2207 }
2208 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002209 put_packet(s, buf);
2210 break;
2211 case 'G':
Avi Kivity4c0960c2009-08-17 23:19:53 +03002212 cpu_synchronize_state(s->g_cpu);
Max Filippovccfcaba2011-09-06 03:55:52 +04002213 env = s->g_cpu;
pbrook56aebc82008-10-11 17:55:29 +00002214 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002215 len = strlen(p) / 2;
2216 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00002217 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
aliguori880a7572008-11-18 20:30:24 +00002218 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002219 len -= reg_size;
2220 registers += reg_size;
2221 }
bellard858693c2004-03-31 18:52:07 +00002222 put_packet(s, "OK");
2223 break;
2224 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002225 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002226 if (*p == ',')
2227 p++;
bellard9d9754a2006-06-25 15:32:37 +00002228 len = strtoull(p, NULL, 16);
Fabien Chouteau44520db2011-09-08 12:48:16 +02002229 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002230 put_packet (s, "E14");
2231 } else {
2232 memtohex(buf, mem_buf, len);
2233 put_packet(s, buf);
2234 }
bellard858693c2004-03-31 18:52:07 +00002235 break;
2236 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002237 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002238 if (*p == ',')
2239 p++;
bellard9d9754a2006-06-25 15:32:37 +00002240 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002241 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002242 p++;
2243 hextomem(mem_buf, p, len);
Fabien Chouteau44520db2011-09-08 12:48:16 +02002244 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002245 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002246 } else {
bellard858693c2004-03-31 18:52:07 +00002247 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002248 }
bellard858693c2004-03-31 18:52:07 +00002249 break;
pbrook56aebc82008-10-11 17:55:29 +00002250 case 'p':
2251 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2252 This works, but can be very slow. Anything new enough to
2253 understand XML also knows how to use this properly. */
2254 if (!gdb_has_xml)
2255 goto unknown_command;
2256 addr = strtoull(p, (char **)&p, 16);
aliguori880a7572008-11-18 20:30:24 +00002257 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002258 if (reg_size) {
2259 memtohex(buf, mem_buf, reg_size);
2260 put_packet(s, buf);
2261 } else {
2262 put_packet(s, "E14");
2263 }
2264 break;
2265 case 'P':
2266 if (!gdb_has_xml)
2267 goto unknown_command;
2268 addr = strtoull(p, (char **)&p, 16);
2269 if (*p == '=')
2270 p++;
2271 reg_size = strlen(p) / 2;
2272 hextomem(mem_buf, p, reg_size);
aliguori880a7572008-11-18 20:30:24 +00002273 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002274 put_packet(s, "OK");
2275 break;
bellard858693c2004-03-31 18:52:07 +00002276 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002277 case 'z':
2278 type = strtoul(p, (char **)&p, 16);
2279 if (*p == ',')
2280 p++;
bellard9d9754a2006-06-25 15:32:37 +00002281 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002282 if (*p == ',')
2283 p++;
bellard9d9754a2006-06-25 15:32:37 +00002284 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002285 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002286 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002287 else
aliguori880a7572008-11-18 20:30:24 +00002288 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002289 if (res >= 0)
2290 put_packet(s, "OK");
2291 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002292 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002293 else
2294 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002295 break;
aliguori880a7572008-11-18 20:30:24 +00002296 case 'H':
2297 type = *p++;
2298 thread = strtoull(p, (char **)&p, 16);
2299 if (thread == -1 || thread == 0) {
2300 put_packet(s, "OK");
2301 break;
2302 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002303 env = find_cpu(thread);
aliguori880a7572008-11-18 20:30:24 +00002304 if (env == NULL) {
2305 put_packet(s, "E22");
2306 break;
2307 }
2308 switch (type) {
2309 case 'c':
2310 s->c_cpu = env;
2311 put_packet(s, "OK");
2312 break;
2313 case 'g':
2314 s->g_cpu = env;
2315 put_packet(s, "OK");
2316 break;
2317 default:
2318 put_packet(s, "E22");
2319 break;
2320 }
2321 break;
2322 case 'T':
2323 thread = strtoull(p, (char **)&p, 16);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002324 env = find_cpu(thread);
2325
2326 if (env != NULL) {
2327 put_packet(s, "OK");
2328 } else {
aliguori880a7572008-11-18 20:30:24 +00002329 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002330 }
aliguori880a7572008-11-18 20:30:24 +00002331 break;
pbrook978efd62006-06-17 18:30:42 +00002332 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002333 case 'Q':
2334 /* parse any 'q' packets here */
2335 if (!strcmp(p,"qemu.sstepbits")) {
2336 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002337 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2338 SSTEP_ENABLE,
2339 SSTEP_NOIRQ,
2340 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002341 put_packet(s, buf);
2342 break;
2343 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2344 /* Display or change the sstep_flags */
2345 p += 10;
2346 if (*p != '=') {
2347 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002348 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002349 put_packet(s, buf);
2350 break;
2351 }
2352 p++;
2353 type = strtoul(p, (char **)&p, 16);
2354 sstep_flags = type;
2355 put_packet(s, "OK");
2356 break;
aliguori880a7572008-11-18 20:30:24 +00002357 } else if (strcmp(p,"C") == 0) {
2358 /* "Current thread" remains vague in the spec, so always return
2359 * the first CPU (gdb returns the first thread). */
2360 put_packet(s, "QC1");
2361 break;
2362 } else if (strcmp(p,"fThreadInfo") == 0) {
2363 s->query_cpu = first_cpu;
2364 goto report_cpuinfo;
2365 } else if (strcmp(p,"sThreadInfo") == 0) {
2366 report_cpuinfo:
2367 if (s->query_cpu) {
Wen Congyang68f47302012-05-07 12:10:05 +08002368 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00002369 put_packet(s, buf);
2370 s->query_cpu = s->query_cpu->next_cpu;
2371 } else
2372 put_packet(s, "l");
2373 break;
2374 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2375 thread = strtoull(p+16, (char **)&p, 16);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002376 env = find_cpu(thread);
2377 if (env != NULL) {
Avi Kivity4c0960c2009-08-17 23:19:53 +03002378 cpu_synchronize_state(env);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002379 len = snprintf((char *)mem_buf, sizeof(mem_buf),
2380 "CPU#%d [%s]", env->cpu_index,
2381 env->halted ? "halted " : "running");
2382 memtohex(buf, mem_buf, len);
2383 put_packet(s, buf);
2384 }
aliguori880a7572008-11-18 20:30:24 +00002385 break;
edgar_igl60897d32008-05-09 08:25:14 +00002386 }
blueswir10b8a9882009-03-07 10:51:36 +00002387#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002388 else if (strncmp(p, "Offsets", 7) == 0) {
aliguori880a7572008-11-18 20:30:24 +00002389 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00002390
blueswir1363a37d2008-08-21 17:58:08 +00002391 snprintf(buf, sizeof(buf),
2392 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2393 ";Bss=" TARGET_ABI_FMT_lx,
2394 ts->info->code_offset,
2395 ts->info->data_offset,
2396 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002397 put_packet(s, buf);
2398 break;
2399 }
blueswir10b8a9882009-03-07 10:51:36 +00002400#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002401 else if (strncmp(p, "Rcmd,", 5) == 0) {
2402 int len = strlen(p + 5);
2403
2404 if ((len % 2) != 0) {
2405 put_packet(s, "E01");
2406 break;
2407 }
2408 hextomem(mem_buf, p + 5, len);
2409 len = len / 2;
2410 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002411 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002412 put_packet(s, "OK");
2413 break;
2414 }
blueswir10b8a9882009-03-07 10:51:36 +00002415#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002416 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002417 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002418#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002419 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002420#endif
2421 put_packet(s, buf);
2422 break;
2423 }
2424#ifdef GDB_CORE_XML
2425 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2426 const char *xml;
2427 target_ulong total_len;
2428
2429 gdb_has_xml = 1;
2430 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002431 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002432 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002433 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002434 put_packet(s, buf);
2435 break;
2436 }
2437
2438 if (*p == ':')
2439 p++;
2440 addr = strtoul(p, (char **)&p, 16);
2441 if (*p == ',')
2442 p++;
2443 len = strtoul(p, (char **)&p, 16);
2444
2445 total_len = strlen(xml);
2446 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002447 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002448 put_packet(s, buf);
2449 break;
2450 }
2451 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2452 len = (MAX_PACKET_LENGTH - 5) / 2;
2453 if (len < total_len - addr) {
2454 buf[0] = 'm';
2455 len = memtox(buf + 1, xml + addr, len);
2456 } else {
2457 buf[0] = 'l';
2458 len = memtox(buf + 1, xml + addr, total_len - addr);
2459 }
2460 put_packet_binary(s, buf, len + 1);
2461 break;
2462 }
2463#endif
2464 /* Unrecognised 'q' command. */
2465 goto unknown_command;
2466
bellard858693c2004-03-31 18:52:07 +00002467 default:
pbrook56aebc82008-10-11 17:55:29 +00002468 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002469 /* put empty packet */
2470 buf[0] = '\0';
2471 put_packet(s, buf);
2472 break;
2473 }
2474 return RS_IDLE;
2475}
2476
Andreas Färber9349b4f2012-03-14 01:38:32 +01002477void gdb_set_stop_cpu(CPUArchState *env)
aliguori880a7572008-11-18 20:30:24 +00002478{
2479 gdbserver_state->c_cpu = env;
2480 gdbserver_state->g_cpu = env;
2481}
2482
bellard1fddef42005-04-17 19:16:13 +00002483#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002484static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002485{
aliguori880a7572008-11-18 20:30:24 +00002486 GDBState *s = gdbserver_state;
Andreas Färber9349b4f2012-03-14 01:38:32 +01002487 CPUArchState *env = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002488 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002489 const char *type;
bellard858693c2004-03-31 18:52:07 +00002490 int ret;
2491
Meador Ingecdb432b2012-03-15 17:49:45 +00002492 if (running || s->state == RS_INACTIVE) {
2493 return;
2494 }
2495 /* Is there a GDB syscall waiting to be sent? */
2496 if (s->current_syscall_cb) {
2497 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002498 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002499 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002500 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002501 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002502 if (env->watchpoint_hit) {
2503 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002504 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002505 type = "r";
2506 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002507 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002508 type = "a";
2509 break;
2510 default:
2511 type = "";
2512 break;
2513 }
aliguori880a7572008-11-18 20:30:24 +00002514 snprintf(buf, sizeof(buf),
2515 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Wen Congyang68f47302012-05-07 12:10:05 +08002516 GDB_SIGNAL_TRAP, cpu_index(env), type,
aliguori880a7572008-11-18 20:30:24 +00002517 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002518 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002519 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002520 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002521 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002522 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002523 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002524 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002525 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002526 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002527 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002528 ret = GDB_SIGNAL_QUIT;
2529 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002530 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002531 ret = GDB_SIGNAL_IO;
2532 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002533 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002534 ret = GDB_SIGNAL_ALRM;
2535 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002536 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002537 ret = GDB_SIGNAL_ABRT;
2538 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002539 case RUN_STATE_SAVE_VM:
2540 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002541 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002542 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002543 ret = GDB_SIGNAL_XCPU;
2544 break;
2545 default:
2546 ret = GDB_SIGNAL_UNKNOWN;
2547 break;
bellardbbeb7b52006-04-23 18:42:15 +00002548 }
Wen Congyang68f47302012-05-07 12:10:05 +08002549 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(env));
Jan Kiszka425189a2011-03-22 11:02:09 +01002550
2551send_packet:
bellard858693c2004-03-31 18:52:07 +00002552 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002553
2554 /* disable single step if it was enabled */
2555 cpu_single_step(env, 0);
bellard858693c2004-03-31 18:52:07 +00002556}
bellard1fddef42005-04-17 19:16:13 +00002557#endif
bellard858693c2004-03-31 18:52:07 +00002558
pbrooka2d1eba2007-01-28 03:10:55 +00002559/* Send a gdb syscall request.
2560 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002561 %x - target_ulong argument printed in hex.
2562 %lx - 64-bit argument printed in hex.
2563 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002564void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002565{
2566 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002567 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002568 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002569 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002570 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002571 GDBState *s;
2572
aliguori880a7572008-11-18 20:30:24 +00002573 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002574 if (!s)
2575 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002576 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002577#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002578 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002579#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002580 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002581 p = s->syscall_buf;
2582 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002583 *(p++) = 'F';
2584 while (*fmt) {
2585 if (*fmt == '%') {
2586 fmt++;
2587 switch (*fmt++) {
2588 case 'x':
2589 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002590 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002591 break;
pbrooka87295e2007-05-26 15:09:38 +00002592 case 'l':
2593 if (*(fmt++) != 'x')
2594 goto bad_format;
2595 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002596 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002597 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002598 case 's':
2599 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002600 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002601 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002602 break;
2603 default:
pbrooka87295e2007-05-26 15:09:38 +00002604 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002605 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2606 fmt - 1);
2607 break;
2608 }
2609 } else {
2610 *(p++) = *(fmt++);
2611 }
2612 }
pbrook8a93e022007-08-06 13:19:15 +00002613 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002614 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002615#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002616 put_packet(s, s->syscall_buf);
aliguori880a7572008-11-18 20:30:24 +00002617 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002618#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002619 /* In this case wait to send the syscall packet until notification that
2620 the CPU has stopped. This must be done because if the packet is sent
2621 now the reply from the syscall request could be received while the CPU
2622 is still in the running state, which can cause packets to be dropped
2623 and state transition 'T' packets to be sent while the syscall is still
2624 being processed. */
aurel323098dba2009-03-07 21:28:24 +00002625 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002626#endif
2627}
2628
bellard6a00d602005-11-21 23:25:50 +00002629static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002630{
2631 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002632 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002633
bellard1fddef42005-04-17 19:16:13 +00002634#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002635 if (s->last_packet_len) {
2636 /* Waiting for a response to the last packet. If we see the start
2637 of a new command then abandon the previous response. */
2638 if (ch == '-') {
2639#ifdef DEBUG_GDB
2640 printf("Got NACK, retransmitting\n");
2641#endif
thsffe8ab82007-12-16 03:16:05 +00002642 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002643 }
2644#ifdef DEBUG_GDB
2645 else if (ch == '+')
2646 printf("Got ACK\n");
2647 else
2648 printf("Got '%c' when expecting ACK/NACK\n", ch);
2649#endif
2650 if (ch == '+' || ch == '$')
2651 s->last_packet_len = 0;
2652 if (ch != '$')
2653 return;
2654 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002655 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002656 /* when the CPU is running, we cannot do anything except stop
2657 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002658 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002659 } else
bellard1fddef42005-04-17 19:16:13 +00002660#endif
bellard41625032005-04-24 10:07:11 +00002661 {
bellard858693c2004-03-31 18:52:07 +00002662 switch(s->state) {
2663 case RS_IDLE:
2664 if (ch == '$') {
2665 s->line_buf_index = 0;
2666 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002667 }
2668 break;
bellard858693c2004-03-31 18:52:07 +00002669 case RS_GETLINE:
2670 if (ch == '#') {
2671 s->state = RS_CHKSUM1;
2672 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2673 s->state = RS_IDLE;
2674 } else {
2675 s->line_buf[s->line_buf_index++] = ch;
2676 }
2677 break;
2678 case RS_CHKSUM1:
2679 s->line_buf[s->line_buf_index] = '\0';
2680 s->line_csum = fromhex(ch) << 4;
2681 s->state = RS_CHKSUM2;
2682 break;
2683 case RS_CHKSUM2:
2684 s->line_csum |= fromhex(ch);
2685 csum = 0;
2686 for(i = 0; i < s->line_buf_index; i++) {
2687 csum += s->line_buf[i];
2688 }
2689 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002690 reply = '-';
2691 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002692 s->state = RS_IDLE;
2693 } else {
ths60fe76f2007-12-16 03:02:09 +00002694 reply = '+';
2695 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002696 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002697 }
bellardb4608c02003-06-27 17:34:32 +00002698 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002699 default:
2700 abort();
bellardb4608c02003-06-27 17:34:32 +00002701 }
2702 }
bellard858693c2004-03-31 18:52:07 +00002703}
2704
Paul Brook0e1c9c52010-06-16 13:03:51 +01002705/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002706void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002707{
2708 GDBState *s;
2709 char buf[4];
2710
2711 s = gdbserver_state;
2712 if (!s) {
2713 return;
2714 }
2715#ifdef CONFIG_USER_ONLY
2716 if (gdbserver_fd < 0 || s->fd < 0) {
2717 return;
2718 }
2719#endif
2720
2721 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2722 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002723
2724#ifndef CONFIG_USER_ONLY
2725 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002726 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002727 }
2728#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002729}
2730
bellard1fddef42005-04-17 19:16:13 +00002731#ifdef CONFIG_USER_ONLY
2732int
aurel32ca587a82008-12-18 22:44:13 +00002733gdb_queuesig (void)
2734{
2735 GDBState *s;
2736
2737 s = gdbserver_state;
2738
2739 if (gdbserver_fd < 0 || s->fd < 0)
2740 return 0;
2741 else
2742 return 1;
2743}
2744
2745int
Andreas Färber9349b4f2012-03-14 01:38:32 +01002746gdb_handlesig (CPUArchState *env, int sig)
bellard1fddef42005-04-17 19:16:13 +00002747{
2748 GDBState *s;
2749 char buf[256];
2750 int n;
2751
aliguori880a7572008-11-18 20:30:24 +00002752 s = gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00002753 if (gdbserver_fd < 0 || s->fd < 0)
2754 return sig;
bellard1fddef42005-04-17 19:16:13 +00002755
2756 /* disable single step if it was enabled */
2757 cpu_single_step(env, 0);
2758 tb_flush(env);
2759
2760 if (sig != 0)
2761 {
aurel32ca587a82008-12-18 22:44:13 +00002762 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb (sig));
bellard1fddef42005-04-17 19:16:13 +00002763 put_packet(s, buf);
2764 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002765 /* put_packet() might have detected that the peer terminated the
2766 connection. */
2767 if (s->fd < 0)
2768 return sig;
bellard1fddef42005-04-17 19:16:13 +00002769
bellard1fddef42005-04-17 19:16:13 +00002770 sig = 0;
2771 s->state = RS_IDLE;
bellard41625032005-04-24 10:07:11 +00002772 s->running_state = 0;
2773 while (s->running_state == 0) {
bellard1fddef42005-04-17 19:16:13 +00002774 n = read (s->fd, buf, 256);
2775 if (n > 0)
2776 {
2777 int i;
2778
2779 for (i = 0; i < n; i++)
bellard6a00d602005-11-21 23:25:50 +00002780 gdb_read_byte (s, buf[i]);
bellard1fddef42005-04-17 19:16:13 +00002781 }
2782 else if (n == 0 || errno != EAGAIN)
2783 {
Stefan Weile7d81002011-12-10 00:19:46 +01002784 /* XXX: Connection closed. Should probably wait for another
bellard1fddef42005-04-17 19:16:13 +00002785 connection before continuing. */
2786 return sig;
2787 }
bellard41625032005-04-24 10:07:11 +00002788 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002789 sig = s->signal;
2790 s->signal = 0;
bellard1fddef42005-04-17 19:16:13 +00002791 return sig;
2792}
bellarde9009672005-04-26 20:42:36 +00002793
aurel32ca587a82008-12-18 22:44:13 +00002794/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002795void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002796{
2797 GDBState *s;
2798 char buf[4];
2799
2800 s = gdbserver_state;
2801 if (gdbserver_fd < 0 || s->fd < 0)
2802 return;
2803
2804 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb (sig));
2805 put_packet(s, buf);
2806}
bellard1fddef42005-04-17 19:16:13 +00002807
aliguori880a7572008-11-18 20:30:24 +00002808static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002809{
2810 GDBState *s;
2811 struct sockaddr_in sockaddr;
2812 socklen_t len;
2813 int val, fd;
2814
2815 for(;;) {
2816 len = sizeof(sockaddr);
2817 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2818 if (fd < 0 && errno != EINTR) {
2819 perror("accept");
2820 return;
2821 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002822#ifndef _WIN32
2823 fcntl(fd, F_SETFD, FD_CLOEXEC);
2824#endif
bellard858693c2004-03-31 18:52:07 +00002825 break;
2826 }
2827 }
2828
2829 /* set short latency */
2830 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00002831 setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
ths3b46e622007-09-17 08:09:54 +00002832
Anthony Liguori7267c092011-08-20 22:09:37 -05002833 s = g_malloc0(sizeof(GDBState));
aliguori880a7572008-11-18 20:30:24 +00002834 s->c_cpu = first_cpu;
2835 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002836 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002837 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002838
aliguori880a7572008-11-18 20:30:24 +00002839 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002840
bellard858693c2004-03-31 18:52:07 +00002841 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002842}
2843
2844static int gdbserver_open(int port)
2845{
2846 struct sockaddr_in sockaddr;
2847 int fd, val, ret;
2848
2849 fd = socket(PF_INET, SOCK_STREAM, 0);
2850 if (fd < 0) {
2851 perror("socket");
2852 return -1;
2853 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002854#ifndef _WIN32
2855 fcntl(fd, F_SETFD, FD_CLOEXEC);
2856#endif
bellard858693c2004-03-31 18:52:07 +00002857
2858 /* allow fast reuse */
2859 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00002860 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002861
2862 sockaddr.sin_family = AF_INET;
2863 sockaddr.sin_port = htons(port);
2864 sockaddr.sin_addr.s_addr = 0;
2865 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2866 if (ret < 0) {
2867 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002868 close(fd);
bellard858693c2004-03-31 18:52:07 +00002869 return -1;
2870 }
2871 ret = listen(fd, 0);
2872 if (ret < 0) {
2873 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002874 close(fd);
bellard858693c2004-03-31 18:52:07 +00002875 return -1;
2876 }
bellard858693c2004-03-31 18:52:07 +00002877 return fd;
2878}
2879
2880int gdbserver_start(int port)
2881{
2882 gdbserver_fd = gdbserver_open(port);
2883 if (gdbserver_fd < 0)
2884 return -1;
2885 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002886 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002887 return 0;
2888}
aurel322b1319c2008-12-18 22:44:04 +00002889
2890/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002891void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002892{
2893 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002894 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002895 return;
2896 close(s->fd);
2897 s->fd = -1;
2898 cpu_breakpoint_remove_all(env, BP_GDB);
2899 cpu_watchpoint_remove_all(env, BP_GDB);
2900}
pbrook4046d912007-01-28 01:53:16 +00002901#else
thsaa1f17c2007-07-11 22:48:58 +00002902static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002903{
pbrook56aebc82008-10-11 17:55:29 +00002904 /* We can handle an arbitrarily large amount of data.
2905 Pick the maximum packet size, which is as good as anything. */
2906 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002907}
2908
thsaa1f17c2007-07-11 22:48:58 +00002909static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002910{
pbrook4046d912007-01-28 01:53:16 +00002911 int i;
2912
2913 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002914 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002915 }
2916}
2917
2918static void gdb_chr_event(void *opaque, int event)
2919{
2920 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302921 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002922 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002923 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002924 break;
2925 default:
2926 break;
2927 }
2928}
2929
aliguori8a34a0f2009-03-05 23:01:55 +00002930static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2931{
2932 char buf[MAX_PACKET_LENGTH];
2933
2934 buf[0] = 'O';
2935 if (len > (MAX_PACKET_LENGTH/2) - 1)
2936 len = (MAX_PACKET_LENGTH/2) - 1;
2937 memtohex(buf + 1, (uint8_t *)msg, len);
2938 put_packet(s, buf);
2939}
2940
2941static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2942{
2943 const char *p = (const char *)buf;
2944 int max_sz;
2945
2946 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2947 for (;;) {
2948 if (len <= max_sz) {
2949 gdb_monitor_output(gdbserver_state, p, len);
2950 break;
2951 }
2952 gdb_monitor_output(gdbserver_state, p, max_sz);
2953 p += max_sz;
2954 len -= max_sz;
2955 }
2956 return len;
2957}
2958
aliguori59030a82009-04-05 18:43:41 +00002959#ifndef _WIN32
2960static void gdb_sigterm_handler(int signal)
2961{
Luiz Capitulino13548692011-07-29 15:36:43 -03002962 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002963 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002964 }
aliguori59030a82009-04-05 18:43:41 +00002965}
2966#endif
2967
2968int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002969{
2970 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002971 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002972 CharDriverState *chr = NULL;
2973 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002974
aliguori59030a82009-04-05 18:43:41 +00002975 if (!device)
2976 return -1;
2977 if (strcmp(device, "none") != 0) {
2978 if (strstart(device, "tcp:", NULL)) {
2979 /* enforce required TCP attributes */
2980 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2981 "%s,nowait,nodelay,server", device);
2982 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002983 }
aliguori59030a82009-04-05 18:43:41 +00002984#ifndef _WIN32
2985 else if (strcmp(device, "stdio") == 0) {
2986 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002987
aliguori59030a82009-04-05 18:43:41 +00002988 memset(&act, 0, sizeof(act));
2989 act.sa_handler = gdb_sigterm_handler;
2990 sigaction(SIGINT, &act, NULL);
2991 }
2992#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002993 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002994 if (!chr)
2995 return -1;
2996
2997 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2998 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002999 }
3000
aliguori36556b22009-03-28 18:05:53 +00003001 s = gdbserver_state;
3002 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05003003 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00003004 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00003005
aliguori36556b22009-03-28 18:05:53 +00003006 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
3007
3008 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05003009 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00003010 mon_chr->chr_write = gdb_monitor_write;
3011 monitor_init(mon_chr, 0);
3012 } else {
3013 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05003014 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00003015 mon_chr = s->mon_chr;
3016 memset(s, 0, sizeof(GDBState));
3017 }
aliguori880a7572008-11-18 20:30:24 +00003018 s->c_cpu = first_cpu;
3019 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00003020 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00003021 s->state = chr ? RS_IDLE : RS_INACTIVE;
3022 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00003023 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00003024
pbrook4046d912007-01-28 01:53:16 +00003025 return 0;
3026}
3027#endif