Statistics
| Branch: | Revision:

root / gdbstub.c @ 6a1751b7

History | View | Annotate | Download (43.6 kB)

1 b4608c04 bellard
/*
2 b4608c04 bellard
 * gdb server stub
3 5fafdf24 ths
 *
4 3475187d bellard
 * Copyright (c) 2003-2005 Fabrice Bellard
5 b4608c04 bellard
 *
6 b4608c04 bellard
 * This library is free software; you can redistribute it and/or
7 b4608c04 bellard
 * modify it under the terms of the GNU Lesser General Public
8 b4608c04 bellard
 * License as published by the Free Software Foundation; either
9 b4608c04 bellard
 * version 2 of the License, or (at your option) any later version.
10 b4608c04 bellard
 *
11 b4608c04 bellard
 * This library is distributed in the hope that it will be useful,
12 b4608c04 bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 b4608c04 bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 b4608c04 bellard
 * Lesser General Public License for more details.
15 b4608c04 bellard
 *
16 b4608c04 bellard
 * You should have received a copy of the GNU Lesser General Public
17 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 b4608c04 bellard
 */
19 978efd6a pbrook
#include "config.h"
20 56aebc89 pbrook
#include "qemu-common.h"
21 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
22 1fddef4b bellard
#include <stdlib.h>
23 1fddef4b bellard
#include <stdio.h>
24 1fddef4b bellard
#include <stdarg.h>
25 1fddef4b bellard
#include <string.h>
26 1fddef4b bellard
#include <errno.h>
27 1fddef4b bellard
#include <unistd.h>
28 978efd6a pbrook
#include <fcntl.h>
29 1fddef4b bellard
30 1fddef4b bellard
#include "qemu.h"
31 1fddef4b bellard
#else
32 83c9089e Paolo Bonzini
#include "monitor/monitor.h"
33 dccfcd0e Paolo Bonzini
#include "sysemu/char.h"
34 9c17d615 Paolo Bonzini
#include "sysemu/sysemu.h"
35 022c62cb Paolo Bonzini
#include "exec/gdbstub.h"
36 1fddef4b bellard
#endif
37 67b915a5 bellard
38 56aebc89 pbrook
#define MAX_PACKET_LENGTH 4096
39 56aebc89 pbrook
40 2b41f10e Blue Swirl
#include "cpu.h"
41 1de7afc9 Paolo Bonzini
#include "qemu/sockets.h"
42 9c17d615 Paolo Bonzini
#include "sysemu/kvm.h"
43 ca587a8e aurel32
44 f3659eee Andreas Färber
static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
45 f3659eee Andreas Färber
                                         uint8_t *buf, int len, bool is_write)
46 44520db1 Fabien Chouteau
{
47 f3659eee Andreas Färber
    CPUClass *cc = CPU_GET_CLASS(cpu);
48 f3659eee Andreas Färber
49 f3659eee Andreas Färber
    if (cc->memory_rw_debug) {
50 f3659eee Andreas Färber
        return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
51 f3659eee Andreas Färber
    }
52 f3659eee Andreas Färber
    return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
53 44520db1 Fabien Chouteau
}
54 ca587a8e aurel32
55 ca587a8e aurel32
enum {
56 ca587a8e aurel32
    GDB_SIGNAL_0 = 0,
57 ca587a8e aurel32
    GDB_SIGNAL_INT = 2,
58 425189a8 Jan Kiszka
    GDB_SIGNAL_QUIT = 3,
59 ca587a8e aurel32
    GDB_SIGNAL_TRAP = 5,
60 425189a8 Jan Kiszka
    GDB_SIGNAL_ABRT = 6,
61 425189a8 Jan Kiszka
    GDB_SIGNAL_ALRM = 14,
62 425189a8 Jan Kiszka
    GDB_SIGNAL_IO = 23,
63 425189a8 Jan Kiszka
    GDB_SIGNAL_XCPU = 24,
64 ca587a8e aurel32
    GDB_SIGNAL_UNKNOWN = 143
65 ca587a8e aurel32
};
66 ca587a8e aurel32
67 ca587a8e aurel32
#ifdef CONFIG_USER_ONLY
68 ca587a8e aurel32
69 ca587a8e aurel32
/* Map target signal numbers to GDB protocol signal numbers and vice
70 ca587a8e aurel32
 * versa.  For user emulation's currently supported systems, we can
71 ca587a8e aurel32
 * assume most signals are defined.
72 ca587a8e aurel32
 */
73 ca587a8e aurel32
74 ca587a8e aurel32
static int gdb_signal_table[] = {
75 ca587a8e aurel32
    0,
76 ca587a8e aurel32
    TARGET_SIGHUP,
77 ca587a8e aurel32
    TARGET_SIGINT,
78 ca587a8e aurel32
    TARGET_SIGQUIT,
79 ca587a8e aurel32
    TARGET_SIGILL,
80 ca587a8e aurel32
    TARGET_SIGTRAP,
81 ca587a8e aurel32
    TARGET_SIGABRT,
82 ca587a8e aurel32
    -1, /* SIGEMT */
83 ca587a8e aurel32
    TARGET_SIGFPE,
84 ca587a8e aurel32
    TARGET_SIGKILL,
85 ca587a8e aurel32
    TARGET_SIGBUS,
86 ca587a8e aurel32
    TARGET_SIGSEGV,
87 ca587a8e aurel32
    TARGET_SIGSYS,
88 ca587a8e aurel32
    TARGET_SIGPIPE,
89 ca587a8e aurel32
    TARGET_SIGALRM,
90 ca587a8e aurel32
    TARGET_SIGTERM,
91 ca587a8e aurel32
    TARGET_SIGURG,
92 ca587a8e aurel32
    TARGET_SIGSTOP,
93 ca587a8e aurel32
    TARGET_SIGTSTP,
94 ca587a8e aurel32
    TARGET_SIGCONT,
95 ca587a8e aurel32
    TARGET_SIGCHLD,
96 ca587a8e aurel32
    TARGET_SIGTTIN,
97 ca587a8e aurel32
    TARGET_SIGTTOU,
98 ca587a8e aurel32
    TARGET_SIGIO,
99 ca587a8e aurel32
    TARGET_SIGXCPU,
100 ca587a8e aurel32
    TARGET_SIGXFSZ,
101 ca587a8e aurel32
    TARGET_SIGVTALRM,
102 ca587a8e aurel32
    TARGET_SIGPROF,
103 ca587a8e aurel32
    TARGET_SIGWINCH,
104 ca587a8e aurel32
    -1, /* SIGLOST */
105 ca587a8e aurel32
    TARGET_SIGUSR1,
106 ca587a8e aurel32
    TARGET_SIGUSR2,
107 c72d5bf8 blueswir1
#ifdef TARGET_SIGPWR
108 ca587a8e aurel32
    TARGET_SIGPWR,
109 c72d5bf8 blueswir1
#else
110 c72d5bf8 blueswir1
    -1,
111 c72d5bf8 blueswir1
#endif
112 ca587a8e aurel32
    -1, /* SIGPOLL */
113 ca587a8e aurel32
    -1,
114 ca587a8e aurel32
    -1,
115 ca587a8e aurel32
    -1,
116 ca587a8e aurel32
    -1,
117 ca587a8e aurel32
    -1,
118 ca587a8e aurel32
    -1,
119 ca587a8e aurel32
    -1,
120 ca587a8e aurel32
    -1,
121 ca587a8e aurel32
    -1,
122 ca587a8e aurel32
    -1,
123 ca587a8e aurel32
    -1,
124 c72d5bf8 blueswir1
#ifdef __SIGRTMIN
125 ca587a8e aurel32
    __SIGRTMIN + 1,
126 ca587a8e aurel32
    __SIGRTMIN + 2,
127 ca587a8e aurel32
    __SIGRTMIN + 3,
128 ca587a8e aurel32
    __SIGRTMIN + 4,
129 ca587a8e aurel32
    __SIGRTMIN + 5,
130 ca587a8e aurel32
    __SIGRTMIN + 6,
131 ca587a8e aurel32
    __SIGRTMIN + 7,
132 ca587a8e aurel32
    __SIGRTMIN + 8,
133 ca587a8e aurel32
    __SIGRTMIN + 9,
134 ca587a8e aurel32
    __SIGRTMIN + 10,
135 ca587a8e aurel32
    __SIGRTMIN + 11,
136 ca587a8e aurel32
    __SIGRTMIN + 12,
137 ca587a8e aurel32
    __SIGRTMIN + 13,
138 ca587a8e aurel32
    __SIGRTMIN + 14,
139 ca587a8e aurel32
    __SIGRTMIN + 15,
140 ca587a8e aurel32
    __SIGRTMIN + 16,
141 ca587a8e aurel32
    __SIGRTMIN + 17,
142 ca587a8e aurel32
    __SIGRTMIN + 18,
143 ca587a8e aurel32
    __SIGRTMIN + 19,
144 ca587a8e aurel32
    __SIGRTMIN + 20,
145 ca587a8e aurel32
    __SIGRTMIN + 21,
146 ca587a8e aurel32
    __SIGRTMIN + 22,
147 ca587a8e aurel32
    __SIGRTMIN + 23,
148 ca587a8e aurel32
    __SIGRTMIN + 24,
149 ca587a8e aurel32
    __SIGRTMIN + 25,
150 ca587a8e aurel32
    __SIGRTMIN + 26,
151 ca587a8e aurel32
    __SIGRTMIN + 27,
152 ca587a8e aurel32
    __SIGRTMIN + 28,
153 ca587a8e aurel32
    __SIGRTMIN + 29,
154 ca587a8e aurel32
    __SIGRTMIN + 30,
155 ca587a8e aurel32
    __SIGRTMIN + 31,
156 ca587a8e aurel32
    -1, /* SIGCANCEL */
157 ca587a8e aurel32
    __SIGRTMIN,
158 ca587a8e aurel32
    __SIGRTMIN + 32,
159 ca587a8e aurel32
    __SIGRTMIN + 33,
160 ca587a8e aurel32
    __SIGRTMIN + 34,
161 ca587a8e aurel32
    __SIGRTMIN + 35,
162 ca587a8e aurel32
    __SIGRTMIN + 36,
163 ca587a8e aurel32
    __SIGRTMIN + 37,
164 ca587a8e aurel32
    __SIGRTMIN + 38,
165 ca587a8e aurel32
    __SIGRTMIN + 39,
166 ca587a8e aurel32
    __SIGRTMIN + 40,
167 ca587a8e aurel32
    __SIGRTMIN + 41,
168 ca587a8e aurel32
    __SIGRTMIN + 42,
169 ca587a8e aurel32
    __SIGRTMIN + 43,
170 ca587a8e aurel32
    __SIGRTMIN + 44,
171 ca587a8e aurel32
    __SIGRTMIN + 45,
172 ca587a8e aurel32
    __SIGRTMIN + 46,
173 ca587a8e aurel32
    __SIGRTMIN + 47,
174 ca587a8e aurel32
    __SIGRTMIN + 48,
175 ca587a8e aurel32
    __SIGRTMIN + 49,
176 ca587a8e aurel32
    __SIGRTMIN + 50,
177 ca587a8e aurel32
    __SIGRTMIN + 51,
178 ca587a8e aurel32
    __SIGRTMIN + 52,
179 ca587a8e aurel32
    __SIGRTMIN + 53,
180 ca587a8e aurel32
    __SIGRTMIN + 54,
181 ca587a8e aurel32
    __SIGRTMIN + 55,
182 ca587a8e aurel32
    __SIGRTMIN + 56,
183 ca587a8e aurel32
    __SIGRTMIN + 57,
184 ca587a8e aurel32
    __SIGRTMIN + 58,
185 ca587a8e aurel32
    __SIGRTMIN + 59,
186 ca587a8e aurel32
    __SIGRTMIN + 60,
187 ca587a8e aurel32
    __SIGRTMIN + 61,
188 ca587a8e aurel32
    __SIGRTMIN + 62,
189 ca587a8e aurel32
    __SIGRTMIN + 63,
190 ca587a8e aurel32
    __SIGRTMIN + 64,
191 ca587a8e aurel32
    __SIGRTMIN + 65,
192 ca587a8e aurel32
    __SIGRTMIN + 66,
193 ca587a8e aurel32
    __SIGRTMIN + 67,
194 ca587a8e aurel32
    __SIGRTMIN + 68,
195 ca587a8e aurel32
    __SIGRTMIN + 69,
196 ca587a8e aurel32
    __SIGRTMIN + 70,
197 ca587a8e aurel32
    __SIGRTMIN + 71,
198 ca587a8e aurel32
    __SIGRTMIN + 72,
199 ca587a8e aurel32
    __SIGRTMIN + 73,
200 ca587a8e aurel32
    __SIGRTMIN + 74,
201 ca587a8e aurel32
    __SIGRTMIN + 75,
202 ca587a8e aurel32
    __SIGRTMIN + 76,
203 ca587a8e aurel32
    __SIGRTMIN + 77,
204 ca587a8e aurel32
    __SIGRTMIN + 78,
205 ca587a8e aurel32
    __SIGRTMIN + 79,
206 ca587a8e aurel32
    __SIGRTMIN + 80,
207 ca587a8e aurel32
    __SIGRTMIN + 81,
208 ca587a8e aurel32
    __SIGRTMIN + 82,
209 ca587a8e aurel32
    __SIGRTMIN + 83,
210 ca587a8e aurel32
    __SIGRTMIN + 84,
211 ca587a8e aurel32
    __SIGRTMIN + 85,
212 ca587a8e aurel32
    __SIGRTMIN + 86,
213 ca587a8e aurel32
    __SIGRTMIN + 87,
214 ca587a8e aurel32
    __SIGRTMIN + 88,
215 ca587a8e aurel32
    __SIGRTMIN + 89,
216 ca587a8e aurel32
    __SIGRTMIN + 90,
217 ca587a8e aurel32
    __SIGRTMIN + 91,
218 ca587a8e aurel32
    __SIGRTMIN + 92,
219 ca587a8e aurel32
    __SIGRTMIN + 93,
220 ca587a8e aurel32
    __SIGRTMIN + 94,
221 ca587a8e aurel32
    __SIGRTMIN + 95,
222 ca587a8e aurel32
    -1, /* SIGINFO */
223 ca587a8e aurel32
    -1, /* UNKNOWN */
224 ca587a8e aurel32
    -1, /* DEFAULT */
225 ca587a8e aurel32
    -1,
226 ca587a8e aurel32
    -1,
227 ca587a8e aurel32
    -1,
228 ca587a8e aurel32
    -1,
229 ca587a8e aurel32
    -1,
230 ca587a8e aurel32
    -1
231 c72d5bf8 blueswir1
#endif
232 ca587a8e aurel32
};
233 8f447cc7 bellard
#else
234 ca587a8e aurel32
/* In system mode we only need SIGINT and SIGTRAP; other signals
235 ca587a8e aurel32
   are not yet supported.  */
