blob: de62d2609647ec52dd1aaef0e6eab87bfc69fe1d [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 */
Peter Maydelld38ea872016-01-29 17:50:05 +000019#include "qemu/osdep.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010020#include "qapi/error.h"
Veronia Bahaaf348b6d2016-03-20 19:16:19 +020021#include "qemu/cutils.h"
Paolo Bonzini33c11872016-03-15 16:58:45 +010022#include "cpu.h"
Veronia Bahaaf348b6d2016-03-20 19:16:19 +020023#ifdef CONFIG_USER_ONLY
bellard1fddef42005-04-17 19:16:13 +000024#include "qemu.h"
25#else
Paolo Bonzini83c90892012-12-17 18:19:49 +010026#include "monitor/monitor.h"
Paolo Bonzinidccfcd02013-04-08 16:55:25 +020027#include "sysemu/char.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010028#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010029#include "exec/gdbstub.h"
bellard1fddef42005-04-17 19:16:13 +000030#endif
bellard67b915a2004-03-31 23:37:16 +000031
pbrook56aebc82008-10-11 17:55:29 +000032#define MAX_PACKET_LENGTH 4096
33
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010034#include "qemu/sockets.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010035#include "sysemu/kvm.h"
Leon Alraecfe67ce2015-06-19 14:17:45 +010036#include "exec/semihost.h"
Paolo Bonzini63c91552016-03-15 13:18:37 +010037#include "exec/exec-all.h"
aurel32ca587a82008-12-18 22:44:13 +000038
Jan Kiszkaa3919382015-02-07 09:38:44 +010039#ifdef CONFIG_USER_ONLY
40#define GDB_ATTACHED "0"
41#else
42#define GDB_ATTACHED "1"
43#endif
44
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
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +0300305 CharBackend 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
Andreas Färber5b50e792013-06-29 04:18:45 +0200319bool gdb_has_xml;
pbrook56aebc82008-10-11 17:55:29 +0000320
bellard1fddef42005-04-17 19:16:13 +0000321#ifdef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +0000322/* XXX: This is not thread safe. Do we care? */
323static int gdbserver_fd = -1;
324
bellard858693c2004-03-31 18:52:07 +0000325static int get_char(GDBState *s)
bellardb4608c02003-06-27 17:34:32 +0000326{
327 uint8_t ch;
328 int ret;
329
330 for(;;) {
Blue Swirl00aa0042011-07-23 20:04:29 +0000331 ret = qemu_recv(s->fd, &ch, 1, 0);
bellardb4608c02003-06-27 17:34:32 +0000332 if (ret < 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000333 if (errno == ECONNRESET)
334 s->fd = -1;
Peter Wu5819e3e2016-06-05 16:35:48 +0200335 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000336 return -1;
337 } else if (ret == 0) {
edgar_igl1f487ee2008-05-17 22:20:53 +0000338 close(s->fd);
339 s->fd = -1;
bellardb4608c02003-06-27 17:34:32 +0000340 return -1;
341 } else {
342 break;
343 }
344 }
345 return ch;
346}
pbrook4046d912007-01-28 01:53:16 +0000347#endif
bellardb4608c02003-06-27 17:34:32 +0000348
blueswir1654efcf2009-04-18 07:29:59 +0000349static enum {
pbrooka2d1eba2007-01-28 03:10:55 +0000350 GDB_SYS_UNKNOWN,
351 GDB_SYS_ENABLED,
352 GDB_SYS_DISABLED,
353} gdb_syscall_mode;
354
Liviu Ionescua38bb072014-12-11 12:07:48 +0000355/* Decide if either remote gdb syscalls or native file IO should be used. */
pbrooka2d1eba2007-01-28 03:10:55 +0000356int use_gdb_syscalls(void)
357{
Leon Alraecfe67ce2015-06-19 14:17:45 +0100358 SemihostingTarget target = semihosting_get_target();
359 if (target == SEMIHOSTING_TARGET_NATIVE) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000360 /* -semihosting-config target=native */
361 return false;
Leon Alraecfe67ce2015-06-19 14:17:45 +0100362 } else if (target == SEMIHOSTING_TARGET_GDB) {
Liviu Ionescua38bb072014-12-11 12:07:48 +0000363 /* -semihosting-config target=gdb */
364 return true;
365 }
366
367 /* -semihosting-config target=auto */
368 /* On the first call check if gdb is connected and remember. */
pbrooka2d1eba2007-01-28 03:10:55 +0000369 if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
aliguori880a7572008-11-18 20:30:24 +0000370 gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
371 : GDB_SYS_DISABLED);
pbrooka2d1eba2007-01-28 03:10:55 +0000372 }
373 return gdb_syscall_mode == GDB_SYS_ENABLED;
374}
375
edgar_iglba70a622008-03-14 06:10:42 +0000376/* Resume execution. */
377static inline void gdb_continue(GDBState *s)
378{
379#ifdef CONFIG_USER_ONLY
380 s->running_state = 1;
381#else
Paolo Bonzini26ac7a32013-06-03 17:06:54 +0200382 if (!runstate_needs_reset()) {
Paolo Bonzini87f25c12013-05-30 13:20:40 +0200383 vm_start();
384 }
edgar_iglba70a622008-03-14 06:10:42 +0000385#endif
386}
387
bellard858693c2004-03-31 18:52:07 +0000388static void put_buffer(GDBState *s, const uint8_t *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000389{
pbrook4046d912007-01-28 01:53:16 +0000390#ifdef CONFIG_USER_ONLY
bellardb4608c02003-06-27 17:34:32 +0000391 int ret;
392
393 while (len > 0) {
bellard8f447cc2006-06-14 15:21:14 +0000394 ret = send(s->fd, buf, len, 0);
bellardb4608c02003-06-27 17:34:32 +0000395 if (ret < 0) {
Peter Wu5819e3e2016-06-05 16:35:48 +0200396 if (errno != EINTR)
bellardb4608c02003-06-27 17:34:32 +0000397 return;
398 } else {
399 buf += ret;
400 len -= ret;
401 }
402 }
pbrook4046d912007-01-28 01:53:16 +0000403#else
Daniel P. Berrange6ab3fc32016-09-06 14:56:04 +0100404 /* XXX this blocks entire thread. Rewrite to use
405 * qemu_chr_fe_write and background I/O callbacks */
Marc-André Lureau5345fdb2016-10-22 12:52:55 +0300406 qemu_chr_fe_write_all(&s->chr, buf, len);
pbrook4046d912007-01-28 01:53:16 +0000407#endif
bellardb4608c02003-06-27 17:34:32 +0000408}
409
410static inline int fromhex(int v)
411{
412 if (v >= '0' && v <= '9')
413 return v - '0';
414 else if (v >= 'A' && v <= 'F')
415 return v - 'A' + 10;
416 else if (v >= 'a' && v <= 'f')
417 return v - 'a' + 10;
418 else
419 return 0;
420}
421
422static inline int tohex(int v)
423{
424 if (v < 10)
425 return v + '0';
426 else
427 return v - 10 + 'a';
428}
429
430static void memtohex(char *buf, const uint8_t *mem, int len)
431{
432 int i, c;
433 char *q;
434 q = buf;
435 for(i = 0; i < len; i++) {
436 c = mem[i];
437 *q++ = tohex(c >> 4);
438 *q++ = tohex(c & 0xf);
439 }
440 *q = '\0';
441}
442
443static void hextomem(uint8_t *mem, const char *buf, int len)
444{
445 int i;
446
447 for(i = 0; i < len; i++) {
448 mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
449 buf += 2;
450 }
451}
452
bellardb4608c02003-06-27 17:34:32 +0000453/* return -1 if error, 0 if OK */
pbrook56aebc82008-10-11 17:55:29 +0000454static int put_packet_binary(GDBState *s, const char *buf, int len)
bellardb4608c02003-06-27 17:34:32 +0000455{
pbrook56aebc82008-10-11 17:55:29 +0000456 int csum, i;
ths60fe76f2007-12-16 03:02:09 +0000457 uint8_t *p;
bellardb4608c02003-06-27 17:34:32 +0000458
bellardb4608c02003-06-27 17:34:32 +0000459 for(;;) {
pbrook4046d912007-01-28 01:53:16 +0000460 p = s->last_packet;
461 *(p++) = '$';
pbrook4046d912007-01-28 01:53:16 +0000462 memcpy(p, buf, len);
463 p += len;
bellardb4608c02003-06-27 17:34:32 +0000464 csum = 0;
465 for(i = 0; i < len; i++) {
466 csum += buf[i];
467 }
pbrook4046d912007-01-28 01:53:16 +0000468 *(p++) = '#';
469 *(p++) = tohex((csum >> 4) & 0xf);
470 *(p++) = tohex((csum) & 0xf);
bellardb4608c02003-06-27 17:34:32 +0000471
pbrook4046d912007-01-28 01:53:16 +0000472 s->last_packet_len = p - s->last_packet;
thsffe8ab82007-12-16 03:16:05 +0000473 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
bellardb4608c02003-06-27 17:34:32 +0000474
pbrook4046d912007-01-28 01:53:16 +0000475#ifdef CONFIG_USER_ONLY
476 i = get_char(s);
477 if (i < 0)
bellardb4608c02003-06-27 17:34:32 +0000478 return -1;
pbrook4046d912007-01-28 01:53:16 +0000479 if (i == '+')
bellardb4608c02003-06-27 17:34:32 +0000480 break;
pbrook4046d912007-01-28 01:53:16 +0000481#else
482 break;
483#endif
bellardb4608c02003-06-27 17:34:32 +0000484 }
485 return 0;
486}
487
pbrook56aebc82008-10-11 17:55:29 +0000488/* return -1 if error, 0 if OK */
489static int put_packet(GDBState *s, const char *buf)
490{
491#ifdef DEBUG_GDB
492 printf("reply='%s'\n", buf);
493#endif
494
495 return put_packet_binary(s, buf, strlen(buf));
496}
497
pbrook56aebc82008-10-11 17:55:29 +0000498/* Encode data using the encoding for 'x' packets. */
499static int memtox(char *buf, const char *mem, int len)
500{
501 char *p = buf;
502 char c;
503
504 while (len--) {
505 c = *(mem++);
506 switch (c) {
507 case '#': case '$': case '*': case '}':
508 *(p++) = '}';
509 *(p++) = c ^ 0x20;
510 break;
511 default:
512 *(p++) = c;
513 break;
514 }
515 }
516 return p - buf;
517}
518
Andreas Färber5b24c642013-07-07 15:08:22 +0200519static const char *get_feature_xml(const char *p, const char **newp,
520 CPUClass *cc)
pbrook56aebc82008-10-11 17:55:29 +0000521{
pbrook56aebc82008-10-11 17:55:29 +0000522 size_t len;
523 int i;
524 const char *name;
525 static char target_xml[1024];
526
527 len = 0;
528 while (p[len] && p[len] != ':')
529 len++;
530 *newp = p + len;
531
532 name = NULL;
533 if (strncmp(p, "target.xml", len) == 0) {
534 /* Generate the XML description for this CPU. */
535 if (!target_xml[0]) {
536 GDBRegisterState *r;
Andreas Färbereac8b352013-06-28 21:11:37 +0200537 CPUState *cpu = first_cpu;
pbrook56aebc82008-10-11 17:55:29 +0000538
David Hildenbrandb3820e62015-12-03 13:14:41 +0100539 pstrcat(target_xml, sizeof(target_xml),
540 "<?xml version=\"1.0\"?>"
541 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
542 "<target>");
543 if (cc->gdb_arch_name) {
544 gchar *arch = cc->gdb_arch_name(cpu);
545 pstrcat(target_xml, sizeof(target_xml), "<architecture>");
546 pstrcat(target_xml, sizeof(target_xml), arch);
547 pstrcat(target_xml, sizeof(target_xml), "</architecture>");
548 g_free(arch);
549 }
550 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
551 pstrcat(target_xml, sizeof(target_xml), cc->gdb_core_xml_file);
552 pstrcat(target_xml, sizeof(target_xml), "\"/>");
Andreas Färbereac8b352013-06-28 21:11:37 +0200553 for (r = cpu->gdb_regs; r; r = r->next) {
blueswir12dc766d2009-04-13 16:06:19 +0000554 pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
555 pstrcat(target_xml, sizeof(target_xml), r->xml);
556 pstrcat(target_xml, sizeof(target_xml), "\"/>");
pbrook56aebc82008-10-11 17:55:29 +0000557 }
blueswir12dc766d2009-04-13 16:06:19 +0000558 pstrcat(target_xml, sizeof(target_xml), "</target>");
pbrook56aebc82008-10-11 17:55:29 +0000559 }
560 return target_xml;
561 }
562 for (i = 0; ; i++) {
563 name = xml_builtin[i][0];
564 if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
565 break;
566 }
567 return name ? xml_builtin[i][1] : NULL;
568}
pbrook56aebc82008-10-11 17:55:29 +0000569
Andreas Färber385b9f02013-06-27 18:25:36 +0200570static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000571{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200572 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200573 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000574 GDBRegisterState *r;
575
Andreas Färbera0e372f2013-06-28 23:18:47 +0200576 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200577 return cc->gdb_read_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200578 }
pbrook56aebc82008-10-11 17:55:29 +0000579
Andreas Färbereac8b352013-06-28 21:11:37 +0200580 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000581 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
582 return r->get_reg(env, mem_buf, reg - r->base_reg);
583 }
584 }
585 return 0;
586}
587
Andreas Färber385b9f02013-06-27 18:25:36 +0200588static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
pbrook56aebc82008-10-11 17:55:29 +0000589{
Andreas Färbera0e372f2013-06-28 23:18:47 +0200590 CPUClass *cc = CPU_GET_CLASS(cpu);
Andreas Färber385b9f02013-06-27 18:25:36 +0200591 CPUArchState *env = cpu->env_ptr;
pbrook56aebc82008-10-11 17:55:29 +0000592 GDBRegisterState *r;
593
Andreas Färbera0e372f2013-06-28 23:18:47 +0200594 if (reg < cc->gdb_num_core_regs) {
Andreas Färber5b50e792013-06-29 04:18:45 +0200595 return cc->gdb_write_register(cpu, mem_buf, reg);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200596 }
pbrook56aebc82008-10-11 17:55:29 +0000597
Andreas Färbereac8b352013-06-28 21:11:37 +0200598 for (r = cpu->gdb_regs; r; r = r->next) {
pbrook56aebc82008-10-11 17:55:29 +0000599 if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
600 return r->set_reg(env, mem_buf, reg - r->base_reg);
601 }
602 }
603 return 0;
604}
605
606/* Register a supplemental set of CPU registers. If g_pos is nonzero it
607 specifies the first register number and these registers are included in
608 a standard "g" packet. Direction is relative to gdb, i.e. get_reg is
609 gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
610 */
611
Andreas Färber22169d42013-06-28 21:27:39 +0200612void gdb_register_coprocessor(CPUState *cpu,
613 gdb_reg_cb get_reg, gdb_reg_cb set_reg,
614 int num_regs, const char *xml, int g_pos)
pbrook56aebc82008-10-11 17:55:29 +0000615{
616 GDBRegisterState *s;
617 GDBRegisterState **p;
pbrook56aebc82008-10-11 17:55:29 +0000618
Andreas Färbereac8b352013-06-28 21:11:37 +0200619 p = &cpu->gdb_regs;
pbrook56aebc82008-10-11 17:55:29 +0000620 while (*p) {
621 /* Check for duplicates. */
622 if (strcmp((*p)->xml, xml) == 0)
623 return;
624 p = &(*p)->next;
625 }
Stefan Weil9643c252011-10-18 22:25:38 +0200626
627 s = g_new0(GDBRegisterState, 1);
Andreas Färbera0e372f2013-06-28 23:18:47 +0200628 s->base_reg = cpu->gdb_num_regs;
Stefan Weil9643c252011-10-18 22:25:38 +0200629 s->num_regs = num_regs;
630 s->get_reg = get_reg;
631 s->set_reg = set_reg;
632 s->xml = xml;
633
pbrook56aebc82008-10-11 17:55:29 +0000634 /* Add to end of list. */
Andreas Färbera0e372f2013-06-28 23:18:47 +0200635 cpu->gdb_num_regs += num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000636 *p = s;
637 if (g_pos) {
638 if (g_pos != s->base_reg) {
639 fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
640 "Expected %d got %d\n", xml, g_pos, s->base_reg);
Andreas Färber35143f02013-08-12 18:09:47 +0200641 } else {
642 cpu->gdb_num_g_regs = cpu->gdb_num_regs;
pbrook56aebc82008-10-11 17:55:29 +0000643 }
644 }
645}
646
aliguoria1d1bb32008-11-18 20:07:32 +0000647#ifndef CONFIG_USER_ONLY
Peter Maydell2472b6c2014-09-12 19:04:17 +0100648/* Translate GDB watchpoint type to a flags value for cpu_watchpoint_* */
649static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
650{
651 static const int xlat[] = {
652 [GDB_WATCHPOINT_WRITE] = BP_GDB | BP_MEM_WRITE,
653 [GDB_WATCHPOINT_READ] = BP_GDB | BP_MEM_READ,
654 [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
655 };
656
657 CPUClass *cc = CPU_GET_CLASS(cpu);
658 int cputype = xlat[gdbtype];
659
660 if (cc->gdb_stop_before_watchpoint) {
661 cputype |= BP_STOP_BEFORE_ACCESS;
662 }
663 return cputype;
664}
aliguoria1d1bb32008-11-18 20:07:32 +0000665#endif
666
aliguori880a7572008-11-18 20:30:24 +0000667static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000668{
Andreas Färber182735e2013-05-29 22:29:20 +0200669 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000670 int err = 0;
671
Andreas Färber62278812013-06-27 17:12:06 +0200672 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200673 return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200674 }
aliguorie22a25c2009-03-12 20:12:48 +0000675
aliguoria1d1bb32008-11-18 20:07:32 +0000676 switch (type) {
677 case GDB_BREAKPOINT_SW:
678 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200679 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200680 err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL);
681 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000682 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200683 }
aliguori880a7572008-11-18 20:30:24 +0000684 }
685 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000686#ifndef CONFIG_USER_ONLY
687 case GDB_WATCHPOINT_WRITE:
688 case GDB_WATCHPOINT_READ:
689 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200690 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100691 err = cpu_watchpoint_insert(cpu, addr, len,
692 xlat_gdb_type(cpu, type), NULL);
693 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000694 break;
Peter Maydell2472b6c2014-09-12 19:04:17 +0100695 }
aliguori880a7572008-11-18 20:30:24 +0000696 }
697 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000698#endif
699 default:
700 return -ENOSYS;
701 }
702}
703
aliguori880a7572008-11-18 20:30:24 +0000704static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
aliguoria1d1bb32008-11-18 20:07:32 +0000705{
Andreas Färber182735e2013-05-29 22:29:20 +0200706 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000707 int err = 0;
708
Andreas Färber62278812013-06-27 17:12:06 +0200709 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200710 return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
Andreas Färber62278812013-06-27 17:12:06 +0200711 }
aliguorie22a25c2009-03-12 20:12:48 +0000712
aliguoria1d1bb32008-11-18 20:07:32 +0000713 switch (type) {
714 case GDB_BREAKPOINT_SW:
715 case GDB_BREAKPOINT_HW:
Andreas Färberbdc44642013-06-24 23:50:24 +0200716 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200717 err = cpu_breakpoint_remove(cpu, addr, BP_GDB);
718 if (err) {
aliguori880a7572008-11-18 20:30:24 +0000719 break;
Andreas Färberb3310ab2013-09-02 17:26:20 +0200720 }
aliguori880a7572008-11-18 20:30:24 +0000721 }
722 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000723#ifndef CONFIG_USER_ONLY
724 case GDB_WATCHPOINT_WRITE:
725 case GDB_WATCHPOINT_READ:
726 case GDB_WATCHPOINT_ACCESS:
Andreas Färberbdc44642013-06-24 23:50:24 +0200727 CPU_FOREACH(cpu) {
Peter Maydell2472b6c2014-09-12 19:04:17 +0100728 err = cpu_watchpoint_remove(cpu, addr, len,
729 xlat_gdb_type(cpu, type));
aliguori880a7572008-11-18 20:30:24 +0000730 if (err)
731 break;
732 }
733 return err;
aliguoria1d1bb32008-11-18 20:07:32 +0000734#endif
735 default:
736 return -ENOSYS;
737 }
738}
739
aliguori880a7572008-11-18 20:30:24 +0000740static void gdb_breakpoint_remove_all(void)
aliguoria1d1bb32008-11-18 20:07:32 +0000741{
Andreas Färber182735e2013-05-29 22:29:20 +0200742 CPUState *cpu;
aliguori880a7572008-11-18 20:30:24 +0000743
aliguorie22a25c2009-03-12 20:12:48 +0000744 if (kvm_enabled()) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200745 kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
aliguorie22a25c2009-03-12 20:12:48 +0000746 return;
747 }
748
Andreas Färberbdc44642013-06-24 23:50:24 +0200749 CPU_FOREACH(cpu) {
Andreas Färberb3310ab2013-09-02 17:26:20 +0200750 cpu_breakpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000751#ifndef CONFIG_USER_ONLY
Andreas Färber75a34032013-09-02 16:57:02 +0200752 cpu_watchpoint_remove_all(cpu, BP_GDB);
aliguoria1d1bb32008-11-18 20:07:32 +0000753#endif
aliguori880a7572008-11-18 20:30:24 +0000754 }
aliguoria1d1bb32008-11-18 20:07:32 +0000755}
756
aurel32fab9d282009-04-08 21:29:37 +0000757static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
758{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200759 CPUState *cpu = s->c_cpu;
Andreas Färberf45748f2013-06-21 19:09:18 +0200760
761 cpu_synchronize_state(cpu);
Peter Crosthwaite4a2b24e2015-06-23 20:19:21 -0700762 cpu_set_pc(cpu, pc);
aurel32fab9d282009-04-08 21:29:37 +0000763}
764
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200765static CPUState *find_cpu(uint32_t thread_id)
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700766{
Andreas Färber0d342822012-12-17 07:12:13 +0100767 CPUState *cpu;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700768
Andreas Färberbdc44642013-06-24 23:50:24 +0200769 CPU_FOREACH(cpu) {
Andreas Färberaa48dd92013-07-09 20:50:52 +0200770 if (cpu_index(cpu) == thread_id) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200771 return cpu;
Andreas Färberaa48dd92013-07-09 20:50:52 +0200772 }
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700773 }
Andreas Färberaa48dd92013-07-09 20:50:52 +0200774
775 return NULL;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700776}
777
Jan Kiszka4dabe742015-02-07 09:38:43 +0100778static int is_query_packet(const char *p, const char *query, char separator)
779{
780 unsigned int query_len = strlen(query);
781
782 return strncmp(p, query, query_len) == 0 &&
783 (p[query_len] == '\0' || p[query_len] == separator);
784}
785
aliguori880a7572008-11-18 20:30:24 +0000786static int gdb_handle_packet(GDBState *s, const char *line_buf)
bellardb4608c02003-06-27 17:34:32 +0000787{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200788 CPUState *cpu;
Andreas Färber5b24c642013-07-07 15:08:22 +0200789 CPUClass *cc;
bellardb4608c02003-06-27 17:34:32 +0000790 const char *p;
Nathan Froyd1e9fa732009-06-03 11:33:08 -0700791 uint32_t thread;
792 int ch, reg_size, type, res;
pbrook56aebc82008-10-11 17:55:29 +0000793 char buf[MAX_PACKET_LENGTH];
794 uint8_t mem_buf[MAX_PACKET_LENGTH];
795 uint8_t *registers;
bellard9d9754a2006-06-25 15:32:37 +0000796 target_ulong addr, len;
ths3b46e622007-09-17 08:09:54 +0000797
bellard858693c2004-03-31 18:52:07 +0000798#ifdef DEBUG_GDB
799 printf("command='%s'\n", line_buf);
bellard4c3a88a2003-07-26 12:06:08 +0000800#endif
bellard858693c2004-03-31 18:52:07 +0000801 p = line_buf;
802 ch = *p++;
803 switch(ch) {
804 case '?':
bellard1fddef42005-04-17 19:16:13 +0000805 /* TODO: Make this return the correct value for user-mode. */
aurel32ca587a82008-12-18 22:44:13 +0000806 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200807 cpu_index(s->c_cpu));
bellard858693c2004-03-31 18:52:07 +0000808 put_packet(s, buf);
edgar_igl7d03f822008-05-17 18:58:29 +0000809 /* Remove all the breakpoints when this query is issued,
810 * because gdb is doing and initial connect and the state
811 * should be cleaned up.
812 */
aliguori880a7572008-11-18 20:30:24 +0000813 gdb_breakpoint_remove_all();
bellard858693c2004-03-31 18:52:07 +0000814 break;
815 case 'c':
816 if (*p != '\0') {
bellard9d9754a2006-06-25 15:32:37 +0000817 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000818 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000819 }
aurel32ca587a82008-12-18 22:44:13 +0000820 s->signal = 0;
edgar_iglba70a622008-03-14 06:10:42 +0000821 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000822 return RS_IDLE;
edgar_igl1f487ee2008-05-17 22:20:53 +0000823 case 'C':
aurel32ca587a82008-12-18 22:44:13 +0000824 s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
825 if (s->signal == -1)
826 s->signal = 0;
edgar_igl1f487ee2008-05-17 22:20:53 +0000827 gdb_continue(s);
828 return RS_IDLE;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200829 case 'v':
830 if (strncmp(p, "Cont", 4) == 0) {
831 int res_signal, res_thread;
832
833 p += 4;
834 if (*p == '?') {
835 put_packet(s, "vCont;c;C;s;S");
836 break;
837 }
838 res = 0;
839 res_signal = 0;
840 res_thread = 0;
841 while (*p) {
842 int action, signal;
843
844 if (*p++ != ';') {
845 res = 0;
846 break;
847 }
848 action = *p++;
849 signal = 0;
850 if (action == 'C' || action == 'S') {
Martin Simmonsf17b0692014-11-05 14:47:39 +0000851 signal = gdb_signal_to_target(strtoul(p, (char **)&p, 16));
852 if (signal == -1) {
853 signal = 0;
854 }
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200855 } else if (action != 'c' && action != 's') {
856 res = 0;
857 break;
858 }
859 thread = 0;
860 if (*p == ':') {
861 thread = strtoull(p+1, (char **)&p, 16);
862 }
863 action = tolower(action);
864 if (res == 0 || (res == 'c' && action == 's')) {
865 res = action;
866 res_signal = signal;
867 res_thread = thread;
868 }
869 }
870 if (res) {
871 if (res_thread != -1 && res_thread != 0) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200872 cpu = find_cpu(res_thread);
873 if (cpu == NULL) {
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200874 put_packet(s, "E22");
875 break;
876 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200877 s->c_cpu = cpu;
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200878 }
879 if (res == 's') {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200880 cpu_single_step(s->c_cpu, sstep_flags);
Jan Kiszkadd32aa12009-06-27 09:53:51 +0200881 }
882 s->signal = res_signal;
883 gdb_continue(s);
884 return RS_IDLE;
885 }
886 break;
887 } else {
888 goto unknown_command;
889 }
edgar_igl7d03f822008-05-17 18:58:29 +0000890 case 'k':
891 /* Kill the target */
892 fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
893 exit(0);
894 case 'D':
895 /* Detach packet */
aliguori880a7572008-11-18 20:30:24 +0000896 gdb_breakpoint_remove_all();
Daniel Gutson7ea06da2010-02-26 14:13:50 -0300897 gdb_syscall_mode = GDB_SYS_DISABLED;
edgar_igl7d03f822008-05-17 18:58:29 +0000898 gdb_continue(s);
899 put_packet(s, "OK");
900 break;
bellard858693c2004-03-31 18:52:07 +0000901 case 's':
902 if (*p != '\0') {
ths8fac5802007-07-12 10:05:07 +0000903 addr = strtoull(p, (char **)&p, 16);
aurel32fab9d282009-04-08 21:29:37 +0000904 gdb_set_cpu_pc(s, addr);
bellard858693c2004-03-31 18:52:07 +0000905 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200906 cpu_single_step(s->c_cpu, sstep_flags);
edgar_iglba70a622008-03-14 06:10:42 +0000907 gdb_continue(s);
bellard41625032005-04-24 10:07:11 +0000908 return RS_IDLE;
pbrooka2d1eba2007-01-28 03:10:55 +0000909 case 'F':
910 {
911 target_ulong ret;
912 target_ulong err;
913
914 ret = strtoull(p, (char **)&p, 16);
915 if (*p == ',') {
916 p++;
917 err = strtoull(p, (char **)&p, 16);
918 } else {
919 err = 0;
920 }
921 if (*p == ',')
922 p++;
923 type = *p;
Meador Ingecdb432b2012-03-15 17:49:45 +0000924 if (s->current_syscall_cb) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200925 s->current_syscall_cb(s->c_cpu, ret, err);
Meador Ingecdb432b2012-03-15 17:49:45 +0000926 s->current_syscall_cb = NULL;
927 }
pbrooka2d1eba2007-01-28 03:10:55 +0000928 if (type == 'C') {
929 put_packet(s, "T02");
930 } else {
edgar_iglba70a622008-03-14 06:10:42 +0000931 gdb_continue(s);
pbrooka2d1eba2007-01-28 03:10:55 +0000932 }
933 }
934 break;
bellard858693c2004-03-31 18:52:07 +0000935 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200936 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +0000937 len = 0;
Andreas Färber35143f02013-08-12 18:09:47 +0200938 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200939 reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
pbrook56aebc82008-10-11 17:55:29 +0000940 len += reg_size;
941 }
942 memtohex(buf, mem_buf, len);
bellard858693c2004-03-31 18:52:07 +0000943 put_packet(s, buf);
944 break;
945 case 'G':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200946 cpu_synchronize_state(s->g_cpu);
pbrook56aebc82008-10-11 17:55:29 +0000947 registers = mem_buf;
bellard858693c2004-03-31 18:52:07 +0000948 len = strlen(p) / 2;
949 hextomem((uint8_t *)registers, p, len);
Andreas Färber35143f02013-08-12 18:09:47 +0200950 for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) {
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200951 reg_size = gdb_write_register(s->g_cpu, registers, addr);
pbrook56aebc82008-10-11 17:55:29 +0000952 len -= reg_size;
953 registers += reg_size;
954 }
bellard858693c2004-03-31 18:52:07 +0000955 put_packet(s, "OK");
956 break;
957 case 'm':
bellard9d9754a2006-06-25 15:32:37 +0000958 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +0000959 if (*p == ',')
960 p++;
bellard9d9754a2006-06-25 15:32:37 +0000961 len = strtoull(p, NULL, 16);
Kevin Wolf5accecb2015-10-13 09:38:50 +0200962
963 /* memtohex() doubles the required space */
964 if (len > MAX_PACKET_LENGTH / 2) {
965 put_packet (s, "E22");
966 break;
967 }
968
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200969 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
bellard6f970bd2005-12-05 19:55:19 +0000970 put_packet (s, "E14");
971 } else {
972 memtohex(buf, mem_buf, len);
973 put_packet(s, buf);
974 }
bellard858693c2004-03-31 18:52:07 +0000975 break;
976 case 'M':
bellard9d9754a2006-06-25 15:32:37 +0000977 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +0000978 if (*p == ',')
979 p++;
bellard9d9754a2006-06-25 15:32:37 +0000980 len = strtoull(p, (char **)&p, 16);
bellardb328f872005-01-17 22:03:16 +0000981 if (*p == ':')
bellard858693c2004-03-31 18:52:07 +0000982 p++;
Kevin Wolf5accecb2015-10-13 09:38:50 +0200983
984 /* hextomem() reads 2*len bytes */
985 if (len > strlen(p) / 2) {
986 put_packet (s, "E22");
987 break;
988 }
bellard858693c2004-03-31 18:52:07 +0000989 hextomem(mem_buf, p, len);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +0200990 if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
Andreas Färberf3659ee2013-06-27 19:09:09 +0200991 true) != 0) {
bellard905f20b2005-04-26 21:09:55 +0000992 put_packet(s, "E14");
Fabien Chouteau44520db2011-09-08 12:48:16 +0200993 } else {
bellard858693c2004-03-31 18:52:07 +0000994 put_packet(s, "OK");
Fabien Chouteau44520db2011-09-08 12:48:16 +0200995 }
bellard858693c2004-03-31 18:52:07 +0000996 break;
pbrook56aebc82008-10-11 17:55:29 +0000997 case 'p':
998 /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
999 This works, but can be very slow. Anything new enough to
1000 understand XML also knows how to use this properly. */
1001 if (!gdb_has_xml)
1002 goto unknown_command;
1003 addr = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001004 reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001005 if (reg_size) {
1006 memtohex(buf, mem_buf, reg_size);
1007 put_packet(s, buf);
1008 } else {
1009 put_packet(s, "E14");
1010 }
1011 break;
1012 case 'P':
1013 if (!gdb_has_xml)
1014 goto unknown_command;
1015 addr = strtoull(p, (char **)&p, 16);
1016 if (*p == '=')
1017 p++;
1018 reg_size = strlen(p) / 2;
1019 hextomem(mem_buf, p, reg_size);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001020 gdb_write_register(s->g_cpu, mem_buf, addr);
pbrook56aebc82008-10-11 17:55:29 +00001021 put_packet(s, "OK");
1022 break;
bellard858693c2004-03-31 18:52:07 +00001023 case 'Z':
bellard858693c2004-03-31 18:52:07 +00001024 case 'z':
1025 type = strtoul(p, (char **)&p, 16);
1026 if (*p == ',')
1027 p++;
bellard9d9754a2006-06-25 15:32:37 +00001028 addr = strtoull(p, (char **)&p, 16);
bellard858693c2004-03-31 18:52:07 +00001029 if (*p == ',')
1030 p++;
bellard9d9754a2006-06-25 15:32:37 +00001031 len = strtoull(p, (char **)&p, 16);
aliguoria1d1bb32008-11-18 20:07:32 +00001032 if (ch == 'Z')
aliguori880a7572008-11-18 20:30:24 +00001033 res = gdb_breakpoint_insert(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001034 else
aliguori880a7572008-11-18 20:30:24 +00001035 res = gdb_breakpoint_remove(addr, len, type);
aliguoria1d1bb32008-11-18 20:07:32 +00001036 if (res >= 0)
1037 put_packet(s, "OK");
1038 else if (res == -ENOSYS)
pbrook0f459d12008-06-09 00:20:13 +00001039 put_packet(s, "");
aliguoria1d1bb32008-11-18 20:07:32 +00001040 else
1041 put_packet(s, "E22");
bellard858693c2004-03-31 18:52:07 +00001042 break;
aliguori880a7572008-11-18 20:30:24 +00001043 case 'H':
1044 type = *p++;
1045 thread = strtoull(p, (char **)&p, 16);
1046 if (thread == -1 || thread == 0) {
1047 put_packet(s, "OK");
1048 break;
1049 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001050 cpu = find_cpu(thread);
1051 if (cpu == NULL) {
aliguori880a7572008-11-18 20:30:24 +00001052 put_packet(s, "E22");
1053 break;
1054 }
1055 switch (type) {
1056 case 'c':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001057 s->c_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001058 put_packet(s, "OK");
1059 break;
1060 case 'g':
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001061 s->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001062 put_packet(s, "OK");
1063 break;
1064 default:
1065 put_packet(s, "E22");
1066 break;
1067 }
1068 break;
1069 case 'T':
1070 thread = strtoull(p, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001071 cpu = find_cpu(thread);
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001072
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001073 if (cpu != NULL) {
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001074 put_packet(s, "OK");
1075 } else {
aliguori880a7572008-11-18 20:30:24 +00001076 put_packet(s, "E22");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001077 }
aliguori880a7572008-11-18 20:30:24 +00001078 break;
pbrook978efd62006-06-17 18:30:42 +00001079 case 'q':
edgar_igl60897d32008-05-09 08:25:14 +00001080 case 'Q':
1081 /* parse any 'q' packets here */
1082 if (!strcmp(p,"qemu.sstepbits")) {
1083 /* Query Breakpoint bit definitions */
blueswir1363a37d2008-08-21 17:58:08 +00001084 snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1085 SSTEP_ENABLE,
1086 SSTEP_NOIRQ,
1087 SSTEP_NOTIMER);
edgar_igl60897d32008-05-09 08:25:14 +00001088 put_packet(s, buf);
1089 break;
Jan Kiszka4dabe742015-02-07 09:38:43 +01001090 } else if (is_query_packet(p, "qemu.sstep", '=')) {
edgar_igl60897d32008-05-09 08:25:14 +00001091 /* Display or change the sstep_flags */
1092 p += 10;
1093 if (*p != '=') {
1094 /* Display current setting */
blueswir1363a37d2008-08-21 17:58:08 +00001095 snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
edgar_igl60897d32008-05-09 08:25:14 +00001096 put_packet(s, buf);
1097 break;
1098 }
1099 p++;
1100 type = strtoul(p, (char **)&p, 16);
1101 sstep_flags = type;
1102 put_packet(s, "OK");
1103 break;
aliguori880a7572008-11-18 20:30:24 +00001104 } else if (strcmp(p,"C") == 0) {
1105 /* "Current thread" remains vague in the spec, so always return
1106 * the first CPU (gdb returns the first thread). */
1107 put_packet(s, "QC1");
1108 break;
1109 } else if (strcmp(p,"fThreadInfo") == 0) {
Andreas Färber52f34622013-06-27 13:44:40 +02001110 s->query_cpu = first_cpu;
aliguori880a7572008-11-18 20:30:24 +00001111 goto report_cpuinfo;
1112 } else if (strcmp(p,"sThreadInfo") == 0) {
1113 report_cpuinfo:
1114 if (s->query_cpu) {
Andreas Färber52f34622013-06-27 13:44:40 +02001115 snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
aliguori880a7572008-11-18 20:30:24 +00001116 put_packet(s, buf);
Andreas Färberbdc44642013-06-24 23:50:24 +02001117 s->query_cpu = CPU_NEXT(s->query_cpu);
aliguori880a7572008-11-18 20:30:24 +00001118 } else
1119 put_packet(s, "l");
1120 break;
1121 } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1122 thread = strtoull(p+16, (char **)&p, 16);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001123 cpu = find_cpu(thread);
1124 if (cpu != NULL) {
Andreas Färbercb446ec2013-05-01 14:24:52 +02001125 cpu_synchronize_state(cpu);
Kevin Wolf5accecb2015-10-13 09:38:50 +02001126 /* memtohex() doubles the required space */
1127 len = snprintf((char *)mem_buf, sizeof(buf) / 2,
Andreas Färber55e5c282012-12-17 06:18:02 +01001128 "CPU#%d [%s]", cpu->cpu_index,
Andreas Färber259186a2013-01-17 18:51:17 +01001129 cpu->halted ? "halted " : "running");
Nathan Froyd1e9fa732009-06-03 11:33:08 -07001130 memtohex(buf, mem_buf, len);
1131 put_packet(s, buf);
1132 }
aliguori880a7572008-11-18 20:30:24 +00001133 break;
edgar_igl60897d32008-05-09 08:25:14 +00001134 }
blueswir10b8a9882009-03-07 10:51:36 +00001135#ifdef CONFIG_USER_ONLY
Jan Kiszka070949f2015-02-07 09:38:42 +01001136 else if (strcmp(p, "Offsets") == 0) {
Andreas Färber0429a972013-08-26 18:14:44 +02001137 TaskState *ts = s->c_cpu->opaque;
pbrook978efd62006-06-17 18:30:42 +00001138
blueswir1363a37d2008-08-21 17:58:08 +00001139 snprintf(buf, sizeof(buf),
1140 "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1141 ";Bss=" TARGET_ABI_FMT_lx,
1142 ts->info->code_offset,
1143 ts->info->data_offset,
1144 ts->info->data_offset);
pbrook978efd62006-06-17 18:30:42 +00001145 put_packet(s, buf);
1146 break;
1147 }
blueswir10b8a9882009-03-07 10:51:36 +00001148#else /* !CONFIG_USER_ONLY */
aliguori8a34a0f2009-03-05 23:01:55 +00001149 else if (strncmp(p, "Rcmd,", 5) == 0) {
1150 int len = strlen(p + 5);
1151
1152 if ((len % 2) != 0) {
1153 put_packet(s, "E01");
1154 break;
1155 }
aliguori8a34a0f2009-03-05 23:01:55 +00001156 len = len / 2;
Kevin Wolf5accecb2015-10-13 09:38:50 +02001157 hextomem(mem_buf, p + 5, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001158 mem_buf[len++] = 0;
Anthony Liguorifa5efcc2011-08-15 11:17:30 -05001159 qemu_chr_be_write(s->mon_chr, mem_buf, len);
aliguori8a34a0f2009-03-05 23:01:55 +00001160 put_packet(s, "OK");
1161 break;
1162 }
blueswir10b8a9882009-03-07 10:51:36 +00001163#endif /* !CONFIG_USER_ONLY */
Jan Kiszka4dabe742015-02-07 09:38:43 +01001164 if (is_query_packet(p, "Supported", ':')) {
blueswir15b3715b2008-10-25 11:18:12 +00001165 snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
Andreas Färber5b24c642013-07-07 15:08:22 +02001166 cc = CPU_GET_CLASS(first_cpu);
1167 if (cc->gdb_core_xml_file != NULL) {
1168 pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
1169 }
pbrook56aebc82008-10-11 17:55:29 +00001170 put_packet(s, buf);
1171 break;
1172 }
pbrook56aebc82008-10-11 17:55:29 +00001173 if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1174 const char *xml;
1175 target_ulong total_len;
1176
Andreas Färber5b24c642013-07-07 15:08:22 +02001177 cc = CPU_GET_CLASS(first_cpu);
1178 if (cc->gdb_core_xml_file == NULL) {
1179 goto unknown_command;
1180 }
1181
Andreas Färber5b50e792013-06-29 04:18:45 +02001182 gdb_has_xml = true;
pbrook56aebc82008-10-11 17:55:29 +00001183 p += 19;
Andreas Färber5b24c642013-07-07 15:08:22 +02001184 xml = get_feature_xml(p, &p, cc);
pbrook56aebc82008-10-11 17:55:29 +00001185 if (!xml) {
blueswir15b3715b2008-10-25 11:18:12 +00001186 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001187 put_packet(s, buf);
1188 break;
1189 }
1190
1191 if (*p == ':')
1192 p++;
1193 addr = strtoul(p, (char **)&p, 16);
1194 if (*p == ',')
1195 p++;
1196 len = strtoul(p, (char **)&p, 16);
1197
1198 total_len = strlen(xml);
1199 if (addr > total_len) {
blueswir15b3715b2008-10-25 11:18:12 +00001200 snprintf(buf, sizeof(buf), "E00");
pbrook56aebc82008-10-11 17:55:29 +00001201 put_packet(s, buf);
1202 break;
1203 }
1204 if (len > (MAX_PACKET_LENGTH - 5) / 2)
1205 len = (MAX_PACKET_LENGTH - 5) / 2;
1206 if (len < total_len - addr) {
1207 buf[0] = 'm';
1208 len = memtox(buf + 1, xml + addr, len);
1209 } else {
1210 buf[0] = 'l';
1211 len = memtox(buf + 1, xml + addr, total_len - addr);
1212 }
1213 put_packet_binary(s, buf, len + 1);
1214 break;
1215 }
Jan Kiszkaa3919382015-02-07 09:38:44 +01001216 if (is_query_packet(p, "Attached", ':')) {
1217 put_packet(s, GDB_ATTACHED);
1218 break;
1219 }
pbrook56aebc82008-10-11 17:55:29 +00001220 /* Unrecognised 'q' command. */
1221 goto unknown_command;
1222
bellard858693c2004-03-31 18:52:07 +00001223 default:
pbrook56aebc82008-10-11 17:55:29 +00001224 unknown_command:
bellard858693c2004-03-31 18:52:07 +00001225 /* put empty packet */
1226 buf[0] = '\0';
1227 put_packet(s, buf);
1228 break;
1229 }
1230 return RS_IDLE;
1231}
1232
Andreas Färber64f6b342013-05-27 02:06:09 +02001233void gdb_set_stop_cpu(CPUState *cpu)
aliguori880a7572008-11-18 20:30:24 +00001234{
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001235 gdbserver_state->c_cpu = cpu;
1236 gdbserver_state->g_cpu = cpu;
aliguori880a7572008-11-18 20:30:24 +00001237}
1238
bellard1fddef42005-04-17 19:16:13 +00001239#ifndef CONFIG_USER_ONLY
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001240static void gdb_vm_state_change(void *opaque, int running, RunState state)
bellard858693c2004-03-31 18:52:07 +00001241{
aliguori880a7572008-11-18 20:30:24 +00001242 GDBState *s = gdbserver_state;
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001243 CPUState *cpu = s->c_cpu;
bellard858693c2004-03-31 18:52:07 +00001244 char buf[256];
aliguorid6fc1b32008-11-18 19:55:44 +00001245 const char *type;
bellard858693c2004-03-31 18:52:07 +00001246 int ret;
1247
Meador Ingecdb432b2012-03-15 17:49:45 +00001248 if (running || s->state == RS_INACTIVE) {
1249 return;
1250 }
1251 /* Is there a GDB syscall waiting to be sent? */
1252 if (s->current_syscall_cb) {
1253 put_packet(s, s->syscall_buf);
pbrooka2d1eba2007-01-28 03:10:55 +00001254 return;
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001255 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001256 switch (state) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001257 case RUN_STATE_DEBUG:
Andreas Färberff4700b2013-08-26 18:23:18 +02001258 if (cpu->watchpoint_hit) {
1259 switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) {
aliguoria1d1bb32008-11-18 20:07:32 +00001260 case BP_MEM_READ:
aliguorid6fc1b32008-11-18 19:55:44 +00001261 type = "r";
1262 break;
aliguoria1d1bb32008-11-18 20:07:32 +00001263 case BP_MEM_ACCESS:
aliguorid6fc1b32008-11-18 19:55:44 +00001264 type = "a";
1265 break;
1266 default:
1267 type = "";
1268 break;
1269 }
aliguori880a7572008-11-18 20:30:24 +00001270 snprintf(buf, sizeof(buf),
1271 "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
Andreas Färber0d342822012-12-17 07:12:13 +01001272 GDB_SIGNAL_TRAP, cpu_index(cpu), type,
Andreas Färberff4700b2013-08-26 18:23:18 +02001273 (target_ulong)cpu->watchpoint_hit->vaddr);
1274 cpu->watchpoint_hit = NULL;
Jan Kiszka425189a2011-03-22 11:02:09 +01001275 goto send_packet;
pbrook6658ffb2007-03-16 23:58:11 +00001276 }
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001277 tb_flush(cpu);
aurel32ca587a82008-12-18 22:44:13 +00001278 ret = GDB_SIGNAL_TRAP;
Jan Kiszka425189a2011-03-22 11:02:09 +01001279 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001280 case RUN_STATE_PAUSED:
aliguori9781e042009-01-22 17:15:29 +00001281 ret = GDB_SIGNAL_INT;
Jan Kiszka425189a2011-03-22 11:02:09 +01001282 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001283 case RUN_STATE_SHUTDOWN:
Jan Kiszka425189a2011-03-22 11:02:09 +01001284 ret = GDB_SIGNAL_QUIT;
1285 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001286 case RUN_STATE_IO_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001287 ret = GDB_SIGNAL_IO;
1288 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001289 case RUN_STATE_WATCHDOG:
Jan Kiszka425189a2011-03-22 11:02:09 +01001290 ret = GDB_SIGNAL_ALRM;
1291 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001292 case RUN_STATE_INTERNAL_ERROR:
Jan Kiszka425189a2011-03-22 11:02:09 +01001293 ret = GDB_SIGNAL_ABRT;
1294 break;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001295 case RUN_STATE_SAVE_VM:
1296 case RUN_STATE_RESTORE_VM:
Jan Kiszka425189a2011-03-22 11:02:09 +01001297 return;
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001298 case RUN_STATE_FINISH_MIGRATE:
Jan Kiszka425189a2011-03-22 11:02:09 +01001299 ret = GDB_SIGNAL_XCPU;
1300 break;
1301 default:
1302 ret = GDB_SIGNAL_UNKNOWN;
1303 break;
bellardbbeb7b52006-04-23 18:42:15 +00001304 }
Jan Kiszka226d0072015-07-24 18:52:31 +02001305 gdb_set_stop_cpu(cpu);
Andreas Färber0d342822012-12-17 07:12:13 +01001306 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
Jan Kiszka425189a2011-03-22 11:02:09 +01001307
1308send_packet:
bellard858693c2004-03-31 18:52:07 +00001309 put_packet(s, buf);
Jan Kiszka425189a2011-03-22 11:02:09 +01001310
1311 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001312 cpu_single_step(cpu, 0);
bellard858693c2004-03-31 18:52:07 +00001313}
bellard1fddef42005-04-17 19:16:13 +00001314#endif
bellard858693c2004-03-31 18:52:07 +00001315
pbrooka2d1eba2007-01-28 03:10:55 +00001316/* Send a gdb syscall request.
1317 This accepts limited printf-style format specifiers, specifically:
pbrooka87295e2007-05-26 15:09:38 +00001318 %x - target_ulong argument printed in hex.
1319 %lx - 64-bit argument printed in hex.
1320 %s - string pointer (target_ulong) and length (int) pair. */
Peter Maydell19239b32015-09-07 10:39:27 +01001321void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
pbrooka2d1eba2007-01-28 03:10:55 +00001322{
pbrooka2d1eba2007-01-28 03:10:55 +00001323 char *p;
Meador Ingecdb432b2012-03-15 17:49:45 +00001324 char *p_end;
pbrooka2d1eba2007-01-28 03:10:55 +00001325 target_ulong addr;
pbrooka87295e2007-05-26 15:09:38 +00001326 uint64_t i64;
pbrooka2d1eba2007-01-28 03:10:55 +00001327 GDBState *s;
1328
aliguori880a7572008-11-18 20:30:24 +00001329 s = gdbserver_state;
pbrooka2d1eba2007-01-28 03:10:55 +00001330 if (!s)
1331 return;
Meador Ingecdb432b2012-03-15 17:49:45 +00001332 s->current_syscall_cb = cb;
pbrooka2d1eba2007-01-28 03:10:55 +00001333#ifndef CONFIG_USER_ONLY
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001334 vm_stop(RUN_STATE_DEBUG);
pbrooka2d1eba2007-01-28 03:10:55 +00001335#endif
Meador Ingecdb432b2012-03-15 17:49:45 +00001336 p = s->syscall_buf;
1337 p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
pbrooka2d1eba2007-01-28 03:10:55 +00001338 *(p++) = 'F';
1339 while (*fmt) {
1340 if (*fmt == '%') {
1341 fmt++;
1342 switch (*fmt++) {
1343 case 'x':
1344 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001345 p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
pbrooka2d1eba2007-01-28 03:10:55 +00001346 break;
pbrooka87295e2007-05-26 15:09:38 +00001347 case 'l':
1348 if (*(fmt++) != 'x')
1349 goto bad_format;
1350 i64 = va_arg(va, uint64_t);
Meador Ingecdb432b2012-03-15 17:49:45 +00001351 p += snprintf(p, p_end - p, "%" PRIx64, i64);
pbrooka87295e2007-05-26 15:09:38 +00001352 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001353 case 's':
1354 addr = va_arg(va, target_ulong);
Meador Ingecdb432b2012-03-15 17:49:45 +00001355 p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
blueswir1363a37d2008-08-21 17:58:08 +00001356 addr, va_arg(va, int));
pbrooka2d1eba2007-01-28 03:10:55 +00001357 break;
1358 default:
pbrooka87295e2007-05-26 15:09:38 +00001359 bad_format:
pbrooka2d1eba2007-01-28 03:10:55 +00001360 fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1361 fmt - 1);
1362 break;
1363 }
1364 } else {
1365 *(p++) = *(fmt++);
1366 }
1367 }
pbrook8a93e022007-08-06 13:19:15 +00001368 *p = 0;
pbrooka2d1eba2007-01-28 03:10:55 +00001369#ifdef CONFIG_USER_ONLY
Meador Ingecdb432b2012-03-15 17:49:45 +00001370 put_packet(s, s->syscall_buf);
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001371 gdb_handlesig(s->c_cpu, 0);
pbrooka2d1eba2007-01-28 03:10:55 +00001372#else
Meador Ingecdb432b2012-03-15 17:49:45 +00001373 /* In this case wait to send the syscall packet until notification that
1374 the CPU has stopped. This must be done because if the packet is sent
1375 now the reply from the syscall request could be received while the CPU
1376 is still in the running state, which can cause packets to be dropped
1377 and state transition 'T' packets to be sent while the syscall is still
1378 being processed. */
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001379 qemu_cpu_kick(s->c_cpu);
pbrooka2d1eba2007-01-28 03:10:55 +00001380#endif
1381}
1382
Peter Maydell19239b32015-09-07 10:39:27 +01001383void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
1384{
1385 va_list va;
1386
1387 va_start(va, fmt);
1388 gdb_do_syscallv(cb, fmt, va);
1389 va_end(va);
1390}
1391
bellard6a00d602005-11-21 23:25:50 +00001392static void gdb_read_byte(GDBState *s, int ch)
bellard858693c2004-03-31 18:52:07 +00001393{
1394 int i, csum;
ths60fe76f2007-12-16 03:02:09 +00001395 uint8_t reply;
bellard858693c2004-03-31 18:52:07 +00001396
bellard1fddef42005-04-17 19:16:13 +00001397#ifndef CONFIG_USER_ONLY
pbrook4046d912007-01-28 01:53:16 +00001398 if (s->last_packet_len) {
1399 /* Waiting for a response to the last packet. If we see the start
1400 of a new command then abandon the previous response. */
1401 if (ch == '-') {
1402#ifdef DEBUG_GDB
1403 printf("Got NACK, retransmitting\n");
1404#endif
thsffe8ab82007-12-16 03:16:05 +00001405 put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
pbrook4046d912007-01-28 01:53:16 +00001406 }
1407#ifdef DEBUG_GDB
1408 else if (ch == '+')
1409 printf("Got ACK\n");
1410 else
1411 printf("Got '%c' when expecting ACK/NACK\n", ch);
1412#endif
1413 if (ch == '+' || ch == '$')
1414 s->last_packet_len = 0;
1415 if (ch != '$')
1416 return;
1417 }
Luiz Capitulino13548692011-07-29 15:36:43 -03001418 if (runstate_is_running()) {
bellard858693c2004-03-31 18:52:07 +00001419 /* when the CPU is running, we cannot do anything except stop
1420 it when receiving a char */
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001421 vm_stop(RUN_STATE_PAUSED);
ths5fafdf22007-09-16 21:08:06 +00001422 } else
bellard1fddef42005-04-17 19:16:13 +00001423#endif
bellard41625032005-04-24 10:07:11 +00001424 {
bellard858693c2004-03-31 18:52:07 +00001425 switch(s->state) {
1426 case RS_IDLE:
1427 if (ch == '$') {
1428 s->line_buf_index = 0;
1429 s->state = RS_GETLINE;
bellard4c3a88a2003-07-26 12:06:08 +00001430 }
1431 break;
bellard858693c2004-03-31 18:52:07 +00001432 case RS_GETLINE:
1433 if (ch == '#') {
1434 s->state = RS_CHKSUM1;
1435 } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1436 s->state = RS_IDLE;
1437 } else {
1438 s->line_buf[s->line_buf_index++] = ch;
1439 }
1440 break;
1441 case RS_CHKSUM1:
1442 s->line_buf[s->line_buf_index] = '\0';
1443 s->line_csum = fromhex(ch) << 4;
1444 s->state = RS_CHKSUM2;
1445 break;
1446 case RS_CHKSUM2:
1447 s->line_csum |= fromhex(ch);
1448 csum = 0;
1449 for(i = 0; i < s->line_buf_index; i++) {
1450 csum += s->line_buf[i];
1451 }
1452 if (s->line_csum != (csum & 0xff)) {
ths60fe76f2007-12-16 03:02:09 +00001453 reply = '-';
1454 put_buffer(s, &reply, 1);
bellard858693c2004-03-31 18:52:07 +00001455 s->state = RS_IDLE;
1456 } else {
ths60fe76f2007-12-16 03:02:09 +00001457 reply = '+';
1458 put_buffer(s, &reply, 1);
aliguori880a7572008-11-18 20:30:24 +00001459 s->state = gdb_handle_packet(s, s->line_buf);
bellard858693c2004-03-31 18:52:07 +00001460 }
bellardb4608c02003-06-27 17:34:32 +00001461 break;
pbrooka2d1eba2007-01-28 03:10:55 +00001462 default:
1463 abort();
bellardb4608c02003-06-27 17:34:32 +00001464 }
1465 }
bellard858693c2004-03-31 18:52:07 +00001466}
1467
Paul Brook0e1c9c52010-06-16 13:03:51 +01001468/* Tell the remote gdb that the process has exited. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001469void gdb_exit(CPUArchState *env, int code)
Paul Brook0e1c9c52010-06-16 13:03:51 +01001470{
1471 GDBState *s;
1472 char buf[4];
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001473#ifndef CONFIG_USER_ONLY
1474 CharDriverState *chr;
1475#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001476
1477 s = gdbserver_state;
1478 if (!s) {
1479 return;
1480 }
1481#ifdef CONFIG_USER_ONLY
1482 if (gdbserver_fd < 0 || s->fd < 0) {
1483 return;
1484 }
Paolo Bonzini3d0f4412015-03-02 13:26:58 +01001485#else
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001486 chr = qemu_chr_fe_get_driver(&s->chr);
1487 if (!chr) {
Paolo Bonzini3d0f4412015-03-02 13:26:58 +01001488 return;
1489 }
Paul Brook0e1c9c52010-06-16 13:03:51 +01001490#endif
1491
1492 snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1493 put_packet(s, buf);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001494
1495#ifndef CONFIG_USER_ONLY
Marc-André Lureauc39860e2016-10-22 12:52:58 +03001496 qemu_chr_fe_deinit(&s->chr);
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001497 qemu_chr_delete(chr);
Fabien Chouteaue2af15b2011-01-13 12:46:57 +01001498#endif
Paul Brook0e1c9c52010-06-16 13:03:51 +01001499}
1500
bellard1fddef42005-04-17 19:16:13 +00001501#ifdef CONFIG_USER_ONLY
1502int
Andreas Färberdb6b81d2013-06-27 19:49:31 +02001503gdb_handlesig(CPUState *cpu, int sig)
bellard1fddef42005-04-17 19:16:13 +00001504{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001505 GDBState *s;
1506 char buf[256];
1507 int n;
bellard1fddef42005-04-17 19:16:13 +00001508
Andreas Färber5ca666c2013-06-24 19:20:57 +02001509 s = gdbserver_state;
1510 if (gdbserver_fd < 0 || s->fd < 0) {
1511 return sig;
bellard1fddef42005-04-17 19:16:13 +00001512 }
1513
Andreas Färber5ca666c2013-06-24 19:20:57 +02001514 /* disable single step if it was enabled */
Andreas Färber3825b282013-06-24 18:41:06 +02001515 cpu_single_step(cpu, 0);
Peter Crosthwaitebbd77c12015-06-23 19:31:15 -07001516 tb_flush(cpu);
bellard1fddef42005-04-17 19:16:13 +00001517
Andreas Färber5ca666c2013-06-24 19:20:57 +02001518 if (sig != 0) {
1519 snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1520 put_packet(s, buf);
1521 }
1522 /* put_packet() might have detected that the peer terminated the
1523 connection. */
1524 if (s->fd < 0) {
1525 return sig;
1526 }
1527
1528 sig = 0;
1529 s->state = RS_IDLE;
1530 s->running_state = 0;
1531 while (s->running_state == 0) {
1532 n = read(s->fd, buf, 256);
1533 if (n > 0) {
1534 int i;
1535
1536 for (i = 0; i < n; i++) {
1537 gdb_read_byte(s, buf[i]);
1538 }
Peter Wu5819e3e2016-06-05 16:35:48 +02001539 } else {
Andreas Färber5ca666c2013-06-24 19:20:57 +02001540 /* XXX: Connection closed. Should probably wait for another
1541 connection before continuing. */
Peter Wu5819e3e2016-06-05 16:35:48 +02001542 if (n == 0) {
1543 close(s->fd);
1544 }
1545 s->fd = -1;
Andreas Färber5ca666c2013-06-24 19:20:57 +02001546 return sig;
bellard1fddef42005-04-17 19:16:13 +00001547 }
Andreas Färber5ca666c2013-06-24 19:20:57 +02001548 }
1549 sig = s->signal;
1550 s->signal = 0;
1551 return sig;
bellard1fddef42005-04-17 19:16:13 +00001552}
bellarde9009672005-04-26 20:42:36 +00001553
aurel32ca587a82008-12-18 22:44:13 +00001554/* Tell the remote gdb that the process has exited due to SIG. */
Andreas Färber9349b4f2012-03-14 01:38:32 +01001555void gdb_signalled(CPUArchState *env, int sig)
aurel32ca587a82008-12-18 22:44:13 +00001556{
Andreas Färber5ca666c2013-06-24 19:20:57 +02001557 GDBState *s;
1558 char buf[4];
aurel32ca587a82008-12-18 22:44:13 +00001559
Andreas Färber5ca666c2013-06-24 19:20:57 +02001560 s = gdbserver_state;
1561 if (gdbserver_fd < 0 || s->fd < 0) {
1562 return;
1563 }
aurel32ca587a82008-12-18 22:44:13 +00001564
Andreas Färber5ca666c2013-06-24 19:20:57 +02001565 snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1566 put_packet(s, buf);
aurel32ca587a82008-12-18 22:44:13 +00001567}
bellard1fddef42005-04-17 19:16:13 +00001568
aliguori880a7572008-11-18 20:30:24 +00001569static void gdb_accept(void)
bellard858693c2004-03-31 18:52:07 +00001570{
1571 GDBState *s;
1572 struct sockaddr_in sockaddr;
1573 socklen_t len;
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001574 int fd;
bellard858693c2004-03-31 18:52:07 +00001575
1576 for(;;) {
1577 len = sizeof(sockaddr);
1578 fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1579 if (fd < 0 && errno != EINTR) {
1580 perror("accept");
1581 return;
1582 } else if (fd >= 0) {
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001583#ifndef _WIN32
1584 fcntl(fd, F_SETFD, FD_CLOEXEC);
1585#endif
bellard858693c2004-03-31 18:52:07 +00001586 break;
1587 }
1588 }
1589
1590 /* set short latency */
MORITA Kazutakabf1c8522013-02-22 12:39:50 +09001591 socket_set_nodelay(fd);
ths3b46e622007-09-17 08:09:54 +00001592
Anthony Liguori7267c092011-08-20 22:09:37 -05001593 s = g_malloc0(sizeof(GDBState));
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001594 s->c_cpu = first_cpu;
1595 s->g_cpu = first_cpu;
bellard858693c2004-03-31 18:52:07 +00001596 s->fd = fd;
Andreas Färber5b50e792013-06-29 04:18:45 +02001597 gdb_has_xml = false;
bellard858693c2004-03-31 18:52:07 +00001598
aliguori880a7572008-11-18 20:30:24 +00001599 gdbserver_state = s;
bellard858693c2004-03-31 18:52:07 +00001600}
1601
1602static int gdbserver_open(int port)
1603{
1604 struct sockaddr_in sockaddr;
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001605 int fd, ret;
bellard858693c2004-03-31 18:52:07 +00001606
1607 fd = socket(PF_INET, SOCK_STREAM, 0);
1608 if (fd < 0) {
1609 perror("socket");
1610 return -1;
1611 }
Kevin Wolf40ff6d72009-12-02 12:24:42 +01001612#ifndef _WIN32
1613 fcntl(fd, F_SETFD, FD_CLOEXEC);
1614#endif
bellard858693c2004-03-31 18:52:07 +00001615
Sebastian Ottlik6669ca12013-10-02 12:23:13 +02001616 socket_set_fast_reuse(fd);
bellard858693c2004-03-31 18:52:07 +00001617
1618 sockaddr.sin_family = AF_INET;
1619 sockaddr.sin_port = htons(port);
1620 sockaddr.sin_addr.s_addr = 0;
1621 ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1622 if (ret < 0) {
1623 perror("bind");
Peter Maydellbb161722011-12-24 23:37:24 +00001624 close(fd);
bellard858693c2004-03-31 18:52:07 +00001625 return -1;
1626 }
Peter Wu96165b92016-05-04 11:32:17 +02001627 ret = listen(fd, 1);
bellard858693c2004-03-31 18:52:07 +00001628 if (ret < 0) {
1629 perror("listen");
Peter Maydellbb161722011-12-24 23:37:24 +00001630 close(fd);
bellard858693c2004-03-31 18:52:07 +00001631 return -1;
1632 }
bellard858693c2004-03-31 18:52:07 +00001633 return fd;
1634}
1635
1636int gdbserver_start(int port)
1637{
1638 gdbserver_fd = gdbserver_open(port);
1639 if (gdbserver_fd < 0)
1640 return -1;
1641 /* accept connections */
aliguori880a7572008-11-18 20:30:24 +00001642 gdb_accept();
bellardb4608c02003-06-27 17:34:32 +00001643 return 0;
1644}
aurel322b1319c2008-12-18 22:44:04 +00001645
1646/* Disable gdb stub for child processes. */
Peter Crosthwaitef7ec7f72015-06-23 19:31:16 -07001647void gdbserver_fork(CPUState *cpu)
aurel322b1319c2008-12-18 22:44:04 +00001648{
1649 GDBState *s = gdbserver_state;
Andreas Färber75a34032013-09-02 16:57:02 +02001650
1651 if (gdbserver_fd < 0 || s->fd < 0) {
1652 return;
1653 }
aurel322b1319c2008-12-18 22:44:04 +00001654 close(s->fd);
1655 s->fd = -1;
Andreas Färberb3310ab2013-09-02 17:26:20 +02001656 cpu_breakpoint_remove_all(cpu, BP_GDB);
Andreas Färber75a34032013-09-02 16:57:02 +02001657 cpu_watchpoint_remove_all(cpu, BP_GDB);
aurel322b1319c2008-12-18 22:44:04 +00001658}
pbrook4046d912007-01-28 01:53:16 +00001659#else
thsaa1f17c2007-07-11 22:48:58 +00001660static int gdb_chr_can_receive(void *opaque)
pbrook4046d912007-01-28 01:53:16 +00001661{
pbrook56aebc82008-10-11 17:55:29 +00001662 /* We can handle an arbitrarily large amount of data.
1663 Pick the maximum packet size, which is as good as anything. */
1664 return MAX_PACKET_LENGTH;
pbrook4046d912007-01-28 01:53:16 +00001665}
1666
thsaa1f17c2007-07-11 22:48:58 +00001667static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
pbrook4046d912007-01-28 01:53:16 +00001668{
pbrook4046d912007-01-28 01:53:16 +00001669 int i;
1670
1671 for (i = 0; i < size; i++) {
aliguori880a7572008-11-18 20:30:24 +00001672 gdb_read_byte(gdbserver_state, buf[i]);
pbrook4046d912007-01-28 01:53:16 +00001673 }
1674}
1675
1676static void gdb_chr_event(void *opaque, int event)
1677{
1678 switch (event) {
Amit Shahb6b8df52009-10-07 18:31:16 +05301679 case CHR_EVENT_OPENED:
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001680 vm_stop(RUN_STATE_PAUSED);
Andreas Färber5b50e792013-06-29 04:18:45 +02001681 gdb_has_xml = false;
pbrook4046d912007-01-28 01:53:16 +00001682 break;
1683 default:
1684 break;
1685 }
1686}
1687
aliguori8a34a0f2009-03-05 23:01:55 +00001688static void gdb_monitor_output(GDBState *s, const char *msg, int len)
1689{
1690 char buf[MAX_PACKET_LENGTH];
1691
1692 buf[0] = 'O';
1693 if (len > (MAX_PACKET_LENGTH/2) - 1)
1694 len = (MAX_PACKET_LENGTH/2) - 1;
1695 memtohex(buf + 1, (uint8_t *)msg, len);
1696 put_packet(s, buf);
1697}
1698
1699static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
1700{
1701 const char *p = (const char *)buf;
1702 int max_sz;
1703
1704 max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
1705 for (;;) {
1706 if (len <= max_sz) {
1707 gdb_monitor_output(gdbserver_state, p, len);
1708 break;
1709 }
1710 gdb_monitor_output(gdbserver_state, p, max_sz);
1711 p += max_sz;
1712 len -= max_sz;
1713 }
1714 return len;
1715}
1716
aliguori59030a82009-04-05 18:43:41 +00001717#ifndef _WIN32
1718static void gdb_sigterm_handler(int signal)
1719{
Luiz Capitulino13548692011-07-29 15:36:43 -03001720 if (runstate_is_running()) {
Luiz Capitulino0461d5a2011-09-30 14:45:27 -03001721 vm_stop(RUN_STATE_PAUSED);
Jan Kiszkae07bbac2011-02-09 16:29:40 +01001722 }
aliguori59030a82009-04-05 18:43:41 +00001723}
1724#endif
1725
1726int gdbserver_start(const char *device)
pbrook4046d912007-01-28 01:53:16 +00001727{
1728 GDBState *s;
aliguori59030a82009-04-05 18:43:41 +00001729 char gdbstub_device_name[128];
aliguori36556b22009-03-28 18:05:53 +00001730 CharDriverState *chr = NULL;
1731 CharDriverState *mon_chr;
Daniel P. Berranged0d77082016-01-11 12:44:41 +00001732 ChardevCommon common = { 0 };
pbrook4046d912007-01-28 01:53:16 +00001733
aliguori59030a82009-04-05 18:43:41 +00001734 if (!device)
1735 return -1;
1736 if (strcmp(device, "none") != 0) {
1737 if (strstart(device, "tcp:", NULL)) {
1738 /* enforce required TCP attributes */
1739 snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
1740 "%s,nowait,nodelay,server", device);
1741 device = gdbstub_device_name;
aliguori36556b22009-03-28 18:05:53 +00001742 }
aliguori59030a82009-04-05 18:43:41 +00001743#ifndef _WIN32
1744 else if (strcmp(device, "stdio") == 0) {
1745 struct sigaction act;
pbrookcfc34752007-02-22 01:48:01 +00001746
aliguori59030a82009-04-05 18:43:41 +00001747 memset(&act, 0, sizeof(act));
1748 act.sa_handler = gdb_sigterm_handler;
1749 sigaction(SIGINT, &act, NULL);
1750 }
1751#endif
Marc-André Lureaub4948be2016-10-22 12:52:46 +03001752 chr = qemu_chr_new_noreplay("gdb", device);
aliguori36556b22009-03-28 18:05:53 +00001753 if (!chr)
1754 return -1;
pbrookcfc34752007-02-22 01:48:01 +00001755 }
1756
aliguori36556b22009-03-28 18:05:53 +00001757 s = gdbserver_state;
1758 if (!s) {
Anthony Liguori7267c092011-08-20 22:09:37 -05001759 s = g_malloc0(sizeof(GDBState));
aliguori36556b22009-03-28 18:05:53 +00001760 gdbserver_state = s;
pbrook4046d912007-01-28 01:53:16 +00001761
aliguori36556b22009-03-28 18:05:53 +00001762 qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
1763
1764 /* Initialize a monitor terminal for gdb */
Daniel P. Berranged0d77082016-01-11 12:44:41 +00001765 mon_chr = qemu_chr_alloc(&common, &error_abort);
aliguori36556b22009-03-28 18:05:53 +00001766 mon_chr->chr_write = gdb_monitor_write;
1767 monitor_init(mon_chr, 0);
1768 } else {
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001769 if (qemu_chr_fe_get_driver(&s->chr)) {
1770 qemu_chr_delete(qemu_chr_fe_get_driver(&s->chr));
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03001771 }
aliguori36556b22009-03-28 18:05:53 +00001772 mon_chr = s->mon_chr;
1773 memset(s, 0, sizeof(GDBState));
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03001774 s->mon_chr = mon_chr;
aliguori36556b22009-03-28 18:05:53 +00001775 }
Andreas Färber2e0f2cf2013-06-27 19:19:39 +02001776 s->c_cpu = first_cpu;
1777 s->g_cpu = first_cpu;
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03001778 if (chr) {
1779 qemu_chr_fe_init(&s->chr, chr, &error_abort);
Marc-André Lureau5345fdb2016-10-22 12:52:55 +03001780 qemu_chr_fe_set_handlers(&s->chr, gdb_chr_can_receive, gdb_chr_receive,
Marc-André Lureau39ab61c2016-10-22 12:53:03 +03001781 gdb_chr_event, NULL, NULL, true);
Marc-André Lureau32a6ebe2016-10-22 12:52:52 +03001782 }
aliguori36556b22009-03-28 18:05:53 +00001783 s->state = chr ? RS_IDLE : RS_INACTIVE;
1784 s->mon_chr = mon_chr;
Meador Ingecdb432b2012-03-15 17:49:45 +00001785 s->current_syscall_cb = NULL;
aliguori8a34a0f2009-03-05 23:01:55 +00001786
pbrook4046d912007-01-28 01:53:16 +00001787 return 0;
1788}
1789#endif