Statistics
| Branch: | Revision:

root / gdbstub.c @ 2c277908

History | View | Annotate | Download (57.3 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 b4608c04 bellard
 * License along with this library; if not, write to the Free Software
18 fad6cb1a aurel32
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
19 b4608c04 bellard
 */
20 978efd6a pbrook
#include "config.h"
21 56aebc89 pbrook
#include "qemu-common.h"
22 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
23 1fddef4b bellard
#include <stdlib.h>
24 1fddef4b bellard
#include <stdio.h>
25 1fddef4b bellard
#include <stdarg.h>
26 1fddef4b bellard
#include <string.h>
27 1fddef4b bellard
#include <errno.h>
28 1fddef4b bellard
#include <unistd.h>
29 978efd6a pbrook
#include <fcntl.h>
30 1fddef4b bellard
31 1fddef4b bellard
#include "qemu.h"
32 1fddef4b bellard
#else
33 87ecb68b pbrook
#include "qemu-char.h"
34 87ecb68b pbrook
#include "sysemu.h"
35 87ecb68b pbrook
#include "gdbstub.h"
36 1fddef4b bellard
#endif
37 67b915a5 bellard
38 56aebc89 pbrook
#define MAX_PACKET_LENGTH 4096
39 56aebc89 pbrook
40 8f447cc7 bellard
#include "qemu_socket.h"
41 ca587a8e aurel32
42 ca587a8e aurel32
43 ca587a8e aurel32
enum {
44 ca587a8e aurel32
    GDB_SIGNAL_0 = 0,
45 ca587a8e aurel32
    GDB_SIGNAL_INT = 2,
46 ca587a8e aurel32
    GDB_SIGNAL_TRAP = 5,
47 ca587a8e aurel32
    GDB_SIGNAL_UNKNOWN = 143
48 ca587a8e aurel32
};
49 ca587a8e aurel32
50 ca587a8e aurel32
#ifdef CONFIG_USER_ONLY
51 ca587a8e aurel32
52 ca587a8e aurel32
/* Map target signal numbers to GDB protocol signal numbers and vice
53 ca587a8e aurel32
 * versa.  For user emulation's currently supported systems, we can
54 ca587a8e aurel32
 * assume most signals are defined.
55 ca587a8e aurel32
 */
56 ca587a8e aurel32
57 ca587a8e aurel32
static int gdb_signal_table[] = {
58 ca587a8e aurel32
    0,
59 ca587a8e aurel32
    TARGET_SIGHUP,
60 ca587a8e aurel32
    TARGET_SIGINT,
61 ca587a8e aurel32
    TARGET_SIGQUIT,
62 ca587a8e aurel32
    TARGET_SIGILL,
63 ca587a8e aurel32
    TARGET_SIGTRAP,
64 ca587a8e aurel32
    TARGET_SIGABRT,
65 ca587a8e aurel32
    -1, /* SIGEMT */
66 ca587a8e aurel32
    TARGET_SIGFPE,
67 ca587a8e aurel32
    TARGET_SIGKILL,
68 ca587a8e aurel32
    TARGET_SIGBUS,
69 ca587a8e aurel32
    TARGET_SIGSEGV,
70 ca587a8e aurel32
    TARGET_SIGSYS,
71 ca587a8e aurel32
    TARGET_SIGPIPE,
72 ca587a8e aurel32
    TARGET_SIGALRM,
73 ca587a8e aurel32
    TARGET_SIGTERM,
74 ca587a8e aurel32
    TARGET_SIGURG,
75 ca587a8e aurel32
    TARGET_SIGSTOP,
76 ca587a8e aurel32
    TARGET_SIGTSTP,
77 ca587a8e aurel32
    TARGET_SIGCONT,
78 ca587a8e aurel32
    TARGET_SIGCHLD,
79 ca587a8e aurel32
    TARGET_SIGTTIN,
80 ca587a8e aurel32
    TARGET_SIGTTOU,
81 ca587a8e aurel32
    TARGET_SIGIO,
82 ca587a8e aurel32
    TARGET_SIGXCPU,
83 ca587a8e aurel32
    TARGET_SIGXFSZ,
84 ca587a8e aurel32
    TARGET_SIGVTALRM,
85 ca587a8e aurel32
    TARGET_SIGPROF,
86 ca587a8e aurel32
    TARGET_SIGWINCH,
87 ca587a8e aurel32
    -1, /* SIGLOST */
88 ca587a8e aurel32
    TARGET_SIGUSR1,
89 ca587a8e aurel32
    TARGET_SIGUSR2,
90 ca587a8e aurel32
    TARGET_SIGPWR,
91 ca587a8e aurel32
    -1, /* SIGPOLL */
92 ca587a8e aurel32
    -1,
93 ca587a8e aurel32
    -1,
94 ca587a8e aurel32
    -1,
95 ca587a8e aurel32
    -1,
96 ca587a8e aurel32
    -1,
97 ca587a8e aurel32
    -1,
98 ca587a8e aurel32
    -1,
99 ca587a8e aurel32
    -1,
100 ca587a8e aurel32
    -1,
101 ca587a8e aurel32
    -1,
102 ca587a8e aurel32
    -1,
103 ca587a8e aurel32
    __SIGRTMIN + 1,
104 ca587a8e aurel32
    __SIGRTMIN + 2,
105 ca587a8e aurel32
    __SIGRTMIN + 3,
106 ca587a8e aurel32
    __SIGRTMIN + 4,
107 ca587a8e aurel32
    __SIGRTMIN + 5,
108 ca587a8e aurel32
    __SIGRTMIN + 6,
109 ca587a8e aurel32
    __SIGRTMIN + 7,
110 ca587a8e aurel32
    __SIGRTMIN + 8,
111 ca587a8e aurel32
    __SIGRTMIN + 9,
112 ca587a8e aurel32
    __SIGRTMIN + 10,
113 ca587a8e aurel32
    __SIGRTMIN + 11,
114 ca587a8e aurel32
    __SIGRTMIN + 12,
115 ca587a8e aurel32
    __SIGRTMIN + 13,
116 ca587a8e aurel32
    __SIGRTMIN + 14,
117 ca587a8e aurel32
    __SIGRTMIN + 15,
118 ca587a8e aurel32
    __SIGRTMIN + 16,
119 ca587a8e aurel32
    __SIGRTMIN + 17,
120 ca587a8e aurel32
    __SIGRTMIN + 18,
121 ca587a8e aurel32
    __SIGRTMIN + 19,
122 ca587a8e aurel32
    __SIGRTMIN + 20,
123 ca587a8e aurel32
    __SIGRTMIN + 21,
124 ca587a8e aurel32
    __SIGRTMIN + 22,
125 ca587a8e aurel32
    __SIGRTMIN + 23,
126 ca587a8e aurel32
    __SIGRTMIN + 24,
127 ca587a8e aurel32
    __SIGRTMIN + 25,
128 ca587a8e aurel32
    __SIGRTMIN + 26,
129 ca587a8e aurel32
    __SIGRTMIN + 27,
130 ca587a8e aurel32
    __SIGRTMIN + 28,
131 ca587a8e aurel32
    __SIGRTMIN + 29,
132 ca587a8e aurel32
    __SIGRTMIN + 30,
133 ca587a8e aurel32
    __SIGRTMIN + 31,
134 ca587a8e aurel32
    -1, /* SIGCANCEL */
135 ca587a8e aurel32
    __SIGRTMIN,
136 ca587a8e aurel32
    __SIGRTMIN + 32,
137 ca587a8e aurel32
    __SIGRTMIN + 33,
138 ca587a8e aurel32
    __SIGRTMIN + 34,
139 ca587a8e aurel32
    __SIGRTMIN + 35,
140 ca587a8e aurel32
    __SIGRTMIN + 36,
141 ca587a8e aurel32
    __SIGRTMIN + 37,
142 ca587a8e aurel32
    __SIGRTMIN + 38,
143 ca587a8e aurel32
    __SIGRTMIN + 39,
144 ca587a8e aurel32
    __SIGRTMIN + 40,
145 ca587a8e aurel32
    __SIGRTMIN + 41,
146 ca587a8e aurel32
    __SIGRTMIN + 42,
147 ca587a8e aurel32
    __SIGRTMIN + 43,
148 ca587a8e aurel32
    __SIGRTMIN + 44,
149 ca587a8e aurel32
    __SIGRTMIN + 45,
150 ca587a8e aurel32
    __SIGRTMIN + 46,
151 ca587a8e aurel32
    __SIGRTMIN + 47,
152 ca587a8e aurel32
    __SIGRTMIN + 48,
153 ca587a8e aurel32
    __SIGRTMIN + 49,
154 ca587a8e aurel32
    __SIGRTMIN + 50,
155 ca587a8e aurel32
    __SIGRTMIN + 51,
156 ca587a8e aurel32
    __SIGRTMIN + 52,
157 ca587a8e aurel32
    __SIGRTMIN + 53,
158 ca587a8e aurel32
    __SIGRTMIN + 54,
159 ca587a8e aurel32
    __SIGRTMIN + 55,
160 ca587a8e aurel32
    __SIGRTMIN + 56,
161 ca587a8e aurel32
    __SIGRTMIN + 57,
162 ca587a8e aurel32
    __SIGRTMIN + 58,
163 ca587a8e aurel32
    __SIGRTMIN + 59,
164 ca587a8e aurel32
    __SIGRTMIN + 60,
165 ca587a8e aurel32
    __SIGRTMIN + 61,
166 ca587a8e aurel32
    __SIGRTMIN + 62,
167 ca587a8e aurel32
    __SIGRTMIN + 63,
168 ca587a8e aurel32
    __SIGRTMIN + 64,
169 ca587a8e aurel32
    __SIGRTMIN + 65,
170 ca587a8e aurel32
    __SIGRTMIN + 66,
171 ca587a8e aurel32
    __SIGRTMIN + 67,
172 ca587a8e aurel32
    __SIGRTMIN + 68,
173 ca587a8e aurel32
    __SIGRTMIN + 69,
174 ca587a8e aurel32
    __SIGRTMIN + 70,
175 ca587a8e aurel32
    __SIGRTMIN + 71,
176 ca587a8e aurel32
    __SIGRTMIN + 72,
177 ca587a8e aurel32
    __SIGRTMIN + 73,
178 ca587a8e aurel32
    __SIGRTMIN + 74,
179 ca587a8e aurel32
    __SIGRTMIN + 75,
180 ca587a8e aurel32
    __SIGRTMIN + 76,
181 ca587a8e aurel32
    __SIGRTMIN + 77,
182 ca587a8e aurel32
    __SIGRTMIN + 78,
183 ca587a8e aurel32
    __SIGRTMIN + 79,
184 ca587a8e aurel32
    __SIGRTMIN + 80,
185 ca587a8e aurel32
    __SIGRTMIN + 81,
186 ca587a8e aurel32
    __SIGRTMIN + 82,
187 ca587a8e aurel32
    __SIGRTMIN + 83,
188 ca587a8e aurel32
    __SIGRTMIN + 84,
189 ca587a8e aurel32
    __SIGRTMIN + 85,
190 ca587a8e aurel32
    __SIGRTMIN + 86,
191 ca587a8e aurel32
    __SIGRTMIN + 87,
192 ca587a8e aurel32
    __SIGRTMIN + 88,
193 ca587a8e aurel32
    __SIGRTMIN + 89,
194 ca587a8e aurel32
    __SIGRTMIN + 90,
195 ca587a8e aurel32
    __SIGRTMIN + 91,
196 ca587a8e aurel32
    __SIGRTMIN + 92,
197 ca587a8e aurel32
    __SIGRTMIN + 93,
198 ca587a8e aurel32
    __SIGRTMIN + 94,
199 ca587a8e aurel32
    __SIGRTMIN + 95,
200 ca587a8e aurel32
    -1, /* SIGINFO */
201 ca587a8e aurel32
    -1, /* UNKNOWN */
202 ca587a8e aurel32
    -1, /* DEFAULT */
203 ca587a8e aurel32
    -1,
204 ca587a8e aurel32
    -1,
205 ca587a8e aurel32
    -1,
206 ca587a8e aurel32
    -1,
207 ca587a8e aurel32
    -1,
208 ca587a8e aurel32
    -1
209 ca587a8e aurel32
};
210 8f447cc7 bellard
#else
211 ca587a8e aurel32
/* In system mode we only need SIGINT and SIGTRAP; other signals
212 ca587a8e aurel32
   are not yet supported.  */
213 ca587a8e aurel32
214 ca587a8e aurel32
enum {
215 ca587a8e aurel32
    TARGET_SIGINT = 2,
216 ca587a8e aurel32
    TARGET_SIGTRAP = 5
217 ca587a8e aurel32
};
218 ca587a8e aurel32
219 ca587a8e aurel32
static int gdb_signal_table[] = {
220 ca587a8e aurel32
    -1,
221 ca587a8e aurel32
    -1,
222 ca587a8e aurel32
    TARGET_SIGINT,
223 ca587a8e aurel32
    -1,
224 ca587a8e aurel32
    -1,
225 ca587a8e aurel32
    TARGET_SIGTRAP
226 ca587a8e aurel32
};
227 ca587a8e aurel32
#endif
228 ca587a8e aurel32
229 ca587a8e aurel32
#ifdef CONFIG_USER_ONLY
230 ca587a8e aurel32
static int target_signal_to_gdb (int sig)
231 ca587a8e aurel32
{
232 ca587a8e aurel32
    int i;
233 ca587a8e aurel32
    for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
234 ca587a8e aurel32
        if (gdb_signal_table[i] == sig)
235 ca587a8e aurel32
            return i;
236 ca587a8e aurel32
    return GDB_SIGNAL_UNKNOWN;
237 ca587a8e aurel32
}
238 8f447cc7 bellard
#endif
239 b4608c04 bellard
240 ca587a8e aurel32
static int gdb_signal_to_target (int sig)
241 ca587a8e aurel32
{
242 ca587a8e aurel32
    if (sig < ARRAY_SIZE (gdb_signal_table))
243 ca587a8e aurel32
        return gdb_signal_table[sig];
244 ca587a8e aurel32
    else
245 ca587a8e aurel32
        return -1;
246 ca587a8e aurel32
}
247 ca587a8e aurel32
248 4abe615b bellard
//#define DEBUG_GDB
249 b4608c04 bellard
250 56aebc89 pbrook
typedef struct GDBRegisterState {
251 56aebc89 pbrook
    int base_reg;
252 56aebc89 pbrook
    int num_regs;
253 56aebc89 pbrook
    gdb_reg_cb get_reg;
254 56aebc89 pbrook
    gdb_reg_cb set_reg;
255 56aebc89 pbrook
    const char *xml;
256 56aebc89 pbrook
    struct GDBRegisterState *next;
257 56aebc89 pbrook
} GDBRegisterState;
258 56aebc89 pbrook
259 858693c6 bellard
enum RSState {
260 858693c6 bellard
    RS_IDLE,
261 858693c6 bellard
    RS_GETLINE,
262 858693c6 bellard
    RS_CHKSUM1,
263 858693c6 bellard
    RS_CHKSUM2,
264 a2d1ebaf pbrook
    RS_SYSCALL,
265 858693c6 bellard
};
266 858693c6 bellard
typedef struct GDBState {
267 880a7578 aliguori
    CPUState *c_cpu; /* current CPU for step/continue ops */
268 880a7578 aliguori
    CPUState *g_cpu; /* current CPU for other ops */
269 880a7578 aliguori
    CPUState *query_cpu; /* for q{f|s}ThreadInfo */
270 41625033 bellard
    enum RSState state; /* parsing state */
271 56aebc89 pbrook
    char line_buf[MAX_PACKET_LENGTH];
272 858693c6 bellard
    int line_buf_index;
273 858693c6 bellard
    int line_csum;
274 56aebc89 pbrook
    uint8_t last_packet[MAX_PACKET_LENGTH + 4];
275 4046d913 pbrook
    int last_packet_len;
276 1f487ee9 edgar_igl
    int signal;
277 41625033 bellard
#ifdef CONFIG_USER_ONLY
278 4046d913 pbrook
    int fd;
279 41625033 bellard
    int running_state;
280 4046d913 pbrook
#else
281 4046d913 pbrook
    CharDriverState *chr;
282 41625033 bellard
#endif
283 858693c6 bellard
} GDBState;
284 b4608c04 bellard
285 60897d36 edgar_igl
/* By default use no IRQs and no timers while single stepping so as to
286 60897d36 edgar_igl
 * make single stepping like an ICE HW step.
287 60897d36 edgar_igl
 */
288 60897d36 edgar_igl
static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
289 60897d36 edgar_igl
290 880a7578 aliguori
static GDBState *gdbserver_state;
291 880a7578 aliguori
292 56aebc89 pbrook
/* This is an ugly hack to cope with both new and old gdb.
293 56aebc89 pbrook
   If gdb sends qXfer:features:read then assume we're talking to a newish
294 56aebc89 pbrook
   gdb that understands target descriptions.  */
295 56aebc89 pbrook
static int gdb_has_xml;
296 56aebc89 pbrook
297 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
298 4046d913 pbrook
/* XXX: This is not thread safe.  Do we care?  */
299 4046d913 pbrook
static int gdbserver_fd = -1;
300 4046d913 pbrook
301 858693c6 bellard
static int get_char(GDBState *s)
302 b4608c04 bellard
{
303 b4608c04 bellard
    uint8_t ch;
304 b4608c04 bellard
    int ret;
305 b4608c04 bellard
306 b4608c04 bellard
    for(;;) {
307 8f447cc7 bellard
        ret = recv(s->fd, &ch, 1, 0);
308 b4608c04 bellard
        if (ret < 0) {
309 1f487ee9 edgar_igl
            if (errno == ECONNRESET)
310 1f487ee9 edgar_igl
                s->fd = -1;
311 b4608c04 bellard
            if (errno != EINTR && errno != EAGAIN)
312 b4608c04 bellard
                return -1;
313 b4608c04 bellard
        } else if (ret == 0) {
314 1f487ee9 edgar_igl
            close(s->fd);
315 1f487ee9 edgar_igl
            s->fd = -1;
316 b4608c04 bellard
            return -1;
317 b4608c04 bellard
        } else {
318 b4608c04 bellard
            break;
319 b4608c04 bellard
        }
320 b4608c04 bellard
    }
321 b4608c04 bellard
    return ch;
322 b4608c04 bellard
}
323 4046d913 pbrook
#endif
324 b4608c04 bellard
325 a2d1ebaf pbrook
static gdb_syscall_complete_cb gdb_current_syscall_cb;
326 a2d1ebaf pbrook
327 a2d1ebaf pbrook
enum {
328 a2d1ebaf pbrook
    GDB_SYS_UNKNOWN,
329 a2d1ebaf pbrook
    GDB_SYS_ENABLED,
330 a2d1ebaf pbrook
    GDB_SYS_DISABLED,
331 a2d1ebaf pbrook
} gdb_syscall_mode;
332 a2d1ebaf pbrook
333 a2d1ebaf pbrook
/* If gdb is connected when the first semihosting syscall occurs then use
334 a2d1ebaf pbrook
   remote gdb syscalls.  Otherwise use native file IO.  */
335 a2d1ebaf pbrook
int use_gdb_syscalls(void)
336 a2d1ebaf pbrook
{
337 a2d1ebaf pbrook
    if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
338 880a7578 aliguori
        gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
339 880a7578 aliguori
                                            : GDB_SYS_DISABLED);
340 a2d1ebaf pbrook
    }