236 ca587a8e aurel32
237 ca587a8e aurel32
enum {
238 ca587a8e aurel32
    TARGET_SIGINT = 2,
239 ca587a8e aurel32
    TARGET_SIGTRAP = 5
240 ca587a8e aurel32
};
241 ca587a8e aurel32
242 ca587a8e aurel32
static int gdb_signal_table[] = {
243 ca587a8e aurel32
    -1,
244 ca587a8e aurel32
    -1,
245 ca587a8e aurel32
    TARGET_SIGINT,
246 ca587a8e aurel32
    -1,
247 ca587a8e aurel32
    -1,
248 ca587a8e aurel32
    TARGET_SIGTRAP
249 ca587a8e aurel32
};
250 ca587a8e aurel32
#endif
251 ca587a8e aurel32
252 ca587a8e aurel32
#ifdef CONFIG_USER_ONLY
253 ca587a8e aurel32
static int target_signal_to_gdb (int sig)
254 ca587a8e aurel32
{
255 ca587a8e aurel32
    int i;
256 ca587a8e aurel32
    for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
257 ca587a8e aurel32
        if (gdb_signal_table[i] == sig)
258 ca587a8e aurel32
            return i;
259 ca587a8e aurel32
    return GDB_SIGNAL_UNKNOWN;
260 ca587a8e aurel32
}
261 8f447cc7 bellard
#endif
262 b4608c04 bellard
263 ca587a8e aurel32
static int gdb_signal_to_target (int sig)
264 ca587a8e aurel32
{
265 ca587a8e aurel32
    if (sig < ARRAY_SIZE (gdb_signal_table))
266 ca587a8e aurel32
        return gdb_signal_table[sig];
267 ca587a8e aurel32
    else
268 ca587a8e aurel32
        return -1;
269 ca587a8e aurel32
}
270 ca587a8e aurel32
271 4abe615b bellard
//#define DEBUG_GDB
272 b4608c04 bellard
273 56aebc89 pbrook
typedef struct GDBRegisterState {
274 56aebc89 pbrook
    int base_reg;
275 56aebc89 pbrook
    int num_regs;
276 56aebc89 pbrook
    gdb_reg_cb get_reg;
277 56aebc89 pbrook
    gdb_reg_cb set_reg;
278 56aebc89 pbrook
    const char *xml;
279 56aebc89 pbrook
    struct GDBRegisterState *next;
280 56aebc89 pbrook
} GDBRegisterState;
281 56aebc89 pbrook
282 858693c6 bellard
enum RSState {
283 36556b20 aliguori
    RS_INACTIVE,
284 858693c6 bellard
    RS_IDLE,
285 858693c6 bellard
    RS_GETLINE,
286 858693c6 bellard
    RS_CHKSUM1,
287 858693c6 bellard
    RS_CHKSUM2,
288 858693c6 bellard
};
289 858693c6 bellard
typedef struct GDBState {
290 2e0f2cfb Andreas Färber
    CPUState *c_cpu; /* current CPU for step/continue ops */
291 2e0f2cfb Andreas Färber
    CPUState *g_cpu; /* current CPU for other ops */
292 52f34623 Andreas Färber
    CPUState *query_cpu; /* for q{f|s}ThreadInfo */
293 41625033 bellard
    enum RSState state; /* parsing state */
294 56aebc89 pbrook
    char line_buf[MAX_PACKET_LENGTH];
295 858693c6 bellard
    int line_buf_index;
296 858693c6 bellard
    int line_csum;
297 56aebc89 pbrook
    uint8_t last_packet[MAX_PACKET_LENGTH + 4];
298 4046d913 pbrook
    int last_packet_len;
299 1f487ee9 edgar_igl
    int signal;
300 41625033 bellard
#ifdef CONFIG_USER_ONLY
301 4046d913 pbrook
    int fd;
302 41625033 bellard
    int running_state;
303 4046d913 pbrook
#else
304 4046d913 pbrook
    CharDriverState *chr;
305 8a34a0fb aliguori
    CharDriverState *mon_chr;
306 41625033 bellard
#endif
307 cdb432b2 Meador Inge
    char syscall_buf[256];
308 cdb432b2 Meador Inge
    gdb_syscall_complete_cb current_syscall_cb;
309 858693c6 bellard
} GDBState;
310 b4608c04 bellard
311 60897d36 edgar_igl
/* By default use no IRQs and no timers while single stepping so as to
312 60897d36 edgar_igl
 * make single stepping like an ICE HW step.
313 60897d36 edgar_igl
 */
314 60897d36 edgar_igl
static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
315 60897d36 edgar_igl
316 880a7578 aliguori
static GDBState *gdbserver_state;
317 880a7578 aliguori
318 5b50e790 Andreas Färber
bool gdb_has_xml;
319 56aebc89 pbrook
320 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
321 4046d913 pbrook
/* XXX: This is not thread safe.  Do we care?  */
322 4046d913 pbrook
static int gdbserver_fd = -1;
323 4046d913 pbrook
324 858693c6 bellard
static int get_char(GDBState *s)
325 b4608c04 bellard
{
326 b4608c04 bellard
    uint8_t ch;
327 b4608c04 bellard
    int ret;
328 b4608c04 bellard
329 b4608c04 bellard
    for(;;) {
330 00aa0040 Blue Swirl
        ret = qemu_recv(s->fd, &ch, 1, 0);
331 b4608c04 bellard
        if (ret < 0) {
332 1f487ee9 edgar_igl
            if (errno == ECONNRESET)
333 1f487ee9 edgar_igl
                s->fd = -1;
334 b4608c04 bellard
            if (errno != EINTR && errno != EAGAIN)
335 b4608c04 bellard
                return -1;
336 b4608c04 bellard
        } else if (ret == 0) {
337 1f487ee9 edgar_igl
            close(s->fd);
338 1f487ee9 edgar_igl
            s->fd = -1;
339 b4608c04 bellard
            return -1;
340 b4608c04 bellard
        } else {
341 b4608c04 bellard
            break;
342 b4608c04 bellard
        }
343 b4608c04 bellard
    }
344 b4608c04 bellard
    return ch;
345 b4608c04 bellard
}
346 4046d913 pbrook
#endif
347 b4608c04 bellard
348 654efcf3 blueswir1
static enum {
349 a2d1ebaf pbrook
    GDB_SYS_UNKNOWN,
350 a2d1ebaf pbrook
    GDB_SYS_ENABLED,
351 a2d1ebaf pbrook
    GDB_SYS_DISABLED,
352 a2d1ebaf pbrook
} gdb_syscall_mode;
353 a2d1ebaf pbrook
354 a2d1ebaf pbrook
/* If gdb is connected when the first semihosting syscall occurs then use
355 a2d1ebaf pbrook
   remote gdb syscalls.  Otherwise use native file IO.  */
356 a2d1ebaf pbrook
int use_gdb_syscalls(void)
357 a2d1ebaf pbrook
{
358 a2d1ebaf pbrook
    if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
359 880a7578 aliguori
        gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
360 880a7578 aliguori
                                            : GDB_SYS_DISABLED);
361 a2d1ebaf pbrook
    }
362 a2d1ebaf pbrook
    return gdb_syscall_mode == GDB_SYS_ENABLED;
363 a2d1ebaf pbrook
}
364 a2d1ebaf pbrook
365 ba70a624 edgar_igl
/* Resume execution.  */
366 ba70a624 edgar_igl
static inline void gdb_continue(GDBState *s)
367 ba70a624 edgar_igl
{
368 ba70a624 edgar_igl
#ifdef CONFIG_USER_ONLY
369 ba70a624 edgar_igl
    s->running_state = 1;
370 ba70a624 edgar_igl
#else
371 bc7d0e66 Paolo Bonzini
    if (runstate_check(RUN_STATE_GUEST_PANICKED)) {
372 bc7d0e66 Paolo Bonzini
        runstate_set(RUN_STATE_DEBUG);
373 bc7d0e66 Paolo Bonzini
    }
374 26ac7a31 Paolo Bonzini
    if (!runstate_needs_reset()) {
375 87f25c12 Paolo Bonzini
        vm_start();
376 87f25c12 Paolo Bonzini
    }
377 ba70a624 edgar_igl
#endif
378 ba70a624 edgar_igl
}
379 ba70a624 edgar_igl
380 858693c6 bellard
static void put_buffer(GDBState *s, const uint8_t *buf, int len)
381 b4608c04 bellard
{
382 4046d913 pbrook
#ifdef CONFIG_USER_ONLY
383 b4608c04 bellard
    int ret;
384 b4608c04 bellard
385 b4608c04 bellard
    while (len > 0) {
386 8f447cc7 bellard
        ret = send(s->fd, buf, len, 0);
387 b4608c04 bellard
        if (ret < 0) {
388 b4608c04 bellard
            if (errno != EINTR && errno != EAGAIN)
389 b4608c04 bellard
                return;
390 b4608c04 bellard
        } else {
391 b4608c04 bellard
            buf += ret;
392 b4608c04 bellard
            len -= ret;
393 b4608c04 bellard
        }
394 b4608c04 bellard
    }
395 4046d913 pbrook
#else
396 2cc6e0a1 Anthony Liguori
    qemu_chr_fe_write(s->chr, buf, len);
397 4046d913 pbrook
#endif
398 b4608c04 bellard
}
399 b4608c04 bellard
400 b4608c04 bellard
static inline int fromhex(int v)
401 b4608c04 bellard
{
402 b4608c04 bellard
    if (v >= '0' && v <= '9')
403 b4608c04 bellard
        return v - '0';
404 b4608c04 bellard
    else if (v >= 'A' && v <= 'F')
405 b4608c04 bellard
        return v - 'A' + 10;
406 b4608c04 bellard
    else if (v >= 'a' && v <= 'f')
407 b4608c04 bellard
        return v - 'a' + 10;
408 b4608c04 bellard
    else
409 b4608c04 bellard
        return 0;
410 b4608c04 bellard
}
411 b4608c04 bellard
412 b4608c04 bellard
static inline int tohex(int v)
413 b4608c04 bellard
{
414 b4608c04 bellard
    if (v < 10)
415 b4608c04 bellard
        return v + '0';
416 b4608c04 bellard
    else
417 b4608c04 bellard
        return v - 10 + 'a';
418 b4608c04 bellard
}
419 b4608c04 bellard
420 b4608c04 bellard
static void memtohex(char *buf, const uint8_t *mem, int len)
421 b4608c04 bellard
{
422 b4608c04 bellard
    int i, c;
423 b4608c04 bellard
    char *q;
424 b4608c04 bellard
    q = buf;
425 b4608c04 bellard
    for(i = 0; i < len; i++) {
426 b4608c04 bellard
        c = mem[i];
427 b4608c04 bellard
        *q++ = tohex(c >> 4);
428 b4608c04 bellard
        *q++ = tohex(c & 0xf);
429 b4608c04 bellard
    }
430 b4608c04 bellard
    *q = '\0';
431 b4608c04 bellard
}
432 b4608c04 bellard
433 b4608c04 bellard
static void hextomem(uint8_t *mem, const char *buf, int len)
434 b4608c04 bellard
{
435 b4608c04 bellard
    int i;
436 b4608c04 bellard
437 b4608c04 bellard
    for(i = 0; i < len; i++) {
438 b4608c04 bellard
        mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
439 b4608c04 bellard
        buf += 2;
440 b4608c04 bellard
    }
441 b4608c04 bellard
}
442 b4608c04 bellard
443 b4608c04 bellard
/* return -1 if error, 0 if OK */
444 56aebc89 pbrook
static int put_packet_binary(GDBState *s, const char *buf, int len)
445 b4608c04 bellard
{
446 56aebc89 pbrook
    int csum, i;
447 60fe76f3 ths
    uint8_t *p;
448 b4608c04 bellard
449 b4608c04 bellard
    for(;;) {
450 4046d913 pbrook
        p = s->last_packet;
451 4046d913 pbrook
        *(p++) = '$';
452 4046d913 pbrook
        memcpy(p, buf, len);
453 4046d913 pbrook
        p += len;
454 b4608c04 bellard
        csum = 0;
455 b4608c04 bellard
        for(i = 0; i < len; i++) {
456 b4608c04 bellard
            csum += buf[i];
457 b4608c04 bellard
        }
458 4046d913 pbrook
        *(p++) = '#';
459 4046d913 pbrook
        *(p++) = tohex((csum >> 4) & 0xf);
460 4046d913 pbrook
        *(p++) = tohex((csum) & 0xf);
461 b4608c04 bellard
462 4046d913 pbrook
        s->last_packet_len = p - s->last_packet;
463 ffe8ab83 ths
        put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
464 b4608c04 bellard
465 4046d913 pbrook
#ifdef CONFIG_USER_ONLY
466 4046d913 pbrook
        i = get_char(s);
467 4046d913 pbrook
        if (i < 0)
468 b4608c04 bellard
            return -1;
469 4046d913 pbrook
        if (i == '+')
470 b4608c04 bellard
            break;
471 4046d913 pbrook
#else
472 4046d913 pbrook
        break;
473 4046d913 pbrook
#endif
474 b4608c04 bellard
    }
475 b4608c04 bellard
    return 0;
476 b4608c04 bellard
}
477 b4608c04 bellard
478 56aebc89 pbrook
/* return -1 if error, 0 if OK */
479 56aebc89 pbrook
static int put_packet(GDBState *s, const char *buf)
480 56aebc89 pbrook
{
481 56aebc89 pbrook
#ifdef DEBUG_GDB
482 56aebc89 pbrook
    printf("reply='%s'\n", buf);
483 56aebc89 pbrook
#endif
484 79808573 bellard
485 56aebc89 pbrook
    return put_packet_binary(s, buf, strlen(buf));
486 56aebc89 pbrook
}
487 56aebc89 pbrook
488 56aebc89 pbrook
/* Encode data using the encoding for 'x' packets.  */
489 56aebc89 pbrook
static int memtox(char *buf, const char *mem, int len)
490 56aebc89 pbrook
{
491 56aebc89 pbrook
    char *p = buf;
492 56aebc89 pbrook
    char c;
493 56aebc89 pbrook
494 56aebc89 pbrook
    while (len--) {
495 56aebc89 pbrook
        c = *(mem++);
496 56aebc89 pbrook
        switch (c) {
497 56aebc89 pbrook
        case '#': case '$': case '*': case '}':
498 56aebc89 pbrook
            *(p++) = '}';
499 56aebc89 pbrook
            *(p++) = c ^ 0x20;
500 56aebc89 pbrook
            break;
501 56aebc89 pbrook
        default:
502 56aebc89 pbrook
            *(p++) = c;
503 56aebc89 pbrook
            break;
504 56aebc89 pbrook
        }
505 56aebc89 pbrook
    }
506 56aebc89 pbrook
    return p - buf;
507 56aebc89 pbrook
}
508 f1ccf904 ths
509 5b24c641 Andreas Färber
static const char *get_feature_xml(const char *p, const char **newp,
510 5b24c641 Andreas Färber
                                   CPUClass *cc)
