blob: 15a0af2caeba7038279d5c235b67036a6c97cd17 [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
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
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"
41#ifdef _WIN32
42/* XXX: these constants may be independent of the host ones even for Unix */
43#ifndef SIGTRAP
44#define SIGTRAP 5
45#endif
46#ifndef SIGINT
47#define SIGINT 2
48#endif
49#else
bellardb4608c02003-06-27 17:34:32 +000050#include <signal.h>
bellard8f447cc2006-06-14 15:21:14 +000051#endif
bellardb4608c02003-06-27 17:34:32 +000052
bellard4abe6152003-07-26 18:01:58 +000053//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +000054
pbrook56aebc82008-10-11 17:55:29 +000055typedef struct GDBRegisterState {
56 int base_reg;
57 int num_regs;
58 gdb_reg_cb get_reg;
59 gdb_reg_cb set_reg;
60 const char *xml;
61 struct GDBRegisterState *next;
62} GDBRegisterState;
63
bellard858693c2004-03-31 18:52:07 +000064enum RSState {
65 RS_IDLE,
66 RS_GETLINE,
67 RS_CHKSUM1,
68 RS_CHKSUM2,
pbrooka2d1eba2007-01-28 03:10:55 +000069 RS_SYSCALL,
bellard858693c2004-03-31 18:52:07 +000070};
bellard858693c2004-03-31 18:52:07 +000071typedef struct GDBState {
bellard6a00d602005-11-21 23:25:50 +000072 CPUState *env; /* current CPU */
bellard41625032005-04-24 10:07:11 +000073 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +000074 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +000075 int line_buf_index;
76 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +000077 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +000078 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +000079 int signal;
bellard41625032005-04-24 10:07:11 +000080#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +000081 int fd;
bellard41625032005-04-24 10:07:11 +000082 int running_state;
pbrook4046d912007-01-28 01:53:16 +000083#else
84 CharDriverState *chr;
bellard41625032005-04-24 10:07:11 +000085#endif
bellard858693c2004-03-31 18:52:07 +000086} GDBState;
bellardb4608c02003-06-27 17:34:32 +000087
edgar_igl60897d32008-05-09 08:25:14 +000088/* By default use no IRQs and no timers while single stepping so as to
89 * make single stepping like an ICE HW step.
90 */
91static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
92
pbrook56aebc82008-10-11 17:55:29 +000093/* This is an ugly hack to cope with both new and old gdb.
94 If gdb sends qXfer:features:read then assume we're talking to a newish
95 gdb that understands target descriptions. */
96static int gdb_has_xml;
97
bellard1fddef42005-04-17 19:16:13 +000098#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +000099/* XXX: This is not thread safe. Do we care? */
100static int gdbserver_fd = -1;
101
bellard1fddef42005-04-17 19:16:13 +0000102/* XXX: remove this hack. */
103static GDBState gdbserver_state;
bellard1fddef42005-04-17 19:16:13 +0000104
bellard858693c2004-03-31 18:52:07 +0000105static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000106{
107 uint8_t ch;
108 int ret;
109
110 for(;;) {
bellard8f447cc2006-06-14 15:21:14 +0000111 ret = recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000112 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000113 if (errno == ECONNRESET)
114 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000115 if (errno != EINTR && errno != EAGAIN)
116 return -1;
117 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000118 close(s->fd);
119 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000120 return -1;
121 } else {
122 break;
123 }
124 }
125 return ch;
126}
pbrook4046d912007-01-28 01:53:16 +0000127#endif
bellardb4608c02003-06-27 17:34:32 +0000128
pbrooka2d1eba2007-01-28 03:10:55 +0000129/* GDB stub state for use by semihosting syscalls. */
130static GDBState *gdb_syscall_state;
131static gdb_syscall_complete_cb gdb_current_syscall_cb;
132
133enum {
134 GDB_SYS_UNKNOWN,
135 GDB_SYS_ENABLED,
136 GDB_SYS_DISABLED,
137} gdb_syscall_mode;
138
139/* If gdb is connected when the first semihosting syscall occurs then use
140 remote gdb syscalls. Otherwise use native file IO. */
141int use_gdb_syscalls(void)
142{
143 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
144 gdb_syscall_mode = (gdb_syscall_state ? GDB_SYS_ENABLED
145 : GDB_SYS_DISABLED);
146 }
147 return gdb_syscall_mode == GDB_SYS_ENABLED;
148}
149
edgar_iglba70a622008-03-14 06:10:42 +0000150/* Resume execution. */
151static inline void gdb_continue(GDBState *s)
152{
153#ifdef CONFIG_USER_ONLY
154 s->running_state = 1;
155#else
156 vm_start();
157#endif
158}
159
bellard858693c2004-03-31 18:52:07 +0000160static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000161{
pbrook4046d912007-01-28 01:53:16 +0000162#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000163 int ret;
164
165 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000166 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000167 if (ret < 0) {
168 if (errno != EINTR && errno != EAGAIN)
169 return;
170 } else {
171 buf += ret;
172 len -= ret;
173 }
174 }
pbrook4046d912007-01-28 01:53:16 +0000175#else
176 qemu_chr_write(s->chr, buf, len);
177#endif
bellardb4608c02003-06-27 17:34:32 +0000178}
179
180static inline int fromhex(int v)
181{
182 if (v >= '0' && v <= '9')
183 return v - '0';
184 else if (v >= 'A' && v <= 'F')
185 return v - 'A' + 10;
186 else if (v >= 'a' && v <= 'f')
187 return v - 'a' + 10;
188 else
189 return 0;
190}
191
192static inline int tohex(int v)
193{
194 if (v < 10)
195 return v + '0';
196 else
197 return v - 10 + 'a';
198}
199
200static void memtohex(char *buf, const uint8_t *mem, int len)
201{
202 int i, c;
203 char *q;
204 q = buf;
205 for(i = 0; i < len; i++) {
206 c = mem[i];
207 *q++ = tohex(c >> 4);
208 *q++ = tohex(c & 0xf);
209 }
210 *q = '\0';
211}
212
213static void hextomem(uint8_t *mem, const char *buf, int len)
214{
215 int i;
216
217 for(i = 0; i < len; i++) {
218 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
219 buf += 2;
220 }
221}
222
bellardb4608c02003-06-27 17:34:32 +0000223/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000224static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000225{
pbrook56aebc82008-10-11 17:55:29 +0000226 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000227 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000228
bellardb4608c02003-06-27 17:34:32 +0000229 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000230 p = s->last_packet;
231 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000232 memcpy(p, buf, len);
233 p += len;
bellardb4608c02003-06-27 17:34:32 +0000234 csum = 0;
235 for(i = 0; i < len; i++) {
236 csum += buf[i];
237 }
pbrook4046d912007-01-28 01:53:16 +0000238 *(p++) = '#';
239 *(p++) = tohex((csum >> 4) & 0xf);
240 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000241
pbrook4046d912007-01-28 01:53:16 +0000242 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000243 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000244
pbrook4046d912007-01-28 01:53:16 +0000245#ifdef CONFIG_USER_ONLY
246 i = get_char(s);
247 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000248 return -1;
pbrook4046d912007-01-28 01:53:16 +0000249 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000250 break;
pbrook4046d912007-01-28 01:53:16 +0000251#else
252 break;
253#endif
bellardb4608c02003-06-27 17:34:32 +0000254 }
255 return 0;
256}
257
pbrook56aebc82008-10-11 17:55:29 +0000258/* return -1 if error, 0 if OK */
259static int put_packet(GDBState *s, const char *buf)
260{
261#ifdef DEBUG_GDB
262 printf("reply='%s'\n", buf);
263#endif
264
265 return put_packet_binary(s, buf, strlen(buf));
266}
267
268/* The GDB remote protocol transfers values in target byte order. This means
269 we can use the raw memory access routines to access the value buffer.
270 Conveniently, these also handle the case where the buffer is mis-aligned.
271 */
272#define GET_REG8(val) do { \
273 stb_p(mem_buf, val); \
274 return 1; \
275 } while(0)
276#define GET_REG16(val) do { \
277 stw_p(mem_buf, val); \
278 return 2; \
279 } while(0)
280#define GET_REG32(val) do { \
281 stl_p(mem_buf, val); \
282 return 4; \
283 } while(0)
284#define GET_REG64(val) do { \
285 stq_p(mem_buf, val); \
286 return 8; \
287 } while(0)
288
289#if TARGET_LONG_BITS == 64
290#define GET_REGL(val) GET_REG64(val)
291#define ldtul_p(addr) ldq_p(addr)
292#else
293#define GET_REGL(val) GET_REG32(val)
294#define ldtul_p(addr) ldl_p(addr)
295#endif
296
edgar_iglfde3fd62008-05-09 08:50:01 +0000297#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000298
299#ifdef TARGET_X86_64
pbrook56aebc82008-10-11 17:55:29 +0000300static const int gpr_map[16] = {
bellard79808572008-05-09 14:40:22 +0000301 R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
pbrook56aebc82008-10-11 17:55:29 +0000302 8, 9, 10, 11, 12, 13, 14, 15
bellard79808572008-05-09 14:40:22 +0000303};
bellard79808572008-05-09 14:40:22 +0000304#else
pbrook56aebc82008-10-11 17:55:29 +0000305static const int gpr_map[8] = {0, 1, 2, 3, 4, 5, 6, 7};
bellard79808572008-05-09 14:40:22 +0000306#endif
pbrook56aebc82008-10-11 17:55:29 +0000307
308#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
309
310static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
311{
312 if (n < CPU_NB_REGS) {
313 GET_REGL(env->regs[gpr_map[n]]);
314 } else if (n >= CPU_NB_REGS + 8 && n < CPU_NB_REGS + 16) {
315 /* FIXME: byteswap float values. */
316#ifdef USE_X86LDOUBLE
317 memcpy(mem_buf, &env->fpregs[n - (CPU_NB_REGS + 8)], 10);
318#else
319 memset(mem_buf, 0, 10);
320#endif
321 return 10;
322 } else if (n >= CPU_NB_REGS + 24) {
323 n -= CPU_NB_REGS + 24;
324 if (n < CPU_NB_REGS) {
325 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
326 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
327 return 16;
328 } else if (n == CPU_NB_REGS) {
329 GET_REG32(env->mxcsr);
330 }
331 } else {
332 n -= CPU_NB_REGS;
333 switch (n) {
334 case 0: GET_REGL(env->eip);
335 case 1: GET_REG32(env->eflags);
336 case 2: GET_REG32(env->segs[R_CS].selector);
337 case 3: GET_REG32(env->segs[R_SS].selector);
338 case 4: GET_REG32(env->segs[R_DS].selector);
339 case 5: GET_REG32(env->segs[R_ES].selector);
340 case 6: GET_REG32(env->segs[R_FS].selector);
341 case 7: GET_REG32(env->segs[R_GS].selector);
342 /* 8...15 x87 regs. */
343 case 16: GET_REG32(env->fpuc);
344 case 17: GET_REG32((env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11);
345 case 18: GET_REG32(0); /* ftag */
346 case 19: GET_REG32(0); /* fiseg */
347 case 20: GET_REG32(0); /* fioff */
348 case 21: GET_REG32(0); /* foseg */
349 case 22: GET_REG32(0); /* fooff */
350 case 23: GET_REG32(0); /* fop */
351 /* 24+ xmm regs. */
352 }
bellard79808572008-05-09 14:40:22 +0000353 }
pbrook56aebc82008-10-11 17:55:29 +0000354 return 0;
bellard79808572008-05-09 14:40:22 +0000355}
356
pbrook56aebc82008-10-11 17:55:29 +0000357static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int i)
bellard79808572008-05-09 14:40:22 +0000358{
pbrook56aebc82008-10-11 17:55:29 +0000359 uint32_t tmp;
360
361 if (i < CPU_NB_REGS) {
362 env->regs[gpr_map[i]] = ldtul_p(mem_buf);
363 return sizeof(target_ulong);
364 } else if (i >= CPU_NB_REGS + 8 && i < CPU_NB_REGS + 16) {
365 i -= CPU_NB_REGS + 8;
366#ifdef USE_X86LDOUBLE
367 memcpy(&env->fpregs[i], mem_buf, 10);
368#endif
369 return 10;
370 } else if (i >= CPU_NB_REGS + 24) {
371 i -= CPU_NB_REGS + 24;
372 if (i < CPU_NB_REGS) {
373 env->xmm_regs[i].XMM_Q(0) = ldq_p(mem_buf);
374 env->xmm_regs[i].XMM_Q(1) = ldq_p(mem_buf + 8);
375 return 16;
376 } else if (i == CPU_NB_REGS) {
377 env->mxcsr = ldl_p(mem_buf);
378 return 4;
379 }
380 } else {
381 i -= CPU_NB_REGS;
382 switch (i) {
383 case 0: env->eip = ldtul_p(mem_buf); return sizeof(target_ulong);
384 case 1: env->eflags = ldl_p(mem_buf); return 4;
bellard79808572008-05-09 14:40:22 +0000385#if defined(CONFIG_USER_ONLY)
pbrook56aebc82008-10-11 17:55:29 +0000386#define LOAD_SEG(index, sreg)\
387 tmp = ldl_p(mem_buf);\
388 if (tmp != env->segs[sreg].selector)\
389 cpu_x86_load_seg(env, sreg, tmp);
bellard79808572008-05-09 14:40:22 +0000390#else
pbrook56aebc82008-10-11 17:55:29 +0000391/* FIXME: Honor segment registers. Needs to avoid raising an exception
392 when the selector is invalid. */
393#define LOAD_SEG(index, sreg) do {} while(0)
bellard79808572008-05-09 14:40:22 +0000394#endif
pbrook56aebc82008-10-11 17:55:29 +0000395 case 2: LOAD_SEG(10, R_CS); return 4;
396 case 3: LOAD_SEG(11, R_SS); return 4;
397 case 4: LOAD_SEG(12, R_DS); return 4;
398 case 5: LOAD_SEG(13, R_ES); return 4;
399 case 6: LOAD_SEG(14, R_FS); return 4;
400 case 7: LOAD_SEG(15, R_GS); return 4;
401 /* 8...15 x87 regs. */
402 case 16: env->fpuc = ldl_p(mem_buf); return 4;
403 case 17:
404 tmp = ldl_p(mem_buf);
405 env->fpstt = (tmp >> 11) & 7;
406 env->fpus = tmp & ~0x3800;
407 return 4;
408 case 18: /* ftag */ return 4;
409 case 19: /* fiseg */ return 4;
410 case 20: /* fioff */ return 4;
411 case 21: /* foseg */ return 4;
412 case 22: /* fooff */ return 4;
413 case 23: /* fop */ return 4;
414 /* 24+ xmm regs. */
bellard79808572008-05-09 14:40:22 +0000415 }
bellard79808572008-05-09 14:40:22 +0000416 }
pbrook56aebc82008-10-11 17:55:29 +0000417 /* Unrecognised register. */
418 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000419}
420
bellard9e62fd72004-01-05 22:49:06 +0000421#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000422
423#define NUM_CORE_REGS 71
424
425static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000426{
pbrook56aebc82008-10-11 17:55:29 +0000427 if (n < 32) {
428 /* gprs */
429 GET_REGL(env->gpr[n]);
430 } else if (n < 64) {
431 /* fprs */
432 stfq_p(mem_buf, env->fpr[n]);
433 return 8;
434 } else {
435 switch (n) {
436 case 64: GET_REGL(env->nip);
437 case 65: GET_REGL(env->msr);
438 case 66:
439 {
440 uint32_t cr = 0;
441 int i;
442 for (i = 0; i < 8; i++)
443 cr |= env->crf[i] << (32 - ((i + 1) * 4));
444 GET_REG32(cr);
445 }
446 case 67: GET_REGL(env->lr);
447 case 68: GET_REGL(env->ctr);
448 case 69: GET_REG32(ppc_load_xer(env));
449 case 70: GET_REG32(0); /* fpscr */
450 }
bellard9e62fd72004-01-05 22:49:06 +0000451 }
pbrook56aebc82008-10-11 17:55:29 +0000452 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000453}
454
pbrook56aebc82008-10-11 17:55:29 +0000455static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000456{
pbrook56aebc82008-10-11 17:55:29 +0000457 if (n < 32) {
458 /* gprs */
459 env->gpr[n] = ldtul_p(mem_buf);
460 return sizeof(target_ulong);
461 } else if (n < 64) {
462 /* fprs */
463 env->fpr[n] = ldfq_p(mem_buf);
464 return 8;
465 } else {
466 switch (n) {
467 case 64:
468 env->nip = ldtul_p(mem_buf);
469 return sizeof(target_ulong);
470 case 65:
471 ppc_store_msr(env, ldtul_p(mem_buf));
472 return sizeof(target_ulong);
473 case 66:
474 {
475 uint32_t cr = ldl_p(mem_buf);
476 int i;
477 for (i = 0; i < 8; i++)
478 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
479 return 4;
480 }
481 case 67:
482 env->lr = ldtul_p(mem_buf);
483 return sizeof(target_ulong);
484 case 68:
485 env->ctr = ldtul_p(mem_buf);
486 return sizeof(target_ulong);
487 case 69:
488 ppc_store_xer(env, ldl_p(mem_buf));
489 return 4;
490 case 70:
491 /* fpscr */
492 return 4;
493 }
bellard9e62fd72004-01-05 22:49:06 +0000494 }
pbrook56aebc82008-10-11 17:55:29 +0000495 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000496}
pbrook56aebc82008-10-11 17:55:29 +0000497
bellarde95c8d52004-09-30 22:22:08 +0000498#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000499
pbrook56aebc82008-10-11 17:55:29 +0000500#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
501#define NUM_CORE_REGS 86
502#else
503#define NUM_CORE_REGS 73
504#endif
505
506#ifdef TARGET_ABI32
507#define GET_REGA(val) GET_REG32(val)
508#else
509#define GET_REGA(val) GET_REGL(val)
510#endif
511
512static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
513{
514 if (n < 8) {
515 /* g0..g7 */
516 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000517 }
pbrook56aebc82008-10-11 17:55:29 +0000518 if (n < 32) {
519 /* register window */
520 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000521 }
pbrook56aebc82008-10-11 17:55:29 +0000522#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
523 if (n < 64) {
524 /* fprs */
525 GET_REG32(*((uint32_t *)&env->fpr[n - 32]));
bellarde95c8d52004-09-30 22:22:08 +0000526 }
527 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000528 switch (n) {
529 case 64: GET_REGA(env->y);
530 case 65: GET_REGA(GET_PSR(env));
531 case 66: GET_REGA(env->wim);
532 case 67: GET_REGA(env->tbr);
533 case 68: GET_REGA(env->pc);
534 case 69: GET_REGA(env->npc);
535 case 70: GET_REGA(env->fsr);
536 case 71: GET_REGA(0); /* csr */
537 case 72: GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000538 }
bellard34751872005-07-02 14:31:34 +0000539#else
pbrook56aebc82008-10-11 17:55:29 +0000540 if (n < 64) {
541 /* f0-f31 */
542 GET_REG32(*((uint32_t *)&env->fpr[n - 32]));
bellard34751872005-07-02 14:31:34 +0000543 }
pbrook56aebc82008-10-11 17:55:29 +0000544 if (n < 80) {
545 /* f32-f62 (double width, even numbers only) */
546 uint64_t val;
547
548 val = (uint64_t)*((uint32_t *)&env->fpr[(n - 64) * 2 + 32]) << 32;
549 val |= *((uint32_t *)&env->fpr[(n - 64) * 2 + 33]);
550 GET_REG64(val);
551 }
552 switch (n) {
553 case 80: GET_REGL(env->pc);
554 case 81: GET_REGL(env->npc);
555 case 82: GET_REGL(((uint64_t)GET_CCR(env) << 32) |
blueswir117d996e2007-07-07 20:53:22 +0000556 ((env->asi & 0xff) << 24) |
557 ((env->pstate & 0xfff) << 8) |
558 GET_CWP64(env));
pbrook56aebc82008-10-11 17:55:29 +0000559 case 83: GET_REGL(env->fsr);
560 case 84: GET_REGL(env->fprs);
561 case 85: GET_REGL(env->y);
562 }
bellard34751872005-07-02 14:31:34 +0000563#endif
pbrook56aebc82008-10-11 17:55:29 +0000564 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000565}
566
pbrook56aebc82008-10-11 17:55:29 +0000567static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000568{
pbrook56aebc82008-10-11 17:55:29 +0000569#if defined(TARGET_ABI32)
570 abi_ulong tmp;
571
572 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000573#else
pbrook56aebc82008-10-11 17:55:29 +0000574 target_ulong tmp;
575
576 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000577#endif
bellarde95c8d52004-09-30 22:22:08 +0000578
pbrook56aebc82008-10-11 17:55:29 +0000579 if (n < 8) {
580 /* g0..g7 */
581 env->gregs[n] = tmp;
582 } else if (n < 32) {
583 /* register window */
584 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000585 }
pbrook56aebc82008-10-11 17:55:29 +0000586#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
587 else if (n < 64) {
588 /* fprs */
589 *((uint32_t *)&env->fpr[n - 32]) = tmp;
590 } else {
591 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
592 switch (n) {
593 case 64: env->y = tmp; break;
594 case 65: PUT_PSR(env, tmp); break;
595 case 66: env->wim = tmp; break;
596 case 67: env->tbr = tmp; break;
597 case 68: env->pc = tmp; break;
598 case 69: env->npc = tmp; break;
599 case 70: env->fsr = tmp; break;
600 default: return 0;
601 }
bellarde95c8d52004-09-30 22:22:08 +0000602 }
pbrook56aebc82008-10-11 17:55:29 +0000603 return 4;
bellard34751872005-07-02 14:31:34 +0000604#else
pbrook56aebc82008-10-11 17:55:29 +0000605 else if (n < 64) {
606 /* f0-f31 */
607 uint32_t fpr;
blueswir189795962007-04-14 16:15:48 +0000608
pbrook56aebc82008-10-11 17:55:29 +0000609 env->fpr[n] = ldfl_p(mem_buf);
610 return 4;
611 } else if (n < 80) {
612 /* f32-f62 (double width, even numbers only) */
613 *((uint32_t *)&env->fpr[(n - 64) * 2 + 32]) = tmp >> 32;
614 *((uint32_t *)&env->fpr[(n - 64) * 2 + 33]) = tmp;
615 } else {
616 switch (n) {
617 case 80: env->pc = tmp; break;
618 case 81: env->npc = tmp; break;
619 case 82:
620 PUT_CCR(env, tmp >> 32);
621 env->asi = (tmp >> 24) & 0xff;
622 env->pstate = (tmp >> 8) & 0xfff;
623 PUT_CWP64(env, tmp & 0xff);
624 break;
625 case 83: env->fsr = tmp; break;
626 case 84: env->fprs = tmp; break;
627 case 85: env->y = tmp; break;
628 default: return 0;
629 }
bellard34751872005-07-02 14:31:34 +0000630 }
pbrook56aebc82008-10-11 17:55:29 +0000631 return 8;
bellard34751872005-07-02 14:31:34 +0000632#endif
bellard9e62fd72004-01-05 22:49:06 +0000633}
bellard1fddef42005-04-17 19:16:13 +0000634#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000635
636/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
637 whatever the target description contains. Due to a historical mishap
638 the FPA registers appear in between core integer regs and the CPSR.
639 We hack round this by giving the FPA regs zero size when talking to a
640 newer gdb. */
641#define NUM_CORE_REGS 26
642#define GDB_CORE_XML "arm-core.xml"
643
644static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000645{
pbrook56aebc82008-10-11 17:55:29 +0000646 if (n < 16) {
647 /* Core integer register. */
648 GET_REG32(env->regs[n]);
649 }
650 if (n < 24) {
651 /* FPA registers. */
652 if (gdb_has_xml)
653 return 0;
654 memset(mem_buf, 0, 12);
655 return 12;
656 }
657 switch (n) {
658 case 24:
659 /* FPA status register. */
660 if (gdb_has_xml)
661 return 0;
662 GET_REG32(0);
663 case 25:
664 /* CPSR */
665 GET_REG32(cpsr_read(env));
666 }
667 /* Unknown register. */
668 return 0;
bellard1fddef42005-04-17 19:16:13 +0000669}
670
pbrook56aebc82008-10-11 17:55:29 +0000671static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000672{
pbrook56aebc82008-10-11 17:55:29 +0000673 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000674
pbrook56aebc82008-10-11 17:55:29 +0000675 tmp = ldl_p(mem_buf);
676
677 /* Mask out low bit of PC to workaround gdb bugs. This will probably
678 cause problems if we ever implement the Jazelle DBX extensions. */
679 if (n == 15)
680 tmp &= ~1;
681
682 if (n < 16) {
683 /* Core integer register. */
684 env->regs[n] = tmp;
685 return 4;
686 }
687 if (n < 24) { /* 16-23 */
688 /* FPA registers (ignored). */
689 if (gdb_has_xml)
690 return 0;
691 return 12;
692 }
693 switch (n) {
694 case 24:
695 /* FPA status register (ignored). */
696 if (gdb_has_xml)
697 return 0;
698 return 4;
699 case 25:
700 /* CPSR */
701 cpsr_write (env, tmp, 0xffffffff);
702 return 4;
703 }
704 /* Unknown register. */
705 return 0;
bellard1fddef42005-04-17 19:16:13 +0000706}
pbrook56aebc82008-10-11 17:55:29 +0000707
pbrooke6e59062006-10-22 00:18:54 +0000708#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +0000709
710#define NUM_CORE_REGS 18
711
712#define GDB_CORE_XML "cf-core.xml"
713
714static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000715{
pbrook56aebc82008-10-11 17:55:29 +0000716 if (n < 8) {
717 /* D0-D7 */
718 GET_REG32(env->dregs[n]);
719 } else if (n < 16) {
720 /* A0-A7 */
721 GET_REG32(env->aregs[n - 8]);
722 } else {
723 switch (n) {
724 case 16: GET_REG32(env->sr);
725 case 17: GET_REG32(env->pc);
726 }
pbrooke6e59062006-10-22 00:18:54 +0000727 }
pbrook56aebc82008-10-11 17:55:29 +0000728 /* FP registers not included here because they vary between
729 ColdFire and m68k. Use XML bits for these. */
730 return 0;
pbrooke6e59062006-10-22 00:18:54 +0000731}
732
pbrook56aebc82008-10-11 17:55:29 +0000733static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000734{
pbrook56aebc82008-10-11 17:55:29 +0000735 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +0000736
pbrook56aebc82008-10-11 17:55:29 +0000737 tmp = ldl_p(mem_buf);
738
739 if (n < 8) {
740 /* D0-D7 */
741 env->dregs[n] = tmp;
742 } else if (n < 8) {
743 /* A0-A7 */
744 env->aregs[n - 8] = tmp;
745 } else {
746 switch (n) {
747 case 16: env->sr = tmp; break;
748 case 17: env->pc = tmp; break;
749 default: return 0;
750 }
pbrooke6e59062006-10-22 00:18:54 +0000751 }
pbrook56aebc82008-10-11 17:55:29 +0000752 return 4;
pbrooke6e59062006-10-22 00:18:54 +0000753}
bellard6f970bd2005-12-05 19:55:19 +0000754#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +0000755
756#define NUM_CORE_REGS 73
757
758static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000759{
pbrook56aebc82008-10-11 17:55:29 +0000760 if (n < 32) {
761 GET_REGL(env->active_tc.gpr[n]);
762 }
763 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
764 if (n >= 38 && n < 70) {
ths7ac256b2007-10-25 21:30:37 +0000765 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +0000766 GET_REGL(env->active_fpu.fpr[n - 38].d);
ths7ac256b2007-10-25 21:30:37 +0000767 else
pbrook56aebc82008-10-11 17:55:29 +0000768 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
769 }
770 switch (n) {
771 case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
772 case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
773 }
774 }
775 switch (n) {
776 case 32: GET_REGL((int32_t)env->CP0_Status);
777 case 33: GET_REGL(env->active_tc.LO[0]);
778 case 34: GET_REGL(env->active_tc.HI[0]);
779 case 35: GET_REGL(env->CP0_BadVAddr);
780 case 36: GET_REGL((int32_t)env->CP0_Cause);
781 case 37: GET_REGL(env->active_tc.PC);
782 case 72: GET_REGL(0); /* fp */
783 case 89: GET_REGL((int32_t)env->CP0_PRid);
784 }
785 if (n >= 73 && n <= 88) {
786 /* 16 embedded regs. */
787 GET_REGL(0);
788 }
ths36d23952007-02-28 22:37:42 +0000789
pbrook56aebc82008-10-11 17:55:29 +0000790 return 0;
bellard6f970bd2005-12-05 19:55:19 +0000791}
792
ths8e33c082006-12-11 19:22:27 +0000793/* convert MIPS rounding mode in FCR31 to IEEE library */
794static unsigned int ieee_rm[] =
795 {
796 float_round_nearest_even,
797 float_round_to_zero,
798 float_round_up,
799 float_round_down
800 };
801#define RESTORE_ROUNDING_MODE \
thsf01be152008-09-18 11:57:27 +0000802 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +0000803
pbrook56aebc82008-10-11 17:55:29 +0000804static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000805{
pbrook56aebc82008-10-11 17:55:29 +0000806 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +0000807
pbrook56aebc82008-10-11 17:55:29 +0000808 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +0000809
pbrook56aebc82008-10-11 17:55:29 +0000810 if (n < 32) {
811 env->active_tc.gpr[n] = tmp;
812 return sizeof(target_ulong);
813 }
814 if (env->CP0_Config1 & (1 << CP0C1_FP)
815 && n >= 38 && n < 73) {
816 if (n < 70) {
ths7ac256b2007-10-25 21:30:37 +0000817 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +0000818 env->active_fpu.fpr[n - 38].d = tmp;
ths7ac256b2007-10-25 21:30:37 +0000819 else
pbrook56aebc82008-10-11 17:55:29 +0000820 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
821 }
822 switch (n) {
823 case 70:
824 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
825 /* set rounding mode */
826 RESTORE_ROUNDING_MODE;
ths8e33c082006-12-11 19:22:27 +0000827#ifndef CONFIG_SOFTFLOAT
pbrook56aebc82008-10-11 17:55:29 +0000828 /* no floating point exception for native float */
829 SET_FP_ENABLE(env->active_fpu.fcr31, 0);
ths8e33c082006-12-11 19:22:27 +0000830#endif
pbrook56aebc82008-10-11 17:55:29 +0000831 break;
832 case 71: env->active_fpu.fcr0 = tmp; break;
833 }
834 return sizeof(target_ulong);
835 }
836 switch (n) {
837 case 32: env->CP0_Status = tmp; break;
838 case 33: env->active_tc.LO[0] = tmp; break;
839 case 34: env->active_tc.HI[0] = tmp; break;
840 case 35: env->CP0_BadVAddr = tmp; break;
841 case 36: env->CP0_Cause = tmp; break;
842 case 37: env->active_tc.PC = tmp; break;
843 case 72: /* fp, ignored */ break;
844 default:
845 if (n > 89)
846 return 0;
847 /* Other registers are readonly. Ignore writes. */
848 break;
849 }
850
851 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +0000852}
bellardfdf9b3e2006-04-27 21:07:38 +0000853#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +0000854
855/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +0000856/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +0000857
pbrook56aebc82008-10-11 17:55:29 +0000858#define NUM_CORE_REGS 59
859
860static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000861{
pbrook56aebc82008-10-11 17:55:29 +0000862 if (n < 8) {
863 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
864 GET_REGL(env->gregs[n + 16]);
865 } else {
866 GET_REGL(env->gregs[n]);
867 }
868 } else if (n < 16) {
869 GET_REGL(env->gregs[n - 8]);
870 } else if (n >= 25 && n < 41) {
871 GET_REGL(env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)]);
872 } else if (n >= 43 && n < 51) {
873 GET_REGL(env->gregs[n - 43]);
874 } else if (n >= 51 && n < 59) {
875 GET_REGL(env->gregs[n - (51 - 16)]);
876 }
877 switch (n) {
878 case 16: GET_REGL(env->pc);
879 case 17: GET_REGL(env->pr);
880 case 18: GET_REGL(env->gbr);
881 case 19: GET_REGL(env->vbr);
882 case 20: GET_REGL(env->mach);
883 case 21: GET_REGL(env->macl);
884 case 22: GET_REGL(env->sr);
885 case 23: GET_REGL(env->fpul);
886 case 24: GET_REGL(env->fpscr);
887 case 41: GET_REGL(env->ssr);
888 case 42: GET_REGL(env->spc);
889 }
bellardfdf9b3e2006-04-27 21:07:38 +0000890
pbrook56aebc82008-10-11 17:55:29 +0000891 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +0000892}
893
pbrook56aebc82008-10-11 17:55:29 +0000894static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +0000895{
pbrook56aebc82008-10-11 17:55:29 +0000896 uint32_t tmp;
bellardfdf9b3e2006-04-27 21:07:38 +0000897
pbrook56aebc82008-10-11 17:55:29 +0000898 tmp = ldl_p(mem_buf);
899
900 if (n < 8) {
901 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
902 env->gregs[n + 16] = tmp;
903 } else {
904 env->gregs[n] = tmp;
905 }
906 return 4;
907 } else if (n < 16) {
908 env->gregs[n - 8] = tmp;
909 return 4;
910 } else if (n >= 25 && n < 41) {
911 env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)] = tmp;
912 } else if (n >= 43 && n < 51) {
913 env->gregs[n - 43] = tmp;
914 return 4;
915 } else if (n >= 51 && n < 59) {
916 env->gregs[n - (51 - 16)] = tmp;
917 return 4;
918 }
919 switch (n) {
920 case 16: env->pc = tmp;
921 case 17: env->pr = tmp;
922 case 18: env->gbr = tmp;
923 case 19: env->vbr = tmp;
924 case 20: env->mach = tmp;
925 case 21: env->macl = tmp;
926 case 22: env->sr = tmp;
927 case 23: env->fpul = tmp;
928 case 24: env->fpscr = tmp;
929 case 41: env->ssr = tmp;
930 case 42: env->spc = tmp;
931 default: return 0;
932 }
933
934 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +0000935}
thsf1ccf902007-10-08 13:16:14 +0000936#elif defined (TARGET_CRIS)
937
pbrook56aebc82008-10-11 17:55:29 +0000938#define NUM_CORE_REGS 49
939
940static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000941{
pbrook56aebc82008-10-11 17:55:29 +0000942 uint8_t srs;
943
944 srs = env->pregs[PR_SRS];
945 if (n < 16) {
946 GET_REG32(env->regs[n]);
947 }
948
949 if (n >= 21 && n < 32) {
950 GET_REG32(env->pregs[n - 16]);
951 }
952 if (n >= 33 && n < 49) {
953 GET_REG32(env->sregs[srs][n - 33]);
954 }
955 switch (n) {
956 case 16: GET_REG8(env->pregs[0]);
957 case 17: GET_REG8(env->pregs[1]);
958 case 18: GET_REG32(env->pregs[2]);
959 case 19: GET_REG8(srs);
960 case 20: GET_REG16(env->pregs[4]);
961 case 32: GET_REG32(env->pc);
962 }
963
964 return 0;
thsf1ccf902007-10-08 13:16:14 +0000965}
966
pbrook56aebc82008-10-11 17:55:29 +0000967static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +0000968{
pbrook56aebc82008-10-11 17:55:29 +0000969 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +0000970
pbrook56aebc82008-10-11 17:55:29 +0000971 if (n > 49)
972 return 0;
thsf1ccf902007-10-08 13:16:14 +0000973
pbrook56aebc82008-10-11 17:55:29 +0000974 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +0000975
pbrook56aebc82008-10-11 17:55:29 +0000976 if (n < 16) {
977 env->regs[n] = tmp;
978 }
thsf1ccf902007-10-08 13:16:14 +0000979
edgar_igld7b69672008-10-11 19:32:21 +0000980 if (n >= 21 && n < 32) {
981 env->pregs[n - 16] = tmp;
982 }
983
984 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +0000985 switch (n) {
986 case 16: return 1;
987 case 17: return 1;
edgar_igld7b69672008-10-11 19:32:21 +0000988 case 18: env->pregs[PR_PID] = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +0000989 case 19: return 1;
990 case 20: return 2;
991 case 32: env->pc = tmp; break;
992 }
thsf1ccf902007-10-08 13:16:14 +0000993
pbrook56aebc82008-10-11 17:55:29 +0000994 return 4;
thsf1ccf902007-10-08 13:16:14 +0000995}
bellard1fddef42005-04-17 19:16:13 +0000996#else
pbrook56aebc82008-10-11 17:55:29 +0000997
998#define NUM_CORE_REGS 0
999
1000static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001001{
1002 return 0;
1003}
1004
pbrook56aebc82008-10-11 17:55:29 +00001005static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001006{
pbrook56aebc82008-10-11 17:55:29 +00001007 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001008}
1009
1010#endif
bellardb4608c02003-06-27 17:34:32 +00001011
pbrook56aebc82008-10-11 17:55:29 +00001012static int num_g_regs = NUM_CORE_REGS;
1013
1014#ifdef GDB_CORE_XML
1015/* Encode data using the encoding for 'x' packets. */
1016static int memtox(char *buf, const char *mem, int len)
1017{
1018 char *p = buf;
1019 char c;
1020
1021 while (len--) {
1022 c = *(mem++);
1023 switch (c) {
1024 case '#': case '$': case '*': case '}':
1025 *(p++) = '}';
1026 *(p++) = c ^ 0x20;
1027 break;
1028 default:
1029 *(p++) = c;
1030 break;
1031 }
1032 }
1033 return p - buf;
1034}
1035
1036const char *get_feature_xml(CPUState *env, const char *p, const char **newp)
1037{
1038 extern const char *const xml_builtin[][2];
1039 size_t len;
1040 int i;
1041 const char *name;
1042 static char target_xml[1024];
1043
1044 len = 0;
1045 while (p[len] && p[len] != ':')
1046 len++;
1047 *newp = p + len;
1048
1049 name = NULL;
1050 if (strncmp(p, "target.xml", len) == 0) {
1051 /* Generate the XML description for this CPU. */
1052 if (!target_xml[0]) {
1053 GDBRegisterState *r;
1054
1055 sprintf(target_xml,
1056 "<?xml version=\"1.0\"?>"
1057 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1058 "<target>"
1059 "<xi:include href=\"%s\"/>",
1060 GDB_CORE_XML);
1061
1062 for (r = env->gdb_regs; r; r = r->next) {
1063 strcat(target_xml, "<xi:include href=\"");
1064 strcat(target_xml, r->xml);
1065 strcat(target_xml, "\"/>");
1066 }
1067 strcat(target_xml, "</target>");
1068 }
1069 return target_xml;
1070 }
1071 for (i = 0; ; i++) {
1072 name = xml_builtin[i][0];
1073 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1074 break;
1075 }
1076 return name ? xml_builtin[i][1] : NULL;
1077}
1078#endif
1079
1080static int gdb_read_register(CPUState *env, uint8_t *mem_buf, int reg)
1081{
1082 GDBRegisterState *r;
1083
1084 if (reg < NUM_CORE_REGS)
1085 return cpu_gdb_read_register(env, mem_buf, reg);
1086
1087 for (r = env->gdb_regs; r; r = r->next) {
1088 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1089 return r->get_reg(env, mem_buf, reg - r->base_reg);
1090 }
1091 }
1092 return 0;
1093}
1094
1095static int gdb_write_register(CPUState *env, uint8_t *mem_buf, int reg)
1096{
1097 GDBRegisterState *r;
1098
1099 if (reg < NUM_CORE_REGS)
1100 return cpu_gdb_write_register(env, mem_buf, reg);
1101
1102 for (r = env->gdb_regs; r; r = r->next) {
1103 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1104 return r->set_reg(env, mem_buf, reg - r->base_reg);
1105 }
1106 }
1107 return 0;
1108}
1109
1110/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1111 specifies the first register number and these registers are included in
1112 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1113 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1114 */
1115
1116void gdb_register_coprocessor(CPUState * env,
1117 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1118 int num_regs, const char *xml, int g_pos)
1119{
1120 GDBRegisterState *s;
1121 GDBRegisterState **p;
1122 static int last_reg = NUM_CORE_REGS;
1123
1124 s = (GDBRegisterState *)qemu_mallocz(sizeof(GDBRegisterState));
1125 s->base_reg = last_reg;
1126 s->num_regs = num_regs;
1127 s->get_reg = get_reg;
1128 s->set_reg = set_reg;
1129 s->xml = xml;
1130 p = &env->gdb_regs;
1131 while (*p) {
1132 /* Check for duplicates. */
1133 if (strcmp((*p)->xml, xml) == 0)
1134 return;
1135 p = &(*p)->next;
1136 }
1137 /* Add to end of list. */
1138 last_reg += num_regs;
1139 *p = s;
1140 if (g_pos) {
1141 if (g_pos != s->base_reg) {
1142 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1143 "Expected %d got %d\n", xml, g_pos, s->base_reg);
1144 } else {
1145 num_g_regs = last_reg;
1146 }
1147 }
1148}
1149
bellard1fddef42005-04-17 19:16:13 +00001150static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001151{
bellardb4608c02003-06-27 17:34:32 +00001152 const char *p;
bellard858693c2004-03-31 18:52:07 +00001153 int ch, reg_size, type;
pbrook56aebc82008-10-11 17:55:29 +00001154 char buf[MAX_PACKET_LENGTH];
1155 uint8_t mem_buf[MAX_PACKET_LENGTH];
1156 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001157 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001158
bellard858693c2004-03-31 18:52:07 +00001159#ifdef DEBUG_GDB
1160 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001161#endif
bellard858693c2004-03-31 18:52:07 +00001162 p = line_buf;
1163 ch = *p++;
1164 switch(ch) {
1165 case '?':
bellard1fddef42005-04-17 19:16:13 +00001166 /* TODO: Make this return the correct value for user-mode. */
bellard858693c2004-03-31 18:52:07 +00001167 snprintf(buf, sizeof(buf), "S%02x", SIGTRAP);
1168 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001169 /* Remove all the breakpoints when this query is issued,
1170 * because gdb is doing and initial connect and the state
1171 * should be cleaned up.
1172 */
1173 cpu_breakpoint_remove_all(env);
1174 cpu_watchpoint_remove_all(env);
bellard858693c2004-03-31 18:52:07 +00001175 break;
1176 case 'c':
1177 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001178 addr = strtoull(p, (char **)&p, 16);
bellardc33a3462003-07-29 20:50:33 +00001179#if defined(TARGET_I386)
bellard858693c2004-03-31 18:52:07 +00001180 env->eip = addr;
bellard5be1a8e2004-01-04 23:51:58 +00001181#elif defined (TARGET_PPC)
bellard858693c2004-03-31 18:52:07 +00001182 env->nip = addr;
bellard8d5f07f2004-10-04 21:23:09 +00001183#elif defined (TARGET_SPARC)
1184 env->pc = addr;
1185 env->npc = addr + 4;
bellardb5ff1b32005-11-26 10:38:39 +00001186#elif defined (TARGET_ARM)
1187 env->regs[15] = addr;
bellardfdf9b3e2006-04-27 21:07:38 +00001188#elif defined (TARGET_SH4)
ths8fac5802007-07-12 10:05:07 +00001189 env->pc = addr;
1190#elif defined (TARGET_MIPS)
thsb5dc7732008-06-27 10:02:35 +00001191 env->active_tc.PC = addr;
thsf1ccf902007-10-08 13:16:14 +00001192#elif defined (TARGET_CRIS)
1193 env->pc = addr;
bellardc33a3462003-07-29 20:50:33 +00001194#endif
bellard858693c2004-03-31 18:52:07 +00001195 }
edgar_iglba70a622008-03-14 06:10:42 +00001196 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001197 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001198 case 'C':
1199 s->signal = strtoul(p, (char **)&p, 16);
1200 gdb_continue(s);
1201 return RS_IDLE;
edgar_igl7d03f822008-05-17 18:58:29 +00001202 case 'k':
1203 /* Kill the target */
1204 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1205 exit(0);
1206 case 'D':
1207 /* Detach packet */
1208 cpu_breakpoint_remove_all(env);
1209 cpu_watchpoint_remove_all(env);
1210 gdb_continue(s);
1211 put_packet(s, "OK");
1212 break;
bellard858693c2004-03-31 18:52:07 +00001213 case 's':
1214 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001215 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001216#if defined(TARGET_I386)
1217 env->eip = addr;
1218#elif defined (TARGET_PPC)
1219 env->nip = addr;
bellard8d5f07f2004-10-04 21:23:09 +00001220#elif defined (TARGET_SPARC)
1221 env->pc = addr;
1222 env->npc = addr + 4;
bellardb5ff1b32005-11-26 10:38:39 +00001223#elif defined (TARGET_ARM)
1224 env->regs[15] = addr;
bellardfdf9b3e2006-04-27 21:07:38 +00001225#elif defined (TARGET_SH4)
ths8fac5802007-07-12 10:05:07 +00001226 env->pc = addr;
1227#elif defined (TARGET_MIPS)
thsb5dc7732008-06-27 10:02:35 +00001228 env->active_tc.PC = addr;
thsf1ccf902007-10-08 13:16:14 +00001229#elif defined (TARGET_CRIS)
1230 env->pc = addr;
bellard858693c2004-03-31 18:52:07 +00001231#endif
1232 }
edgar_igl60897d32008-05-09 08:25:14 +00001233 cpu_single_step(env, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001234 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001235 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001236 case 'F':
1237 {
1238 target_ulong ret;
1239 target_ulong err;
1240
1241 ret = strtoull(p, (char **)&p, 16);
1242 if (*p == ',') {
1243 p++;
1244 err = strtoull(p, (char **)&p, 16);
1245 } else {
1246 err = 0;
1247 }
1248 if (*p == ',')
1249 p++;
1250 type = *p;
1251 if (gdb_current_syscall_cb)
1252 gdb_current_syscall_cb(s->env, ret, err);
1253 if (type == 'C') {
1254 put_packet(s, "T02");
1255 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001256 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001257 }
1258 }
1259 break;
bellard858693c2004-03-31 18:52:07 +00001260 case 'g':
pbrook56aebc82008-10-11 17:55:29 +00001261 len = 0;
1262 for (addr = 0; addr < num_g_regs; addr++) {
1263 reg_size = gdb_read_register(env, mem_buf + len, addr);
1264 len += reg_size;
1265 }
1266 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001267 put_packet(s, buf);
1268 break;
1269 case 'G':
pbrook56aebc82008-10-11 17:55:29 +00001270 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001271 len = strlen(p) / 2;
1272 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00001273 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
1274 reg_size = gdb_write_register(env, registers, addr);
1275 len -= reg_size;
1276 registers += reg_size;
1277 }
bellard858693c2004-03-31 18:52:07 +00001278 put_packet(s, "OK");
1279 break;
1280 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001281 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001282 if (*p == ',')
1283 p++;
bellard9d9754a2006-06-25 15:32:37 +00001284 len = strtoull(p, NULL, 16);
bellard6f970bd2005-12-05 19:55:19 +00001285 if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) {
1286 put_packet (s, "E14");
1287 } else {
1288 memtohex(buf, mem_buf, len);
1289 put_packet(s, buf);
1290 }
bellard858693c2004-03-31 18:52:07 +00001291 break;
1292 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001293 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001294 if (*p == ',')
1295 p++;
bellard9d9754a2006-06-25 15:32:37 +00001296 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001297 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001298 p++;
1299 hextomem(mem_buf, p, len);
1300 if (cpu_memory_rw_debug(env, addr, mem_buf, len, 1) != 0)
bellard905f20b2005-04-26 21:09:55 +00001301 put_packet(s, "E14");
bellard858693c2004-03-31 18:52:07 +00001302 else
1303 put_packet(s, "OK");
1304 break;
pbrook56aebc82008-10-11 17:55:29 +00001305 case 'p':
1306 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1307 This works, but can be very slow. Anything new enough to
1308 understand XML also knows how to use this properly. */
1309 if (!gdb_has_xml)
1310 goto unknown_command;
1311 addr = strtoull(p, (char **)&p, 16);
1312 reg_size = gdb_read_register(env, mem_buf, addr);
1313 if (reg_size) {
1314 memtohex(buf, mem_buf, reg_size);
1315 put_packet(s, buf);
1316 } else {
1317 put_packet(s, "E14");
1318 }
1319 break;
1320 case 'P':
1321 if (!gdb_has_xml)
1322 goto unknown_command;
1323 addr = strtoull(p, (char **)&p, 16);
1324 if (*p == '=')
1325 p++;
1326 reg_size = strlen(p) / 2;
1327 hextomem(mem_buf, p, reg_size);
1328 gdb_write_register(env, mem_buf, addr);
1329 put_packet(s, "OK");
1330 break;
bellard858693c2004-03-31 18:52:07 +00001331 case 'Z':
1332 type = strtoul(p, (char **)&p, 16);
1333 if (*p == ',')
1334 p++;
bellard9d9754a2006-06-25 15:32:37 +00001335 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001336 if (*p == ',')
1337 p++;
bellard9d9754a2006-06-25 15:32:37 +00001338 len = strtoull(p, (char **)&p, 16);
pbrook0f459d12008-06-09 00:20:13 +00001339 switch (type) {
1340 case 0:
1341 case 1:
bellard858693c2004-03-31 18:52:07 +00001342 if (cpu_breakpoint_insert(env, addr) < 0)
bellard4c3a88a2003-07-26 12:06:08 +00001343 goto breakpoint_error;
bellard858693c2004-03-31 18:52:07 +00001344 put_packet(s, "OK");
pbrook0f459d12008-06-09 00:20:13 +00001345 break;
pbrook6658ffb2007-03-16 23:58:11 +00001346#ifndef CONFIG_USER_ONLY
pbrook0f459d12008-06-09 00:20:13 +00001347 case 2:
1348 type = PAGE_WRITE;
1349 goto insert_watchpoint;
1350 case 3:
1351 type = PAGE_READ;
1352 goto insert_watchpoint;
1353 case 4:
1354 type = PAGE_READ | PAGE_WRITE;
1355 insert_watchpoint:
1356 if (cpu_watchpoint_insert(env, addr, type) < 0)
pbrook6658ffb2007-03-16 23:58:11 +00001357 goto breakpoint_error;
1358 put_packet(s, "OK");
pbrook0f459d12008-06-09 00:20:13 +00001359 break;
pbrook6658ffb2007-03-16 23:58:11 +00001360#endif
pbrook0f459d12008-06-09 00:20:13 +00001361 default:
1362 put_packet(s, "");
1363 break;
bellard858693c2004-03-31 18:52:07 +00001364 }
1365 break;
pbrook0f459d12008-06-09 00:20:13 +00001366 breakpoint_error:
1367 put_packet(s, "E22");
1368 break;
1369
bellard858693c2004-03-31 18:52:07 +00001370 case 'z':
1371 type = strtoul(p, (char **)&p, 16);
1372 if (*p == ',')
1373 p++;
bellard9d9754a2006-06-25 15:32:37 +00001374 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001375 if (*p == ',')
1376 p++;
bellard9d9754a2006-06-25 15:32:37 +00001377 len = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001378 if (type == 0 || type == 1) {
1379 cpu_breakpoint_remove(env, addr);
1380 put_packet(s, "OK");
pbrook6658ffb2007-03-16 23:58:11 +00001381#ifndef CONFIG_USER_ONLY
pbrook0f459d12008-06-09 00:20:13 +00001382 } else if (type >= 2 || type <= 4) {
pbrook6658ffb2007-03-16 23:58:11 +00001383 cpu_watchpoint_remove(env, addr);
1384 put_packet(s, "OK");
1385#endif
bellard858693c2004-03-31 18:52:07 +00001386 } else {
pbrook0f459d12008-06-09 00:20:13 +00001387 put_packet(s, "");
bellard858693c2004-03-31 18:52:07 +00001388 }
1389 break;
pbrook978efd62006-06-17 18:30:42 +00001390 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001391 case 'Q':
1392 /* parse any 'q' packets here */
1393 if (!strcmp(p,"qemu.sstepbits")) {
1394 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001395 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1396 SSTEP_ENABLE,
1397 SSTEP_NOIRQ,
1398 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001399 put_packet(s, buf);
1400 break;
1401 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1402 /* Display or change the sstep_flags */
1403 p += 10;
1404 if (*p != '=') {
1405 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001406 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001407 put_packet(s, buf);
1408 break;
1409 }
1410 p++;
1411 type = strtoul(p, (char **)&p, 16);
1412 sstep_flags = type;
1413 put_packet(s, "OK");
1414 break;
1415 }
1416#ifdef CONFIG_LINUX_USER
1417 else if (strncmp(p, "Offsets", 7) == 0) {
pbrook978efd62006-06-17 18:30:42 +00001418 TaskState *ts = env->opaque;
1419
blueswir1363a37d2008-08-21 17:58:08 +00001420 snprintf(buf, sizeof(buf),
1421 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1422 ";Bss=" TARGET_ABI_FMT_lx,
1423 ts->info->code_offset,
1424 ts->info->data_offset,
1425 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001426 put_packet(s, buf);
1427 break;
1428 }
pbrook978efd62006-06-17 18:30:42 +00001429#endif
pbrook56aebc82008-10-11 17:55:29 +00001430 if (strncmp(p, "Supported", 9) == 0) {
1431 sprintf(buf, "PacketSize=%x", MAX_PACKET_LENGTH);
1432#ifdef GDB_CORE_XML
1433 strcat(buf, ";qXfer:features:read+");
1434#endif
1435 put_packet(s, buf);
1436 break;
1437 }
1438#ifdef GDB_CORE_XML
1439 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1440 const char *xml;
1441 target_ulong total_len;
1442
1443 gdb_has_xml = 1;
1444 p += 19;
1445 xml = get_feature_xml(env, p, &p);
1446 if (!xml) {
1447 sprintf(buf, "E00");
1448 put_packet(s, buf);
1449 break;
1450 }
1451
1452 if (*p == ':')
1453 p++;
1454 addr = strtoul(p, (char **)&p, 16);
1455 if (*p == ',')
1456 p++;
1457 len = strtoul(p, (char **)&p, 16);
1458
1459 total_len = strlen(xml);
1460 if (addr > total_len) {
1461 sprintf(buf, "E00");
1462 put_packet(s, buf);
1463 break;
1464 }
1465 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1466 len = (MAX_PACKET_LENGTH - 5) / 2;
1467 if (len < total_len - addr) {
1468 buf[0] = 'm';
1469 len = memtox(buf + 1, xml + addr, len);
1470 } else {
1471 buf[0] = 'l';
1472 len = memtox(buf + 1, xml + addr, total_len - addr);
1473 }
1474 put_packet_binary(s, buf, len + 1);
1475 break;
1476 }
1477#endif
1478 /* Unrecognised 'q' command. */
1479 goto unknown_command;
1480
bellard858693c2004-03-31 18:52:07 +00001481 default:
pbrook56aebc82008-10-11 17:55:29 +00001482 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001483 /* put empty packet */
1484 buf[0] = '\0';
1485 put_packet(s, buf);
1486 break;
1487 }
1488 return RS_IDLE;
1489}
1490
bellard612458f2005-01-03 23:34:06 +00001491extern void tb_flush(CPUState *env);
1492
bellard1fddef42005-04-17 19:16:13 +00001493#ifndef CONFIG_USER_ONLY
bellard858693c2004-03-31 18:52:07 +00001494static void gdb_vm_stopped(void *opaque, int reason)
1495{
1496 GDBState *s = opaque;
1497 char buf[256];
1498 int ret;
1499
pbrooka2d1eba2007-01-28 03:10:55 +00001500 if (s->state == RS_SYSCALL)
1501 return;
1502
bellard858693c2004-03-31 18:52:07 +00001503 /* disable single step if it was enable */
bellard6a00d602005-11-21 23:25:50 +00001504 cpu_single_step(s->env, 0);
bellard858693c2004-03-31 18:52:07 +00001505
bellarde80cfcf2004-12-19 23:18:01 +00001506 if (reason == EXCP_DEBUG) {
pbrook6658ffb2007-03-16 23:58:11 +00001507 if (s->env->watchpoint_hit) {
pbrookaa6290b2007-04-14 22:35:50 +00001508 snprintf(buf, sizeof(buf), "T%02xwatch:" TARGET_FMT_lx ";",
1509 SIGTRAP,
pbrook6658ffb2007-03-16 23:58:11 +00001510 s->env->watchpoint[s->env->watchpoint_hit - 1].vaddr);
1511 put_packet(s, buf);
1512 s->env->watchpoint_hit = 0;
1513 return;
1514 }
bellard6a00d602005-11-21 23:25:50 +00001515 tb_flush(s->env);
bellard858693c2004-03-31 18:52:07 +00001516 ret = SIGTRAP;
bellardbbeb7b52006-04-23 18:42:15 +00001517 } else if (reason == EXCP_INTERRUPT) {
1518 ret = SIGINT;
1519 } else {
bellard858693c2004-03-31 18:52:07 +00001520 ret = 0;
bellardbbeb7b52006-04-23 18:42:15 +00001521 }
bellard858693c2004-03-31 18:52:07 +00001522 snprintf(buf, sizeof(buf), "S%02x", ret);
1523 put_packet(s, buf);
1524}
bellard1fddef42005-04-17 19:16:13 +00001525#endif
bellard858693c2004-03-31 18:52:07 +00001526
pbrooka2d1eba2007-01-28 03:10:55 +00001527/* Send a gdb syscall request.
1528 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001529 %x - target_ulong argument printed in hex.
1530 %lx - 64-bit argument printed in hex.
1531 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001532void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001533{
1534 va_list va;
1535 char buf[256];
1536 char *p;
1537 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001538 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001539 GDBState *s;
1540
1541 s = gdb_syscall_state;
1542 if (!s)
1543 return;
1544 gdb_current_syscall_cb = cb;
1545 s->state = RS_SYSCALL;
1546#ifndef CONFIG_USER_ONLY
1547 vm_stop(EXCP_DEBUG);
1548#endif
1549 s->state = RS_IDLE;
1550 va_start(va, fmt);
1551 p = buf;
1552 *(p++) = 'F';
1553 while (*fmt) {
1554 if (*fmt == '%') {
1555 fmt++;
1556 switch (*fmt++) {
1557 case 'x':
1558 addr = va_arg(va, target_ulong);
blueswir1363a37d2008-08-21 17:58:08 +00001559 p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001560 break;
pbrooka87295e2007-05-26 15:09:38 +00001561 case 'l':
1562 if (*(fmt++) != 'x')
1563 goto bad_format;
1564 i64 = va_arg(va, uint64_t);
blueswir1363a37d2008-08-21 17:58:08 +00001565 p += snprintf(p, &buf[sizeof(buf)] - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001566 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001567 case 's':
1568 addr = va_arg(va, target_ulong);
blueswir1363a37d2008-08-21 17:58:08 +00001569 p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx "/%x",
1570 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001571 break;
1572 default:
pbrooka87295e2007-05-26 15:09:38 +00001573 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001574 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1575 fmt - 1);
1576 break;
1577 }
1578 } else {
1579 *(p++) = *(fmt++);
1580 }
1581 }
pbrook8a93e022007-08-06 13:19:15 +00001582 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001583 va_end(va);
1584 put_packet(s, buf);
1585#ifdef CONFIG_USER_ONLY
1586 gdb_handlesig(s->env, 0);
1587#else
1588 cpu_interrupt(s->env, CPU_INTERRUPT_EXIT);
1589#endif
1590}
1591
bellard6a00d602005-11-21 23:25:50 +00001592static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001593{
bellard6a00d602005-11-21 23:25:50 +00001594 CPUState *env = s->env;
bellard858693c2004-03-31 18:52:07 +00001595 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001596 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001597
bellard1fddef42005-04-17 19:16:13 +00001598#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001599 if (s->last_packet_len) {
1600 /* Waiting for a response to the last packet. If we see the start
1601 of a new command then abandon the previous response. */
1602 if (ch == '-') {
1603#ifdef DEBUG_GDB
1604 printf("Got NACK, retransmitting\n");
1605#endif
thsffe8ab82007-12-16 03:16:05 +00001606 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001607 }
1608#ifdef DEBUG_GDB
1609 else if (ch == '+')
1610 printf("Got ACK\n");
1611 else
1612 printf("Got '%c' when expecting ACK/NACK\n", ch);
1613#endif
1614 if (ch == '+' || ch == '$')
1615 s->last_packet_len = 0;
1616 if (ch != '$')
1617 return;
1618 }
bellard858693c2004-03-31 18:52:07 +00001619 if (vm_running) {
1620 /* when the CPU is running, we cannot do anything except stop
1621 it when receiving a char */
1622 vm_stop(EXCP_INTERRUPT);
ths5fafdf22007-09-16 21:08:06 +00001623 } else
bellard1fddef42005-04-17 19:16:13 +00001624#endif
bellard41625032005-04-24 10:07:11 +00001625 {
bellard858693c2004-03-31 18:52:07 +00001626 switch(s->state) {
1627 case RS_IDLE:
1628 if (ch == '$') {
1629 s->line_buf_index = 0;
1630 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001631 }
1632 break;
bellard858693c2004-03-31 18:52:07 +00001633 case RS_GETLINE:
1634 if (ch == '#') {
1635 s->state = RS_CHKSUM1;
1636 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1637 s->state = RS_IDLE;
1638 } else {
1639 s->line_buf[s->line_buf_index++] = ch;
1640 }
1641 break;
1642 case RS_CHKSUM1:
1643 s->line_buf[s->line_buf_index] = '\0';
1644 s->line_csum = fromhex(ch) << 4;
1645 s->state = RS_CHKSUM2;
1646 break;
1647 case RS_CHKSUM2:
1648 s->line_csum |= fromhex(ch);
1649 csum = 0;
1650 for(i = 0; i < s->line_buf_index; i++) {
1651 csum += s->line_buf[i];
1652 }
1653 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001654 reply = '-';
1655 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001656 s->state = RS_IDLE;
1657 } else {
ths60fe76f2007-12-16 03:02:09 +00001658 reply = '+';
1659 put_buffer(s, &reply, 1);
bellard1fddef42005-04-17 19:16:13 +00001660 s->state = gdb_handle_packet(s, env, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001661 }
bellardb4608c02003-06-27 17:34:32 +00001662 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001663 default:
1664 abort();
bellardb4608c02003-06-27 17:34:32 +00001665 }
1666 }
bellard858693c2004-03-31 18:52:07 +00001667}
1668
bellard1fddef42005-04-17 19:16:13 +00001669#ifdef CONFIG_USER_ONLY
1670int
1671gdb_handlesig (CPUState *env, int sig)
1672{
1673 GDBState *s;
1674 char buf[256];
1675 int n;
1676
bellard1fddef42005-04-17 19:16:13 +00001677 s = &gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00001678 if (gdbserver_fd < 0 || s->fd < 0)
1679 return sig;
bellard1fddef42005-04-17 19:16:13 +00001680
1681 /* disable single step if it was enabled */
1682 cpu_single_step(env, 0);
1683 tb_flush(env);
1684
1685 if (sig != 0)
1686 {
1687 snprintf(buf, sizeof(buf), "S%02x", sig);
1688 put_packet(s, buf);
1689 }
edgar_igl1f487ee2008-05-17 22:20:53 +00001690 /* put_packet() might have detected that the peer terminated the
1691 connection. */
1692 if (s->fd < 0)
1693 return sig;
bellard1fddef42005-04-17 19:16:13 +00001694
bellard1fddef42005-04-17 19:16:13 +00001695 sig = 0;
1696 s->state = RS_IDLE;
bellard41625032005-04-24 10:07:11 +00001697 s->running_state = 0;
1698 while (s->running_state == 0) {
bellard1fddef42005-04-17 19:16:13 +00001699 n = read (s->fd, buf, 256);
1700 if (n > 0)
1701 {
1702 int i;
1703
1704 for (i = 0; i < n; i++)
bellard6a00d602005-11-21 23:25:50 +00001705 gdb_read_byte (s, buf[i]);
bellard1fddef42005-04-17 19:16:13 +00001706 }
1707 else if (n == 0 || errno != EAGAIN)
1708 {
1709 /* XXX: Connection closed. Should probably wait for annother
1710 connection before continuing. */
1711 return sig;
1712 }
bellard41625032005-04-24 10:07:11 +00001713 }
edgar_igl1f487ee2008-05-17 22:20:53 +00001714 sig = s->signal;
1715 s->signal = 0;
bellard1fddef42005-04-17 19:16:13 +00001716 return sig;
1717}
bellarde9009672005-04-26 20:42:36 +00001718
1719/* Tell the remote gdb that the process has exited. */
1720void gdb_exit(CPUState *env, int code)
1721{
1722 GDBState *s;
1723 char buf[4];
1724
bellarde9009672005-04-26 20:42:36 +00001725 s = &gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00001726 if (gdbserver_fd < 0 || s->fd < 0)
1727 return;
bellarde9009672005-04-26 20:42:36 +00001728
1729 snprintf(buf, sizeof(buf), "W%02x", code);
1730 put_packet(s, buf);
1731}
1732
bellard1fddef42005-04-17 19:16:13 +00001733
bellard7c9d8e02005-11-15 22:16:05 +00001734static void gdb_accept(void *opaque)
bellard858693c2004-03-31 18:52:07 +00001735{
1736 GDBState *s;
1737 struct sockaddr_in sockaddr;
1738 socklen_t len;
1739 int val, fd;
1740
1741 for(;;) {
1742 len = sizeof(sockaddr);
1743 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1744 if (fd < 0 && errno != EINTR) {
1745 perror("accept");
1746 return;
1747 } else if (fd >= 0) {
1748 break;
1749 }
1750 }
1751
1752 /* set short latency */
1753 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00001754 setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
ths3b46e622007-09-17 08:09:54 +00001755
bellard1fddef42005-04-17 19:16:13 +00001756 s = &gdbserver_state;
1757 memset (s, 0, sizeof (GDBState));
bellard6a00d602005-11-21 23:25:50 +00001758 s->env = first_cpu; /* XXX: allow to change CPU */
bellard858693c2004-03-31 18:52:07 +00001759 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00001760 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00001761
pbrooka2d1eba2007-01-28 03:10:55 +00001762 gdb_syscall_state = s;
1763
bellard858693c2004-03-31 18:52:07 +00001764 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00001765}
1766
1767static int gdbserver_open(int port)
1768{
1769 struct sockaddr_in sockaddr;
1770 int fd, val, ret;
1771
1772 fd = socket(PF_INET, SOCK_STREAM, 0);
1773 if (fd < 0) {
1774 perror("socket");
1775 return -1;
1776 }
1777
1778 /* allow fast reuse */
1779 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00001780 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00001781
1782 sockaddr.sin_family = AF_INET;
1783 sockaddr.sin_port = htons(port);
1784 sockaddr.sin_addr.s_addr = 0;
1785 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1786 if (ret < 0) {
1787 perror("bind");
1788 return -1;
1789 }
1790 ret = listen(fd, 0);
1791 if (ret < 0) {
1792 perror("listen");
1793 return -1;
1794 }
bellard858693c2004-03-31 18:52:07 +00001795 return fd;
1796}
1797
1798int gdbserver_start(int port)
1799{
1800 gdbserver_fd = gdbserver_open(port);
1801 if (gdbserver_fd < 0)
1802 return -1;
1803 /* accept connections */
bellard7c9d8e02005-11-15 22:16:05 +00001804 gdb_accept (NULL);
bellardb4608c02003-06-27 17:34:32 +00001805 return 0;
1806}
pbrook4046d912007-01-28 01:53:16 +00001807#else
thsaa1f17c2007-07-11 22:48:58 +00001808static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001809{
pbrook56aebc82008-10-11 17:55:29 +00001810 /* We can handle an arbitrarily large amount of data.
1811 Pick the maximum packet size, which is as good as anything. */
1812 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001813}
1814
thsaa1f17c2007-07-11 22:48:58 +00001815static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001816{
1817 GDBState *s = opaque;
1818 int i;
1819
1820 for (i = 0; i < size; i++) {
1821 gdb_read_byte(s, buf[i]);
1822 }
1823}
1824
1825static void gdb_chr_event(void *opaque, int event)
1826{
1827 switch (event) {
1828 case CHR_EVENT_RESET:
1829 vm_stop(EXCP_INTERRUPT);
pbrooka2d1eba2007-01-28 03:10:55 +00001830 gdb_syscall_state = opaque;
pbrook56aebc82008-10-11 17:55:29 +00001831 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00001832 break;
1833 default:
1834 break;
1835 }
1836}
1837
pbrookcfc34752007-02-22 01:48:01 +00001838int gdbserver_start(const char *port)
pbrook4046d912007-01-28 01:53:16 +00001839{
1840 GDBState *s;
pbrookcfc34752007-02-22 01:48:01 +00001841 char gdbstub_port_name[128];
1842 int port_num;
1843 char *p;
1844 CharDriverState *chr;
pbrook4046d912007-01-28 01:53:16 +00001845
pbrookcfc34752007-02-22 01:48:01 +00001846 if (!port || !*port)
1847 return -1;
1848
1849 port_num = strtol(port, &p, 10);
1850 if (*p == 0) {
1851 /* A numeric value is interpreted as a port number. */
1852 snprintf(gdbstub_port_name, sizeof(gdbstub_port_name),
1853 "tcp::%d,nowait,nodelay,server", port_num);
1854 port = gdbstub_port_name;
1855 }
1856
1857 chr = qemu_chr_open(port);
pbrook4046d912007-01-28 01:53:16 +00001858 if (!chr)
1859 return -1;
1860
1861 s = qemu_mallocz(sizeof(GDBState));
1862 if (!s) {
1863 return -1;
1864 }
1865 s->env = first_cpu; /* XXX: allow to change CPU */
1866 s->chr = chr;
thsaa1f17c2007-07-11 22:48:58 +00001867 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
pbrook4046d912007-01-28 01:53:16 +00001868 gdb_chr_event, s);
1869 qemu_add_vm_stop_handler(gdb_vm_stopped, s);
1870 return 0;
1871}
1872#endif