Statistics
| Branch: | Revision:

root / gdbstub.c @ 17759187

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