511 56aebc89 pbrook
{
512 56aebc89 pbrook
    size_t len;
513 56aebc89 pbrook
    int i;
514 56aebc89 pbrook
    const char *name;
515 56aebc89 pbrook
    static char target_xml[1024];
516 56aebc89 pbrook
517 56aebc89 pbrook
    len = 0;
518 56aebc89 pbrook
    while (p[len] && p[len] != ':')
519 56aebc89 pbrook
        len++;
520 56aebc89 pbrook
    *newp = p + len;
521 56aebc89 pbrook
522 56aebc89 pbrook
    name = NULL;
523 56aebc89 pbrook
    if (strncmp(p, "target.xml", len) == 0) {
524 56aebc89 pbrook
        /* Generate the XML description for this CPU.  */
525 56aebc89 pbrook
        if (!target_xml[0]) {
526 56aebc89 pbrook
            GDBRegisterState *r;
527 eac8b355 Andreas Färber
            CPUState *cpu = first_cpu;
528 56aebc89 pbrook
529 5b3715bf blueswir1
            snprintf(target_xml, sizeof(target_xml),
530 5b3715bf blueswir1
                     "<?xml version=\"1.0\"?>"
531 5b3715bf blueswir1
                     "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
532 5b3715bf blueswir1
                     "<target>"
533 5b3715bf blueswir1
                     "<xi:include href=\"%s\"/>",
534 5b24c641 Andreas Färber
                     cc->gdb_core_xml_file);
535 56aebc89 pbrook
536 eac8b355 Andreas Färber
            for (r = cpu->gdb_regs; r; r = r->next) {
537 2dc766da blueswir1
                pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
538 2dc766da blueswir1
                pstrcat(target_xml, sizeof(target_xml), r->xml);
539 2dc766da blueswir1
                pstrcat(target_xml, sizeof(target_xml), "\"/>");
540 56aebc89 pbrook
            }
541 2dc766da blueswir1
            pstrcat(target_xml, sizeof(target_xml), "</target>");
542 56aebc89 pbrook
        }
543 56aebc89 pbrook
        return target_xml;
544 56aebc89 pbrook
    }
545 56aebc89 pbrook
    for (i = 0; ; i++) {
546 56aebc89 pbrook
        name = xml_builtin[i][0];
547 56aebc89 pbrook
        if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
548 56aebc89 pbrook
            break;
549 56aebc89 pbrook
    }
550 56aebc89 pbrook
    return name ? xml_builtin[i][1] : NULL;
551 56aebc89 pbrook
}
552 f1ccf904 ths
553 385b9f0e Andreas Färber
static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
554 56aebc89 pbrook
{
555 a0e372f0 Andreas Färber
    CPUClass *cc = CPU_GET_CLASS(cpu);
556 385b9f0e Andreas Färber
    CPUArchState *env = cpu->env_ptr;
557 56aebc89 pbrook
    GDBRegisterState *r;
558 f1ccf904 ths
559 a0e372f0 Andreas Färber
    if (reg < cc->gdb_num_core_regs) {
560 5b50e790 Andreas Färber
        return cc->gdb_read_register(cpu, mem_buf, reg);
561 a0e372f0 Andreas Färber
    }
562 f1ccf904 ths
563 eac8b355 Andreas Färber
    for (r = cpu->gdb_regs; r; r = r->next) {
564 56aebc89 pbrook
        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
565 56aebc89 pbrook
            return r->get_reg(env, mem_buf, reg - r->base_reg);
566 56aebc89 pbrook
        }
567 56aebc89 pbrook
    }
568 56aebc89 pbrook
    return 0;
569 f1ccf904 ths
}
570 f1ccf904 ths
571 385b9f0e Andreas Färber
static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
572 f1ccf904 ths
{
573 a0e372f0 Andreas Färber
    CPUClass *cc = CPU_GET_CLASS(cpu);
574 385b9f0e Andreas Färber
    CPUArchState *env = cpu->env_ptr;
575 56aebc89 pbrook
    GDBRegisterState *r;
576 f1ccf904 ths
577 a0e372f0 Andreas Färber
    if (reg < cc->gdb_num_core_regs) {
578 5b50e790 Andreas Färber
        return cc->gdb_write_register(cpu, mem_buf, reg);
579 a0e372f0 Andreas Färber
    }
580 56aebc89 pbrook
581 eac8b355 Andreas Färber
    for (r = cpu->gdb_regs; r; r = r->next) {
582 56aebc89 pbrook
        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
583 56aebc89 pbrook
            return r->set_reg(env, mem_buf, reg - r->base_reg);
584 56aebc89 pbrook
        }
585 56aebc89 pbrook
    }
586 6da41eaf bellard
    return 0;
587 6da41eaf bellard
}
588 6da41eaf bellard
589 56aebc89 pbrook
/* Register a supplemental set of CPU registers.  If g_pos is nonzero it
590 56aebc89 pbrook
   specifies the first register number and these registers are included in
591 56aebc89 pbrook
   a standard "g" packet.  Direction is relative to gdb, i.e. get_reg is
592 56aebc89 pbrook
   gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
593 56aebc89 pbrook
 */
594 56aebc89 pbrook
595 22169d41 Andreas Färber
void gdb_register_coprocessor(CPUState *cpu,
596 22169d41 Andreas Färber
                              gdb_reg_cb get_reg, gdb_reg_cb set_reg,
597 22169d41 Andreas Färber
                              int num_regs, const char *xml, int g_pos)
598 6da41eaf bellard
{
599 56aebc89 pbrook
    GDBRegisterState *s;
600 56aebc89 pbrook
    GDBRegisterState **p;
601 56aebc89 pbrook
602 eac8b355 Andreas Färber
    p = &cpu->gdb_regs;
603 56aebc89 pbrook
    while (*p) {
604 56aebc89 pbrook
        /* Check for duplicates.  */
605 56aebc89 pbrook
        if (strcmp((*p)->xml, xml) == 0)
606 56aebc89 pbrook
            return;
607 56aebc89 pbrook
        p = &(*p)->next;
608 56aebc89 pbrook
    }
609 9643c25f Stefan Weil
610 9643c25f Stefan Weil
    s = g_new0(GDBRegisterState, 1);
611 a0e372f0 Andreas Färber
    s->base_reg = cpu->gdb_num_regs;
612 9643c25f Stefan Weil
    s->num_regs = num_regs;
613 9643c25f Stefan Weil
    s->get_reg = get_reg;
614 9643c25f Stefan Weil
    s->set_reg = set_reg;
615 9643c25f Stefan Weil
    s->xml = xml;
616 9643c25f Stefan Weil
617 56aebc89 pbrook
    /* Add to end of list.  */
618 a0e372f0 Andreas Färber
    cpu->gdb_num_regs += num_regs;
619 56aebc89 pbrook
    *p = s;
620 56aebc89 pbrook
    if (g_pos) {
621 56aebc89 pbrook
        if (g_pos != s->base_reg) {
622 56aebc89 pbrook
            fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
623 56aebc89 pbrook
                    "Expected %d got %d\n", xml, g_pos, s->base_reg);
624 35143f01 Andreas Färber
        } else {
625 35143f01 Andreas Färber
            cpu->gdb_num_g_regs = cpu->gdb_num_regs;
626 56aebc89 pbrook
        }
627 56aebc89 pbrook
    }
628 6da41eaf bellard
}
629 6da41eaf bellard
630 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
631 a1d1bb31 aliguori
static const int xlat_gdb_type[] = {
632 a1d1bb31 aliguori
    [GDB_WATCHPOINT_WRITE]  = BP_GDB | BP_MEM_WRITE,
633 a1d1bb31 aliguori
    [GDB_WATCHPOINT_READ]   = BP_GDB | BP_MEM_READ,
634 a1d1bb31 aliguori
    [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
635 a1d1bb31 aliguori
};
636 a1d1bb31 aliguori
#endif
637 a1d1bb31 aliguori
638 880a7578 aliguori
static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
639 a1d1bb31 aliguori
{
640 182735ef Andreas Färber
    CPUState *cpu;
641 9349b4f9 Andreas Färber
    CPUArchState *env;
642 880a7578 aliguori
    int err = 0;
643 880a7578 aliguori
644 62278814 Andreas Färber
    if (kvm_enabled()) {
645 2e0f2cfb Andreas Färber
        return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
646 62278814 Andreas Färber
    }
647 e22a25c9 aliguori
648 a1d1bb31 aliguori
    switch (type) {
649 a1d1bb31 aliguori
    case GDB_BREAKPOINT_SW:
650 a1d1bb31 aliguori
    case GDB_BREAKPOINT_HW:
651 182735ef Andreas Färber
        for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
652 182735ef Andreas Färber
            env = cpu->env_ptr;
653 880a7578 aliguori
            err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
654 880a7578 aliguori
            if (err)
655 880a7578 aliguori
                break;
656 880a7578 aliguori
        }
657 880a7578 aliguori
        return err;
658 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
659 a1d1bb31 aliguori
    case GDB_WATCHPOINT_WRITE:
660 a1d1bb31 aliguori
    case GDB_WATCHPOINT_READ:
661 a1d1bb31 aliguori
    case GDB_WATCHPOINT_ACCESS:
662 182735ef Andreas Färber
        for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
663 182735ef Andreas Färber
            env = cpu->env_ptr;
664 880a7578 aliguori
            err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
665 880a7578 aliguori
                                        NULL);
666 880a7578 aliguori
            if (err)
667 880a7578 aliguori
                break;
668 880a7578 aliguori
        }