341 a2d1ebaf pbrook
    return gdb_syscall_mode == GDB_SYS_ENABLED;
342 a2d1ebaf pbrook
}
343 a2d1ebaf pbrook
344 ba70a624 edgar_igl
/* Resume execution.  */
345 ba70a624 edgar_igl
static inline void gdb_continue(GDBState *s)
346 ba70a624 edgar_igl
{
347 ba70a624 edgar_igl
#ifdef CONFIG_USER_ONLY
348 ba70a624 edgar_igl
    s->running_state = 1;
349 ba70a624 edgar_igl
#else
350 ba70a624 edgar_igl
    vm_start();
351 ba70a624 edgar_igl
#endif
352 ba70a624 edgar_igl
}
353 ba70a624 edgar_igl
354 858693c6 bellard
static void put_buffer(GDBState *s, const uint8_t *buf, int len)
355 b4608c04 bellard
{
356 4046d913 pbrook
#ifdef CONFIG_USER_ONLY
357 b4608c04 bellard
    int ret;
358 b4608c04 bellard
359 b4608c04 bellard
    while (len > 0) {
360 8f447cc7 bellard
        ret = send(s->fd, buf, len, 0);
361 b4608c04 bellard
        if (ret < 0) {
362 b4608c04 bellard
            if (errno != EINTR && errno != EAGAIN)
363 b4608c04 bellard
                return;
364 b4608c04 bellard
        } else {
365 b4608c04 bellard
            buf += ret;
366 b4608c04 bellard
            len -= ret;
367 b4608c04 bellard
        }
368 b4608c04 bellard
    }
369 4046d913 pbrook
#else
370 4046d913 pbrook
    qemu_chr_write(s->chr, buf, len);
371 4046d913 pbrook
#endif
372 b4608c04 bellard
}
373 b4608c04 bellard
374 b4608c04 bellard
static inline int fromhex(int v)
375 b4608c04 bellard
{
376 b4608c04 bellard
    if (v >= '0' && v <= '9')
377 b4608c04 bellard
        return v - '0';
378 b4608c04 bellard
    else if (v >= 'A' && v <= 'F')
379 b4608c04 bellard
        return v - 'A' + 10;
380 b4608c04 bellard
    else if (v >= 'a' && v <= 'f')
381 b4608c04 bellard
        return v - 'a' + 10;
382 b4608c04 bellard
    else
383 b4608c04 bellard
        return 0;
384 b4608c04 bellard
}
385 b4608c04 bellard
386 b4608c04 bellard
static inline int tohex(int v)
387 b4608c04 bellard
{
388 b4608c04 bellard
    if (v < 10)
389 b4608c04 bellard
        return v + '0';
390 b4608c04 bellard
    else
391 b4608c04 bellard
        return v - 10 + 'a';
392 b4608c04 bellard
}
393 b4608c04 bellard
394 b4608c04 bellard
static void memtohex(char *buf, const uint8_t *mem, int len)
395 b4608c04 bellard
{
396 b4608c04 bellard
    int i, c;
397 b4608c04 bellard
    char *q;
398 b4608c04 bellard
    q = buf;
399 b4608c04 bellard
    for(i = 0; i < len; i++) {
400 b4608c04 bellard
        c = mem[i];
401 b4608c04 bellard
        *q++ = tohex(c >> 4);
402 b4608c04 bellard
        *q++ = tohex(c & 0xf);
403 b4608c04 bellard
    }
404 b4608c04 bellard
    *q = '\0';
405 b4608c04 bellard
}
406 b4608c04 bellard
407 b4608c04 bellard
static void hextomem(uint8_t *mem, const char *buf, int len)
408 b4608c04 bellard
{
409 b4608c04 bellard
    int i;
410 b4608c04 bellard
411 b4608c04 bellard
    for(i = 0; i < len; i++) {
412 b4608c04 bellard
        mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
413 b4608c04 bellard
        buf += 2;
414 b4608c04 bellard
    }
415 b4608c04 bellard
}
416 b4608c04 bellard
417 b4608c04 bellard
/* return -1 if error, 0 if OK */
418 56aebc89 pbrook
static int put_packet_binary(GDBState *s, const char *buf, int len)
419 b4608c04 bellard
{
420 56aebc89 pbrook
    int csum, i;
421 60fe76f3 ths
    uint8_t *p;
422 b4608c04 bellard
423 b4608c04 bellard
    for(;;) {
424 4046d913 pbrook
        p = s->last_packet;
425 4046d913 pbrook
        *(p++) = '$';
426 4046d913 pbrook
        memcpy(p, buf, len);
427 4046d913 pbrook
        p += len;
428 b4608c04 bellard
        csum = 0;
429 b4608c04 bellard
        for(i = 0; i < len; i++) {
430 b4608c04 bellard
            csum += buf[i];
431 b4608c04 bellard
        }
432 4046d913 pbrook
        *(p++) = '#';
433 4046d913 pbrook
        *(p++) = tohex((csum >> 4) & 0xf);
434 4046d913 pbrook
        *(p++) = tohex((csum) & 0xf);
435 b4608c04 bellard
436 4046d913 pbrook
        s->last_packet_len = p - s->last_packet;
437 ffe8ab83 ths
        put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
438 b4608c04 bellard
439 4046d913 pbrook
#ifdef CONFIG_USER_ONLY
440 4046d913 pbrook
        i = get_char(s);
441 4046d913 pbrook
        if (i < 0)
442 b4608c04 bellard
            return -1;
443 4046d913 pbrook
        if (i == '+')
444 b4608c04 bellard
            break;
445 4046d913 pbrook
#else
446 4046d913 pbrook
        break;
447 4046d913 pbrook
#endif
448 b4608c04 bellard
    }
449 b4608c04 bellard
    return 0;
450 b4608c04 bellard
}
451 b4608c04 bellard
452 56aebc89 pbrook
/* return -1 if error, 0 if OK */
453 56aebc89 pbrook
static int put_packet(GDBState *s, const char *buf)
454 56aebc89 pbrook
{
455 56aebc89 pbrook
#ifdef DEBUG_GDB
456 56aebc89 pbrook
    printf("reply='%s'\n", buf);
457 56aebc89 pbrook
#endif
458 79808573 bellard
459 56aebc89 pbrook
    return put_packet_binary(s, buf, strlen(buf));
460 56aebc89 pbrook
}
461 56aebc89 pbrook
462 56aebc89 pbrook
/* The GDB remote protocol transfers values in target byte order.  This means
463 56aebc89 pbrook
   we can use the raw memory access routines to access the value buffer.
464 56aebc89 pbrook
   Conveniently, these also handle the case where the buffer is mis-aligned.
465 56aebc89 pbrook
 */
466 56aebc89 pbrook
#define GET_REG8(val) do { \
467 56aebc89 pbrook
    stb_p(mem_buf, val); \
468 56aebc89 pbrook
    return 1; \
469 56aebc89 pbrook
    } while(0)
470 56aebc89 pbrook
#define GET_REG16(val) do { \
471 56aebc89 pbrook
    stw_p(mem_buf, val); \
472 56aebc89 pbrook
    return 2; \
473 56aebc89 pbrook
    } while(0)
474 56aebc89 pbrook
#define GET_REG32(val) do { \
475 56aebc89 pbrook
    stl_p(mem_buf, val); \
476 56aebc89 pbrook
    return 4; \
477 56aebc89 pbrook
    } while(0)
478 56aebc89 pbrook
#define GET_REG64(val) do { \
479 56aebc89 pbrook
    stq_p(mem_buf, val); \
480 56aebc89 pbrook
    return 8; \
481 56aebc89 pbrook
    } while(0)
