blob: 6c6a7aa63e8f2bc96eb88ed3b648d795d77d6537 [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
17 * License along with this library; if not, write to the Free Software
aurel32fad6cb12009-01-04 22:05:52 +000018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
bellardb4608c02003-06-27 17:34:32 +000019 */
pbrook978efd62006-06-17 18:30:42 +000020#include "config.h"
pbrook56aebc82008-10-11 17:55:29 +000021#include "qemu-common.h"
bellard1fddef42005-04-17 19:16:13 +000022#ifdef CONFIG_USER_ONLY
23#include <stdlib.h>
24#include <stdio.h>
25#include <stdarg.h>
26#include <string.h>
27#include <errno.h>
28#include <unistd.h>
pbrook978efd62006-06-17 18:30:42 +000029#include <fcntl.h>
bellard1fddef42005-04-17 19:16:13 +000030
31#include "qemu.h"
32#else
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
bellard8f447cc2006-06-14 15:21:14 +000040#include "qemu_socket.h"
aurel32ca587a82008-12-18 22:44:13 +000041
42
43enum {
44 GDB_SIGNAL_0 = 0,
45 GDB_SIGNAL_INT = 2,
46 GDB_SIGNAL_TRAP = 5,
47 GDB_SIGNAL_UNKNOWN = 143
48};
49
50#ifdef CONFIG_USER_ONLY
51
52/* Map target signal numbers to GDB protocol signal numbers and vice
53 * versa. For user emulation's currently supported systems, we can
54 * assume most signals are defined.
55 */
56
57static int gdb_signal_table[] = {
58 0,
59 TARGET_SIGHUP,
60 TARGET_SIGINT,
61 TARGET_SIGQUIT,
62 TARGET_SIGILL,
63 TARGET_SIGTRAP,
64 TARGET_SIGABRT,
65 -1, /* SIGEMT */
66 TARGET_SIGFPE,
67 TARGET_SIGKILL,
68 TARGET_SIGBUS,
69 TARGET_SIGSEGV,
70 TARGET_SIGSYS,
71 TARGET_SIGPIPE,
72 TARGET_SIGALRM,
73 TARGET_SIGTERM,
74 TARGET_SIGURG,
75 TARGET_SIGSTOP,
76 TARGET_SIGTSTP,
77 TARGET_SIGCONT,
78 TARGET_SIGCHLD,
79 TARGET_SIGTTIN,
80 TARGET_SIGTTOU,
81 TARGET_SIGIO,
82 TARGET_SIGXCPU,
83 TARGET_SIGXFSZ,
84 TARGET_SIGVTALRM,
85 TARGET_SIGPROF,
86 TARGET_SIGWINCH,
87 -1, /* SIGLOST */
88 TARGET_SIGUSR1,
89 TARGET_SIGUSR2,
90 TARGET_SIGPWR,
91 -1, /* SIGPOLL */
92 -1,
93 -1,
94 -1,
95 -1,
96 -1,
97 -1,
98 -1,
99 -1,
100 -1,
101 -1,
102 -1,
103 __SIGRTMIN + 1,
104 __SIGRTMIN + 2,
105 __SIGRTMIN + 3,
106 __SIGRTMIN + 4,
107 __SIGRTMIN + 5,
108 __SIGRTMIN + 6,
109 __SIGRTMIN + 7,
110 __SIGRTMIN + 8,
111 __SIGRTMIN + 9,
112 __SIGRTMIN + 10,
113 __SIGRTMIN + 11,
114 __SIGRTMIN + 12,
115 __SIGRTMIN + 13,
116 __SIGRTMIN + 14,
117 __SIGRTMIN + 15,
118 __SIGRTMIN + 16,
119 __SIGRTMIN + 17,
120 __SIGRTMIN + 18,
121 __SIGRTMIN + 19,
122 __SIGRTMIN + 20,
123 __SIGRTMIN + 21,
124 __SIGRTMIN + 22,
125 __SIGRTMIN + 23,
126 __SIGRTMIN + 24,
127 __SIGRTMIN + 25,
128 __SIGRTMIN + 26,
129 __SIGRTMIN + 27,
130 __SIGRTMIN + 28,
131 __SIGRTMIN + 29,
132 __SIGRTMIN + 30,
133 __SIGRTMIN + 31,
134 -1, /* SIGCANCEL */
135 __SIGRTMIN,
136 __SIGRTMIN + 32,
137 __SIGRTMIN + 33,
138 __SIGRTMIN + 34,
139 __SIGRTMIN + 35,
140 __SIGRTMIN + 36,
141 __SIGRTMIN + 37,
142 __SIGRTMIN + 38,
143 __SIGRTMIN + 39,
144 __SIGRTMIN + 40,
145 __SIGRTMIN + 41,
146 __SIGRTMIN + 42,
147 __SIGRTMIN + 43,
148 __SIGRTMIN + 44,
149 __SIGRTMIN + 45,
150 __SIGRTMIN + 46,
151 __SIGRTMIN + 47,
152 __SIGRTMIN + 48,
153 __SIGRTMIN + 49,
154 __SIGRTMIN + 50,
155 __SIGRTMIN + 51,
156 __SIGRTMIN + 52,
157 __SIGRTMIN + 53,
158 __SIGRTMIN + 54,
159 __SIGRTMIN + 55,
160 __SIGRTMIN + 56,
161 __SIGRTMIN + 57,
162 __SIGRTMIN + 58,
163 __SIGRTMIN + 59,
164 __SIGRTMIN + 60,
165 __SIGRTMIN + 61,
166 __SIGRTMIN + 62,
167 __SIGRTMIN + 63,
168 __SIGRTMIN + 64,
169 __SIGRTMIN + 65,
170 __SIGRTMIN + 66,
171 __SIGRTMIN + 67,
172 __SIGRTMIN + 68,
173 __SIGRTMIN + 69,
174 __SIGRTMIN + 70,
175 __SIGRTMIN + 71,
176 __SIGRTMIN + 72,
177 __SIGRTMIN + 73,
178 __SIGRTMIN + 74,
179 __SIGRTMIN + 75,
180 __SIGRTMIN + 76,
181 __SIGRTMIN + 77,
182 __SIGRTMIN + 78,
183 __SIGRTMIN + 79,
184 __SIGRTMIN + 80,
185 __SIGRTMIN + 81,
186 __SIGRTMIN + 82,
187 __SIGRTMIN + 83,
188 __SIGRTMIN + 84,
189 __SIGRTMIN + 85,
190 __SIGRTMIN + 86,
191 __SIGRTMIN + 87,
192 __SIGRTMIN + 88,
193 __SIGRTMIN + 89,
194 __SIGRTMIN + 90,
195 __SIGRTMIN + 91,
196 __SIGRTMIN + 92,
197 __SIGRTMIN + 93,
198 __SIGRTMIN + 94,
199 __SIGRTMIN + 95,
200 -1, /* SIGINFO */
201 -1, /* UNKNOWN */
202 -1, /* DEFAULT */
203 -1,
204 -1,
205 -1,
206 -1,
207 -1,
208 -1
209};
bellard8f447cc2006-06-14 15:21:14 +0000210#else
aurel32ca587a82008-12-18 22:44:13 +0000211/* In system mode we only need SIGINT and SIGTRAP; other signals
212 are not yet supported. */
213
214enum {
215 TARGET_SIGINT = 2,
216 TARGET_SIGTRAP = 5
217};
218
219static int gdb_signal_table[] = {
220 -1,
221 -1,
222 TARGET_SIGINT,
223 -1,
224 -1,
225 TARGET_SIGTRAP
226};
bellard8f447cc2006-06-14 15:21:14 +0000227#endif
bellardb4608c02003-06-27 17:34:32 +0000228
aurel32ca587a82008-12-18 22:44:13 +0000229#ifdef CONFIG_USER_ONLY
230static int target_signal_to_gdb (int sig)
231{
232 int i;
233 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
234 if (gdb_signal_table[i] == sig)
235 return i;
236 return GDB_SIGNAL_UNKNOWN;
237}
238#endif
239
240static int gdb_signal_to_target (int sig)
241{
242 if (sig < ARRAY_SIZE (gdb_signal_table))
243 return gdb_signal_table[sig];
244 else
245 return -1;
246}
247
bellard4abe6152003-07-26 18:01:58 +0000248//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000249
pbrook56aebc82008-10-11 17:55:29 +0000250typedef struct GDBRegisterState {
251 int base_reg;
252 int num_regs;
253 gdb_reg_cb get_reg;
254 gdb_reg_cb set_reg;
255 const char *xml;
256 struct GDBRegisterState *next;
257} GDBRegisterState;
258
bellard858693c2004-03-31 18:52:07 +0000259enum RSState {
260 RS_IDLE,
261 RS_GETLINE,
262 RS_CHKSUM1,
263 RS_CHKSUM2,
pbrooka2d1eba2007-01-28 03:10:55 +0000264 RS_SYSCALL,
bellard858693c2004-03-31 18:52:07 +0000265};
bellard858693c2004-03-31 18:52:07 +0000266typedef struct GDBState {
aliguori880a7572008-11-18 20:30:24 +0000267 CPUState *c_cpu; /* current CPU for step/continue ops */
268 CPUState *g_cpu; /* current CPU for other ops */
269 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000270 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000271 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000272 int line_buf_index;
273 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000274 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000275 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000276 int signal;
bellard41625032005-04-24 10:07:11 +0000277#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000278 int fd;
bellard41625032005-04-24 10:07:11 +0000279 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000280#else
281 CharDriverState *chr;
bellard41625032005-04-24 10:07:11 +0000282#endif
bellard858693c2004-03-31 18:52:07 +0000283} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000284
edgar_igl60897d32008-05-09 08:25:14 +0000285/* By default use no IRQs and no timers while single stepping so as to
286 * make single stepping like an ICE HW step.
287 */
288static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
289
aliguori880a7572008-11-18 20:30:24 +0000290static GDBState *gdbserver_state;
291
pbrook56aebc82008-10-11 17:55:29 +0000292/* This is an ugly hack to cope with both new and old gdb.
293 If gdb sends qXfer:features:read then assume we're talking to a newish
294 gdb that understands target descriptions. */
295static int gdb_has_xml;
296
bellard1fddef42005-04-17 19:16:13 +0000297#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000298/* XXX: This is not thread safe. Do we care? */
299static int gdbserver_fd = -1;
300
bellard858693c2004-03-31 18:52:07 +0000301static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000302{
303 uint8_t ch;
304 int ret;
305
306 for(;;) {
bellard8f447cc2006-06-14 15:21:14 +0000307 ret = recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000308 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000309 if (errno == ECONNRESET)
310 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000311 if (errno != EINTR && errno != EAGAIN)
312 return -1;
313 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000314 close(s->fd);
315 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000316 return -1;
317 } else {
318 break;
319 }
320 }
321 return ch;
322}
pbrook4046d912007-01-28 01:53:16 +0000323#endif
bellardb4608c02003-06-27 17:34:32 +0000324
pbrooka2d1eba2007-01-28 03:10:55 +0000325static gdb_syscall_complete_cb gdb_current_syscall_cb;
326
327enum {
328 GDB_SYS_UNKNOWN,
329 GDB_SYS_ENABLED,
330 GDB_SYS_DISABLED,
331} gdb_syscall_mode;
332
333/* If gdb is connected when the first semihosting syscall occurs then use
334 remote gdb syscalls. Otherwise use native file IO. */
335int use_gdb_syscalls(void)
336{
337 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000338 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
339 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000340 }
341 return gdb_syscall_mode == GDB_SYS_ENABLED;
342}
343
edgar_iglba70a622008-03-14 06:10:42 +0000344/* Resume execution. */
345static inline void gdb_continue(GDBState *s)
346{
347#ifdef CONFIG_USER_ONLY
348 s->running_state = 1;
349#else
350 vm_start();
351#endif
352}
353
bellard858693c2004-03-31 18:52:07 +0000354static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000355{
pbrook4046d912007-01-28 01:53:16 +0000356#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000357 int ret;
358
359 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000360 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000361 if (ret < 0) {
362 if (errno != EINTR && errno != EAGAIN)
363 return;
364 } else {
365 buf += ret;
366 len -= ret;
367 }
368 }
pbrook4046d912007-01-28 01:53:16 +0000369#else
370 qemu_chr_write(s->chr, buf, len);
371#endif
bellardb4608c02003-06-27 17:34:32 +0000372}
373
374static inline int fromhex(int v)
375{
376 if (v >= '0' && v <= '9')
377 return v - '0';
378 else if (v >= 'A' && v <= 'F')
379 return v - 'A' + 10;
380 else if (v >= 'a' && v <= 'f')
381 return v - 'a' + 10;
382 else
383 return 0;
384}
385
386static inline int tohex(int v)
387{
388 if (v < 10)
389 return v + '0';
390 else
391 return v - 10 + 'a';
392}
393
394static void memtohex(char *buf, const uint8_t *mem, int len)
395{
396 int i, c;
397 char *q;
398 q = buf;
399 for(i = 0; i < len; i++) {
400 c = mem[i];
401 *q++ = tohex(c >> 4);
402 *q++ = tohex(c & 0xf);
403 }
404 *q = '\0';
405}
406
407static void hextomem(uint8_t *mem, const char *buf, int len)
408{
409 int i;
410
411 for(i = 0; i < len; i++) {
412 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
413 buf += 2;
414 }
415}
416
bellardb4608c02003-06-27 17:34:32 +0000417/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000418static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000419{
pbrook56aebc82008-10-11 17:55:29 +0000420 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000421 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000422
bellardb4608c02003-06-27 17:34:32 +0000423 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000424 p = s->last_packet;
425 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000426 memcpy(p, buf, len);
427 p += len;
bellardb4608c02003-06-27 17:34:32 +0000428 csum = 0;
429 for(i = 0; i < len; i++) {
430 csum += buf[i];
431 }
pbrook4046d912007-01-28 01:53:16 +0000432 *(p++) = '#';
433 *(p++) = tohex((csum >> 4) & 0xf);
434 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000435
pbrook4046d912007-01-28 01:53:16 +0000436 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000437 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000438
pbrook4046d912007-01-28 01:53:16 +0000439#ifdef CONFIG_USER_ONLY
440 i = get_char(s);
441 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000442 return -1;
pbrook4046d912007-01-28 01:53:16 +0000443 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000444 break;
pbrook4046d912007-01-28 01:53:16 +0000445#else
446 break;
447#endif
bellardb4608c02003-06-27 17:34:32 +0000448 }
449 return 0;
450}
451
pbrook56aebc82008-10-11 17:55:29 +0000452/* return -1 if error, 0 if OK */
453static int put_packet(GDBState *s, const char *buf)
454{
455#ifdef DEBUG_GDB
456 printf("reply='%s'\n", buf);
457#endif
458
459 return put_packet_binary(s, buf, strlen(buf));
460}
461
462/* The GDB remote protocol transfers values in target byte order. This means
463 we can use the raw memory access routines to access the value buffer.
464 Conveniently, these also handle the case where the buffer is mis-aligned.
465 */
466#define GET_REG8(val) do { \
467 stb_p(mem_buf, val); \
468 return 1; \
469 } while(0)
470#define GET_REG16(val) do { \
471 stw_p(mem_buf, val); \
472 return 2; \
473 } while(0)
474#define GET_REG32(val) do { \
475 stl_p(mem_buf, val); \
476 return 4; \
477 } while(0)
478#define GET_REG64(val) do { \
479 stq_p(mem_buf, val); \
480 return 8; \
481 } while(0)
482
483#if TARGET_LONG_BITS == 64
484#define GET_REGL(val) GET_REG64(val)
485#define ldtul_p(addr) ldq_p(addr)
486#else
487#define GET_REGL(val) GET_REG32(val)
488#define ldtul_p(addr) ldl_p(addr)
489#endif
490
edgar_iglfde3fd62008-05-09 08:50:01 +0000491#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000492
493#ifdef TARGET_X86_64
pbrook56aebc82008-10-11 17:55:29 +0000494static const int gpr_map[16] = {
bellard79808572008-05-09 14:40:22 +0000495 R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
pbrook56aebc82008-10-11 17:55:29 +0000496 8, 9, 10, 11, 12, 13, 14, 15
bellard79808572008-05-09 14:40:22 +0000497};
bellard79808572008-05-09 14:40:22 +0000498#else
pbrook56aebc82008-10-11 17:55:29 +0000499static const int gpr_map[8] = {0, 1, 2, 3, 4, 5, 6, 7};
bellard79808572008-05-09 14:40:22 +0000500#endif
pbrook56aebc82008-10-11 17:55:29 +0000501
502#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
503
504static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
505{
506 if (n < CPU_NB_REGS) {
507 GET_REGL(env->regs[gpr_map[n]]);
508 } else if (n >= CPU_NB_REGS + 8 && n < CPU_NB_REGS + 16) {
509 /* FIXME: byteswap float values. */
510#ifdef USE_X86LDOUBLE
511 memcpy(mem_buf, &env->fpregs[n - (CPU_NB_REGS + 8)], 10);
512#else
513 memset(mem_buf, 0, 10);
514#endif
515 return 10;
516 } else if (n >= CPU_NB_REGS + 24) {
517 n -= CPU_NB_REGS + 24;
518 if (n < CPU_NB_REGS) {
519 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
520 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
521 return 16;
522 } else if (n == CPU_NB_REGS) {
523 GET_REG32(env->mxcsr);
524 }
525 } else {
526 n -= CPU_NB_REGS;
527 switch (n) {
528 case 0: GET_REGL(env->eip);
529 case 1: GET_REG32(env->eflags);
530 case 2: GET_REG32(env->segs[R_CS].selector);
531 case 3: GET_REG32(env->segs[R_SS].selector);
532 case 4: GET_REG32(env->segs[R_DS].selector);
533 case 5: GET_REG32(env->segs[R_ES].selector);
534 case 6: GET_REG32(env->segs[R_FS].selector);
535 case 7: GET_REG32(env->segs[R_GS].selector);
536 /* 8...15 x87 regs. */
537 case 16: GET_REG32(env->fpuc);
538 case 17: GET_REG32((env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11);
539 case 18: GET_REG32(0); /* ftag */
540 case 19: GET_REG32(0); /* fiseg */
541 case 20: GET_REG32(0); /* fioff */
542 case 21: GET_REG32(0); /* foseg */
543 case 22: GET_REG32(0); /* fooff */
544 case 23: GET_REG32(0); /* fop */
545 /* 24+ xmm regs. */
546 }
bellard79808572008-05-09 14:40:22 +0000547 }
pbrook56aebc82008-10-11 17:55:29 +0000548 return 0;
bellard79808572008-05-09 14:40:22 +0000549}
550
pbrook56aebc82008-10-11 17:55:29 +0000551static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int i)
bellard79808572008-05-09 14:40:22 +0000552{
pbrook56aebc82008-10-11 17:55:29 +0000553 uint32_t tmp;
554
555 if (i < CPU_NB_REGS) {
556 env->regs[gpr_map[i]] = ldtul_p(mem_buf);
557 return sizeof(target_ulong);
558 } else if (i >= CPU_NB_REGS + 8 && i < CPU_NB_REGS + 16) {
559 i -= CPU_NB_REGS + 8;
560#ifdef USE_X86LDOUBLE
561 memcpy(&env->fpregs[i], mem_buf, 10);
562#endif
563 return 10;
564 } else if (i >= CPU_NB_REGS + 24) {
565 i -= CPU_NB_REGS + 24;
566 if (i < CPU_NB_REGS) {
567 env->xmm_regs[i].XMM_Q(0) = ldq_p(mem_buf);
568 env->xmm_regs[i].XMM_Q(1) = ldq_p(mem_buf + 8);
569 return 16;
570 } else if (i == CPU_NB_REGS) {
571 env->mxcsr = ldl_p(mem_buf);
572 return 4;
573 }
574 } else {
575 i -= CPU_NB_REGS;
576 switch (i) {
577 case 0: env->eip = ldtul_p(mem_buf); return sizeof(target_ulong);
578 case 1: env->eflags = ldl_p(mem_buf); return 4;
bellard79808572008-05-09 14:40:22 +0000579#if defined(CONFIG_USER_ONLY)
pbrook56aebc82008-10-11 17:55:29 +0000580#define LOAD_SEG(index, sreg)\
581 tmp = ldl_p(mem_buf);\
582 if (tmp != env->segs[sreg].selector)\
583 cpu_x86_load_seg(env, sreg, tmp);
bellard79808572008-05-09 14:40:22 +0000584#else
pbrook56aebc82008-10-11 17:55:29 +0000585/* FIXME: Honor segment registers. Needs to avoid raising an exception
586 when the selector is invalid. */
587#define LOAD_SEG(index, sreg) do {} while(0)
bellard79808572008-05-09 14:40:22 +0000588#endif
pbrook56aebc82008-10-11 17:55:29 +0000589 case 2: LOAD_SEG(10, R_CS); return 4;
590 case 3: LOAD_SEG(11, R_SS); return 4;
591 case 4: LOAD_SEG(12, R_DS); return 4;
592 case 5: LOAD_SEG(13, R_ES); return 4;
593 case 6: LOAD_SEG(14, R_FS); return 4;
594 case 7: LOAD_SEG(15, R_GS); return 4;
595 /* 8...15 x87 regs. */
596 case 16: env->fpuc = ldl_p(mem_buf); return 4;
597 case 17:
598 tmp = ldl_p(mem_buf);
599 env->fpstt = (tmp >> 11) & 7;
600 env->fpus = tmp & ~0x3800;
601 return 4;
602 case 18: /* ftag */ return 4;
603 case 19: /* fiseg */ return 4;
604 case 20: /* fioff */ return 4;
605 case 21: /* foseg */ return 4;
606 case 22: /* fooff */ return 4;
607 case 23: /* fop */ return 4;
608 /* 24+ xmm regs. */
bellard79808572008-05-09 14:40:22 +0000609 }
bellard79808572008-05-09 14:40:22 +0000610 }
pbrook56aebc82008-10-11 17:55:29 +0000611 /* Unrecognised register. */
612 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000613}
614
bellard9e62fd72004-01-05 22:49:06 +0000615#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000616
617#define NUM_CORE_REGS 71
618
619static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000620{
pbrook56aebc82008-10-11 17:55:29 +0000621 if (n < 32) {
622 /* gprs */
623 GET_REGL(env->gpr[n]);
624 } else if (n < 64) {
625 /* fprs */
aurel328d4acf92008-11-30 16:23:18 +0000626 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000627 return 8;
628 } else {
629 switch (n) {
630 case 64: GET_REGL(env->nip);
631 case 65: GET_REGL(env->msr);
632 case 66:
633 {
634 uint32_t cr = 0;
635 int i;
636 for (i = 0; i < 8; i++)
637 cr |= env->crf[i] << (32 - ((i + 1) * 4));
638 GET_REG32(cr);
639 }
640 case 67: GET_REGL(env->lr);
641 case 68: GET_REGL(env->ctr);
aurel323d7b4172008-10-21 11:28:46 +0000642 case 69: GET_REGL(env->xer);
pbrook56aebc82008-10-11 17:55:29 +0000643 case 70: GET_REG32(0); /* fpscr */
644 }
bellard9e62fd72004-01-05 22:49:06 +0000645 }
pbrook56aebc82008-10-11 17:55:29 +0000646 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000647}
648
pbrook56aebc82008-10-11 17:55:29 +0000649static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000650{
pbrook56aebc82008-10-11 17:55:29 +0000651 if (n < 32) {
652 /* gprs */
653 env->gpr[n] = ldtul_p(mem_buf);
654 return sizeof(target_ulong);
655 } else if (n < 64) {
656 /* fprs */
aurel328d4acf92008-11-30 16:23:18 +0000657 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000658 return 8;
659 } else {
660 switch (n) {
661 case 64:
662 env->nip = ldtul_p(mem_buf);
663 return sizeof(target_ulong);
664 case 65:
665 ppc_store_msr(env, ldtul_p(mem_buf));
666 return sizeof(target_ulong);
667 case 66:
668 {
669 uint32_t cr = ldl_p(mem_buf);
670 int i;
671 for (i = 0; i < 8; i++)
672 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
673 return 4;
674 }
675 case 67:
676 env->lr = ldtul_p(mem_buf);
677 return sizeof(target_ulong);
678 case 68:
679 env->ctr = ldtul_p(mem_buf);
680 return sizeof(target_ulong);
681 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000682 env->xer = ldtul_p(mem_buf);
683 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000684 case 70:
685 /* fpscr */
686 return 4;
687 }
bellard9e62fd72004-01-05 22:49:06 +0000688 }
pbrook56aebc82008-10-11 17:55:29 +0000689 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000690}
pbrook56aebc82008-10-11 17:55:29 +0000691
bellarde95c8d52004-09-30 22:22:08 +0000692#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000693
pbrook56aebc82008-10-11 17:55:29 +0000694#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
695#define NUM_CORE_REGS 86
696#else
697#define NUM_CORE_REGS 73
698#endif
699
700#ifdef TARGET_ABI32
701#define GET_REGA(val) GET_REG32(val)
702#else
703#define GET_REGA(val) GET_REGL(val)
704#endif
705
706static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
707{
708 if (n < 8) {
709 /* g0..g7 */
710 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000711 }
pbrook56aebc82008-10-11 17:55:29 +0000712 if (n < 32) {
713 /* register window */
714 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000715 }
pbrook56aebc82008-10-11 17:55:29 +0000716#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
717 if (n < 64) {
718 /* fprs */
719 GET_REG32(*((uint32_t *)&env->fpr[n - 32]));
bellarde95c8d52004-09-30 22:22:08 +0000720 }
721 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000722 switch (n) {
723 case 64: GET_REGA(env->y);
724 case 65: GET_REGA(GET_PSR(env));
725 case 66: GET_REGA(env->wim);
726 case 67: GET_REGA(env->tbr);
727 case 68: GET_REGA(env->pc);
728 case 69: GET_REGA(env->npc);
729 case 70: GET_REGA(env->fsr);
730 case 71: GET_REGA(0); /* csr */
731 case 72: GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000732 }
bellard34751872005-07-02 14:31:34 +0000733#else
pbrook56aebc82008-10-11 17:55:29 +0000734 if (n < 64) {
735 /* f0-f31 */
736 GET_REG32(*((uint32_t *)&env->fpr[n - 32]));
bellard34751872005-07-02 14:31:34 +0000737 }
pbrook56aebc82008-10-11 17:55:29 +0000738 if (n < 80) {
739 /* f32-f62 (double width, even numbers only) */
740 uint64_t val;
741
742 val = (uint64_t)*((uint32_t *)&env->fpr[(n - 64) * 2 + 32]) << 32;
743 val |= *((uint32_t *)&env->fpr[(n - 64) * 2 + 33]);
744 GET_REG64(val);
745 }
746 switch (n) {
747 case 80: GET_REGL(env->pc);
748 case 81: GET_REGL(env->npc);
749 case 82: GET_REGL(((uint64_t)GET_CCR(env) << 32) |
blueswir117d996e2007-07-07 20:53:22 +0000750 ((env->asi & 0xff) << 24) |
751 ((env->pstate & 0xfff) << 8) |
752 GET_CWP64(env));
pbrook56aebc82008-10-11 17:55:29 +0000753 case 83: GET_REGL(env->fsr);
754 case 84: GET_REGL(env->fprs);
755 case 85: GET_REGL(env->y);
756 }
bellard34751872005-07-02 14:31:34 +0000757#endif
pbrook56aebc82008-10-11 17:55:29 +0000758 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000759}
760
pbrook56aebc82008-10-11 17:55:29 +0000761static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000762{
pbrook56aebc82008-10-11 17:55:29 +0000763#if defined(TARGET_ABI32)
764 abi_ulong tmp;
765
766 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000767#else
pbrook56aebc82008-10-11 17:55:29 +0000768 target_ulong tmp;
769
770 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000771#endif
bellarde95c8d52004-09-30 22:22:08 +0000772
pbrook56aebc82008-10-11 17:55:29 +0000773 if (n < 8) {
774 /* g0..g7 */
775 env->gregs[n] = tmp;
776 } else if (n < 32) {
777 /* register window */
778 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000779 }
pbrook56aebc82008-10-11 17:55:29 +0000780#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
781 else if (n < 64) {
782 /* fprs */
783 *((uint32_t *)&env->fpr[n - 32]) = tmp;
784 } else {
785 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
786 switch (n) {
787 case 64: env->y = tmp; break;
788 case 65: PUT_PSR(env, tmp); break;
789 case 66: env->wim = tmp; break;
790 case 67: env->tbr = tmp; break;
791 case 68: env->pc = tmp; break;
792 case 69: env->npc = tmp; break;
793 case 70: env->fsr = tmp; break;
794 default: return 0;
795 }
bellarde95c8d52004-09-30 22:22:08 +0000796 }
pbrook56aebc82008-10-11 17:55:29 +0000797 return 4;
bellard34751872005-07-02 14:31:34 +0000798#else
pbrook56aebc82008-10-11 17:55:29 +0000799 else if (n < 64) {
800 /* f0-f31 */
pbrook56aebc82008-10-11 17:55:29 +0000801 env->fpr[n] = ldfl_p(mem_buf);
802 return 4;
803 } else if (n < 80) {
804 /* f32-f62 (double width, even numbers only) */
805 *((uint32_t *)&env->fpr[(n - 64) * 2 + 32]) = tmp >> 32;
806 *((uint32_t *)&env->fpr[(n - 64) * 2 + 33]) = tmp;
807 } else {
808 switch (n) {
809 case 80: env->pc = tmp; break;
810 case 81: env->npc = tmp; break;
811 case 82:
812 PUT_CCR(env, tmp >> 32);
813 env->asi = (tmp >> 24) & 0xff;
814 env->pstate = (tmp >> 8) & 0xfff;
815 PUT_CWP64(env, tmp & 0xff);
816 break;
817 case 83: env->fsr = tmp; break;
818 case 84: env->fprs = tmp; break;
819 case 85: env->y = tmp; break;
820 default: return 0;
821 }
bellard34751872005-07-02 14:31:34 +0000822 }
pbrook56aebc82008-10-11 17:55:29 +0000823 return 8;
bellard34751872005-07-02 14:31:34 +0000824#endif
bellard9e62fd72004-01-05 22:49:06 +0000825}
bellard1fddef42005-04-17 19:16:13 +0000826#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000827
828/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
829 whatever the target description contains. Due to a historical mishap
830 the FPA registers appear in between core integer regs and the CPSR.
831 We hack round this by giving the FPA regs zero size when talking to a
832 newer gdb. */
833#define NUM_CORE_REGS 26
834#define GDB_CORE_XML "arm-core.xml"
835
836static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000837{
pbrook56aebc82008-10-11 17:55:29 +0000838 if (n < 16) {
839 /* Core integer register. */
840 GET_REG32(env->regs[n]);
841 }
842 if (n < 24) {
843 /* FPA registers. */
844 if (gdb_has_xml)
845 return 0;
846 memset(mem_buf, 0, 12);
847 return 12;
848 }
849 switch (n) {
850 case 24:
851 /* FPA status register. */
852 if (gdb_has_xml)
853 return 0;
854 GET_REG32(0);
855 case 25:
856 /* CPSR */
857 GET_REG32(cpsr_read(env));
858 }
859 /* Unknown register. */
860 return 0;
bellard1fddef42005-04-17 19:16:13 +0000861}
862
pbrook56aebc82008-10-11 17:55:29 +0000863static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000864{
pbrook56aebc82008-10-11 17:55:29 +0000865 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000866
pbrook56aebc82008-10-11 17:55:29 +0000867 tmp = ldl_p(mem_buf);
868
869 /* Mask out low bit of PC to workaround gdb bugs. This will probably
870 cause problems if we ever implement the Jazelle DBX extensions. */
871 if (n == 15)
872 tmp &= ~1;
873
874 if (n < 16) {
875 /* Core integer register. */
876 env->regs[n] = tmp;
877 return 4;
878 }
879 if (n < 24) { /* 16-23 */
880 /* FPA registers (ignored). */
881 if (gdb_has_xml)
882 return 0;
883 return 12;
884 }
885 switch (n) {
886 case 24:
887 /* FPA status register (ignored). */
888 if (gdb_has_xml)
889 return 0;
890 return 4;
891 case 25:
892 /* CPSR */
893 cpsr_write (env, tmp, 0xffffffff);
894 return 4;
895 }
896 /* Unknown register. */
897 return 0;
bellard1fddef42005-04-17 19:16:13 +0000898}
pbrook56aebc82008-10-11 17:55:29 +0000899
pbrooke6e59062006-10-22 00:18:54 +0000900#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +0000901
902#define NUM_CORE_REGS 18
903
904#define GDB_CORE_XML "cf-core.xml"
905
906static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000907{
pbrook56aebc82008-10-11 17:55:29 +0000908 if (n < 8) {
909 /* D0-D7 */
910 GET_REG32(env->dregs[n]);
911 } else if (n < 16) {
912 /* A0-A7 */
913 GET_REG32(env->aregs[n - 8]);
914 } else {
915 switch (n) {
916 case 16: GET_REG32(env->sr);
917 case 17: GET_REG32(env->pc);
918 }
pbrooke6e59062006-10-22 00:18:54 +0000919 }
pbrook56aebc82008-10-11 17:55:29 +0000920 /* FP registers not included here because they vary between
921 ColdFire and m68k. Use XML bits for these. */
922 return 0;
pbrooke6e59062006-10-22 00:18:54 +0000923}
924
pbrook56aebc82008-10-11 17:55:29 +0000925static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000926{
pbrook56aebc82008-10-11 17:55:29 +0000927 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +0000928
pbrook56aebc82008-10-11 17:55:29 +0000929 tmp = ldl_p(mem_buf);
930
931 if (n < 8) {
932 /* D0-D7 */
933 env->dregs[n] = tmp;
934 } else if (n < 8) {
935 /* A0-A7 */
936 env->aregs[n - 8] = tmp;
937 } else {
938 switch (n) {
939 case 16: env->sr = tmp; break;
940 case 17: env->pc = tmp; break;
941 default: return 0;
942 }
pbrooke6e59062006-10-22 00:18:54 +0000943 }
pbrook56aebc82008-10-11 17:55:29 +0000944 return 4;
pbrooke6e59062006-10-22 00:18:54 +0000945}
bellard6f970bd2005-12-05 19:55:19 +0000946#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +0000947
948#define NUM_CORE_REGS 73
949
950static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000951{
pbrook56aebc82008-10-11 17:55:29 +0000952 if (n < 32) {
953 GET_REGL(env->active_tc.gpr[n]);
954 }
955 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
956 if (n >= 38 && n < 70) {
ths7ac256b2007-10-25 21:30:37 +0000957 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +0000958 GET_REGL(env->active_fpu.fpr[n - 38].d);
ths7ac256b2007-10-25 21:30:37 +0000959 else
pbrook56aebc82008-10-11 17:55:29 +0000960 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
961 }
962 switch (n) {
963 case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
964 case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
965 }
966 }
967 switch (n) {
968 case 32: GET_REGL((int32_t)env->CP0_Status);
969 case 33: GET_REGL(env->active_tc.LO[0]);
970 case 34: GET_REGL(env->active_tc.HI[0]);
971 case 35: GET_REGL(env->CP0_BadVAddr);
972 case 36: GET_REGL((int32_t)env->CP0_Cause);
973 case 37: GET_REGL(env->active_tc.PC);
974 case 72: GET_REGL(0); /* fp */
975 case 89: GET_REGL((int32_t)env->CP0_PRid);
976 }
977 if (n >= 73 && n <= 88) {
978 /* 16 embedded regs. */
979 GET_REGL(0);
980 }
ths36d23952007-02-28 22:37:42 +0000981
pbrook56aebc82008-10-11 17:55:29 +0000982 return 0;
bellard6f970bd2005-12-05 19:55:19 +0000983}
984
ths8e33c082006-12-11 19:22:27 +0000985/* convert MIPS rounding mode in FCR31 to IEEE library */
986static unsigned int ieee_rm[] =
987 {
988 float_round_nearest_even,
989 float_round_to_zero,
990 float_round_up,
991 float_round_down
992 };
993#define RESTORE_ROUNDING_MODE \
thsf01be152008-09-18 11:57:27 +0000994 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +0000995
pbrook56aebc82008-10-11 17:55:29 +0000996static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000997{
pbrook56aebc82008-10-11 17:55:29 +0000998 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +0000999
pbrook56aebc82008-10-11 17:55:29 +00001000 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001001
pbrook56aebc82008-10-11 17:55:29 +00001002 if (n < 32) {
1003 env->active_tc.gpr[n] = tmp;
1004 return sizeof(target_ulong);
1005 }
1006 if (env->CP0_Config1 & (1 << CP0C1_FP)
1007 && n >= 38 && n < 73) {
1008 if (n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001009 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001010 env->active_fpu.fpr[n - 38].d = tmp;
ths7ac256b2007-10-25 21:30:37 +00001011 else
pbrook56aebc82008-10-11 17:55:29 +00001012 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1013 }
1014 switch (n) {
1015 case 70:
1016 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1017 /* set rounding mode */
1018 RESTORE_ROUNDING_MODE;
ths8e33c082006-12-11 19:22:27 +00001019#ifndef CONFIG_SOFTFLOAT
pbrook56aebc82008-10-11 17:55:29 +00001020 /* no floating point exception for native float */
1021 SET_FP_ENABLE(env->active_fpu.fcr31, 0);
ths8e33c082006-12-11 19:22:27 +00001022#endif
pbrook56aebc82008-10-11 17:55:29 +00001023 break;
1024 case 71: env->active_fpu.fcr0 = tmp; break;
1025 }
1026 return sizeof(target_ulong);
1027 }
1028 switch (n) {
1029 case 32: env->CP0_Status = tmp; break;
1030 case 33: env->active_tc.LO[0] = tmp; break;
1031 case 34: env->active_tc.HI[0] = tmp; break;
1032 case 35: env->CP0_BadVAddr = tmp; break;
1033 case 36: env->CP0_Cause = tmp; break;
1034 case 37: env->active_tc.PC = tmp; break;
1035 case 72: /* fp, ignored */ break;
1036 default:
1037 if (n > 89)
1038 return 0;
1039 /* Other registers are readonly. Ignore writes. */
1040 break;
1041 }
1042
1043 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001044}
bellardfdf9b3e2006-04-27 21:07:38 +00001045#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001046
1047/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001048/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001049
pbrook56aebc82008-10-11 17:55:29 +00001050#define NUM_CORE_REGS 59
1051
1052static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001053{
pbrook56aebc82008-10-11 17:55:29 +00001054 if (n < 8) {
1055 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1056 GET_REGL(env->gregs[n + 16]);
1057 } else {
1058 GET_REGL(env->gregs[n]);
1059 }
1060 } else if (n < 16) {
1061 GET_REGL(env->gregs[n - 8]);
1062 } else if (n >= 25 && n < 41) {
1063 GET_REGL(env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)]);
1064 } else if (n >= 43 && n < 51) {
1065 GET_REGL(env->gregs[n - 43]);
1066 } else if (n >= 51 && n < 59) {
1067 GET_REGL(env->gregs[n - (51 - 16)]);
1068 }
1069 switch (n) {
1070 case 16: GET_REGL(env->pc);
1071 case 17: GET_REGL(env->pr);
1072 case 18: GET_REGL(env->gbr);
1073 case 19: GET_REGL(env->vbr);
1074 case 20: GET_REGL(env->mach);
1075 case 21: GET_REGL(env->macl);
1076 case 22: GET_REGL(env->sr);
1077 case 23: GET_REGL(env->fpul);
1078 case 24: GET_REGL(env->fpscr);
1079 case 41: GET_REGL(env->ssr);
1080 case 42: GET_REGL(env->spc);
1081 }
bellardfdf9b3e2006-04-27 21:07:38 +00001082
pbrook56aebc82008-10-11 17:55:29 +00001083 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001084}
1085
pbrook56aebc82008-10-11 17:55:29 +00001086static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001087{
pbrook56aebc82008-10-11 17:55:29 +00001088 uint32_t tmp;
bellardfdf9b3e2006-04-27 21:07:38 +00001089
pbrook56aebc82008-10-11 17:55:29 +00001090 tmp = ldl_p(mem_buf);
1091
1092 if (n < 8) {
1093 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1094 env->gregs[n + 16] = tmp;
1095 } else {
1096 env->gregs[n] = tmp;
1097 }
1098 return 4;
1099 } else if (n < 16) {
1100 env->gregs[n - 8] = tmp;
1101 return 4;
1102 } else if (n >= 25 && n < 41) {
1103 env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)] = tmp;
1104 } else if (n >= 43 && n < 51) {
1105 env->gregs[n - 43] = tmp;
1106 return 4;
1107 } else if (n >= 51 && n < 59) {
1108 env->gregs[n - (51 - 16)] = tmp;
1109 return 4;
1110 }
1111 switch (n) {
1112 case 16: env->pc = tmp;
1113 case 17: env->pr = tmp;
1114 case 18: env->gbr = tmp;
1115 case 19: env->vbr = tmp;
1116 case 20: env->mach = tmp;
1117 case 21: env->macl = tmp;
1118 case 22: env->sr = tmp;
1119 case 23: env->fpul = tmp;
1120 case 24: env->fpscr = tmp;
1121 case 41: env->ssr = tmp;
1122 case 42: env->spc = tmp;
1123 default: return 0;
1124 }
1125
1126 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001127}
thsf1ccf902007-10-08 13:16:14 +00001128#elif defined (TARGET_CRIS)
1129
pbrook56aebc82008-10-11 17:55:29 +00001130#define NUM_CORE_REGS 49
1131
1132static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001133{
pbrook56aebc82008-10-11 17:55:29 +00001134 uint8_t srs;
1135
1136 srs = env->pregs[PR_SRS];
1137 if (n < 16) {
1138 GET_REG32(env->regs[n]);
1139 }
1140
1141 if (n >= 21 && n < 32) {
1142 GET_REG32(env->pregs[n - 16]);
1143 }
1144 if (n >= 33 && n < 49) {
1145 GET_REG32(env->sregs[srs][n - 33]);
1146 }
1147 switch (n) {
1148 case 16: GET_REG8(env->pregs[0]);
1149 case 17: GET_REG8(env->pregs[1]);
1150 case 18: GET_REG32(env->pregs[2]);
1151 case 19: GET_REG8(srs);
1152 case 20: GET_REG16(env->pregs[4]);
1153 case 32: GET_REG32(env->pc);
1154 }
1155
1156 return 0;
thsf1ccf902007-10-08 13:16:14 +00001157}
1158
pbrook56aebc82008-10-11 17:55:29 +00001159static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001160{
pbrook56aebc82008-10-11 17:55:29 +00001161 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001162
pbrook56aebc82008-10-11 17:55:29 +00001163 if (n > 49)
1164 return 0;
thsf1ccf902007-10-08 13:16:14 +00001165
pbrook56aebc82008-10-11 17:55:29 +00001166 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001167
pbrook56aebc82008-10-11 17:55:29 +00001168 if (n < 16) {
1169 env->regs[n] = tmp;
1170 }
thsf1ccf902007-10-08 13:16:14 +00001171
edgar_igld7b69672008-10-11 19:32:21 +00001172 if (n >= 21 && n < 32) {
1173 env->pregs[n - 16] = tmp;
1174 }
1175
1176 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001177 switch (n) {
1178 case 16: return 1;
1179 case 17: return 1;
edgar_igld7b69672008-10-11 19:32:21 +00001180 case 18: env->pregs[PR_PID] = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +00001181 case 19: return 1;
1182 case 20: return 2;
1183 case 32: env->pc = tmp; break;
1184 }
thsf1ccf902007-10-08 13:16:14 +00001185
pbrook56aebc82008-10-11 17:55:29 +00001186 return 4;
thsf1ccf902007-10-08 13:16:14 +00001187}
aurel3219bf5172008-12-07 23:26:32 +00001188#elif defined (TARGET_ALPHA)
1189
1190#define NUM_CORE_REGS 65
1191
1192static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1193{
1194 if (n < 31) {
1195 GET_REGL(env->ir[n]);
1196 }
1197 else if (n == 31) {
1198 GET_REGL(0);
1199 }
1200 else if (n<63) {
1201 uint64_t val;
1202
1203 val=*((uint64_t *)&env->fir[n-32]);
1204 GET_REGL(val);
1205 }
1206 else if (n==63) {
1207 GET_REGL(env->fpcr);
1208 }
1209 else if (n==64) {
1210 GET_REGL(env->pc);
1211 }
1212 else {
1213 GET_REGL(0);
1214 }
1215
1216 return 0;
1217}
1218
1219static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1220{
1221 target_ulong tmp;
1222 tmp = ldtul_p(mem_buf);
1223
1224 if (n < 31) {
1225 env->ir[n] = tmp;
1226 }
1227
1228 if (n > 31 && n < 63) {
1229 env->fir[n - 32] = ldfl_p(mem_buf);
1230 }
1231
1232 if (n == 64 ) {
1233 env->pc=tmp;
1234 }
1235
1236 return 8;
1237}
bellard1fddef42005-04-17 19:16:13 +00001238#else
pbrook56aebc82008-10-11 17:55:29 +00001239
1240#define NUM_CORE_REGS 0
1241
1242static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001243{
1244 return 0;
1245}
1246
pbrook56aebc82008-10-11 17:55:29 +00001247static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001248{
pbrook56aebc82008-10-11 17:55:29 +00001249 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001250}
1251
1252#endif
bellardb4608c02003-06-27 17:34:32 +00001253
pbrook56aebc82008-10-11 17:55:29 +00001254static int num_g_regs = NUM_CORE_REGS;
1255
1256#ifdef GDB_CORE_XML
1257/* Encode data using the encoding for 'x' packets. */
1258static int memtox(char *buf, const char *mem, int len)
1259{
1260 char *p = buf;
1261 char c;
1262
1263 while (len--) {
1264 c = *(mem++);
1265 switch (c) {
1266 case '#': case '$': case '*': case '}':
1267 *(p++) = '}';
1268 *(p++) = c ^ 0x20;
1269 break;
1270 default:
1271 *(p++) = c;
1272 break;
1273 }
1274 }
1275 return p - buf;
1276}
1277
aurel323faf7782008-12-07 23:26:17 +00001278static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001279{
1280 extern const char *const xml_builtin[][2];
1281 size_t len;
1282 int i;
1283 const char *name;
1284 static char target_xml[1024];
1285
1286 len = 0;
1287 while (p[len] && p[len] != ':')
1288 len++;
1289 *newp = p + len;
1290
1291 name = NULL;
1292 if (strncmp(p, "target.xml", len) == 0) {
1293 /* Generate the XML description for this CPU. */
1294 if (!target_xml[0]) {
1295 GDBRegisterState *r;
1296
blueswir15b3715b2008-10-25 11:18:12 +00001297 snprintf(target_xml, sizeof(target_xml),
1298 "<?xml version=\"1.0\"?>"
1299 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1300 "<target>"
1301 "<xi:include href=\"%s\"/>",
1302 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001303
aliguori880a7572008-11-18 20:30:24 +00001304 for (r = first_cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001305 strcat(target_xml, "<xi:include href=\"");
1306 strcat(target_xml, r->xml);
1307 strcat(target_xml, "\"/>");
1308 }
1309 strcat(target_xml, "</target>");
1310 }
1311 return target_xml;
1312 }
1313 for (i = 0; ; i++) {
1314 name = xml_builtin[i][0];
1315 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1316 break;
1317 }
1318 return name ? xml_builtin[i][1] : NULL;
1319}
1320#endif
1321
1322static int gdb_read_register(CPUState *env, uint8_t *mem_buf, int reg)
1323{
1324 GDBRegisterState *r;
1325
1326 if (reg < NUM_CORE_REGS)
1327 return cpu_gdb_read_register(env, mem_buf, reg);
1328
1329 for (r = env->gdb_regs; r; r = r->next) {
1330 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1331 return r->get_reg(env, mem_buf, reg - r->base_reg);
1332 }
1333 }
1334 return 0;
1335}
1336
1337static int gdb_write_register(CPUState *env, uint8_t *mem_buf, int reg)
1338{
1339 GDBRegisterState *r;
1340
1341 if (reg < NUM_CORE_REGS)
1342 return cpu_gdb_write_register(env, mem_buf, reg);
1343
1344 for (r = env->gdb_regs; r; r = r->next) {
1345 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1346 return r->set_reg(env, mem_buf, reg - r->base_reg);
1347 }
1348 }
1349 return 0;
1350}
1351
1352/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1353 specifies the first register number and these registers are included in
1354 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1355 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1356 */
1357
1358void gdb_register_coprocessor(CPUState * env,
1359 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1360 int num_regs, const char *xml, int g_pos)
1361{
1362 GDBRegisterState *s;
1363 GDBRegisterState **p;
1364 static int last_reg = NUM_CORE_REGS;
1365
1366 s = (GDBRegisterState *)qemu_mallocz(sizeof(GDBRegisterState));
1367 s->base_reg = last_reg;
1368 s->num_regs = num_regs;
1369 s->get_reg = get_reg;
1370 s->set_reg = set_reg;
1371 s->xml = xml;
1372 p = &env->gdb_regs;
1373 while (*p) {
1374 /* Check for duplicates. */
1375 if (strcmp((*p)->xml, xml) == 0)
1376 return;
1377 p = &(*p)->next;
1378 }
1379 /* Add to end of list. */
1380 last_reg += num_regs;
1381 *p = s;
1382 if (g_pos) {
1383 if (g_pos != s->base_reg) {
1384 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1385 "Expected %d got %d\n", xml, g_pos, s->base_reg);
1386 } else {
1387 num_g_regs = last_reg;
1388 }
1389 }
1390}
1391
aliguoria1d1bb32008-11-18 20:07:32 +00001392/* GDB breakpoint/watchpoint types */
1393#define GDB_BREAKPOINT_SW 0
1394#define GDB_BREAKPOINT_HW 1
1395#define GDB_WATCHPOINT_WRITE 2
1396#define GDB_WATCHPOINT_READ 3
1397#define GDB_WATCHPOINT_ACCESS 4
1398
1399#ifndef CONFIG_USER_ONLY
1400static const int xlat_gdb_type[] = {
1401 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1402 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1403 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1404};
1405#endif
1406
aliguori880a7572008-11-18 20:30:24 +00001407static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001408{
aliguori880a7572008-11-18 20:30:24 +00001409 CPUState *env;
1410 int err = 0;
1411
aliguoria1d1bb32008-11-18 20:07:32 +00001412 switch (type) {
1413 case GDB_BREAKPOINT_SW:
1414 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001415 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1416 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1417 if (err)
1418 break;
1419 }
1420 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001421#ifndef CONFIG_USER_ONLY
1422 case GDB_WATCHPOINT_WRITE:
1423 case GDB_WATCHPOINT_READ:
1424 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001425 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1426 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1427 NULL);
1428 if (err)
1429 break;
1430 }
1431 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001432#endif
1433 default:
1434 return -ENOSYS;
1435 }
1436}
1437
aliguori880a7572008-11-18 20:30:24 +00001438static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001439{
aliguori880a7572008-11-18 20:30:24 +00001440 CPUState *env;
1441 int err = 0;
1442
aliguoria1d1bb32008-11-18 20:07:32 +00001443 switch (type) {
1444 case GDB_BREAKPOINT_SW:
1445 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001446 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1447 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1448 if (err)
1449 break;
1450 }
1451 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001452#ifndef CONFIG_USER_ONLY
1453 case GDB_WATCHPOINT_WRITE:
1454 case GDB_WATCHPOINT_READ:
1455 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001456 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1457 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1458 if (err)
1459 break;
1460 }
1461 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001462#endif
1463 default:
1464 return -ENOSYS;
1465 }
1466}
1467
aliguori880a7572008-11-18 20:30:24 +00001468static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001469{
aliguori880a7572008-11-18 20:30:24 +00001470 CPUState *env;
1471
1472 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1473 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001474#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001475 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001476#endif
aliguori880a7572008-11-18 20:30:24 +00001477 }
aliguoria1d1bb32008-11-18 20:07:32 +00001478}
1479
aliguori880a7572008-11-18 20:30:24 +00001480static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001481{
aliguori880a7572008-11-18 20:30:24 +00001482 CPUState *env;
bellardb4608c02003-06-27 17:34:32 +00001483 const char *p;
aliguori880a7572008-11-18 20:30:24 +00001484 int ch, reg_size, type, res, thread;
pbrook56aebc82008-10-11 17:55:29 +00001485 char buf[MAX_PACKET_LENGTH];
1486 uint8_t mem_buf[MAX_PACKET_LENGTH];
1487 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001488 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001489
bellard858693c2004-03-31 18:52:07 +00001490#ifdef DEBUG_GDB
1491 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001492#endif
bellard858693c2004-03-31 18:52:07 +00001493 p = line_buf;
1494 ch = *p++;
1495 switch(ch) {
1496 case '?':
bellard1fddef42005-04-17 19:16:13 +00001497 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001498 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
aliguori880a7572008-11-18 20:30:24 +00001499 s->c_cpu->cpu_index+1);
bellard858693c2004-03-31 18:52:07 +00001500 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001501 /* Remove all the breakpoints when this query is issued,
1502 * because gdb is doing and initial connect and the state
1503 * should be cleaned up.
1504 */
aliguori880a7572008-11-18 20:30:24 +00001505 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001506 break;
1507 case 'c':
1508 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001509 addr = strtoull(p, (char **)&p, 16);
bellardc33a3462003-07-29 20:50:33 +00001510#if defined(TARGET_I386)
aliguori880a7572008-11-18 20:30:24 +00001511 s->c_cpu->eip = addr;
bellard5be1a8e2004-01-04 23:51:58 +00001512#elif defined (TARGET_PPC)
aliguori880a7572008-11-18 20:30:24 +00001513 s->c_cpu->nip = addr;
bellard8d5f07f2004-10-04 21:23:09 +00001514#elif defined (TARGET_SPARC)
aliguori880a7572008-11-18 20:30:24 +00001515 s->c_cpu->pc = addr;
1516 s->c_cpu->npc = addr + 4;
bellardb5ff1b32005-11-26 10:38:39 +00001517#elif defined (TARGET_ARM)
aliguori880a7572008-11-18 20:30:24 +00001518 s->c_cpu->regs[15] = addr;
bellardfdf9b3e2006-04-27 21:07:38 +00001519#elif defined (TARGET_SH4)
aliguori880a7572008-11-18 20:30:24 +00001520 s->c_cpu->pc = addr;
ths8fac5802007-07-12 10:05:07 +00001521#elif defined (TARGET_MIPS)
aliguori880a7572008-11-18 20:30:24 +00001522 s->c_cpu->active_tc.PC = addr;
thsf1ccf902007-10-08 13:16:14 +00001523#elif defined (TARGET_CRIS)
aliguori880a7572008-11-18 20:30:24 +00001524 s->c_cpu->pc = addr;
aurel3219bf5172008-12-07 23:26:32 +00001525#elif defined (TARGET_ALPHA)
1526 s->c_cpu->pc = addr;
bellardc33a3462003-07-29 20:50:33 +00001527#endif
bellard858693c2004-03-31 18:52:07 +00001528 }
aurel32ca587a82008-12-18 22:44:13 +00001529 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001530 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001531 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001532 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001533 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1534 if (s->signal == -1)
1535 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001536 gdb_continue(s);
1537 return RS_IDLE;
edgar_igl7d03f822008-05-17 18:58:29 +00001538 case 'k':
1539 /* Kill the target */
1540 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1541 exit(0);
1542 case 'D':
1543 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001544 gdb_breakpoint_remove_all();
edgar_igl7d03f822008-05-17 18:58:29 +00001545 gdb_continue(s);
1546 put_packet(s, "OK");
1547 break;
bellard858693c2004-03-31 18:52:07 +00001548 case 's':
1549 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001550 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001551#if defined(TARGET_I386)
aliguori880a7572008-11-18 20:30:24 +00001552 s->c_cpu->eip = addr;
bellard858693c2004-03-31 18:52:07 +00001553#elif defined (TARGET_PPC)
aliguori880a7572008-11-18 20:30:24 +00001554 s->c_cpu->nip = addr;
bellard8d5f07f2004-10-04 21:23:09 +00001555#elif defined (TARGET_SPARC)
aliguori880a7572008-11-18 20:30:24 +00001556 s->c_cpu->pc = addr;
1557 s->c_cpu->npc = addr + 4;
bellardb5ff1b32005-11-26 10:38:39 +00001558#elif defined (TARGET_ARM)
aliguori880a7572008-11-18 20:30:24 +00001559 s->c_cpu->regs[15] = addr;
bellardfdf9b3e2006-04-27 21:07:38 +00001560#elif defined (TARGET_SH4)
aliguori880a7572008-11-18 20:30:24 +00001561 s->c_cpu->pc = addr;
ths8fac5802007-07-12 10:05:07 +00001562#elif defined (TARGET_MIPS)
aliguori880a7572008-11-18 20:30:24 +00001563 s->c_cpu->active_tc.PC = addr;
thsf1ccf902007-10-08 13:16:14 +00001564#elif defined (TARGET_CRIS)
aliguori880a7572008-11-18 20:30:24 +00001565 s->c_cpu->pc = addr;
aurel3219bf5172008-12-07 23:26:32 +00001566#elif defined (TARGET_ALPHA)
1567 s->c_cpu->pc = addr;
bellard858693c2004-03-31 18:52:07 +00001568#endif
1569 }
aliguori880a7572008-11-18 20:30:24 +00001570 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001571 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001572 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001573 case 'F':
1574 {
1575 target_ulong ret;
1576 target_ulong err;
1577
1578 ret = strtoull(p, (char **)&p, 16);
1579 if (*p == ',') {
1580 p++;
1581 err = strtoull(p, (char **)&p, 16);
1582 } else {
1583 err = 0;
1584 }
1585 if (*p == ',')
1586 p++;
1587 type = *p;
1588 if (gdb_current_syscall_cb)
aliguori880a7572008-11-18 20:30:24 +00001589 gdb_current_syscall_cb(s->c_cpu, ret, err);
pbrooka2d1eba2007-01-28 03:10:55 +00001590 if (type == 'C') {
1591 put_packet(s, "T02");
1592 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001593 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001594 }
1595 }
1596 break;
bellard858693c2004-03-31 18:52:07 +00001597 case 'g':
pbrook56aebc82008-10-11 17:55:29 +00001598 len = 0;
1599 for (addr = 0; addr < num_g_regs; addr++) {
aliguori880a7572008-11-18 20:30:24 +00001600 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001601 len += reg_size;
1602 }
1603 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001604 put_packet(s, buf);
1605 break;
1606 case 'G':
pbrook56aebc82008-10-11 17:55:29 +00001607 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001608 len = strlen(p) / 2;
1609 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00001610 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
aliguori880a7572008-11-18 20:30:24 +00001611 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001612 len -= reg_size;
1613 registers += reg_size;
1614 }
bellard858693c2004-03-31 18:52:07 +00001615 put_packet(s, "OK");
1616 break;
1617 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001618 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001619 if (*p == ',')
1620 p++;
bellard9d9754a2006-06-25 15:32:37 +00001621 len = strtoull(p, NULL, 16);
aliguori880a7572008-11-18 20:30:24 +00001622 if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001623 put_packet (s, "E14");
1624 } else {
1625 memtohex(buf, mem_buf, len);
1626 put_packet(s, buf);
1627 }
bellard858693c2004-03-31 18:52:07 +00001628 break;
1629 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001630 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001631 if (*p == ',')
1632 p++;
bellard9d9754a2006-06-25 15:32:37 +00001633 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001634 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001635 p++;
1636 hextomem(mem_buf, p, len);
aliguori880a7572008-11-18 20:30:24 +00001637 if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0)
bellard905f20b2005-04-26 21:09:55 +00001638 put_packet(s, "E14");
bellard858693c2004-03-31 18:52:07 +00001639 else
1640 put_packet(s, "OK");
1641 break;
pbrook56aebc82008-10-11 17:55:29 +00001642 case 'p':
1643 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1644 This works, but can be very slow. Anything new enough to
1645 understand XML also knows how to use this properly. */
1646 if (!gdb_has_xml)
1647 goto unknown_command;
1648 addr = strtoull(p, (char **)&p, 16);
aliguori880a7572008-11-18 20:30:24 +00001649 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001650 if (reg_size) {
1651 memtohex(buf, mem_buf, reg_size);
1652 put_packet(s, buf);
1653 } else {
1654 put_packet(s, "E14");
1655 }
1656 break;
1657 case 'P':
1658 if (!gdb_has_xml)
1659 goto unknown_command;
1660 addr = strtoull(p, (char **)&p, 16);
1661 if (*p == '=')
1662 p++;
1663 reg_size = strlen(p) / 2;
1664 hextomem(mem_buf, p, reg_size);
aliguori880a7572008-11-18 20:30:24 +00001665 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001666 put_packet(s, "OK");
1667 break;
bellard858693c2004-03-31 18:52:07 +00001668 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001669 case 'z':
1670 type = strtoul(p, (char **)&p, 16);
1671 if (*p == ',')
1672 p++;
bellard9d9754a2006-06-25 15:32:37 +00001673 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001674 if (*p == ',')
1675 p++;
bellard9d9754a2006-06-25 15:32:37 +00001676 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001677 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001678 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001679 else
aliguori880a7572008-11-18 20:30:24 +00001680 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001681 if (res >= 0)
1682 put_packet(s, "OK");
1683 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001684 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001685 else
1686 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001687 break;
aliguori880a7572008-11-18 20:30:24 +00001688 case 'H':
1689 type = *p++;
1690 thread = strtoull(p, (char **)&p, 16);
1691 if (thread == -1 || thread == 0) {
1692 put_packet(s, "OK");
1693 break;
1694 }
1695 for (env = first_cpu; env != NULL; env = env->next_cpu)
1696 if (env->cpu_index + 1 == thread)
1697 break;
1698 if (env == NULL) {
1699 put_packet(s, "E22");
1700 break;
1701 }
1702 switch (type) {
1703 case 'c':
1704 s->c_cpu = env;
1705 put_packet(s, "OK");
1706 break;
1707 case 'g':
1708 s->g_cpu = env;
1709 put_packet(s, "OK");
1710 break;
1711 default:
1712 put_packet(s, "E22");
1713 break;
1714 }
1715 break;
1716 case 'T':
1717 thread = strtoull(p, (char **)&p, 16);
1718#ifndef CONFIG_USER_ONLY
1719 if (thread > 0 && thread < smp_cpus + 1)
1720#else
1721 if (thread == 1)
1722#endif
1723 put_packet(s, "OK");
1724 else
1725 put_packet(s, "E22");
1726 break;
pbrook978efd62006-06-17 18:30:42 +00001727 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001728 case 'Q':
1729 /* parse any 'q' packets here */
1730 if (!strcmp(p,"qemu.sstepbits")) {
1731 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001732 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1733 SSTEP_ENABLE,
1734 SSTEP_NOIRQ,
1735 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001736 put_packet(s, buf);
1737 break;
1738 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1739 /* Display or change the sstep_flags */
1740 p += 10;
1741 if (*p != '=') {
1742 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001743 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001744 put_packet(s, buf);
1745 break;
1746 }
1747 p++;
1748 type = strtoul(p, (char **)&p, 16);
1749 sstep_flags = type;
1750 put_packet(s, "OK");
1751 break;
aliguori880a7572008-11-18 20:30:24 +00001752 } else if (strcmp(p,"C") == 0) {
1753 /* "Current thread" remains vague in the spec, so always return
1754 * the first CPU (gdb returns the first thread). */
1755 put_packet(s, "QC1");
1756 break;
1757 } else if (strcmp(p,"fThreadInfo") == 0) {
1758 s->query_cpu = first_cpu;
1759 goto report_cpuinfo;
1760 } else if (strcmp(p,"sThreadInfo") == 0) {
1761 report_cpuinfo:
1762 if (s->query_cpu) {
1763 snprintf(buf, sizeof(buf), "m%x", s->query_cpu->cpu_index+1);
1764 put_packet(s, buf);
1765 s->query_cpu = s->query_cpu->next_cpu;
1766 } else
1767 put_packet(s, "l");
1768 break;
1769 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1770 thread = strtoull(p+16, (char **)&p, 16);
1771 for (env = first_cpu; env != NULL; env = env->next_cpu)
1772 if (env->cpu_index + 1 == thread) {
1773 len = snprintf((char *)mem_buf, sizeof(mem_buf),
1774 "CPU#%d [%s]", env->cpu_index,
1775 env->halted ? "halted " : "running");
1776 memtohex(buf, mem_buf, len);
1777 put_packet(s, buf);
1778 break;
1779 }
1780 break;
edgar_igl60897d32008-05-09 08:25:14 +00001781 }
1782#ifdef CONFIG_LINUX_USER
1783 else if (strncmp(p, "Offsets", 7) == 0) {
aliguori880a7572008-11-18 20:30:24 +00001784 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00001785
blueswir1363a37d2008-08-21 17:58:08 +00001786 snprintf(buf, sizeof(buf),
1787 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1788 ";Bss=" TARGET_ABI_FMT_lx,
1789 ts->info->code_offset,
1790 ts->info->data_offset,
1791 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001792 put_packet(s, buf);
1793 break;
1794 }
pbrook978efd62006-06-17 18:30:42 +00001795#endif
pbrook56aebc82008-10-11 17:55:29 +00001796 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001797 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001798#ifdef GDB_CORE_XML
1799 strcat(buf, ";qXfer:features:read+");
1800#endif
1801 put_packet(s, buf);
1802 break;
1803 }
1804#ifdef GDB_CORE_XML
1805 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1806 const char *xml;
1807 target_ulong total_len;
1808
1809 gdb_has_xml = 1;
1810 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001811 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001812 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001813 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001814 put_packet(s, buf);
1815 break;
1816 }
1817
1818 if (*p == ':')
1819 p++;
1820 addr = strtoul(p, (char **)&p, 16);
1821 if (*p == ',')
1822 p++;
1823 len = strtoul(p, (char **)&p, 16);
1824
1825 total_len = strlen(xml);
1826 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001827 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001828 put_packet(s, buf);
1829 break;
1830 }
1831 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1832 len = (MAX_PACKET_LENGTH - 5) / 2;
1833 if (len < total_len - addr) {
1834 buf[0] = 'm';
1835 len = memtox(buf + 1, xml + addr, len);
1836 } else {
1837 buf[0] = 'l';
1838 len = memtox(buf + 1, xml + addr, total_len - addr);
1839 }
1840 put_packet_binary(s, buf, len + 1);
1841 break;
1842 }
1843#endif
1844 /* Unrecognised 'q' command. */
1845 goto unknown_command;
1846
bellard858693c2004-03-31 18:52:07 +00001847 default:
pbrook56aebc82008-10-11 17:55:29 +00001848 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001849 /* put empty packet */
1850 buf[0] = '\0';
1851 put_packet(s, buf);
1852 break;
1853 }
1854 return RS_IDLE;
1855}
1856
aliguori880a7572008-11-18 20:30:24 +00001857void gdb_set_stop_cpu(CPUState *env)
1858{
1859 gdbserver_state->c_cpu = env;
1860 gdbserver_state->g_cpu = env;
1861}
1862
bellard1fddef42005-04-17 19:16:13 +00001863#ifndef CONFIG_USER_ONLY
bellard858693c2004-03-31 18:52:07 +00001864static void gdb_vm_stopped(void *opaque, int reason)
1865{
aliguori880a7572008-11-18 20:30:24 +00001866 GDBState *s = gdbserver_state;
1867 CPUState *env = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001868 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001869 const char *type;
bellard858693c2004-03-31 18:52:07 +00001870 int ret;
1871
pbrooka2d1eba2007-01-28 03:10:55 +00001872 if (s->state == RS_SYSCALL)
1873 return;
1874
bellard858693c2004-03-31 18:52:07 +00001875 /* disable single step if it was enable */
aliguori880a7572008-11-18 20:30:24 +00001876 cpu_single_step(env, 0);
bellard858693c2004-03-31 18:52:07 +00001877
bellarde80cfcf2004-12-19 23:18:01 +00001878 if (reason == EXCP_DEBUG) {
aliguori880a7572008-11-18 20:30:24 +00001879 if (env->watchpoint_hit) {
1880 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001881 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001882 type = "r";
1883 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001884 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001885 type = "a";
1886 break;
1887 default:
1888 type = "";
1889 break;
1890 }
aliguori880a7572008-11-18 20:30:24 +00001891 snprintf(buf, sizeof(buf),
1892 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
aurel32ca587a82008-12-18 22:44:13 +00001893 GDB_SIGNAL_TRAP, env->cpu_index+1, type,
aliguori880a7572008-11-18 20:30:24 +00001894 env->watchpoint_hit->vaddr);
pbrook6658ffb2007-03-16 23:58:11 +00001895 put_packet(s, buf);
aliguori880a7572008-11-18 20:30:24 +00001896 env->watchpoint_hit = NULL;
pbrook6658ffb2007-03-16 23:58:11 +00001897 return;
1898 }
aliguori880a7572008-11-18 20:30:24 +00001899 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001900 ret = GDB_SIGNAL_TRAP;
bellardbbeb7b52006-04-23 18:42:15 +00001901 } else if (reason == EXCP_INTERRUPT) {
aurel32ca587a82008-12-18 22:44:13 +00001902 ret = GDB_SIGNAL_INT;
bellardbbeb7b52006-04-23 18:42:15 +00001903 } else {
bellard858693c2004-03-31 18:52:07 +00001904 ret = 0;
bellardbbeb7b52006-04-23 18:42:15 +00001905 }
aliguori880a7572008-11-18 20:30:24 +00001906 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, env->cpu_index+1);
bellard858693c2004-03-31 18:52:07 +00001907 put_packet(s, buf);
1908}
bellard1fddef42005-04-17 19:16:13 +00001909#endif
bellard858693c2004-03-31 18:52:07 +00001910
pbrooka2d1eba2007-01-28 03:10:55 +00001911/* Send a gdb syscall request.
1912 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001913 %x - target_ulong argument printed in hex.
1914 %lx - 64-bit argument printed in hex.
1915 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001916void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001917{
1918 va_list va;
1919 char buf[256];
1920 char *p;
1921 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001922 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001923 GDBState *s;
1924
aliguori880a7572008-11-18 20:30:24 +00001925 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001926 if (!s)
1927 return;
1928 gdb_current_syscall_cb = cb;
1929 s->state = RS_SYSCALL;
1930#ifndef CONFIG_USER_ONLY
1931 vm_stop(EXCP_DEBUG);
1932#endif
1933 s->state = RS_IDLE;
1934 va_start(va, fmt);
1935 p = buf;
1936 *(p++) = 'F';
1937 while (*fmt) {
1938 if (*fmt == '%') {
1939 fmt++;
1940 switch (*fmt++) {
1941 case 'x':
1942 addr = va_arg(va, target_ulong);
blueswir1363a37d2008-08-21 17:58:08 +00001943 p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001944 break;
pbrooka87295e2007-05-26 15:09:38 +00001945 case 'l':
1946 if (*(fmt++) != 'x')
1947 goto bad_format;
1948 i64 = va_arg(va, uint64_t);
blueswir1363a37d2008-08-21 17:58:08 +00001949 p += snprintf(p, &buf[sizeof(buf)] - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001950 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001951 case 's':
1952 addr = va_arg(va, target_ulong);
blueswir1363a37d2008-08-21 17:58:08 +00001953 p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx "/%x",
1954 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001955 break;
1956 default:
pbrooka87295e2007-05-26 15:09:38 +00001957 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001958 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1959 fmt - 1);
1960 break;
1961 }
1962 } else {
1963 *(p++) = *(fmt++);
1964 }
1965 }
pbrook8a93e022007-08-06 13:19:15 +00001966 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001967 va_end(va);
1968 put_packet(s, buf);
1969#ifdef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001970 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001971#else
aliguori880a7572008-11-18 20:30:24 +00001972 cpu_interrupt(s->c_cpu, CPU_INTERRUPT_EXIT);
pbrooka2d1eba2007-01-28 03:10:55 +00001973#endif
1974}
1975
bellard6a00d602005-11-21 23:25:50 +00001976static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001977{
1978 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001979 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001980
bellard1fddef42005-04-17 19:16:13 +00001981#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001982 if (s->last_packet_len) {
1983 /* Waiting for a response to the last packet. If we see the start
1984 of a new command then abandon the previous response. */
1985 if (ch == '-') {
1986#ifdef DEBUG_GDB
1987 printf("Got NACK, retransmitting\n");
1988#endif
thsffe8ab82007-12-16 03:16:05 +00001989 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001990 }
1991#ifdef DEBUG_GDB
1992 else if (ch == '+')
1993 printf("Got ACK\n");
1994 else
1995 printf("Got '%c' when expecting ACK/NACK\n", ch);
1996#endif
1997 if (ch == '+' || ch == '$')
1998 s->last_packet_len = 0;
1999 if (ch != '$')
2000 return;
2001 }
bellard858693c2004-03-31 18:52:07 +00002002 if (vm_running) {
2003 /* when the CPU is running, we cannot do anything except stop
2004 it when receiving a char */
2005 vm_stop(EXCP_INTERRUPT);
ths5fafdf22007-09-16 21:08:06 +00002006 } else
bellard1fddef42005-04-17 19:16:13 +00002007#endif
bellard41625032005-04-24 10:07:11 +00002008 {
bellard858693c2004-03-31 18:52:07 +00002009 switch(s->state) {
2010 case RS_IDLE:
2011 if (ch == '$') {
2012 s->line_buf_index = 0;
2013 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002014 }
2015 break;
bellard858693c2004-03-31 18:52:07 +00002016 case RS_GETLINE:
2017 if (ch == '#') {
2018 s->state = RS_CHKSUM1;
2019 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2020 s->state = RS_IDLE;
2021 } else {
2022 s->line_buf[s->line_buf_index++] = ch;
2023 }
2024 break;
2025 case RS_CHKSUM1:
2026 s->line_buf[s->line_buf_index] = '\0';
2027 s->line_csum = fromhex(ch) << 4;
2028 s->state = RS_CHKSUM2;
2029 break;
2030 case RS_CHKSUM2:
2031 s->line_csum |= fromhex(ch);
2032 csum = 0;
2033 for(i = 0; i < s->line_buf_index; i++) {
2034 csum += s->line_buf[i];
2035 }
2036 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002037 reply = '-';
2038 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002039 s->state = RS_IDLE;
2040 } else {
ths60fe76f2007-12-16 03:02:09 +00002041 reply = '+';
2042 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002043 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002044 }
bellardb4608c02003-06-27 17:34:32 +00002045 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002046 default:
2047 abort();
bellardb4608c02003-06-27 17:34:32 +00002048 }
2049 }
bellard858693c2004-03-31 18:52:07 +00002050}
2051
bellard1fddef42005-04-17 19:16:13 +00002052#ifdef CONFIG_USER_ONLY
2053int
aurel32ca587a82008-12-18 22:44:13 +00002054gdb_queuesig (void)
2055{
2056 GDBState *s;
2057
2058 s = gdbserver_state;
2059
2060 if (gdbserver_fd < 0 || s->fd < 0)
2061 return 0;
2062 else
2063 return 1;
2064}
2065
2066int
bellard1fddef42005-04-17 19:16:13 +00002067gdb_handlesig (CPUState *env, int sig)
2068{
2069 GDBState *s;
2070 char buf[256];
2071 int n;
2072
aliguori880a7572008-11-18 20:30:24 +00002073 s = gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00002074 if (gdbserver_fd < 0 || s->fd < 0)
2075 return sig;
bellard1fddef42005-04-17 19:16:13 +00002076
2077 /* disable single step if it was enabled */
2078 cpu_single_step(env, 0);
2079 tb_flush(env);
2080
2081 if (sig != 0)
2082 {
aurel32ca587a82008-12-18 22:44:13 +00002083 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb (sig));
bellard1fddef42005-04-17 19:16:13 +00002084 put_packet(s, buf);
2085 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002086 /* put_packet() might have detected that the peer terminated the
2087 connection. */
2088 if (s->fd < 0)
2089 return sig;
bellard1fddef42005-04-17 19:16:13 +00002090
bellard1fddef42005-04-17 19:16:13 +00002091 sig = 0;
2092 s->state = RS_IDLE;
bellard41625032005-04-24 10:07:11 +00002093 s->running_state = 0;
2094 while (s->running_state == 0) {
bellard1fddef42005-04-17 19:16:13 +00002095 n = read (s->fd, buf, 256);
2096 if (n > 0)
2097 {
2098 int i;
2099
2100 for (i = 0; i < n; i++)
bellard6a00d602005-11-21 23:25:50 +00002101 gdb_read_byte (s, buf[i]);
bellard1fddef42005-04-17 19:16:13 +00002102 }
2103 else if (n == 0 || errno != EAGAIN)
2104 {
2105 /* XXX: Connection closed. Should probably wait for annother
2106 connection before continuing. */
2107 return sig;
2108 }
bellard41625032005-04-24 10:07:11 +00002109 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002110 sig = s->signal;
2111 s->signal = 0;
bellard1fddef42005-04-17 19:16:13 +00002112 return sig;
2113}
bellarde9009672005-04-26 20:42:36 +00002114
2115/* Tell the remote gdb that the process has exited. */
2116void gdb_exit(CPUState *env, int code)
2117{
2118 GDBState *s;
2119 char buf[4];
2120
aliguori880a7572008-11-18 20:30:24 +00002121 s = gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00002122 if (gdbserver_fd < 0 || s->fd < 0)
2123 return;
bellarde9009672005-04-26 20:42:36 +00002124
2125 snprintf(buf, sizeof(buf), "W%02x", code);
2126 put_packet(s, buf);
2127}
2128
aurel32ca587a82008-12-18 22:44:13 +00002129/* Tell the remote gdb that the process has exited due to SIG. */
2130void gdb_signalled(CPUState *env, int sig)
2131{
2132 GDBState *s;
2133 char buf[4];
2134
2135 s = gdbserver_state;
2136 if (gdbserver_fd < 0 || s->fd < 0)
2137 return;
2138
2139 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb (sig));
2140 put_packet(s, buf);
2141}
bellard1fddef42005-04-17 19:16:13 +00002142
aliguori880a7572008-11-18 20:30:24 +00002143static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002144{
2145 GDBState *s;
2146 struct sockaddr_in sockaddr;
2147 socklen_t len;
2148 int val, fd;
2149
2150 for(;;) {
2151 len = sizeof(sockaddr);
2152 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2153 if (fd < 0 && errno != EINTR) {
2154 perror("accept");
2155 return;
2156 } else if (fd >= 0) {
2157 break;
2158 }
2159 }
2160
2161 /* set short latency */
2162 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00002163 setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
ths3b46e622007-09-17 08:09:54 +00002164
aliguori880a7572008-11-18 20:30:24 +00002165 s = qemu_mallocz(sizeof(GDBState));
2166 if (!s) {
2167 errno = ENOMEM;
2168 perror("accept");
2169 return;
2170 }
2171
bellard1fddef42005-04-17 19:16:13 +00002172 memset (s, 0, sizeof (GDBState));
aliguori880a7572008-11-18 20:30:24 +00002173 s->c_cpu = first_cpu;
2174 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002175 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002176 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002177
aliguori880a7572008-11-18 20:30:24 +00002178 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002179
bellard858693c2004-03-31 18:52:07 +00002180 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002181}
2182
2183static int gdbserver_open(int port)
2184{
2185 struct sockaddr_in sockaddr;
2186 int fd, val, ret;
2187
2188 fd = socket(PF_INET, SOCK_STREAM, 0);
2189 if (fd < 0) {
2190 perror("socket");
2191 return -1;
2192 }
2193
2194 /* allow fast reuse */
2195 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00002196 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002197
2198 sockaddr.sin_family = AF_INET;
2199 sockaddr.sin_port = htons(port);
2200 sockaddr.sin_addr.s_addr = 0;
2201 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2202 if (ret < 0) {
2203 perror("bind");
2204 return -1;
2205 }
2206 ret = listen(fd, 0);
2207 if (ret < 0) {
2208 perror("listen");
2209 return -1;
2210 }
bellard858693c2004-03-31 18:52:07 +00002211 return fd;
2212}
2213
2214int gdbserver_start(int port)
2215{
2216 gdbserver_fd = gdbserver_open(port);
2217 if (gdbserver_fd < 0)
2218 return -1;
2219 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002220 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002221 return 0;
2222}
aurel322b1319c2008-12-18 22:44:04 +00002223
2224/* Disable gdb stub for child processes. */
2225void gdbserver_fork(CPUState *env)
2226{
2227 GDBState *s = gdbserver_state;
2228 if (s->fd < 0)
2229 return;
2230 close(s->fd);
2231 s->fd = -1;
2232 cpu_breakpoint_remove_all(env, BP_GDB);
2233 cpu_watchpoint_remove_all(env, BP_GDB);
2234}
pbrook4046d912007-01-28 01:53:16 +00002235#else
thsaa1f17c2007-07-11 22:48:58 +00002236static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002237{
pbrook56aebc82008-10-11 17:55:29 +00002238 /* We can handle an arbitrarily large amount of data.
2239 Pick the maximum packet size, which is as good as anything. */
2240 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002241}
2242
thsaa1f17c2007-07-11 22:48:58 +00002243static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002244{
pbrook4046d912007-01-28 01:53:16 +00002245 int i;
2246
2247 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002248 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002249 }
2250}
2251
2252static void gdb_chr_event(void *opaque, int event)
2253{
2254 switch (event) {
2255 case CHR_EVENT_RESET:
2256 vm_stop(EXCP_INTERRUPT);
pbrook56aebc82008-10-11 17:55:29 +00002257 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002258 break;
2259 default:
2260 break;
2261 }
2262}
2263
pbrookcfc34752007-02-22 01:48:01 +00002264int gdbserver_start(const char *port)
pbrook4046d912007-01-28 01:53:16 +00002265{
2266 GDBState *s;
pbrookcfc34752007-02-22 01:48:01 +00002267 char gdbstub_port_name[128];
2268 int port_num;
2269 char *p;
2270 CharDriverState *chr;
pbrook4046d912007-01-28 01:53:16 +00002271
pbrookcfc34752007-02-22 01:48:01 +00002272 if (!port || !*port)
2273 return -1;
2274
2275 port_num = strtol(port, &p, 10);
2276 if (*p == 0) {
2277 /* A numeric value is interpreted as a port number. */
2278 snprintf(gdbstub_port_name, sizeof(gdbstub_port_name),
2279 "tcp::%d,nowait,nodelay,server", port_num);
2280 port = gdbstub_port_name;
2281 }
2282
aliguori5ccfae12008-10-31 17:31:29 +00002283 chr = qemu_chr_open("gdb", port);
pbrook4046d912007-01-28 01:53:16 +00002284 if (!chr)
2285 return -1;
2286
2287 s = qemu_mallocz(sizeof(GDBState));
2288 if (!s) {
2289 return -1;
2290 }
aliguori880a7572008-11-18 20:30:24 +00002291 s->c_cpu = first_cpu;
2292 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002293 s->chr = chr;
aliguori880a7572008-11-18 20:30:24 +00002294 gdbserver_state = s;
thsaa1f17c2007-07-11 22:48:58 +00002295 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
aliguori880a7572008-11-18 20:30:24 +00002296 gdb_chr_event, NULL);
2297 qemu_add_vm_stop_handler(gdb_vm_stopped, NULL);
pbrook4046d912007-01-28 01:53:16 +00002298 return 0;
2299}
2300#endif