669 880a7578 aliguori
        return err;
670 a1d1bb31 aliguori
#endif
671 a1d1bb31 aliguori
    default:
672 a1d1bb31 aliguori
        return -ENOSYS;
673 a1d1bb31 aliguori
    }
674 a1d1bb31 aliguori
}
675 a1d1bb31 aliguori
676 880a7578 aliguori
static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
677 a1d1bb31 aliguori
{
678 182735ef Andreas Färber
    CPUState *cpu;
679 9349b4f9 Andreas Färber
    CPUArchState *env;
680 880a7578 aliguori
    int err = 0;
681 880a7578 aliguori
682 62278814 Andreas Färber
    if (kvm_enabled()) {
683 2e0f2cfb Andreas Färber
        return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
684 62278814 Andreas Färber
    }
685 e22a25c9 aliguori
686 a1d1bb31 aliguori
    switch (type) {
687 a1d1bb31 aliguori
    case GDB_BREAKPOINT_SW:
688 a1d1bb31 aliguori
    case GDB_BREAKPOINT_HW:
689 182735ef Andreas Färber
        for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
690 182735ef Andreas Färber
            env = cpu->env_ptr;
691 880a7578 aliguori
            err = cpu_breakpoint_remove(env, addr, BP_GDB);
692 880a7578 aliguori
            if (err)
693 880a7578 aliguori
                break;
694 880a7578 aliguori
        }
695 880a7578 aliguori
        return err;
696 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
697 a1d1bb31 aliguori
    case GDB_WATCHPOINT_WRITE:
698 a1d1bb31 aliguori
    case GDB_WATCHPOINT_READ:
699 a1d1bb31 aliguori
    case GDB_WATCHPOINT_ACCESS:
700 182735ef Andreas Färber
        for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
701 182735ef Andreas Färber
            env = cpu->env_ptr;
702 880a7578 aliguori
            err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
703 880a7578 aliguori
            if (err)
704 880a7578 aliguori
                break;
705 880a7578 aliguori
        }
706 880a7578 aliguori
        return err;
707 a1d1bb31 aliguori
#endif
708 a1d1bb31 aliguori
    default:
709 a1d1bb31 aliguori
        return -ENOSYS;
710 a1d1bb31 aliguori
    }
711 a1d1bb31 aliguori
}
712 a1d1bb31 aliguori
713 880a7578 aliguori
static void gdb_breakpoint_remove_all(void)
714 a1d1bb31 aliguori
{
715 182735ef Andreas Färber
    CPUState *cpu;
716 9349b4f9 Andreas Färber
    CPUArchState *env;
717 880a7578 aliguori
718 e22a25c9 aliguori
    if (kvm_enabled()) {
719 2e0f2cfb Andreas Färber
        kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
720 e22a25c9 aliguori
        return;
721 e22a25c9 aliguori
    }
722 e22a25c9 aliguori
723 182735ef Andreas Färber
    for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
724 182735ef Andreas Färber
        env = cpu->env_ptr;
725 880a7578 aliguori
        cpu_breakpoint_remove_all(env, BP_GDB);
726 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
727 880a7578 aliguori
        cpu_watchpoint_remove_all(env, BP_GDB);
728 a1d1bb31 aliguori
#endif
729 880a7578 aliguori
    }
730 a1d1bb31 aliguori
}
731 a1d1bb31 aliguori
732 fab9d284 aurel32
static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
733 fab9d284 aurel32
{
734 2e0f2cfb Andreas Färber
    CPUState *cpu = s->c_cpu;
735 f45748f1 Andreas Färber
    CPUClass *cc = CPU_GET_CLASS(cpu);
736 f45748f1 Andreas Färber
737 f45748f1 Andreas Färber
    cpu_synchronize_state(cpu);
738 f45748f1 Andreas Färber
    if (cc->set_pc) {
739 f45748f1 Andreas Färber
        cc->set_pc(cpu, pc);
740 ff1d1977 Nathan Froyd
    }
741 fab9d284 aurel32
}
742 fab9d284 aurel32
743 2e0f2cfb Andreas Färber
static CPUState *find_cpu(uint32_t thread_id)
744 1e9fa730 Nathan Froyd
{
745 0d34282f Andreas Färber
    CPUState *cpu;
746 1e9fa730 Nathan Froyd
747 182735ef Andreas Färber
    for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
748 aa48dd93 Andreas Färber
        if (cpu_index(cpu) == thread_id) {
749 2e0f2cfb Andreas Färber
            return cpu;
750 aa48dd93 Andreas Färber
        }
751 1e9fa730 Nathan Froyd
    }
752 aa48dd93 Andreas Färber
753 aa48dd93 Andreas Färber
    return NULL;
754 1e9fa730 Nathan Froyd
}
755 1e9fa730 Nathan Froyd
756 880a7578 aliguori
static int gdb_handle_packet(GDBState *s, const char *line_buf)
757 b4608c04 bellard
{
758 2e0f2cfb Andreas Färber
    CPUState *cpu;
759 5b24c641 Andreas Färber
    CPUClass *cc;
760 b4608c04 bellard
    const char *p;
761 1e9fa730 Nathan Froyd
    uint32_t thread;
762 1e9fa730 Nathan Froyd
    int ch, reg_size, type, res;
763 56aebc89 pbrook
    char buf[MAX_PACKET_LENGTH];
764 56aebc89 pbrook
    uint8_t mem_buf[MAX_PACKET_LENGTH];
765 56aebc89 pbrook
    uint8_t *registers;
766 9d9754a3 bellard
    target_ulong addr, len;
767 3b46e624 ths
768 858693c6 bellard
#ifdef DEBUG_GDB
769 858693c6 bellard
    printf("command='%s'\n", line_buf);
770 858693c6 bellard
#endif
771 858693c6 bellard
    p = line_buf;
772 858693c6 bellard
    ch = *p++;
773 858693c6 bellard
    switch(ch) {
774 858693c6 bellard
    case '?':
775 1fddef4b bellard
        /* TODO: Make this return the correct value for user-mode.  */
776 ca587a8e aurel32
        snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
777 2e0f2cfb Andreas Färber
                 cpu_index(s->c_cpu));
778 858693c6 bellard
        put_packet(s, buf);
779 7d03f82f edgar_igl
        /* Remove all the breakpoints when this query is issued,
780 7d03f82f edgar_igl
         * because gdb is doing and initial connect and the state
781 7d03f82f edgar_igl
         * should be cleaned up.
782 7d03f82f edgar_igl
         */
783 880a7578 aliguori
        gdb_breakpoint_remove_all();
784 858693c6 bellard
        break;
785 858693c6 bellard
    case 'c':
786 858693c6 bellard
        if (*p != '\0') {
787 9d9754a3 bellard
            addr = strtoull(p, (char **)&p, 16);
788 fab9d284 aurel32
            gdb_set_cpu_pc(s, addr);
789 858693c6 bellard
        }
790 ca587a8e aurel32
        s->signal = 0;
791 ba70a624 edgar_igl
        gdb_continue(s);
792 41625033 bellard
        return RS_IDLE;
793 1f487ee9 edgar_igl
    case 'C':
794 ca587a8e aurel32
        s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
795 ca587a8e aurel32
        if (s->signal == -1)
796 ca587a8e aurel32
            s->signal = 0;
797 1f487ee9 edgar_igl
        gdb_continue(s);
798 1f487ee9 edgar_igl
        return RS_IDLE;
799 dd32aa10 Jan Kiszka
    case 'v':
800 dd32aa10 Jan Kiszka
        if (strncmp(p, "Cont", 4) == 0) {
801 dd32aa10 Jan Kiszka
            int res_signal, res_thread;
802 dd32aa10 Jan Kiszka
803 dd32aa10 Jan Kiszka
            p += 4;
804 dd32aa10 Jan Kiszka
            if (*p == '?') {
805 dd32aa10 Jan Kiszka
                put_packet(s, "vCont;c;C;s;S");
806 dd32aa10 Jan Kiszka
                break;
807 dd32aa10 Jan Kiszka
            }
808 dd32aa10 Jan Kiszka
            res = 0;
809 dd32aa10 Jan Kiszka
            res_signal = 0;
810 dd32aa10 Jan Kiszka
            res_thread = 0;
811 dd32aa10 Jan Kiszka
            while (*p) {
812 dd32aa10 Jan Kiszka
                int action, signal;
813 dd32aa10 Jan Kiszka
814 dd32aa10 Jan Kiszka
                if (*p++ != ';') {
815 dd32aa10 Jan Kiszka
                    res = 0;
816 dd32aa10 Jan Kiszka
                    break;
817 dd32aa10 Jan Kiszka
                }
818 dd32aa10 Jan Kiszka
                action = *p++;
819 dd32aa10 Jan Kiszka
                signal = 0;
820 dd32aa10 Jan Kiszka
                if (action == 'C' || action == 'S') {
821 dd32aa10 Jan Kiszka
                    signal = strtoul(p, (char **)&p, 16);
822 dd32aa10 Jan Kiszka
                } else if (action != 'c' && action != 's') {
823 dd32aa10 Jan Kiszka
                    res = 0;
824 dd32aa10 Jan Kiszka
                    break;
825 dd32aa10 Jan Kiszka
                }
826 dd32aa10 Jan Kiszka
                thread = 0;
827 dd32aa10 Jan Kiszka
                if (*p == ':') {
828 dd32aa10 Jan Kiszka
                    thread = strtoull(p+1, (char **)&p, 16);
829 dd32aa10 Jan Kiszka
                }
830 dd32aa10 Jan Kiszka
                action = tolower(action);
831 dd32aa10 Jan Kiszka
                if (res == 0 || (res == 'c' && action == 's')) {
832 dd32aa10 Jan Kiszka
                    res = action;
833 dd32aa10 Jan Kiszka
                    res_signal = signal;
834 dd32aa10 Jan Kiszka
                    res_thread = thread;
835 dd32aa10 Jan Kiszka
                }
836 dd32aa10 Jan Kiszka
            }
837 dd32aa10 Jan Kiszka
            if (res) {
838 dd32aa10 Jan Kiszka
                if (res_thread != -1 && res_thread != 0) {
839 2e0f2cfb Andreas Färber
                    cpu = find_cpu(res_thread);
840 2e0f2cfb Andreas Färber
                    if (cpu == NULL) {
841 dd32aa10 Jan Kiszka
                        put_packet(s, "E22");
842 dd32aa10 Jan Kiszka
                        break;
843 dd32aa10 Jan Kiszka
                    }
844 2e0f2cfb Andreas Färber
                    s->c_cpu = cpu;
845 dd32aa10 Jan Kiszka
                }
846 dd32aa10 Jan Kiszka
                if (res == 's') {
847 2e0f2cfb Andreas Färber
                    cpu_single_step(s->c_cpu, sstep_flags);
848 dd32aa10 Jan Kiszka
                }
849 dd32aa10 Jan Kiszka
                s->signal = res_signal;
850 dd32aa10 Jan Kiszka
                gdb_continue(s);
851 dd32aa10 Jan Kiszka
                return RS_IDLE;
852 dd32aa10 Jan Kiszka
            }
853 dd32aa10 Jan Kiszka
            break;
854 dd32aa10 Jan Kiszka
        } else {
855 dd32aa10 Jan Kiszka
            goto unknown_command;
856 dd32aa10 Jan Kiszka
        }
857 7d03f82f edgar_igl
    case 'k':
858 00e94dbc Jan Kiszka
#ifdef CONFIG_USER_ONLY
859 7d03f82f edgar_igl
        /* Kill the target */
860 7d03f82f edgar_igl
        fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
861 7d03f82f edgar_igl
        exit(0);
862 00e94dbc Jan Kiszka
#endif
863 7d03f82f edgar_igl
    case 'D':
864 7d03f82f edgar_igl
        /* Detach packet */
865 880a7578 aliguori
        gdb_breakpoint_remove_all();
866 7ea06da3 Daniel Gutson
        gdb_syscall_mode = GDB_SYS_DISABLED;
867 7d03f82f edgar_igl
        gdb_continue(s);
868 7d03f82f edgar_igl
        put_packet(s, "OK");
869 7d03f82f edgar_igl
        break;
870 858693c6 bellard
    case 's':
871 858693c6 bellard
        if (*p != '\0') {
872 8fac5803 ths
            addr = strtoull(p, (char **)&p, 16);
873 fab9d284 aurel32
            gdb_set_cpu_pc(s, addr);
874 858693c6 bellard
        }
875 2e0f2cfb Andreas Färber
        cpu_single_step(s->c_cpu, sstep_flags);
876 ba70a624 edgar_igl
        gdb_continue(s);
877 41625033 bellard
        return RS_IDLE;
878 a2d1ebaf pbrook
    case 'F':
879 a2d1ebaf pbrook
        {
880 a2d1ebaf pbrook
            target_ulong ret;
881 a2d1ebaf pbrook
            target_ulong err;
882 a2d1ebaf pbrook
883 a2d1ebaf pbrook
            ret = strtoull(p, (char **)&p, 16);
884 a2d1ebaf pbrook
            if (*p == ',') {
885 a2d1ebaf pbrook
                p++;
886 a2d1ebaf pbrook
                err = strtoull(p, (char **)&p, 16);
887 a2d1ebaf pbrook
            } else {
888 a2d1ebaf pbrook
                err = 0;
889 a2d1ebaf pbrook
            }
890 a2d1ebaf pbrook
            if (*p == ',')
891 a2d1ebaf pbrook
                p++;
892 a2d1ebaf pbrook
            type = *p;
893 cdb432b2 Meador Inge
            if (s->current_syscall_cb) {
894 2e0f2cfb Andreas Färber
                s->current_syscall_cb(s->c_cpu, ret, err);
895 cdb432b2 Meador Inge
                s->current_syscall_cb = NULL;
896 cdb432b2 Meador Inge
            }
897 a2d1ebaf pbrook
            if (type == 'C') {
898 a2d1ebaf pbrook
                put_packet(s, "T02");
899 a2d1ebaf pbrook
            } else {
900 ba70a624 edgar_igl
                gdb_continue(s);
901 a2d1ebaf pbrook
            }
902 a2d1ebaf pbrook
        }
903 a2d1ebaf pbrook
        break;
904 858693c6 bellard
    case 'g':
905 2e0f2cfb Andreas Färber
        cpu_synchronize_state(s->g_cpu);
906 56aebc89 pbrook
        len = 0;
907 35143f01 Andreas Färber
        for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) {
908 2e0f2cfb Andreas Färber
            reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
909 56aebc89 pbrook
            len += reg_size;
910 56aebc89 pbrook
        }