482 56aebc89 pbrook
483 56aebc89 pbrook
#if TARGET_LONG_BITS == 64
484 56aebc89 pbrook
#define GET_REGL(val) GET_REG64(val)
485 56aebc89 pbrook
#define ldtul_p(addr) ldq_p(addr)
486 56aebc89 pbrook
#else
487 56aebc89 pbrook
#define GET_REGL(val) GET_REG32(val)
488 56aebc89 pbrook
#define ldtul_p(addr) ldl_p(addr)
489 79808573 bellard
#endif
490 79808573 bellard
491 56aebc89 pbrook
#if defined(TARGET_I386)
492 5ad265ee balrog
493 5ad265ee balrog
#ifdef TARGET_X86_64
494 56aebc89 pbrook
static const int gpr_map[16] = {
495 56aebc89 pbrook
    R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
496 56aebc89 pbrook
    8, 9, 10, 11, 12, 13, 14, 15
497 56aebc89 pbrook
};
498 79808573 bellard
#else
499 56aebc89 pbrook
static const int gpr_map[8] = {0, 1, 2, 3, 4, 5, 6, 7};
500 79808573 bellard
#endif
501 79808573 bellard
502 56aebc89 pbrook
#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
503 56aebc89 pbrook
504 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
505 79808573 bellard
{
506 56aebc89 pbrook
    if (n < CPU_NB_REGS) {
507 56aebc89 pbrook
        GET_REGL(env->regs[gpr_map[n]]);
508 56aebc89 pbrook
    } else if (n >= CPU_NB_REGS + 8 && n < CPU_NB_REGS + 16) {
509 56aebc89 pbrook
        /* FIXME: byteswap float values.  */
510 56aebc89 pbrook
#ifdef USE_X86LDOUBLE
511 56aebc89 pbrook
        memcpy(mem_buf, &env->fpregs[n - (CPU_NB_REGS + 8)], 10);
512 79808573 bellard
#else
513 56aebc89 pbrook
        memset(mem_buf, 0, 10);
514 79808573 bellard
#endif
515 56aebc89 pbrook
        return 10;
516 56aebc89 pbrook
    } else if (n >= CPU_NB_REGS + 24) {
517 56aebc89 pbrook
        n -= CPU_NB_REGS + 24;
518 56aebc89 pbrook
        if (n < CPU_NB_REGS) {
519 56aebc89 pbrook
            stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
520 56aebc89 pbrook
            stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
521 56aebc89 pbrook
            return 16;
522 56aebc89 pbrook
        } else if (n == CPU_NB_REGS) {
523 56aebc89 pbrook
            GET_REG32(env->mxcsr);
524 56aebc89 pbrook
        } 
525 56aebc89 pbrook
    } else {
526 56aebc89 pbrook
        n -= CPU_NB_REGS;
527 56aebc89 pbrook
        switch (n) {
528 56aebc89 pbrook
        case 0: GET_REGL(env->eip);
529 56aebc89 pbrook
        case 1: GET_REG32(env->eflags);
530 56aebc89 pbrook
        case 2: GET_REG32(env->segs[R_CS].selector);
531 56aebc89 pbrook
        case 3: GET_REG32(env->segs[R_SS].selector);
532 56aebc89 pbrook
        case 4: GET_REG32(env->segs[R_DS].selector);
533 56aebc89 pbrook
        case 5: GET_REG32(env->segs[R_ES].selector);
534 56aebc89 pbrook
        case 6: GET_REG32(env->segs[R_FS].selector);
535 56aebc89 pbrook
        case 7: GET_REG32(env->segs[R_GS].selector);
536 56aebc89 pbrook
        /* 8...15 x87 regs.  */
537 56aebc89 pbrook
        case 16: GET_REG32(env->fpuc);
538 56aebc89 pbrook
        case 17: GET_REG32((env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11);
539 56aebc89 pbrook
        case 18: GET_REG32(0); /* ftag */
540 56aebc89 pbrook
        case 19: GET_REG32(0); /* fiseg */
541 56aebc89 pbrook
        case 20: GET_REG32(0); /* fioff */
542 56aebc89 pbrook
        case 21: GET_REG32(0); /* foseg */
543 56aebc89 pbrook
        case 22: GET_REG32(0); /* fooff */
544 56aebc89 pbrook
        case 23: GET_REG32(0); /* fop */
545 56aebc89 pbrook
        /* 24+ xmm regs.  */
546 56aebc89 pbrook
        }
547 79808573 bellard
    }
548 56aebc89 pbrook
    return 0;
549 6da41eaf bellard
}
550 6da41eaf bellard
551 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int i)
552 6da41eaf bellard
{
553 56aebc89 pbrook
    uint32_t tmp;
554 6da41eaf bellard
555 56aebc89 pbrook
    if (i < CPU_NB_REGS) {
556 56aebc89 pbrook
        env->regs[gpr_map[i]] = ldtul_p(mem_buf);
557 56aebc89 pbrook
        return sizeof(target_ulong);
558 56aebc89 pbrook
    } else if (i >= CPU_NB_REGS + 8 && i < CPU_NB_REGS + 16) {
559 56aebc89 pbrook
        i -= CPU_NB_REGS + 8;
560 56aebc89 pbrook
#ifdef USE_X86LDOUBLE
561 56aebc89 pbrook
        memcpy(&env->fpregs[i], mem_buf, 10);
562 79808573 bellard
#endif
563 56aebc89 pbrook
        return 10;
564 56aebc89 pbrook
    } else if (i >= CPU_NB_REGS + 24) {
565 56aebc89 pbrook
        i -= CPU_NB_REGS + 24;
566 56aebc89 pbrook
        if (i < CPU_NB_REGS) {
567 56aebc89 pbrook
            env->xmm_regs[i].XMM_Q(0) = ldq_p(mem_buf);
568 56aebc89 pbrook
            env->xmm_regs[i].XMM_Q(1) = ldq_p(mem_buf + 8);
569 56aebc89 pbrook
            return 16;
570 56aebc89 pbrook
        } else if (i == CPU_NB_REGS) {
571 56aebc89 pbrook
            env->mxcsr = ldl_p(mem_buf);
572 56aebc89 pbrook
            return 4;
573 79808573 bellard
        }
574 56aebc89 pbrook
    } else {
575 56aebc89 pbrook
        i -= CPU_NB_REGS;
576 56aebc89 pbrook
        switch (i) {
577 56aebc89 pbrook
        case 0: env->eip = ldtul_p(mem_buf); return sizeof(target_ulong);
578 56aebc89 pbrook
        case 1: env->eflags = ldl_p(mem_buf); return 4;
579 56aebc89 pbrook
#if defined(CONFIG_USER_ONLY)
580 56aebc89 pbrook
#define LOAD_SEG(index, sreg)\
581 56aebc89 pbrook
            tmp = ldl_p(mem_buf);\
582 56aebc89 pbrook
            if (tmp != env->segs[sreg].selector)\
583 56aebc89 pbrook
                cpu_x86_load_seg(env, sreg, tmp);
584 56aebc89 pbrook
#else
585 56aebc89 pbrook
/* FIXME: Honor segment registers.  Needs to avoid raising an exception
586 56aebc89 pbrook
   when the selector is invalid.  */
587 56aebc89 pbrook
#define LOAD_SEG(index, sreg) do {} while(0)
588 6da41eaf bellard
#endif
589 56aebc89 pbrook
        case 2: LOAD_SEG(10, R_CS); return 4;
590 56aebc89 pbrook
        case 3: LOAD_SEG(11, R_SS); return 4;
591 56aebc89 pbrook
        case 4: LOAD_SEG(12, R_DS); return 4;
592 56aebc89 pbrook
        case 5: LOAD_SEG(13, R_ES); return 4;
593 56aebc89 pbrook
        case 6: LOAD_SEG(14, R_FS); return 4;
594 56aebc89 pbrook
        case 7: LOAD_SEG(15, R_GS); return 4;
595 56aebc89 pbrook
        /* 8...15 x87 regs.  */
596 56aebc89 pbrook
        case 16: env->fpuc = ldl_p(mem_buf); return 4;
597 56aebc89 pbrook
        case 17:
598 56aebc89 pbrook
                 tmp = ldl_p(mem_buf);
599 56aebc89 pbrook
                 env->fpstt = (tmp >> 11) & 7;
600 56aebc89 pbrook
                 env->fpus = tmp & ~0x3800;
601 56aebc89 pbrook
                 return 4;
602 56aebc89 pbrook
        case 18: /* ftag */ return 4;
603 56aebc89 pbrook
        case 19: /* fiseg */ return 4;
604 56aebc89 pbrook
        case 20: /* fioff */ return 4;
605 56aebc89 pbrook
        case 21: /* foseg */ return 4;
606 56aebc89 pbrook
        case 22: /* fooff */ return 4;
607 56aebc89 pbrook
        case 23: /* fop */ return 4;
608 56aebc89 pbrook
        /* 24+ xmm regs.  */
609 79808573 bellard
        }
610 79808573 bellard
    }
611 56aebc89 pbrook
    /* Unrecognised register.  */
612 56aebc89 pbrook
    return 0;
613 6da41eaf bellard
}
614 6da41eaf bellard
615 9e62fd7f bellard
#elif defined (TARGET_PPC)
616 9e62fd7f bellard
617 56aebc89 pbrook
#define NUM_CORE_REGS 71
618 9e62fd7f bellard
619 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
620 9e62fd7f bellard
{
621 56aebc89 pbrook
    if (n < 32) {
622 56aebc89 pbrook
        /* gprs */
623 56aebc89 pbrook
        GET_REGL(env->gpr[n]);
624 56aebc89 pbrook
    } else if (n < 64) {
625 56aebc89 pbrook
        /* fprs */
626 8d4acf9b aurel32
        stfq_p(mem_buf, env->fpr[n-32]);
627 56aebc89 pbrook
        return 8;
628 56aebc89 pbrook
    } else {
629 56aebc89 pbrook
        switch (n) {
630 56aebc89 pbrook
        case 64: GET_REGL(env->nip);
631 56aebc89 pbrook
        case 65: GET_REGL(env->msr);
632 56aebc89 pbrook
        case 66:
633 56aebc89 pbrook
            {
634 56aebc89 pbrook
                uint32_t cr = 0;
635 56aebc89 pbrook
                int i;
636 56aebc89 pbrook
                for (i = 0; i < 8; i++)
637 56aebc89 pbrook
                    cr |= env->crf[i] << (32 - ((i + 1) * 4));
638 56aebc89 pbrook
                GET_REG32(cr);
639 56aebc89 pbrook
            }
640 56aebc89 pbrook
        case 67: GET_REGL(env->lr);
641 56aebc89 pbrook
        case 68: GET_REGL(env->ctr);
642 3d7b417e aurel32
        case 69: GET_REGL(env->xer);
643 56aebc89 pbrook
        case 70: GET_REG32(0); /* fpscr */
644 56aebc89 pbrook
        }
645 56aebc89 pbrook
    }
646 56aebc89 pbrook
    return 0;
647 56aebc89 pbrook
}
648 9e62fd7f bellard
649 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
650 56aebc89 pbrook
{
651 56aebc89 pbrook
    if (n < 32) {
652 56aebc89 pbrook
        /* gprs */
653 56aebc89 pbrook
        env->gpr[n] = ldtul_p(mem_buf);
654 56aebc89 pbrook
        return sizeof(target_ulong);
655 56aebc89 pbrook
    } else if (n < 64) {
656 56aebc89 pbrook
        /* fprs */
657 8d4acf9b aurel32
        env->fpr[n-32] = ldfq_p(mem_buf);
658 56aebc89 pbrook
        return 8;
659 56aebc89 pbrook
    } else {
660 56aebc89 pbrook
        switch (n) {
661 56aebc89 pbrook
        case 64:
662 56aebc89 pbrook
            env->nip = ldtul_p(mem_buf);
663 56aebc89 pbrook
            return sizeof(target_ulong);
664 56aebc89 pbrook
        case 65:
665 56aebc89 pbrook
            ppc_store_msr(env, ldtul_p(mem_buf));
666 56aebc89 pbrook
            return sizeof(target_ulong);
667 56aebc89 pbrook
        case 66:
668 56aebc89 pbrook
            {
669 56aebc89 pbrook
                uint32_t cr = ldl_p(mem_buf);
670 56aebc89 pbrook
                int i;
671 56aebc89 pbrook
                for (i = 0; i < 8; i++)
672 56aebc89 pbrook
                    env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
673 56aebc89 pbrook
                return 4;
674 56aebc89 pbrook
            }
675 56aebc89 pbrook
        case 67:
676 56aebc89 pbrook
            env->lr = ldtul_p(mem_buf);
677 56aebc89 pbrook
            return sizeof(target_ulong);
678 56aebc89 pbrook
        case 68:
679 56aebc89 pbrook
            env->ctr = ldtul_p(mem_buf);
680 56aebc89 pbrook
            return sizeof(target_ulong);
681 56aebc89 pbrook
        case 69:
682 3d7b417e aurel32
            env->xer = ldtul_p(mem_buf);
683 3d7b417e aurel32
            return sizeof(target_ulong);
684 56aebc89 pbrook
        case 70:
685 56aebc89 pbrook
            /* fpscr */
686 56aebc89 pbrook
            return 4;
687 56aebc89 pbrook
        }
688 56aebc89 pbrook
    }
689 56aebc89 pbrook
    return 0;
690 e95c8d51 bellard
}
691 56aebc89 pbrook
692 e95c8d51 bellard
#elif defined (TARGET_SPARC)
693 56aebc89 pbrook
694 56aebc89 pbrook
#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
695 56aebc89 pbrook
#define NUM_CORE_REGS 86
696 96d19126 blueswir1
#else
697 56aebc89 pbrook
#define NUM_CORE_REGS 73
698 96d19126 blueswir1
#endif
699 56aebc89 pbrook
700 96d19126 blueswir1
#ifdef TARGET_ABI32
701 56aebc89 pbrook
#define GET_REGA(val) GET_REG32(val)
702 96d19126 blueswir1
#else
703 56aebc89 pbrook
#define GET_REGA(val) GET_REGL(val)
704 96d19126 blueswir1
#endif
705 e95c8d51 bellard
706 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
707 56aebc89 pbrook
{
708 56aebc89 pbrook
    if (n < 8) {
709 56aebc89 pbrook
        /* g0..g7 */
710 56aebc89 pbrook
        GET_REGA(env->gregs[n]);
711 e95c8d51 bellard
    }
712 56aebc89 pbrook
    if (n < 32) {
713 56aebc89 pbrook
        /* register window */
714 56aebc89 pbrook
        GET_REGA(env->regwptr[n - 8]);
715 e95c8d51 bellard
    }
716 56aebc89 pbrook
#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
717 56aebc89 pbrook
    if (n < 64) {
718 56aebc89 pbrook
        /* fprs */
719 56aebc89 pbrook
        GET_REG32(*((uint32_t *)&env->fpr[n - 32]));
720 e95c8d51 bellard
    }
721 e95c8d51 bellard
    /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
722 56aebc89 pbrook
    switch (n) {
723 56aebc89 pbrook
    case 64: GET_REGA(env->y);
724 56aebc89 pbrook
    case 65: GET_REGA(GET_PSR(env));
725 56aebc89 pbrook
    case 66: GET_REGA(env->wim);
726 56aebc89 pbrook
    case 67: GET_REGA(env->tbr);
727 56aebc89 pbrook
    case 68: GET_REGA(env->pc);
728 56aebc89 pbrook
    case 69: GET_REGA(env->npc);
729 56aebc89 pbrook
    case 70: GET_REGA(env->fsr);
730 56aebc89 pbrook
    case 71: GET_REGA(0); /* csr */
731 56aebc89 pbrook
    case 72: GET_REGA(0);
732 56aebc89 pbrook
    }
733 3475187d bellard
#else
734 56aebc89 pbrook
    if (n < 64) {
735 56aebc89 pbrook
        /* f0-f31 */
736 56aebc89 pbrook
        GET_REG32(*((uint32_t *)&env->fpr[n - 32]));
737 56aebc89 pbrook
    }
738 56aebc89 pbrook
    if (n < 80) {
739 56aebc89 pbrook
        /* f32-f62 (double width, even numbers only) */
740 56aebc89 pbrook
        uint64_t val;
741 9d9754a3 bellard
742 56aebc89 pbrook
        val = (uint64_t)*((uint32_t *)&env->fpr[(n - 64) * 2 + 32]) << 32;
743 56aebc89 pbrook
        val |= *((uint32_t *)&env->fpr[(n - 64) * 2 + 33]);
744 56aebc89 pbrook
        GET_REG64(val);
745 3475187d bellard
    }
746 56aebc89 pbrook
    switch (n) {
747 56aebc89 pbrook
    case 80: GET_REGL(env->pc);
748 56aebc89 pbrook
    case 81: GET_REGL(env->npc);
749 56aebc89 pbrook
    case 82: GET_REGL(((uint64_t)GET_CCR(env) << 32) |
750 17d996e1 blueswir1
                           ((env->asi & 0xff) << 24) |
751 17d996e1 blueswir1
                           ((env->pstate & 0xfff) << 8) |
752 17d996e1 blueswir1
                           GET_CWP64(env));
753 56aebc89 pbrook
    case 83: GET_REGL(env->fsr);
754 56aebc89 pbrook
    case 84: GET_REGL(env->fprs);
755 56aebc89 pbrook
    case 85: GET_REGL(env->y);
756 56aebc89 pbrook
    }
757 3475187d bellard
#endif
758 56aebc89 pbrook
    return 0;
759 e95c8d51 bellard
}
760 e95c8d51 bellard
761 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
762 e95c8d51 bellard
{
763 56aebc89 pbrook
#if defined(TARGET_ABI32)
764 56aebc89 pbrook
    abi_ulong tmp;
765 56aebc89 pbrook
766 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
767 96d19126 blueswir1
#else
768 56aebc89 pbrook
    target_ulong tmp;
769 56aebc89 pbrook
770 56aebc89 pbrook
    tmp = ldtul_p(mem_buf);
771 96d19126 blueswir1
#endif
772 e95c8d51 bellard
773 56aebc89 pbrook
    if (n < 8) {
774 56aebc89 pbrook
        /* g0..g7 */
775 56aebc89 pbrook
        env->gregs[n] = tmp;
776 56aebc89 pbrook
    } else if (n < 32) {
777 56aebc89 pbrook
        /* register window */
778 56aebc89 pbrook
        env->regwptr[n - 8] = tmp;
779 e95c8d51 bellard
    }
780 56aebc89 pbrook
#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
781 56aebc89 pbrook
    else if (n < 64) {
782 56aebc89 pbrook
        /* fprs */
783 56aebc89 pbrook
        *((uint32_t *)&env->fpr[n - 32]) = tmp;
784 56aebc89 pbrook
    } else {
785 56aebc89 pbrook
        /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
786 56aebc89 pbrook
        switch (n) {
787 56aebc89 pbrook
        case 64: env->y = tmp; break;
788 56aebc89 pbrook
        case 65: PUT_PSR(env, tmp); break;
789 56aebc89 pbrook
        case 66: env->wim = tmp; break;
790 56aebc89 pbrook
        case 67: env->tbr = tmp; break;
791 56aebc89 pbrook
        case 68: env->pc = tmp; break;
792 56aebc89 pbrook
        case 69: env->npc = tmp; break;
793 56aebc89 pbrook
        case 70: env->fsr = tmp; break;
794 56aebc89 pbrook
        default: return 0;
795 56aebc89 pbrook
        }
796 e95c8d51 bellard
    }
797 56aebc89 pbrook
    return 4;
798 3475187d bellard
#else
799 56aebc89 pbrook
    else if (n < 64) {
800 56aebc89 pbrook
        /* f0-f31 */
801 56aebc89 pbrook
        env->fpr[n] = ldfl_p(mem_buf);
802 56aebc89 pbrook
        return 4;
803 56aebc89 pbrook
    } else if (n < 80) {
804 56aebc89 pbrook
        /* f32-f62 (double width, even numbers only) */
805 56aebc89 pbrook
        *((uint32_t *)&env->fpr[(n - 64) * 2 + 32]) = tmp >> 32;
806 56aebc89 pbrook
        *((uint32_t *)&env->fpr[(n - 64) * 2 + 33]) = tmp;
807 56aebc89 pbrook
    } else {
808 56aebc89 pbrook
        switch (n) {
809 56aebc89 pbrook
        case 80: env->pc = tmp; break;
810 56aebc89 pbrook
        case 81: env->npc = tmp; break;
811 56aebc89 pbrook
        case 82:
812 56aebc89 pbrook
            PUT_CCR(env, tmp >> 32);
813 56aebc89 pbrook
            env->asi = (tmp >> 24) & 0xff;
814 56aebc89 pbrook
            env->pstate = (tmp >> 8) & 0xfff;
815 56aebc89 pbrook
            PUT_CWP64(env, tmp & 0xff);
816 56aebc89 pbrook
            break;
817 56aebc89 pbrook
        case 83: env->fsr = tmp; break;
818 56aebc89 pbrook
        case 84: env->fprs = tmp; break;
819 56aebc89 pbrook
        case 85: env->y = tmp; break;
820 56aebc89 pbrook
        default: return 0;
821 56aebc89 pbrook
        }
822 17d996e1 blueswir1
    }
823 56aebc89 pbrook
    return 8;
824 3475187d bellard
#endif
825 9e62fd7f bellard
}
826 1fddef4b bellard
#elif defined (TARGET_ARM)
827 6da41eaf bellard
828 56aebc89 pbrook
/* Old gdb always expect FPA registers.  Newer (xml-aware) gdb only expect
829 56aebc89 pbrook
   whatever the target description contains.  Due to a historical mishap
830 56aebc89 pbrook
   the FPA registers appear in between core integer regs and the CPSR.
831 56aebc89 pbrook
   We hack round this by giving the FPA regs zero size when talking to a
832 56aebc89 pbrook
   newer gdb.  */
