blob: 5a2320420c835e1e4c9746332103b0a557dea64a [file] [log] [blame]
bellardb4608c02003-06-27 17:34:32 +00001/*
2 * gdb server stub
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard34751872005-07-02 14:31:34 +00004 * Copyright (c) 2003-2005 Fabrice Bellard
bellardb4608c02003-06-27 17:34:32 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
Blue Swirl8167ee82009-07-16 20:47:01 +000017 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
bellardb4608c02003-06-27 17:34:32 +000018 */
pbrook978efd62006-06-17 18:30:42 +000019#include "config.h"
pbrook56aebc82008-10-11 17:55:29 +000020#include "qemu-common.h"
bellard1fddef42005-04-17 19:16:13 +000021#ifdef CONFIG_USER_ONLY
22#include <stdlib.h>
23#include <stdio.h>
24#include <stdarg.h>
25#include <string.h>
26#include <errno.h>
27#include <unistd.h>
pbrook978efd62006-06-17 18:30:42 +000028#include <fcntl.h>
bellard1fddef42005-04-17 19:16:13 +000029
30#include "qemu.h"
31#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010032#include "monitor/monitor.h"
Paolo Bonzinidccfcd02013-04-08 16:55:25 +020033#include "sysemu/char.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010034#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010035#include "exec/gdbstub.h"
bellard1fddef42005-04-17 19:16:13 +000036#endif
bellard67b915a2004-03-31 23:37:16 +000037
pbrook56aebc82008-10-11 17:55:29 +000038#define MAX_PACKET_LENGTH 4096
39
Blue Swirl2b41f102011-06-19 20:38:22 +000040#include "cpu.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010041#include "qemu/sockets.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010042#include "sysemu/kvm.h"
Richard Henderson6ee77b12012-08-23 10:44:45 -070043#include "qemu/bitops.h"
aurel32ca587a82008-12-18 22:44:13 +000044
Andreas Färberf3659ee2013-06-27 19:09:09 +020045static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
46 uint8_t *buf, int len, bool is_write)
Fabien Chouteau44520db2011-09-08 12:48:16 +020047{
Andreas Färberf3659ee2013-06-27 19:09:09 +020048 CPUClass *cc = CPU_GET_CLASS(cpu);
49
50 if (cc->memory_rw_debug) {
51 return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
52 }
53 return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
Fabien Chouteau44520db2011-09-08 12:48:16 +020054}
aurel32ca587a82008-12-18 22:44:13 +000055
56enum {
57 GDB_SIGNAL_0 = 0,
58 GDB_SIGNAL_INT = 2,
Jan Kiszka425189a2011-03-22 11:02:09 +010059 GDB_SIGNAL_QUIT = 3,
aurel32ca587a82008-12-18 22:44:13 +000060 GDB_SIGNAL_TRAP = 5,
Jan Kiszka425189a2011-03-22 11:02:09 +010061 GDB_SIGNAL_ABRT = 6,
62 GDB_SIGNAL_ALRM = 14,
63 GDB_SIGNAL_IO = 23,
64 GDB_SIGNAL_XCPU = 24,
aurel32ca587a82008-12-18 22:44:13 +000065 GDB_SIGNAL_UNKNOWN = 143
66};
67
68#ifdef CONFIG_USER_ONLY
69
70/* Map target signal numbers to GDB protocol signal numbers and vice
71 * versa. For user emulation's currently supported systems, we can
72 * assume most signals are defined.
73 */
74
75static int gdb_signal_table[] = {
76 0,
77 TARGET_SIGHUP,
78 TARGET_SIGINT,
79 TARGET_SIGQUIT,
80 TARGET_SIGILL,
81 TARGET_SIGTRAP,
82 TARGET_SIGABRT,
83 -1, /* SIGEMT */
84 TARGET_SIGFPE,
85 TARGET_SIGKILL,
86 TARGET_SIGBUS,
87 TARGET_SIGSEGV,
88 TARGET_SIGSYS,
89 TARGET_SIGPIPE,
90 TARGET_SIGALRM,
91 TARGET_SIGTERM,
92 TARGET_SIGURG,
93 TARGET_SIGSTOP,
94 TARGET_SIGTSTP,
95 TARGET_SIGCONT,
96 TARGET_SIGCHLD,
97 TARGET_SIGTTIN,
98 TARGET_SIGTTOU,
99 TARGET_SIGIO,
100 TARGET_SIGXCPU,
101 TARGET_SIGXFSZ,
102 TARGET_SIGVTALRM,
103 TARGET_SIGPROF,
104 TARGET_SIGWINCH,
105 -1, /* SIGLOST */
106 TARGET_SIGUSR1,
107 TARGET_SIGUSR2,
blueswir1c72d5bf2009-01-15 17:27:45 +0000108#ifdef TARGET_SIGPWR
aurel32ca587a82008-12-18 22:44:13 +0000109 TARGET_SIGPWR,
blueswir1c72d5bf2009-01-15 17:27:45 +0000110#else
111 -1,
112#endif
aurel32ca587a82008-12-18 22:44:13 +0000113 -1, /* SIGPOLL */
114 -1,
115 -1,
116 -1,
117 -1,
118 -1,
119 -1,
120 -1,
121 -1,
122 -1,
123 -1,
124 -1,
blueswir1c72d5bf2009-01-15 17:27:45 +0000125#ifdef __SIGRTMIN
aurel32ca587a82008-12-18 22:44:13 +0000126 __SIGRTMIN + 1,
127 __SIGRTMIN + 2,
128 __SIGRTMIN + 3,
129 __SIGRTMIN + 4,
130 __SIGRTMIN + 5,
131 __SIGRTMIN + 6,
132 __SIGRTMIN + 7,
133 __SIGRTMIN + 8,
134 __SIGRTMIN + 9,
135 __SIGRTMIN + 10,
136 __SIGRTMIN + 11,
137 __SIGRTMIN + 12,
138 __SIGRTMIN + 13,
139 __SIGRTMIN + 14,
140 __SIGRTMIN + 15,
141 __SIGRTMIN + 16,
142 __SIGRTMIN + 17,
143 __SIGRTMIN + 18,
144 __SIGRTMIN + 19,
145 __SIGRTMIN + 20,
146 __SIGRTMIN + 21,
147 __SIGRTMIN + 22,
148 __SIGRTMIN + 23,
149 __SIGRTMIN + 24,
150 __SIGRTMIN + 25,
151 __SIGRTMIN + 26,
152 __SIGRTMIN + 27,
153 __SIGRTMIN + 28,
154 __SIGRTMIN + 29,
155 __SIGRTMIN + 30,
156 __SIGRTMIN + 31,
157 -1, /* SIGCANCEL */
158 __SIGRTMIN,
159 __SIGRTMIN + 32,
160 __SIGRTMIN + 33,
161 __SIGRTMIN + 34,
162 __SIGRTMIN + 35,
163 __SIGRTMIN + 36,
164 __SIGRTMIN + 37,
165 __SIGRTMIN + 38,
166 __SIGRTMIN + 39,
167 __SIGRTMIN + 40,
168 __SIGRTMIN + 41,
169 __SIGRTMIN + 42,
170 __SIGRTMIN + 43,
171 __SIGRTMIN + 44,
172 __SIGRTMIN + 45,
173 __SIGRTMIN + 46,
174 __SIGRTMIN + 47,
175 __SIGRTMIN + 48,
176 __SIGRTMIN + 49,
177 __SIGRTMIN + 50,
178 __SIGRTMIN + 51,
179 __SIGRTMIN + 52,
180 __SIGRTMIN + 53,
181 __SIGRTMIN + 54,
182 __SIGRTMIN + 55,
183 __SIGRTMIN + 56,
184 __SIGRTMIN + 57,
185 __SIGRTMIN + 58,
186 __SIGRTMIN + 59,
187 __SIGRTMIN + 60,
188 __SIGRTMIN + 61,
189 __SIGRTMIN + 62,
190 __SIGRTMIN + 63,
191 __SIGRTMIN + 64,
192 __SIGRTMIN + 65,
193 __SIGRTMIN + 66,
194 __SIGRTMIN + 67,
195 __SIGRTMIN + 68,
196 __SIGRTMIN + 69,
197 __SIGRTMIN + 70,
198 __SIGRTMIN + 71,
199 __SIGRTMIN + 72,
200 __SIGRTMIN + 73,
201 __SIGRTMIN + 74,
202 __SIGRTMIN + 75,
203 __SIGRTMIN + 76,
204 __SIGRTMIN + 77,
205 __SIGRTMIN + 78,
206 __SIGRTMIN + 79,
207 __SIGRTMIN + 80,
208 __SIGRTMIN + 81,
209 __SIGRTMIN + 82,
210 __SIGRTMIN + 83,
211 __SIGRTMIN + 84,
212 __SIGRTMIN + 85,
213 __SIGRTMIN + 86,
214 __SIGRTMIN + 87,
215 __SIGRTMIN + 88,
216 __SIGRTMIN + 89,
217 __SIGRTMIN + 90,
218 __SIGRTMIN + 91,
219 __SIGRTMIN + 92,
220 __SIGRTMIN + 93,
221 __SIGRTMIN + 94,
222 __SIGRTMIN + 95,
223 -1, /* SIGINFO */
224 -1, /* UNKNOWN */
225 -1, /* DEFAULT */
226 -1,
227 -1,
228 -1,
229 -1,
230 -1,
231 -1
blueswir1c72d5bf2009-01-15 17:27:45 +0000232#endif
aurel32ca587a82008-12-18 22:44:13 +0000233};
bellard8f447cc2006-06-14 15:21:14 +0000234#else
aurel32ca587a82008-12-18 22:44:13 +0000235/* In system mode we only need SIGINT and SIGTRAP; other signals
236 are not yet supported. */
237
238enum {
239 TARGET_SIGINT = 2,
240 TARGET_SIGTRAP = 5
241};
242
243static int gdb_signal_table[] = {
244 -1,
245 -1,
246 TARGET_SIGINT,
247 -1,
248 -1,
249 TARGET_SIGTRAP
250};
bellard8f447cc2006-06-14 15:21:14 +0000251#endif
bellardb4608c02003-06-27 17:34:32 +0000252
aurel32ca587a82008-12-18 22:44:13 +0000253#ifdef CONFIG_USER_ONLY
254static int target_signal_to_gdb (int sig)
255{
256 int i;
257 for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
258 if (gdb_signal_table[i] == sig)
259 return i;
260 return GDB_SIGNAL_UNKNOWN;
261}
262#endif
263
264static int gdb_signal_to_target (int sig)
265{
266 if (sig < ARRAY_SIZE (gdb_signal_table))
267 return gdb_signal_table[sig];
268 else
269 return -1;
270}
271
bellard4abe6152003-07-26 18:01:58 +0000272//#define DEBUG_GDB
bellardb4608c02003-06-27 17:34:32 +0000273
pbrook56aebc82008-10-11 17:55:29 +0000274typedef struct GDBRegisterState {
275 int base_reg;
276 int num_regs;
277 gdb_reg_cb get_reg;
278 gdb_reg_cb set_reg;
279 const char *xml;
280 struct GDBRegisterState *next;
281} GDBRegisterState;
282
bellard858693c2004-03-31 18:52:07 +0000283enum RSState {
aliguori36556b22009-03-28 18:05:53 +0000284 RS_INACTIVE,
bellard858693c2004-03-31 18:52:07 +0000285 RS_IDLE,
286 RS_GETLINE,
287 RS_CHKSUM1,
288 RS_CHKSUM2,
289};
bellard858693c2004-03-31 18:52:07 +0000290typedef struct GDBState {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200291 CPUState *c_cpu; /* current CPU for step/continue ops */
292 CPUState *g_cpu; /* current CPU for other ops */
Andreas Färber52f34622013-06-27 13:44:40 +0200293 CPUState *query_cpu; /* for q{f|s}ThreadInfo */
bellard41625032005-04-24 10:07:11 +0000294 enum RSState state; /* parsing state */
pbrook56aebc82008-10-11 17:55:29 +0000295 char line_buf[MAX_PACKET_LENGTH];
bellard858693c2004-03-31 18:52:07 +0000296 int line_buf_index;
297 int line_csum;
pbrook56aebc82008-10-11 17:55:29 +0000298 uint8_t last_packet[MAX_PACKET_LENGTH + 4];
pbrook4046d912007-01-28 01:53:16 +0000299 int last_packet_len;
edgar_igl1f487ee2008-05-17 22:20:53 +0000300 int signal;
bellard41625032005-04-24 10:07:11 +0000301#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000302 int fd;
bellard41625032005-04-24 10:07:11 +0000303 int running_state;
pbrook4046d912007-01-28 01:53:16 +0000304#else
305 CharDriverState *chr;
aliguori8a34a0f2009-03-05 23:01:55 +0000306 CharDriverState *mon_chr;
bellard41625032005-04-24 10:07:11 +0000307#endif
Meador Ingecdb432b2012-03-15 17:49:45 +0000308 char syscall_buf[256];
309 gdb_syscall_complete_cb current_syscall_cb;
bellard858693c2004-03-31 18:52:07 +0000310} GDBState;
bellardb4608c02003-06-27 17:34:32 +0000311
edgar_igl60897d32008-05-09 08:25:14 +0000312/* By default use no IRQs and no timers while single stepping so as to
313 * make single stepping like an ICE HW step.
314 */
315static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
316
aliguori880a7572008-11-18 20:30:24 +0000317static GDBState *gdbserver_state;
318
pbrook56aebc82008-10-11 17:55:29 +0000319/* This is an ugly hack to cope with both new and old gdb.
320 If gdb sends qXfer:features:read then assume we're talking to a newish
321 gdb that understands target descriptions. */
322static int gdb_has_xml;
323
bellard1fddef42005-04-17 19:16:13 +0000324#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000325/* XXX: This is not thread safe. Do we care? */
326static int gdbserver_fd = -1;
327
bellard858693c2004-03-31 18:52:07 +0000328static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000329{
330 uint8_t ch;
331 int ret;
332
333 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000334 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000335 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000336 if (errno == ECONNRESET)
337 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000338 if (errno != EINTR && errno != EAGAIN)
339 return -1;
340 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000341 close(s->fd);
342 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000343 return -1;
344 } else {
345 break;
346 }
347 }
348 return ch;
349}
pbrook4046d912007-01-28 01:53:16 +0000350#endif
bellardb4608c02003-06-27 17:34:32 +0000351
blueswir1654efcf2009-04-18 07:29:59 +0000352static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000353 GDB_SYS_UNKNOWN,
354 GDB_SYS_ENABLED,
355 GDB_SYS_DISABLED,
356} gdb_syscall_mode;
357
358/* If gdb is connected when the first semihosting syscall occurs then use
359 remote gdb syscalls. Otherwise use native file IO. */
360int use_gdb_syscalls(void)
361{
362 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000363 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
364 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000365 }
366 return gdb_syscall_mode == GDB_SYS_ENABLED;
367}
368
edgar_iglba70a622008-03-14 06:10:42 +0000369/* Resume execution. */
370static inline void gdb_continue(GDBState *s)
371{
372#ifdef CONFIG_USER_ONLY
373 s->running_state = 1;
374#else
Paolo Bonzinibc7d0e62013-06-03 17:06:55 +0200375 if (runstate_check(RUN_STATE_GUEST_PANICKED)) {
376 runstate_set(RUN_STATE_DEBUG);
377 }
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200378 if (!runstate_needs_reset()) {
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200379 vm_start();
380 }
edgar_iglba70a622008-03-14 06:10:42 +0000381#endif
382}
383
bellard858693c2004-03-31 18:52:07 +0000384static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000385{
pbrook4046d912007-01-28 01:53:16 +0000386#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000387 int ret;
388
389 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000390 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000391 if (ret < 0) {
392 if (errno != EINTR && errno != EAGAIN)
393 return;
394 } else {
395 buf += ret;
396 len -= ret;
397 }
398 }
pbrook4046d912007-01-28 01:53:16 +0000399#else
Anthony Liguori2cc6e0a2011-08-15 11:17:28 -0500400 qemu_chr_fe_write(s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000401#endif
bellardb4608c02003-06-27 17:34:32 +0000402}
403
404static inline int fromhex(int v)
405{
406 if (v >= '0' && v <= '9')
407 return v - '0';
408 else if (v >= 'A' && v <= 'F')
409 return v - 'A' + 10;
410 else if (v >= 'a' && v <= 'f')
411 return v - 'a' + 10;
412 else
413 return 0;
414}
415
416static inline int tohex(int v)
417{
418 if (v < 10)
419 return v + '0';
420 else
421 return v - 10 + 'a';
422}
423
424static void memtohex(char *buf, const uint8_t *mem, int len)
425{
426 int i, c;
427 char *q;
428 q = buf;
429 for(i = 0; i < len; i++) {
430 c = mem[i];
431 *q++ = tohex(c >> 4);
432 *q++ = tohex(c & 0xf);
433 }
434 *q = '\0';
435}
436
437static void hextomem(uint8_t *mem, const char *buf, int len)
438{
439 int i;
440
441 for(i = 0; i < len; i++) {
442 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
443 buf += 2;
444 }
445}
446
bellardb4608c02003-06-27 17:34:32 +0000447/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000448static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000449{
pbrook56aebc82008-10-11 17:55:29 +0000450 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000451 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000452
bellardb4608c02003-06-27 17:34:32 +0000453 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000454 p = s->last_packet;
455 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000456 memcpy(p, buf, len);
457 p += len;
bellardb4608c02003-06-27 17:34:32 +0000458 csum = 0;
459 for(i = 0; i < len; i++) {
460 csum += buf[i];
461 }
pbrook4046d912007-01-28 01:53:16 +0000462 *(p++) = '#';
463 *(p++) = tohex((csum >> 4) & 0xf);
464 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000465
pbrook4046d912007-01-28 01:53:16 +0000466 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000467 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000468
pbrook4046d912007-01-28 01:53:16 +0000469#ifdef CONFIG_USER_ONLY
470 i = get_char(s);
471 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000472 return -1;
pbrook4046d912007-01-28 01:53:16 +0000473 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000474 break;
pbrook4046d912007-01-28 01:53:16 +0000475#else
476 break;
477#endif
bellardb4608c02003-06-27 17:34:32 +0000478 }
479 return 0;
480}
481
pbrook56aebc82008-10-11 17:55:29 +0000482/* return -1 if error, 0 if OK */
483static int put_packet(GDBState *s, const char *buf)
484{
485#ifdef DEBUG_GDB
486 printf("reply='%s'\n", buf);
487#endif
488
489 return put_packet_binary(s, buf, strlen(buf));
490}
491
492/* The GDB remote protocol transfers values in target byte order. This means
493 we can use the raw memory access routines to access the value buffer.
494 Conveniently, these also handle the case where the buffer is mis-aligned.
495 */
496#define GET_REG8(val) do { \
497 stb_p(mem_buf, val); \
498 return 1; \
499 } while(0)
500#define GET_REG16(val) do { \
501 stw_p(mem_buf, val); \
502 return 2; \
503 } while(0)
504#define GET_REG32(val) do { \
505 stl_p(mem_buf, val); \
506 return 4; \
507 } while(0)
508#define GET_REG64(val) do { \
509 stq_p(mem_buf, val); \
510 return 8; \
511 } while(0)
512
513#if TARGET_LONG_BITS == 64
514#define GET_REGL(val) GET_REG64(val)
515#define ldtul_p(addr) ldq_p(addr)
516#else
517#define GET_REGL(val) GET_REG32(val)
518#define ldtul_p(addr) ldl_p(addr)
519#endif
520
edgar_iglfde3fd62008-05-09 08:50:01 +0000521#if defined(TARGET_I386)
balrog5ad265e2007-10-31 00:21:35 +0000522
Andreas Färberf20f9df2013-07-07 12:07:54 +0200523#include "target-i386/gdbstub.c"
bellard6da41ea2004-01-04 15:48:38 +0000524
bellard9e62fd72004-01-05 22:49:06 +0000525#elif defined (TARGET_PPC)
pbrook56aebc82008-10-11 17:55:29 +0000526
aurel32e571cb42009-01-24 15:07:42 +0000527/* Old gdb always expects FP registers. Newer (xml-aware) gdb only
528 expects whatever the target description contains. Due to a
529 historical mishap the FP registers appear in between core integer
530 regs and PC, MSR, CR, and so forth. We hack round this by giving the
531 FP regs zero size when talking to a newer gdb. */
aurel32e571cb42009-01-24 15:07:42 +0000532#if defined (TARGET_PPC64)
533#define GDB_CORE_XML "power64-core.xml"
534#else
535#define GDB_CORE_XML "power-core.xml"
536#endif
pbrook56aebc82008-10-11 17:55:29 +0000537
Andreas Färberf3840912012-02-20 06:44:56 +0100538static int cpu_gdb_read_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000539{
pbrook56aebc82008-10-11 17:55:29 +0000540 if (n < 32) {
541 /* gprs */
542 GET_REGL(env->gpr[n]);
543 } else if (n < 64) {
544 /* fprs */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200545 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000546 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200547 }
aurel328d4acf92008-11-30 16:23:18 +0000548 stfq_p(mem_buf, env->fpr[n-32]);
pbrook56aebc82008-10-11 17:55:29 +0000549 return 8;
550 } else {
551 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200552 case 64:
553 GET_REGL(env->nip);
554 case 65:
555 GET_REGL(env->msr);
pbrook56aebc82008-10-11 17:55:29 +0000556 case 66:
557 {
558 uint32_t cr = 0;
559 int i;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200560 for (i = 0; i < 8; i++) {
pbrook56aebc82008-10-11 17:55:29 +0000561 cr |= env->crf[i] << (32 - ((i + 1) * 4));
Andreas Färber47d74ef2013-07-07 11:17:26 +0200562 }
pbrook56aebc82008-10-11 17:55:29 +0000563 GET_REG32(cr);
564 }
Andreas Färber47d74ef2013-07-07 11:17:26 +0200565 case 67:
566 GET_REGL(env->lr);
567 case 68:
568 GET_REGL(env->ctr);
569 case 69:
570 GET_REGL(env->xer);
aurel32e571cb42009-01-24 15:07:42 +0000571 case 70:
572 {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200573 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000574 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200575 }
Fabien Chouteau5a576fb2011-09-01 04:56:00 +0000576 GET_REG32(env->fpscr);
aurel32e571cb42009-01-24 15:07:42 +0000577 }
pbrook56aebc82008-10-11 17:55:29 +0000578 }
bellard9e62fd72004-01-05 22:49:06 +0000579 }
pbrook56aebc82008-10-11 17:55:29 +0000580 return 0;
bellard9e62fd72004-01-05 22:49:06 +0000581}
582
Andreas Färberf3840912012-02-20 06:44:56 +0100583static int cpu_gdb_write_register(CPUPPCState *env, uint8_t *mem_buf, int n)
bellard9e62fd72004-01-05 22:49:06 +0000584{
pbrook56aebc82008-10-11 17:55:29 +0000585 if (n < 32) {
586 /* gprs */
587 env->gpr[n] = ldtul_p(mem_buf);
588 return sizeof(target_ulong);
589 } else if (n < 64) {
590 /* fprs */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200591 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000592 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200593 }
aurel328d4acf92008-11-30 16:23:18 +0000594 env->fpr[n-32] = ldfq_p(mem_buf);
pbrook56aebc82008-10-11 17:55:29 +0000595 return 8;
596 } else {
597 switch (n) {
598 case 64:
599 env->nip = ldtul_p(mem_buf);
600 return sizeof(target_ulong);
601 case 65:
602 ppc_store_msr(env, ldtul_p(mem_buf));
603 return sizeof(target_ulong);
604 case 66:
605 {
606 uint32_t cr = ldl_p(mem_buf);
607 int i;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200608 for (i = 0; i < 8; i++) {
pbrook56aebc82008-10-11 17:55:29 +0000609 env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200610 }
pbrook56aebc82008-10-11 17:55:29 +0000611 return 4;
612 }
613 case 67:
614 env->lr = ldtul_p(mem_buf);
615 return sizeof(target_ulong);
616 case 68:
617 env->ctr = ldtul_p(mem_buf);
618 return sizeof(target_ulong);
619 case 69:
aurel323d7b4172008-10-21 11:28:46 +0000620 env->xer = ldtul_p(mem_buf);
621 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000622 case 70:
623 /* fpscr */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200624 if (gdb_has_xml) {
aurel32e571cb42009-01-24 15:07:42 +0000625 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200626 }
Fabien Chouteaud6478bc2013-03-19 07:41:53 +0000627 store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
628 return sizeof(target_ulong);
pbrook56aebc82008-10-11 17:55:29 +0000629 }
bellard9e62fd72004-01-05 22:49:06 +0000630 }
pbrook56aebc82008-10-11 17:55:29 +0000631 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000632}
pbrook56aebc82008-10-11 17:55:29 +0000633
bellarde95c8d52004-09-30 22:22:08 +0000634#elif defined (TARGET_SPARC)
bellarde95c8d52004-09-30 22:22:08 +0000635
pbrook56aebc82008-10-11 17:55:29 +0000636#ifdef TARGET_ABI32
637#define GET_REGA(val) GET_REG32(val)
638#else
639#define GET_REGA(val) GET_REGL(val)
640#endif
641
Andreas Färberf3840912012-02-20 06:44:56 +0100642static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
pbrook56aebc82008-10-11 17:55:29 +0000643{
644 if (n < 8) {
645 /* g0..g7 */
646 GET_REGA(env->gregs[n]);
bellarde95c8d52004-09-30 22:22:08 +0000647 }
pbrook56aebc82008-10-11 17:55:29 +0000648 if (n < 32) {
649 /* register window */
650 GET_REGA(env->regwptr[n - 8]);
bellarde95c8d52004-09-30 22:22:08 +0000651 }
pbrook56aebc82008-10-11 17:55:29 +0000652#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
653 if (n < 64) {
654 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700655 if (n & 1) {
656 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
657 } else {
658 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
659 }
bellarde95c8d52004-09-30 22:22:08 +0000660 }
661 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
pbrook56aebc82008-10-11 17:55:29 +0000662 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200663 case 64:
664 GET_REGA(env->y);
665 case 65:
666 GET_REGA(cpu_get_psr(env));
667 case 66:
668 GET_REGA(env->wim);
669 case 67:
670 GET_REGA(env->tbr);
671 case 68:
672 GET_REGA(env->pc);
673 case 69:
674 GET_REGA(env->npc);
675 case 70:
676 GET_REGA(env->fsr);
677 case 71:
678 GET_REGA(0); /* csr */
679 default:
680 GET_REGA(0);
bellard34751872005-07-02 14:31:34 +0000681 }
bellard34751872005-07-02 14:31:34 +0000682#else
pbrook56aebc82008-10-11 17:55:29 +0000683 if (n < 64) {
684 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700685 if (n & 1) {
686 GET_REG32(env->fpr[(n - 32) / 2].l.lower);
687 } else {
688 GET_REG32(env->fpr[(n - 32) / 2].l.upper);
689 }
bellard34751872005-07-02 14:31:34 +0000690 }
pbrook56aebc82008-10-11 17:55:29 +0000691 if (n < 80) {
692 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700693 GET_REG64(env->fpr[(n - 32) / 2].ll);
pbrook56aebc82008-10-11 17:55:29 +0000694 }
695 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200696 case 80:
697 GET_REGL(env->pc);
698 case 81:
699 GET_REGL(env->npc);
700 case 82:
701 GET_REGL((cpu_get_ccr(env) << 32) |
702 ((env->asi & 0xff) << 24) |
703 ((env->pstate & 0xfff) << 8) |
704 cpu_get_cwp64(env));
705 case 83:
706 GET_REGL(env->fsr);
707 case 84:
708 GET_REGL(env->fprs);
709 case 85:
710 GET_REGL(env->y);
pbrook56aebc82008-10-11 17:55:29 +0000711 }
bellard34751872005-07-02 14:31:34 +0000712#endif
pbrook56aebc82008-10-11 17:55:29 +0000713 return 0;
bellarde95c8d52004-09-30 22:22:08 +0000714}
715
Andreas Färberf3840912012-02-20 06:44:56 +0100716static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
bellarde95c8d52004-09-30 22:22:08 +0000717{
pbrook56aebc82008-10-11 17:55:29 +0000718#if defined(TARGET_ABI32)
719 abi_ulong tmp;
720
721 tmp = ldl_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000722#else
pbrook56aebc82008-10-11 17:55:29 +0000723 target_ulong tmp;
724
725 tmp = ldtul_p(mem_buf);
blueswir196d19122008-06-07 08:03:05 +0000726#endif
bellarde95c8d52004-09-30 22:22:08 +0000727
pbrook56aebc82008-10-11 17:55:29 +0000728 if (n < 8) {
729 /* g0..g7 */
730 env->gregs[n] = tmp;
731 } else if (n < 32) {
732 /* register window */
733 env->regwptr[n - 8] = tmp;
bellarde95c8d52004-09-30 22:22:08 +0000734 }
pbrook56aebc82008-10-11 17:55:29 +0000735#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
736 else if (n < 64) {
737 /* fprs */
Richard Henderson30038fd2011-10-17 10:42:49 -0700738 /* f0-f31 */
739 if (n & 1) {
740 env->fpr[(n - 32) / 2].l.lower = tmp;
741 } else {
742 env->fpr[(n - 32) / 2].l.upper = tmp;
743 }
pbrook56aebc82008-10-11 17:55:29 +0000744 } else {
745 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
746 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200747 case 64:
748 env->y = tmp;
749 break;
750 case 65:
751 cpu_put_psr(env, tmp);
752 break;
753 case 66:
754 env->wim = tmp;
755 break;
756 case 67:
757 env->tbr = tmp;
758 break;
759 case 68:
760 env->pc = tmp;
761 break;
762 case 69:
763 env->npc = tmp;
764 break;
765 case 70:
766 env->fsr = tmp;
767 break;
768 default:
769 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000770 }
bellarde95c8d52004-09-30 22:22:08 +0000771 }
pbrook56aebc82008-10-11 17:55:29 +0000772 return 4;
bellard34751872005-07-02 14:31:34 +0000773#else
pbrook56aebc82008-10-11 17:55:29 +0000774 else if (n < 64) {
775 /* f0-f31 */
Richard Henderson30038fd2011-10-17 10:42:49 -0700776 tmp = ldl_p(mem_buf);
777 if (n & 1) {
778 env->fpr[(n - 32) / 2].l.lower = tmp;
779 } else {
780 env->fpr[(n - 32) / 2].l.upper = tmp;
781 }
pbrook56aebc82008-10-11 17:55:29 +0000782 return 4;
783 } else if (n < 80) {
784 /* f32-f62 (double width, even numbers only) */
Richard Henderson30038fd2011-10-17 10:42:49 -0700785 env->fpr[(n - 32) / 2].ll = tmp;
pbrook56aebc82008-10-11 17:55:29 +0000786 } else {
787 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200788 case 80:
789 env->pc = tmp;
790 break;
791 case 81:
792 env->npc = tmp;
793 break;
pbrook56aebc82008-10-11 17:55:29 +0000794 case 82:
Blue Swirl5a834bb2010-05-09 20:19:04 +0000795 cpu_put_ccr(env, tmp >> 32);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200796 env->asi = (tmp >> 24) & 0xff;
797 env->pstate = (tmp >> 8) & 0xfff;
Blue Swirl5a834bb2010-05-09 20:19:04 +0000798 cpu_put_cwp64(env, tmp & 0xff);
Andreas Färber47d74ef2013-07-07 11:17:26 +0200799 break;
800 case 83:
801 env->fsr = tmp;
802 break;
803 case 84:
804 env->fprs = tmp;
805 break;
806 case 85:
807 env->y = tmp;
808 break;
809 default:
810 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000811 }
bellard34751872005-07-02 14:31:34 +0000812 }
pbrook56aebc82008-10-11 17:55:29 +0000813 return 8;
bellard34751872005-07-02 14:31:34 +0000814#endif
bellard9e62fd72004-01-05 22:49:06 +0000815}
bellard1fddef42005-04-17 19:16:13 +0000816#elif defined (TARGET_ARM)
pbrook56aebc82008-10-11 17:55:29 +0000817
818/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
819 whatever the target description contains. Due to a historical mishap
820 the FPA registers appear in between core integer regs and the CPSR.
821 We hack round this by giving the FPA regs zero size when talking to a
822 newer gdb. */
pbrook56aebc82008-10-11 17:55:29 +0000823#define GDB_CORE_XML "arm-core.xml"
824
Andreas Färberf3840912012-02-20 06:44:56 +0100825static int cpu_gdb_read_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000826{
pbrook56aebc82008-10-11 17:55:29 +0000827 if (n < 16) {
828 /* Core integer register. */
829 GET_REG32(env->regs[n]);
830 }
831 if (n < 24) {
832 /* FPA registers. */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200833 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +0000834 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200835 }
pbrook56aebc82008-10-11 17:55:29 +0000836 memset(mem_buf, 0, 12);
837 return 12;
838 }
839 switch (n) {
840 case 24:
841 /* FPA status register. */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200842 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +0000843 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200844 }
pbrook56aebc82008-10-11 17:55:29 +0000845 GET_REG32(0);
846 case 25:
847 /* CPSR */
848 GET_REG32(cpsr_read(env));
849 }
850 /* Unknown register. */
851 return 0;
bellard1fddef42005-04-17 19:16:13 +0000852}
853
Andreas Färberf3840912012-02-20 06:44:56 +0100854static int cpu_gdb_write_register(CPUARMState *env, uint8_t *mem_buf, int n)
bellard1fddef42005-04-17 19:16:13 +0000855{
pbrook56aebc82008-10-11 17:55:29 +0000856 uint32_t tmp;
bellard1fddef42005-04-17 19:16:13 +0000857
pbrook56aebc82008-10-11 17:55:29 +0000858 tmp = ldl_p(mem_buf);
859
860 /* Mask out low bit of PC to workaround gdb bugs. This will probably
861 cause problems if we ever implement the Jazelle DBX extensions. */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200862 if (n == 15) {
pbrook56aebc82008-10-11 17:55:29 +0000863 tmp &= ~1;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200864 }
pbrook56aebc82008-10-11 17:55:29 +0000865
866 if (n < 16) {
867 /* Core integer register. */
868 env->regs[n] = tmp;
869 return 4;
870 }
871 if (n < 24) { /* 16-23 */
872 /* FPA registers (ignored). */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200873 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +0000874 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200875 }
pbrook56aebc82008-10-11 17:55:29 +0000876 return 12;
877 }
878 switch (n) {
879 case 24:
880 /* FPA status register (ignored). */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200881 if (gdb_has_xml) {
pbrook56aebc82008-10-11 17:55:29 +0000882 return 0;
Andreas Färber47d74ef2013-07-07 11:17:26 +0200883 }
pbrook56aebc82008-10-11 17:55:29 +0000884 return 4;
885 case 25:
886 /* CPSR */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200887 cpsr_write(env, tmp, 0xffffffff);
pbrook56aebc82008-10-11 17:55:29 +0000888 return 4;
889 }
890 /* Unknown register. */
891 return 0;
bellard1fddef42005-04-17 19:16:13 +0000892}
pbrook56aebc82008-10-11 17:55:29 +0000893
pbrooke6e59062006-10-22 00:18:54 +0000894#elif defined (TARGET_M68K)
pbrook56aebc82008-10-11 17:55:29 +0000895
pbrook56aebc82008-10-11 17:55:29 +0000896#define GDB_CORE_XML "cf-core.xml"
897
Andreas Färberf3840912012-02-20 06:44:56 +0100898static int cpu_gdb_read_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000899{
pbrook56aebc82008-10-11 17:55:29 +0000900 if (n < 8) {
901 /* D0-D7 */
902 GET_REG32(env->dregs[n]);
903 } else if (n < 16) {
904 /* A0-A7 */
905 GET_REG32(env->aregs[n - 8]);
906 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200907 switch (n) {
908 case 16:
909 GET_REG32(env->sr);
910 case 17:
911 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +0000912 }
pbrooke6e59062006-10-22 00:18:54 +0000913 }
pbrook56aebc82008-10-11 17:55:29 +0000914 /* FP registers not included here because they vary between
915 ColdFire and m68k. Use XML bits for these. */
916 return 0;
pbrooke6e59062006-10-22 00:18:54 +0000917}
918
Andreas Färberf3840912012-02-20 06:44:56 +0100919static int cpu_gdb_write_register(CPUM68KState *env, uint8_t *mem_buf, int n)
pbrooke6e59062006-10-22 00:18:54 +0000920{
pbrook56aebc82008-10-11 17:55:29 +0000921 uint32_t tmp;
pbrooke6e59062006-10-22 00:18:54 +0000922
pbrook56aebc82008-10-11 17:55:29 +0000923 tmp = ldl_p(mem_buf);
924
925 if (n < 8) {
926 /* D0-D7 */
927 env->dregs[n] = tmp;
Kazu Hiratab3d6b952010-01-14 09:08:00 -0800928 } else if (n < 16) {
pbrook56aebc82008-10-11 17:55:29 +0000929 /* A0-A7 */
930 env->aregs[n - 8] = tmp;
931 } else {
932 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200933 case 16:
934 env->sr = tmp;
935 break;
936 case 17:
937 env->pc = tmp;
938 break;
939 default:
940 return 0;
pbrook56aebc82008-10-11 17:55:29 +0000941 }
pbrooke6e59062006-10-22 00:18:54 +0000942 }
pbrook56aebc82008-10-11 17:55:29 +0000943 return 4;
pbrooke6e59062006-10-22 00:18:54 +0000944}
bellard6f970bd2005-12-05 19:55:19 +0000945#elif defined (TARGET_MIPS)
pbrook56aebc82008-10-11 17:55:29 +0000946
Andreas Färberf3840912012-02-20 06:44:56 +0100947static int cpu_gdb_read_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +0000948{
pbrook56aebc82008-10-11 17:55:29 +0000949 if (n < 32) {
950 GET_REGL(env->active_tc.gpr[n]);
951 }
952 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
953 if (n >= 38 && n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200954 if (env->CP0_Status & (1 << CP0St_FR)) {
955 GET_REGL(env->active_fpu.fpr[n - 38].d);
956 } else {
957 GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
958 }
pbrook56aebc82008-10-11 17:55:29 +0000959 }
960 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200961 case 70:
962 GET_REGL((int32_t)env->active_fpu.fcr31);
963 case 71:
964 GET_REGL((int32_t)env->active_fpu.fcr0);
pbrook56aebc82008-10-11 17:55:29 +0000965 }
966 }
967 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200968 case 32:
969 GET_REGL((int32_t)env->CP0_Status);
970 case 33:
971 GET_REGL(env->active_tc.LO[0]);
972 case 34:
973 GET_REGL(env->active_tc.HI[0]);
974 case 35:
975 GET_REGL(env->CP0_BadVAddr);
976 case 36:
977 GET_REGL((int32_t)env->CP0_Cause);
978 case 37:
979 GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
980 case 72:
981 GET_REGL(0); /* fp */
982 case 89:
983 GET_REGL((int32_t)env->CP0_PRid);
pbrook56aebc82008-10-11 17:55:29 +0000984 }
985 if (n >= 73 && n <= 88) {
Andreas Färber47d74ef2013-07-07 11:17:26 +0200986 /* 16 embedded regs. */
987 GET_REGL(0);
pbrook56aebc82008-10-11 17:55:29 +0000988 }
ths36d23952007-02-28 22:37:42 +0000989
pbrook56aebc82008-10-11 17:55:29 +0000990 return 0;
bellard6f970bd2005-12-05 19:55:19 +0000991}
992
ths8e33c082006-12-11 19:22:27 +0000993/* convert MIPS rounding mode in FCR31 to IEEE library */
Andreas Färber47d74ef2013-07-07 11:17:26 +0200994static unsigned int ieee_rm[] = {
ths8e33c082006-12-11 19:22:27 +0000995 float_round_nearest_even,
996 float_round_to_zero,
997 float_round_up,
998 float_round_down
Andreas Färber47d74ef2013-07-07 11:17:26 +0200999};
ths8e33c082006-12-11 19:22:27 +00001000#define RESTORE_ROUNDING_MODE \
Andreas Färber47d74ef2013-07-07 11:17:26 +02001001 set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], \
1002 &env->active_fpu.fp_status)
ths8e33c082006-12-11 19:22:27 +00001003
Andreas Färberf3840912012-02-20 06:44:56 +01001004static int cpu_gdb_write_register(CPUMIPSState *env, uint8_t *mem_buf, int n)
bellard6f970bd2005-12-05 19:55:19 +00001005{
pbrook56aebc82008-10-11 17:55:29 +00001006 target_ulong tmp;
bellard6f970bd2005-12-05 19:55:19 +00001007
pbrook56aebc82008-10-11 17:55:29 +00001008 tmp = ldtul_p(mem_buf);
bellard6f970bd2005-12-05 19:55:19 +00001009
pbrook56aebc82008-10-11 17:55:29 +00001010 if (n < 32) {
1011 env->active_tc.gpr[n] = tmp;
1012 return sizeof(target_ulong);
1013 }
1014 if (env->CP0_Config1 & (1 << CP0C1_FP)
1015 && n >= 38 && n < 73) {
1016 if (n < 70) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001017 if (env->CP0_Status & (1 << CP0St_FR)) {
1018 env->active_fpu.fpr[n - 38].d = tmp;
1019 } else {
1020 env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1021 }
pbrook56aebc82008-10-11 17:55:29 +00001022 }
1023 switch (n) {
1024 case 70:
1025 env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1026 /* set rounding mode */
1027 RESTORE_ROUNDING_MODE;
pbrook56aebc82008-10-11 17:55:29 +00001028 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001029 case 71:
1030 env->active_fpu.fcr0 = tmp;
1031 break;
pbrook56aebc82008-10-11 17:55:29 +00001032 }
1033 return sizeof(target_ulong);
1034 }
1035 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001036 case 32:
1037 env->CP0_Status = tmp;
1038 break;
1039 case 33:
1040 env->active_tc.LO[0] = tmp;
1041 break;
1042 case 34:
1043 env->active_tc.HI[0] = tmp;
1044 break;
1045 case 35:
1046 env->CP0_BadVAddr = tmp;
1047 break;
1048 case 36:
1049 env->CP0_Cause = tmp;
1050 break;
Nathan Froydff1d1972009-12-08 08:06:30 -08001051 case 37:
1052 env->active_tc.PC = tmp & ~(target_ulong)1;
1053 if (tmp & 1) {
1054 env->hflags |= MIPS_HFLAG_M16;
1055 } else {
1056 env->hflags &= ~(MIPS_HFLAG_M16);
1057 }
1058 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001059 case 72: /* fp, ignored */
1060 break;
1061 default:
1062 if (n > 89) {
1063 return 0;
1064 }
1065 /* Other registers are readonly. Ignore writes. */
1066 break;
pbrook56aebc82008-10-11 17:55:29 +00001067 }
1068
1069 return sizeof(target_ulong);
bellard6f970bd2005-12-05 19:55:19 +00001070}
Jia Liufc043552012-07-20 15:50:50 +08001071#elif defined(TARGET_OPENRISC)
1072
Jia Liufc043552012-07-20 15:50:50 +08001073static int cpu_gdb_read_register(CPUOpenRISCState *env, uint8_t *mem_buf, int n)
1074{
1075 if (n < 32) {
1076 GET_REG32(env->gpr[n]);
1077 } else {
1078 switch (n) {
1079 case 32: /* PPC */
1080 GET_REG32(env->ppc);
Jia Liufc043552012-07-20 15:50:50 +08001081
1082 case 33: /* NPC */
1083 GET_REG32(env->npc);
Jia Liufc043552012-07-20 15:50:50 +08001084
1085 case 34: /* SR */
1086 GET_REG32(env->sr);
Jia Liufc043552012-07-20 15:50:50 +08001087
1088 default:
1089 break;
1090 }
1091 }
1092 return 0;
1093}
1094
1095static int cpu_gdb_write_register(CPUOpenRISCState *env,
1096 uint8_t *mem_buf, int n)
1097{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001098 OpenRISCCPU *cpu = openrisc_env_get_cpu(env);
1099 CPUClass *cc = CPU_GET_CLASS(cpu);
Jia Liufc043552012-07-20 15:50:50 +08001100 uint32_t tmp;
1101
Andreas Färbera0e372f2013-06-28 23:18:47 +02001102 if (n > cc->gdb_num_core_regs) {
Jia Liufc043552012-07-20 15:50:50 +08001103 return 0;
1104 }
1105
1106 tmp = ldl_p(mem_buf);
1107
1108 if (n < 32) {
1109 env->gpr[n] = tmp;
1110 } else {
1111 switch (n) {
1112 case 32: /* PPC */
1113 env->ppc = tmp;
1114 break;
1115
1116 case 33: /* NPC */
1117 env->npc = tmp;
1118 break;
1119
1120 case 34: /* SR */
1121 env->sr = tmp;
1122 break;
1123
1124 default:
1125 break;
1126 }
1127 }
1128 return 4;
1129}
bellardfdf9b3e2006-04-27 21:07:38 +00001130#elif defined (TARGET_SH4)
ths6ef99fc2007-05-13 16:36:24 +00001131
1132/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
pbrook56aebc82008-10-11 17:55:29 +00001133/* FIXME: We should use XML for this. */
ths6ef99fc2007-05-13 16:36:24 +00001134
Andreas Färberf3840912012-02-20 06:44:56 +01001135static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001136{
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001137 switch (n) {
1138 case 0 ... 7:
pbrook56aebc82008-10-11 17:55:29 +00001139 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1140 GET_REGL(env->gregs[n + 16]);
1141 } else {
1142 GET_REGL(env->gregs[n]);
1143 }
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001144 case 8 ... 15:
takasi-y@ops.dti.ne.jpe192a452010-02-18 00:53:29 +09001145 GET_REGL(env->gregs[n]);
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001146 case 16:
1147 GET_REGL(env->pc);
1148 case 17:
1149 GET_REGL(env->pr);
1150 case 18:
1151 GET_REGL(env->gbr);
1152 case 19:
1153 GET_REGL(env->vbr);
1154 case 20:
1155 GET_REGL(env->mach);
1156 case 21:
1157 GET_REGL(env->macl);
1158 case 22:
1159 GET_REGL(env->sr);
1160 case 23:
1161 GET_REGL(env->fpul);
1162 case 24:
1163 GET_REGL(env->fpscr);
1164 case 25 ... 40:
1165 if (env->fpscr & FPSCR_FR) {
1166 stfl_p(mem_buf, env->fregs[n - 9]);
1167 } else {
1168 stfl_p(mem_buf, env->fregs[n - 25]);
1169 }
1170 return 4;
1171 case 41:
1172 GET_REGL(env->ssr);
1173 case 42:
1174 GET_REGL(env->spc);
1175 case 43 ... 50:
1176 GET_REGL(env->gregs[n - 43]);
1177 case 51 ... 58:
1178 GET_REGL(env->gregs[n - (51 - 16)]);
pbrook56aebc82008-10-11 17:55:29 +00001179 }
bellardfdf9b3e2006-04-27 21:07:38 +00001180
pbrook56aebc82008-10-11 17:55:29 +00001181 return 0;
bellardfdf9b3e2006-04-27 21:07:38 +00001182}
1183
Andreas Färberf3840912012-02-20 06:44:56 +01001184static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n)
bellardfdf9b3e2006-04-27 21:07:38 +00001185{
pbrook56aebc82008-10-11 17:55:29 +00001186 switch (n) {
Aurelien Jarnoeca5c302012-09-16 13:12:21 +02001187 case 0 ... 7:
1188 if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1189 env->gregs[n + 16] = ldl_p(mem_buf);
1190 } else {
1191 env->gregs[n] = ldl_p(mem_buf);
1192 }
1193 break;
1194 case 8 ... 15:
1195 env->gregs[n] = ldl_p(mem_buf);
1196 break;
1197 case 16:
1198 env->pc = ldl_p(mem_buf);
1199 break;
1200 case 17:
1201 env->pr = ldl_p(mem_buf);
1202 break;
1203 case 18:
1204 env->gbr = ldl_p(mem_buf);
1205 break;
1206 case 19:
1207 env->vbr = ldl_p(mem_buf);
1208 break;
1209 case 20:
1210 env->mach = ldl_p(mem_buf);
1211 break;
1212 case 21:
1213 env->macl = ldl_p(mem_buf);
1214 break;
1215 case 22:
1216 env->sr = ldl_p(mem_buf);
1217 break;
1218 case 23:
1219 env->fpul = ldl_p(mem_buf);
1220 break;
1221 case 24:
1222 env->fpscr = ldl_p(mem_buf);
1223 break;
1224 case 25 ... 40:
1225 if (env->fpscr & FPSCR_FR) {
1226 env->fregs[n - 9] = ldfl_p(mem_buf);
1227 } else {
1228 env->fregs[n - 25] = ldfl_p(mem_buf);
1229 }
1230 break;
1231 case 41:
1232 env->ssr = ldl_p(mem_buf);
1233 break;
1234 case 42:
1235 env->spc = ldl_p(mem_buf);
1236 break;
1237 case 43 ... 50:
1238 env->gregs[n - 43] = ldl_p(mem_buf);
1239 break;
1240 case 51 ... 58:
1241 env->gregs[n - (51 - 16)] = ldl_p(mem_buf);
1242 break;
Andreas Färber47d74ef2013-07-07 11:17:26 +02001243 default:
1244 return 0;
pbrook56aebc82008-10-11 17:55:29 +00001245 }
1246
1247 return 4;
bellardfdf9b3e2006-04-27 21:07:38 +00001248}
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001249#elif defined (TARGET_MICROBLAZE)
1250
Andreas Färberf3840912012-02-20 06:44:56 +01001251static int cpu_gdb_read_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001252{
1253 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001254 GET_REG32(env->regs[n]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001255 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001256 GET_REG32(env->sregs[n - 32]);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001257 }
1258 return 0;
1259}
1260
Andreas Färberf3840912012-02-20 06:44:56 +01001261static int cpu_gdb_write_register(CPUMBState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001262{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001263 MicroBlazeCPU *cpu = mb_env_get_cpu(env);
1264 CPUClass *cc = CPU_GET_CLASS(cpu);
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001265 uint32_t tmp;
1266
Andreas Färbera0e372f2013-06-28 23:18:47 +02001267 if (n > cc->gdb_num_core_regs) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001268 return 0;
1269 }
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001270
1271 tmp = ldl_p(mem_buf);
1272
1273 if (n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001274 env->regs[n] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001275 } else {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001276 env->sregs[n - 32] = tmp;
Edgar E. Iglesiasd74d6a92009-05-20 20:16:31 +02001277 }
1278 return 4;
1279}
thsf1ccf902007-10-08 13:16:14 +00001280#elif defined (TARGET_CRIS)
1281
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001282static int
Andreas Färberf3840912012-02-20 06:44:56 +01001283read_register_crisv10(CPUCRISState *env, uint8_t *mem_buf, int n)
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001284{
1285 if (n < 15) {
1286 GET_REG32(env->regs[n]);
1287 }
1288
1289 if (n == 15) {
1290 GET_REG32(env->pc);
1291 }
1292
1293 if (n < 32) {
1294 switch (n) {
1295 case 16:
1296 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001297 case 17:
1298 GET_REG8(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001299 case 20:
1300 case 21:
1301 GET_REG16(env->pregs[n - 16]);
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001302 default:
1303 if (n >= 23) {
1304 GET_REG32(env->pregs[n - 16]);
1305 }
1306 break;
1307 }
1308 }
1309 return 0;
1310}
1311
Andreas Färberf3840912012-02-20 06:44:56 +01001312static int cpu_gdb_read_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001313{
pbrook56aebc82008-10-11 17:55:29 +00001314 uint8_t srs;
1315
Andreas Färber47d74ef2013-07-07 11:17:26 +02001316 if (env->pregs[PR_VR] < 32) {
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001317 return read_register_crisv10(env, mem_buf, n);
Andreas Färber47d74ef2013-07-07 11:17:26 +02001318 }
Edgar E. Iglesias4a0b59f2010-02-20 19:51:56 +01001319
pbrook56aebc82008-10-11 17:55:29 +00001320 srs = env->pregs[PR_SRS];
1321 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001322 GET_REG32(env->regs[n]);
pbrook56aebc82008-10-11 17:55:29 +00001323 }
1324
1325 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001326 GET_REG32(env->pregs[n - 16]);
pbrook56aebc82008-10-11 17:55:29 +00001327 }
1328 if (n >= 33 && n < 49) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001329 GET_REG32(env->sregs[srs][n - 33]);
pbrook56aebc82008-10-11 17:55:29 +00001330 }
1331 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001332 case 16:
1333 GET_REG8(env->pregs[0]);
1334 case 17:
1335 GET_REG8(env->pregs[1]);
1336 case 18:
1337 GET_REG32(env->pregs[2]);
1338 case 19:
1339 GET_REG8(srs);
1340 case 20:
1341 GET_REG16(env->pregs[4]);
1342 case 32:
1343 GET_REG32(env->pc);
pbrook56aebc82008-10-11 17:55:29 +00001344 }
1345
1346 return 0;
thsf1ccf902007-10-08 13:16:14 +00001347}
1348
Andreas Färberf3840912012-02-20 06:44:56 +01001349static int cpu_gdb_write_register(CPUCRISState *env, uint8_t *mem_buf, int n)
thsf1ccf902007-10-08 13:16:14 +00001350{
pbrook56aebc82008-10-11 17:55:29 +00001351 uint32_t tmp;
thsf1ccf902007-10-08 13:16:14 +00001352
Andreas Färber47d74ef2013-07-07 11:17:26 +02001353 if (n > 49) {
1354 return 0;
1355 }
thsf1ccf902007-10-08 13:16:14 +00001356
pbrook56aebc82008-10-11 17:55:29 +00001357 tmp = ldl_p(mem_buf);
thsf1ccf902007-10-08 13:16:14 +00001358
pbrook56aebc82008-10-11 17:55:29 +00001359 if (n < 16) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001360 env->regs[n] = tmp;
pbrook56aebc82008-10-11 17:55:29 +00001361 }
thsf1ccf902007-10-08 13:16:14 +00001362
edgar_igld7b69672008-10-11 19:32:21 +00001363 if (n >= 21 && n < 32) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001364 env->pregs[n - 16] = tmp;
edgar_igld7b69672008-10-11 19:32:21 +00001365 }
1366
1367 /* FIXME: Should support function regs be writable? */
pbrook56aebc82008-10-11 17:55:29 +00001368 switch (n) {
Andreas Färber47d74ef2013-07-07 11:17:26 +02001369 case 16:
1370 return 1;
1371 case 17:
1372 return 1;
1373 case 18:
1374 env->pregs[PR_PID] = tmp;
1375 break;
1376 case 19:
1377 return 1;
1378 case 20:
1379 return 2;
1380 case 32:
1381 env->pc = tmp;
1382 break;
pbrook56aebc82008-10-11 17:55:29 +00001383 }
thsf1ccf902007-10-08 13:16:14 +00001384
pbrook56aebc82008-10-11 17:55:29 +00001385 return 4;
thsf1ccf902007-10-08 13:16:14 +00001386}
aurel3219bf5172008-12-07 23:26:32 +00001387#elif defined (TARGET_ALPHA)
1388
Andreas Färberf3840912012-02-20 06:44:56 +01001389static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001390{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001391 uint64_t val;
1392 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001393
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001394 switch (n) {
1395 case 0 ... 30:
1396 val = env->ir[n];
1397 break;
1398 case 32 ... 62:
1399 d.d = env->fir[n - 32];
1400 val = d.ll;
1401 break;
1402 case 63:
1403 val = cpu_alpha_load_fpcr(env);
1404 break;
1405 case 64:
1406 val = env->pc;
1407 break;
1408 case 66:
1409 val = env->unique;
1410 break;
1411 case 31:
1412 case 65:
1413 /* 31 really is the zero register; 65 is unassigned in the
1414 gdb protocol, but is still required to occupy 8 bytes. */
1415 val = 0;
1416 break;
1417 default:
1418 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001419 }
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001420 GET_REGL(val);
aurel3219bf5172008-12-07 23:26:32 +00001421}
1422
Andreas Färberf3840912012-02-20 06:44:56 +01001423static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n)
aurel3219bf5172008-12-07 23:26:32 +00001424{
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001425 target_ulong tmp = ldtul_p(mem_buf);
1426 CPU_DoubleU d;
aurel3219bf5172008-12-07 23:26:32 +00001427
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001428 switch (n) {
1429 case 0 ... 30:
aurel3219bf5172008-12-07 23:26:32 +00001430 env->ir[n] = tmp;
Richard Henderson7c5a90d2009-12-31 11:54:01 -08001431 break;
1432 case 32 ... 62:
1433 d.ll = tmp;
1434 env->fir[n - 32] = d.d;
1435 break;
1436 case 63:
1437 cpu_alpha_store_fpcr(env, tmp);
1438 break;
1439 case 64:
1440 env->pc = tmp;
1441 break;
1442 case 66:
1443 env->unique = tmp;
1444 break;
1445 case 31:
1446 case 65:
1447 /* 31 really is the zero register; 65 is unassigned in the
1448 gdb protocol, but is still required to occupy 8 bytes. */
1449 break;
1450 default:
1451 return 0;
aurel3219bf5172008-12-07 23:26:32 +00001452 }
aurel3219bf5172008-12-07 23:26:32 +00001453 return 8;
1454}
Alexander Grafafcb0e42009-12-05 12:44:29 +01001455#elif defined (TARGET_S390X)
1456
Andreas Färberf3840912012-02-20 06:44:56 +01001457static int cpu_gdb_read_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001458{
Richard Henderson6ee77b12012-08-23 10:44:45 -07001459 uint64_t val;
1460 int cc_op;
1461
Alexander Grafafcb0e42009-12-05 12:44:29 +01001462 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001463 case S390_PSWM_REGNUM:
1464 cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst, env->cc_vr);
1465 val = deposit64(env->psw.mask, 44, 2, cc_op);
1466 GET_REGL(val);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001467 case S390_PSWA_REGNUM:
1468 GET_REGL(env->psw.addr);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001469 case S390_R0_REGNUM ... S390_R15_REGNUM:
1470 GET_REGL(env->regs[n-S390_R0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001471 case S390_A0_REGNUM ... S390_A15_REGNUM:
1472 GET_REG32(env->aregs[n-S390_A0_REGNUM]);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001473 case S390_FPC_REGNUM:
1474 GET_REG32(env->fpc);
Richard Henderson6ee77b12012-08-23 10:44:45 -07001475 case S390_F0_REGNUM ... S390_F15_REGNUM:
1476 GET_REG64(env->fregs[n-S390_F0_REGNUM].ll);
Alexander Grafafcb0e42009-12-05 12:44:29 +01001477 }
1478
1479 return 0;
1480}
1481
Andreas Färberf3840912012-02-20 06:44:56 +01001482static int cpu_gdb_write_register(CPUS390XState *env, uint8_t *mem_buf, int n)
Alexander Grafafcb0e42009-12-05 12:44:29 +01001483{
1484 target_ulong tmpl;
1485 uint32_t tmp32;
1486 int r = 8;
1487 tmpl = ldtul_p(mem_buf);
1488 tmp32 = ldl_p(mem_buf);
1489
1490 switch (n) {
Richard Henderson6ee77b12012-08-23 10:44:45 -07001491 case S390_PSWM_REGNUM:
1492 env->psw.mask = tmpl;
1493 env->cc_op = extract64(tmpl, 44, 2);
1494 break;
1495 case S390_PSWA_REGNUM:
1496 env->psw.addr = tmpl;
1497 break;
1498 case S390_R0_REGNUM ... S390_R15_REGNUM:
1499 env->regs[n-S390_R0_REGNUM] = tmpl;
1500 break;
1501 case S390_A0_REGNUM ... S390_A15_REGNUM:
1502 env->aregs[n-S390_A0_REGNUM] = tmp32;
1503 r = 4;
1504 break;
1505 case S390_FPC_REGNUM:
1506 env->fpc = tmp32;
1507 r = 4;
1508 break;
1509 case S390_F0_REGNUM ... S390_F15_REGNUM:
1510 env->fregs[n-S390_F0_REGNUM].ll = tmpl;
1511 break;
1512 default:
1513 return 0;
Alexander Grafafcb0e42009-12-05 12:44:29 +01001514 }
Alexander Grafafcb0e42009-12-05 12:44:29 +01001515 return r;
1516}
Michael Walle0c45d3d2011-02-17 23:45:06 +01001517#elif defined (TARGET_LM32)
1518
Paolo Bonzini0d09e412013-02-05 17:06:20 +01001519#include "hw/lm32/lm32_pic.h"
Michael Walle0c45d3d2011-02-17 23:45:06 +01001520
Andreas Färberf3840912012-02-20 06:44:56 +01001521static int cpu_gdb_read_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001522{
1523 if (n < 32) {
1524 GET_REG32(env->regs[n]);
1525 } else {
1526 switch (n) {
1527 case 32:
1528 GET_REG32(env->pc);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001529 /* FIXME: put in right exception ID */
1530 case 33:
1531 GET_REG32(0);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001532 case 34:
1533 GET_REG32(env->eba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001534 case 35:
1535 GET_REG32(env->deba);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001536 case 36:
1537 GET_REG32(env->ie);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001538 case 37:
1539 GET_REG32(lm32_pic_get_im(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001540 case 38:
1541 GET_REG32(lm32_pic_get_ip(env->pic_state));
Michael Walle0c45d3d2011-02-17 23:45:06 +01001542 }
1543 }
1544 return 0;
1545}
1546
Andreas Färberf3840912012-02-20 06:44:56 +01001547static int cpu_gdb_write_register(CPULM32State *env, uint8_t *mem_buf, int n)
Michael Walle0c45d3d2011-02-17 23:45:06 +01001548{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001549 LM32CPU *cpu = lm32_env_get_cpu(env);
1550 CPUClass *cc = CPU_GET_CLASS(cpu);
Michael Walle0c45d3d2011-02-17 23:45:06 +01001551 uint32_t tmp;
1552
Andreas Färbera0e372f2013-06-28 23:18:47 +02001553 if (n > cc->gdb_num_core_regs) {
Michael Walle0c45d3d2011-02-17 23:45:06 +01001554 return 0;
1555 }
1556
1557 tmp = ldl_p(mem_buf);
1558
1559 if (n < 32) {
1560 env->regs[n] = tmp;
1561 } else {
1562 switch (n) {
1563 case 32:
1564 env->pc = tmp;
1565 break;
1566 case 34:
1567 env->eba = tmp;
1568 break;
1569 case 35:
1570 env->deba = tmp;
1571 break;
1572 case 36:
1573 env->ie = tmp;
1574 break;
1575 case 37:
1576 lm32_pic_set_im(env->pic_state, tmp);
1577 break;
1578 case 38:
1579 lm32_pic_set_ip(env->pic_state, tmp);
1580 break;
1581 }
1582 }
1583 return 4;
1584}
Max Filippovccfcaba2011-09-06 03:55:52 +04001585#elif defined(TARGET_XTENSA)
1586
Andreas Färberf3840912012-02-20 06:44:56 +01001587static int cpu_gdb_read_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001588{
1589 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1590
1591 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1592 return 0;
1593 }
1594
1595 switch (reg->type) {
1596 case 9: /*pc*/
1597 GET_REG32(env->pc);
Max Filippovccfcaba2011-09-06 03:55:52 +04001598
1599 case 1: /*ar*/
1600 xtensa_sync_phys_from_window(env);
1601 GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001602
1603 case 2: /*SR*/
1604 GET_REG32(env->sregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001605
1606 case 3: /*UR*/
1607 GET_REG32(env->uregs[reg->targno & 0xff]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001608
Max Filippovdd519cb2012-09-19 04:23:54 +04001609 case 4: /*f*/
1610 GET_REG32(float32_val(env->fregs[reg->targno & 0x0f]));
Max Filippovdd519cb2012-09-19 04:23:54 +04001611
Max Filippovccfcaba2011-09-06 03:55:52 +04001612 case 8: /*a*/
1613 GET_REG32(env->regs[reg->targno & 0x0f]);
Max Filippovccfcaba2011-09-06 03:55:52 +04001614
1615 default:
1616 qemu_log("%s from reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001617 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001618 return 0;
1619 }
1620}
1621
Andreas Färberf3840912012-02-20 06:44:56 +01001622static int cpu_gdb_write_register(CPUXtensaState *env, uint8_t *mem_buf, int n)
Max Filippovccfcaba2011-09-06 03:55:52 +04001623{
1624 uint32_t tmp;
1625 const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1626
1627 if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1628 return 0;
1629 }
1630
1631 tmp = ldl_p(mem_buf);
1632
1633 switch (reg->type) {
1634 case 9: /*pc*/
1635 env->pc = tmp;
1636 break;
1637
1638 case 1: /*ar*/
1639 env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1640 xtensa_sync_window_from_phys(env);
1641 break;
1642
1643 case 2: /*SR*/
1644 env->sregs[reg->targno & 0xff] = tmp;
1645 break;
1646
1647 case 3: /*UR*/
1648 env->uregs[reg->targno & 0xff] = tmp;
1649 break;
1650
Max Filippovdd519cb2012-09-19 04:23:54 +04001651 case 4: /*f*/
1652 env->fregs[reg->targno & 0x0f] = make_float32(tmp);
1653 break;
1654
Max Filippovccfcaba2011-09-06 03:55:52 +04001655 case 8: /*a*/
1656 env->regs[reg->targno & 0x0f] = tmp;
1657 break;
1658
1659 default:
1660 qemu_log("%s to reg %d of unsupported type %d\n",
Andreas Färber47d74ef2013-07-07 11:17:26 +02001661 __func__, n, reg->type);
Max Filippovccfcaba2011-09-06 03:55:52 +04001662 return 0;
1663 }
1664
1665 return 4;
1666}
bellard1fddef42005-04-17 19:16:13 +00001667#else
pbrook56aebc82008-10-11 17:55:29 +00001668
Andreas Färber9349b4f2012-03-14 01:38:32 +01001669static int cpu_gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001670{
1671 return 0;
1672}
1673
Andreas Färber9349b4f2012-03-14 01:38:32 +01001674static int cpu_gdb_write_register(CPUArchState *env, uint8_t *mem_buf, int n)
bellard6da41ea2004-01-04 15:48:38 +00001675{
pbrook56aebc82008-10-11 17:55:29 +00001676 return 0;
bellard6da41ea2004-01-04 15:48:38 +00001677}
1678
1679#endif
bellardb4608c02003-06-27 17:34:32 +00001680
pbrook56aebc82008-10-11 17:55:29 +00001681#ifdef GDB_CORE_XML
1682/* Encode data using the encoding for 'x' packets. */
1683static int memtox(char *buf, const char *mem, int len)
1684{
1685 char *p = buf;
1686 char c;
1687
1688 while (len--) {
1689 c = *(mem++);
1690 switch (c) {
1691 case '#': case '$': case '*': case '}':
1692 *(p++) = '}';
1693 *(p++) = c ^ 0x20;
1694 break;
1695 default:
1696 *(p++) = c;
1697 break;
1698 }
1699 }
1700 return p - buf;
1701}
1702
aurel323faf7782008-12-07 23:26:17 +00001703static const char *get_feature_xml(const char *p, const char **newp)
pbrook56aebc82008-10-11 17:55:29 +00001704{
pbrook56aebc82008-10-11 17:55:29 +00001705 size_t len;
1706 int i;
1707 const char *name;
1708 static char target_xml[1024];
1709
1710 len = 0;
1711 while (p[len] && p[len] != ':')
1712 len++;
1713 *newp = p + len;
1714
1715 name = NULL;
1716 if (strncmp(p, "target.xml", len) == 0) {
1717 /* Generate the XML description for this CPU. */
1718 if (!target_xml[0]) {
1719 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +02001720 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +00001721
blueswir15b3715b2008-10-25 11:18:12 +00001722 snprintf(target_xml, sizeof(target_xml),
1723 "<?xml version=\"1.0\"?>"
1724 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1725 "<target>"
1726 "<xi:include href=\"%s\"/>",
1727 GDB_CORE_XML);
pbrook56aebc82008-10-11 17:55:29 +00001728
Andreas Färbereac8b352013-06-28 21:11:37 +02001729 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +00001730 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1731 pstrcat(target_xml, sizeof(target_xml), r->xml);
1732 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +00001733 }
blueswir12dc766d2009-04-13 16:06:19 +00001734 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +00001735 }
1736 return target_xml;
1737 }
1738 for (i = 0; ; i++) {
1739 name = xml_builtin[i][0];
1740 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1741 break;
1742 }
1743 return name ? xml_builtin[i][1] : NULL;
1744}
1745#endif
1746
Andreas Färber385b9f02013-06-27 18:25:36 +02001747static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001748{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001749 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001750 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001751 GDBRegisterState *r;
1752
Andreas Färbera0e372f2013-06-28 23:18:47 +02001753 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001754 return cpu_gdb_read_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001755 }
pbrook56aebc82008-10-11 17:55:29 +00001756
Andreas Färbereac8b352013-06-28 21:11:37 +02001757 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001758 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1759 return r->get_reg(env, mem_buf, reg - r->base_reg);
1760 }
1761 }
1762 return 0;
1763}
1764
Andreas Färber385b9f02013-06-27 18:25:36 +02001765static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +00001766{
Andreas Färbera0e372f2013-06-28 23:18:47 +02001767 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +02001768 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +00001769 GDBRegisterState *r;
1770
Andreas Färbera0e372f2013-06-28 23:18:47 +02001771 if (reg < cc->gdb_num_core_regs) {
pbrook56aebc82008-10-11 17:55:29 +00001772 return cpu_gdb_write_register(env, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001773 }
pbrook56aebc82008-10-11 17:55:29 +00001774
Andreas Färbereac8b352013-06-28 21:11:37 +02001775 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +00001776 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1777 return r->set_reg(env, mem_buf, reg - r->base_reg);
1778 }
1779 }
1780 return 0;
1781}
1782
1783/* Register a supplemental set of CPU registers. If g_pos is nonzero it
1784 specifies the first register number and these registers are included in
1785 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
1786 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1787 */
1788
Andreas Färber22169d42013-06-28 21:27:39 +02001789void gdb_register_coprocessor(CPUState *cpu,
1790 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1791 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +00001792{
1793 GDBRegisterState *s;
1794 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +00001795
Andreas Färbereac8b352013-06-28 21:11:37 +02001796 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +00001797 while (*p) {
1798 /* Check for duplicates. */
1799 if (strcmp((*p)->xml, xml) == 0)
1800 return;
1801 p = &(*p)->next;
1802 }
Stefan Weil9643c252011-10-18 22:25:38 +02001803
1804 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +02001805 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +02001806 s->num_regs = num_regs;
1807 s->get_reg = get_reg;
1808 s->set_reg = set_reg;
1809 s->xml = xml;
1810
pbrook56aebc82008-10-11 17:55:29 +00001811 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +02001812 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +00001813 *p = s;
1814 if (g_pos) {
1815 if (g_pos != s->base_reg) {
1816 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1817 "Expected %d got %d\n", xml, g_pos, s->base_reg);
pbrook56aebc82008-10-11 17:55:29 +00001818 }
1819 }
1820}
1821
aliguoria1d1bb32008-11-18 20:07:32 +00001822#ifndef CONFIG_USER_ONLY
1823static const int xlat_gdb_type[] = {
1824 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
1825 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
1826 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1827};
1828#endif
1829
aliguori880a7572008-11-18 20:30:24 +00001830static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001831{
Andreas Färber182735e2013-05-29 22:29:20 +02001832 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001833 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001834 int err = 0;
1835
Andreas Färber62278812013-06-27 17:12:06 +02001836 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001837 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001838 }
aliguorie22a25c2009-03-12 20:12:48 +00001839
aliguoria1d1bb32008-11-18 20:07:32 +00001840 switch (type) {
1841 case GDB_BREAKPOINT_SW:
1842 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001843 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1844 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001845 err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1846 if (err)
1847 break;
1848 }
1849 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001850#ifndef CONFIG_USER_ONLY
1851 case GDB_WATCHPOINT_WRITE:
1852 case GDB_WATCHPOINT_READ:
1853 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001854 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1855 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001856 err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1857 NULL);
1858 if (err)
1859 break;
1860 }
1861 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001862#endif
1863 default:
1864 return -ENOSYS;
1865 }
1866}
1867
aliguori880a7572008-11-18 20:30:24 +00001868static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +00001869{
Andreas Färber182735e2013-05-29 22:29:20 +02001870 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001871 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001872 int err = 0;
1873
Andreas Färber62278812013-06-27 17:12:06 +02001874 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001875 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +02001876 }
aliguorie22a25c2009-03-12 20:12:48 +00001877
aliguoria1d1bb32008-11-18 20:07:32 +00001878 switch (type) {
1879 case GDB_BREAKPOINT_SW:
1880 case GDB_BREAKPOINT_HW:
Andreas Färber182735e2013-05-29 22:29:20 +02001881 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1882 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001883 err = cpu_breakpoint_remove(env, addr, BP_GDB);
1884 if (err)
1885 break;
1886 }
1887 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001888#ifndef CONFIG_USER_ONLY
1889 case GDB_WATCHPOINT_WRITE:
1890 case GDB_WATCHPOINT_READ:
1891 case GDB_WATCHPOINT_ACCESS:
Andreas Färber182735e2013-05-29 22:29:20 +02001892 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1893 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001894 err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1895 if (err)
1896 break;
1897 }
1898 return err;
aliguoria1d1bb32008-11-18 20:07:32 +00001899#endif
1900 default:
1901 return -ENOSYS;
1902 }
1903}
1904
aliguori880a7572008-11-18 20:30:24 +00001905static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +00001906{
Andreas Färber182735e2013-05-29 22:29:20 +02001907 CPUState *cpu;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001908 CPUArchState *env;
aliguori880a7572008-11-18 20:30:24 +00001909
aliguorie22a25c2009-03-12 20:12:48 +00001910 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001911 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +00001912 return;
1913 }
1914
Andreas Färber182735e2013-05-29 22:29:20 +02001915 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
1916 env = cpu->env_ptr;
aliguori880a7572008-11-18 20:30:24 +00001917 cpu_breakpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001918#ifndef CONFIG_USER_ONLY
aliguori880a7572008-11-18 20:30:24 +00001919 cpu_watchpoint_remove_all(env, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +00001920#endif
aliguori880a7572008-11-18 20:30:24 +00001921 }
aliguoria1d1bb32008-11-18 20:07:32 +00001922}
1923
aurel32fab9d282009-04-08 21:29:37 +00001924static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1925{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001926 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +02001927 CPUClass *cc = CPU_GET_CLASS(cpu);
1928
1929 cpu_synchronize_state(cpu);
1930 if (cc->set_pc) {
1931 cc->set_pc(cpu, pc);
Nathan Froydff1d1972009-12-08 08:06:30 -08001932 }
aurel32fab9d282009-04-08 21:29:37 +00001933}
1934
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001935static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001936{
Andreas Färber0d342822012-12-17 07:12:13 +01001937 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001938
Andreas Färber182735e2013-05-29 22:29:20 +02001939 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +02001940 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001941 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +02001942 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001943 }
Andreas Färberaa48dd92013-07-09 20:50:52 +02001944
1945 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001946}
1947
aliguori880a7572008-11-18 20:30:24 +00001948static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +00001949{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001950 CPUState *cpu;
bellardb4608c02003-06-27 17:34:32 +00001951 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001952 uint32_t thread;
1953 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +00001954 char buf[MAX_PACKET_LENGTH];
1955 uint8_t mem_buf[MAX_PACKET_LENGTH];
1956 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +00001957 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +00001958
bellard858693c2004-03-31 18:52:07 +00001959#ifdef DEBUG_GDB
1960 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +00001961#endif
bellard858693c2004-03-31 18:52:07 +00001962 p = line_buf;
1963 ch = *p++;
1964 switch(ch) {
1965 case '?':
bellard1fddef42005-04-17 19:16:13 +00001966 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +00001967 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001968 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +00001969 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +00001970 /* Remove all the breakpoints when this query is issued,
1971 * because gdb is doing and initial connect and the state
1972 * should be cleaned up.
1973 */
aliguori880a7572008-11-18 20:30:24 +00001974 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +00001975 break;
1976 case 'c':
1977 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +00001978 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00001979 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00001980 }
aurel32ca587a82008-12-18 22:44:13 +00001981 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +00001982 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00001983 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +00001984 case 'C':
aurel32ca587a82008-12-18 22:44:13 +00001985 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1986 if (s->signal == -1)
1987 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +00001988 gdb_continue(s);
1989 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02001990 case 'v':
1991 if (strncmp(p, "Cont", 4) == 0) {
1992 int res_signal, res_thread;
1993
1994 p += 4;
1995 if (*p == '?') {
1996 put_packet(s, "vCont;c;C;s;S");
1997 break;
1998 }
1999 res = 0;
2000 res_signal = 0;
2001 res_thread = 0;
2002 while (*p) {
2003 int action, signal;
2004
2005 if (*p++ != ';') {
2006 res = 0;
2007 break;
2008 }
2009 action = *p++;
2010 signal = 0;
2011 if (action == 'C' || action == 'S') {
2012 signal = strtoul(p, (char **)&p, 16);
2013 } else if (action != 'c' && action != 's') {
2014 res = 0;
2015 break;
2016 }
2017 thread = 0;
2018 if (*p == ':') {
2019 thread = strtoull(p+1, (char **)&p, 16);
2020 }
2021 action = tolower(action);
2022 if (res == 0 || (res == 'c' && action == 's')) {
2023 res = action;
2024 res_signal = signal;
2025 res_thread = thread;
2026 }
2027 }
2028 if (res) {
2029 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002030 cpu = find_cpu(res_thread);
2031 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002032 put_packet(s, "E22");
2033 break;
2034 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002035 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002036 }
2037 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002038 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +02002039 }
2040 s->signal = res_signal;
2041 gdb_continue(s);
2042 return RS_IDLE;
2043 }
2044 break;
2045 } else {
2046 goto unknown_command;
2047 }
edgar_igl7d03f822008-05-17 18:58:29 +00002048 case 'k':
Jan Kiszka00e94db2012-03-06 18:32:35 +01002049#ifdef CONFIG_USER_ONLY
edgar_igl7d03f822008-05-17 18:58:29 +00002050 /* Kill the target */
2051 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2052 exit(0);
Jan Kiszka00e94db2012-03-06 18:32:35 +01002053#endif
edgar_igl7d03f822008-05-17 18:58:29 +00002054 case 'D':
2055 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +00002056 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -03002057 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +00002058 gdb_continue(s);
2059 put_packet(s, "OK");
2060 break;
bellard858693c2004-03-31 18:52:07 +00002061 case 's':
2062 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +00002063 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +00002064 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +00002065 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002066 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +00002067 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +00002068 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +00002069 case 'F':
2070 {
2071 target_ulong ret;
2072 target_ulong err;
2073
2074 ret = strtoull(p, (char **)&p, 16);
2075 if (*p == ',') {
2076 p++;
2077 err = strtoull(p, (char **)&p, 16);
2078 } else {
2079 err = 0;
2080 }
2081 if (*p == ',')
2082 p++;
2083 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002084 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002085 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +00002086 s->current_syscall_cb = NULL;
2087 }
pbrooka2d1eba2007-01-28 03:10:55 +00002088 if (type == 'C') {
2089 put_packet(s, "T02");
2090 } else {
edgar_iglba70a622008-03-14 06:10:42 +00002091 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +00002092 }
2093 }
2094 break;
bellard858693c2004-03-31 18:52:07 +00002095 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002096 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00002097 len = 0;
Andreas Färbera0e372f2013-06-28 23:18:47 +02002098 for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002099 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +00002100 len += reg_size;
2101 }
2102 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +00002103 put_packet(s, buf);
2104 break;
2105 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002106 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +00002107 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +00002108 len = strlen(p) / 2;
2109 hextomem((uint8_t *)registers, p, len);
Andreas Färbera0e372f2013-06-28 23:18:47 +02002110 for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002111 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +00002112 len -= reg_size;
2113 registers += reg_size;
2114 }
bellard858693c2004-03-31 18:52:07 +00002115 put_packet(s, "OK");
2116 break;
2117 case 'm':
bellard9d9754a2006-06-25 15:32:37 +00002118 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002119 if (*p == ',')
2120 p++;
bellard9d9754a2006-06-25 15:32:37 +00002121 len = strtoull(p, NULL, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002122 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +00002123 put_packet (s, "E14");
2124 } else {
2125 memtohex(buf, mem_buf, len);
2126 put_packet(s, buf);
2127 }
bellard858693c2004-03-31 18:52:07 +00002128 break;
2129 case 'M':
bellard9d9754a2006-06-25 15:32:37 +00002130 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002131 if (*p == ',')
2132 p++;
bellard9d9754a2006-06-25 15:32:37 +00002133 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +00002134 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +00002135 p++;
2136 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002137 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +02002138 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +00002139 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002140 } else {
bellard858693c2004-03-31 18:52:07 +00002141 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +02002142 }
bellard858693c2004-03-31 18:52:07 +00002143 break;
pbrook56aebc82008-10-11 17:55:29 +00002144 case 'p':
2145 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2146 This works, but can be very slow. Anything new enough to
2147 understand XML also knows how to use this properly. */
2148 if (!gdb_has_xml)
2149 goto unknown_command;
2150 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002151 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002152 if (reg_size) {
2153 memtohex(buf, mem_buf, reg_size);
2154 put_packet(s, buf);
2155 } else {
2156 put_packet(s, "E14");
2157 }
2158 break;
2159 case 'P':
2160 if (!gdb_has_xml)
2161 goto unknown_command;
2162 addr = strtoull(p, (char **)&p, 16);
2163 if (*p == '=')
2164 p++;
2165 reg_size = strlen(p) / 2;
2166 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002167 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00002168 put_packet(s, "OK");
2169 break;
bellard858693c2004-03-31 18:52:07 +00002170 case 'Z':
bellard858693c2004-03-31 18:52:07 +00002171 case 'z':
2172 type = strtoul(p, (char **)&p, 16);
2173 if (*p == ',')
2174 p++;
bellard9d9754a2006-06-25 15:32:37 +00002175 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00002176 if (*p == ',')
2177 p++;
bellard9d9754a2006-06-25 15:32:37 +00002178 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00002179 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00002180 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002181 else
aliguori880a7572008-11-18 20:30:24 +00002182 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00002183 if (res >= 0)
2184 put_packet(s, "OK");
2185 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00002186 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00002187 else
2188 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00002189 break;
aliguori880a7572008-11-18 20:30:24 +00002190 case 'H':
2191 type = *p++;
2192 thread = strtoull(p, (char **)&p, 16);
2193 if (thread == -1 || thread == 0) {
2194 put_packet(s, "OK");
2195 break;
2196 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002197 cpu = find_cpu(thread);
2198 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00002199 put_packet(s, "E22");
2200 break;
2201 }
2202 switch (type) {
2203 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002204 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002205 put_packet(s, "OK");
2206 break;
2207 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002208 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002209 put_packet(s, "OK");
2210 break;
2211 default:
2212 put_packet(s, "E22");
2213 break;
2214 }
2215 break;
2216 case 'T':
2217 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002218 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002219
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002220 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002221 put_packet(s, "OK");
2222 } else {
aliguori880a7572008-11-18 20:30:24 +00002223 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002224 }
aliguori880a7572008-11-18 20:30:24 +00002225 break;
pbrook978efd62006-06-17 18:30:42 +00002226 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00002227 case 'Q':
2228 /* parse any 'q' packets here */
2229 if (!strcmp(p,"qemu.sstepbits")) {
2230 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00002231 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2232 SSTEP_ENABLE,
2233 SSTEP_NOIRQ,
2234 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00002235 put_packet(s, buf);
2236 break;
2237 } else if (strncmp(p,"qemu.sstep",10) == 0) {
2238 /* Display or change the sstep_flags */
2239 p += 10;
2240 if (*p != '=') {
2241 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00002242 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00002243 put_packet(s, buf);
2244 break;
2245 }
2246 p++;
2247 type = strtoul(p, (char **)&p, 16);
2248 sstep_flags = type;
2249 put_packet(s, "OK");
2250 break;
aliguori880a7572008-11-18 20:30:24 +00002251 } else if (strcmp(p,"C") == 0) {
2252 /* "Current thread" remains vague in the spec, so always return
2253 * the first CPU (gdb returns the first thread). */
2254 put_packet(s, "QC1");
2255 break;
2256 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02002257 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00002258 goto report_cpuinfo;
2259 } else if (strcmp(p,"sThreadInfo") == 0) {
2260 report_cpuinfo:
2261 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02002262 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00002263 put_packet(s, buf);
Andreas Färber52f34622013-06-27 13:44:40 +02002264 s->query_cpu = s->query_cpu->next_cpu;
aliguori880a7572008-11-18 20:30:24 +00002265 } else
2266 put_packet(s, "l");
2267 break;
2268 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2269 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002270 cpu = find_cpu(thread);
2271 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02002272 cpu_synchronize_state(cpu);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002273 len = snprintf((char *)mem_buf, sizeof(mem_buf),
Andreas Färber55e5c282012-12-17 06:18:02 +01002274 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01002275 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07002276 memtohex(buf, mem_buf, len);
2277 put_packet(s, buf);
2278 }
aliguori880a7572008-11-18 20:30:24 +00002279 break;
edgar_igl60897d32008-05-09 08:25:14 +00002280 }
blueswir10b8a9882009-03-07 10:51:36 +00002281#ifdef CONFIG_USER_ONLY
edgar_igl60897d32008-05-09 08:25:14 +00002282 else if (strncmp(p, "Offsets", 7) == 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002283 CPUArchState *env = s->c_cpu->env_ptr;
2284 TaskState *ts = env->opaque;
pbrook978efd62006-06-17 18:30:42 +00002285
blueswir1363a37d2008-08-21 17:58:08 +00002286 snprintf(buf, sizeof(buf),
2287 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2288 ";Bss=" TARGET_ABI_FMT_lx,
2289 ts->info->code_offset,
2290 ts->info->data_offset,
2291 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00002292 put_packet(s, buf);
2293 break;
2294 }
blueswir10b8a9882009-03-07 10:51:36 +00002295#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00002296 else if (strncmp(p, "Rcmd,", 5) == 0) {
2297 int len = strlen(p + 5);
2298
2299 if ((len % 2) != 0) {
2300 put_packet(s, "E01");
2301 break;
2302 }
2303 hextomem(mem_buf, p + 5, len);
2304 len = len / 2;
2305 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05002306 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00002307 put_packet(s, "OK");
2308 break;
2309 }
blueswir10b8a9882009-03-07 10:51:36 +00002310#endif /* !CONFIG_USER_ONLY */
pbrook56aebc82008-10-11 17:55:29 +00002311 if (strncmp(p, "Supported", 9) == 0) {
blueswir15b3715b2008-10-25 11:18:12 +00002312 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
pbrook56aebc82008-10-11 17:55:29 +00002313#ifdef GDB_CORE_XML
blueswir12dc766d2009-04-13 16:06:19 +00002314 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
pbrook56aebc82008-10-11 17:55:29 +00002315#endif
2316 put_packet(s, buf);
2317 break;
2318 }
2319#ifdef GDB_CORE_XML
2320 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2321 const char *xml;
2322 target_ulong total_len;
2323
2324 gdb_has_xml = 1;
2325 p += 19;
aliguori880a7572008-11-18 20:30:24 +00002326 xml = get_feature_xml(p, &p);
pbrook56aebc82008-10-11 17:55:29 +00002327 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00002328 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002329 put_packet(s, buf);
2330 break;
2331 }
2332
2333 if (*p == ':')
2334 p++;
2335 addr = strtoul(p, (char **)&p, 16);
2336 if (*p == ',')
2337 p++;
2338 len = strtoul(p, (char **)&p, 16);
2339
2340 total_len = strlen(xml);
2341 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00002342 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00002343 put_packet(s, buf);
2344 break;
2345 }
2346 if (len > (MAX_PACKET_LENGTH - 5) / 2)
2347 len = (MAX_PACKET_LENGTH - 5) / 2;
2348 if (len < total_len - addr) {
2349 buf[0] = 'm';
2350 len = memtox(buf + 1, xml + addr, len);
2351 } else {
2352 buf[0] = 'l';
2353 len = memtox(buf + 1, xml + addr, total_len - addr);
2354 }
2355 put_packet_binary(s, buf, len + 1);
2356 break;
2357 }
2358#endif
2359 /* Unrecognised 'q' command. */
2360 goto unknown_command;
2361
bellard858693c2004-03-31 18:52:07 +00002362 default:
pbrook56aebc82008-10-11 17:55:29 +00002363 unknown_command:
bellard858693c2004-03-31 18:52:07 +00002364 /* put empty packet */
2365 buf[0] = '\0';
2366 put_packet(s, buf);
2367 break;
2368 }
2369 return RS_IDLE;
2370}
2371
Andreas Färber64f6b342013-05-27 02:06:09 +02002372void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00002373{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002374 gdbserver_state->c_cpu = cpu;
2375 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00002376}
2377
bellard1fddef42005-04-17 19:16:13 +00002378#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002379static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00002380{
aliguori880a7572008-11-18 20:30:24 +00002381 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002382 CPUArchState *env = s->c_cpu->env_ptr;
2383 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00002384 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00002385 const char *type;
bellard858693c2004-03-31 18:52:07 +00002386 int ret;
2387
Meador Ingecdb432b2012-03-15 17:49:45 +00002388 if (running || s->state == RS_INACTIVE) {
2389 return;
2390 }
2391 /* Is there a GDB syscall waiting to be sent? */
2392 if (s->current_syscall_cb) {
2393 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00002394 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002395 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002396 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002397 case RUN_STATE_DEBUG:
aliguori880a7572008-11-18 20:30:24 +00002398 if (env->watchpoint_hit) {
2399 switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00002400 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00002401 type = "r";
2402 break;
aliguoria1d1bb32008-11-18 20:07:32 +00002403 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00002404 type = "a";
2405 break;
2406 default:
2407 type = "";
2408 break;
2409 }
aliguori880a7572008-11-18 20:30:24 +00002410 snprintf(buf, sizeof(buf),
2411 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01002412 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
aliguori880a7572008-11-18 20:30:24 +00002413 env->watchpoint_hit->vaddr);
aliguori880a7572008-11-18 20:30:24 +00002414 env->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01002415 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00002416 }
Jan Kiszka425189a2011-03-22 11:02:09 +01002417 tb_flush(env);
aurel32ca587a82008-12-18 22:44:13 +00002418 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01002419 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002420 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00002421 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01002422 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002423 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01002424 ret = GDB_SIGNAL_QUIT;
2425 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002426 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002427 ret = GDB_SIGNAL_IO;
2428 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002429 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01002430 ret = GDB_SIGNAL_ALRM;
2431 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002432 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01002433 ret = GDB_SIGNAL_ABRT;
2434 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002435 case RUN_STATE_SAVE_VM:
2436 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01002437 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002438 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01002439 ret = GDB_SIGNAL_XCPU;
2440 break;
2441 default:
2442 ret = GDB_SIGNAL_UNKNOWN;
2443 break;
bellardbbeb7b52006-04-23 18:42:15 +00002444 }
Andreas Färber0d342822012-12-17 07:12:13 +01002445 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01002446
2447send_packet:
bellard858693c2004-03-31 18:52:07 +00002448 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01002449
2450 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002451 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00002452}
bellard1fddef42005-04-17 19:16:13 +00002453#endif
bellard858693c2004-03-31 18:52:07 +00002454
pbrooka2d1eba2007-01-28 03:10:55 +00002455/* Send a gdb syscall request.
2456 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00002457 %x - target_ulong argument printed in hex.
2458 %lx - 64-bit argument printed in hex.
2459 %s - string pointer (target_ulong) and length (int) pair. */
blueswir17ccfb2e2008-09-14 06:45:34 +00002460void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
pbrooka2d1eba2007-01-28 03:10:55 +00002461{
2462 va_list va;
pbrooka2d1eba2007-01-28 03:10:55 +00002463 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00002464 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00002465 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00002466 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00002467 GDBState *s;
2468
aliguori880a7572008-11-18 20:30:24 +00002469 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00002470 if (!s)
2471 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00002472 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00002473#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002474 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00002475#endif
pbrooka2d1eba2007-01-28 03:10:55 +00002476 va_start(va, fmt);
Meador Ingecdb432b2012-03-15 17:49:45 +00002477 p = s->syscall_buf;
2478 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00002479 *(p++) = 'F';
2480 while (*fmt) {
2481 if (*fmt == '%') {
2482 fmt++;
2483 switch (*fmt++) {
2484 case 'x':
2485 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002486 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00002487 break;
pbrooka87295e2007-05-26 15:09:38 +00002488 case 'l':
2489 if (*(fmt++) != 'x')
2490 goto bad_format;
2491 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00002492 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00002493 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002494 case 's':
2495 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00002496 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00002497 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00002498 break;
2499 default:
pbrooka87295e2007-05-26 15:09:38 +00002500 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00002501 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2502 fmt - 1);
2503 break;
2504 }
2505 } else {
2506 *(p++) = *(fmt++);
2507 }
2508 }
pbrook8a93e022007-08-06 13:19:15 +00002509 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00002510 va_end(va);
pbrooka2d1eba2007-01-28 03:10:55 +00002511#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00002512 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002513 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00002514#else
Meador Ingecdb432b2012-03-15 17:49:45 +00002515 /* In this case wait to send the syscall packet until notification that
2516 the CPU has stopped. This must be done because if the packet is sent
2517 now the reply from the syscall request could be received while the CPU
2518 is still in the running state, which can cause packets to be dropped
2519 and state transition 'T' packets to be sent while the syscall is still
2520 being processed. */
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002521 cpu_exit(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00002522#endif
2523}
2524
bellard6a00d602005-11-21 23:25:50 +00002525static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00002526{
2527 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00002528 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00002529
bellard1fddef42005-04-17 19:16:13 +00002530#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00002531 if (s->last_packet_len) {
2532 /* Waiting for a response to the last packet. If we see the start
2533 of a new command then abandon the previous response. */
2534 if (ch == '-') {
2535#ifdef DEBUG_GDB
2536 printf("Got NACK, retransmitting\n");
2537#endif
thsffe8ab82007-12-16 03:16:05 +00002538 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00002539 }
2540#ifdef DEBUG_GDB
2541 else if (ch == '+')
2542 printf("Got ACK\n");
2543 else
2544 printf("Got '%c' when expecting ACK/NACK\n", ch);
2545#endif
2546 if (ch == '+' || ch == '$')
2547 s->last_packet_len = 0;
2548 if (ch != '$')
2549 return;
2550 }
Luiz Capitulino13548692011-07-29 15:36:43 -03002551 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00002552 /* when the CPU is running, we cannot do anything except stop
2553 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002554 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00002555 } else
bellard1fddef42005-04-17 19:16:13 +00002556#endif
bellard41625032005-04-24 10:07:11 +00002557 {
bellard858693c2004-03-31 18:52:07 +00002558 switch(s->state) {
2559 case RS_IDLE:
2560 if (ch == '$') {
2561 s->line_buf_index = 0;
2562 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00002563 }
2564 break;
bellard858693c2004-03-31 18:52:07 +00002565 case RS_GETLINE:
2566 if (ch == '#') {
2567 s->state = RS_CHKSUM1;
2568 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2569 s->state = RS_IDLE;
2570 } else {
2571 s->line_buf[s->line_buf_index++] = ch;
2572 }
2573 break;
2574 case RS_CHKSUM1:
2575 s->line_buf[s->line_buf_index] = '\0';
2576 s->line_csum = fromhex(ch) << 4;
2577 s->state = RS_CHKSUM2;
2578 break;
2579 case RS_CHKSUM2:
2580 s->line_csum |= fromhex(ch);
2581 csum = 0;
2582 for(i = 0; i < s->line_buf_index; i++) {
2583 csum += s->line_buf[i];
2584 }
2585 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00002586 reply = '-';
2587 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00002588 s->state = RS_IDLE;
2589 } else {
ths60fe76f2007-12-16 03:02:09 +00002590 reply = '+';
2591 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00002592 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00002593 }
bellardb4608c02003-06-27 17:34:32 +00002594 break;
pbrooka2d1eba2007-01-28 03:10:55 +00002595 default:
2596 abort();
bellardb4608c02003-06-27 17:34:32 +00002597 }
2598 }
bellard858693c2004-03-31 18:52:07 +00002599}
2600
Paul Brook0e1c9c52010-06-16 13:03:51 +01002601/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002602void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01002603{
2604 GDBState *s;
2605 char buf[4];
2606
2607 s = gdbserver_state;
2608 if (!s) {
2609 return;
2610 }
2611#ifdef CONFIG_USER_ONLY
2612 if (gdbserver_fd < 0 || s->fd < 0) {
2613 return;
2614 }
2615#endif
2616
2617 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2618 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002619
2620#ifndef CONFIG_USER_ONLY
2621 if (s->chr) {
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002622 qemu_chr_delete(s->chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01002623 }
2624#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01002625}
2626
bellard1fddef42005-04-17 19:16:13 +00002627#ifdef CONFIG_USER_ONLY
2628int
aurel32ca587a82008-12-18 22:44:13 +00002629gdb_queuesig (void)
2630{
2631 GDBState *s;
2632
2633 s = gdbserver_state;
2634
2635 if (gdbserver_fd < 0 || s->fd < 0)
2636 return 0;
2637 else
2638 return 1;
2639}
2640
2641int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002642gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00002643{
Andreas Färberdb6b81d2013-06-27 19:49:31 +02002644 CPUArchState *env = cpu->env_ptr;
Andreas Färber5ca666c2013-06-24 19:20:57 +02002645 GDBState *s;
2646 char buf[256];
2647 int n;
bellard1fddef42005-04-17 19:16:13 +00002648
Andreas Färber5ca666c2013-06-24 19:20:57 +02002649 s = gdbserver_state;
2650 if (gdbserver_fd < 0 || s->fd < 0) {
2651 return sig;
bellard1fddef42005-04-17 19:16:13 +00002652 }
2653
Andreas Färber5ca666c2013-06-24 19:20:57 +02002654 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02002655 cpu_single_step(cpu, 0);
Andreas Färber5ca666c2013-06-24 19:20:57 +02002656 tb_flush(env);
bellard1fddef42005-04-17 19:16:13 +00002657
Andreas Färber5ca666c2013-06-24 19:20:57 +02002658 if (sig != 0) {
2659 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
2660 put_packet(s, buf);
2661 }
2662 /* put_packet() might have detected that the peer terminated the
2663 connection. */
2664 if (s->fd < 0) {
2665 return sig;
2666 }
2667
2668 sig = 0;
2669 s->state = RS_IDLE;
2670 s->running_state = 0;
2671 while (s->running_state == 0) {
2672 n = read(s->fd, buf, 256);
2673 if (n > 0) {
2674 int i;
2675
2676 for (i = 0; i < n; i++) {
2677 gdb_read_byte(s, buf[i]);
2678 }
2679 } else if (n == 0 || errno != EAGAIN) {
2680 /* XXX: Connection closed. Should probably wait for another
2681 connection before continuing. */
2682 return sig;
bellard1fddef42005-04-17 19:16:13 +00002683 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02002684 }
2685 sig = s->signal;
2686 s->signal = 0;
2687 return sig;
bellard1fddef42005-04-17 19:16:13 +00002688}
bellarde9009672005-04-26 20:42:36 +00002689
aurel32ca587a82008-12-18 22:44:13 +00002690/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002691void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00002692{
Andreas Färber5ca666c2013-06-24 19:20:57 +02002693 GDBState *s;
2694 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00002695
Andreas Färber5ca666c2013-06-24 19:20:57 +02002696 s = gdbserver_state;
2697 if (gdbserver_fd < 0 || s->fd < 0) {
2698 return;
2699 }
aurel32ca587a82008-12-18 22:44:13 +00002700
Andreas Färber5ca666c2013-06-24 19:20:57 +02002701 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
2702 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00002703}
bellard1fddef42005-04-17 19:16:13 +00002704
aliguori880a7572008-11-18 20:30:24 +00002705static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00002706{
2707 GDBState *s;
2708 struct sockaddr_in sockaddr;
2709 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002710 int fd;
bellard858693c2004-03-31 18:52:07 +00002711
2712 for(;;) {
2713 len = sizeof(sockaddr);
2714 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2715 if (fd < 0 && errno != EINTR) {
2716 perror("accept");
2717 return;
2718 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002719#ifndef _WIN32
2720 fcntl(fd, F_SETFD, FD_CLOEXEC);
2721#endif
bellard858693c2004-03-31 18:52:07 +00002722 break;
2723 }
2724 }
2725
2726 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09002727 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00002728
Anthony Liguori7267c092011-08-20 22:09:37 -05002729 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002730 s->c_cpu = first_cpu;
2731 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00002732 s->fd = fd;
pbrook56aebc82008-10-11 17:55:29 +00002733 gdb_has_xml = 0;
bellard858693c2004-03-31 18:52:07 +00002734
aliguori880a7572008-11-18 20:30:24 +00002735 gdbserver_state = s;
pbrooka2d1eba2007-01-28 03:10:55 +00002736
bellard858693c2004-03-31 18:52:07 +00002737 fcntl(fd, F_SETFL, O_NONBLOCK);
bellard858693c2004-03-31 18:52:07 +00002738}
2739
2740static int gdbserver_open(int port)
2741{
2742 struct sockaddr_in sockaddr;
2743 int fd, val, ret;
2744
2745 fd = socket(PF_INET, SOCK_STREAM, 0);
2746 if (fd < 0) {
2747 perror("socket");
2748 return -1;
2749 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01002750#ifndef _WIN32
2751 fcntl(fd, F_SETFD, FD_CLOEXEC);
2752#endif
bellard858693c2004-03-31 18:52:07 +00002753
2754 /* allow fast reuse */
2755 val = 1;
Stefan Weil9957fc72013-03-08 19:58:32 +01002756 qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
bellard858693c2004-03-31 18:52:07 +00002757
2758 sockaddr.sin_family = AF_INET;
2759 sockaddr.sin_port = htons(port);
2760 sockaddr.sin_addr.s_addr = 0;
2761 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2762 if (ret < 0) {
2763 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00002764 close(fd);
bellard858693c2004-03-31 18:52:07 +00002765 return -1;
2766 }
2767 ret = listen(fd, 0);
2768 if (ret < 0) {
2769 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00002770 close(fd);
bellard858693c2004-03-31 18:52:07 +00002771 return -1;
2772 }
bellard858693c2004-03-31 18:52:07 +00002773 return fd;
2774}
2775
2776int gdbserver_start(int port)
2777{
2778 gdbserver_fd = gdbserver_open(port);
2779 if (gdbserver_fd < 0)
2780 return -1;
2781 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00002782 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00002783 return 0;
2784}
aurel322b1319c2008-12-18 22:44:04 +00002785
2786/* Disable gdb stub for child processes. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01002787void gdbserver_fork(CPUArchState *env)
aurel322b1319c2008-12-18 22:44:04 +00002788{
2789 GDBState *s = gdbserver_state;
edgar_igl9f6164d2009-01-07 10:22:28 +00002790 if (gdbserver_fd < 0 || s->fd < 0)
aurel322b1319c2008-12-18 22:44:04 +00002791 return;
2792 close(s->fd);
2793 s->fd = -1;
2794 cpu_breakpoint_remove_all(env, BP_GDB);
2795 cpu_watchpoint_remove_all(env, BP_GDB);
2796}
pbrook4046d912007-01-28 01:53:16 +00002797#else
thsaa1f17c2007-07-11 22:48:58 +00002798static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00002799{
pbrook56aebc82008-10-11 17:55:29 +00002800 /* We can handle an arbitrarily large amount of data.
2801 Pick the maximum packet size, which is as good as anything. */
2802 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00002803}
2804
thsaa1f17c2007-07-11 22:48:58 +00002805static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00002806{
pbrook4046d912007-01-28 01:53:16 +00002807 int i;
2808
2809 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00002810 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00002811 }
2812}
2813
2814static void gdb_chr_event(void *opaque, int event)
2815{
2816 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05302817 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002818 vm_stop(RUN_STATE_PAUSED);
pbrook56aebc82008-10-11 17:55:29 +00002819 gdb_has_xml = 0;
pbrook4046d912007-01-28 01:53:16 +00002820 break;
2821 default:
2822 break;
2823 }
2824}
2825
aliguori8a34a0f2009-03-05 23:01:55 +00002826static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2827{
2828 char buf[MAX_PACKET_LENGTH];
2829
2830 buf[0] = 'O';
2831 if (len > (MAX_PACKET_LENGTH/2) - 1)
2832 len = (MAX_PACKET_LENGTH/2) - 1;
2833 memtohex(buf + 1, (uint8_t *)msg, len);
2834 put_packet(s, buf);
2835}
2836
2837static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2838{
2839 const char *p = (const char *)buf;
2840 int max_sz;
2841
2842 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2843 for (;;) {
2844 if (len <= max_sz) {
2845 gdb_monitor_output(gdbserver_state, p, len);
2846 break;
2847 }
2848 gdb_monitor_output(gdbserver_state, p, max_sz);
2849 p += max_sz;
2850 len -= max_sz;
2851 }
2852 return len;
2853}
2854
aliguori59030a82009-04-05 18:43:41 +00002855#ifndef _WIN32
2856static void gdb_sigterm_handler(int signal)
2857{
Luiz Capitulino13548692011-07-29 15:36:43 -03002858 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03002859 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01002860 }
aliguori59030a82009-04-05 18:43:41 +00002861}
2862#endif
2863
2864int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00002865{
2866 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00002867 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00002868 CharDriverState *chr = NULL;
2869 CharDriverState *mon_chr;
pbrook4046d912007-01-28 01:53:16 +00002870
aliguori59030a82009-04-05 18:43:41 +00002871 if (!device)
2872 return -1;
2873 if (strcmp(device, "none") != 0) {
2874 if (strstart(device, "tcp:", NULL)) {
2875 /* enforce required TCP attributes */
2876 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2877 "%s,nowait,nodelay,server", device);
2878 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00002879 }
aliguori59030a82009-04-05 18:43:41 +00002880#ifndef _WIN32
2881 else if (strcmp(device, "stdio") == 0) {
2882 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00002883
aliguori59030a82009-04-05 18:43:41 +00002884 memset(&act, 0, sizeof(act));
2885 act.sa_handler = gdb_sigterm_handler;
2886 sigaction(SIGINT, &act, NULL);
2887 }
2888#endif
Anthony Liguori27143a42011-08-15 11:17:36 -05002889 chr = qemu_chr_new("gdb", device, NULL);
aliguori36556b22009-03-28 18:05:53 +00002890 if (!chr)
2891 return -1;
2892
Hans de Goede456d6062013-03-27 20:29:40 +01002893 qemu_chr_fe_claim_no_fail(chr);
aliguori36556b22009-03-28 18:05:53 +00002894 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2895 gdb_chr_event, NULL);
pbrookcfc34752007-02-22 01:48:01 +00002896 }
2897
aliguori36556b22009-03-28 18:05:53 +00002898 s = gdbserver_state;
2899 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05002900 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00002901 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00002902
aliguori36556b22009-03-28 18:05:53 +00002903 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2904
2905 /* Initialize a monitor terminal for gdb */
Anthony Liguori7267c092011-08-20 22:09:37 -05002906 mon_chr = g_malloc0(sizeof(*mon_chr));
aliguori36556b22009-03-28 18:05:53 +00002907 mon_chr->chr_write = gdb_monitor_write;
2908 monitor_init(mon_chr, 0);
2909 } else {
2910 if (s->chr)
Anthony Liguori70f24fb2011-08-15 11:17:38 -05002911 qemu_chr_delete(s->chr);
aliguori36556b22009-03-28 18:05:53 +00002912 mon_chr = s->mon_chr;
2913 memset(s, 0, sizeof(GDBState));
2914 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02002915 s->c_cpu = first_cpu;
2916 s->g_cpu = first_cpu;
pbrook4046d912007-01-28 01:53:16 +00002917 s->chr = chr;
aliguori36556b22009-03-28 18:05:53 +00002918 s->state = chr ? RS_IDLE : RS_INACTIVE;
2919 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00002920 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00002921
pbrook4046d912007-01-28 01:53:16 +00002922 return 0;
2923}
2924#endif