911 56aebc89 pbrook
        memtohex(buf, mem_buf, len);
912 858693c6 bellard
        put_packet(s, buf);
913 858693c6 bellard
        break;
914 858693c6 bellard
    case 'G':
915 2e0f2cfb Andreas Färber
        cpu_synchronize_state(s->g_cpu);
916 56aebc89 pbrook
        registers = mem_buf;
917 858693c6 bellard
        len = strlen(p) / 2;
918 858693c6 bellard
        hextomem((uint8_t *)registers, p, len);
919 35143f01 Andreas Färber
        for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) {
920 2e0f2cfb Andreas Färber
            reg_size = gdb_write_register(s->g_cpu, registers, addr);
921 56aebc89 pbrook
            len -= reg_size;
922 56aebc89 pbrook
            registers += reg_size;
923 56aebc89 pbrook
        }
924 858693c6 bellard
        put_packet(s, "OK");
925 858693c6 bellard
        break;
926 858693c6 bellard
    case 'm':
927 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
928 858693c6 bellard
        if (*p == ',')
929 858693c6 bellard
            p++;
930 9d9754a3 bellard
        len = strtoull(p, NULL, 16);
931 2e0f2cfb Andreas Färber
        if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
932 6f970bd9 bellard
            put_packet (s, "E14");
933 6f970bd9 bellard
        } else {
934 6f970bd9 bellard
            memtohex(buf, mem_buf, len);
935 6f970bd9 bellard
            put_packet(s, buf);
936 6f970bd9 bellard
        }
937 858693c6 bellard
        break;
938 858693c6 bellard
    case 'M':
939 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
940 858693c6 bellard
        if (*p == ',')
941 858693c6 bellard
            p++;
942 9d9754a3 bellard
        len = strtoull(p, (char **)&p, 16);
943 b328f873 bellard
        if (*p == ':')
944 858693c6 bellard
            p++;
945 858693c6 bellard
        hextomem(mem_buf, p, len);
946 2e0f2cfb Andreas Färber
        if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
947 f3659eee Andreas Färber
                                   true) != 0) {
948 905f20b1 bellard
            put_packet(s, "E14");
949 44520db1 Fabien Chouteau
        } else {
950 858693c6 bellard
            put_packet(s, "OK");
951 44520db1 Fabien Chouteau
        }
952 858693c6 bellard
        break;
953 56aebc89 pbrook
    case 'p':
954 56aebc89 pbrook
        /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
955 56aebc89 pbrook
           This works, but can be very slow.  Anything new enough to
956 56aebc89 pbrook
           understand XML also knows how to use this properly.  */
957 56aebc89 pbrook
        if (!gdb_has_xml)
958 56aebc89 pbrook
            goto unknown_command;
959 56aebc89 pbrook
        addr = strtoull(p, (char **)&p, 16);
960 2e0f2cfb Andreas Färber
        reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
961 56aebc89 pbrook
        if (reg_size) {
962 56aebc89 pbrook
            memtohex(buf, mem_buf, reg_size);
963 56aebc89 pbrook
            put_packet(s, buf);
964 56aebc89 pbrook
        } else {
965 56aebc89 pbrook
            put_packet(s, "E14");
966 56aebc89 pbrook
        }
967 56aebc89 pbrook
        break;
968 56aebc89 pbrook
    case 'P':
969 56aebc89 pbrook
        if (!gdb_has_xml)
970 56aebc89 pbrook
            goto unknown_command;
971 56aebc89 pbrook
        addr = strtoull(p, (char **)&p, 16);
972 56aebc89 pbrook
        if (*p == '=')
973 56aebc89 pbrook
            p++;
974 56aebc89 pbrook
        reg_size = strlen(p) / 2;
975 56aebc89 pbrook
        hextomem(mem_buf, p, reg_size);
976 2e0f2cfb Andreas Färber
        gdb_write_register(s->g_cpu, mem_buf, addr);
977 56aebc89 pbrook
        put_packet(s, "OK");
978 56aebc89 pbrook
        break;
979 858693c6 bellard
    case 'Z':
980 858693c6 bellard
    case 'z':
981 858693c6 bellard
        type = strtoul(p, (char **)&p, 16);
982 858693c6 bellard
        if (*p == ',')
983 858693c6 bellard
            p++;
984 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
985 858693c6 bellard
        if (*p == ',')
986 858693c6 bellard
            p++;
987 9d9754a3 bellard
        len = strtoull(p, (char **)&p, 16);
988 a1d1bb31 aliguori
        if (ch == 'Z')
989 880a7578 aliguori
            res = gdb_breakpoint_insert(addr, len, type);
990 a1d1bb31 aliguori
        else
991 880a7578 aliguori
            res = gdb_breakpoint_remove(addr, len, type);
992 a1d1bb31 aliguori
        if (res >= 0)
993 a1d1bb31 aliguori
             put_packet(s, "OK");
994 a1d1bb31 aliguori
        else if (res == -ENOSYS)
995 0f459d16 pbrook
            put_packet(s, "");
996 a1d1bb31 aliguori
        else
997 a1d1bb31 aliguori
            put_packet(s, "E22");
998 858693c6 bellard
        break;
999 880a7578 aliguori
    case 'H':
1000 880a7578 aliguori
        type = *p++;
1001 880a7578 aliguori
        thread = strtoull(p, (char **)&p, 16);
1002 880a7578 aliguori
        if (thread == -1 || thread == 0) {
1003 880a7578 aliguori
            put_packet(s, "OK");
1004 880a7578 aliguori
            break;
1005 880a7578 aliguori
        }
1006 2e0f2cfb Andreas Färber
        cpu = find_cpu(thread);
1007 2e0f2cfb Andreas Färber
        if (cpu == NULL) {
1008 880a7578 aliguori
            put_packet(s, "E22");
1009 880a7578 aliguori
            break;
1010 880a7578 aliguori
        }
1011 880a7578 aliguori
        switch (type) {
1012 880a7578 aliguori
        case 'c':
1013 2e0f2cfb Andreas Färber
            s->c_cpu = cpu;
1014 880a7578 aliguori
            put_packet(s, "OK");
1015 880a7578 aliguori
            break;
1016 880a7578 aliguori
        case 'g':
1017 2e0f2cfb Andreas Färber
            s->g_cpu = cpu;
1018 880a7578 aliguori
            put_packet(s, "OK");
1019 880a7578 aliguori
            break;
1020 880a7578 aliguori
        default:
1021 880a7578 aliguori
             put_packet(s, "E22");
1022 880a7578 aliguori
             break;
1023 880a7578 aliguori
        }
1024 880a7578 aliguori
        break;
1025 880a7578 aliguori
    case 'T':
1026 880a7578 aliguori
        thread = strtoull(p, (char **)&p, 16);
1027 2e0f2cfb Andreas Färber
        cpu = find_cpu(thread);
1028 1e9fa730 Nathan Froyd
1029 2e0f2cfb Andreas Färber
        if (cpu != NULL) {
1030 1e9fa730 Nathan Froyd
            put_packet(s, "OK");
1031 1e9fa730 Nathan Froyd
        } else {
1032 880a7578 aliguori
            put_packet(s, "E22");
1033 1e9fa730 Nathan Froyd
        }
1034 880a7578 aliguori
        break;
1035 978efd6a pbrook
    case 'q':
1036 60897d36 edgar_igl
    case 'Q':
1037 60897d36 edgar_igl
        /* parse any 'q' packets here */
1038 60897d36 edgar_igl
        if (!strcmp(p,"qemu.sstepbits")) {
1039 60897d36 edgar_igl
            /* Query Breakpoint bit definitions */
1040 363a37d5 blueswir1
            snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1041 363a37d5 blueswir1
                     SSTEP_ENABLE,
1042 363a37d5 blueswir1
                     SSTEP_NOIRQ,
1043 363a37d5 blueswir1
                     SSTEP_NOTIMER);
1044 60897d36 edgar_igl
            put_packet(s, buf);
1045 60897d36 edgar_igl
            break;
1046 60897d36 edgar_igl
        } else if (strncmp(p,"qemu.sstep",10) == 0) {
1047 60897d36 edgar_igl
            /* Display or change the sstep_flags */
1048 60897d36 edgar_igl
            p += 10;
1049 60897d36 edgar_igl
            if (*p != '=') {
1050 60897d36 edgar_igl
                /* Display current setting */
1051 363a37d5 blueswir1
                snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
1052 60897d36 edgar_igl
                put_packet(s, buf);
1053 60897d36 edgar_igl
                break;
1054 60897d36 edgar_igl
            }
1055 60897d36 edgar_igl
            p++;
1056 60897d36 edgar_igl
            type = strtoul(p, (char **)&p, 16);
1057 60897d36 edgar_igl
            sstep_flags = type;
1058 60897d36 edgar_igl
            put_packet(s, "OK");
1059 60897d36 edgar_igl
            break;
1060 880a7578 aliguori
        } else if (strcmp(p,"C") == 0) {
1061 880a7578 aliguori
            /* "Current thread" remains vague in the spec, so always return
1062 880a7578 aliguori
             *  the first CPU (gdb returns the first thread). */
1063 880a7578 aliguori
            put_packet(s, "QC1");
1064 880a7578 aliguori
            break;
1065 880a7578 aliguori
        } else if (strcmp(p,"fThreadInfo") == 0) {
1066 52f34623 Andreas Färber
            s->query_cpu = first_cpu;
1067 880a7578 aliguori
            goto report_cpuinfo;
1068 880a7578 aliguori
        } else if (strcmp(p,"sThreadInfo") == 0) {
1069 880a7578 aliguori
        report_cpuinfo:
1070 880a7578 aliguori
            if (s->query_cpu) {
1071 52f34623 Andreas Färber
                snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
1072 880a7578 aliguori
                put_packet(s, buf);
1073 52f34623 Andreas Färber
                s->query_cpu = s->query_cpu->next_cpu;
1074 880a7578 aliguori
            } else
1075 880a7578 aliguori
                put_packet(s, "l");
1076 880a7578 aliguori
            break;
1077 880a7578 aliguori
        } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1078 880a7578 aliguori
            thread = strtoull(p+16, (char **)&p, 16);
1079 2e0f2cfb Andreas Färber
            cpu = find_cpu(thread);
1080 2e0f2cfb Andreas Färber
            if (cpu != NULL) {
1081 cb446eca Andreas Färber
                cpu_synchronize_state(cpu);
1082 1e9fa730 Nathan Froyd
                len = snprintf((char *)mem_buf, sizeof(mem_buf),
1083 55e5c285 Andreas Färber
                               "CPU#%d [%s]", cpu->cpu_index,
1084 259186a7 Andreas Färber
                               cpu->halted ? "halted " : "running");
1085 1e9fa730 Nathan Froyd
                memtohex(buf, mem_buf, len);
1086 1e9fa730 Nathan Froyd
                put_packet(s, buf);
1087 1e9fa730 Nathan Froyd
            }
1088 880a7578 aliguori
            break;
1089 60897d36 edgar_igl
        }