833 56aebc89 pbrook
#define NUM_CORE_REGS 26
834 56aebc89 pbrook
#define GDB_CORE_XML "arm-core.xml"
835 e6e5906b pbrook
836 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
837 e6e5906b pbrook
{
838 56aebc89 pbrook
    if (n < 16) {
839 56aebc89 pbrook
        /* Core integer register.  */
840 56aebc89 pbrook
        GET_REG32(env->regs[n]);
841 56aebc89 pbrook
    }
842 56aebc89 pbrook
    if (n < 24) {
843 56aebc89 pbrook
        /* FPA registers.  */
844 56aebc89 pbrook
        if (gdb_has_xml)
845 56aebc89 pbrook
            return 0;
846 56aebc89 pbrook
        memset(mem_buf, 0, 12);
847 56aebc89 pbrook
        return 12;
848 56aebc89 pbrook
    }
849 56aebc89 pbrook
    switch (n) {
850 56aebc89 pbrook
    case 24:
851 56aebc89 pbrook
        /* FPA status register.  */
852 56aebc89 pbrook
        if (gdb_has_xml)
853 56aebc89 pbrook
            return 0;
854 56aebc89 pbrook
        GET_REG32(0);
855 56aebc89 pbrook
    case 25:
856 56aebc89 pbrook
        /* CPSR */
857 56aebc89 pbrook
        GET_REG32(cpsr_read(env));
858 56aebc89 pbrook
    }
859 56aebc89 pbrook
    /* Unknown register.  */
860 56aebc89 pbrook
    return 0;
861 e6e5906b pbrook
}
862 6f970bd9 bellard
863 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
864 56aebc89 pbrook
{
865 56aebc89 pbrook
    uint32_t tmp;
866 6f970bd9 bellard
867 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
868 6f970bd9 bellard
869 56aebc89 pbrook
    /* Mask out low bit of PC to workaround gdb bugs.  This will probably
870 56aebc89 pbrook
       cause problems if we ever implement the Jazelle DBX extensions.  */
871 56aebc89 pbrook
    if (n == 15)
872 56aebc89 pbrook
        tmp &= ~1;
873 6f970bd9 bellard
874 56aebc89 pbrook
    if (n < 16) {
875 56aebc89 pbrook
        /* Core integer register.  */
876 56aebc89 pbrook
        env->regs[n] = tmp;
877 56aebc89 pbrook
        return 4;
878 56aebc89 pbrook
    }
879 56aebc89 pbrook
    if (n < 24) { /* 16-23 */
880 56aebc89 pbrook
        /* FPA registers (ignored).  */
881 56aebc89 pbrook
        if (gdb_has_xml)
882 56aebc89 pbrook
            return 0;
883 56aebc89 pbrook
        return 12;
884 56aebc89 pbrook
    }
885 56aebc89 pbrook
    switch (n) {
886 56aebc89 pbrook
    case 24:
887 56aebc89 pbrook
        /* FPA status register (ignored).  */
888 56aebc89 pbrook
        if (gdb_has_xml)
889 56aebc89 pbrook
            return 0;
890 56aebc89 pbrook
        return 4;
891 56aebc89 pbrook
    case 25:
892 56aebc89 pbrook
        /* CPSR */
893 56aebc89 pbrook
        cpsr_write (env, tmp, 0xffffffff);
894 56aebc89 pbrook
        return 4;
895 56aebc89 pbrook
    }
896 56aebc89 pbrook
    /* Unknown register.  */
897 56aebc89 pbrook
    return 0;
898 56aebc89 pbrook
}
899 6f970bd9 bellard
900 56aebc89 pbrook
#elif defined (TARGET_M68K)
901 6f970bd9 bellard
902 56aebc89 pbrook
#define NUM_CORE_REGS 18
903 6f970bd9 bellard
904 56aebc89 pbrook
#define GDB_CORE_XML "cf-core.xml"
905 6f970bd9 bellard
906 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
907 56aebc89 pbrook
{
908 56aebc89 pbrook
    if (n < 8) {
909 56aebc89 pbrook
        /* D0-D7 */
910 56aebc89 pbrook
        GET_REG32(env->dregs[n]);
911 56aebc89 pbrook
    } else if (n < 16) {
912 56aebc89 pbrook
        /* A0-A7 */
913 56aebc89 pbrook
        GET_REG32(env->aregs[n - 8]);
914 56aebc89 pbrook
    } else {
915 56aebc89 pbrook
        switch (n) {
916 56aebc89 pbrook
        case 16: GET_REG32(env->sr);
917 56aebc89 pbrook
        case 17: GET_REG32(env->pc);
918 56aebc89 pbrook
        }
919 56aebc89 pbrook
    }
920 56aebc89 pbrook
    /* FP registers not included here because they vary between
921 56aebc89 pbrook
       ColdFire and m68k.  Use XML bits for these.  */
922 56aebc89 pbrook
    return 0;
923 56aebc89 pbrook
}
924 8e33c08c ths
925 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
926 56aebc89 pbrook
{
927 56aebc89 pbrook
    uint32_t tmp;
928 8e33c08c ths
929 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
930 8e33c08c ths
931 56aebc89 pbrook
    if (n < 8) {
932 56aebc89 pbrook
        /* D0-D7 */
933 56aebc89 pbrook
        env->dregs[n] = tmp;
934 56aebc89 pbrook
    } else if (n < 8) {
935 56aebc89 pbrook
        /* A0-A7 */
936 56aebc89 pbrook
        env->aregs[n - 8] = tmp;
937 56aebc89 pbrook
    } else {
938 56aebc89 pbrook
        switch (n) {
939 56aebc89 pbrook
        case 16: env->sr = tmp; break;
940 56aebc89 pbrook
        case 17: env->pc = tmp; break;
941 56aebc89 pbrook
        default: return 0;
942 56aebc89 pbrook
        }
943 56aebc89 pbrook
    }
944 56aebc89 pbrook
    return 4;
945 56aebc89 pbrook
}
946 56aebc89 pbrook
#elif defined (TARGET_MIPS)
947 7ac256b8 ths
948 56aebc89 pbrook
#define NUM_CORE_REGS 73
949 7ac256b8 ths
950 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
951 56aebc89 pbrook
{
952 56aebc89 pbrook
    if (n < 32) {
953 56aebc89 pbrook
        GET_REGL(env->active_tc.gpr[n]);
954 56aebc89 pbrook
    }
955 56aebc89 pbrook
    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
956 56aebc89 pbrook
        if (n >= 38 && n < 70) {
957 56aebc89 pbrook
            if (env->CP0_Status & (1 << CP0St_FR))
958 56aebc89 pbrook
                GET_REGL(env->active_fpu.fpr[n - 38].d);
959 56aebc89 pbrook
            else
960 56aebc89 pbrook
                GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
961 56aebc89 pbrook
        }
962 56aebc89 pbrook
        switch (n) {
963 56aebc89 pbrook
        case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
964 56aebc89 pbrook
        case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
965 56aebc89 pbrook
        }
966 56aebc89 pbrook
    }
967 56aebc89 pbrook
    switch (n) {
968 56aebc89 pbrook
    case 32: GET_REGL((int32_t)env->CP0_Status);
969 56aebc89 pbrook
    case 33: GET_REGL(env->active_tc.LO[0]);
970 56aebc89 pbrook
    case 34: GET_REGL(env->active_tc.HI[0]);
971 56aebc89 pbrook
    case 35: GET_REGL(env->CP0_BadVAddr);
972 56aebc89 pbrook
    case 36: GET_REGL((int32_t)env->CP0_Cause);
973 56aebc89 pbrook
    case 37: GET_REGL(env->active_tc.PC);
974 56aebc89 pbrook
    case 72: GET_REGL(0); /* fp */
975 56aebc89 pbrook
    case 89: GET_REGL((int32_t)env->CP0_PRid);
976 56aebc89 pbrook
    }
977 56aebc89 pbrook
    if (n >= 73 && n <= 88) {
978 56aebc89 pbrook
        /* 16 embedded regs.  */
979 56aebc89 pbrook
        GET_REGL(0);
980 56aebc89 pbrook
    }
981 6f970bd9 bellard
982 56aebc89 pbrook
    return 0;
983 6f970bd9 bellard
}
984 6f970bd9 bellard
985 8e33c08c ths
/* convert MIPS rounding mode in FCR31 to IEEE library */
986 8e33c08c ths
static unsigned int ieee_rm[] =
987 8e33c08c ths
  {
988 8e33c08c ths
    float_round_nearest_even,
989 8e33c08c ths
    float_round_to_zero,
990 8e33c08c ths
    float_round_up,
991 8e33c08c ths
    float_round_down
992 8e33c08c ths
  };
993 8e33c08c ths
#define RESTORE_ROUNDING_MODE \
994 f01be154 ths
    set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
995 8e33c08c ths
996 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
997 6f970bd9 bellard
{
998 56aebc89 pbrook
    target_ulong tmp;
999 6f970bd9 bellard
1000 56aebc89 pbrook
    tmp = ldtul_p(mem_buf);
1001 6f970bd9 bellard
1002 56aebc89 pbrook
    if (n < 32) {
1003 56aebc89 pbrook
        env->active_tc.gpr[n] = tmp;
1004 56aebc89 pbrook
        return sizeof(target_ulong);
1005 56aebc89 pbrook
    }
1006 56aebc89 pbrook
    if (env->CP0_Config1 & (1 << CP0C1_FP)
1007 56aebc89 pbrook
            && n >= 38 && n < 73) {
1008 56aebc89 pbrook
        if (n < 70) {
1009 7ac256b8 ths
            if (env->CP0_Status & (1 << CP0St_FR))
1010 56aebc89 pbrook
              env->active_fpu.fpr[n - 38].d = tmp;
1011 7ac256b8 ths
            else
1012 56aebc89 pbrook
              env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1013 56aebc89 pbrook
        }
1014 56aebc89 pbrook
        switch (n) {
1015 56aebc89 pbrook
        case 70:
1016 56aebc89 pbrook
            env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1017 56aebc89 pbrook
            /* set rounding mode */
1018 56aebc89 pbrook
            RESTORE_ROUNDING_MODE;
1019 8e33c08c ths
#ifndef CONFIG_SOFTFLOAT
1020 56aebc89 pbrook
            /* no floating point exception for native float */
1021 56aebc89 pbrook
            SET_FP_ENABLE(env->active_fpu.fcr31, 0);
1022 8e33c08c ths
#endif
1023 56aebc89 pbrook
            break;
1024 56aebc89 pbrook
        case 71: env->active_fpu.fcr0 = tmp; break;
1025 56aebc89 pbrook
        }
1026 56aebc89 pbrook
        return sizeof(target_ulong);
1027 56aebc89 pbrook
    }
1028 56aebc89 pbrook
    switch (n) {
1029 56aebc89 pbrook
    case 32: env->CP0_Status = tmp; break;
1030 56aebc89 pbrook
    case 33: env->active_tc.LO[0] = tmp; break;
1031 56aebc89 pbrook
    case 34: env->active_tc.HI[0] = tmp; break;
1032 56aebc89 pbrook
    case 35: env->CP0_BadVAddr = tmp; break;
1033 56aebc89 pbrook
    case 36: env->CP0_Cause = tmp; break;
1034 56aebc89 pbrook
    case 37: env->active_tc.PC = tmp; break;
1035 56aebc89 pbrook
    case 72: /* fp, ignored */ break;
1036 56aebc89 pbrook
    default: 
1037 56aebc89 pbrook
        if (n > 89)
1038 56aebc89 pbrook
            return 0;
1039 56aebc89 pbrook
        /* Other registers are readonly.  Ignore writes.  */
1040 56aebc89 pbrook
        break;
1041 56aebc89 pbrook
    }
1042 56aebc89 pbrook
1043 56aebc89 pbrook
    return sizeof(target_ulong);
1044 6f970bd9 bellard
}
1045 fdf9b3e8 bellard
#elif defined (TARGET_SH4)
1046 6ef99fc5 ths
1047 6ef99fc5 ths
/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
1048 56aebc89 pbrook
/* FIXME: We should use XML for this.  */
1049 56aebc89 pbrook
1050 56aebc89 pbrook
#define NUM_CORE_REGS 59
1051 6ef99fc5 ths
1052 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1053 fdf9b3e8 bellard
{
1054 56aebc89 pbrook
    if (n < 8) {
1055 56aebc89 pbrook
        if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1056 56aebc89 pbrook
            GET_REGL(env->gregs[n + 16]);
1057 56aebc89 pbrook
        } else {
1058 56aebc89 pbrook
            GET_REGL(env->gregs[n]);
1059 56aebc89 pbrook
        }
1060 56aebc89 pbrook
    } else if (n < 16) {
1061 56aebc89 pbrook
        GET_REGL(env->gregs[n - 8]);
1062 56aebc89 pbrook
    } else if (n >= 25 && n < 41) {
1063 56aebc89 pbrook
        GET_REGL(env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)]);
1064 56aebc89 pbrook
    } else if (n >= 43 && n < 51) {
1065 56aebc89 pbrook
        GET_REGL(env->gregs[n - 43]);
1066 56aebc89 pbrook
    } else if (n >= 51 && n < 59) {
1067 56aebc89 pbrook
        GET_REGL(env->gregs[n - (51 - 16)]);
1068 56aebc89 pbrook
    }
1069 56aebc89 pbrook
    switch (n) {
1070 56aebc89 pbrook
    case 16: GET_REGL(env->pc);
1071 56aebc89 pbrook
    case 17: GET_REGL(env->pr);
1072 56aebc89 pbrook
    case 18: GET_REGL(env->gbr);
1073 56aebc89 pbrook
    case 19: GET_REGL(env->vbr);
1074 56aebc89 pbrook
    case 20: GET_REGL(env->mach);
1075 56aebc89 pbrook
    case 21: GET_REGL(env->macl);
1076 56aebc89 pbrook
    case 22: GET_REGL(env->sr);
1077 56aebc89 pbrook
    case 23: GET_REGL(env->fpul);
1078 56aebc89 pbrook
    case 24: GET_REGL(env->fpscr);
1079 56aebc89 pbrook
    case 41: GET_REGL(env->ssr);
1080 56aebc89 pbrook
    case 42: GET_REGL(env->spc);
1081 56aebc89 pbrook
    }
1082 56aebc89 pbrook
1083 56aebc89 pbrook
    return 0;
1084 fdf9b3e8 bellard
}
1085 fdf9b3e8 bellard
1086 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1087 fdf9b3e8 bellard
{
1088 56aebc89 pbrook
    uint32_t tmp;
1089 56aebc89 pbrook
1090 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
1091 56aebc89 pbrook
1092 56aebc89 pbrook
    if (n < 8) {
1093 56aebc89 pbrook
        if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1094 56aebc89 pbrook
            env->gregs[n + 16] = tmp;
1095 56aebc89 pbrook
        } else {
1096 56aebc89 pbrook
            env->gregs[n] = tmp;
1097 56aebc89 pbrook
        }
1098 56aebc89 pbrook
        return 4;
1099 56aebc89 pbrook
    } else if (n < 16) {
1100 56aebc89 pbrook
        env->gregs[n - 8] = tmp;
1101 56aebc89 pbrook
        return 4;
1102 56aebc89 pbrook
    } else if (n >= 25 && n < 41) {
1103 56aebc89 pbrook
        env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)] = tmp;
1104 56aebc89 pbrook
    } else if (n >= 43 && n < 51) {
1105 56aebc89 pbrook
        env->gregs[n - 43] = tmp;
1106 56aebc89 pbrook
        return 4;
1107 56aebc89 pbrook
    } else if (n >= 51 && n < 59) {
1108 56aebc89 pbrook
        env->gregs[n - (51 - 16)] = tmp;
1109 56aebc89 pbrook
        return 4;
1110 56aebc89 pbrook
    }
1111 56aebc89 pbrook
    switch (n) {
1112 56aebc89 pbrook
    case 16: env->pc = tmp;
1113 56aebc89 pbrook
    case 17: env->pr = tmp;
1114 56aebc89 pbrook
    case 18: env->gbr = tmp;
1115 56aebc89 pbrook
    case 19: env->vbr = tmp;
1116 56aebc89 pbrook
    case 20: env->mach = tmp;
1117 56aebc89 pbrook
    case 21: env->macl = tmp;
1118 56aebc89 pbrook
    case 22: env->sr = tmp;
1119 56aebc89 pbrook
    case 23: env->fpul = tmp;
1120 56aebc89 pbrook
    case 24: env->fpscr = tmp;
1121 56aebc89 pbrook
    case 41: env->ssr = tmp;
1122 56aebc89 pbrook
    case 42: env->spc = tmp;
1123 56aebc89 pbrook
    default: return 0;
1124 56aebc89 pbrook
    }
1125 56aebc89 pbrook
1126 56aebc89 pbrook
    return 4;
