blob: 99a4772954959c527df7c12b9ac7e4c718769344 [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,
blueswir1c72d5bf2009-01-15 17:27:45 +000090#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +000091 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +000092#else
93 -1,
94#endif
aurel32ca587a82008-12-18 22:44:13 +000095 -1, /* SIGPOLL */
96 -1,
97 -1,
98 -1,
99 -1,
100 -1,
101 -1,
102 -1,
103 -1,
104 -1,
105 -1,
106 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000107#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000108 __SIGRTMIN + 1,
109 __SIGRTMIN + 2,
110 __SIGRTMIN + 3,
111 __SIGRTMIN + 4,
112 __SIGRTMIN + 5,
113 __SIGRTMIN + 6,
114 __SIGRTMIN + 7,
115 __SIGRTMIN + 8,
116 __SIGRTMIN + 9,
117 __SIGRTMIN + 10,
118 __SIGRTMIN + 11,
119 __SIGRTMIN + 12,
120 __SIGRTMIN + 13,
121 __SIGRTMIN + 14,
122 __SIGRTMIN + 15,
123 __SIGRTMIN + 16,
124 __SIGRTMIN + 17,
125 __SIGRTMIN + 18,
126 __SIGRTMIN + 19,
127 __SIGRTMIN + 20,
128 __SIGRTMIN + 21,
129 __SIGRTMIN + 22,
130 __SIGRTMIN + 23,
131 __SIGRTMIN + 24,
132 __SIGRTMIN + 25,
133 __SIGRTMIN + 26,
134 __SIGRTMIN + 27,
135 __SIGRTMIN + 28,
136 __SIGRTMIN + 29,
137 __SIGRTMIN + 30,
138 __SIGRTMIN + 31,
139 -1, /* SIGCANCEL */
140 __SIGRTMIN,
141 __SIGRTMIN + 32,
142 __SIGRTMIN + 33,
143 __SIGRTMIN + 34,
144 __SIGRTMIN + 35,
145 __SIGRTMIN + 36,
146 __SIGRTMIN + 37,
147 __SIGRTMIN + 38,
148 __SIGRTMIN + 39,
149 __SIGRTMIN + 40,
150 __SIGRTMIN + 41,
151 __SIGRTMIN + 42,
152 __SIGRTMIN + 43,
153 __SIGRTMIN + 44,
154 __SIGRTMIN + 45,
155 __SIGRTMIN + 46,
156 __SIGRTMIN + 47,
157 __SIGRTMIN + 48,
158 __SIGRTMIN + 49,
159 __SIGRTMIN + 50,
160 __SIGRTMIN + 51,
161 __SIGRTMIN + 52,
162 __SIGRTMIN + 53,
163 __SIGRTMIN + 54,
164 __SIGRTMIN + 55,
165 __SIGRTMIN + 56,
166 __SIGRTMIN + 57,
167 __SIGRTMIN + 58,
168 __SIGRTMIN + 59,
169 __SIGRTMIN + 60,
170 __SIGRTMIN + 61,
171 __SIGRTMIN + 62,
172 __SIGRTMIN + 63,
173 __SIGRTMIN + 64,
174 __SIGRTMIN + 65,
175 __SIGRTMIN + 66,
176 __SIGRTMIN + 67,
177 __SIGRTMIN + 68,
178 __SIGRTMIN + 69,
179 __SIGRTMIN + 70,
180 __SIGRTMIN + 71,
181 __SIGRTMIN + 72,
182 __SIGRTMIN + 73,
183 __SIGRTMIN + 74,
184 __SIGRTMIN + 75,
185 __SIGRTMIN + 76,
186 __SIGRTMIN + 77,
187 __SIGRTMIN + 78,
188 __SIGRTMIN + 79,
189 __SIGRTMIN + 80,
190 __SIGRTMIN + 81,
191 __SIGRTMIN + 82,
192 __SIGRTMIN + 83,
193 __SIGRTMIN + 84,
194 __SIGRTMIN + 85,
195 __SIGRTMIN + 86,
196 __SIGRTMIN + 87,
197 __SIGRTMIN + 88,
198 __SIGRTMIN + 89,
199 __SIGRTMIN + 90,
200 __SIGRTMIN + 91,
201 __SIGRTMIN + 92,
202 __SIGRTMIN + 93,
203 __SIGRTMIN + 94,
204 __SIGRTMIN + 95,
205 -1, /* SIGINFO */
206 -1, /* UNKNOWN */
207 -1, /* DEFAULT */
208 -1,
209 -1,
210 -1,
211 -1,
212 -1,
213 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000214#endif
aurel32ca587a82008-12-18 22:44:13 +0000215};
bellard8f447cc2006-06-14 15:21:14 +0000216#else
aurel32ca587a82008-12-18 22:44:13 +0000217/* In system mode we only need SIGINT and SIGTRAP; other signals
218 are not yet supported. */
219
220enum {
221 TARGET_SIGINT = 2,
222 TARGET_SIGTRAP = 5
223};
224
225static int gdb_signal_table[] = {
226 -1,
227 -1,
228 TARGET_SIGINT,
229 -1,
230 -1,
231 TARGET_SIGTRAP
232};
bellard8f447cc2006-06-14 15:21:14 +0000233#endif
bellardb4608c02003-06-27 17:34:32 +0000234
aurel32ca587a82008-12-18 22:44:13 +0000235#ifdef CONFIG_USER_ONLY
236static int target_signal_to_gdb (int sig)
237{
238 int i;
239 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
240 if (gdb_signal_table[i] == sig)
241 return i;
242 return GDB_SIGNAL_UNKNOWN;
243}
244#endif
245
246static int gdb_signal_to_target (int sig)
247{
248 if (sig < ARRAY_SIZE (gdb_signal_table))
249 return gdb_signal_table[sig];
250 else
251 return -1;
252}
253
bellard4abe6152003-07-26 18:01:58 +0000254//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000255
pbrook56aebc82008-10-11 17:55:29 +0000256typedef struct GDBRegisterState {
257 int base_reg;
258 int num_regs;
259 gdb_reg_cb get_reg;
260 gdb_reg_cb set_reg;
261 const char *xml;
262 struct GDBRegisterState *next;
263} GDBRegisterState;
264
bellard858693c2004-03-31 18:52:07 +0000265enum RSState {
266 RS_IDLE,
267 RS_GETLINE,
268 RS_CHKSUM1,
269 RS_CHKSUM2,
pbrooka2d1eba2007-01-28 03:10:55 +0000270 RS_SYSCALL,
bellard858693c2004-03-31 18:52:07 +0000271};
bellard858693c2004-03-31 18:52:07 +0000272typedef struct GDBState {
aliguori880a7572008-11-18 20:30:24 +0000273 CPUState *c_cpu; /* current CPU for step/continue ops */
274 CPUState *g_cpu; /* current CPU for other ops */
275 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000276 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000277 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000278 int line_buf_index;
279 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000280 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000281 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000282 int signal;
bellard41625032005-04-24 10:07:11 +0000283#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000284 int fd;
bellard41625032005-04-24 10:07:11 +0000285 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000286#else
287 CharDriverState *chr;
bellard41625032005-04-24 10:07:11 +0000288#endif
bellard858693c2004-03-31 18:52:07 +0000289} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000290
edgar_igl60897d32008-05-09 08:25:14 +0000291/* By default use no IRQs and no timers while single stepping so as to
292 * make single stepping like an ICE HW step.
293 */
294static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
295
aliguori880a7572008-11-18 20:30:24 +0000296static GDBState *gdbserver_state;
297
pbrook56aebc82008-10-11 17:55:29 +0000298/* This is an ugly hack to cope with both new and old gdb.
299 If gdb sends qXfer:features:read then assume we're talking to a newish
300 gdb that understands target descriptions. */
301static int gdb_has_xml;
302
bellard1fddef42005-04-17 19:16:13 +0000303#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000304/* XXX: This is not thread safe. Do we care? */
305static int gdbserver_fd = -1;
306
bellard858693c2004-03-31 18:52:07 +0000307static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000308{
309 uint8_t ch;
310 int ret;
311
312 for(;;) {
bellard8f447cc2006-06-14 15:21:14 +0000313 ret = recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000314 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000315 if (errno == ECONNRESET)
316 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000317 if (errno != EINTR && errno != EAGAIN)
318 return -1;
319 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000320 close(s->fd);
321 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000322 return -1;
323 } else {
324 break;
325 }
326 }
327 return ch;
328}
pbrook4046d912007-01-28 01:53:16 +0000329#endif
bellardb4608c02003-06-27 17:34:32 +0000330
pbrooka2d1eba2007-01-28 03:10:55 +0000331static gdb_syscall_complete_cb gdb_current_syscall_cb;
332
333enum {
334 GDB_SYS_UNKNOWN,
335 GDB_SYS_ENABLED,
336 GDB_SYS_DISABLED,
337} gdb_syscall_mode;
338
339/* If gdb is connected when the first semihosting syscall occurs then use
340 remote gdb syscalls. Otherwise use native file IO. */
341int use_gdb_syscalls(void)
342{
343 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000344 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
345 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000346 }
347 return gdb_syscall_mode == GDB_SYS_ENABLED;
348}
349
edgar_iglba70a622008-03-14 06:10:42 +0000350/* Resume execution. */
351static inline void gdb_continue(GDBState *s)
352{
353#ifdef CONFIG_USER_ONLY
354 s->running_state = 1;
355#else
356 vm_start();
357#endif
358}
359
bellard858693c2004-03-31 18:52:07 +0000360static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000361{
pbrook4046d912007-01-28 01:53:16 +0000362#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000363 int ret;
364
365 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000366 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000367 if (ret < 0) {
368 if (errno != EINTR && errno != EAGAIN)
369 return;
370 } else {
371 buf += ret;
372 len -= ret;
373 }
374 }
pbrook4046d912007-01-28 01:53:16 +0000375#else
376 qemu_chr_write(s->chr, buf, len);
377#endif
bellardb4608c02003-06-27 17:34:32 +0000378}
379
380static inline int fromhex(int v)
381{
382 if (v >= '0' && v <= '9')
383 return v - '0';
384 else if (v >= 'A' && v <= 'F')
385 return v - 'A' + 10;
386 else if (v >= 'a' && v <= 'f')
387 return v - 'a' + 10;
388 else
389 return 0;
390}
391
392static inline int tohex(int v)
393{
394 if (v < 10)
395 return v + '0';
396 else
397 return v - 10 + 'a';
398}
399
400static void memtohex(char *buf, const uint8_t *mem, int len)
401{
402 int i, c;
403 char *q;
404 q = buf;
405 for(i = 0; i < len; i++) {
406 c = mem[i];
407 *q++ = tohex(c >> 4);
408 *q++ = tohex(c & 0xf);
409 }
410 *q = '\0';
411}
412
413static void hextomem(uint8_t *mem, const char *buf, int len)
414{
415 int i;
416
417 for(i = 0; i < len; i++) {
418 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
419 buf += 2;
420 }
421}
422
bellardb4608c02003-06-27 17:34:32 +0000423/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000424static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000425{
pbrook56aebc82008-10-11 17:55:29 +0000426 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000427 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000428
bellardb4608c02003-06-27 17:34:32 +0000429 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000430 p = s->last_packet;
431 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000432 memcpy(p, buf, len);
433 p += len;
bellardb4608c02003-06-27 17:34:32 +0000434 csum = 0;
435 for(i = 0; i < len; i++) {
436 csum += buf[i];
437 }
pbrook4046d912007-01-28 01:53:16 +0000438 *(p++) = '#';
439 *(p++) = tohex((csum >> 4) & 0xf);
440 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000441
pbrook4046d912007-01-28 01:53:16 +0000442 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000443 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000444
pbrook4046d912007-01-28 01:53:16 +0000445#ifdef CONFIG_USER_ONLY
446 i = get_char(s);
447 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000448 return -1;
pbrook4046d912007-01-28 01:53:16 +0000449 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000450 break;
pbrook4046d912007-01-28 01:53:16 +0000451#else
452 break;
453#endif
bellardb4608c02003-06-27 17:34:32 +0000454 }
455 return 0;
456}
457
pbrook56aebc82008-10-11 17:55:29 +0000458/* return -1 if error, 0 if OK */
459static int put_packet(GDBState *s, const char *buf)
460{
461#ifdef DEBUG_GDB
462 printf("reply='%s'\n", buf);
463#endif
464
465 return put_packet_binary(s, buf, strlen(buf));
466}
467
468/* The GDB remote protocol transfers values in target byte order. This means
469 we can use the raw memory access routines to access the value buffer.
470 Conveniently, these also handle the case where the buffer is mis-aligned.
471 */
472#define GET_REG8(val) do { \
473 stb_p(mem_buf, val); \
474 return 1; \
475 } while(0)
476#define GET_REG16(val) do { \
477 stw_p(mem_buf, val); \
478 return 2; \
479 } while(0)
480#define GET_REG32(val) do { \
481 stl_p(mem_buf, val); \
482 return 4; \
483 } while(0)
484#define GET_REG64(val) do { \
485 stq_p(mem_buf, val); \
486 return 8; \
487 } while(0)
488
489#if TARGET_LONG_BITS == 64
490#define GET_REGL(val) GET_REG64(val)
491#define ldtul_p(addr) ldq_p(addr)
492#else
493#define GET_REGL(val) GET_REG32(val)
494#define ldtul_p(addr) ldl_p(addr)
495#endif
496
edgar_iglfde3fd62008-05-09 08:50:01 +0000497#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000498
499#ifdef TARGET_X86_64
pbrook56aebc82008-10-11 17:55:29 +0000500static const int gpr_map[16] = {
bellard79808572008-05-09 14:40:22 +0000501 R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
pbrook56aebc82008-10-11 17:55:29 +0000502 8, 9, 10, 11, 12, 13, 14, 15
bellard79808572008-05-09 14:40:22 +0000503};
bellard79808572008-05-09 14:40:22 +0000504#else
pbrook56aebc82008-10-11 17:55:29 +0000505static const int gpr_map[8] = {0, 1, 2, 3, 4, 5, 6, 7};
bellard79808572008-05-09 14:40:22 +0000506#endif
pbrook56aebc82008-10-11 17:55:29 +0000507
508#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
509
510static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
511{
512 if (n < CPU_NB_REGS) {
513 GET_REGL(env->regs[gpr_map[n]]);
514 } else if (n >= CPU_NB_REGS + 8 && n < CPU_NB_REGS + 16) {
515 /* FIXME: byteswap float values. */
516#ifdef USE_X86LDOUBLE
517 memcpy(mem_buf, &env->fpregs[n - (CPU_NB_REGS + 8)], 10);
518#else
519 memset(mem_buf, 0, 10);
520#endif
521 return 10;
522 } else if (n >= CPU_NB_REGS + 24) {
523 n -= CPU_NB_REGS + 24;
524 if (n < CPU_NB_REGS) {
525 stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
526 stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
527 return 16;
528 } else if (n == CPU_NB_REGS) {
529 GET_REG32(env->mxcsr);
530 }
531 } else {
532 n -= CPU_NB_REGS;
533 switch (n) {
534 case 0: GET_REGL(env->eip);
535 case 1: GET_REG32(env->eflags);
536 case 2: GET_REG32(env->segs[R_CS].selector);
537 case 3: GET_REG32(env->segs[R_SS].selector);
538 case 4: GET_REG32(env->segs[R_DS].selector);
539 case 5: GET_REG32(env->segs[R_ES].selector);
540 case 6: GET_REG32(env->segs[R_FS].selector);
541 case 7: GET_REG32(env->segs[R_GS].selector);
542 /* 8...15 x87 regs. */
543 case 16: GET_REG32(env->fpuc);
544 case 17: GET_REG32((env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11);
545 case 18: GET_REG32(0); /* ftag */
546 case 19: GET_REG32(0); /* fiseg */
547 case 20: GET_REG32(0); /* fioff */
548 case 21: GET_REG32(0); /* foseg */
549 case 22: GET_REG32(0); /* fooff */
550 case 23: GET_REG32(0); /* fop */
551 /* 24+ xmm regs. */
552 }
bellard79808572008-05-09 14:40:22 +0000553 }
pbrook56aebc82008-10-11 17:55:29 +0000554 return 0;
bellard79808572008-05-09 14:40:22 +0000555}
556
pbrook56aebc82008-10-11 17:55:29 +0000557static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int i)
bellard79808572008-05-09 14:40:22 +0000558{
pbrook56aebc82008-10-11 17:55:29 +0000559 uint32_t tmp;
560
561 if (i < CPU_NB_REGS) {
562 env->regs[gpr_map[i]] = ldtul_p(mem_buf);
563 return sizeof(target_ulong);
564 } else if (i >= CPU_NB_REGS + 8 && i < CPU_NB_REGS + 16) {
565 i -= CPU_NB_REGS + 8;
566#ifdef USE_X86LDOUBLE
567 memcpy(&env->fpregs[i], mem_buf, 10);
568#endif
569 return 10;
570 } else if (i >= CPU_NB_REGS + 24) {
571 i -= CPU_NB_REGS + 24;
572 if (i < CPU_NB_REGS) {
573 env->xmm_regs[i].XMM_Q(0) = ldq_p(mem_buf);
574 env->xmm_regs[i].XMM_Q(1) = ldq_p(mem_buf + 8);
575 return 16;
576 } else if (i == CPU_NB_REGS) {
577 env->mxcsr = ldl_p(mem_buf);
578 return 4;
579 }
580 } else {
581 i -= CPU_NB_REGS;
582 switch (i) {
583 case 0: env->eip = ldtul_p(mem_buf); return sizeof(target_ulong);
584 case 1: env->eflags = ldl_p(mem_buf); return 4;
bellard79808572008-05-09 14:40:22 +0000585#if defined(CONFIG_USER_ONLY)
pbrook56aebc82008-10-11 17:55:29 +0000586#define LOAD_SEG(index, sreg)\
587 tmp = ldl_p(mem_buf);\
588 if (tmp != env->segs[sreg].selector)\
589 cpu_x86_load_seg(env, sreg, tmp);
bellard79808572008-05-09 14:40:22 +0000590#else
pbrook56aebc82008-10-11 17:55:29 +0000591/* FIXME: Honor segment registers. Needs to avoid raising an exception
592 when the selector is invalid. */
593#define LOAD_SEG(index, sreg) do {} while(0)
bellard79808572008-05-09 14:40:22 +0000594#endif
pbrook56aebc82008-10-11 17:55:29 +0000595 case 2: LOAD_SEG(10, R_CS); return 4;
596 case 3: LOAD_SEG(11, R_SS); return 4;
597 case 4: LOAD_SEG(12, R_DS); return 4;
598 case 5: LOAD_SEG(13, R_ES); return 4;
599 case 6: LOAD_SEG(14, R_FS); return 4;
600 case 7: LOAD_SEG(15, R_GS); return 4;
601 /* 8...15 x87 regs. */
602 case 16: env->fpuc = ldl_p(mem_buf); return 4;
603 case 17:
604 tmp = ldl_p(mem_buf);
605 env->fpstt = (tmp >> 11) & 7;
606 env->fpus = tmp & ~0x3800;
607 return 4;
608 case 18: /* ftag */ return 4;
609 case 19: /* fiseg */ return 4;
610 case 20: /* fioff */ return 4;
611 case 21: /* foseg */ return 4;
612 case 22: /* fooff */ return 4;
613 case 23: /* fop */ return 4;
614 /* 24+ xmm regs. */
bellard79808572008-05-09 14:40:22 +0000615 }
bellard79808572008-05-09 14:40:22 +0000616 }
pbrook56aebc82008-10-11 17:55:29 +0000617 /* Unrecognised register. */
618 return 0;
bellard6da41ea2004-01-04 15:48:38 +0000619}
620
bellard9e62fd72004-01-05 22:49:06 +0000621#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000622
623#define NUM_CORE_REGS 71
624
625static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000626{
pbrook56aebc82008-10-11 17:55:29 +0000627 if (n < 32) {
628 /* gprs */
629 GET_REGL(env->gpr[n]);
630 } else if (n < 64) {
631 /* fprs */
aurel328d4acf92008-11-30 16:23:18 +0000632 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000633 return 8;
634 } else {
635 switch (n) {
636 case 64: GET_REGL(env->nip);
637 case 65: GET_REGL(env->msr);
638 case 66:
639 {
640 uint32_t cr = 0;
641 int i;
642 for (i = 0; i < 8; i++)
643 cr |= env->crf[i] << (32 - ((i + 1) * 4));
644 GET_REG32(cr);
645 }
646 case 67: GET_REGL(env->lr);
647 case 68: GET_REGL(env->ctr);
aurel323d7b4172008-10-21 11:28:46 +0000648 case 69: GET_REGL(env->xer);
pbrook56aebc82008-10-11 17:55:29 +0000649 case 70: GET_REG32(0); /* fpscr */
650 }
bellard9e62fd72004-01-05 22:49:06 +0000651 }
pbrook56aebc82008-10-11 17:55:29 +0000652 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000653}
654
pbrook56aebc82008-10-11 17:55:29 +0000655static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000656{
pbrook56aebc82008-10-11 17:55:29 +0000657 if (n < 32) {
658 /* gprs */
659 env->gpr[n] = ldtul_p(mem_buf);
660 return sizeof(target_ulong);
661 } else if (n < 64) {
662 /* fprs */
aurel328d4acf92008-11-30 16:23:18 +0000663 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000664 return 8;
665 } else {
666 switch (n) {
667 case 64:
668 env->nip = ldtul_p(mem_buf);
669 return sizeof(target_ulong);
670 case 65:
671 ppc_store_msr(env, ldtul_p(mem_buf));
672 return sizeof(target_ulong);
673 case 66:
674 {
675 uint32_t cr = ldl_p(mem_buf);
676 int i;
677 for (i = 0; i < 8; i++)
678 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
679 return 4;
680 }
681 case 67:
682 env->lr = ldtul_p(mem_buf);
683 return sizeof(target_ulong);
684 case 68:
685 env->ctr = ldtul_p(mem_buf);
686 return sizeof(target_ulong);
687 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000688 env->xer = ldtul_p(mem_buf);
689 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000690 case 70:
691 /* fpscr */
692 return 4;
693 }
bellard9e62fd72004-01-05 22:49:06 +0000694 }
pbrook56aebc82008-10-11 17:55:29 +0000695 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000696}
pbrook56aebc82008-10-11 17:55:29 +0000697
bellarde95c8d52004-09-30 22:22:08 +0000698#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000699
pbrook56aebc82008-10-11 17:55:29 +0000700#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
701#define NUM_CORE_REGS 86
702#else
blueswir15a377912009-01-13 16:28:01 +0000703#define NUM_CORE_REGS 72
pbrook56aebc82008-10-11 17:55:29 +0000704#endif
705
706#ifdef TARGET_ABI32
707#define GET_REGA(val) GET_REG32(val)
708#else
709#define GET_REGA(val) GET_REGL(val)
710#endif
711
712static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
713{
714 if (n < 8) {
715 /* g0..g7 */
716 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000717 }
pbrook56aebc82008-10-11 17:55:29 +0000718 if (n < 32) {
719 /* register window */
720 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000721 }
pbrook56aebc82008-10-11 17:55:29 +0000722#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
723 if (n < 64) {
724 /* fprs */
725 GET_REG32(*((uint32_t *)&env->fpr[n - 32]));
bellarde95c8d52004-09-30 22:22:08 +0000726 }
727 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000728 switch (n) {
729 case 64: GET_REGA(env->y);
730 case 65: GET_REGA(GET_PSR(env));
731 case 66: GET_REGA(env->wim);
732 case 67: GET_REGA(env->tbr);
733 case 68: GET_REGA(env->pc);
734 case 69: GET_REGA(env->npc);
735 case 70: GET_REGA(env->fsr);
736 case 71: GET_REGA(0); /* csr */
blueswir15a377912009-01-13 16:28:01 +0000737 default: GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000738 }
bellard34751872005-07-02 14:31:34 +0000739#else
pbrook56aebc82008-10-11 17:55:29 +0000740 if (n < 64) {
741 /* f0-f31 */
742 GET_REG32(*((uint32_t *)&env->fpr[n - 32]));
bellard34751872005-07-02 14:31:34 +0000743 }
pbrook56aebc82008-10-11 17:55:29 +0000744 if (n < 80) {
745 /* f32-f62 (double width, even numbers only) */
746 uint64_t val;
747
748 val = (uint64_t)*((uint32_t *)&env->fpr[(n - 64) * 2 + 32]) << 32;
749 val |= *((uint32_t *)&env->fpr[(n - 64) * 2 + 33]);
750 GET_REG64(val);
751 }
752 switch (n) {
753 case 80: GET_REGL(env->pc);
754 case 81: GET_REGL(env->npc);
755 case 82: GET_REGL(((uint64_t)GET_CCR(env) << 32) |
blueswir117d996e2007-07-07 20:53:22 +0000756 ((env->asi & 0xff) << 24) |
757 ((env->pstate & 0xfff) << 8) |
758 GET_CWP64(env));
pbrook56aebc82008-10-11 17:55:29 +0000759 case 83: GET_REGL(env->fsr);
760 case 84: GET_REGL(env->fprs);
761 case 85: GET_REGL(env->y);
762 }
bellard34751872005-07-02 14:31:34 +0000763#endif
pbrook56aebc82008-10-11 17:55:29 +0000764 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000765}
766
pbrook56aebc82008-10-11 17:55:29 +0000767static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000768{
pbrook56aebc82008-10-11 17:55:29 +0000769#if defined(TARGET_ABI32)
770 abi_ulong tmp;
771
772 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000773#else
pbrook56aebc82008-10-11 17:55:29 +0000774 target_ulong tmp;
775
776 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000777#endif
bellarde95c8d52004-09-30 22:22:08 +0000778
pbrook56aebc82008-10-11 17:55:29 +0000779 if (n < 8) {
780 /* g0..g7 */
781 env->gregs[n] = tmp;
782 } else if (n < 32) {
783 /* register window */
784 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000785 }
pbrook56aebc82008-10-11 17:55:29 +0000786#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
787 else if (n < 64) {
788 /* fprs */
789 *((uint32_t *)&env->fpr[n - 32]) = tmp;
790 } else {
791 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
792 switch (n) {
793 case 64: env->y = tmp; break;
794 case 65: PUT_PSR(env, tmp); break;
795 case 66: env->wim = tmp; break;
796 case 67: env->tbr = tmp; break;
797 case 68: env->pc = tmp; break;
798 case 69: env->npc = tmp; break;
799 case 70: env->fsr = tmp; break;
800 default: return 0;
801 }
bellarde95c8d52004-09-30 22:22:08 +0000802 }
pbrook56aebc82008-10-11 17:55:29 +0000803 return 4;
bellard34751872005-07-02 14:31:34 +0000804#else
pbrook56aebc82008-10-11 17:55:29 +0000805 else if (n < 64) {
806 /* f0-f31 */
pbrook56aebc82008-10-11 17:55:29 +0000807 env->fpr[n] = ldfl_p(mem_buf);
808 return 4;
809 } else if (n < 80) {
810 /* f32-f62 (double width, even numbers only) */
811 *((uint32_t *)&env->fpr[(n - 64) * 2 + 32]) = tmp >> 32;
812 *((uint32_t *)&env->fpr[(n - 64) * 2 + 33]) = tmp;
813 } else {
814 switch (n) {
815 case 80: env->pc = tmp; break;
816 case 81: env->npc = tmp; break;
817 case 82:
818 PUT_CCR(env, tmp >> 32);
819 env->asi = (tmp >> 24) & 0xff;
820 env->pstate = (tmp >> 8) & 0xfff;
821 PUT_CWP64(env, tmp & 0xff);
822 break;
823 case 83: env->fsr = tmp; break;
824 case 84: env->fprs = tmp; break;
825 case 85: env->y = tmp; break;
826 default: return 0;
827 }
bellard34751872005-07-02 14:31:34 +0000828 }
pbrook56aebc82008-10-11 17:55:29 +0000829 return 8;
bellard34751872005-07-02 14:31:34 +0000830#endif
bellard9e62fd72004-01-05 22:49:06 +0000831}
bellard1fddef42005-04-17 19:16:13 +0000832#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000833
834/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
835 whatever the target description contains. Due to a historical mishap
836 the FPA registers appear in between core integer regs and the CPSR.
837 We hack round this by giving the FPA regs zero size when talking to a
838 newer gdb. */
839#define NUM_CORE_REGS 26
840#define GDB_CORE_XML "arm-core.xml"
841
842static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000843{
pbrook56aebc82008-10-11 17:55:29 +0000844 if (n < 16) {
845 /* Core integer register. */
846 GET_REG32(env->regs[n]);
847 }
848 if (n < 24) {
849 /* FPA registers. */
850 if (gdb_has_xml)
851 return 0;
852 memset(mem_buf, 0, 12);
853 return 12;
854 }
855 switch (n) {
856 case 24:
857 /* FPA status register. */
858 if (gdb_has_xml)
859 return 0;
860 GET_REG32(0);
861 case 25:
862 /* CPSR */
863 GET_REG32(cpsr_read(env));
864 }
865 /* Unknown register. */
866 return 0;
bellard1fddef42005-04-17 19:16:13 +0000867}
868
pbrook56aebc82008-10-11 17:55:29 +0000869static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000870{
pbrook56aebc82008-10-11 17:55:29 +0000871 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000872
pbrook56aebc82008-10-11 17:55:29 +0000873 tmp = ldl_p(mem_buf);
874
875 /* Mask out low bit of PC to workaround gdb bugs. This will probably
876 cause problems if we ever implement the Jazelle DBX extensions. */
877 if (n == 15)
878 tmp &= ~1;
879
880 if (n < 16) {
881 /* Core integer register. */
882 env->regs[n] = tmp;
883 return 4;
884 }
885 if (n < 24) { /* 16-23 */
886 /* FPA registers (ignored). */
887 if (gdb_has_xml)
888 return 0;
889 return 12;
890 }
891 switch (n) {
892 case 24:
893 /* FPA status register (ignored). */
894 if (gdb_has_xml)
895 return 0;
896 return 4;
897 case 25:
898 /* CPSR */
899 cpsr_write (env, tmp, 0xffffffff);
900 return 4;
901 }
902 /* Unknown register. */
903 return 0;
bellard1fddef42005-04-17 19:16:13 +0000904}
pbrook56aebc82008-10-11 17:55:29 +0000905
pbrooke6e59062006-10-22 00:18:54 +0000906#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +0000907
908#define NUM_CORE_REGS 18
909
910#define GDB_CORE_XML "cf-core.xml"
911
912static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000913{
pbrook56aebc82008-10-11 17:55:29 +0000914 if (n < 8) {
915 /* D0-D7 */
916 GET_REG32(env->dregs[n]);
917 } else if (n < 16) {
918 /* A0-A7 */
919 GET_REG32(env->aregs[n - 8]);
920 } else {
921 switch (n) {
922 case 16: GET_REG32(env->sr);
923 case 17: GET_REG32(env->pc);
924 }
pbrooke6e59062006-10-22 00:18:54 +0000925 }
pbrook56aebc82008-10-11 17:55:29 +0000926 /* FP registers not included here because they vary between
927 ColdFire and m68k. Use XML bits for these. */
928 return 0;
pbrooke6e59062006-10-22 00:18:54 +0000929}
930
pbrook56aebc82008-10-11 17:55:29 +0000931static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000932{
pbrook56aebc82008-10-11 17:55:29 +0000933 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +0000934
pbrook56aebc82008-10-11 17:55:29 +0000935 tmp = ldl_p(mem_buf);
936
937 if (n < 8) {
938 /* D0-D7 */
939 env->dregs[n] = tmp;
940 } else if (n < 8) {
941 /* A0-A7 */
942 env->aregs[n - 8] = tmp;
943 } else {
944 switch (n) {
945 case 16: env->sr = tmp; break;
946 case 17: env->pc = tmp; break;
947 default: return 0;
948 }
pbrooke6e59062006-10-22 00:18:54 +0000949 }
pbrook56aebc82008-10-11 17:55:29 +0000950 return 4;
pbrooke6e59062006-10-22 00:18:54 +0000951}
bellard6f970bd2005-12-05 19:55:19 +0000952#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +0000953
954#define NUM_CORE_REGS 73
955
956static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000957{
pbrook56aebc82008-10-11 17:55:29 +0000958 if (n < 32) {
959 GET_REGL(env->active_tc.gpr[n]);
960 }
961 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
962 if (n >= 38 && n < 70) {
ths7ac256b2007-10-25 21:30:37 +0000963 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +0000964 GET_REGL(env->active_fpu.fpr[n - 38].d);
ths7ac256b2007-10-25 21:30:37 +0000965 else
pbrook56aebc82008-10-11 17:55:29 +0000966 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
967 }
968 switch (n) {
969 case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
970 case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
971 }
972 }
973 switch (n) {
974 case 32: GET_REGL((int32_t)env->CP0_Status);
975 case 33: GET_REGL(env->active_tc.LO[0]);
976 case 34: GET_REGL(env->active_tc.HI[0]);
977 case 35: GET_REGL(env->CP0_BadVAddr);
978 case 36: GET_REGL((int32_t)env->CP0_Cause);
979 case 37: GET_REGL(env->active_tc.PC);
980 case 72: GET_REGL(0); /* fp */
981 case 89: GET_REGL((int32_t)env->CP0_PRid);
982 }
983 if (n >= 73 && n <= 88) {
984 /* 16 embedded regs. */
985 GET_REGL(0);
986 }
ths36d23952007-02-28 22:37:42 +0000987
pbrook56aebc82008-10-11 17:55:29 +0000988 return 0;
bellard6f970bd2005-12-05 19:55:19 +0000989}
990
ths8e33c082006-12-11 19:22:27 +0000991/* convert MIPS rounding mode in FCR31 to IEEE library */
992static unsigned int ieee_rm[] =
993 {
994 float_round_nearest_even,
995 float_round_to_zero,
996 float_round_up,
997 float_round_down
998 };
999#define RESTORE_ROUNDING_MODE \
thsf01be152008-09-18 11:57:27 +00001000 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +00001001
pbrook56aebc82008-10-11 17:55:29 +00001002static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001003{
pbrook56aebc82008-10-11 17:55:29 +00001004 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +00001005
pbrook56aebc82008-10-11 17:55:29 +00001006 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001007
pbrook56aebc82008-10-11 17:55:29 +00001008 if (n < 32) {
1009 env->active_tc.gpr[n] = tmp;
1010 return sizeof(target_ulong);
1011 }
1012 if (env->CP0_Config1 & (1 << CP0C1_FP)
1013 && n >= 38 && n < 73) {
1014 if (n < 70) {
ths7ac256b2007-10-25 21:30:37 +00001015 if (env->CP0_Status & (1 << CP0St_FR))
pbrook56aebc82008-10-11 17:55:29 +00001016 env->active_fpu.fpr[n - 38].d = tmp;
ths7ac256b2007-10-25 21:30:37 +00001017 else
pbrook56aebc82008-10-11 17:55:29 +00001018 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1019 }
1020 switch (n) {
1021 case 70:
1022 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1023 /* set rounding mode */
1024 RESTORE_ROUNDING_MODE;
ths8e33c082006-12-11 19:22:27 +00001025#ifndef CONFIG_SOFTFLOAT
pbrook56aebc82008-10-11 17:55:29 +00001026 /* no floating point exception for native float */
1027 SET_FP_ENABLE(env->active_fpu.fcr31, 0);
ths8e33c082006-12-11 19:22:27 +00001028#endif
pbrook56aebc82008-10-11 17:55:29 +00001029 break;
1030 case 71: env->active_fpu.fcr0 = tmp; break;
1031 }
1032 return sizeof(target_ulong);
1033 }
1034 switch (n) {
1035 case 32: env->CP0_Status = tmp; break;
1036 case 33: env->active_tc.LO[0] = tmp; break;
1037 case 34: env->active_tc.HI[0] = tmp; break;
1038 case 35: env->CP0_BadVAddr = tmp; break;
1039 case 36: env->CP0_Cause = tmp; break;
1040 case 37: env->active_tc.PC = tmp; break;
1041 case 72: /* fp, ignored */ break;
1042 default:
1043 if (n > 89)
1044 return 0;
1045 /* Other registers are readonly. Ignore writes. */
1046 break;
1047 }
1048
1049 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001050}
bellardfdf9b3e2006-04-27 21:07:38 +00001051#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001052
1053/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001054/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001055
pbrook56aebc82008-10-11 17:55:29 +00001056#define NUM_CORE_REGS 59
1057
1058static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001059{
pbrook56aebc82008-10-11 17:55:29 +00001060 if (n < 8) {
1061 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1062 GET_REGL(env->gregs[n + 16]);
1063 } else {
1064 GET_REGL(env->gregs[n]);
1065 }
1066 } else if (n < 16) {
1067 GET_REGL(env->gregs[n - 8]);
1068 } else if (n >= 25 && n < 41) {
1069 GET_REGL(env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)]);
1070 } else if (n >= 43 && n < 51) {
1071 GET_REGL(env->gregs[n - 43]);
1072 } else if (n >= 51 && n < 59) {
1073 GET_REGL(env->gregs[n - (51 - 16)]);
1074 }
1075 switch (n) {
1076 case 16: GET_REGL(env->pc);
1077 case 17: GET_REGL(env->pr);
1078 case 18: GET_REGL(env->gbr);
1079 case 19: GET_REGL(env->vbr);
1080 case 20: GET_REGL(env->mach);
1081 case 21: GET_REGL(env->macl);
1082 case 22: GET_REGL(env->sr);
1083 case 23: GET_REGL(env->fpul);
1084 case 24: GET_REGL(env->fpscr);
1085 case 41: GET_REGL(env->ssr);
1086 case 42: GET_REGL(env->spc);
1087 }
bellardfdf9b3e2006-04-27 21:07:38 +00001088
pbrook56aebc82008-10-11 17:55:29 +00001089 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001090}
1091
pbrook56aebc82008-10-11 17:55:29 +00001092static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001093{
pbrook56aebc82008-10-11 17:55:29 +00001094 uint32_t tmp;
bellardfdf9b3e2006-04-27 21:07:38 +00001095
pbrook56aebc82008-10-11 17:55:29 +00001096 tmp = ldl_p(mem_buf);
1097
1098 if (n < 8) {
1099 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1100 env->gregs[n + 16] = tmp;
1101 } else {
1102 env->gregs[n] = tmp;
1103 }
1104 return 4;
1105 } else if (n < 16) {
1106 env->gregs[n - 8] = tmp;
1107 return 4;
1108 } else if (n >= 25 && n < 41) {
1109 env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)] = tmp;
1110 } else if (n >= 43 && n < 51) {
1111 env->gregs[n - 43] = tmp;
1112 return 4;
1113 } else if (n >= 51 && n < 59) {
1114 env->gregs[n - (51 - 16)] = tmp;
1115 return 4;
1116 }
1117 switch (n) {
1118 case 16: env->pc = tmp;
1119 case 17: env->pr = tmp;
1120 case 18: env->gbr = tmp;
1121 case 19: env->vbr = tmp;
1122 case 20: env->mach = tmp;
1123 case 21: env->macl = tmp;
1124 case 22: env->sr = tmp;
1125 case 23: env->fpul = tmp;
1126 case 24: env->fpscr = tmp;
1127 case 41: env->ssr = tmp;
1128 case 42: env->spc = tmp;
1129 default: return 0;
1130 }
1131
1132 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001133}
thsf1ccf902007-10-08 13:16:14 +00001134#elif defined (TARGET_CRIS)
1135
pbrook56aebc82008-10-11 17:55:29 +00001136#define NUM_CORE_REGS 49
1137
1138static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001139{
pbrook56aebc82008-10-11 17:55:29 +00001140 uint8_t srs;
1141
1142 srs = env->pregs[PR_SRS];
1143 if (n < 16) {
1144 GET_REG32(env->regs[n]);
1145 }
1146
1147 if (n >= 21 && n < 32) {
1148 GET_REG32(env->pregs[n - 16]);
1149 }
1150 if (n >= 33 && n < 49) {
1151 GET_REG32(env->sregs[srs][n - 33]);
1152 }
1153 switch (n) {
1154 case 16: GET_REG8(env->pregs[0]);
1155 case 17: GET_REG8(env->pregs[1]);
1156 case 18: GET_REG32(env->pregs[2]);
1157 case 19: GET_REG8(srs);
1158 case 20: GET_REG16(env->pregs[4]);
1159 case 32: GET_REG32(env->pc);
1160 }
1161
1162 return 0;
thsf1ccf902007-10-08 13:16:14 +00001163}
1164
pbrook56aebc82008-10-11 17:55:29 +00001165static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001166{
pbrook56aebc82008-10-11 17:55:29 +00001167 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001168
pbrook56aebc82008-10-11 17:55:29 +00001169 if (n > 49)
1170 return 0;
thsf1ccf902007-10-08 13:16:14 +00001171
pbrook56aebc82008-10-11 17:55:29 +00001172 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001173
pbrook56aebc82008-10-11 17:55:29 +00001174 if (n < 16) {
1175 env->regs[n] = tmp;
1176 }
thsf1ccf902007-10-08 13:16:14 +00001177
edgar_igld7b69672008-10-11 19:32:21 +00001178 if (n >= 21 && n < 32) {
1179 env->pregs[n - 16] = tmp;
1180 }
1181
1182 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001183 switch (n) {
1184 case 16: return 1;
1185 case 17: return 1;
edgar_igld7b69672008-10-11 19:32:21 +00001186 case 18: env->pregs[PR_PID] = tmp; break;
pbrook56aebc82008-10-11 17:55:29 +00001187 case 19: return 1;
1188 case 20: return 2;
1189 case 32: env->pc = tmp; break;
1190 }
thsf1ccf902007-10-08 13:16:14 +00001191
pbrook56aebc82008-10-11 17:55:29 +00001192 return 4;
thsf1ccf902007-10-08 13:16:14 +00001193}
aurel3219bf5172008-12-07 23:26:32 +00001194#elif defined (TARGET_ALPHA)
1195
1196#define NUM_CORE_REGS 65
1197
1198static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1199{
1200 if (n < 31) {
1201 GET_REGL(env->ir[n]);
1202 }
1203 else if (n == 31) {
1204 GET_REGL(0);
1205 }
1206 else if (n<63) {
1207 uint64_t val;
1208
1209 val=*((uint64_t *)&env->fir[n-32]);
1210 GET_REGL(val);
1211 }
1212 else if (n==63) {
1213 GET_REGL(env->fpcr);
1214 }
1215 else if (n==64) {
1216 GET_REGL(env->pc);
1217 }
1218 else {
1219 GET_REGL(0);
1220 }
1221
1222 return 0;
1223}
1224
1225static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1226{
1227 target_ulong tmp;
1228 tmp = ldtul_p(mem_buf);
1229
1230 if (n < 31) {
1231 env->ir[n] = tmp;
1232 }
1233
1234 if (n > 31 && n < 63) {
1235 env->fir[n - 32] = ldfl_p(mem_buf);
1236 }
1237
1238 if (n == 64 ) {
1239 env->pc=tmp;
1240 }
1241
1242 return 8;
1243}
bellard1fddef42005-04-17 19:16:13 +00001244#else
pbrook56aebc82008-10-11 17:55:29 +00001245
1246#define NUM_CORE_REGS 0
1247
1248static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001249{
1250 return 0;
1251}
1252
pbrook56aebc82008-10-11 17:55:29 +00001253static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001254{
pbrook56aebc82008-10-11 17:55:29 +00001255 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001256}
1257
1258#endif
bellardb4608c02003-06-27 17:34:32 +00001259
pbrook56aebc82008-10-11 17:55:29 +00001260static int num_g_regs = NUM_CORE_REGS;
1261
1262#ifdef GDB_CORE_XML
1263/* Encode data using the encoding for 'x' packets. */
1264static int memtox(char *buf, const char *mem, int len)
1265{
1266 char *p = buf;
1267 char c;
1268
1269 while (len--) {
1270 c = *(mem++);
1271 switch (c) {
1272 case '#': case '$': case '*': case '}':
1273 *(p++) = '}';
1274 *(p++) = c ^ 0x20;
1275 break;
1276 default:
1277 *(p++) = c;
1278 break;
1279 }
1280 }
1281 return p - buf;
1282}
1283
aurel323faf7782008-12-07 23:26:17 +00001284static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001285{
1286 extern const char *const xml_builtin[][2];
1287 size_t len;
1288 int i;
1289 const char *name;
1290 static char target_xml[1024];
1291
1292 len = 0;
1293 while (p[len] && p[len] != ':')
1294 len++;
1295 *newp = p + len;
1296
1297 name = NULL;
1298 if (strncmp(p, "target.xml", len) == 0) {
1299 /* Generate the XML description for this CPU. */
1300 if (!target_xml[0]) {
1301 GDBRegisterState *r;
1302
blueswir15b3715b2008-10-25 11:18:12 +00001303 snprintf(target_xml, sizeof(target_xml),
1304 "<?xml version=\"1.0\"?>"
1305 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1306 "<target>"
1307 "<xi:include href=\"%s\"/>",
1308 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001309
aliguori880a7572008-11-18 20:30:24 +00001310 for (r = first_cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001311 strcat(target_xml, "<xi:include href=\"");
1312 strcat(target_xml, r->xml);
1313 strcat(target_xml, "\"/>");
1314 }
1315 strcat(target_xml, "</target>");
1316 }
1317 return target_xml;
1318 }
1319 for (i = 0; ; i++) {
1320 name = xml_builtin[i][0];
1321 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1322 break;
1323 }
1324 return name ? xml_builtin[i][1] : NULL;
1325}
1326#endif
1327
1328static int gdb_read_register(CPUState *env, uint8_t *mem_buf, int reg)
1329{
1330 GDBRegisterState *r;
1331
1332 if (reg < NUM_CORE_REGS)
1333 return cpu_gdb_read_register(env, mem_buf, reg);
1334
1335 for (r = env->gdb_regs; r; r = r->next) {
1336 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1337 return r->get_reg(env, mem_buf, reg - r->base_reg);
1338 }
1339 }
1340 return 0;
1341}
1342
1343static int gdb_write_register(CPUState *env, uint8_t *mem_buf, int reg)
1344{
1345 GDBRegisterState *r;
1346
1347 if (reg < NUM_CORE_REGS)
1348 return cpu_gdb_write_register(env, mem_buf, reg);
1349
1350 for (r = env->gdb_regs; r; r = r->next) {
1351 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1352 return r->set_reg(env, mem_buf, reg - r->base_reg);
1353 }
1354 }
1355 return 0;
1356}
1357
1358/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1359 specifies the first register number and these registers are included in
1360 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1361 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1362 */
1363
1364void gdb_register_coprocessor(CPUState * env,
1365 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1366 int num_regs, const char *xml, int g_pos)
1367{
1368 GDBRegisterState *s;
1369 GDBRegisterState **p;
1370 static int last_reg = NUM_CORE_REGS;
1371
1372 s = (GDBRegisterState *)qemu_mallocz(sizeof(GDBRegisterState));
1373 s->base_reg = last_reg;
1374 s->num_regs = num_regs;
1375 s->get_reg = get_reg;
1376 s->set_reg = set_reg;
1377 s->xml = xml;
1378 p = &env->gdb_regs;
1379 while (*p) {
1380 /* Check for duplicates. */
1381 if (strcmp((*p)->xml, xml) == 0)
1382 return;
1383 p = &(*p)->next;
1384 }
1385 /* Add to end of list. */
1386 last_reg += num_regs;
1387 *p = s;
1388 if (g_pos) {
1389 if (g_pos != s->base_reg) {
1390 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1391 "Expected %d got %d\n", xml, g_pos, s->base_reg);
1392 } else {
1393 num_g_regs = last_reg;
1394 }
1395 }
1396}
1397
aliguoria1d1bb32008-11-18 20:07:32 +00001398/* GDB breakpoint/watchpoint types */
1399#define GDB_BREAKPOINT_SW 0
1400#define GDB_BREAKPOINT_HW 1
1401#define GDB_WATCHPOINT_WRITE 2
1402#define GDB_WATCHPOINT_READ 3
1403#define GDB_WATCHPOINT_ACCESS 4
1404
1405#ifndef CONFIG_USER_ONLY
1406static const int xlat_gdb_type[] = {
1407 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1408 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1409 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1410};
1411#endif
1412
aliguori880a7572008-11-18 20:30:24 +00001413static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001414{
aliguori880a7572008-11-18 20:30:24 +00001415 CPUState *env;
1416 int err = 0;
1417
aliguoria1d1bb32008-11-18 20:07:32 +00001418 switch (type) {
1419 case GDB_BREAKPOINT_SW:
1420 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001421 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1422 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1423 if (err)
1424 break;
1425 }
1426 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001427#ifndef CONFIG_USER_ONLY
1428 case GDB_WATCHPOINT_WRITE:
1429 case GDB_WATCHPOINT_READ:
1430 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001431 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1432 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1433 NULL);
1434 if (err)
1435 break;
1436 }
1437 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001438#endif
1439 default:
1440 return -ENOSYS;
1441 }
1442}
1443
aliguori880a7572008-11-18 20:30:24 +00001444static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001445{
aliguori880a7572008-11-18 20:30:24 +00001446 CPUState *env;
1447 int err = 0;
1448
aliguoria1d1bb32008-11-18 20:07:32 +00001449 switch (type) {
1450 case GDB_BREAKPOINT_SW:
1451 case GDB_BREAKPOINT_HW:
aliguori880a7572008-11-18 20:30:24 +00001452 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1453 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1454 if (err)
1455 break;
1456 }
1457 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001458#ifndef CONFIG_USER_ONLY
1459 case GDB_WATCHPOINT_WRITE:
1460 case GDB_WATCHPOINT_READ:
1461 case GDB_WATCHPOINT_ACCESS:
aliguori880a7572008-11-18 20:30:24 +00001462 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1463 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1464 if (err)
1465 break;
1466 }
1467 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001468#endif
1469 default:
1470 return -ENOSYS;
1471 }
1472}
1473
aliguori880a7572008-11-18 20:30:24 +00001474static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001475{
aliguori880a7572008-11-18 20:30:24 +00001476 CPUState *env;
1477
1478 for (env = first_cpu; env != NULL; env = env->next_cpu) {
1479 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001480#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001481 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001482#endif
aliguori880a7572008-11-18 20:30:24 +00001483 }
aliguoria1d1bb32008-11-18 20:07:32 +00001484}
1485
aliguori880a7572008-11-18 20:30:24 +00001486static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001487{
aliguori880a7572008-11-18 20:30:24 +00001488 CPUState *env;
bellardb4608c02003-06-27 17:34:32 +00001489 const char *p;
aliguori880a7572008-11-18 20:30:24 +00001490 int ch, reg_size, type, res, thread;
pbrook56aebc82008-10-11 17:55:29 +00001491 char buf[MAX_PACKET_LENGTH];
1492 uint8_t mem_buf[MAX_PACKET_LENGTH];
1493 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001494 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001495
bellard858693c2004-03-31 18:52:07 +00001496#ifdef DEBUG_GDB
1497 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001498#endif
bellard858693c2004-03-31 18:52:07 +00001499 p = line_buf;
1500 ch = *p++;
1501 switch(ch) {
1502 case '?':
bellard1fddef42005-04-17 19:16:13 +00001503 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001504 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
aliguori880a7572008-11-18 20:30:24 +00001505 s->c_cpu->cpu_index+1);
bellard858693c2004-03-31 18:52:07 +00001506 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001507 /* Remove all the breakpoints when this query is issued,
1508 * because gdb is doing and initial connect and the state
1509 * should be cleaned up.
1510 */
aliguori880a7572008-11-18 20:30:24 +00001511 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001512 break;
1513 case 'c':
1514 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001515 addr = strtoull(p, (char **)&p, 16);
bellardc33a3462003-07-29 20:50:33 +00001516#if defined(TARGET_I386)
aliguori880a7572008-11-18 20:30:24 +00001517 s->c_cpu->eip = addr;
bellard5be1a8e2004-01-04 23:51:58 +00001518#elif defined (TARGET_PPC)
aliguori880a7572008-11-18 20:30:24 +00001519 s->c_cpu->nip = addr;
bellard8d5f07f2004-10-04 21:23:09 +00001520#elif defined (TARGET_SPARC)
aliguori880a7572008-11-18 20:30:24 +00001521 s->c_cpu->pc = addr;
1522 s->c_cpu->npc = addr + 4;
bellardb5ff1b32005-11-26 10:38:39 +00001523#elif defined (TARGET_ARM)
aliguori880a7572008-11-18 20:30:24 +00001524 s->c_cpu->regs[15] = addr;
bellardfdf9b3e2006-04-27 21:07:38 +00001525#elif defined (TARGET_SH4)
aliguori880a7572008-11-18 20:30:24 +00001526 s->c_cpu->pc = addr;
ths8fac5802007-07-12 10:05:07 +00001527#elif defined (TARGET_MIPS)
aliguori880a7572008-11-18 20:30:24 +00001528 s->c_cpu->active_tc.PC = addr;
thsf1ccf902007-10-08 13:16:14 +00001529#elif defined (TARGET_CRIS)
aliguori880a7572008-11-18 20:30:24 +00001530 s->c_cpu->pc = addr;
aurel3219bf5172008-12-07 23:26:32 +00001531#elif defined (TARGET_ALPHA)
1532 s->c_cpu->pc = addr;
bellardc33a3462003-07-29 20:50:33 +00001533#endif
bellard858693c2004-03-31 18:52:07 +00001534 }
aurel32ca587a82008-12-18 22:44:13 +00001535 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001536 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001537 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001538 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001539 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1540 if (s->signal == -1)
1541 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001542 gdb_continue(s);
1543 return RS_IDLE;
edgar_igl7d03f822008-05-17 18:58:29 +00001544 case 'k':
1545 /* Kill the target */
1546 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1547 exit(0);
1548 case 'D':
1549 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00001550 gdb_breakpoint_remove_all();
edgar_igl7d03f822008-05-17 18:58:29 +00001551 gdb_continue(s);
1552 put_packet(s, "OK");
1553 break;
bellard858693c2004-03-31 18:52:07 +00001554 case 's':
1555 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00001556 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001557#if defined(TARGET_I386)
aliguori880a7572008-11-18 20:30:24 +00001558 s->c_cpu->eip = addr;
bellard858693c2004-03-31 18:52:07 +00001559#elif defined (TARGET_PPC)
aliguori880a7572008-11-18 20:30:24 +00001560 s->c_cpu->nip = addr;
bellard8d5f07f2004-10-04 21:23:09 +00001561#elif defined (TARGET_SPARC)
aliguori880a7572008-11-18 20:30:24 +00001562 s->c_cpu->pc = addr;
1563 s->c_cpu->npc = addr + 4;
bellardb5ff1b32005-11-26 10:38:39 +00001564#elif defined (TARGET_ARM)
aliguori880a7572008-11-18 20:30:24 +00001565 s->c_cpu->regs[15] = addr;
bellardfdf9b3e2006-04-27 21:07:38 +00001566#elif defined (TARGET_SH4)
aliguori880a7572008-11-18 20:30:24 +00001567 s->c_cpu->pc = addr;
ths8fac5802007-07-12 10:05:07 +00001568#elif defined (TARGET_MIPS)
aliguori880a7572008-11-18 20:30:24 +00001569 s->c_cpu->active_tc.PC = addr;
thsf1ccf902007-10-08 13:16:14 +00001570#elif defined (TARGET_CRIS)
aliguori880a7572008-11-18 20:30:24 +00001571 s->c_cpu->pc = addr;
aurel3219bf5172008-12-07 23:26:32 +00001572#elif defined (TARGET_ALPHA)
1573 s->c_cpu->pc = addr;
bellard858693c2004-03-31 18:52:07 +00001574#endif
1575 }
aliguori880a7572008-11-18 20:30:24 +00001576 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00001577 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001578 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00001579 case 'F':
1580 {
1581 target_ulong ret;
1582 target_ulong err;
1583
1584 ret = strtoull(p, (char **)&p, 16);
1585 if (*p == ',') {
1586 p++;
1587 err = strtoull(p, (char **)&p, 16);
1588 } else {
1589 err = 0;
1590 }
1591 if (*p == ',')
1592 p++;
1593 type = *p;
1594 if (gdb_current_syscall_cb)
aliguori880a7572008-11-18 20:30:24 +00001595 gdb_current_syscall_cb(s->c_cpu, ret, err);
pbrooka2d1eba2007-01-28 03:10:55 +00001596 if (type == 'C') {
1597 put_packet(s, "T02");
1598 } else {
edgar_iglba70a622008-03-14 06:10:42 +00001599 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00001600 }
1601 }
1602 break;
bellard858693c2004-03-31 18:52:07 +00001603 case 'g':
pbrook56aebc82008-10-11 17:55:29 +00001604 len = 0;
1605 for (addr = 0; addr < num_g_regs; addr++) {
aliguori880a7572008-11-18 20:30:24 +00001606 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00001607 len += reg_size;
1608 }
1609 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00001610 put_packet(s, buf);
1611 break;
1612 case 'G':
pbrook56aebc82008-10-11 17:55:29 +00001613 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00001614 len = strlen(p) / 2;
1615 hextomem((uint8_t *)registers, p, len);
pbrook56aebc82008-10-11 17:55:29 +00001616 for (addr = 0; addr < num_g_regs && len > 0; addr++) {
aliguori880a7572008-11-18 20:30:24 +00001617 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00001618 len -= reg_size;
1619 registers += reg_size;
1620 }
bellard858693c2004-03-31 18:52:07 +00001621 put_packet(s, "OK");
1622 break;
1623 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00001624 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001625 if (*p == ',')
1626 p++;
bellard9d9754a2006-06-25 15:32:37 +00001627 len = strtoull(p, NULL, 16);
aliguori880a7572008-11-18 20:30:24 +00001628 if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00001629 put_packet (s, "E14");
1630 } else {
1631 memtohex(buf, mem_buf, len);
1632 put_packet(s, buf);
1633 }
bellard858693c2004-03-31 18:52:07 +00001634 break;
1635 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00001636 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001637 if (*p == ',')
1638 p++;
bellard9d9754a2006-06-25 15:32:37 +00001639 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00001640 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00001641 p++;
1642 hextomem(mem_buf, p, len);
aliguori880a7572008-11-18 20:30:24 +00001643 if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0)
bellard905f20b2005-04-26 21:09:55 +00001644 put_packet(s, "E14");
bellard858693c2004-03-31 18:52:07 +00001645 else
1646 put_packet(s, "OK");
1647 break;
pbrook56aebc82008-10-11 17:55:29 +00001648 case 'p':
1649 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1650 This works, but can be very slow. Anything new enough to
1651 understand XML also knows how to use this properly. */
1652 if (!gdb_has_xml)
1653 goto unknown_command;
1654 addr = strtoull(p, (char **)&p, 16);
aliguori880a7572008-11-18 20:30:24 +00001655 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001656 if (reg_size) {
1657 memtohex(buf, mem_buf, reg_size);
1658 put_packet(s, buf);
1659 } else {
1660 put_packet(s, "E14");
1661 }
1662 break;
1663 case 'P':
1664 if (!gdb_has_xml)
1665 goto unknown_command;
1666 addr = strtoull(p, (char **)&p, 16);
1667 if (*p == '=')
1668 p++;
1669 reg_size = strlen(p) / 2;
1670 hextomem(mem_buf, p, reg_size);
aliguori880a7572008-11-18 20:30:24 +00001671 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001672 put_packet(s, "OK");
1673 break;
bellard858693c2004-03-31 18:52:07 +00001674 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001675 case 'z':
1676 type = strtoul(p, (char **)&p, 16);
1677 if (*p == ',')
1678 p++;
bellard9d9754a2006-06-25 15:32:37 +00001679 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001680 if (*p == ',')
1681 p++;
bellard9d9754a2006-06-25 15:32:37 +00001682 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001683 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001684 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001685 else
aliguori880a7572008-11-18 20:30:24 +00001686 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001687 if (res >= 0)
1688 put_packet(s, "OK");
1689 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001690 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001691 else
1692 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001693 break;
aliguori880a7572008-11-18 20:30:24 +00001694 case 'H':
1695 type = *p++;
1696 thread = strtoull(p, (char **)&p, 16);
1697 if (thread == -1 || thread == 0) {
1698 put_packet(s, "OK");
1699 break;
1700 }
1701 for (env = first_cpu; env != NULL; env = env->next_cpu)
1702 if (env->cpu_index + 1 == thread)
1703 break;
1704 if (env == NULL) {
1705 put_packet(s, "E22");
1706 break;
1707 }
1708 switch (type) {
1709 case 'c':
1710 s->c_cpu = env;
1711 put_packet(s, "OK");
1712 break;
1713 case 'g':
1714 s->g_cpu = env;
1715 put_packet(s, "OK");
1716 break;
1717 default:
1718 put_packet(s, "E22");
1719 break;
1720 }
1721 break;
1722 case 'T':
1723 thread = strtoull(p, (char **)&p, 16);
1724#ifndef CONFIG_USER_ONLY
1725 if (thread > 0 && thread < smp_cpus + 1)
1726#else
1727 if (thread == 1)
1728#endif
1729 put_packet(s, "OK");
1730 else
1731 put_packet(s, "E22");
1732 break;
pbrook978efd62006-06-17 18:30:42 +00001733 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001734 case 'Q':
1735 /* parse any 'q' packets here */
1736 if (!strcmp(p,"qemu.sstepbits")) {
1737 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001738 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1739 SSTEP_ENABLE,
1740 SSTEP_NOIRQ,
1741 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001742 put_packet(s, buf);
1743 break;
1744 } else if (strncmp(p,"qemu.sstep",10) == 0) {
1745 /* Display or change the sstep_flags */
1746 p += 10;
1747 if (*p != '=') {
1748 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001749 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001750 put_packet(s, buf);
1751 break;
1752 }
1753 p++;
1754 type = strtoul(p, (char **)&p, 16);
1755 sstep_flags = type;
1756 put_packet(s, "OK");
1757 break;
aliguori880a7572008-11-18 20:30:24 +00001758 } else if (strcmp(p,"C") == 0) {
1759 /* "Current thread" remains vague in the spec, so always return
1760 * the first CPU (gdb returns the first thread). */
1761 put_packet(s, "QC1");
1762 break;
1763 } else if (strcmp(p,"fThreadInfo") == 0) {
1764 s->query_cpu = first_cpu;
1765 goto report_cpuinfo;
1766 } else if (strcmp(p,"sThreadInfo") == 0) {
1767 report_cpuinfo:
1768 if (s->query_cpu) {
1769 snprintf(buf, sizeof(buf), "m%x", s->query_cpu->cpu_index+1);
1770 put_packet(s, buf);
1771 s->query_cpu = s->query_cpu->next_cpu;
1772 } else
1773 put_packet(s, "l");
1774 break;
1775 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1776 thread = strtoull(p+16, (char **)&p, 16);
1777 for (env = first_cpu; env != NULL; env = env->next_cpu)
1778 if (env->cpu_index + 1 == thread) {
1779 len = snprintf((char *)mem_buf, sizeof(mem_buf),
1780 "CPU#%d [%s]", env->cpu_index,
1781 env->halted ? "halted " : "running");
1782 memtohex(buf, mem_buf, len);
1783 put_packet(s, buf);
1784 break;
1785 }
1786 break;
edgar_igl60897d32008-05-09 08:25:14 +00001787 }
1788#ifdef CONFIG_LINUX_USER
1789 else if (strncmp(p, "Offsets", 7) == 0) {
aliguori880a7572008-11-18 20:30:24 +00001790 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00001791
blueswir1363a37d2008-08-21 17:58:08 +00001792 snprintf(buf, sizeof(buf),
1793 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1794 ";Bss=" TARGET_ABI_FMT_lx,
1795 ts->info->code_offset,
1796 ts->info->data_offset,
1797 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001798 put_packet(s, buf);
1799 break;
1800 }
pbrook978efd62006-06-17 18:30:42 +00001801#endif
pbrook56aebc82008-10-11 17:55:29 +00001802 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00001803 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00001804#ifdef GDB_CORE_XML
1805 strcat(buf, ";qXfer:features:read+");
1806#endif
1807 put_packet(s, buf);
1808 break;
1809 }
1810#ifdef GDB_CORE_XML
1811 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1812 const char *xml;
1813 target_ulong total_len;
1814
1815 gdb_has_xml = 1;
1816 p += 19;
aliguori880a7572008-11-18 20:30:24 +00001817 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00001818 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001819 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001820 put_packet(s, buf);
1821 break;
1822 }
1823
1824 if (*p == ':')
1825 p++;
1826 addr = strtoul(p, (char **)&p, 16);
1827 if (*p == ',')
1828 p++;
1829 len = strtoul(p, (char **)&p, 16);
1830
1831 total_len = strlen(xml);
1832 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001833 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001834 put_packet(s, buf);
1835 break;
1836 }
1837 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1838 len = (MAX_PACKET_LENGTH - 5) / 2;
1839 if (len < total_len - addr) {
1840 buf[0] = 'm';
1841 len = memtox(buf + 1, xml + addr, len);
1842 } else {
1843 buf[0] = 'l';
1844 len = memtox(buf + 1, xml + addr, total_len - addr);
1845 }
1846 put_packet_binary(s, buf, len + 1);
1847 break;
1848 }
1849#endif
1850 /* Unrecognised 'q' command. */
1851 goto unknown_command;
1852
bellard858693c2004-03-31 18:52:07 +00001853 default:
pbrook56aebc82008-10-11 17:55:29 +00001854 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001855 /* put empty packet */
1856 buf[0] = '\0';
1857 put_packet(s, buf);
1858 break;
1859 }
1860 return RS_IDLE;
1861}
1862
aliguori880a7572008-11-18 20:30:24 +00001863void gdb_set_stop_cpu(CPUState *env)
1864{
1865 gdbserver_state->c_cpu = env;
1866 gdbserver_state->g_cpu = env;
1867}
1868
bellard1fddef42005-04-17 19:16:13 +00001869#ifndef CONFIG_USER_ONLY
bellard858693c2004-03-31 18:52:07 +00001870static void gdb_vm_stopped(void *opaque, int reason)
1871{
aliguori880a7572008-11-18 20:30:24 +00001872 GDBState *s = gdbserver_state;
1873 CPUState *env = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001874 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001875 const char *type;
bellard858693c2004-03-31 18:52:07 +00001876 int ret;
1877
pbrooka2d1eba2007-01-28 03:10:55 +00001878 if (s->state == RS_SYSCALL)
1879 return;
1880
bellard858693c2004-03-31 18:52:07 +00001881 /* disable single step if it was enable */
aliguori880a7572008-11-18 20:30:24 +00001882 cpu_single_step(env, 0);
bellard858693c2004-03-31 18:52:07 +00001883
bellarde80cfcf2004-12-19 23:18:01 +00001884 if (reason == EXCP_DEBUG) {
aliguori880a7572008-11-18 20:30:24 +00001885 if (env->watchpoint_hit) {
1886 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001887 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001888 type = "r";
1889 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001890 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001891 type = "a";
1892 break;
1893 default:
1894 type = "";
1895 break;
1896 }
aliguori880a7572008-11-18 20:30:24 +00001897 snprintf(buf, sizeof(buf),
1898 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
aurel32ca587a82008-12-18 22:44:13 +00001899 GDB_SIGNAL_TRAP, env->cpu_index+1, type,
aliguori880a7572008-11-18 20:30:24 +00001900 env->watchpoint_hit->vaddr);
pbrook6658ffb2007-03-16 23:58:11 +00001901 put_packet(s, buf);
aliguori880a7572008-11-18 20:30:24 +00001902 env->watchpoint_hit = NULL;
pbrook6658ffb2007-03-16 23:58:11 +00001903 return;
1904 }
aliguori880a7572008-11-18 20:30:24 +00001905 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00001906 ret = GDB_SIGNAL_TRAP;
bellardbbeb7b52006-04-23 18:42:15 +00001907 } else if (reason == EXCP_INTERRUPT) {
aurel32ca587a82008-12-18 22:44:13 +00001908 ret = GDB_SIGNAL_INT;
bellardbbeb7b52006-04-23 18:42:15 +00001909 } else {
bellard858693c2004-03-31 18:52:07 +00001910 ret = 0;
bellardbbeb7b52006-04-23 18:42:15 +00001911 }
aliguori880a7572008-11-18 20:30:24 +00001912 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, env->cpu_index+1);
bellard858693c2004-03-31 18:52:07 +00001913 put_packet(s, buf);
1914}
bellard1fddef42005-04-17 19:16:13 +00001915#endif
bellard858693c2004-03-31 18:52:07 +00001916
pbrooka2d1eba2007-01-28 03:10:55 +00001917/* Send a gdb syscall request.
1918 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001919 %x - target_ulong argument printed in hex.
1920 %lx - 64-bit argument printed in hex.
1921 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00001922void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00001923{
1924 va_list va;
1925 char buf[256];
1926 char *p;
1927 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001928 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001929 GDBState *s;
1930
aliguori880a7572008-11-18 20:30:24 +00001931 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001932 if (!s)
1933 return;
1934 gdb_current_syscall_cb = cb;
1935 s->state = RS_SYSCALL;
1936#ifndef CONFIG_USER_ONLY
1937 vm_stop(EXCP_DEBUG);
1938#endif
1939 s->state = RS_IDLE;
1940 va_start(va, fmt);
1941 p = buf;
1942 *(p++) = 'F';
1943 while (*fmt) {
1944 if (*fmt == '%') {
1945 fmt++;
1946 switch (*fmt++) {
1947 case 'x':
1948 addr = va_arg(va, target_ulong);
blueswir1363a37d2008-08-21 17:58:08 +00001949 p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001950 break;
pbrooka87295e2007-05-26 15:09:38 +00001951 case 'l':
1952 if (*(fmt++) != 'x')
1953 goto bad_format;
1954 i64 = va_arg(va, uint64_t);
blueswir1363a37d2008-08-21 17:58:08 +00001955 p += snprintf(p, &buf[sizeof(buf)] - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001956 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001957 case 's':
1958 addr = va_arg(va, target_ulong);
blueswir1363a37d2008-08-21 17:58:08 +00001959 p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx "/%x",
1960 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001961 break;
1962 default:
pbrooka87295e2007-05-26 15:09:38 +00001963 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001964 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1965 fmt - 1);
1966 break;
1967 }
1968 } else {
1969 *(p++) = *(fmt++);
1970 }
1971 }
pbrook8a93e022007-08-06 13:19:15 +00001972 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001973 va_end(va);
1974 put_packet(s, buf);
1975#ifdef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001976 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001977#else
aliguori880a7572008-11-18 20:30:24 +00001978 cpu_interrupt(s->c_cpu, CPU_INTERRUPT_EXIT);
pbrooka2d1eba2007-01-28 03:10:55 +00001979#endif
1980}
1981
bellard6a00d602005-11-21 23:25:50 +00001982static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001983{
1984 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001985 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001986
bellard1fddef42005-04-17 19:16:13 +00001987#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001988 if (s->last_packet_len) {
1989 /* Waiting for a response to the last packet. If we see the start
1990 of a new command then abandon the previous response. */
1991 if (ch == '-') {
1992#ifdef DEBUG_GDB
1993 printf("Got NACK, retransmitting\n");
1994#endif
thsffe8ab82007-12-16 03:16:05 +00001995 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001996 }
1997#ifdef DEBUG_GDB
1998 else if (ch == '+')
1999 printf("Got ACK\n");
2000 else
2001 printf("Got '%c' when expecting ACK/NACK\n", ch);
2002#endif
2003 if (ch == '+' || ch == '$')
2004 s->last_packet_len = 0;
2005 if (ch != '$')
2006 return;
2007 }
bellard858693c2004-03-31 18:52:07 +00002008 if (vm_running) {
2009 /* when the CPU is running, we cannot do anything except stop
2010 it when receiving a char */
2011 vm_stop(EXCP_INTERRUPT);
ths5fafdf22007-09-16 21:08:06 +00002012 } else
bellard1fddef42005-04-17 19:16:13 +00002013#endif
bellard41625032005-04-24 10:07:11 +00002014 {
bellard858693c2004-03-31 18:52:07 +00002015 switch(s->state) {
2016 case RS_IDLE:
2017 if (ch == '$') {
2018 s->line_buf_index = 0;
2019 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002020 }
2021 break;
bellard858693c2004-03-31 18:52:07 +00002022 case RS_GETLINE:
2023 if (ch == '#') {
2024 s->state = RS_CHKSUM1;
2025 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2026 s->state = RS_IDLE;
2027 } else {
2028 s->line_buf[s->line_buf_index++] = ch;
2029 }
2030 break;
2031 case RS_CHKSUM1:
2032 s->line_buf[s->line_buf_index] = '\0';
2033 s->line_csum = fromhex(ch) << 4;
2034 s->state = RS_CHKSUM2;
2035 break;
2036 case RS_CHKSUM2:
2037 s->line_csum |= fromhex(ch);
2038 csum = 0;
2039 for(i = 0; i < s->line_buf_index; i++) {
2040 csum += s->line_buf[i];
2041 }
2042 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002043 reply = '-';
2044 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002045 s->state = RS_IDLE;
2046 } else {
ths60fe76f2007-12-16 03:02:09 +00002047 reply = '+';
2048 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002049 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002050 }
bellardb4608c02003-06-27 17:34:32 +00002051 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002052 default:
2053 abort();
bellardb4608c02003-06-27 17:34:32 +00002054 }
2055 }
bellard858693c2004-03-31 18:52:07 +00002056}
2057
bellard1fddef42005-04-17 19:16:13 +00002058#ifdef CONFIG_USER_ONLY
2059int
aurel32ca587a82008-12-18 22:44:13 +00002060gdb_queuesig (void)
2061{
2062 GDBState *s;
2063
2064 s = gdbserver_state;
2065
2066 if (gdbserver_fd < 0 || s->fd < 0)
2067 return 0;
2068 else
2069 return 1;
2070}
2071
2072int
bellard1fddef42005-04-17 19:16:13 +00002073gdb_handlesig (CPUState *env, int sig)
2074{
2075 GDBState *s;
2076 char buf[256];
2077 int n;
2078
aliguori880a7572008-11-18 20:30:24 +00002079 s = gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00002080 if (gdbserver_fd < 0 || s->fd < 0)
2081 return sig;
bellard1fddef42005-04-17 19:16:13 +00002082
2083 /* disable single step if it was enabled */
2084 cpu_single_step(env, 0);
2085 tb_flush(env);
2086
2087 if (sig != 0)
2088 {
aurel32ca587a82008-12-18 22:44:13 +00002089 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb (sig));
bellard1fddef42005-04-17 19:16:13 +00002090 put_packet(s, buf);
2091 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002092 /* put_packet() might have detected that the peer terminated the
2093 connection. */
2094 if (s->fd < 0)
2095 return sig;
bellard1fddef42005-04-17 19:16:13 +00002096
bellard1fddef42005-04-17 19:16:13 +00002097 sig = 0;
2098 s->state = RS_IDLE;
bellard41625032005-04-24 10:07:11 +00002099 s->running_state = 0;
2100 while (s->running_state == 0) {
bellard1fddef42005-04-17 19:16:13 +00002101 n = read (s->fd, buf, 256);
2102 if (n > 0)
2103 {
2104 int i;
2105
2106 for (i = 0; i < n; i++)
bellard6a00d602005-11-21 23:25:50 +00002107 gdb_read_byte (s, buf[i]);
bellard1fddef42005-04-17 19:16:13 +00002108 }
2109 else if (n == 0 || errno != EAGAIN)
2110 {
2111 /* XXX: Connection closed. Should probably wait for annother
2112 connection before continuing. */
2113 return sig;
2114 }
bellard41625032005-04-24 10:07:11 +00002115 }
edgar_igl1f487ee2008-05-17 22:20:53 +00002116 sig = s->signal;
2117 s->signal = 0;
bellard1fddef42005-04-17 19:16:13 +00002118 return sig;
2119}
bellarde9009672005-04-26 20:42:36 +00002120
2121/* Tell the remote gdb that the process has exited. */
2122void gdb_exit(CPUState *env, int code)
2123{
2124 GDBState *s;
2125 char buf[4];
2126
aliguori880a7572008-11-18 20:30:24 +00002127 s = gdbserver_state;
edgar_igl1f487ee2008-05-17 22:20:53 +00002128 if (gdbserver_fd < 0 || s->fd < 0)
2129 return;
bellarde9009672005-04-26 20:42:36 +00002130
2131 snprintf(buf, sizeof(buf), "W%02x", code);
2132 put_packet(s, buf);
2133}
2134
aurel32ca587a82008-12-18 22:44:13 +00002135/* Tell the remote gdb that the process has exited due to SIG. */
2136void gdb_signalled(CPUState *env, int sig)
2137{
2138 GDBState *s;
2139 char buf[4];
2140
2141 s = gdbserver_state;
2142 if (gdbserver_fd < 0 || s->fd < 0)
2143 return;
2144
2145 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb (sig));
2146 put_packet(s, buf);
2147}
bellard1fddef42005-04-17 19:16:13 +00002148
aliguori880a7572008-11-18 20:30:24 +00002149static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002150{
2151 GDBState *s;
2152 struct sockaddr_in sockaddr;
2153 socklen_t len;
2154 int val, fd;
2155
2156 for(;;) {
2157 len = sizeof(sockaddr);
2158 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2159 if (fd < 0 && errno != EINTR) {
2160 perror("accept");
2161 return;
2162 } else if (fd >= 0) {
2163 break;
2164 }
2165 }
2166
2167 /* set short latency */
2168 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00002169 setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
ths3b46e622007-09-17 08:09:54 +00002170
aliguori880a7572008-11-18 20:30:24 +00002171 s = qemu_mallocz(sizeof(GDBState));
2172 if (!s) {
2173 errno = ENOMEM;
2174 perror("accept");
2175 return;
2176 }
2177
bellard1fddef42005-04-17 19:16:13 +00002178 memset (s, 0, sizeof (GDBState));
aliguori880a7572008-11-18 20:30:24 +00002179 s->c_cpu = first_cpu;
2180 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002181 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002182 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002183
aliguori880a7572008-11-18 20:30:24 +00002184 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002185
bellard858693c2004-03-31 18:52:07 +00002186 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002187}
2188
2189static int gdbserver_open(int port)
2190{
2191 struct sockaddr_in sockaddr;
2192 int fd, val, ret;
2193
2194 fd = socket(PF_INET, SOCK_STREAM, 0);
2195 if (fd < 0) {
2196 perror("socket");
2197 return -1;
2198 }
2199
2200 /* allow fast reuse */
2201 val = 1;
bellard8f447cc2006-06-14 15:21:14 +00002202 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002203
2204 sockaddr.sin_family = AF_INET;
2205 sockaddr.sin_port = htons(port);
2206 sockaddr.sin_addr.s_addr = 0;
2207 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2208 if (ret < 0) {
2209 perror("bind");
2210 return -1;
2211 }
2212 ret = listen(fd, 0);
2213 if (ret < 0) {
2214 perror("listen");
2215 return -1;
2216 }
bellard858693c2004-03-31 18:52:07 +00002217 return fd;
2218}
2219
2220int gdbserver_start(int port)
2221{
2222 gdbserver_fd = gdbserver_open(port);
2223 if (gdbserver_fd < 0)
2224 return -1;
2225 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002226 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002227 return 0;
2228}
aurel322b1319c2008-12-18 22:44:04 +00002229
2230/* Disable gdb stub for child processes. */
2231void gdbserver_fork(CPUState *env)
2232{
2233 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002234 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002235 return;
2236 close(s->fd);
2237 s->fd = -1;
2238 cpu_breakpoint_remove_all(env, BP_GDB);
2239 cpu_watchpoint_remove_all(env, BP_GDB);
2240}
pbrook4046d912007-01-28 01:53:16 +00002241#else
thsaa1f17c2007-07-11 22:48:58 +00002242static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002243{
pbrook56aebc82008-10-11 17:55:29 +00002244 /* We can handle an arbitrarily large amount of data.
2245 Pick the maximum packet size, which is as good as anything. */
2246 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002247}
2248
thsaa1f17c2007-07-11 22:48:58 +00002249static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002250{
pbrook4046d912007-01-28 01:53:16 +00002251 int i;
2252
2253 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002254 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002255 }
2256}
2257
2258static void gdb_chr_event(void *opaque, int event)
2259{
2260 switch (event) {
2261 case CHR_EVENT_RESET:
2262 vm_stop(EXCP_INTERRUPT);
pbrook56aebc82008-10-11 17:55:29 +00002263 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002264 break;
2265 default:
2266 break;
2267 }
2268}
2269
pbrookcfc34752007-02-22 01:48:01 +00002270int gdbserver_start(const char *port)
pbrook4046d912007-01-28 01:53:16 +00002271{
2272 GDBState *s;
pbrookcfc34752007-02-22 01:48:01 +00002273 char gdbstub_port_name[128];
2274 int port_num;
2275 char *p;
2276 CharDriverState *chr;
pbrook4046d912007-01-28 01:53:16 +00002277
pbrookcfc34752007-02-22 01:48:01 +00002278 if (!port || !*port)
2279 return -1;
2280
2281 port_num = strtol(port, &p, 10);
2282 if (*p == 0) {
2283 /* A numeric value is interpreted as a port number. */
2284 snprintf(gdbstub_port_name, sizeof(gdbstub_port_name),
2285 "tcp::%d,nowait,nodelay,server", port_num);
2286 port = gdbstub_port_name;
2287 }
2288
aliguori5ccfae12008-10-31 17:31:29 +00002289 chr = qemu_chr_open("gdb", port);
pbrook4046d912007-01-28 01:53:16 +00002290 if (!chr)
2291 return -1;
2292
2293 s = qemu_mallocz(sizeof(GDBState));
2294 if (!s) {
2295 return -1;
2296 }
aliguori880a7572008-11-18 20:30:24 +00002297 s->c_cpu = first_cpu;
2298 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002299 s->chr = chr;
aliguori880a7572008-11-18 20:30:24 +00002300 gdbserver_state = s;
thsaa1f17c2007-07-11 22:48:58 +00002301 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
aliguori880a7572008-11-18 20:30:24 +00002302 gdb_chr_event, NULL);
2303 qemu_add_vm_stop_handler(gdb_vm_stopped, NULL);
pbrook4046d912007-01-28 01:53:16 +00002304 return 0;
2305}
2306#endif