1090 0b8a988c blueswir1
#ifdef CONFIG_USER_ONLY
1091 60897d36 edgar_igl
        else if (strncmp(p, "Offsets", 7) == 0) {
1092 2e0f2cfb Andreas Färber
            CPUArchState *env = s->c_cpu->env_ptr;
1093 2e0f2cfb Andreas Färber
            TaskState *ts = env->opaque;
1094 978efd6a pbrook
1095 363a37d5 blueswir1
            snprintf(buf, sizeof(buf),
1096 363a37d5 blueswir1
                     "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1097 363a37d5 blueswir1
                     ";Bss=" TARGET_ABI_FMT_lx,
1098 363a37d5 blueswir1
                     ts->info->code_offset,
1099 363a37d5 blueswir1
                     ts->info->data_offset,
1100 363a37d5 blueswir1
                     ts->info->data_offset);
1101 978efd6a pbrook
            put_packet(s, buf);
1102 978efd6a pbrook
            break;
1103 978efd6a pbrook
        }
1104 0b8a988c blueswir1
#else /* !CONFIG_USER_ONLY */
1105 8a34a0fb aliguori
        else if (strncmp(p, "Rcmd,", 5) == 0) {
1106 8a34a0fb aliguori
            int len = strlen(p + 5);
1107 8a34a0fb aliguori
1108 8a34a0fb aliguori
            if ((len % 2) != 0) {
1109 8a34a0fb aliguori
                put_packet(s, "E01");
1110 8a34a0fb aliguori
                break;
1111 8a34a0fb aliguori
            }
1112 8a34a0fb aliguori
            hextomem(mem_buf, p + 5, len);
1113 8a34a0fb aliguori
            len = len / 2;
1114 8a34a0fb aliguori
            mem_buf[len++] = 0;
1115 fa5efccb Anthony Liguori
            qemu_chr_be_write(s->mon_chr, mem_buf, len);
1116 8a34a0fb aliguori
            put_packet(s, "OK");
1117 8a34a0fb aliguori
            break;
1118 8a34a0fb aliguori
        }
1119 0b8a988c blueswir1
#endif /* !CONFIG_USER_ONLY */
1120 56aebc89 pbrook
        if (strncmp(p, "Supported", 9) == 0) {
1121 5b3715bf blueswir1
            snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
1122 5b24c641 Andreas Färber
            cc = CPU_GET_CLASS(first_cpu);
1123 5b24c641 Andreas Färber
            if (cc->gdb_core_xml_file != NULL) {
1124 5b24c641 Andreas Färber
                pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
1125 5b24c641 Andreas Färber
            }
1126 56aebc89 pbrook
            put_packet(s, buf);
1127 56aebc89 pbrook
            break;
1128 56aebc89 pbrook
        }
1129 56aebc89 pbrook
        if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1130 56aebc89 pbrook
            const char *xml;
1131 56aebc89 pbrook
            target_ulong total_len;
1132 56aebc89 pbrook
1133 5b24c641 Andreas Färber
            cc = CPU_GET_CLASS(first_cpu);
1134 5b24c641 Andreas Färber
            if (cc->gdb_core_xml_file == NULL) {
1135 5b24c641 Andreas Färber
                goto unknown_command;
1136 5b24c641 Andreas Färber
            }
1137 5b24c641 Andreas Färber
1138 5b50e790 Andreas Färber
            gdb_has_xml = true;
1139 56aebc89 pbrook
            p += 19;
1140 5b24c641 Andreas Färber
            xml = get_feature_xml(p, &p, cc);
1141 56aebc89 pbrook
            if (!xml) {
1142 5b3715bf blueswir1
                snprintf(buf, sizeof(buf), "E00");
1143 56aebc89 pbrook
                put_packet(s, buf);
1144 56aebc89 pbrook
                break;
1145 56aebc89 pbrook
            }
1146 56aebc89 pbrook
1147 56aebc89 pbrook
            if (*p == ':')
1148 56aebc89 pbrook
                p++;
1149 56aebc89 pbrook
            addr = strtoul(p, (char **)&p, 16);
1150 56aebc89 pbrook
            if (*p == ',')
1151 56aebc89 pbrook
                p++;
1152 56aebc89 pbrook
            len = strtoul(p, (char **)&p, 16);
1153 56aebc89 pbrook
1154 56aebc89 pbrook
            total_len = strlen(xml);
1155 56aebc89 pbrook
            if (addr > total_len) {
1156 5b3715bf blueswir1
                snprintf(buf, sizeof(buf), "E00");
1157 56aebc89 pbrook
                put_packet(s, buf);
1158 56aebc89 pbrook
                break;
1159 56aebc89 pbrook
            }
1160 56aebc89 pbrook
            if (len > (MAX_PACKET_LENGTH - 5) / 2)
1161 56aebc89 pbrook
                len = (MAX_PACKET_LENGTH - 5) / 2;
1162 56aebc89 pbrook
            if (len < total_len - addr) {
1163 56aebc89 pbrook
                buf[0] = 'm';
1164 56aebc89 pbrook
                len = memtox(buf + 1, xml + addr, len);
1165 56aebc89 pbrook
            } else {
1166 56aebc89 pbrook
                buf[0] = 'l';
1167 56aebc89 pbrook
                len = memtox(buf + 1, xml + addr, total_len - addr);
1168 56aebc89 pbrook
            }
1169 56aebc89 pbrook
            put_packet_binary(s, buf, len + 1);
1170 56aebc89 pbrook
            break;
1171 56aebc89 pbrook
        }
1172 56aebc89 pbrook
        /* Unrecognised 'q' command.  */
1173 56aebc89 pbrook
        goto unknown_command;
1174 56aebc89 pbrook
1175 858693c6 bellard
    default:
1176 56aebc89 pbrook
    unknown_command:
1177 858693c6 bellard
        /* put empty packet */
1178 858693c6 bellard
        buf[0] = '\0';
1179 858693c6 bellard
        put_packet(s, buf);
1180 858693c6 bellard
        break;
1181 858693c6 bellard
    }
1182 858693c6 bellard
    return RS_IDLE;
1183 858693c6 bellard
}
1184 858693c6 bellard
1185 64f6b346 Andreas Färber
void gdb_set_stop_cpu(CPUState *cpu)
1186 880a7578 aliguori
{
1187 2e0f2cfb Andreas Färber
    gdbserver_state->c_cpu = cpu;
1188 2e0f2cfb Andreas Färber
    gdbserver_state->g_cpu = cpu;
1189 880a7578 aliguori
}
1190 880a7578 aliguori
1191 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
1192 1dfb4dd9 Luiz Capitulino
static void gdb_vm_state_change(void *opaque, int running, RunState state)
1193 858693c6 bellard
{
1194 880a7578 aliguori
    GDBState *s = gdbserver_state;
1195 2e0f2cfb Andreas Färber
    CPUArchState *env = s->c_cpu->env_ptr;
1196 2e0f2cfb Andreas Färber
    CPUState *cpu = s->c_cpu;
1197 858693c6 bellard
    char buf[256];
1198 d6fc1b39 aliguori
    const char *type;
1199 858693c6 bellard
    int ret;
1200 858693c6 bellard
1201 cdb432b2 Meador Inge
    if (running || s->state == RS_INACTIVE) {
1202 cdb432b2 Meador Inge
        return;
1203 cdb432b2 Meador Inge
    }
1204 cdb432b2 Meador Inge
    /* Is there a GDB syscall waiting to be sent?  */
1205 cdb432b2 Meador Inge
    if (s->current_syscall_cb) {
1206 cdb432b2 Meador Inge
        put_packet(s, s->syscall_buf);
1207 a2d1ebaf pbrook
        return;
1208 e07bbac5 Jan Kiszka
    }
1209 1dfb4dd9 Luiz Capitulino
    switch (state) {
1210 0461d5a6 Luiz Capitulino
    case RUN_STATE_DEBUG:
1211 880a7578 aliguori
        if (env->watchpoint_hit) {
1212 880a7578 aliguori
            switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
1213 a1d1bb31 aliguori
            case BP_MEM_READ:
1214 d6fc1b39 aliguori
                type = "r";
1215 d6fc1b39 aliguori
                break;
1216 a1d1bb31 aliguori
            case BP_MEM_ACCESS:
1217 d6fc1b39 aliguori
                type = "a";
1218 d6fc1b39 aliguori
                break;
1219 d6fc1b39 aliguori
            default:
1220 d6fc1b39 aliguori
                type = "";
1221 d6fc1b39 aliguori
                break;
1222 d6fc1b39 aliguori
            }
1223 880a7578 aliguori
            snprintf(buf, sizeof(buf),
1224 880a7578 aliguori
                     "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
1225 0d34282f Andreas Färber
                     GDB_SIGNAL_TRAP, cpu_index(cpu), type,
1226 880a7578 aliguori
                     env->watchpoint_hit->vaddr);
1227 880a7578 aliguori
            env->watchpoint_hit = NULL;
1228 425189a8 Jan Kiszka
            goto send_packet;
1229 6658ffb8 pbrook
        }
1230 425189a8 Jan Kiszka
        tb_flush(env);
1231 ca587a8e aurel32
        ret = GDB_SIGNAL_TRAP;
1232 425189a8 Jan Kiszka
        break;
1233 0461d5a6 Luiz Capitulino
    case RUN_STATE_PAUSED:
1234 9781e040 aliguori
        ret = GDB_SIGNAL_INT;
1235 425189a8 Jan Kiszka
        break;
1236 0461d5a6 Luiz Capitulino
    case RUN_STATE_SHUTDOWN:
1237 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_QUIT;
1238 425189a8 Jan Kiszka
        break;
1239 0461d5a6 Luiz Capitulino
    case RUN_STATE_IO_ERROR:
1240 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_IO;
1241 425189a8 Jan Kiszka
        break;
1242 0461d5a6 Luiz Capitulino
    case RUN_STATE_WATCHDOG:
1243 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_ALRM;
1244 425189a8 Jan Kiszka
        break;
1245 0461d5a6 Luiz Capitulino
    case RUN_STATE_INTERNAL_ERROR:
1246 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_ABRT;
1247 425189a8 Jan Kiszka
        break;
1248 0461d5a6 Luiz Capitulino
    case RUN_STATE_SAVE_VM:
1249 0461d5a6 Luiz Capitulino
    case RUN_STATE_RESTORE_VM:
1250 425189a8 Jan Kiszka
        return;
1251 0461d5a6 Luiz Capitulino
    case RUN_STATE_FINISH_MIGRATE:
1252 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_XCPU;
1253 425189a8 Jan Kiszka
        break;
1254 425189a8 Jan Kiszka
    default:
1255 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_UNKNOWN;
1256 425189a8 Jan Kiszka
        break;
1257 bbeb7b5c bellard
    }
1258 0d34282f Andreas Färber
    snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
1259 425189a8 Jan Kiszka
1260 425189a8 Jan Kiszka
send_packet:
1261 858693c6 bellard
    put_packet(s, buf);
1262 425189a8 Jan Kiszka
1263 425189a8 Jan Kiszka
    /* disable single step if it was enabled */
1264 3825b28f Andreas Färber
    cpu_single_step(cpu, 0);
1265 858693c6 bellard
}
1266 1fddef4b bellard
#endif
1267 858693c6 bellard
1268 a2d1ebaf pbrook
/* Send a gdb syscall request.
1269 a2d1ebaf pbrook
   This accepts limited printf-style format specifiers, specifically:
1270 a87295e8 pbrook
    %x  - target_ulong argument printed in hex.
1271 a87295e8 pbrook
    %lx - 64-bit argument printed in hex.
1272 a87295e8 pbrook
    %s  - string pointer (target_ulong) and length (int) pair.  */
1273 7ccfb2eb blueswir1
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
1274 a2d1ebaf pbrook
{
1275 a2d1ebaf pbrook
    va_list va;
1276 a2d1ebaf pbrook
    char *p;
1277 cdb432b2 Meador Inge
    char *p_end;
1278 a2d1ebaf pbrook
    target_ulong addr;
1279 a87295e8 pbrook
    uint64_t i64;
1280 a2d1ebaf pbrook
    GDBState *s;
1281 a2d1ebaf pbrook
1282 880a7578 aliguori
    s = gdbserver_state;
1283 a2d1ebaf pbrook
    if (!s)
1284 a2d1ebaf pbrook
        return;
1285 cdb432b2 Meador Inge
    s->current_syscall_cb = cb;
1286 a2d1ebaf pbrook
#ifndef CONFIG_USER_ONLY
1287 0461d5a6 Luiz Capitulino
    vm_stop(RUN_STATE_DEBUG);
1288 a2d1ebaf pbrook
#endif
1289 a2d1ebaf pbrook
    va_start(va, fmt);
1290 cdb432b2 Meador Inge
    p = s->syscall_buf;
1291 cdb432b2 Meador Inge
    p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
1292 a2d1ebaf pbrook
    *(p++) = 'F';
1293 a2d1ebaf pbrook
    while (*fmt) {
1294 a2d1ebaf pbrook
        if (*fmt == '%') {
1295 a2d1ebaf pbrook
            fmt++;
1296 a2d1ebaf pbrook
            switch (*fmt++) {
1297 a2d1ebaf pbrook
            case 'x':
1298 a2d1ebaf pbrook
                addr = va_arg(va, target_ulong);
1299 cdb432b2 Meador Inge
                p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
1300 a2d1ebaf pbrook
                break;
1301 a87295e8 pbrook
            case 'l':
1302 a87295e8 pbrook
                if (*(fmt++) != 'x')
1303 a87295e8 pbrook
                    goto bad_format;
1304 a87295e8 pbrook
                i64 = va_arg(va, uint64_t);
1305 cdb432b2 Meador Inge
                p += snprintf(p, p_end - p, "%" PRIx64, i64);
1306 a87295e8 pbrook
                break;
1307 a2d1ebaf pbrook
            case 's':
1308 a2d1ebaf pbrook
                addr = va_arg(va, target_ulong);
1309 cdb432b2 Meador Inge
                p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
1310 363a37d5 blueswir1
                              addr, va_arg(va, int));
1311 a2d1ebaf pbrook
                break;
1312 a2d1ebaf pbrook
            default:
1313 a87295e8 pbrook
            bad_format:
1314 a2d1ebaf pbrook
                fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1315 a2d1ebaf pbrook
                        fmt - 1);
1316 a2d1ebaf pbrook
                break;
1317 a2d1ebaf pbrook
            }
1318 a2d1ebaf pbrook
        } else {
1319 a2d1ebaf pbrook
            *(p++) = *(fmt++);
1320 a2d1ebaf pbrook
        }