1127 fdf9b3e8 bellard
}
1128 f1ccf904 ths
#elif defined (TARGET_CRIS)
1129 f1ccf904 ths
1130 56aebc89 pbrook
#define NUM_CORE_REGS 49
1131 56aebc89 pbrook
1132 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1133 f1ccf904 ths
{
1134 56aebc89 pbrook
    uint8_t srs;
1135 56aebc89 pbrook
1136 56aebc89 pbrook
    srs = env->pregs[PR_SRS];
1137 56aebc89 pbrook
    if (n < 16) {
1138 56aebc89 pbrook
        GET_REG32(env->regs[n]);
1139 56aebc89 pbrook
    }
1140 56aebc89 pbrook
1141 56aebc89 pbrook
    if (n >= 21 && n < 32) {
1142 56aebc89 pbrook
        GET_REG32(env->pregs[n - 16]);
1143 56aebc89 pbrook
    }
1144 56aebc89 pbrook
    if (n >= 33 && n < 49) {
1145 56aebc89 pbrook
        GET_REG32(env->sregs[srs][n - 33]);
1146 56aebc89 pbrook
    }
1147 56aebc89 pbrook
    switch (n) {
1148 56aebc89 pbrook
    case 16: GET_REG8(env->pregs[0]);
1149 56aebc89 pbrook
    case 17: GET_REG8(env->pregs[1]);
1150 56aebc89 pbrook
    case 18: GET_REG32(env->pregs[2]);
1151 56aebc89 pbrook
    case 19: GET_REG8(srs);
1152 56aebc89 pbrook
    case 20: GET_REG16(env->pregs[4]);
1153 56aebc89 pbrook
    case 32: GET_REG32(env->pc);
1154 56aebc89 pbrook
    }
1155 56aebc89 pbrook
1156 56aebc89 pbrook
    return 0;
1157 f1ccf904 ths
}
1158 56aebc89 pbrook
1159 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1160 f1ccf904 ths
{
1161 56aebc89 pbrook
    uint32_t tmp;
1162 56aebc89 pbrook
1163 56aebc89 pbrook
    if (n > 49)
1164 56aebc89 pbrook
        return 0;
1165 56aebc89 pbrook
1166 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
1167 56aebc89 pbrook
1168 56aebc89 pbrook
    if (n < 16) {
1169 56aebc89 pbrook
        env->regs[n] = tmp;
1170 56aebc89 pbrook
    }
1171 56aebc89 pbrook
1172 d7b6967a edgar_igl
    if (n >= 21 && n < 32) {
1173 d7b6967a edgar_igl
        env->pregs[n - 16] = tmp;
1174 d7b6967a edgar_igl
    }
1175 d7b6967a edgar_igl
1176 d7b6967a edgar_igl
    /* FIXME: Should support function regs be writable?  */
1177 56aebc89 pbrook
    switch (n) {
1178 56aebc89 pbrook
    case 16: return 1;
1179 56aebc89 pbrook
    case 17: return 1;
1180 d7b6967a edgar_igl
    case 18: env->pregs[PR_PID] = tmp; break;
1181 56aebc89 pbrook
    case 19: return 1;
1182 56aebc89 pbrook
    case 20: return 2;
1183 56aebc89 pbrook
    case 32: env->pc = tmp; break;
1184 56aebc89 pbrook
    }
1185 56aebc89 pbrook
1186 56aebc89 pbrook
    return 4;
1187 f1ccf904 ths
}
1188 19bf517b aurel32
#elif defined (TARGET_ALPHA)
1189 19bf517b aurel32
1190 19bf517b aurel32
#define NUM_CORE_REGS 65
1191 19bf517b aurel32
1192 19bf517b aurel32
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1193 19bf517b aurel32
{
1194 19bf517b aurel32
    if (n < 31) {
1195 19bf517b aurel32
       GET_REGL(env->ir[n]);
1196 19bf517b aurel32
    }
1197 19bf517b aurel32
    else if (n == 31) {
1198 19bf517b aurel32
       GET_REGL(0);
1199 19bf517b aurel32
    }
1200 19bf517b aurel32
    else if (n<63) {
1201 19bf517b aurel32
       uint64_t val;
1202 19bf517b aurel32
1203 19bf517b aurel32
       val=*((uint64_t *)&env->fir[n-32]);
1204 19bf517b aurel32
       GET_REGL(val);
1205 19bf517b aurel32
    }
1206 19bf517b aurel32
    else if (n==63) {
1207 19bf517b aurel32
       GET_REGL(env->fpcr);
1208 19bf517b aurel32
    }
1209 19bf517b aurel32
    else if (n==64) {
1210 19bf517b aurel32
       GET_REGL(env->pc);
1211 19bf517b aurel32
    }
1212 19bf517b aurel32
    else {
1213 19bf517b aurel32
       GET_REGL(0);
1214 19bf517b aurel32
    }
1215 19bf517b aurel32
1216 19bf517b aurel32
    return 0;
1217 19bf517b aurel32
}
1218 19bf517b aurel32
1219 19bf517b aurel32
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1220 19bf517b aurel32
{
1221 19bf517b aurel32
    target_ulong tmp;
1222 19bf517b aurel32
    tmp = ldtul_p(mem_buf);
1223 19bf517b aurel32
1224 19bf517b aurel32
    if (n < 31) {
1225 19bf517b aurel32
        env->ir[n] = tmp;
1226 19bf517b aurel32
    }
1227 19bf517b aurel32
1228 19bf517b aurel32
    if (n > 31 && n < 63) {
1229 19bf517b aurel32
        env->fir[n - 32] = ldfl_p(mem_buf);
1230 19bf517b aurel32
    }
1231 19bf517b aurel32
1232 19bf517b aurel32
    if (n == 64 ) {
1233 19bf517b aurel32
       env->pc=tmp;
1234 19bf517b aurel32
    }
1235 19bf517b aurel32
1236 19bf517b aurel32
    return 8;
1237 19bf517b aurel32
}
1238 56aebc89 pbrook
#else
1239 56aebc89 pbrook
1240 56aebc89 pbrook
#define NUM_CORE_REGS 0
1241 56aebc89 pbrook
1242 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1243 f1ccf904 ths
{
1244 56aebc89 pbrook
    return 0;
1245 f1ccf904 ths
}
1246 f1ccf904 ths
1247 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1248 f1ccf904 ths
{
1249 56aebc89 pbrook
    return 0;
1250 56aebc89 pbrook
}
1251 f1ccf904 ths
1252 56aebc89 pbrook
#endif
1253 f1ccf904 ths
1254 56aebc89 pbrook
static int num_g_regs = NUM_CORE_REGS;
1255 f1ccf904 ths
1256 56aebc89 pbrook
#ifdef GDB_CORE_XML
1257 56aebc89 pbrook
/* Encode data using the encoding for 'x' packets.  */
1258 56aebc89 pbrook
static int memtox(char *buf, const char *mem, int len)
1259 56aebc89 pbrook
{
1260 56aebc89 pbrook
    char *p = buf;
1261 56aebc89 pbrook
    char c;
1262 56aebc89 pbrook
1263 56aebc89 pbrook
    while (len--) {
1264 56aebc89 pbrook
        c = *(mem++);
1265 56aebc89 pbrook
        switch (c) {
1266 56aebc89 pbrook
        case '#': case '$': case '*': case '}':
1267 56aebc89 pbrook
            *(p++) = '}';
1268 56aebc89 pbrook
            *(p++) = c ^ 0x20;
1269 56aebc89 pbrook
            break;
1270 56aebc89 pbrook
        default:
1271 56aebc89 pbrook
            *(p++) = c;
1272 56aebc89 pbrook
            break;
1273 56aebc89 pbrook
        }
1274 56aebc89 pbrook
    }
1275 56aebc89 pbrook
    return p - buf;
1276 56aebc89 pbrook
}
1277 f1ccf904 ths
1278 3faf778e aurel32
static const char *get_feature_xml(const char *p, const char **newp)
1279 56aebc89 pbrook
{
1280 56aebc89 pbrook
    extern const char *const xml_builtin[][2];
1281 56aebc89 pbrook
    size_t len;
1282 56aebc89 pbrook
    int i;
1283 56aebc89 pbrook
    const char *name;
1284 56aebc89 pbrook
    static char target_xml[1024];
1285 56aebc89 pbrook
1286 56aebc89 pbrook
    len = 0;
1287 56aebc89 pbrook
    while (p[len] && p[len] != ':')
1288 56aebc89 pbrook
        len++;
1289 56aebc89 pbrook
    *newp = p + len;
1290 56aebc89 pbrook
1291 56aebc89 pbrook
    name = NULL;
1292 56aebc89 pbrook
    if (strncmp(p, "target.xml", len) == 0) {
1293 56aebc89 pbrook
        /* Generate the XML description for this CPU.  */
1294 56aebc89 pbrook
        if (!target_xml[0]) {
1295 56aebc89 pbrook
            GDBRegisterState *r;
1296 56aebc89 pbrook
1297 5b3715bf blueswir1
            snprintf(target_xml, sizeof(target_xml),
1298 5b3715bf blueswir1
                     "<?xml version=\"1.0\"?>"
1299 5b3715bf blueswir1
                     "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1300 5b3715bf blueswir1
                     "<target>"
1301 5b3715bf blueswir1
                     "<xi:include href=\"%s\"/>",
1302 5b3715bf blueswir1
                     GDB_CORE_XML);
1303 56aebc89 pbrook
1304 880a7578 aliguori
            for (r = first_cpu->gdb_regs; r; r = r->next) {
1305 56aebc89 pbrook
                strcat(target_xml, "<xi:include href=\"");
1306 56aebc89 pbrook
                strcat(target_xml, r->xml);
1307 56aebc89 pbrook
                strcat(target_xml, "\"/>");
1308 56aebc89 pbrook
            }
1309 56aebc89 pbrook
            strcat(target_xml, "</target>");
1310 56aebc89 pbrook
        }
1311 56aebc89 pbrook
        return target_xml;
1312 56aebc89 pbrook
    }
1313 56aebc89 pbrook
    for (i = 0; ; i++) {
1314 56aebc89 pbrook
        name = xml_builtin[i][0];
1315 56aebc89 pbrook
        if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1316 56aebc89 pbrook
            break;
1317 56aebc89 pbrook
    }
1318 56aebc89 pbrook
    return name ? xml_builtin[i][1] : NULL;
1319 56aebc89 pbrook
}
1320 56aebc89 pbrook
#endif
1321 f1ccf904 ths
1322 56aebc89 pbrook
static int gdb_read_register(CPUState *env, uint8_t *mem_buf, int reg)
1323 56aebc89 pbrook
{
1324 56aebc89 pbrook
    GDBRegisterState *r;
1325 f1ccf904 ths
1326 56aebc89 pbrook
    if (reg < NUM_CORE_REGS)
1327 56aebc89 pbrook
        return cpu_gdb_read_register(env, mem_buf, reg);
1328 f1ccf904 ths
1329 56aebc89 pbrook
    for (r = env->gdb_regs; r; r = r->next) {
1330 56aebc89 pbrook
        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1331 56aebc89 pbrook
            return r->get_reg(env, mem_buf, reg - r->base_reg);
1332 56aebc89 pbrook
        }
1333 56aebc89 pbrook
    }
1334 56aebc89 pbrook
    return 0;
1335 f1ccf904 ths
}
1336 f1ccf904 ths
1337 56aebc89 pbrook
static int gdb_write_register(CPUState *env, uint8_t *mem_buf, int reg)
1338 f1ccf904 ths
{
1339 56aebc89 pbrook
    GDBRegisterState *r;
1340 f1ccf904 ths
1341 56aebc89 pbrook
    if (reg < NUM_CORE_REGS)
1342 56aebc89 pbrook
        return cpu_gdb_write_register(env, mem_buf, reg);
1343 56aebc89 pbrook
1344 56aebc89 pbrook
    for (r = env->gdb_regs; r; r = r->next) {
1345 56aebc89 pbrook
        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1346 56aebc89 pbrook
            return r->set_reg(env, mem_buf, reg - r->base_reg);
1347 56aebc89 pbrook
        }
1348 56aebc89 pbrook
    }
1349 6da41eaf bellard
    return 0;
1350 6da41eaf bellard
}
1351 6da41eaf bellard
1352 56aebc89 pbrook
/* Register a supplemental set of CPU registers.  If g_pos is nonzero it
1353 56aebc89 pbrook
   specifies the first register number and these registers are included in
1354 56aebc89 pbrook
   a standard "g" packet.  Direction is relative to gdb, i.e. get_reg is
1355 56aebc89 pbrook
   gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1356 56aebc89 pbrook
 */
1357 56aebc89 pbrook
1358 56aebc89 pbrook
void gdb_register_coprocessor(CPUState * env,
1359 56aebc89 pbrook
                             gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1360 56aebc89 pbrook
                             int num_regs, const char *xml, int g_pos)
1361 6da41eaf bellard
{
1362 56aebc89 pbrook
    GDBRegisterState *s;
1363 56aebc89 pbrook
    GDBRegisterState **p;
1364 56aebc89 pbrook
    static int last_reg = NUM_CORE_REGS;
1365 56aebc89 pbrook
1366 56aebc89 pbrook
    s = (GDBRegisterState *)qemu_mallocz(sizeof(GDBRegisterState));
1367 56aebc89 pbrook
    s->base_reg = last_reg;
1368 56aebc89 pbrook
    s->num_regs = num_regs;
1369 56aebc89 pbrook
    s->get_reg = get_reg;
1370 56aebc89 pbrook
    s->set_reg = set_reg;
1371 56aebc89 pbrook
    s->xml = xml;
1372 56aebc89 pbrook
    p = &env->gdb_regs;
1373 56aebc89 pbrook
    while (*p) {
1374 56aebc89 pbrook
        /* Check for duplicates.  */
1375 56aebc89 pbrook
        if (strcmp((*p)->xml, xml) == 0)
1376 56aebc89 pbrook
            return;
1377 56aebc89 pbrook
        p = &(*p)->next;
1378 56aebc89 pbrook
    }
1379 56aebc89 pbrook
    /* Add to end of list.  */
1380 56aebc89 pbrook
    last_reg += num_regs;
1381 56aebc89 pbrook
    *p = s;
1382 56aebc89 pbrook
    if (g_pos) {
1383 56aebc89 pbrook
        if (g_pos != s->base_reg) {
1384 56aebc89 pbrook
            fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1385 56aebc89 pbrook
                    "Expected %d got %d\n", xml, g_pos, s->base_reg);
1386 56aebc89 pbrook
        } else {
1387 56aebc89 pbrook
            num_g_regs = last_reg;
1388 56aebc89 pbrook
        }
1389 56aebc89 pbrook
    }
1390 6da41eaf bellard
}
1391 6da41eaf bellard
1392 a1d1bb31 aliguori
/* GDB breakpoint/watchpoint types */
1393 a1d1bb31 aliguori
#define GDB_BREAKPOINT_SW        0
1394 a1d1bb31 aliguori
#define GDB_BREAKPOINT_HW        1
1395 a1d1bb31 aliguori
#define GDB_WATCHPOINT_WRITE     2
1396 a1d1bb31 aliguori
#define GDB_WATCHPOINT_READ      3
1397 a1d1bb31 aliguori
#define GDB_WATCHPOINT_ACCESS    4
1398 a1d1bb31 aliguori
1399 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
1400 a1d1bb31 aliguori
static const int xlat_gdb_type[] = {
1401 a1d1bb31 aliguori
    [GDB_WATCHPOINT_WRITE]  = BP_GDB | BP_MEM_WRITE,
1402 a1d1bb31 aliguori
    [GDB_WATCHPOINT_READ]   = BP_GDB | BP_MEM_READ,
1403 a1d1bb31 aliguori
    [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1404 a1d1bb31 aliguori
};
1405 a1d1bb31 aliguori
#endif
1406 a1d1bb31 aliguori
1407 880a7578 aliguori
static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
1408 a1d1bb31 aliguori
{
1409 880a7578 aliguori
    CPUState *env;
1410 880a7578 aliguori
    int err = 0;
1411 880a7578 aliguori
1412 a1d1bb31 aliguori
    switch (type) {
1413 a1d1bb31 aliguori
    case GDB_BREAKPOINT_SW:
1414 a1d1bb31 aliguori
    case GDB_BREAKPOINT_HW:
1415 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1416 880a7578 aliguori
            err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1417 880a7578 aliguori
            if (err)
1418 880a7578 aliguori
                break;
1419 880a7578 aliguori
        }
1420 880a7578 aliguori
        return err;
1421 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
1422 a1d1bb31 aliguori
    case GDB_WATCHPOINT_WRITE:
1423 a1d1bb31 aliguori
    case GDB_WATCHPOINT_READ:
1424 a1d1bb31 aliguori
    case GDB_WATCHPOINT_ACCESS:
1425 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1426 880a7578 aliguori
            err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1427 880a7578 aliguori
                                        NULL);
1428 880a7578 aliguori
            if (err)
1429 880a7578 aliguori
                break;
1430 880a7578 aliguori
        }
1431 880a7578 aliguori
        return err;
1432 a1d1bb31 aliguori
#endif
1433 a1d1bb31 aliguori
    default:
1434 a1d1bb31 aliguori
        return -ENOSYS;
1435 a1d1bb31 aliguori
    }