1321 a2d1ebaf pbrook
    }
1322 8a93e02a pbrook
    *p = 0;
1323 a2d1ebaf pbrook
    va_end(va);
1324 a2d1ebaf pbrook
#ifdef CONFIG_USER_ONLY
1325 cdb432b2 Meador Inge
    put_packet(s, s->syscall_buf);
1326 2e0f2cfb Andreas Färber
    gdb_handlesig(s->c_cpu, 0);
1327 a2d1ebaf pbrook
#else
1328 cdb432b2 Meador Inge
    /* In this case wait to send the syscall packet until notification that
1329 cdb432b2 Meador Inge
       the CPU has stopped.  This must be done because if the packet is sent
1330 cdb432b2 Meador Inge
       now the reply from the syscall request could be received while the CPU
1331 cdb432b2 Meador Inge
       is still in the running state, which can cause packets to be dropped
1332 cdb432b2 Meador Inge
       and state transition 'T' packets to be sent while the syscall is still
1333 cdb432b2 Meador Inge
       being processed.  */
1334 2e0f2cfb Andreas Färber
    cpu_exit(s->c_cpu);
1335 a2d1ebaf pbrook
#endif
1336 a2d1ebaf pbrook
}
1337 a2d1ebaf pbrook
1338 6a00d601 bellard
static void gdb_read_byte(GDBState *s, int ch)
1339 858693c6 bellard
{
1340 858693c6 bellard
    int i, csum;
1341 60fe76f3 ths
    uint8_t reply;
1342 858693c6 bellard
1343 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
1344 4046d913 pbrook
    if (s->last_packet_len) {
1345 4046d913 pbrook
        /* Waiting for a response to the last packet.  If we see the start
1346 4046d913 pbrook
           of a new command then abandon the previous response.  */
1347 4046d913 pbrook
        if (ch == '-') {
1348 4046d913 pbrook
#ifdef DEBUG_GDB
1349 4046d913 pbrook
            printf("Got NACK, retransmitting\n");
1350 4046d913 pbrook
#endif
1351 ffe8ab83 ths
            put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
1352 4046d913 pbrook
        }
1353 4046d913 pbrook
#ifdef DEBUG_GDB
1354 4046d913 pbrook
        else if (ch == '+')
1355 4046d913 pbrook
            printf("Got ACK\n");
1356 4046d913 pbrook
        else
1357 4046d913 pbrook
            printf("Got '%c' when expecting ACK/NACK\n", ch);
1358 4046d913 pbrook
#endif
1359 4046d913 pbrook
        if (ch == '+' || ch == '$')
1360 4046d913 pbrook
            s->last_packet_len = 0;
1361 4046d913 pbrook
        if (ch != '$')
1362 4046d913 pbrook
            return;
1363 4046d913 pbrook
    }
1364 1354869c Luiz Capitulino
    if (runstate_is_running()) {
1365 858693c6 bellard
        /* when the CPU is running, we cannot do anything except stop
1366 858693c6 bellard
           it when receiving a char */
1367 0461d5a6 Luiz Capitulino
        vm_stop(RUN_STATE_PAUSED);
1368 5fafdf24 ths
    } else
1369 1fddef4b bellard
#endif
1370 41625033 bellard
    {
1371 858693c6 bellard
        switch(s->state) {
1372 858693c6 bellard
        case RS_IDLE:
1373 858693c6 bellard
            if (ch == '$') {
1374 858693c6 bellard
                s->line_buf_index = 0;
1375 858693c6 bellard
                s->state = RS_GETLINE;
1376 c33a346e bellard
            }
1377 b4608c04 bellard
            break;
1378 858693c6 bellard
        case RS_GETLINE:
1379 858693c6 bellard
            if (ch == '#') {
1380 858693c6 bellard
            s->state = RS_CHKSUM1;
1381 858693c6 bellard
            } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
1382 858693c6 bellard
                s->state = RS_IDLE;
1383 4c3a88a2 bellard
            } else {
1384 858693c6 bellard
            s->line_buf[s->line_buf_index++] = ch;
1385 4c3a88a2 bellard
            }
1386 4c3a88a2 bellard
            break;
1387 858693c6 bellard
        case RS_CHKSUM1:
1388 858693c6 bellard
            s->line_buf[s->line_buf_index] = '\0';
1389 858693c6 bellard
            s->line_csum = fromhex(ch) << 4;
1390 858693c6 bellard
            s->state = RS_CHKSUM2;
1391 858693c6 bellard
            break;
1392 858693c6 bellard
        case RS_CHKSUM2:
1393 858693c6 bellard
            s->line_csum |= fromhex(ch);
1394 858693c6 bellard
            csum = 0;
1395 858693c6 bellard
            for(i = 0; i < s->line_buf_index; i++) {
1396 858693c6 bellard
                csum += s->line_buf[i];
1397 858693c6 bellard
            }
1398 858693c6 bellard
            if (s->line_csum != (csum & 0xff)) {
1399 60fe76f3 ths
                reply = '-';
1400 60fe76f3 ths
                put_buffer(s, &reply, 1);
1401 858693c6 bellard
                s->state = RS_IDLE;
1402 4c3a88a2 bellard
            } else {
1403 60fe76f3 ths
                reply = '+';
1404 60fe76f3 ths
                put_buffer(s, &reply, 1);
1405 880a7578 aliguori
                s->state = gdb_handle_packet(s, s->line_buf);
1406 4c3a88a2 bellard
            }
1407 4c3a88a2 bellard
            break;
1408 a2d1ebaf pbrook
        default:
1409 a2d1ebaf pbrook
            abort();
1410 858693c6 bellard
        }
1411 858693c6 bellard
    }
1412 858693c6 bellard
}
1413 858693c6 bellard
1414 0e1c9c54 Paul Brook
/* Tell the remote gdb that the process has exited.  */
1415 9349b4f9 Andreas Färber
void gdb_exit(CPUArchState *env, int code)
1416 0e1c9c54 Paul Brook
{
1417 0e1c9c54 Paul Brook
  GDBState *s;
1418 0e1c9c54 Paul Brook
  char buf[4];
1419 0e1c9c54 Paul Brook
1420 0e1c9c54 Paul Brook
  s = gdbserver_state;
1421 0e1c9c54 Paul Brook
  if (!s) {
1422 0e1c9c54 Paul Brook
      return;
1423 0e1c9c54 Paul Brook
  }
1424 0e1c9c54 Paul Brook
#ifdef CONFIG_USER_ONLY
1425 0e1c9c54 Paul Brook
  if (gdbserver_fd < 0 || s->fd < 0) {
1426 0e1c9c54 Paul Brook
      return;
1427 0e1c9c54 Paul Brook
  }
1428 0e1c9c54 Paul Brook
#endif
1429 0e1c9c54 Paul Brook
1430 0e1c9c54 Paul Brook
  snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
1431 0e1c9c54 Paul Brook
  put_packet(s, buf);
1432 e2af15b2 Fabien Chouteau
1433 e2af15b2 Fabien Chouteau
#ifndef CONFIG_USER_ONLY
1434 e2af15b2 Fabien Chouteau
  if (s->chr) {
1435 70f24fb6 Anthony Liguori
      qemu_chr_delete(s->chr);
1436 e2af15b2 Fabien Chouteau
  }
1437 e2af15b2 Fabien Chouteau
#endif
1438 0e1c9c54 Paul Brook
}
1439 0e1c9c54 Paul Brook
1440 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
1441 1fddef4b bellard
int
1442 ca587a8e aurel32
gdb_queuesig (void)
1443 ca587a8e aurel32
{
1444 ca587a8e aurel32
    GDBState *s;
1445 ca587a8e aurel32
1446 ca587a8e aurel32
    s = gdbserver_state;
1447 ca587a8e aurel32
1448 ca587a8e aurel32
    if (gdbserver_fd < 0 || s->fd < 0)
1449 ca587a8e aurel32
        return 0;
1450 ca587a8e aurel32
    else
1451 ca587a8e aurel32
        return 1;
1452 ca587a8e aurel32
}
1453 ca587a8e aurel32
1454 ca587a8e aurel32
int
1455 db6b81d4 Andreas Färber
gdb_handlesig(CPUState *cpu, int sig)
1456 1fddef4b bellard
{
1457 db6b81d4 Andreas Färber
    CPUArchState *env = cpu->env_ptr;
1458 5ca666c7 Andreas Färber
    GDBState *s;
1459 5ca666c7 Andreas Färber
    char buf[256];
1460 5ca666c7 Andreas Färber
    int n;
1461 1fddef4b bellard
1462 5ca666c7 Andreas Färber
    s = gdbserver_state;
1463 5ca666c7 Andreas Färber
    if (gdbserver_fd < 0 || s->fd < 0) {
1464 5ca666c7 Andreas Färber
        return sig;
1465 5ca666c7 Andreas Färber
    }
1466 1fddef4b bellard
1467 5ca666c7 Andreas Färber
    /* disable single step if it was enabled */
1468 3825b28f Andreas Färber
    cpu_single_step(cpu, 0);
1469 5ca666c7 Andreas Färber
    tb_flush(env);
1470 1fddef4b bellard
1471 5ca666c7 Andreas Färber
    if (sig != 0) {
1472 5ca666c7 Andreas Färber
        snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig));
1473 5ca666c7 Andreas Färber
        put_packet(s, buf);
1474 5ca666c7 Andreas Färber
    }
1475 5ca666c7 Andreas Färber
    /* put_packet() might have detected that the peer terminated the
1476 5ca666c7 Andreas Färber
       connection.  */
1477 5ca666c7 Andreas Färber
    if (s->fd < 0) {
1478 5ca666c7 Andreas Färber
        return sig;
1479 5ca666c7 Andreas Färber
    }
1480 1fddef4b bellard
1481 5ca666c7 Andreas Färber
    sig = 0;
1482 5ca666c7 Andreas Färber
    s->state = RS_IDLE;
1483 5ca666c7 Andreas Färber
    s->running_state = 0;
1484 5ca666c7 Andreas Färber
    while (s->running_state == 0) {
1485 5ca666c7 Andreas Färber
        n = read(s->fd, buf, 256);
1486 5ca666c7 Andreas Färber
        if (n > 0) {
1487 5ca666c7 Andreas Färber
            int i;
1488 5ca666c7 Andreas Färber
1489 5ca666c7 Andreas Färber
            for (i = 0; i < n; i++) {
1490 5ca666c7 Andreas Färber
                gdb_read_byte(s, buf[i]);
1491 5ca666c7 Andreas Färber
            }
1492 5ca666c7 Andreas Färber
        } else if (n == 0 || errno != EAGAIN) {
1493 5ca666c7 Andreas Färber
            /* XXX: Connection closed.  Should probably wait for another
1494 5ca666c7 Andreas Färber
               connection before continuing.  */
1495 5ca666c7 Andreas Färber
            return sig;
1496 1fddef4b bellard
        }
1497 5ca666c7 Andreas Färber
    }
1498 5ca666c7 Andreas Färber
    sig = s->signal;
1499 5ca666c7 Andreas Färber
    s->signal = 0;
1500 5ca666c7 Andreas Färber
    return sig;
1501 1fddef4b bellard
}
1502 e9009676 bellard
1503 ca587a8e aurel32
/* Tell the remote gdb that the process has exited due to SIG.  */
1504 9349b4f9 Andreas Färber
void gdb_signalled(CPUArchState *env, int sig)
1505 ca587a8e aurel32
{
1506 5ca666c7 Andreas Färber
    GDBState *s;
1507 5ca666c7 Andreas Färber
    char buf[4];
1508 ca587a8e aurel32
1509 5ca666c7 Andreas Färber
    s = gdbserver_state;
1510 5ca666c7 Andreas Färber
    if (gdbserver_fd < 0 || s->fd < 0) {
1511 5ca666c7 Andreas Färber
        return;
1512 5ca666c7 Andreas Färber
    }
1513 ca587a8e aurel32
1514 5ca666c7 Andreas Färber
    snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
1515 5ca666c7 Andreas Färber
    put_packet(s, buf);
1516 ca587a8e aurel32
}
1517 1fddef4b bellard
1518 880a7578 aliguori
static void gdb_accept(void)
1519 858693c6 bellard
{
1520 858693c6 bellard
    GDBState *s;
1521 858693c6 bellard
    struct sockaddr_in sockaddr;
1522 858693c6 bellard
    socklen_t len;
1523 bf1c852a MORITA Kazutaka
    int fd;
1524 858693c6 bellard
1525 858693c6 bellard
    for(;;) {
1526 858693c6 bellard
        len = sizeof(sockaddr);
1527 858693c6 bellard
        fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
1528 858693c6 bellard
        if (fd < 0 && errno != EINTR) {
1529 858693c6 bellard
            perror("accept");
1530 858693c6 bellard
            return;
1531 858693c6 bellard
        } else if (fd >= 0) {
1532 40ff6d7e Kevin Wolf
#ifndef _WIN32
1533 40ff6d7e Kevin Wolf
            fcntl(fd, F_SETFD, FD_CLOEXEC);
1534 40ff6d7e Kevin Wolf
#endif
1535 b4608c04 bellard
            break;
1536 b4608c04 bellard
        }
1537 b4608c04 bellard
    }
1538 858693c6 bellard
1539 858693c6 bellard
    /* set short latency */
1540 bf1c852a MORITA Kazutaka
    socket_set_nodelay(fd);
1541 3b46e624 ths
1542 7267c094 Anthony Liguori
    s = g_malloc0(sizeof(GDBState));
1543 2e0f2cfb Andreas Färber
    s->c_cpu = first_cpu;
1544 2e0f2cfb Andreas Färber
    s->g_cpu = first_cpu;
1545 858693c6 bellard
    s->fd = fd;
1546 5b50e790 Andreas Färber
    gdb_has_xml = false;
1547 858693c6 bellard
1548 880a7578 aliguori
    gdbserver_state = s;
1549 a2d1ebaf pbrook
1550 858693c6 bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
1551 858693c6 bellard
}
1552 858693c6 bellard
1553 858693c6 bellard
static int gdbserver_open(int port)
1554 858693c6 bellard
{
1555 858693c6 bellard
    struct sockaddr_in sockaddr;
1556 858693c6 bellard
    int fd, val, ret;
1557 858693c6 bellard
1558 858693c6 bellard
    fd = socket(PF_INET, SOCK_STREAM, 0);
1559 858693c6 bellard
    if (fd < 0) {
1560 858693c6 bellard
        perror("socket");
1561 858693c6 bellard
        return -1;
1562 858693c6 bellard
    }
1563 40ff6d7e Kevin Wolf
#ifndef _WIN32
1564 40ff6d7e Kevin Wolf
    fcntl(fd, F_SETFD, FD_CLOEXEC);
1565 40ff6d7e Kevin Wolf
#endif
1566 858693c6 bellard
1567 858693c6 bellard
    /* allow fast reuse */
1568 858693c6 bellard
    val = 1;
1569 9957fc7f Stefan Weil
    qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
1570 858693c6 bellard
1571 858693c6 bellard
    sockaddr.sin_family = AF_INET;
1572 858693c6 bellard
    sockaddr.sin_port = htons(port);
1573 858693c6 bellard
    sockaddr.sin_addr.s_addr = 0;
1574 858693c6 bellard
    ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
1575 858693c6 bellard
    if (ret < 0) {
1576 858693c6 bellard
        perror("bind");
1577 bb16172c Peter Maydell
        close(fd);
1578 858693c6 bellard
        return -1;
1579 858693c6 bellard
    }
1580 858693c6 bellard
    ret = listen(fd, 0);
1581 858693c6 bellard
    if (ret < 0) {
1582 858693c6 bellard
        perror("listen");
1583 bb16172c Peter Maydell
        close(fd);
1584 858693c6 bellard
        return -1;
1585 858693c6 bellard
    }
1586 858693c6 bellard
    return fd;
1587 858693c6 bellard
}
1588 858693c6 bellard
1589 858693c6 bellard
int gdbserver_start(int port)
1590 858693c6 bellard
{
1591 858693c6 bellard
    gdbserver_fd = gdbserver_open(port);
1592 858693c6 bellard
    if (gdbserver_fd < 0)
1593 858693c6 bellard
        return -1;
1594 858693c6 bellard
    /* accept connections */
1595 880a7578 aliguori
    gdb_accept();
1596 4046d913 pbrook
    return 0;
1597 4046d913 pbrook
}
1598 2b1319c8 aurel32
1599 2b1319c8 aurel32
/* Disable gdb stub for child processes.  */
1600 9349b4f9 Andreas Färber
void gdbserver_fork(CPUArchState *env)
1601 2b1319c8 aurel32
{
1602 2b1319c8 aurel32
    GDBState *s = gdbserver_state;
1603 9f6164d6 edgar_igl
    if (gdbserver_fd < 0 || s->fd < 0)
1604 2b1319c8 aurel32
      return;
1605 2b1319c8 aurel32
    close(s->fd);
1606 2b1319c8 aurel32
    s->fd = -1;
1607 2b1319c8 aurel32
    cpu_breakpoint_remove_all(env, BP_GDB);
1608 2b1319c8 aurel32
    cpu_watchpoint_remove_all(env, BP_GDB);
1609 2b1319c8 aurel32
}
1610 1fddef4b bellard
#else
1611 aa1f17c1 ths
static int gdb_chr_can_receive(void *opaque)
1612 4046d913 pbrook
{
1613 56aebc89 pbrook
  /* We can handle an arbitrarily large amount of data.
1614 56aebc89 pbrook
   Pick the maximum packet size, which is as good as anything.  */
1615 56aebc89 pbrook
  return MAX_PACKET_LENGTH;
1616 4046d913 pbrook
}
1617 4046d913 pbrook
1618 aa1f17c1 ths
static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
1619 4046d913 pbrook
{
1620 4046d913 pbrook
    int i;
1621 4046d913 pbrook
1622 4046d913 pbrook
    for (i = 0; i < size; i++) {
1623 880a7578 aliguori
        gdb_read_byte(gdbserver_state, buf[i]);
1624 4046d913 pbrook
    }
1625 4046d913 pbrook
}
1626 4046d913 pbrook
1627 4046d913 pbrook
static void gdb_chr_event(void *opaque, int event)
1628 4046d913 pbrook
{
1629 4046d913 pbrook
    switch (event) {
1630 b6b8df56 Amit Shah
    case CHR_EVENT_OPENED:
1631 0461d5a6 Luiz Capitulino
        vm_stop(RUN_STATE_PAUSED);
1632 5b50e790 Andreas Färber
        gdb_has_xml = false;
1633 4046d913 pbrook
        break;
1634 4046d913 pbrook
    default:
1635 4046d913 pbrook
        break;
1636 4046d913 pbrook
    }
1637 4046d913 pbrook
}
1638 4046d913 pbrook
1639 8a34a0fb aliguori
static void gdb_monitor_output(GDBState *s, const char *msg, int len)
1640 8a34a0fb aliguori
{
1641 8a34a0fb aliguori
    char buf[MAX_PACKET_LENGTH];
1642 8a34a0fb aliguori
1643 8a34a0fb aliguori
    buf[0] = 'O';
1644 8a34a0fb aliguori
    if (len > (MAX_PACKET_LENGTH/2) - 1)
1645 8a34a0fb aliguori
        len = (MAX_PACKET_LENGTH/2) - 1;
1646 8a34a0fb aliguori
    memtohex(buf + 1, (uint8_t *)msg, len);
1647 8a34a0fb aliguori
    put_packet(s, buf);
1648 8a34a0fb aliguori
}
1649 8a34a0fb aliguori
1650 8a34a0fb aliguori
static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
1651 8a34a0fb aliguori
{
1652 8a34a0fb aliguori
    const char *p = (const char *)buf;
1653 8a34a0fb aliguori
    int max_sz;
1654 8a34a0fb aliguori
1655 8a34a0fb aliguori
    max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
1656 8a34a0fb aliguori
    for (;;) {
1657 8a34a0fb aliguori
        if (len <= max_sz) {
1658 8a34a0fb aliguori
            gdb_monitor_output(gdbserver_state, p, len);
1659 8a34a0fb aliguori
            break;
1660 8a34a0fb aliguori
        }
1661 8a34a0fb aliguori
        gdb_monitor_output(gdbserver_state, p, max_sz);
1662 8a34a0fb aliguori
        p += max_sz;
1663 8a34a0fb aliguori
        len -= max_sz;
1664 8a34a0fb aliguori
    }
1665 8a34a0fb aliguori
    return len;
1666 8a34a0fb aliguori
}
1667 8a34a0fb aliguori
1668 59030a8c aliguori
#ifndef _WIN32
1669 59030a8c aliguori
static void gdb_sigterm_handler(int signal)
1670 59030a8c aliguori
{
1671 1354869c Luiz Capitulino
    if (runstate_is_running()) {
1672 0461d5a6 Luiz Capitulino
        vm_stop(RUN_STATE_PAUSED);
1673 e07bbac5 Jan Kiszka
    }
1674 59030a8c aliguori
}
1675 59030a8c aliguori
#endif
1676 59030a8c aliguori
1677 59030a8c aliguori
int gdbserver_start(const char *device)
1678 4046d913 pbrook
{
1679 4046d913 pbrook
    GDBState *s;
1680 59030a8c aliguori
    char gdbstub_device_name[128];
1681 36556b20 aliguori
    CharDriverState *chr = NULL;
1682 36556b20 aliguori
    CharDriverState *mon_chr;
1683 cfc3475a pbrook
1684 59030a8c aliguori
    if (!device)
1685 59030a8c aliguori
        return -1;
1686 59030a8c aliguori
    if (strcmp(device, "none") != 0) {
1687 59030a8c aliguori
        if (strstart(device, "tcp:", NULL)) {
1688 59030a8c aliguori
            /* enforce required TCP attributes */
1689 59030a8c aliguori
            snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
1690 59030a8c aliguori
                     "%s,nowait,nodelay,server", device);
1691 59030a8c aliguori
            device = gdbstub_device_name;
1692 36556b20 aliguori
        }
1693 59030a8c aliguori
#ifndef _WIN32
1694 59030a8c aliguori
        else if (strcmp(device, "stdio") == 0) {
1695 59030a8c aliguori
            struct sigaction act;
1696 4046d913 pbrook
1697 59030a8c aliguori
            memset(&act, 0, sizeof(act));
1698 59030a8c aliguori
            act.sa_handler = gdb_sigterm_handler;
1699 59030a8c aliguori
            sigaction(SIGINT, &act, NULL);
1700 59030a8c aliguori
        }
1701 59030a8c aliguori
#endif
1702 27143a44 Anthony Liguori
        chr = qemu_chr_new("gdb", device, NULL);
1703 36556b20 aliguori
        if (!chr)
1704 36556b20 aliguori
            return -1;
1705 36556b20 aliguori
1706 456d6069 Hans de Goede
        qemu_chr_fe_claim_no_fail(chr);
1707 36556b20 aliguori
        qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
1708 36556b20 aliguori
                              gdb_chr_event, NULL);
1709 cfc3475a pbrook
    }
1710 cfc3475a pbrook
1711 36556b20 aliguori
    s = gdbserver_state;
1712 36556b20 aliguori
    if (!s) {
1713 7267c094 Anthony Liguori
        s = g_malloc0(sizeof(GDBState));
1714 36556b20 aliguori
        gdbserver_state = s;
1715 4046d913 pbrook
1716 36556b20 aliguori
        qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
1717 36556b20 aliguori
1718 36556b20 aliguori
        /* Initialize a monitor terminal for gdb */
1719 7267c094 Anthony Liguori
        mon_chr = g_malloc0(sizeof(*mon_chr));
1720 36556b20 aliguori
        mon_chr->chr_write = gdb_monitor_write;
1721 36556b20 aliguori
        monitor_init(mon_chr, 0);
1722 36556b20 aliguori
    } else {
1723 36556b20 aliguori
        if (s->chr)
1724 70f24fb6 Anthony Liguori
            qemu_chr_delete(s->chr);
1725 36556b20 aliguori
        mon_chr = s->mon_chr;
1726 36556b20 aliguori
        memset(s, 0, sizeof(GDBState));
1727 36556b20 aliguori
    }
1728 2e0f2cfb Andreas Färber
    s->c_cpu = first_cpu;
1729 2e0f2cfb Andreas Färber
    s->g_cpu = first_cpu;
1730 4046d913 pbrook
    s->chr = chr;
1731 36556b20 aliguori
    s->state = chr ? RS_IDLE : RS_INACTIVE;
1732 36556b20 aliguori
    s->mon_chr = mon_chr;
1733 cdb432b2 Meador Inge
    s->current_syscall_cb = NULL;
1734 8a34a0fb aliguori
1735 b4608c04 bellard
    return 0;
1736 b4608c04 bellard
}
1737 4046d913 pbrook
#endif