1436 a1d1bb31 aliguori
}
1437 a1d1bb31 aliguori
1438 880a7578 aliguori
static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
1439 a1d1bb31 aliguori
{
1440 880a7578 aliguori
    CPUState *env;
1441 880a7578 aliguori
    int err = 0;
1442 880a7578 aliguori
1443 a1d1bb31 aliguori
    switch (type) {
1444 a1d1bb31 aliguori
    case GDB_BREAKPOINT_SW:
1445 a1d1bb31 aliguori
    case GDB_BREAKPOINT_HW:
1446 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1447 880a7578 aliguori
            err = cpu_breakpoint_remove(env, addr, BP_GDB);
1448 880a7578 aliguori
            if (err)
1449 880a7578 aliguori
                break;
1450 880a7578 aliguori
        }
1451 880a7578 aliguori
        return err;
1452 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
1453 a1d1bb31 aliguori
    case GDB_WATCHPOINT_WRITE:
1454 a1d1bb31 aliguori
    case GDB_WATCHPOINT_READ:
1455 a1d1bb31 aliguori
    case GDB_WATCHPOINT_ACCESS:
1456 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1457 880a7578 aliguori
            err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1458 880a7578 aliguori
            if (err)
1459 880a7578 aliguori
                break;
1460 880a7578 aliguori
        }
1461 880a7578 aliguori
        return err;
1462 a1d1bb31 aliguori
#endif
1463 a1d1bb31 aliguori
    default:
1464 a1d1bb31 aliguori
        return -ENOSYS;
1465 a1d1bb31 aliguori
    }
1466 a1d1bb31 aliguori
}
1467 a1d1bb31 aliguori
1468 880a7578 aliguori
static void gdb_breakpoint_remove_all(void)
1469 a1d1bb31 aliguori
{
1470 880a7578 aliguori
    CPUState *env;
1471 880a7578 aliguori
1472 880a7578 aliguori
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
1473 880a7578 aliguori
        cpu_breakpoint_remove_all(env, BP_GDB);
1474 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
1475 880a7578 aliguori
        cpu_watchpoint_remove_all(env, BP_GDB);
1476 a1d1bb31 aliguori
#endif
1477 880a7578 aliguori
    }
1478 a1d1bb31 aliguori
}
1479 a1d1bb31 aliguori
1480 880a7578 aliguori
static int gdb_handle_packet(GDBState *s, const char *line_buf)
1481 b4608c04 bellard
{
1482 880a7578 aliguori
    CPUState *env;
1483 b4608c04 bellard
    const char *p;
1484 880a7578 aliguori
    int ch, reg_size, type, res, thread;
1485 56aebc89 pbrook
    char buf[MAX_PACKET_LENGTH];
1486 56aebc89 pbrook
    uint8_t mem_buf[MAX_PACKET_LENGTH];
1487 56aebc89 pbrook
    uint8_t *registers;
1488 9d9754a3 bellard
    target_ulong addr, len;
1489 3b46e624 ths
1490 858693c6 bellard
#ifdef DEBUG_GDB
1491 858693c6 bellard
    printf("command='%s'\n", line_buf);
1492 858693c6 bellard
#endif
1493 858693c6 bellard
    p = line_buf;
1494 858693c6 bellard
    ch = *p++;
1495 858693c6 bellard
    switch(ch) {
1496 858693c6 bellard
    case '?':
1497 1fddef4b bellard
        /* TODO: Make this return the correct value for user-mode.  */
1498 ca587a8e aurel32
        snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
1499 880a7578 aliguori
                 s->c_cpu->cpu_index+1);
1500 858693c6 bellard
        put_packet(s, buf);
1501 7d03f82f edgar_igl
        /* Remove all the breakpoints when this query is issued,
1502 7d03f82f edgar_igl
         * because gdb is doing and initial connect and the state
1503 7d03f82f edgar_igl
         * should be cleaned up.
1504 7d03f82f edgar_igl
         */
1505 880a7578 aliguori
        gdb_breakpoint_remove_all();
1506 858693c6 bellard
        break;
1507 858693c6 bellard
    case 'c':
1508 858693c6 bellard
        if (*p != '\0') {
1509 9d9754a3 bellard
            addr = strtoull(p, (char **)&p, 16);
1510 4c3a88a2 bellard
#if defined(TARGET_I386)
1511 880a7578 aliguori
            s->c_cpu->eip = addr;
1512 5be1a8e0 bellard
#elif defined (TARGET_PPC)
1513 880a7578 aliguori
            s->c_cpu->nip = addr;
1514 8d5f07fa bellard
#elif defined (TARGET_SPARC)
1515 880a7578 aliguori
            s->c_cpu->pc = addr;
1516 880a7578 aliguori
            s->c_cpu->npc = addr + 4;
1517 b5ff1b31 bellard
#elif defined (TARGET_ARM)
1518 880a7578 aliguori
            s->c_cpu->regs[15] = addr;
1519 fdf9b3e8 bellard
#elif defined (TARGET_SH4)
1520 880a7578 aliguori
            s->c_cpu->pc = addr;
1521 8fac5803 ths
#elif defined (TARGET_MIPS)
1522 880a7578 aliguori
            s->c_cpu->active_tc.PC = addr;
1523 f1ccf904 ths
#elif defined (TARGET_CRIS)
1524 880a7578 aliguori
            s->c_cpu->pc = addr;
1525 19bf517b aurel32
#elif defined (TARGET_ALPHA)
1526 19bf517b aurel32
            s->c_cpu->pc = addr;
1527 4c3a88a2 bellard
#endif
1528 858693c6 bellard
        }
1529 ca587a8e aurel32
        s->signal = 0;
1530 ba70a624 edgar_igl
        gdb_continue(s);
1531 41625033 bellard
        return RS_IDLE;
1532 1f487ee9 edgar_igl
    case 'C':
1533 ca587a8e aurel32
        s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
1534 ca587a8e aurel32
        if (s->signal == -1)
1535 ca587a8e aurel32
            s->signal = 0;
1536 1f487ee9 edgar_igl
        gdb_continue(s);
1537 1f487ee9 edgar_igl
        return RS_IDLE;
1538 7d03f82f edgar_igl
    case 'k':
1539 7d03f82f edgar_igl
        /* Kill the target */
1540 7d03f82f edgar_igl
        fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
1541 7d03f82f edgar_igl
        exit(0);
1542 7d03f82f edgar_igl
    case 'D':
1543 7d03f82f edgar_igl
        /* Detach packet */
1544 880a7578 aliguori
        gdb_breakpoint_remove_all();
1545 7d03f82f edgar_igl
        gdb_continue(s);
1546 7d03f82f edgar_igl
        put_packet(s, "OK");
1547 7d03f82f edgar_igl
        break;
1548 858693c6 bellard
    case 's':
1549 858693c6 bellard
        if (*p != '\0') {
1550 8fac5803 ths
            addr = strtoull(p, (char **)&p, 16);
1551 c33a346e bellard
#if defined(TARGET_I386)
1552 880a7578 aliguori
            s->c_cpu->eip = addr;
1553 5be1a8e0 bellard
#elif defined (TARGET_PPC)
1554 880a7578 aliguori
            s->c_cpu->nip = addr;
1555 8d5f07fa bellard
#elif defined (TARGET_SPARC)
1556 880a7578 aliguori
            s->c_cpu->pc = addr;
1557 880a7578 aliguori
            s->c_cpu->npc = addr + 4;
1558 b5ff1b31 bellard
#elif defined (TARGET_ARM)
1559 880a7578 aliguori
            s->c_cpu->regs[15] = addr;
1560 fdf9b3e8 bellard
#elif defined (TARGET_SH4)
1561 880a7578 aliguori
            s->c_cpu->pc = addr;
1562 8fac5803 ths
#elif defined (TARGET_MIPS)
1563 880a7578 aliguori
            s->c_cpu->active_tc.PC = addr;
1564 f1ccf904 ths
#elif defined (TARGET_CRIS)
1565 880a7578 aliguori
            s->c_cpu->pc = addr;
1566 19bf517b aurel32
#elif defined (TARGET_ALPHA)
1567 19bf517b aurel32
            s->c_cpu->pc = addr;
1568 c33a346e bellard
#endif
1569 858693c6 bellard
        }
1570 880a7578 aliguori
        cpu_single_step(s->c_cpu, sstep_flags);
1571 ba70a624 edgar_igl
        gdb_continue(s);
1572 41625033 bellard
        return RS_IDLE;
1573 a2d1ebaf pbrook
    case 'F':
1574 a2d1ebaf pbrook
        {
1575 a2d1ebaf pbrook
            target_ulong ret;
1576 a2d1ebaf pbrook
            target_ulong err;
1577 a2d1ebaf pbrook
1578 a2d1ebaf pbrook
            ret = strtoull(p, (char **)&p, 16);
1579 a2d1ebaf pbrook
            if (*p == ',') {
1580 a2d1ebaf pbrook
                p++;
1581 a2d1ebaf pbrook
                err = strtoull(p, (char **)&p, 16);
1582 a2d1ebaf pbrook
            } else {
1583 a2d1ebaf pbrook
                err = 0;
1584 a2d1ebaf pbrook
            }
1585 a2d1ebaf pbrook
            if (*p == ',')
1586 a2d1ebaf pbrook
                p++;
1587 a2d1ebaf pbrook
            type = *p;
1588 a2d1ebaf pbrook
            if (gdb_current_syscall_cb)
1589 880a7578 aliguori
                gdb_current_syscall_cb(s->c_cpu, ret, err);
1590 a2d1ebaf pbrook
            if (type == 'C') {
1591 a2d1ebaf pbrook
                put_packet(s, "T02");
1592 a2d1ebaf pbrook
            } else {
1593 ba70a624 edgar_igl
                gdb_continue(s);
1594 a2d1ebaf pbrook
            }
1595 a2d1ebaf pbrook
        }
1596 a2d1ebaf pbrook
        break;
1597 858693c6 bellard
    case 'g':
1598 56aebc89 pbrook
        len = 0;
1599 56aebc89 pbrook
        for (addr = 0; addr < num_g_regs; addr++) {
1600 880a7578 aliguori
            reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
1601 56aebc89 pbrook
            len += reg_size;
1602 56aebc89 pbrook
        }
1603 56aebc89 pbrook
        memtohex(buf, mem_buf, len);
1604 858693c6 bellard
        put_packet(s, buf);
1605 858693c6 bellard
        break;
1606 858693c6 bellard
    case 'G':
1607 56aebc89 pbrook
        registers = mem_buf;
1608 858693c6 bellard
        len = strlen(p) / 2;
1609 858693c6 bellard
        hextomem((uint8_t *)registers, p, len);
1610 56aebc89 pbrook
        for (addr = 0; addr < num_g_regs && len > 0; addr++) {
1611 880a7578 aliguori
            reg_size = gdb_write_register(s->g_cpu, registers, addr);
1612 56aebc89 pbrook
            len -= reg_size;
1613 56aebc89 pbrook
            registers += reg_size;
1614 56aebc89 pbrook
        }
1615 858693c6 bellard
        put_packet(s, "OK");
1616 858693c6 bellard
        break;
1617 858693c6 bellard
    case 'm':
1618 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
1619 858693c6 bellard
        if (*p == ',')
1620 858693c6 bellard
            p++;
1621 9d9754a3 bellard
        len = strtoull(p, NULL, 16);
1622 880a7578 aliguori
        if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
1623 6f970bd9 bellard
            put_packet (s, "E14");
1624 6f970bd9 bellard
        } else {
1625 6f970bd9 bellard
            memtohex(buf, mem_buf, len);
1626 6f970bd9 bellard
            put_packet(s, buf);
1627 6f970bd9 bellard
        }
1628 858693c6 bellard
        break;
1629 858693c6 bellard
    case 'M':
1630 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
1631 858693c6 bellard
        if (*p == ',')
1632 858693c6 bellard
            p++;
1633 9d9754a3 bellard
        len = strtoull(p, (char **)&p, 16);
1634 b328f873 bellard
        if (*p == ':')
1635 858693c6 bellard
            p++;
1636 858693c6 bellard
        hextomem(mem_buf, p, len);
1637 880a7578 aliguori
        if (cpu_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0)
1638 905f20b1 bellard
            put_packet(s, "E14");
1639 858693c6 bellard
        else
1640 858693c6 bellard
            put_packet(s, "OK");
1641 858693c6 bellard
        break;
1642 56aebc89 pbrook
    case 'p':
1643 56aebc89 pbrook
        /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
1644 56aebc89 pbrook
           This works, but can be very slow.  Anything new enough to
1645 56aebc89 pbrook
           understand XML also knows how to use this properly.  */
1646 56aebc89 pbrook
        if (!gdb_has_xml)
1647 56aebc89 pbrook
            goto unknown_command;
1648 56aebc89 pbrook
        addr = strtoull(p, (char **)&p, 16);
1649 880a7578 aliguori
        reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
1650 56aebc89 pbrook
        if (reg_size) {
1651 56aebc89 pbrook
            memtohex(buf, mem_buf, reg_size);
1652 56aebc89 pbrook
            put_packet(s, buf);
1653 56aebc89 pbrook
        } else {
1654 56aebc89 pbrook
            put_packet(s, "E14");
1655 56aebc89 pbrook
        }
1656 56aebc89 pbrook
        break;
1657 56aebc89 pbrook
    case 'P':
1658 56aebc89 pbrook
        if (!gdb_has_xml)
1659 56aebc89 pbrook
            goto unknown_command;
1660 56aebc89 pbrook
        addr = strtoull(p, (char **)&p, 16);
1661 56aebc89 pbrook
        if (*p == '=')
1662 56aebc89 pbrook
            p++;
1663 56aebc89 pbrook
        reg_size = strlen(p) / 2;
1664 56aebc89 pbrook
        hextomem(mem_buf, p, reg_size);
1665 880a7578 aliguori
        gdb_write_register(s->g_cpu, mem_buf, addr);
1666 56aebc89 pbrook
        put_packet(s, "OK");
1667 56aebc89 pbrook
        break;
1668 858693c6 bellard
    case 'Z':
1669 858693c6 bellard
    case 'z':
1670 858693c6 bellard
        type = strtoul(p, (char **)&p, 16);
1671 858693c6 bellard
        if (*p == ',')
1672 858693c6 bellard
            p++;
1673 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
1674 858693c6 bellard
        if (*p == ',')
1675 858693c6 bellard
            p++;
1676 9d9754a3 bellard
        len = strtoull(p, (char **)&p, 16);
1677 a1d1bb31 aliguori
        if (ch == 'Z')
1678 880a7578 aliguori
            res = gdb_breakpoint_insert(addr, len, type);
1679 a1d1bb31 aliguori
        else
1680 880a7578 aliguori
            res = gdb_breakpoint_remove(addr, len, type);
1681 a1d1bb31 aliguori
        if (res >= 0)
1682 a1d1bb31 aliguori
             put_packet(s, "OK");
1683 a1d1bb31 aliguori
        else if (res == -ENOSYS)
1684 0f459d16 pbrook
            put_packet(s, "");
1685 a1d1bb31 aliguori
        else
1686 a1d1bb31 aliguori
            put_packet(s, "E22");
1687 858693c6 bellard
        break;
1688 880a7578 aliguori
    case 'H':
1689 880a7578 aliguori
        type = *p++;
1690 880a7578 aliguori
        thread = strtoull(p, (char **)&p, 16);
1691 880a7578 aliguori
        if (thread == -1 || thread == 0) {
1692 880a7578 aliguori
            put_packet(s, "OK");
1693 880a7578 aliguori
            break;
1694 880a7578 aliguori
        }
1695 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu)
1696 880a7578 aliguori
            if (env->cpu_index + 1 == thread)
1697 880a7578 aliguori
                break;
1698 880a7578 aliguori
        if (env == NULL) {
1699 880a7578 aliguori
            put_packet(s, "E22");
1700 880a7578 aliguori
            break;
1701 880a7578 aliguori
        }
1702 880a7578 aliguori
        switch (type) {
1703 880a7578 aliguori
        case 'c':
1704 880a7578 aliguori
            s->c_cpu = env;
1705 880a7578 aliguori
            put_packet(s, "OK");
1706 880a7578 aliguori
            break;
1707 880a7578 aliguori
        case 'g':
1708 880a7578 aliguori
            s->g_cpu = env;
1709 880a7578 aliguori
            put_packet(s, "OK");
1710 880a7578 aliguori
            break;
1711 880a7578 aliguori
        default:
1712 880a7578 aliguori
             put_packet(s, "E22");
1713 880a7578 aliguori
             break;
1714 880a7578 aliguori
        }
1715 880a7578 aliguori
        break;
1716 880a7578 aliguori
    case 'T':
1717 880a7578 aliguori
        thread = strtoull(p, (char **)&p, 16);
1718 880a7578 aliguori
#ifndef CONFIG_USER_ONLY
1719 880a7578 aliguori
        if (thread > 0 && thread < smp_cpus + 1)
1720 880a7578 aliguori
#else
1721 880a7578 aliguori
        if (thread == 1)
1722 880a7578 aliguori
#endif
1723 880a7578 aliguori
             put_packet(s, "OK");
1724 880a7578 aliguori
        else
1725 880a7578 aliguori
            put_packet(s, "E22");
1726 880a7578 aliguori
        break;
1727 978efd6a pbrook
    case 'q':
1728 60897d36 edgar_igl
    case 'Q':
1729 60897d36 edgar_igl
        /* parse any 'q' packets here */
1730 60897d36 edgar_igl
        if (!strcmp(p,"qemu.sstepbits")) {
1731 60897d36 edgar_igl
            /* Query Breakpoint bit definitions */
1732 363a37d5 blueswir1
            snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
1733 363a37d5 blueswir1
                     SSTEP_ENABLE,
1734 363a37d5 blueswir1
                     SSTEP_NOIRQ,
1735 363a37d5 blueswir1
                     SSTEP_NOTIMER);
1736 60897d36 edgar_igl
            put_packet(s, buf);
1737 60897d36 edgar_igl
            break;
1738 60897d36 edgar_igl
        } else if (strncmp(p,"qemu.sstep",10) == 0) {
1739 60897d36 edgar_igl
            /* Display or change the sstep_flags */
1740 60897d36 edgar_igl
            p += 10;
1741 60897d36 edgar_igl
            if (*p != '=') {
1742 60897d36 edgar_igl
                /* Display current setting */
1743 363a37d5 blueswir1
                snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
1744 60897d36 edgar_igl
                put_packet(s, buf);
1745 60897d36 edgar_igl
                break;
1746 60897d36 edgar_igl
            }
1747 60897d36 edgar_igl
            p++;
1748 60897d36 edgar_igl
            type = strtoul(p, (char **)&p, 16);
1749 60897d36 edgar_igl
            sstep_flags = type;
1750 60897d36 edgar_igl
            put_packet(s, "OK");
1751 60897d36 edgar_igl
            break;
1752 880a7578 aliguori
        } else if (strcmp(p,"C") == 0) {
1753 880a7578 aliguori
            /* "Current thread" remains vague in the spec, so always return
1754 880a7578 aliguori
             *  the first CPU (gdb returns the first thread). */
1755 880a7578 aliguori
            put_packet(s, "QC1");
1756 880a7578 aliguori
            break;
1757 880a7578 aliguori
        } else if (strcmp(p,"fThreadInfo") == 0) {
1758 880a7578 aliguori
            s->query_cpu = first_cpu;
1759 880a7578 aliguori
            goto report_cpuinfo;
1760 880a7578 aliguori
        } else if (strcmp(p,"sThreadInfo") == 0) {
1761 880a7578 aliguori
        report_cpuinfo:
1762 880a7578 aliguori
            if (s->query_cpu) {
1763 880a7578 aliguori
                snprintf(buf, sizeof(buf), "m%x", s->query_cpu->cpu_index+1);
1764 880a7578 aliguori
                put_packet(s, buf);
1765 880a7578 aliguori
                s->query_cpu = s->query_cpu->next_cpu;
1766 880a7578 aliguori
            } else
1767 880a7578 aliguori
                put_packet(s, "l");
1768 880a7578 aliguori
            break;
1769 880a7578 aliguori
        } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
1770 880a7578 aliguori
            thread = strtoull(p+16, (char **)&p, 16);
1771 880a7578 aliguori
            for (env = first_cpu; env != NULL; env = env->next_cpu)
1772 880a7578 aliguori
                if (env->cpu_index + 1 == thread) {
1773 880a7578 aliguori
                    len = snprintf((char *)mem_buf, sizeof(mem_buf),
1774 880a7578 aliguori
                                   "CPU#%d [%s]", env->cpu_index,
1775 880a7578 aliguori
                                   env->halted ? "halted " : "running");
1776 880a7578 aliguori
                    memtohex(buf, mem_buf, len);
1777 880a7578 aliguori
                    put_packet(s, buf);
1778 880a7578 aliguori
                    break;
1779 880a7578 aliguori
                }
1780 880a7578 aliguori
            break;
1781 60897d36 edgar_igl
        }
1782 60897d36 edgar_igl
#ifdef CONFIG_LINUX_USER
1783 60897d36 edgar_igl
        else if (strncmp(p, "Offsets", 7) == 0) {
1784 880a7578 aliguori
            TaskState *ts = s->c_cpu->opaque;
1785 978efd6a pbrook
1786 363a37d5 blueswir1
            snprintf(buf, sizeof(buf),
1787 363a37d5 blueswir1
                     "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
1788 363a37d5 blueswir1
                     ";Bss=" TARGET_ABI_FMT_lx,
1789 363a37d5 blueswir1
                     ts->info->code_offset,
1790 363a37d5 blueswir1
                     ts->info->data_offset,
1791 363a37d5 blueswir1
                     ts->info->data_offset);
1792 978efd6a pbrook
            put_packet(s, buf);
1793 978efd6a pbrook
            break;
1794 978efd6a pbrook
        }
1795 978efd6a pbrook
#endif
1796 56aebc89 pbrook
        if (strncmp(p, "Supported", 9) == 0) {
1797 5b3715bf blueswir1
            snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
1798 56aebc89 pbrook
#ifdef GDB_CORE_XML
1799 56aebc89 pbrook
            strcat(buf, ";qXfer:features:read+");
1800 56aebc89 pbrook
#endif
1801 56aebc89 pbrook
            put_packet(s, buf);
1802 56aebc89 pbrook
            break;
1803 56aebc89 pbrook
        }
1804 56aebc89 pbrook
#ifdef GDB_CORE_XML
1805 56aebc89 pbrook
        if (strncmp(p, "Xfer:features:read:", 19) == 0) {
1806 56aebc89 pbrook
            const char *xml;
1807 56aebc89 pbrook
            target_ulong total_len;
1808 56aebc89 pbrook
1809 56aebc89 pbrook
            gdb_has_xml = 1;
1810 56aebc89 pbrook
            p += 19;
1811 880a7578 aliguori
            xml = get_feature_xml(p, &p);
1812 56aebc89 pbrook
            if (!xml) {
1813 5b3715bf blueswir1
                snprintf(buf, sizeof(buf), "E00");
1814 56aebc89 pbrook
                put_packet(s, buf);
1815 56aebc89 pbrook
                break;
1816 56aebc89 pbrook
            }
1817 56aebc89 pbrook
1818 56aebc89 pbrook
            if (*p == ':')
1819 56aebc89 pbrook
                p++;
1820 56aebc89 pbrook
            addr = strtoul(p, (char **)&p, 16);
1821 56aebc89 pbrook
            if (*p == ',')
1822 56aebc89 pbrook
                p++;
1823 56aebc89 pbrook
            len = strtoul(p, (char **)&p, 16);
1824 56aebc89 pbrook
1825 56aebc89 pbrook
            total_len = strlen(xml);
1826 56aebc89 pbrook
            if (addr > total_len) {
1827 5b3715bf blueswir1
                snprintf(buf, sizeof(buf), "E00");
1828 56aebc89 pbrook
                put_packet(s, buf);
1829 56aebc89 pbrook
                break;
1830 56aebc89 pbrook
            }
1831 56aebc89 pbrook
            if (len > (MAX_PACKET_LENGTH - 5) / 2)
1832 56aebc89 pbrook
                len = (MAX_PACKET_LENGTH - 5) / 2;
1833 56aebc89 pbrook
            if (len < total_len - addr) {
1834 56aebc89 pbrook
                buf[0] = 'm';
1835 56aebc89 pbrook
                len = memtox(buf + 1, xml + addr, len);
1836 56aebc89 pbrook
            } else {
1837 56aebc89 pbrook
                buf[0] = 'l';
1838 56aebc89 pbrook
                len = memtox(buf + 1, xml + addr, total_len - addr);
1839 56aebc89 pbrook
            }
1840 56aebc89 pbrook
            put_packet_binary(s, buf, len + 1);
1841 56aebc89 pbrook
            break;
1842 56aebc89 pbrook
        }
1843 56aebc89 pbrook
#endif
1844 56aebc89 pbrook
        /* Unrecognised 'q' command.  */
1845 56aebc89 pbrook
        goto unknown_command;
1846 56aebc89 pbrook
1847 858693c6 bellard
    default:
1848 56aebc89 pbrook
    unknown_command:
1849 858693c6 bellard
        /* put empty packet */
1850 858693c6 bellard
        buf[0] = '\0';
1851 858693c6 bellard
        put_packet(s, buf);
1852 858693c6 bellard
        break;
1853 858693c6 bellard
    }
1854 858693c6 bellard
    return RS_IDLE;
1855 858693c6 bellard
}
1856 858693c6 bellard
1857 880a7578 aliguori
void gdb_set_stop_cpu(CPUState *env)
1858 880a7578 aliguori
{
1859 880a7578 aliguori
    gdbserver_state->c_cpu = env;
1860 880a7578 aliguori
    gdbserver_state->g_cpu = env;
1861 880a7578 aliguori
}
1862 880a7578 aliguori
1863 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
1864 858693c6 bellard
static void gdb_vm_stopped(void *opaque, int reason)
1865 858693c6 bellard
{
1866 880a7578 aliguori
    GDBState *s = gdbserver_state;
1867 880a7578 aliguori
    CPUState *env = s->c_cpu;
1868 858693c6 bellard
    char buf[256];
1869 d6fc1b39 aliguori
    const char *type;
1870 858693c6 bellard
    int ret;
1871 858693c6 bellard
1872 a2d1ebaf pbrook
    if (s->state == RS_SYSCALL)
1873 a2d1ebaf pbrook
        return;
1874 a2d1ebaf pbrook
1875 858693c6 bellard
    /* disable single step if it was enable */
1876 880a7578 aliguori
    cpu_single_step(env, 0);
1877 858693c6 bellard
1878 e80cfcfc bellard
    if (reason == EXCP_DEBUG) {
1879 880a7578 aliguori
        if (env->watchpoint_hit) {
1880 880a7578 aliguori
            switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
1881 a1d1bb31 aliguori
            case BP_MEM_READ:
1882 d6fc1b39 aliguori
                type = "r";
1883 d6fc1b39 aliguori
                break;
1884 a1d1bb31 aliguori
            case BP_MEM_ACCESS:
1885 d6fc1b39 aliguori
                type = "a";
1886 d6fc1b39 aliguori
                break;
1887 d6fc1b39 aliguori
            default:
1888 d6fc1b39 aliguori
                type = "";
1889 d6fc1b39 aliguori
                break;
1890 d6fc1b39 aliguori
            }
1891 880a7578 aliguori
            snprintf(buf, sizeof(buf),
1892 880a7578 aliguori
                     "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
1893 ca587a8e aurel32
                     GDB_SIGNAL_TRAP, env->cpu_index+1, type,
1894 880a7578 aliguori
                     env->watchpoint_hit->vaddr);
1895 6658ffb8 pbrook
            put_packet(s, buf);
1896 880a7578 aliguori
            env->watchpoint_hit = NULL;
1897 6658ffb8 pbrook
            return;
1898 6658ffb8 pbrook
        }
1899 880a7578 aliguori
        tb_flush(env);
1900 ca587a8e aurel32
        ret = GDB_SIGNAL_TRAP;
1901 bbeb7b5c bellard
    } else if (reason == EXCP_INTERRUPT) {
1902 ca587a8e aurel32
        ret = GDB_SIGNAL_INT;
1903 bbeb7b5c bellard
    } else {
1904 858693c6 bellard
        ret = 0;
1905 bbeb7b5c bellard
    }
1906 880a7578 aliguori
    snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, env->cpu_index+1);
1907 858693c6 bellard
    put_packet(s, buf);
1908 858693c6 bellard
}
1909 1fddef4b bellard
#endif
1910 858693c6 bellard
1911 a2d1ebaf pbrook
/* Send a gdb syscall request.
1912 a2d1ebaf pbrook
   This accepts limited printf-style format specifiers, specifically:
1913 a87295e8 pbrook
    %x  - target_ulong argument printed in hex.
1914 a87295e8 pbrook
    %lx - 64-bit argument printed in hex.
1915 a87295e8 pbrook
    %s  - string pointer (target_ulong) and length (int) pair.  */
1916 7ccfb2eb blueswir1
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
1917 a2d1ebaf pbrook
{
1918 a2d1ebaf pbrook
    va_list va;
1919 a2d1ebaf pbrook
    char buf[256];
1920 a2d1ebaf pbrook
    char *p;
1921 a2d1ebaf pbrook
    target_ulong addr;
1922 a87295e8 pbrook
    uint64_t i64;
1923 a2d1ebaf pbrook
    GDBState *s;
1924 a2d1ebaf pbrook
1925 880a7578 aliguori
    s = gdbserver_state;
1926 a2d1ebaf pbrook
    if (!s)
1927 a2d1ebaf pbrook
        return;
1928 a2d1ebaf pbrook
    gdb_current_syscall_cb = cb;
1929 a2d1ebaf pbrook
    s->state = RS_SYSCALL;
1930 a2d1ebaf pbrook
#ifndef CONFIG_USER_ONLY
1931 a2d1ebaf pbrook
    vm_stop(EXCP_DEBUG);
1932 a2d1ebaf pbrook
#endif
1933 a2d1ebaf pbrook
    s->state = RS_IDLE;
1934 a2d1ebaf pbrook
    va_start(va, fmt);
1935 a2d1ebaf pbrook
    p = buf;
1936 a2d1ebaf pbrook
    *(p++) = 'F';
1937 a2d1ebaf pbrook
    while (*fmt) {
1938 a2d1ebaf pbrook
        if (*fmt == '%') {
1939 a2d1ebaf pbrook
            fmt++;
1940 a2d1ebaf pbrook
            switch (*fmt++) {
1941 a2d1ebaf pbrook
            case 'x':
1942 a2d1ebaf pbrook
                addr = va_arg(va, target_ulong);
1943 363a37d5 blueswir1
                p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx, addr);
1944 a2d1ebaf pbrook
                break;
1945 a87295e8 pbrook
            case 'l':
1946 a87295e8 pbrook
                if (*(fmt++) != 'x')
1947 a87295e8 pbrook
                    goto bad_format;
1948 a87295e8 pbrook
                i64 = va_arg(va, uint64_t);
1949 363a37d5 blueswir1
                p += snprintf(p, &buf[sizeof(buf)] - p, "%" PRIx64, i64);
1950 a87295e8 pbrook
                break;
1951 a2d1ebaf pbrook
            case 's':
1952 a2d1ebaf pbrook
                addr = va_arg(va, target_ulong);
1953 363a37d5 blueswir1
                p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx "/%x",
1954 363a37d5 blueswir1
                              addr, va_arg(va, int));
1955 a2d1ebaf pbrook
                break;
1956 a2d1ebaf pbrook
            default:
1957 a87295e8 pbrook
            bad_format:
1958 a2d1ebaf pbrook
                fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1959 a2d1ebaf pbrook
                        fmt - 1);
1960 a2d1ebaf pbrook
                break;
1961 a2d1ebaf pbrook
            }
1962 a2d1ebaf pbrook
        } else {
1963 a2d1ebaf pbrook
            *(p++) = *(fmt++);
1964 a2d1ebaf pbrook
        }
1965 a2d1ebaf pbrook
    }
1966 8a93e02a pbrook
    *p = 0;
1967 a2d1ebaf pbrook
    va_end(va);
1968 a2d1ebaf pbrook
    put_packet(s, buf);
1969 a2d1ebaf pbrook
#ifdef CONFIG_USER_ONLY
1970 880a7578 aliguori
    gdb_handlesig(s->c_cpu, 0);
1971 a2d1ebaf pbrook
#else
1972 880a7578 aliguori
    cpu_interrupt(s->c_cpu, CPU_INTERRUPT_EXIT);
1973 a2d1ebaf pbrook
#endif
1974 a2d1ebaf pbrook
}
1975 a2d1ebaf pbrook
1976 6a00d601 bellard
static void gdb_read_byte(GDBState *s, int ch)
1977 858693c6 bellard
{
1978 858693c6 bellard
    int i, csum;
1979 60fe76f3 ths
    uint8_t reply;
1980 858693c6 bellard
1981 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
1982 4046d913 pbrook
    if (s->last_packet_len) {
1983 4046d913 pbrook
        /* Waiting for a response to the last packet.  If we see the start
1984 4046d913 pbrook
           of a new command then abandon the previous response.  */
1985 4046d913 pbrook
        if (ch == '-') {
1986 4046d913 pbrook
#ifdef DEBUG_GDB
1987 4046d913 pbrook
            printf("Got NACK, retransmitting\n");
1988 4046d913 pbrook
#endif
1989 ffe8ab83 ths
            put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
1990 4046d913 pbrook
        }
1991 4046d913 pbrook
#ifdef DEBUG_GDB
1992 4046d913 pbrook
        else if (ch == '+')
1993 4046d913 pbrook
            printf("Got ACK\n");
1994 4046d913 pbrook
        else
1995 4046d913 pbrook
            printf("Got '%c' when expecting ACK/NACK\n", ch);
1996 4046d913 pbrook
#endif
1997 4046d913 pbrook
        if (ch == '+' || ch == '$')
1998 4046d913 pbrook
            s->last_packet_len = 0;
1999 4046d913 pbrook
        if (ch != '$')
2000 4046d913 pbrook
            return;
2001 4046d913 pbrook
    }
2002 858693c6 bellard
    if (vm_running) {
2003 858693c6 bellard
        /* when the CPU is running, we cannot do anything except stop
2004 858693c6 bellard
           it when receiving a char */
2005 858693c6 bellard
        vm_stop(EXCP_INTERRUPT);
2006 5fafdf24 ths
    } else
2007 1fddef4b bellard
#endif
2008 41625033 bellard
    {
2009 858693c6 bellard
        switch(s->state) {
2010 858693c6 bellard
        case RS_IDLE:
2011 858693c6 bellard
            if (ch == '$') {
2012 858693c6 bellard
                s->line_buf_index = 0;
2013 858693c6 bellard
                s->state = RS_GETLINE;
2014 c33a346e bellard
            }
2015 b4608c04 bellard
            break;
2016 858693c6 bellard
        case RS_GETLINE:
2017 858693c6 bellard
            if (ch == '#') {
2018 858693c6 bellard
            s->state = RS_CHKSUM1;
2019 858693c6 bellard
            } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2020 858693c6 bellard
                s->state = RS_IDLE;
2021 4c3a88a2 bellard
            } else {
2022 858693c6 bellard
            s->line_buf[s->line_buf_index++] = ch;
2023 4c3a88a2 bellard
            }
2024 4c3a88a2 bellard
            break;
2025 858693c6 bellard
        case RS_CHKSUM1:
2026 858693c6 bellard
            s->line_buf[s->line_buf_index] = '\0';
2027 858693c6 bellard
            s->line_csum = fromhex(ch) << 4;
2028 858693c6 bellard
            s->state = RS_CHKSUM2;
2029 858693c6 bellard
            break;
2030 858693c6 bellard
        case RS_CHKSUM2:
2031 858693c6 bellard
            s->line_csum |= fromhex(ch);
2032 858693c6 bellard
            csum = 0;
2033 858693c6 bellard
            for(i = 0; i < s->line_buf_index; i++) {
2034 858693c6 bellard
                csum += s->line_buf[i];
2035 858693c6 bellard
            }
2036 858693c6 bellard
            if (s->line_csum != (csum & 0xff)) {
2037 60fe76f3 ths
                reply = '-';
2038 60fe76f3 ths
                put_buffer(s, &reply, 1);
2039 858693c6 bellard
                s->state = RS_IDLE;
2040 4c3a88a2 bellard
            } else {
2041 60fe76f3 ths
                reply = '+';
2042 60fe76f3 ths
                put_buffer(s, &reply, 1);
2043 880a7578 aliguori
                s->state = gdb_handle_packet(s, s->line_buf);
2044 4c3a88a2 bellard
            }
2045 4c3a88a2 bellard
            break;
2046 a2d1ebaf pbrook
        default:
2047 a2d1ebaf pbrook
            abort();
2048 858693c6 bellard
        }
2049 858693c6 bellard
    }
2050 858693c6 bellard
}
2051 858693c6 bellard
2052 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
2053 1fddef4b bellard
int
2054 ca587a8e aurel32
gdb_queuesig (void)
2055 ca587a8e aurel32
{
2056 ca587a8e aurel32
    GDBState *s;
2057 ca587a8e aurel32
2058 ca587a8e aurel32
    s = gdbserver_state;
2059 ca587a8e aurel32
2060 ca587a8e aurel32
    if (gdbserver_fd < 0 || s->fd < 0)
2061 ca587a8e aurel32
        return 0;
2062 ca587a8e aurel32
    else
2063 ca587a8e aurel32
        return 1;
2064 ca587a8e aurel32
}
2065 ca587a8e aurel32
2066 ca587a8e aurel32
int
2067 1fddef4b bellard
gdb_handlesig (CPUState *env, int sig)
2068 1fddef4b bellard
{
2069 1fddef4b bellard
  GDBState *s;
2070 1fddef4b bellard
  char buf[256];
2071 1fddef4b bellard
  int n;
2072 1fddef4b bellard
2073 880a7578 aliguori
  s = gdbserver_state;
2074 1f487ee9 edgar_igl
  if (gdbserver_fd < 0 || s->fd < 0)
2075 1f487ee9 edgar_igl
    return sig;
2076 1fddef4b bellard
2077 1fddef4b bellard
  /* disable single step if it was enabled */
2078 1fddef4b bellard
  cpu_single_step(env, 0);
2079 1fddef4b bellard
  tb_flush(env);
2080 1fddef4b bellard
2081 1fddef4b bellard
  if (sig != 0)
2082 1fddef4b bellard
    {
2083 ca587a8e aurel32
      snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb (sig));
2084 1fddef4b bellard
      put_packet(s, buf);
2085 1fddef4b bellard
    }
2086 1f487ee9 edgar_igl
  /* put_packet() might have detected that the peer terminated the 
2087 1f487ee9 edgar_igl
     connection.  */
2088 1f487ee9 edgar_igl
  if (s->fd < 0)
2089 1f487ee9 edgar_igl
      return sig;
2090 1fddef4b bellard
2091 1fddef4b bellard
  sig = 0;
2092 1fddef4b bellard
  s->state = RS_IDLE;
2093 41625033 bellard
  s->running_state = 0;
2094 41625033 bellard
  while (s->running_state == 0) {
2095 1fddef4b bellard
      n = read (s->fd, buf, 256);
2096 1fddef4b bellard
      if (n > 0)
2097 1fddef4b bellard
        {
2098 1fddef4b bellard
          int i;
2099 1fddef4b bellard
2100 1fddef4b bellard
          for (i = 0; i < n; i++)
2101 6a00d601 bellard
            gdb_read_byte (s, buf[i]);
2102 1fddef4b bellard
        }
2103 1fddef4b bellard
      else if (n == 0 || errno != EAGAIN)
2104 1fddef4b bellard
        {
2105 1fddef4b bellard
          /* XXX: Connection closed.  Should probably wait for annother
2106 1fddef4b bellard
             connection before continuing.  */
2107 1fddef4b bellard
          return sig;
2108 1fddef4b bellard
        }
2109 41625033 bellard
  }
2110 1f487ee9 edgar_igl
  sig = s->signal;
2111 1f487ee9 edgar_igl
  s->signal = 0;
2112 1fddef4b bellard
  return sig;
2113 1fddef4b bellard
}
2114 e9009676 bellard
2115 e9009676 bellard
/* Tell the remote gdb that the process has exited.  */
2116 e9009676 bellard
void gdb_exit(CPUState *env, int code)
2117 e9009676 bellard
{
2118 e9009676 bellard
  GDBState *s;
2119 e9009676 bellard
  char buf[4];
2120 e9009676 bellard
2121 880a7578 aliguori
  s = gdbserver_state;
2122 1f487ee9 edgar_igl
  if (gdbserver_fd < 0 || s->fd < 0)
2123 1f487ee9 edgar_igl
    return;
2124 e9009676 bellard
2125 e9009676 bellard
  snprintf(buf, sizeof(buf), "W%02x", code);
2126 e9009676 bellard
  put_packet(s, buf);
2127 e9009676 bellard
}
2128 e9009676 bellard
2129 ca587a8e aurel32
/* Tell the remote gdb that the process has exited due to SIG.  */
2130 ca587a8e aurel32
void gdb_signalled(CPUState *env, int sig)
2131 ca587a8e aurel32
{
2132 ca587a8e aurel32
  GDBState *s;
2133 ca587a8e aurel32
  char buf[4];
2134 ca587a8e aurel32
2135 ca587a8e aurel32
  s = gdbserver_state;
2136 ca587a8e aurel32
  if (gdbserver_fd < 0 || s->fd < 0)
2137 ca587a8e aurel32
    return;
2138 ca587a8e aurel32
2139 ca587a8e aurel32
  snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb (sig));
2140 ca587a8e aurel32
  put_packet(s, buf);
2141 ca587a8e aurel32
}
2142 1fddef4b bellard
2143 880a7578 aliguori
static void gdb_accept(void)
2144 858693c6 bellard
{
2145 858693c6 bellard
    GDBState *s;
2146 858693c6 bellard
    struct sockaddr_in sockaddr;
2147 858693c6 bellard
    socklen_t len;
2148 858693c6 bellard
    int val, fd;
2149 858693c6 bellard
2150 858693c6 bellard
    for(;;) {
2151 858693c6 bellard
        len = sizeof(sockaddr);
2152 858693c6 bellard
        fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2153 858693c6 bellard
        if (fd < 0 && errno != EINTR) {
2154 858693c6 bellard
            perror("accept");
2155 858693c6 bellard
            return;
2156 858693c6 bellard
        } else if (fd >= 0) {
2157 b4608c04 bellard
            break;
2158 b4608c04 bellard
        }
2159 b4608c04 bellard
    }
2160 858693c6 bellard
2161 858693c6 bellard
    /* set short latency */
2162 858693c6 bellard
    val = 1;
2163 8f447cc7 bellard
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
2164 3b46e624 ths
2165 880a7578 aliguori
    s = qemu_mallocz(sizeof(GDBState));
2166 880a7578 aliguori
    if (!s) {
2167 880a7578 aliguori
        errno = ENOMEM;
2168 880a7578 aliguori
        perror("accept");
2169 880a7578 aliguori
        return;
2170 880a7578 aliguori
    }
2171 880a7578 aliguori
2172 1fddef4b bellard
    memset (s, 0, sizeof (GDBState));
2173 880a7578 aliguori
    s->c_cpu = first_cpu;
2174 880a7578 aliguori
    s->g_cpu = first_cpu;
2175 858693c6 bellard
    s->fd = fd;
2176 56aebc89 pbrook
    gdb_has_xml = 0;
2177 858693c6 bellard
2178 880a7578 aliguori
    gdbserver_state = s;
2179 a2d1ebaf pbrook
2180 858693c6 bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
2181 858693c6 bellard
}
2182 858693c6 bellard
2183 858693c6 bellard
static int gdbserver_open(int port)
2184 858693c6 bellard
{
2185 858693c6 bellard
    struct sockaddr_in sockaddr;
2186 858693c6 bellard
    int fd, val, ret;
2187 858693c6 bellard
2188 858693c6 bellard
    fd = socket(PF_INET, SOCK_STREAM, 0);
2189 858693c6 bellard
    if (fd < 0) {
2190 858693c6 bellard
        perror("socket");
2191 858693c6 bellard
        return -1;
2192 858693c6 bellard
    }
2193 858693c6 bellard
2194 858693c6 bellard
    /* allow fast reuse */
2195 858693c6 bellard
    val = 1;
2196 8f447cc7 bellard
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
2197 858693c6 bellard
2198 858693c6 bellard
    sockaddr.sin_family = AF_INET;
2199 858693c6 bellard
    sockaddr.sin_port = htons(port);
2200 858693c6 bellard
    sockaddr.sin_addr.s_addr = 0;
2201 858693c6 bellard
    ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2202 858693c6 bellard
    if (ret < 0) {
2203 858693c6 bellard
        perror("bind");
2204 858693c6 bellard
        return -1;
2205 858693c6 bellard
    }
2206 858693c6 bellard
    ret = listen(fd, 0);
2207 858693c6 bellard
    if (ret < 0) {
2208 858693c6 bellard
        perror("listen");
2209 858693c6 bellard
        return -1;
2210 858693c6 bellard
    }
2211 858693c6 bellard
    return fd;
2212 858693c6 bellard
}
2213 858693c6 bellard
2214 858693c6 bellard
int gdbserver_start(int port)
2215 858693c6 bellard
{
2216 858693c6 bellard
    gdbserver_fd = gdbserver_open(port);
2217 858693c6 bellard
    if (gdbserver_fd < 0)
2218 858693c6 bellard
        return -1;
2219 858693c6 bellard
    /* accept connections */
2220 880a7578 aliguori
    gdb_accept();
2221 4046d913 pbrook
    return 0;
2222 4046d913 pbrook
}
2223 2b1319c8 aurel32
2224 2b1319c8 aurel32
/* Disable gdb stub for child processes.  */
2225 2b1319c8 aurel32
void gdbserver_fork(CPUState *env)
2226 2b1319c8 aurel32
{
2227 2b1319c8 aurel32
    GDBState *s = gdbserver_state;
2228 2b1319c8 aurel32
    if (s->fd < 0)
2229 2b1319c8 aurel32
      return;
2230 2b1319c8 aurel32
    close(s->fd);
2231 2b1319c8 aurel32
    s->fd = -1;
2232 2b1319c8 aurel32
    cpu_breakpoint_remove_all(env, BP_GDB);
2233 2b1319c8 aurel32
    cpu_watchpoint_remove_all(env, BP_GDB);
2234 2b1319c8 aurel32
}
2235 1fddef4b bellard
#else
2236 aa1f17c1 ths
static int gdb_chr_can_receive(void *opaque)
2237 4046d913 pbrook
{
2238 56aebc89 pbrook
  /* We can handle an arbitrarily large amount of data.
2239 56aebc89 pbrook
   Pick the maximum packet size, which is as good as anything.  */
2240 56aebc89 pbrook
  return MAX_PACKET_LENGTH;
2241 4046d913 pbrook
}
2242 4046d913 pbrook
2243 aa1f17c1 ths
static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
2244 4046d913 pbrook
{
2245 4046d913 pbrook
    int i;
2246 4046d913 pbrook
2247 4046d913 pbrook
    for (i = 0; i < size; i++) {
2248 880a7578 aliguori
        gdb_read_byte(gdbserver_state, buf[i]);
2249 4046d913 pbrook
    }
2250 4046d913 pbrook
}
2251 4046d913 pbrook
2252 4046d913 pbrook
static void gdb_chr_event(void *opaque, int event)
2253 4046d913 pbrook
{
2254 4046d913 pbrook
    switch (event) {
2255 4046d913 pbrook
    case CHR_EVENT_RESET:
2256 4046d913 pbrook
        vm_stop(EXCP_INTERRUPT);
2257 56aebc89 pbrook
        gdb_has_xml = 0;
2258 4046d913 pbrook
        break;
2259 4046d913 pbrook
    default:
2260 4046d913 pbrook
        break;
2261 4046d913 pbrook
    }
2262 4046d913 pbrook
}
2263 4046d913 pbrook
2264 cfc3475a pbrook
int gdbserver_start(const char *port)
2265 4046d913 pbrook
{
2266 4046d913 pbrook
    GDBState *s;
2267 cfc3475a pbrook
    char gdbstub_port_name[128];
2268 cfc3475a pbrook
    int port_num;
2269 cfc3475a pbrook
    char *p;
2270 cfc3475a pbrook
    CharDriverState *chr;
2271 cfc3475a pbrook
2272 cfc3475a pbrook
    if (!port || !*port)
2273 cfc3475a pbrook
      return -1;
2274 4046d913 pbrook
2275 cfc3475a pbrook
    port_num = strtol(port, &p, 10);
2276 cfc3475a pbrook
    if (*p == 0) {
2277 cfc3475a pbrook
        /* A numeric value is interpreted as a port number.  */
2278 cfc3475a pbrook
        snprintf(gdbstub_port_name, sizeof(gdbstub_port_name),
2279 cfc3475a pbrook
                 "tcp::%d,nowait,nodelay,server", port_num);
2280 cfc3475a pbrook
        port = gdbstub_port_name;
2281 cfc3475a pbrook
    }
2282 cfc3475a pbrook
2283 5ccfae10 aliguori
    chr = qemu_chr_open("gdb", port);
2284 4046d913 pbrook
    if (!chr)
2285 4046d913 pbrook
        return -1;
2286 4046d913 pbrook
2287 4046d913 pbrook
    s = qemu_mallocz(sizeof(GDBState));
2288 4046d913 pbrook
    if (!s) {
2289 4046d913 pbrook
        return -1;
2290 4046d913 pbrook
    }
2291 880a7578 aliguori
    s->c_cpu = first_cpu;
2292 880a7578 aliguori
    s->g_cpu = first_cpu;
2293 4046d913 pbrook
    s->chr = chr;
2294 880a7578 aliguori
    gdbserver_state = s;
2295 aa1f17c1 ths
    qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2296 880a7578 aliguori
                          gdb_chr_event, NULL);
2297 880a7578 aliguori
    qemu_add_vm_stop_handler(gdb_vm_stopped, NULL);
2298 b4608c04 bellard
    return 0;
2299 b4608c04 bellard
}
2300 4046d913 pbrook
#endif