Statistics
| Branch: | Revision:

root / gdbstub.c @ 23b96cdb

History | View | Annotate | Download (73.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 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 b4608c04 bellard
 */
19 978efd6a pbrook
#include "config.h"
20 56aebc89 pbrook
#include "qemu-common.h"
21 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
22 1fddef4b bellard
#include <stdlib.h>
23 1fddef4b bellard
#include <stdio.h>
24 1fddef4b bellard
#include <stdarg.h>
25 1fddef4b bellard
#include <string.h>
26 1fddef4b bellard
#include <errno.h>
27 1fddef4b bellard
#include <unistd.h>
28 978efd6a pbrook
#include <fcntl.h>
29 1fddef4b bellard
30 1fddef4b bellard
#include "qemu.h"
31 1fddef4b bellard
#else
32 8a34a0fb aliguori
#include "monitor.h"
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 2b41f10e Blue Swirl
#include "cpu.h"
41 8f447cc7 bellard
#include "qemu_socket.h"
42 e22a25c9 aliguori
#include "kvm.h"
43 ca587a8e aurel32
44 44520db1 Fabien Chouteau
#ifndef TARGET_CPU_MEMORY_RW_DEBUG
45 44520db1 Fabien Chouteau
static inline int target_memory_rw_debug(CPUState *env, target_ulong addr,
46 44520db1 Fabien Chouteau
                                         uint8_t *buf, int len, int is_write)
47 44520db1 Fabien Chouteau
{
48 44520db1 Fabien Chouteau
    return cpu_memory_rw_debug(env, addr, buf, len, is_write);
49 44520db1 Fabien Chouteau
}
50 44520db1 Fabien Chouteau
#else
51 44520db1 Fabien Chouteau
/* target_memory_rw_debug() defined in cpu.h */
52 44520db1 Fabien Chouteau
#endif
53 ca587a8e aurel32
54 ca587a8e aurel32
enum {
55 ca587a8e aurel32
    GDB_SIGNAL_0 = 0,
56 ca587a8e aurel32
    GDB_SIGNAL_INT = 2,
57 425189a8 Jan Kiszka
    GDB_SIGNAL_QUIT = 3,
58 ca587a8e aurel32
    GDB_SIGNAL_TRAP = 5,
59 425189a8 Jan Kiszka
    GDB_SIGNAL_ABRT = 6,
60 425189a8 Jan Kiszka
    GDB_SIGNAL_ALRM = 14,
61 425189a8 Jan Kiszka
    GDB_SIGNAL_IO = 23,
62 425189a8 Jan Kiszka
    GDB_SIGNAL_XCPU = 24,
63 ca587a8e aurel32
    GDB_SIGNAL_UNKNOWN = 143
64 ca587a8e aurel32
};
65 ca587a8e aurel32
66 ca587a8e aurel32
#ifdef CONFIG_USER_ONLY
67 ca587a8e aurel32
68 ca587a8e aurel32
/* Map target signal numbers to GDB protocol signal numbers and vice
69 ca587a8e aurel32
 * versa.  For user emulation's currently supported systems, we can
70 ca587a8e aurel32
 * assume most signals are defined.
71 ca587a8e aurel32
 */
72 ca587a8e aurel32
73 ca587a8e aurel32
static int gdb_signal_table[] = {
74 ca587a8e aurel32
    0,
75 ca587a8e aurel32
    TARGET_SIGHUP,
76 ca587a8e aurel32
    TARGET_SIGINT,
77 ca587a8e aurel32
    TARGET_SIGQUIT,
78 ca587a8e aurel32
    TARGET_SIGILL,
79 ca587a8e aurel32
    TARGET_SIGTRAP,
80 ca587a8e aurel32
    TARGET_SIGABRT,
81 ca587a8e aurel32
    -1, /* SIGEMT */
82 ca587a8e aurel32
    TARGET_SIGFPE,
83 ca587a8e aurel32
    TARGET_SIGKILL,
84 ca587a8e aurel32
    TARGET_SIGBUS,
85 ca587a8e aurel32
    TARGET_SIGSEGV,
86 ca587a8e aurel32
    TARGET_SIGSYS,
87 ca587a8e aurel32
    TARGET_SIGPIPE,
88 ca587a8e aurel32
    TARGET_SIGALRM,
89 ca587a8e aurel32
    TARGET_SIGTERM,
90 ca587a8e aurel32
    TARGET_SIGURG,
91 ca587a8e aurel32
    TARGET_SIGSTOP,
92 ca587a8e aurel32
    TARGET_SIGTSTP,
93 ca587a8e aurel32
    TARGET_SIGCONT,
94 ca587a8e aurel32
    TARGET_SIGCHLD,
95 ca587a8e aurel32
    TARGET_SIGTTIN,
96 ca587a8e aurel32
    TARGET_SIGTTOU,
97 ca587a8e aurel32
    TARGET_SIGIO,
98 ca587a8e aurel32
    TARGET_SIGXCPU,
99 ca587a8e aurel32
    TARGET_SIGXFSZ,
100 ca587a8e aurel32
    TARGET_SIGVTALRM,
101 ca587a8e aurel32
    TARGET_SIGPROF,
102 ca587a8e aurel32
    TARGET_SIGWINCH,
103 ca587a8e aurel32
    -1, /* SIGLOST */
104 ca587a8e aurel32
    TARGET_SIGUSR1,
105 ca587a8e aurel32
    TARGET_SIGUSR2,
106 c72d5bf8 blueswir1
#ifdef TARGET_SIGPWR
107 ca587a8e aurel32
    TARGET_SIGPWR,
108 c72d5bf8 blueswir1
#else
109 c72d5bf8 blueswir1
    -1,
110 c72d5bf8 blueswir1
#endif
111 ca587a8e aurel32
    -1, /* SIGPOLL */
112 ca587a8e aurel32
    -1,
113 ca587a8e aurel32
    -1,
114 ca587a8e aurel32
    -1,
115 ca587a8e aurel32
    -1,
116 ca587a8e aurel32
    -1,
117 ca587a8e aurel32
    -1,
118 ca587a8e aurel32
    -1,
119 ca587a8e aurel32
    -1,
120 ca587a8e aurel32
    -1,
121 ca587a8e aurel32
    -1,
122 ca587a8e aurel32
    -1,
123 c72d5bf8 blueswir1
#ifdef __SIGRTMIN
124 ca587a8e aurel32
    __SIGRTMIN + 1,
125 ca587a8e aurel32
    __SIGRTMIN + 2,
126 ca587a8e aurel32
    __SIGRTMIN + 3,
127 ca587a8e aurel32
    __SIGRTMIN + 4,
128 ca587a8e aurel32
    __SIGRTMIN + 5,
129 ca587a8e aurel32
    __SIGRTMIN + 6,
130 ca587a8e aurel32
    __SIGRTMIN + 7,
131 ca587a8e aurel32
    __SIGRTMIN + 8,
132 ca587a8e aurel32
    __SIGRTMIN + 9,
133 ca587a8e aurel32
    __SIGRTMIN + 10,
134 ca587a8e aurel32
    __SIGRTMIN + 11,
135 ca587a8e aurel32
    __SIGRTMIN + 12,
136 ca587a8e aurel32
    __SIGRTMIN + 13,
137 ca587a8e aurel32
    __SIGRTMIN + 14,
138 ca587a8e aurel32
    __SIGRTMIN + 15,
139 ca587a8e aurel32
    __SIGRTMIN + 16,
140 ca587a8e aurel32
    __SIGRTMIN + 17,
141 ca587a8e aurel32
    __SIGRTMIN + 18,
142 ca587a8e aurel32
    __SIGRTMIN + 19,
143 ca587a8e aurel32
    __SIGRTMIN + 20,
144 ca587a8e aurel32
    __SIGRTMIN + 21,
145 ca587a8e aurel32
    __SIGRTMIN + 22,
146 ca587a8e aurel32
    __SIGRTMIN + 23,
147 ca587a8e aurel32
    __SIGRTMIN + 24,
148 ca587a8e aurel32
    __SIGRTMIN + 25,
149 ca587a8e aurel32
    __SIGRTMIN + 26,
150 ca587a8e aurel32
    __SIGRTMIN + 27,
151 ca587a8e aurel32
    __SIGRTMIN + 28,
152 ca587a8e aurel32
    __SIGRTMIN + 29,
153 ca587a8e aurel32
    __SIGRTMIN + 30,
154 ca587a8e aurel32
    __SIGRTMIN + 31,
155 ca587a8e aurel32
    -1, /* SIGCANCEL */
156 ca587a8e aurel32
    __SIGRTMIN,
157 ca587a8e aurel32
    __SIGRTMIN + 32,
158 ca587a8e aurel32
    __SIGRTMIN + 33,
159 ca587a8e aurel32
    __SIGRTMIN + 34,
160 ca587a8e aurel32
    __SIGRTMIN + 35,
161 ca587a8e aurel32
    __SIGRTMIN + 36,
162 ca587a8e aurel32
    __SIGRTMIN + 37,
163 ca587a8e aurel32
    __SIGRTMIN + 38,
164 ca587a8e aurel32
    __SIGRTMIN + 39,
165 ca587a8e aurel32
    __SIGRTMIN + 40,
166 ca587a8e aurel32
    __SIGRTMIN + 41,
167 ca587a8e aurel32
    __SIGRTMIN + 42,
168 ca587a8e aurel32
    __SIGRTMIN + 43,
169 ca587a8e aurel32
    __SIGRTMIN + 44,
170 ca587a8e aurel32
    __SIGRTMIN + 45,
171 ca587a8e aurel32
    __SIGRTMIN + 46,
172 ca587a8e aurel32
    __SIGRTMIN + 47,
173 ca587a8e aurel32
    __SIGRTMIN + 48,
174 ca587a8e aurel32
    __SIGRTMIN + 49,
175 ca587a8e aurel32
    __SIGRTMIN + 50,
176 ca587a8e aurel32
    __SIGRTMIN + 51,
177 ca587a8e aurel32
    __SIGRTMIN + 52,
178 ca587a8e aurel32
    __SIGRTMIN + 53,
179 ca587a8e aurel32
    __SIGRTMIN + 54,
180 ca587a8e aurel32
    __SIGRTMIN + 55,
181 ca587a8e aurel32
    __SIGRTMIN + 56,
182 ca587a8e aurel32
    __SIGRTMIN + 57,
183 ca587a8e aurel32
    __SIGRTMIN + 58,
184 ca587a8e aurel32
    __SIGRTMIN + 59,
185 ca587a8e aurel32
    __SIGRTMIN + 60,
186 ca587a8e aurel32
    __SIGRTMIN + 61,
187 ca587a8e aurel32
    __SIGRTMIN + 62,
188 ca587a8e aurel32
    __SIGRTMIN + 63,
189 ca587a8e aurel32
    __SIGRTMIN + 64,
190 ca587a8e aurel32
    __SIGRTMIN + 65,
191 ca587a8e aurel32
    __SIGRTMIN + 66,
192 ca587a8e aurel32
    __SIGRTMIN + 67,
193 ca587a8e aurel32
    __SIGRTMIN + 68,
194 ca587a8e aurel32
    __SIGRTMIN + 69,
195 ca587a8e aurel32
    __SIGRTMIN + 70,
196 ca587a8e aurel32
    __SIGRTMIN + 71,
197 ca587a8e aurel32
    __SIGRTMIN + 72,
198 ca587a8e aurel32
    __SIGRTMIN + 73,
199 ca587a8e aurel32
    __SIGRTMIN + 74,
200 ca587a8e aurel32
    __SIGRTMIN + 75,
201 ca587a8e aurel32
    __SIGRTMIN + 76,
202 ca587a8e aurel32
    __SIGRTMIN + 77,
203 ca587a8e aurel32
    __SIGRTMIN + 78,
204 ca587a8e aurel32
    __SIGRTMIN + 79,
205 ca587a8e aurel32
    __SIGRTMIN + 80,
206 ca587a8e aurel32
    __SIGRTMIN + 81,
207 ca587a8e aurel32
    __SIGRTMIN + 82,
208 ca587a8e aurel32
    __SIGRTMIN + 83,
209 ca587a8e aurel32
    __SIGRTMIN + 84,
210 ca587a8e aurel32
    __SIGRTMIN + 85,
211 ca587a8e aurel32
    __SIGRTMIN + 86,
212 ca587a8e aurel32
    __SIGRTMIN + 87,
213 ca587a8e aurel32
    __SIGRTMIN + 88,
214 ca587a8e aurel32
    __SIGRTMIN + 89,
215 ca587a8e aurel32
    __SIGRTMIN + 90,
216 ca587a8e aurel32
    __SIGRTMIN + 91,
217 ca587a8e aurel32
    __SIGRTMIN + 92,
218 ca587a8e aurel32
    __SIGRTMIN + 93,
219 ca587a8e aurel32
    __SIGRTMIN + 94,
220 ca587a8e aurel32
    __SIGRTMIN + 95,
221 ca587a8e aurel32
    -1, /* SIGINFO */
222 ca587a8e aurel32
    -1, /* UNKNOWN */
223 ca587a8e aurel32
    -1, /* DEFAULT */
224 ca587a8e aurel32
    -1,
225 ca587a8e aurel32
    -1,
226 ca587a8e aurel32
    -1,
227 ca587a8e aurel32
    -1,
228 ca587a8e aurel32
    -1,
229 ca587a8e aurel32
    -1
230 c72d5bf8 blueswir1
#endif
231 ca587a8e aurel32
};
232 8f447cc7 bellard
#else
233 ca587a8e aurel32
/* In system mode we only need SIGINT and SIGTRAP; other signals
234 ca587a8e aurel32
   are not yet supported.  */
235 ca587a8e aurel32
236 ca587a8e aurel32
enum {
237 ca587a8e aurel32
    TARGET_SIGINT = 2,
238 ca587a8e aurel32
    TARGET_SIGTRAP = 5
239 ca587a8e aurel32
};
240 ca587a8e aurel32
241 ca587a8e aurel32
static int gdb_signal_table[] = {
242 ca587a8e aurel32
    -1,
243 ca587a8e aurel32
    -1,
244 ca587a8e aurel32
    TARGET_SIGINT,
245 ca587a8e aurel32
    -1,
246 ca587a8e aurel32
    -1,
247 ca587a8e aurel32
    TARGET_SIGTRAP
248 ca587a8e aurel32
};
249 ca587a8e aurel32
#endif
250 ca587a8e aurel32
251 ca587a8e aurel32
#ifdef CONFIG_USER_ONLY
252 ca587a8e aurel32
static int target_signal_to_gdb (int sig)
253 ca587a8e aurel32
{
254 ca587a8e aurel32
    int i;
255 ca587a8e aurel32
    for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
256 ca587a8e aurel32
        if (gdb_signal_table[i] == sig)
257 ca587a8e aurel32
            return i;
258 ca587a8e aurel32
    return GDB_SIGNAL_UNKNOWN;
259 ca587a8e aurel32
}
260 8f447cc7 bellard
#endif
261 b4608c04 bellard
262 ca587a8e aurel32
static int gdb_signal_to_target (int sig)
263 ca587a8e aurel32
{
264 ca587a8e aurel32
    if (sig < ARRAY_SIZE (gdb_signal_table))
265 ca587a8e aurel32
        return gdb_signal_table[sig];
266 ca587a8e aurel32
    else
267 ca587a8e aurel32
        return -1;
268 ca587a8e aurel32
}
269 ca587a8e aurel32
270 4abe615b bellard
//#define DEBUG_GDB
271 b4608c04 bellard
272 56aebc89 pbrook
typedef struct GDBRegisterState {
273 56aebc89 pbrook
    int base_reg;
274 56aebc89 pbrook
    int num_regs;
275 56aebc89 pbrook
    gdb_reg_cb get_reg;
276 56aebc89 pbrook
    gdb_reg_cb set_reg;
277 56aebc89 pbrook
    const char *xml;
278 56aebc89 pbrook
    struct GDBRegisterState *next;
279 56aebc89 pbrook
} GDBRegisterState;
280 56aebc89 pbrook
281 858693c6 bellard
enum RSState {
282 36556b20 aliguori
    RS_INACTIVE,
283 858693c6 bellard
    RS_IDLE,
284 858693c6 bellard
    RS_GETLINE,
285 858693c6 bellard
    RS_CHKSUM1,
286 858693c6 bellard
    RS_CHKSUM2,
287 a2d1ebaf pbrook
    RS_SYSCALL,
288 858693c6 bellard
};
289 858693c6 bellard
typedef struct GDBState {
290 880a7578 aliguori
    CPUState *c_cpu; /* current CPU for step/continue ops */
291 880a7578 aliguori
    CPUState *g_cpu; /* current CPU for other ops */
292 880a7578 aliguori
    CPUState *query_cpu; /* for q{f|s}ThreadInfo */
293 41625033 bellard
    enum RSState state; /* parsing state */
294 56aebc89 pbrook
    char line_buf[MAX_PACKET_LENGTH];
295 858693c6 bellard
    int line_buf_index;
296 858693c6 bellard
    int line_csum;
297 56aebc89 pbrook
    uint8_t last_packet[MAX_PACKET_LENGTH + 4];
298 4046d913 pbrook
    int last_packet_len;
299 1f487ee9 edgar_igl
    int signal;
300 41625033 bellard
#ifdef CONFIG_USER_ONLY
301 4046d913 pbrook
    int fd;
302 41625033 bellard
    int running_state;
303 4046d913 pbrook
#else
304 4046d913 pbrook
    CharDriverState *chr;
305 8a34a0fb aliguori
    CharDriverState *mon_chr;
306 41625033 bellard
#endif
307 858693c6 bellard
} GDBState;
308 b4608c04 bellard
309 60897d36 edgar_igl
/* By default use no IRQs and no timers while single stepping so as to
310 60897d36 edgar_igl
 * make single stepping like an ICE HW step.
311 60897d36 edgar_igl
 */
312 60897d36 edgar_igl
static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
313 60897d36 edgar_igl
314 880a7578 aliguori
static GDBState *gdbserver_state;
315 880a7578 aliguori
316 56aebc89 pbrook
/* This is an ugly hack to cope with both new and old gdb.
317 56aebc89 pbrook
   If gdb sends qXfer:features:read then assume we're talking to a newish
318 56aebc89 pbrook
   gdb that understands target descriptions.  */
319 56aebc89 pbrook
static int gdb_has_xml;
320 56aebc89 pbrook
321 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
322 4046d913 pbrook
/* XXX: This is not thread safe.  Do we care?  */
323 4046d913 pbrook
static int gdbserver_fd = -1;
324 4046d913 pbrook
325 858693c6 bellard
static int get_char(GDBState *s)
326 b4608c04 bellard
{
327 b4608c04 bellard
    uint8_t ch;
328 b4608c04 bellard
    int ret;
329 b4608c04 bellard
330 b4608c04 bellard
    for(;;) {
331 00aa0040 Blue Swirl
        ret = qemu_recv(s->fd, &ch, 1, 0);
332 b4608c04 bellard
        if (ret < 0) {
333 1f487ee9 edgar_igl
            if (errno == ECONNRESET)
334 1f487ee9 edgar_igl
                s->fd = -1;
335 b4608c04 bellard
            if (errno != EINTR && errno != EAGAIN)
336 b4608c04 bellard
                return -1;
337 b4608c04 bellard
        } else if (ret == 0) {
338 1f487ee9 edgar_igl
            close(s->fd);
339 1f487ee9 edgar_igl
            s->fd = -1;
340 b4608c04 bellard
            return -1;
341 b4608c04 bellard
        } else {
342 b4608c04 bellard
            break;
343 b4608c04 bellard
        }
344 b4608c04 bellard
    }
345 b4608c04 bellard
    return ch;
346 b4608c04 bellard
}
347 4046d913 pbrook
#endif
348 b4608c04 bellard
349 a2d1ebaf pbrook
static gdb_syscall_complete_cb gdb_current_syscall_cb;
350 a2d1ebaf pbrook
351 654efcf3 blueswir1
static enum {
352 a2d1ebaf pbrook
    GDB_SYS_UNKNOWN,
353 a2d1ebaf pbrook
    GDB_SYS_ENABLED,
354 a2d1ebaf pbrook
    GDB_SYS_DISABLED,
355 a2d1ebaf pbrook
} gdb_syscall_mode;
356 a2d1ebaf pbrook
357 a2d1ebaf pbrook
/* If gdb is connected when the first semihosting syscall occurs then use
358 a2d1ebaf pbrook
   remote gdb syscalls.  Otherwise use native file IO.  */
359 a2d1ebaf pbrook
int use_gdb_syscalls(void)
360 a2d1ebaf pbrook
{
361 a2d1ebaf pbrook
    if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
362 880a7578 aliguori
        gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
363 880a7578 aliguori
                                            : GDB_SYS_DISABLED);
364 a2d1ebaf pbrook
    }
365 a2d1ebaf pbrook
    return gdb_syscall_mode == GDB_SYS_ENABLED;
366 a2d1ebaf pbrook
}
367 a2d1ebaf pbrook
368 ba70a624 edgar_igl
/* Resume execution.  */
369 ba70a624 edgar_igl
static inline void gdb_continue(GDBState *s)
370 ba70a624 edgar_igl
{
371 ba70a624 edgar_igl
#ifdef CONFIG_USER_ONLY
372 ba70a624 edgar_igl
    s->running_state = 1;
373 ba70a624 edgar_igl
#else
374 ba70a624 edgar_igl
    vm_start();
375 ba70a624 edgar_igl
#endif
376 ba70a624 edgar_igl
}
377 ba70a624 edgar_igl
378 858693c6 bellard
static void put_buffer(GDBState *s, const uint8_t *buf, int len)
379 b4608c04 bellard
{
380 4046d913 pbrook
#ifdef CONFIG_USER_ONLY
381 b4608c04 bellard
    int ret;
382 b4608c04 bellard
383 b4608c04 bellard
    while (len > 0) {
384 8f447cc7 bellard
        ret = send(s->fd, buf, len, 0);
385 b4608c04 bellard
        if (ret < 0) {
386 b4608c04 bellard
            if (errno != EINTR && errno != EAGAIN)
387 b4608c04 bellard
                return;
388 b4608c04 bellard
        } else {
389 b4608c04 bellard
            buf += ret;
390 b4608c04 bellard
            len -= ret;
391 b4608c04 bellard
        }
392 b4608c04 bellard
    }
393 4046d913 pbrook
#else
394 2cc6e0a1 Anthony Liguori
    qemu_chr_fe_write(s->chr, buf, len);
395 4046d913 pbrook
#endif
396 b4608c04 bellard
}
397 b4608c04 bellard
398 b4608c04 bellard
static inline int fromhex(int v)
399 b4608c04 bellard
{
400 b4608c04 bellard
    if (v >= '0' && v <= '9')
401 b4608c04 bellard
        return v - '0';
402 b4608c04 bellard
    else if (v >= 'A' && v <= 'F')
403 b4608c04 bellard
        return v - 'A' + 10;
404 b4608c04 bellard
    else if (v >= 'a' && v <= 'f')
405 b4608c04 bellard
        return v - 'a' + 10;
406 b4608c04 bellard
    else
407 b4608c04 bellard
        return 0;
408 b4608c04 bellard
}
409 b4608c04 bellard
410 b4608c04 bellard
static inline int tohex(int v)
411 b4608c04 bellard
{
412 b4608c04 bellard
    if (v < 10)
413 b4608c04 bellard
        return v + '0';
414 b4608c04 bellard
    else
415 b4608c04 bellard
        return v - 10 + 'a';
416 b4608c04 bellard
}
417 b4608c04 bellard
418 b4608c04 bellard
static void memtohex(char *buf, const uint8_t *mem, int len)
419 b4608c04 bellard
{
420 b4608c04 bellard
    int i, c;
421 b4608c04 bellard
    char *q;
422 b4608c04 bellard
    q = buf;
423 b4608c04 bellard
    for(i = 0; i < len; i++) {
424 b4608c04 bellard
        c = mem[i];
425 b4608c04 bellard
        *q++ = tohex(c >> 4);
426 b4608c04 bellard
        *q++ = tohex(c & 0xf);
427 b4608c04 bellard
    }
428 b4608c04 bellard
    *q = '\0';
429 b4608c04 bellard
}
430 b4608c04 bellard
431 b4608c04 bellard
static void hextomem(uint8_t *mem, const char *buf, int len)
432 b4608c04 bellard
{
433 b4608c04 bellard
    int i;
434 b4608c04 bellard
435 b4608c04 bellard
    for(i = 0; i < len; i++) {
436 b4608c04 bellard
        mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
437 b4608c04 bellard
        buf += 2;
438 b4608c04 bellard
    }
439 b4608c04 bellard
}
440 b4608c04 bellard
441 b4608c04 bellard
/* return -1 if error, 0 if OK */
442 56aebc89 pbrook
static int put_packet_binary(GDBState *s, const char *buf, int len)
443 b4608c04 bellard
{
444 56aebc89 pbrook
    int csum, i;
445 60fe76f3 ths
    uint8_t *p;
446 b4608c04 bellard
447 b4608c04 bellard
    for(;;) {
448 4046d913 pbrook
        p = s->last_packet;
449 4046d913 pbrook
        *(p++) = '$';
450 4046d913 pbrook
        memcpy(p, buf, len);
451 4046d913 pbrook
        p += len;
452 b4608c04 bellard
        csum = 0;
453 b4608c04 bellard
        for(i = 0; i < len; i++) {
454 b4608c04 bellard
            csum += buf[i];
455 b4608c04 bellard
        }
456 4046d913 pbrook
        *(p++) = '#';
457 4046d913 pbrook
        *(p++) = tohex((csum >> 4) & 0xf);
458 4046d913 pbrook
        *(p++) = tohex((csum) & 0xf);
459 b4608c04 bellard
460 4046d913 pbrook
        s->last_packet_len = p - s->last_packet;
461 ffe8ab83 ths
        put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
462 b4608c04 bellard
463 4046d913 pbrook
#ifdef CONFIG_USER_ONLY
464 4046d913 pbrook
        i = get_char(s);
465 4046d913 pbrook
        if (i < 0)
466 b4608c04 bellard
            return -1;
467 4046d913 pbrook
        if (i == '+')
468 b4608c04 bellard
            break;
469 4046d913 pbrook
#else
470 4046d913 pbrook
        break;
471 4046d913 pbrook
#endif
472 b4608c04 bellard
    }
473 b4608c04 bellard
    return 0;
474 b4608c04 bellard
}
475 b4608c04 bellard
476 56aebc89 pbrook
/* return -1 if error, 0 if OK */
477 56aebc89 pbrook
static int put_packet(GDBState *s, const char *buf)
478 56aebc89 pbrook
{
479 56aebc89 pbrook
#ifdef DEBUG_GDB
480 56aebc89 pbrook
    printf("reply='%s'\n", buf);
481 56aebc89 pbrook
#endif
482 79808573 bellard
483 56aebc89 pbrook
    return put_packet_binary(s, buf, strlen(buf));
484 56aebc89 pbrook
}
485 56aebc89 pbrook
486 56aebc89 pbrook
/* The GDB remote protocol transfers values in target byte order.  This means
487 56aebc89 pbrook
   we can use the raw memory access routines to access the value buffer.
488 56aebc89 pbrook
   Conveniently, these also handle the case where the buffer is mis-aligned.
489 56aebc89 pbrook
 */
490 56aebc89 pbrook
#define GET_REG8(val) do { \
491 56aebc89 pbrook
    stb_p(mem_buf, val); \
492 56aebc89 pbrook
    return 1; \
493 56aebc89 pbrook
    } while(0)
494 56aebc89 pbrook
#define GET_REG16(val) do { \
495 56aebc89 pbrook
    stw_p(mem_buf, val); \
496 56aebc89 pbrook
    return 2; \
497 56aebc89 pbrook
    } while(0)
498 56aebc89 pbrook
#define GET_REG32(val) do { \
499 56aebc89 pbrook
    stl_p(mem_buf, val); \
500 56aebc89 pbrook
    return 4; \
501 56aebc89 pbrook
    } while(0)
502 56aebc89 pbrook
#define GET_REG64(val) do { \
503 56aebc89 pbrook
    stq_p(mem_buf, val); \
504 56aebc89 pbrook
    return 8; \
505 56aebc89 pbrook
    } while(0)
506 56aebc89 pbrook
507 56aebc89 pbrook
#if TARGET_LONG_BITS == 64
508 56aebc89 pbrook
#define GET_REGL(val) GET_REG64(val)
509 56aebc89 pbrook
#define ldtul_p(addr) ldq_p(addr)
510 56aebc89 pbrook
#else
511 56aebc89 pbrook
#define GET_REGL(val) GET_REG32(val)
512 56aebc89 pbrook
#define ldtul_p(addr) ldl_p(addr)
513 79808573 bellard
#endif
514 79808573 bellard
515 56aebc89 pbrook
#if defined(TARGET_I386)
516 5ad265ee balrog
517 5ad265ee balrog
#ifdef TARGET_X86_64
518 56aebc89 pbrook
static const int gpr_map[16] = {
519 56aebc89 pbrook
    R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
520 56aebc89 pbrook
    8, 9, 10, 11, 12, 13, 14, 15
521 56aebc89 pbrook
};
522 79808573 bellard
#else
523 5f30fa18 Jan Kiszka
#define gpr_map gpr_map32
524 79808573 bellard
#endif
525 5f30fa18 Jan Kiszka
static const int gpr_map32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
526 79808573 bellard
527 56aebc89 pbrook
#define NUM_CORE_REGS (CPU_NB_REGS * 2 + 25)
528 56aebc89 pbrook
529 b1631e7a Jan Kiszka
#define IDX_IP_REG      CPU_NB_REGS
530 b1631e7a Jan Kiszka
#define IDX_FLAGS_REG   (IDX_IP_REG + 1)
531 b1631e7a Jan Kiszka
#define IDX_SEG_REGS    (IDX_FLAGS_REG + 1)
532 b1631e7a Jan Kiszka
#define IDX_FP_REGS     (IDX_SEG_REGS + 6)
533 b1631e7a Jan Kiszka
#define IDX_XMM_REGS    (IDX_FP_REGS + 16)
534 b1631e7a Jan Kiszka
#define IDX_MXCSR_REG   (IDX_XMM_REGS + CPU_NB_REGS)
535 b1631e7a Jan Kiszka
536 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
537 79808573 bellard
{
538 56aebc89 pbrook
    if (n < CPU_NB_REGS) {
539 5f30fa18 Jan Kiszka
        if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
540 5f30fa18 Jan Kiszka
            GET_REG64(env->regs[gpr_map[n]]);
541 5f30fa18 Jan Kiszka
        } else if (n < CPU_NB_REGS32) {
542 5f30fa18 Jan Kiszka
            GET_REG32(env->regs[gpr_map32[n]]);
543 5f30fa18 Jan Kiszka
        }
544 b1631e7a Jan Kiszka
    } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
545 56aebc89 pbrook
#ifdef USE_X86LDOUBLE
546 b1631e7a Jan Kiszka
        /* FIXME: byteswap float values - after fixing fpregs layout. */
547 b1631e7a Jan Kiszka
        memcpy(mem_buf, &env->fpregs[n - IDX_FP_REGS], 10);
548 79808573 bellard
#else
549 56aebc89 pbrook
        memset(mem_buf, 0, 10);
550 79808573 bellard
#endif
551 56aebc89 pbrook
        return 10;
552 b1631e7a Jan Kiszka
    } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
553 b1631e7a Jan Kiszka
        n -= IDX_XMM_REGS;
554 5f30fa18 Jan Kiszka
        if (n < CPU_NB_REGS32 ||
555 5f30fa18 Jan Kiszka
            (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
556 5f30fa18 Jan Kiszka
            stq_p(mem_buf, env->xmm_regs[n].XMM_Q(0));
557 5f30fa18 Jan Kiszka
            stq_p(mem_buf + 8, env->xmm_regs[n].XMM_Q(1));
558 5f30fa18 Jan Kiszka
            return 16;
559 5f30fa18 Jan Kiszka
        }
560 56aebc89 pbrook
    } else {
561 56aebc89 pbrook
        switch (n) {
562 5f30fa18 Jan Kiszka
        case IDX_IP_REG:
563 5f30fa18 Jan Kiszka
            if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
564 5f30fa18 Jan Kiszka
                GET_REG64(env->eip);
565 5f30fa18 Jan Kiszka
            } else {
566 5f30fa18 Jan Kiszka
                GET_REG32(env->eip);
567 5f30fa18 Jan Kiszka
            }
568 b1631e7a Jan Kiszka
        case IDX_FLAGS_REG: GET_REG32(env->eflags);
569 b1631e7a Jan Kiszka
570 b1631e7a Jan Kiszka
        case IDX_SEG_REGS:     GET_REG32(env->segs[R_CS].selector);
571 b1631e7a Jan Kiszka
        case IDX_SEG_REGS + 1: GET_REG32(env->segs[R_SS].selector);
572 b1631e7a Jan Kiszka
        case IDX_SEG_REGS + 2: GET_REG32(env->segs[R_DS].selector);
573 b1631e7a Jan Kiszka
        case IDX_SEG_REGS + 3: GET_REG32(env->segs[R_ES].selector);
574 b1631e7a Jan Kiszka
        case IDX_SEG_REGS + 4: GET_REG32(env->segs[R_FS].selector);
575 b1631e7a Jan Kiszka
        case IDX_SEG_REGS + 5: GET_REG32(env->segs[R_GS].selector);
576 b1631e7a Jan Kiszka
577 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 8:  GET_REG32(env->fpuc);
578 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 9:  GET_REG32((env->fpus & ~0x3800) |
579 b1631e7a Jan Kiszka
                                         (env->fpstt & 0x7) << 11);
580 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 10: GET_REG32(0); /* ftag */
581 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 11: GET_REG32(0); /* fiseg */
582 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 12: GET_REG32(0); /* fioff */
583 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 13: GET_REG32(0); /* foseg */
584 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 14: GET_REG32(0); /* fooff */
585 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 15: GET_REG32(0); /* fop */
586 b1631e7a Jan Kiszka
587 b1631e7a Jan Kiszka
        case IDX_MXCSR_REG: GET_REG32(env->mxcsr);
588 56aebc89 pbrook
        }
589 79808573 bellard
    }
590 56aebc89 pbrook
    return 0;
591 6da41eaf bellard
}
592 6da41eaf bellard
593 84273177 Jan Kiszka
static int cpu_x86_gdb_load_seg(CPUState *env, int sreg, uint8_t *mem_buf)
594 84273177 Jan Kiszka
{
595 84273177 Jan Kiszka
    uint16_t selector = ldl_p(mem_buf);
596 84273177 Jan Kiszka
597 84273177 Jan Kiszka
    if (selector != env->segs[sreg].selector) {
598 84273177 Jan Kiszka
#if defined(CONFIG_USER_ONLY)
599 84273177 Jan Kiszka
        cpu_x86_load_seg(env, sreg, selector);
600 84273177 Jan Kiszka
#else
601 84273177 Jan Kiszka
        unsigned int limit, flags;
602 84273177 Jan Kiszka
        target_ulong base;
603 84273177 Jan Kiszka
604 84273177 Jan Kiszka
        if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
605 84273177 Jan Kiszka
            base = selector << 4;
606 84273177 Jan Kiszka
            limit = 0xffff;
607 84273177 Jan Kiszka
            flags = 0;
608 84273177 Jan Kiszka
        } else {
609 84273177 Jan Kiszka
            if (!cpu_x86_get_descr_debug(env, selector, &base, &limit, &flags))
610 84273177 Jan Kiszka
                return 4;
611 84273177 Jan Kiszka
        }
612 84273177 Jan Kiszka
        cpu_x86_load_seg_cache(env, sreg, selector, base, limit, flags);
613 84273177 Jan Kiszka
#endif
614 84273177 Jan Kiszka
    }
615 84273177 Jan Kiszka
    return 4;
616 84273177 Jan Kiszka
}
617 84273177 Jan Kiszka
618 b1631e7a Jan Kiszka
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
619 6da41eaf bellard
{
620 56aebc89 pbrook
    uint32_t tmp;
621 6da41eaf bellard
622 b1631e7a Jan Kiszka
    if (n < CPU_NB_REGS) {
623 5f30fa18 Jan Kiszka
        if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
624 5f30fa18 Jan Kiszka
            env->regs[gpr_map[n]] = ldtul_p(mem_buf);
625 5f30fa18 Jan Kiszka
            return sizeof(target_ulong);
626 5f30fa18 Jan Kiszka
        } else if (n < CPU_NB_REGS32) {
627 5f30fa18 Jan Kiszka
            n = gpr_map32[n];
628 5f30fa18 Jan Kiszka
            env->regs[n] &= ~0xffffffffUL;
629 5f30fa18 Jan Kiszka
            env->regs[n] |= (uint32_t)ldl_p(mem_buf);
630 5f30fa18 Jan Kiszka
            return 4;
631 5f30fa18 Jan Kiszka
        }
632 b1631e7a Jan Kiszka
    } else if (n >= IDX_FP_REGS && n < IDX_FP_REGS + 8) {
633 56aebc89 pbrook
#ifdef USE_X86LDOUBLE
634 b1631e7a Jan Kiszka
        /* FIXME: byteswap float values - after fixing fpregs layout. */
635 b1631e7a Jan Kiszka
        memcpy(&env->fpregs[n - IDX_FP_REGS], mem_buf, 10);
636 79808573 bellard
#endif
637 56aebc89 pbrook
        return 10;
638 b1631e7a Jan Kiszka
    } else if (n >= IDX_XMM_REGS && n < IDX_XMM_REGS + CPU_NB_REGS) {
639 b1631e7a Jan Kiszka
        n -= IDX_XMM_REGS;
640 5f30fa18 Jan Kiszka
        if (n < CPU_NB_REGS32 ||
641 5f30fa18 Jan Kiszka
            (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK)) {
642 5f30fa18 Jan Kiszka
            env->xmm_regs[n].XMM_Q(0) = ldq_p(mem_buf);
643 5f30fa18 Jan Kiszka
            env->xmm_regs[n].XMM_Q(1) = ldq_p(mem_buf + 8);
644 5f30fa18 Jan Kiszka
            return 16;
645 5f30fa18 Jan Kiszka
        }
646 56aebc89 pbrook
    } else {
647 b1631e7a Jan Kiszka
        switch (n) {
648 b1631e7a Jan Kiszka
        case IDX_IP_REG:
649 5f30fa18 Jan Kiszka
            if (TARGET_LONG_BITS == 64 && env->hflags & HF_CS64_MASK) {
650 5f30fa18 Jan Kiszka
                env->eip = ldq_p(mem_buf);
651 5f30fa18 Jan Kiszka
                return 8;
652 5f30fa18 Jan Kiszka
            } else {
653 5f30fa18 Jan Kiszka
                env->eip &= ~0xffffffffUL;
654 5f30fa18 Jan Kiszka
                env->eip |= (uint32_t)ldl_p(mem_buf);
655 5f30fa18 Jan Kiszka
                return 4;
656 5f30fa18 Jan Kiszka
            }
657 b1631e7a Jan Kiszka
        case IDX_FLAGS_REG:
658 b1631e7a Jan Kiszka
            env->eflags = ldl_p(mem_buf);
659 b1631e7a Jan Kiszka
            return 4;
660 b1631e7a Jan Kiszka
661 84273177 Jan Kiszka
        case IDX_SEG_REGS:     return cpu_x86_gdb_load_seg(env, R_CS, mem_buf);
662 84273177 Jan Kiszka
        case IDX_SEG_REGS + 1: return cpu_x86_gdb_load_seg(env, R_SS, mem_buf);
663 84273177 Jan Kiszka
        case IDX_SEG_REGS + 2: return cpu_x86_gdb_load_seg(env, R_DS, mem_buf);
664 84273177 Jan Kiszka
        case IDX_SEG_REGS + 3: return cpu_x86_gdb_load_seg(env, R_ES, mem_buf);
665 84273177 Jan Kiszka
        case IDX_SEG_REGS + 4: return cpu_x86_gdb_load_seg(env, R_FS, mem_buf);
666 84273177 Jan Kiszka
        case IDX_SEG_REGS + 5: return cpu_x86_gdb_load_seg(env, R_GS, mem_buf);
667 b1631e7a Jan Kiszka
668 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 8:
669 b1631e7a Jan Kiszka
            env->fpuc = ldl_p(mem_buf);
670 b1631e7a Jan Kiszka
            return 4;
671 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 9:
672 b1631e7a Jan Kiszka
            tmp = ldl_p(mem_buf);
673 b1631e7a Jan Kiszka
            env->fpstt = (tmp >> 11) & 7;
674 b1631e7a Jan Kiszka
            env->fpus = tmp & ~0x3800;
675 b1631e7a Jan Kiszka
            return 4;
676 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 10: /* ftag */  return 4;
677 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 11: /* fiseg */ return 4;
678 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 12: /* fioff */ return 4;
679 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 13: /* foseg */ return 4;
680 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 14: /* fooff */ return 4;
681 b1631e7a Jan Kiszka
        case IDX_FP_REGS + 15: /* fop */   return 4;
682 b1631e7a Jan Kiszka
683 b1631e7a Jan Kiszka
        case IDX_MXCSR_REG:
684 b1631e7a Jan Kiszka
            env->mxcsr = ldl_p(mem_buf);
685 b1631e7a Jan Kiszka
            return 4;
686 79808573 bellard
        }
687 79808573 bellard
    }
688 56aebc89 pbrook
    /* Unrecognised register.  */
689 56aebc89 pbrook
    return 0;
690 6da41eaf bellard
}
691 6da41eaf bellard
692 9e62fd7f bellard
#elif defined (TARGET_PPC)
693 9e62fd7f bellard
694 e571cb47 aurel32
/* Old gdb always expects FP registers.  Newer (xml-aware) gdb only
695 e571cb47 aurel32
   expects whatever the target description contains.  Due to a
696 e571cb47 aurel32
   historical mishap the FP registers appear in between core integer
697 e571cb47 aurel32
   regs and PC, MSR, CR, and so forth.  We hack round this by giving the
698 e571cb47 aurel32
   FP regs zero size when talking to a newer gdb.  */
699 56aebc89 pbrook
#define NUM_CORE_REGS 71
700 e571cb47 aurel32
#if defined (TARGET_PPC64)
701 e571cb47 aurel32
#define GDB_CORE_XML "power64-core.xml"
702 e571cb47 aurel32
#else
703 e571cb47 aurel32
#define GDB_CORE_XML "power-core.xml"
704 e571cb47 aurel32
#endif
705 9e62fd7f bellard
706 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
707 9e62fd7f bellard
{
708 56aebc89 pbrook
    if (n < 32) {
709 56aebc89 pbrook
        /* gprs */
710 56aebc89 pbrook
        GET_REGL(env->gpr[n]);
711 56aebc89 pbrook
    } else if (n < 64) {
712 56aebc89 pbrook
        /* fprs */
713 e571cb47 aurel32
        if (gdb_has_xml)
714 e571cb47 aurel32
            return 0;
715 8d4acf9b aurel32
        stfq_p(mem_buf, env->fpr[n-32]);
716 56aebc89 pbrook
        return 8;
717 56aebc89 pbrook
    } else {
718 56aebc89 pbrook
        switch (n) {
719 56aebc89 pbrook
        case 64: GET_REGL(env->nip);
720 56aebc89 pbrook
        case 65: GET_REGL(env->msr);
721 56aebc89 pbrook
        case 66:
722 56aebc89 pbrook
            {
723 56aebc89 pbrook
                uint32_t cr = 0;
724 56aebc89 pbrook
                int i;
725 56aebc89 pbrook
                for (i = 0; i < 8; i++)
726 56aebc89 pbrook
                    cr |= env->crf[i] << (32 - ((i + 1) * 4));
727 56aebc89 pbrook
                GET_REG32(cr);
728 56aebc89 pbrook
            }
729 56aebc89 pbrook
        case 67: GET_REGL(env->lr);
730 56aebc89 pbrook
        case 68: GET_REGL(env->ctr);
731 3d7b417e aurel32
        case 69: GET_REGL(env->xer);
732 e571cb47 aurel32
        case 70:
733 e571cb47 aurel32
            {
734 e571cb47 aurel32
                if (gdb_has_xml)
735 e571cb47 aurel32
                    return 0;
736 5a576fb3 Fabien Chouteau
                GET_REG32(env->fpscr);
737 e571cb47 aurel32
            }
738 56aebc89 pbrook
        }
739 56aebc89 pbrook
    }
740 56aebc89 pbrook
    return 0;
741 56aebc89 pbrook
}
742 9e62fd7f bellard
743 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
744 56aebc89 pbrook
{
745 56aebc89 pbrook
    if (n < 32) {
746 56aebc89 pbrook
        /* gprs */
747 56aebc89 pbrook
        env->gpr[n] = ldtul_p(mem_buf);
748 56aebc89 pbrook
        return sizeof(target_ulong);
749 56aebc89 pbrook
    } else if (n < 64) {
750 56aebc89 pbrook
        /* fprs */
751 e571cb47 aurel32
        if (gdb_has_xml)
752 e571cb47 aurel32
            return 0;
753 8d4acf9b aurel32
        env->fpr[n-32] = ldfq_p(mem_buf);
754 56aebc89 pbrook
        return 8;
755 56aebc89 pbrook
    } else {
756 56aebc89 pbrook
        switch (n) {
757 56aebc89 pbrook
        case 64:
758 56aebc89 pbrook
            env->nip = ldtul_p(mem_buf);
759 56aebc89 pbrook
            return sizeof(target_ulong);
760 56aebc89 pbrook
        case 65:
761 56aebc89 pbrook
            ppc_store_msr(env, ldtul_p(mem_buf));
762 56aebc89 pbrook
            return sizeof(target_ulong);
763 56aebc89 pbrook
        case 66:
764 56aebc89 pbrook
            {
765 56aebc89 pbrook
                uint32_t cr = ldl_p(mem_buf);
766 56aebc89 pbrook
                int i;
767 56aebc89 pbrook
                for (i = 0; i < 8; i++)
768 56aebc89 pbrook
                    env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
769 56aebc89 pbrook
                return 4;
770 56aebc89 pbrook
            }
771 56aebc89 pbrook
        case 67:
772 56aebc89 pbrook
            env->lr = ldtul_p(mem_buf);
773 56aebc89 pbrook
            return sizeof(target_ulong);
774 56aebc89 pbrook
        case 68:
775 56aebc89 pbrook
            env->ctr = ldtul_p(mem_buf);
776 56aebc89 pbrook
            return sizeof(target_ulong);
777 56aebc89 pbrook
        case 69:
778 3d7b417e aurel32
            env->xer = ldtul_p(mem_buf);
779 3d7b417e aurel32
            return sizeof(target_ulong);
780 56aebc89 pbrook
        case 70:
781 56aebc89 pbrook
            /* fpscr */
782 e571cb47 aurel32
            if (gdb_has_xml)
783 e571cb47 aurel32
                return 0;
784 56aebc89 pbrook
            return 4;
785 56aebc89 pbrook
        }
786 56aebc89 pbrook
    }
787 56aebc89 pbrook
    return 0;
788 e95c8d51 bellard
}
789 56aebc89 pbrook
790 e95c8d51 bellard
#elif defined (TARGET_SPARC)
791 56aebc89 pbrook
792 56aebc89 pbrook
#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
793 56aebc89 pbrook
#define NUM_CORE_REGS 86
794 96d19126 blueswir1
#else
795 5a377912 blueswir1
#define NUM_CORE_REGS 72
796 96d19126 blueswir1
#endif
797 56aebc89 pbrook
798 96d19126 blueswir1
#ifdef TARGET_ABI32
799 56aebc89 pbrook
#define GET_REGA(val) GET_REG32(val)
800 96d19126 blueswir1
#else
801 56aebc89 pbrook
#define GET_REGA(val) GET_REGL(val)
802 96d19126 blueswir1
#endif
803 e95c8d51 bellard
804 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
805 56aebc89 pbrook
{
806 56aebc89 pbrook
    if (n < 8) {
807 56aebc89 pbrook
        /* g0..g7 */
808 56aebc89 pbrook
        GET_REGA(env->gregs[n]);
809 e95c8d51 bellard
    }
810 56aebc89 pbrook
    if (n < 32) {
811 56aebc89 pbrook
        /* register window */
812 56aebc89 pbrook
        GET_REGA(env->regwptr[n - 8]);
813 e95c8d51 bellard
    }
814 56aebc89 pbrook
#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
815 56aebc89 pbrook
    if (n < 64) {
816 56aebc89 pbrook
        /* fprs */
817 30038fd8 Richard Henderson
        if (n & 1) {
818 30038fd8 Richard Henderson
            GET_REG32(env->fpr[(n - 32) / 2].l.lower);
819 30038fd8 Richard Henderson
        } else {
820 30038fd8 Richard Henderson
            GET_REG32(env->fpr[(n - 32) / 2].l.upper);
821 30038fd8 Richard Henderson
        }
822 e95c8d51 bellard
    }
823 e95c8d51 bellard
    /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
824 56aebc89 pbrook
    switch (n) {
825 56aebc89 pbrook
    case 64: GET_REGA(env->y);
826 5a834bb4 Blue Swirl
    case 65: GET_REGA(cpu_get_psr(env));
827 56aebc89 pbrook
    case 66: GET_REGA(env->wim);
828 56aebc89 pbrook
    case 67: GET_REGA(env->tbr);
829 56aebc89 pbrook
    case 68: GET_REGA(env->pc);
830 56aebc89 pbrook
    case 69: GET_REGA(env->npc);
831 56aebc89 pbrook
    case 70: GET_REGA(env->fsr);
832 56aebc89 pbrook
    case 71: GET_REGA(0); /* csr */
833 5a377912 blueswir1
    default: GET_REGA(0);
834 56aebc89 pbrook
    }
835 3475187d bellard
#else
836 56aebc89 pbrook
    if (n < 64) {
837 56aebc89 pbrook
        /* f0-f31 */
838 30038fd8 Richard Henderson
        if (n & 1) {
839 30038fd8 Richard Henderson
            GET_REG32(env->fpr[(n - 32) / 2].l.lower);
840 30038fd8 Richard Henderson
        } else {
841 30038fd8 Richard Henderson
            GET_REG32(env->fpr[(n - 32) / 2].l.upper);
842 30038fd8 Richard Henderson
        }
843 56aebc89 pbrook
    }
844 56aebc89 pbrook
    if (n < 80) {
845 56aebc89 pbrook
        /* f32-f62 (double width, even numbers only) */
846 30038fd8 Richard Henderson
        GET_REG64(env->fpr[(n - 32) / 2].ll);
847 3475187d bellard
    }
848 56aebc89 pbrook
    switch (n) {
849 56aebc89 pbrook
    case 80: GET_REGL(env->pc);
850 56aebc89 pbrook
    case 81: GET_REGL(env->npc);
851 5a834bb4 Blue Swirl
    case 82: GET_REGL((cpu_get_ccr(env) << 32) |
852 5a834bb4 Blue Swirl
                      ((env->asi & 0xff) << 24) |
853 5a834bb4 Blue Swirl
                      ((env->pstate & 0xfff) << 8) |
854 5a834bb4 Blue Swirl
                      cpu_get_cwp64(env));
855 56aebc89 pbrook
    case 83: GET_REGL(env->fsr);
856 56aebc89 pbrook
    case 84: GET_REGL(env->fprs);
857 56aebc89 pbrook
    case 85: GET_REGL(env->y);
858 56aebc89 pbrook
    }
859 3475187d bellard
#endif
860 56aebc89 pbrook
    return 0;
861 e95c8d51 bellard
}
862 e95c8d51 bellard
863 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
864 e95c8d51 bellard
{
865 56aebc89 pbrook
#if defined(TARGET_ABI32)
866 56aebc89 pbrook
    abi_ulong tmp;
867 56aebc89 pbrook
868 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
869 96d19126 blueswir1
#else
870 56aebc89 pbrook
    target_ulong tmp;
871 56aebc89 pbrook
872 56aebc89 pbrook
    tmp = ldtul_p(mem_buf);
873 96d19126 blueswir1
#endif
874 e95c8d51 bellard
875 56aebc89 pbrook
    if (n < 8) {
876 56aebc89 pbrook
        /* g0..g7 */
877 56aebc89 pbrook
        env->gregs[n] = tmp;
878 56aebc89 pbrook
    } else if (n < 32) {
879 56aebc89 pbrook
        /* register window */
880 56aebc89 pbrook
        env->regwptr[n - 8] = tmp;
881 e95c8d51 bellard
    }
882 56aebc89 pbrook
#if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
883 56aebc89 pbrook
    else if (n < 64) {
884 56aebc89 pbrook
        /* fprs */
885 30038fd8 Richard Henderson
        /* f0-f31 */
886 30038fd8 Richard Henderson
        if (n & 1) {
887 30038fd8 Richard Henderson
            env->fpr[(n - 32) / 2].l.lower = tmp;
888 30038fd8 Richard Henderson
        } else {
889 30038fd8 Richard Henderson
            env->fpr[(n - 32) / 2].l.upper = tmp;
890 30038fd8 Richard Henderson
        }
891 56aebc89 pbrook
    } else {
892 56aebc89 pbrook
        /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
893 56aebc89 pbrook
        switch (n) {
894 56aebc89 pbrook
        case 64: env->y = tmp; break;
895 5a834bb4 Blue Swirl
        case 65: cpu_put_psr(env, tmp); break;
896 56aebc89 pbrook
        case 66: env->wim = tmp; break;
897 56aebc89 pbrook
        case 67: env->tbr = tmp; break;
898 56aebc89 pbrook
        case 68: env->pc = tmp; break;
899 56aebc89 pbrook
        case 69: env->npc = tmp; break;
900 56aebc89 pbrook
        case 70: env->fsr = tmp; break;
901 56aebc89 pbrook
        default: return 0;
902 56aebc89 pbrook
        }
903 e95c8d51 bellard
    }
904 56aebc89 pbrook
    return 4;
905 3475187d bellard
#else
906 56aebc89 pbrook
    else if (n < 64) {
907 56aebc89 pbrook
        /* f0-f31 */
908 30038fd8 Richard Henderson
        tmp = ldl_p(mem_buf);
909 30038fd8 Richard Henderson
        if (n & 1) {
910 30038fd8 Richard Henderson
            env->fpr[(n - 32) / 2].l.lower = tmp;
911 30038fd8 Richard Henderson
        } else {
912 30038fd8 Richard Henderson
            env->fpr[(n - 32) / 2].l.upper = tmp;
913 30038fd8 Richard Henderson
        }
914 56aebc89 pbrook
        return 4;
915 56aebc89 pbrook
    } else if (n < 80) {
916 56aebc89 pbrook
        /* f32-f62 (double width, even numbers only) */
917 30038fd8 Richard Henderson
        env->fpr[(n - 32) / 2].ll = tmp;
918 56aebc89 pbrook
    } else {
919 56aebc89 pbrook
        switch (n) {
920 56aebc89 pbrook
        case 80: env->pc = tmp; break;
921 56aebc89 pbrook
        case 81: env->npc = tmp; break;
922 56aebc89 pbrook
        case 82:
923 5a834bb4 Blue Swirl
            cpu_put_ccr(env, tmp >> 32);
924 56aebc89 pbrook
            env->asi = (tmp >> 24) & 0xff;
925 56aebc89 pbrook
            env->pstate = (tmp >> 8) & 0xfff;
926 5a834bb4 Blue Swirl
            cpu_put_cwp64(env, tmp & 0xff);
927 56aebc89 pbrook
            break;
928 56aebc89 pbrook
        case 83: env->fsr = tmp; break;
929 56aebc89 pbrook
        case 84: env->fprs = tmp; break;
930 56aebc89 pbrook
        case 85: env->y = tmp; break;
931 56aebc89 pbrook
        default: return 0;
932 56aebc89 pbrook
        }
933 17d996e1 blueswir1
    }
934 56aebc89 pbrook
    return 8;
935 3475187d bellard
#endif
936 9e62fd7f bellard
}
937 1fddef4b bellard
#elif defined (TARGET_ARM)
938 6da41eaf bellard
939 56aebc89 pbrook
/* Old gdb always expect FPA registers.  Newer (xml-aware) gdb only expect
940 56aebc89 pbrook
   whatever the target description contains.  Due to a historical mishap
941 56aebc89 pbrook
   the FPA registers appear in between core integer regs and the CPSR.
942 56aebc89 pbrook
   We hack round this by giving the FPA regs zero size when talking to a
943 56aebc89 pbrook
   newer gdb.  */
944 56aebc89 pbrook
#define NUM_CORE_REGS 26
945 56aebc89 pbrook
#define GDB_CORE_XML "arm-core.xml"
946 e6e5906b pbrook
947 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
948 e6e5906b pbrook
{
949 56aebc89 pbrook
    if (n < 16) {
950 56aebc89 pbrook
        /* Core integer register.  */
951 56aebc89 pbrook
        GET_REG32(env->regs[n]);
952 56aebc89 pbrook
    }
953 56aebc89 pbrook
    if (n < 24) {
954 56aebc89 pbrook
        /* FPA registers.  */
955 56aebc89 pbrook
        if (gdb_has_xml)
956 56aebc89 pbrook
            return 0;
957 56aebc89 pbrook
        memset(mem_buf, 0, 12);
958 56aebc89 pbrook
        return 12;
959 56aebc89 pbrook
    }
960 56aebc89 pbrook
    switch (n) {
961 56aebc89 pbrook
    case 24:
962 56aebc89 pbrook
        /* FPA status register.  */
963 56aebc89 pbrook
        if (gdb_has_xml)
964 56aebc89 pbrook
            return 0;
965 56aebc89 pbrook
        GET_REG32(0);
966 56aebc89 pbrook
    case 25:
967 56aebc89 pbrook
        /* CPSR */
968 56aebc89 pbrook
        GET_REG32(cpsr_read(env));
969 56aebc89 pbrook
    }
970 56aebc89 pbrook
    /* Unknown register.  */
971 56aebc89 pbrook
    return 0;
972 e6e5906b pbrook
}
973 6f970bd9 bellard
974 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
975 56aebc89 pbrook
{
976 56aebc89 pbrook
    uint32_t tmp;
977 6f970bd9 bellard
978 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
979 6f970bd9 bellard
980 56aebc89 pbrook
    /* Mask out low bit of PC to workaround gdb bugs.  This will probably
981 56aebc89 pbrook
       cause problems if we ever implement the Jazelle DBX extensions.  */
982 56aebc89 pbrook
    if (n == 15)
983 56aebc89 pbrook
        tmp &= ~1;
984 6f970bd9 bellard
985 56aebc89 pbrook
    if (n < 16) {
986 56aebc89 pbrook
        /* Core integer register.  */
987 56aebc89 pbrook
        env->regs[n] = tmp;
988 56aebc89 pbrook
        return 4;
989 56aebc89 pbrook
    }
990 56aebc89 pbrook
    if (n < 24) { /* 16-23 */
991 56aebc89 pbrook
        /* FPA registers (ignored).  */
992 56aebc89 pbrook
        if (gdb_has_xml)
993 56aebc89 pbrook
            return 0;
994 56aebc89 pbrook
        return 12;
995 56aebc89 pbrook
    }
996 56aebc89 pbrook
    switch (n) {
997 56aebc89 pbrook
    case 24:
998 56aebc89 pbrook
        /* FPA status register (ignored).  */
999 56aebc89 pbrook
        if (gdb_has_xml)
1000 56aebc89 pbrook
            return 0;
1001 56aebc89 pbrook
        return 4;
1002 56aebc89 pbrook
    case 25:
1003 56aebc89 pbrook
        /* CPSR */
1004 56aebc89 pbrook
        cpsr_write (env, tmp, 0xffffffff);
1005 56aebc89 pbrook
        return 4;
1006 56aebc89 pbrook
    }
1007 56aebc89 pbrook
    /* Unknown register.  */
1008 56aebc89 pbrook
    return 0;
1009 56aebc89 pbrook
}
1010 6f970bd9 bellard
1011 56aebc89 pbrook
#elif defined (TARGET_M68K)
1012 6f970bd9 bellard
1013 56aebc89 pbrook
#define NUM_CORE_REGS 18
1014 6f970bd9 bellard
1015 56aebc89 pbrook
#define GDB_CORE_XML "cf-core.xml"
1016 6f970bd9 bellard
1017 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1018 56aebc89 pbrook
{
1019 56aebc89 pbrook
    if (n < 8) {
1020 56aebc89 pbrook
        /* D0-D7 */
1021 56aebc89 pbrook
        GET_REG32(env->dregs[n]);
1022 56aebc89 pbrook
    } else if (n < 16) {
1023 56aebc89 pbrook
        /* A0-A7 */
1024 56aebc89 pbrook
        GET_REG32(env->aregs[n - 8]);
1025 56aebc89 pbrook
    } else {
1026 56aebc89 pbrook
        switch (n) {
1027 56aebc89 pbrook
        case 16: GET_REG32(env->sr);
1028 56aebc89 pbrook
        case 17: GET_REG32(env->pc);
1029 56aebc89 pbrook
        }
1030 56aebc89 pbrook
    }
1031 56aebc89 pbrook
    /* FP registers not included here because they vary between
1032 56aebc89 pbrook
       ColdFire and m68k.  Use XML bits for these.  */
1033 56aebc89 pbrook
    return 0;
1034 56aebc89 pbrook
}
1035 8e33c08c ths
1036 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1037 56aebc89 pbrook
{
1038 56aebc89 pbrook
    uint32_t tmp;
1039 8e33c08c ths
1040 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
1041 8e33c08c ths
1042 56aebc89 pbrook
    if (n < 8) {
1043 56aebc89 pbrook
        /* D0-D7 */
1044 56aebc89 pbrook
        env->dregs[n] = tmp;
1045 b3d6b959 Kazu Hirata
    } else if (n < 16) {
1046 56aebc89 pbrook
        /* A0-A7 */
1047 56aebc89 pbrook
        env->aregs[n - 8] = tmp;
1048 56aebc89 pbrook
    } else {
1049 56aebc89 pbrook
        switch (n) {
1050 56aebc89 pbrook
        case 16: env->sr = tmp; break;
1051 56aebc89 pbrook
        case 17: env->pc = tmp; break;
1052 56aebc89 pbrook
        default: return 0;
1053 56aebc89 pbrook
        }
1054 56aebc89 pbrook
    }
1055 56aebc89 pbrook
    return 4;
1056 56aebc89 pbrook
}
1057 56aebc89 pbrook
#elif defined (TARGET_MIPS)
1058 7ac256b8 ths
1059 56aebc89 pbrook
#define NUM_CORE_REGS 73
1060 7ac256b8 ths
1061 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1062 56aebc89 pbrook
{
1063 56aebc89 pbrook
    if (n < 32) {
1064 56aebc89 pbrook
        GET_REGL(env->active_tc.gpr[n]);
1065 56aebc89 pbrook
    }
1066 56aebc89 pbrook
    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1067 56aebc89 pbrook
        if (n >= 38 && n < 70) {
1068 56aebc89 pbrook
            if (env->CP0_Status & (1 << CP0St_FR))
1069 56aebc89 pbrook
                GET_REGL(env->active_fpu.fpr[n - 38].d);
1070 56aebc89 pbrook
            else
1071 56aebc89 pbrook
                GET_REGL(env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX]);
1072 56aebc89 pbrook
        }
1073 56aebc89 pbrook
        switch (n) {
1074 56aebc89 pbrook
        case 70: GET_REGL((int32_t)env->active_fpu.fcr31);
1075 56aebc89 pbrook
        case 71: GET_REGL((int32_t)env->active_fpu.fcr0);
1076 56aebc89 pbrook
        }
1077 56aebc89 pbrook
    }
1078 56aebc89 pbrook
    switch (n) {
1079 56aebc89 pbrook
    case 32: GET_REGL((int32_t)env->CP0_Status);
1080 56aebc89 pbrook
    case 33: GET_REGL(env->active_tc.LO[0]);
1081 56aebc89 pbrook
    case 34: GET_REGL(env->active_tc.HI[0]);
1082 56aebc89 pbrook
    case 35: GET_REGL(env->CP0_BadVAddr);
1083 56aebc89 pbrook
    case 36: GET_REGL((int32_t)env->CP0_Cause);
1084 ff1d1977 Nathan Froyd
    case 37: GET_REGL(env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16));
1085 56aebc89 pbrook
    case 72: GET_REGL(0); /* fp */
1086 56aebc89 pbrook
    case 89: GET_REGL((int32_t)env->CP0_PRid);
1087 56aebc89 pbrook
    }
1088 56aebc89 pbrook
    if (n >= 73 && n <= 88) {
1089 56aebc89 pbrook
        /* 16 embedded regs.  */
1090 56aebc89 pbrook
        GET_REGL(0);
1091 56aebc89 pbrook
    }
1092 6f970bd9 bellard
1093 56aebc89 pbrook
    return 0;
1094 6f970bd9 bellard
}
1095 6f970bd9 bellard
1096 8e33c08c ths
/* convert MIPS rounding mode in FCR31 to IEEE library */
1097 8e33c08c ths
static unsigned int ieee_rm[] =
1098 8e33c08c ths
  {
1099 8e33c08c ths
    float_round_nearest_even,
1100 8e33c08c ths
    float_round_to_zero,
1101 8e33c08c ths
    float_round_up,
1102 8e33c08c ths
    float_round_down
1103 8e33c08c ths
  };
1104 8e33c08c ths
#define RESTORE_ROUNDING_MODE \
1105 f01be154 ths
    set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
1106 8e33c08c ths
1107 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1108 6f970bd9 bellard
{
1109 56aebc89 pbrook
    target_ulong tmp;
1110 6f970bd9 bellard
1111 56aebc89 pbrook
    tmp = ldtul_p(mem_buf);
1112 6f970bd9 bellard
1113 56aebc89 pbrook
    if (n < 32) {
1114 56aebc89 pbrook
        env->active_tc.gpr[n] = tmp;
1115 56aebc89 pbrook
        return sizeof(target_ulong);
1116 56aebc89 pbrook
    }
1117 56aebc89 pbrook
    if (env->CP0_Config1 & (1 << CP0C1_FP)
1118 56aebc89 pbrook
            && n >= 38 && n < 73) {
1119 56aebc89 pbrook
        if (n < 70) {
1120 7ac256b8 ths
            if (env->CP0_Status & (1 << CP0St_FR))
1121 56aebc89 pbrook
              env->active_fpu.fpr[n - 38].d = tmp;
1122 7ac256b8 ths
            else
1123 56aebc89 pbrook
              env->active_fpu.fpr[n - 38].w[FP_ENDIAN_IDX] = tmp;
1124 56aebc89 pbrook
        }
1125 56aebc89 pbrook
        switch (n) {
1126 56aebc89 pbrook
        case 70:
1127 56aebc89 pbrook
            env->active_fpu.fcr31 = tmp & 0xFF83FFFF;
1128 56aebc89 pbrook
            /* set rounding mode */
1129 56aebc89 pbrook
            RESTORE_ROUNDING_MODE;
1130 56aebc89 pbrook
            break;
1131 56aebc89 pbrook
        case 71: env->active_fpu.fcr0 = tmp; break;
1132 56aebc89 pbrook
        }
1133 56aebc89 pbrook
        return sizeof(target_ulong);
1134 56aebc89 pbrook
    }
1135 56aebc89 pbrook
    switch (n) {
1136 56aebc89 pbrook
    case 32: env->CP0_Status = tmp; break;
1137 56aebc89 pbrook
    case 33: env->active_tc.LO[0] = tmp; break;
1138 56aebc89 pbrook
    case 34: env->active_tc.HI[0] = tmp; break;
1139 56aebc89 pbrook
    case 35: env->CP0_BadVAddr = tmp; break;
1140 56aebc89 pbrook
    case 36: env->CP0_Cause = tmp; break;
1141 ff1d1977 Nathan Froyd
    case 37:
1142 ff1d1977 Nathan Froyd
        env->active_tc.PC = tmp & ~(target_ulong)1;
1143 ff1d1977 Nathan Froyd
        if (tmp & 1) {
1144 ff1d1977 Nathan Froyd
            env->hflags |= MIPS_HFLAG_M16;
1145 ff1d1977 Nathan Froyd
        } else {
1146 ff1d1977 Nathan Froyd
            env->hflags &= ~(MIPS_HFLAG_M16);
1147 ff1d1977 Nathan Froyd
        }
1148 ff1d1977 Nathan Froyd
        break;
1149 56aebc89 pbrook
    case 72: /* fp, ignored */ break;
1150 56aebc89 pbrook
    default: 
1151 56aebc89 pbrook
        if (n > 89)
1152 56aebc89 pbrook
            return 0;
1153 56aebc89 pbrook
        /* Other registers are readonly.  Ignore writes.  */
1154 56aebc89 pbrook
        break;
1155 56aebc89 pbrook
    }
1156 56aebc89 pbrook
1157 56aebc89 pbrook
    return sizeof(target_ulong);
1158 6f970bd9 bellard
}
1159 fdf9b3e8 bellard
#elif defined (TARGET_SH4)
1160 6ef99fc5 ths
1161 6ef99fc5 ths
/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
1162 56aebc89 pbrook
/* FIXME: We should use XML for this.  */
1163 56aebc89 pbrook
1164 56aebc89 pbrook
#define NUM_CORE_REGS 59
1165 6ef99fc5 ths
1166 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1167 fdf9b3e8 bellard
{
1168 56aebc89 pbrook
    if (n < 8) {
1169 56aebc89 pbrook
        if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1170 56aebc89 pbrook
            GET_REGL(env->gregs[n + 16]);
1171 56aebc89 pbrook
        } else {
1172 56aebc89 pbrook
            GET_REGL(env->gregs[n]);
1173 56aebc89 pbrook
        }
1174 56aebc89 pbrook
    } else if (n < 16) {
1175 e192a45c takasi-y@ops.dti.ne.jp
        GET_REGL(env->gregs[n]);
1176 56aebc89 pbrook
    } else if (n >= 25 && n < 41) {
1177 56aebc89 pbrook
        GET_REGL(env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)]);
1178 56aebc89 pbrook
    } else if (n >= 43 && n < 51) {
1179 56aebc89 pbrook
        GET_REGL(env->gregs[n - 43]);
1180 56aebc89 pbrook
    } else if (n >= 51 && n < 59) {
1181 56aebc89 pbrook
        GET_REGL(env->gregs[n - (51 - 16)]);
1182 56aebc89 pbrook
    }
1183 56aebc89 pbrook
    switch (n) {
1184 56aebc89 pbrook
    case 16: GET_REGL(env->pc);
1185 56aebc89 pbrook
    case 17: GET_REGL(env->pr);
1186 56aebc89 pbrook
    case 18: GET_REGL(env->gbr);
1187 56aebc89 pbrook
    case 19: GET_REGL(env->vbr);
1188 56aebc89 pbrook
    case 20: GET_REGL(env->mach);
1189 56aebc89 pbrook
    case 21: GET_REGL(env->macl);
1190 56aebc89 pbrook
    case 22: GET_REGL(env->sr);
1191 56aebc89 pbrook
    case 23: GET_REGL(env->fpul);
1192 56aebc89 pbrook
    case 24: GET_REGL(env->fpscr);
1193 56aebc89 pbrook
    case 41: GET_REGL(env->ssr);
1194 56aebc89 pbrook
    case 42: GET_REGL(env->spc);
1195 56aebc89 pbrook
    }
1196 56aebc89 pbrook
1197 56aebc89 pbrook
    return 0;
1198 fdf9b3e8 bellard
}
1199 fdf9b3e8 bellard
1200 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1201 fdf9b3e8 bellard
{
1202 56aebc89 pbrook
    uint32_t tmp;
1203 56aebc89 pbrook
1204 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
1205 56aebc89 pbrook
1206 56aebc89 pbrook
    if (n < 8) {
1207 56aebc89 pbrook
        if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
1208 56aebc89 pbrook
            env->gregs[n + 16] = tmp;
1209 56aebc89 pbrook
        } else {
1210 56aebc89 pbrook
            env->gregs[n] = tmp;
1211 56aebc89 pbrook
        }
1212 56aebc89 pbrook
        return 4;
1213 56aebc89 pbrook
    } else if (n < 16) {
1214 e192a45c takasi-y@ops.dti.ne.jp
        env->gregs[n] = tmp;
1215 56aebc89 pbrook
        return 4;
1216 56aebc89 pbrook
    } else if (n >= 25 && n < 41) {
1217 56aebc89 pbrook
        env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)] = tmp;
1218 e192a45c takasi-y@ops.dti.ne.jp
        return 4;
1219 56aebc89 pbrook
    } else if (n >= 43 && n < 51) {
1220 56aebc89 pbrook
        env->gregs[n - 43] = tmp;
1221 56aebc89 pbrook
        return 4;
1222 56aebc89 pbrook
    } else if (n >= 51 && n < 59) {
1223 56aebc89 pbrook
        env->gregs[n - (51 - 16)] = tmp;
1224 56aebc89 pbrook
        return 4;
1225 56aebc89 pbrook
    }
1226 56aebc89 pbrook
    switch (n) {
1227 e192a45c takasi-y@ops.dti.ne.jp
    case 16: env->pc = tmp; break;
1228 e192a45c takasi-y@ops.dti.ne.jp
    case 17: env->pr = tmp; break;
1229 e192a45c takasi-y@ops.dti.ne.jp
    case 18: env->gbr = tmp; break;
1230 e192a45c takasi-y@ops.dti.ne.jp
    case 19: env->vbr = tmp; break;
1231 e192a45c takasi-y@ops.dti.ne.jp
    case 20: env->mach = tmp; break;
1232 e192a45c takasi-y@ops.dti.ne.jp
    case 21: env->macl = tmp; break;
1233 e192a45c takasi-y@ops.dti.ne.jp
    case 22: env->sr = tmp; break;
1234 e192a45c takasi-y@ops.dti.ne.jp
    case 23: env->fpul = tmp; break;
1235 e192a45c takasi-y@ops.dti.ne.jp
    case 24: env->fpscr = tmp; break;
1236 e192a45c takasi-y@ops.dti.ne.jp
    case 41: env->ssr = tmp; break;
1237 e192a45c takasi-y@ops.dti.ne.jp
    case 42: env->spc = tmp; break;
1238 56aebc89 pbrook
    default: return 0;
1239 56aebc89 pbrook
    }
1240 56aebc89 pbrook
1241 56aebc89 pbrook
    return 4;
1242 fdf9b3e8 bellard
}
1243 d74d6a99 Edgar E. Iglesias
#elif defined (TARGET_MICROBLAZE)
1244 d74d6a99 Edgar E. Iglesias
1245 d74d6a99 Edgar E. Iglesias
#define NUM_CORE_REGS (32 + 5)
1246 d74d6a99 Edgar E. Iglesias
1247 d74d6a99 Edgar E. Iglesias
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1248 d74d6a99 Edgar E. Iglesias
{
1249 d74d6a99 Edgar E. Iglesias
    if (n < 32) {
1250 d74d6a99 Edgar E. Iglesias
        GET_REG32(env->regs[n]);
1251 d74d6a99 Edgar E. Iglesias
    } else {
1252 d74d6a99 Edgar E. Iglesias
        GET_REG32(env->sregs[n - 32]);
1253 d74d6a99 Edgar E. Iglesias
    }
1254 d74d6a99 Edgar E. Iglesias
    return 0;
1255 d74d6a99 Edgar E. Iglesias
}
1256 d74d6a99 Edgar E. Iglesias
1257 d74d6a99 Edgar E. Iglesias
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1258 d74d6a99 Edgar E. Iglesias
{
1259 d74d6a99 Edgar E. Iglesias
    uint32_t tmp;
1260 d74d6a99 Edgar E. Iglesias
1261 d74d6a99 Edgar E. Iglesias
    if (n > NUM_CORE_REGS)
1262 d74d6a99 Edgar E. Iglesias
        return 0;
1263 d74d6a99 Edgar E. Iglesias
1264 d74d6a99 Edgar E. Iglesias
    tmp = ldl_p(mem_buf);
1265 d74d6a99 Edgar E. Iglesias
1266 d74d6a99 Edgar E. Iglesias
    if (n < 32) {
1267 d74d6a99 Edgar E. Iglesias
        env->regs[n] = tmp;
1268 d74d6a99 Edgar E. Iglesias
    } else {
1269 d74d6a99 Edgar E. Iglesias
        env->sregs[n - 32] = tmp;
1270 d74d6a99 Edgar E. Iglesias
    }
1271 d74d6a99 Edgar E. Iglesias
    return 4;
1272 d74d6a99 Edgar E. Iglesias
}
1273 f1ccf904 ths
#elif defined (TARGET_CRIS)
1274 f1ccf904 ths
1275 56aebc89 pbrook
#define NUM_CORE_REGS 49
1276 56aebc89 pbrook
1277 4a0b59fe Edgar E. Iglesias
static int
1278 4a0b59fe Edgar E. Iglesias
read_register_crisv10(CPUState *env, uint8_t *mem_buf, int n)
1279 4a0b59fe Edgar E. Iglesias
{
1280 4a0b59fe Edgar E. Iglesias
    if (n < 15) {
1281 4a0b59fe Edgar E. Iglesias
        GET_REG32(env->regs[n]);
1282 4a0b59fe Edgar E. Iglesias
    }
1283 4a0b59fe Edgar E. Iglesias
1284 4a0b59fe Edgar E. Iglesias
    if (n == 15) {
1285 4a0b59fe Edgar E. Iglesias
        GET_REG32(env->pc);
1286 4a0b59fe Edgar E. Iglesias
    }
1287 4a0b59fe Edgar E. Iglesias
1288 4a0b59fe Edgar E. Iglesias
    if (n < 32) {
1289 4a0b59fe Edgar E. Iglesias
        switch (n) {
1290 4a0b59fe Edgar E. Iglesias
        case 16:
1291 4a0b59fe Edgar E. Iglesias
            GET_REG8(env->pregs[n - 16]);
1292 4a0b59fe Edgar E. Iglesias
            break;
1293 4a0b59fe Edgar E. Iglesias
        case 17:
1294 4a0b59fe Edgar E. Iglesias
            GET_REG8(env->pregs[n - 16]);
1295 4a0b59fe Edgar E. Iglesias
            break;
1296 4a0b59fe Edgar E. Iglesias
        case 20:
1297 4a0b59fe Edgar E. Iglesias
        case 21:
1298 4a0b59fe Edgar E. Iglesias
            GET_REG16(env->pregs[n - 16]);
1299 4a0b59fe Edgar E. Iglesias
            break;
1300 4a0b59fe Edgar E. Iglesias
        default:
1301 4a0b59fe Edgar E. Iglesias
            if (n >= 23) {
1302 4a0b59fe Edgar E. Iglesias
                GET_REG32(env->pregs[n - 16]);
1303 4a0b59fe Edgar E. Iglesias
            }
1304 4a0b59fe Edgar E. Iglesias
            break;
1305 4a0b59fe Edgar E. Iglesias
        }
1306 4a0b59fe Edgar E. Iglesias
    }
1307 4a0b59fe Edgar E. Iglesias
    return 0;
1308 4a0b59fe Edgar E. Iglesias
}
1309 4a0b59fe Edgar E. Iglesias
1310 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1311 f1ccf904 ths
{
1312 56aebc89 pbrook
    uint8_t srs;
1313 56aebc89 pbrook
1314 4a0b59fe Edgar E. Iglesias
    if (env->pregs[PR_VR] < 32)
1315 4a0b59fe Edgar E. Iglesias
        return read_register_crisv10(env, mem_buf, n);
1316 4a0b59fe Edgar E. Iglesias
1317 56aebc89 pbrook
    srs = env->pregs[PR_SRS];
1318 56aebc89 pbrook
    if (n < 16) {
1319 56aebc89 pbrook
        GET_REG32(env->regs[n]);
1320 56aebc89 pbrook
    }
1321 56aebc89 pbrook
1322 56aebc89 pbrook
    if (n >= 21 && n < 32) {
1323 56aebc89 pbrook
        GET_REG32(env->pregs[n - 16]);
1324 56aebc89 pbrook
    }
1325 56aebc89 pbrook
    if (n >= 33 && n < 49) {
1326 56aebc89 pbrook
        GET_REG32(env->sregs[srs][n - 33]);
1327 56aebc89 pbrook
    }
1328 56aebc89 pbrook
    switch (n) {
1329 56aebc89 pbrook
    case 16: GET_REG8(env->pregs[0]);
1330 56aebc89 pbrook
    case 17: GET_REG8(env->pregs[1]);
1331 56aebc89 pbrook
    case 18: GET_REG32(env->pregs[2]);
1332 56aebc89 pbrook
    case 19: GET_REG8(srs);
1333 56aebc89 pbrook
    case 20: GET_REG16(env->pregs[4]);
1334 56aebc89 pbrook
    case 32: GET_REG32(env->pc);
1335 56aebc89 pbrook
    }
1336 56aebc89 pbrook
1337 56aebc89 pbrook
    return 0;
1338 f1ccf904 ths
}
1339 56aebc89 pbrook
1340 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1341 f1ccf904 ths
{
1342 56aebc89 pbrook
    uint32_t tmp;
1343 56aebc89 pbrook
1344 56aebc89 pbrook
    if (n > 49)
1345 56aebc89 pbrook
        return 0;
1346 56aebc89 pbrook
1347 56aebc89 pbrook
    tmp = ldl_p(mem_buf);
1348 56aebc89 pbrook
1349 56aebc89 pbrook
    if (n < 16) {
1350 56aebc89 pbrook
        env->regs[n] = tmp;
1351 56aebc89 pbrook
    }
1352 56aebc89 pbrook
1353 d7b6967a edgar_igl
    if (n >= 21 && n < 32) {
1354 d7b6967a edgar_igl
        env->pregs[n - 16] = tmp;
1355 d7b6967a edgar_igl
    }
1356 d7b6967a edgar_igl
1357 d7b6967a edgar_igl
    /* FIXME: Should support function regs be writable?  */
1358 56aebc89 pbrook
    switch (n) {
1359 56aebc89 pbrook
    case 16: return 1;
1360 56aebc89 pbrook
    case 17: return 1;
1361 d7b6967a edgar_igl
    case 18: env->pregs[PR_PID] = tmp; break;
1362 56aebc89 pbrook
    case 19: return 1;
1363 56aebc89 pbrook
    case 20: return 2;
1364 56aebc89 pbrook
    case 32: env->pc = tmp; break;
1365 56aebc89 pbrook
    }
1366 56aebc89 pbrook
1367 56aebc89 pbrook
    return 4;
1368 f1ccf904 ths
}
1369 19bf517b aurel32
#elif defined (TARGET_ALPHA)
1370 19bf517b aurel32
1371 7c5a90dd Richard Henderson
#define NUM_CORE_REGS 67
1372 19bf517b aurel32
1373 19bf517b aurel32
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1374 19bf517b aurel32
{
1375 7c5a90dd Richard Henderson
    uint64_t val;
1376 7c5a90dd Richard Henderson
    CPU_DoubleU d;
1377 19bf517b aurel32
1378 7c5a90dd Richard Henderson
    switch (n) {
1379 7c5a90dd Richard Henderson
    case 0 ... 30:
1380 7c5a90dd Richard Henderson
        val = env->ir[n];
1381 7c5a90dd Richard Henderson
        break;
1382 7c5a90dd Richard Henderson
    case 32 ... 62:
1383 7c5a90dd Richard Henderson
        d.d = env->fir[n - 32];
1384 7c5a90dd Richard Henderson
        val = d.ll;
1385 7c5a90dd Richard Henderson
        break;
1386 7c5a90dd Richard Henderson
    case 63:
1387 7c5a90dd Richard Henderson
        val = cpu_alpha_load_fpcr(env);
1388 7c5a90dd Richard Henderson
        break;
1389 7c5a90dd Richard Henderson
    case 64:
1390 7c5a90dd Richard Henderson
        val = env->pc;
1391 7c5a90dd Richard Henderson
        break;
1392 7c5a90dd Richard Henderson
    case 66:
1393 7c5a90dd Richard Henderson
        val = env->unique;
1394 7c5a90dd Richard Henderson
        break;
1395 7c5a90dd Richard Henderson
    case 31:
1396 7c5a90dd Richard Henderson
    case 65:
1397 7c5a90dd Richard Henderson
        /* 31 really is the zero register; 65 is unassigned in the
1398 7c5a90dd Richard Henderson
           gdb protocol, but is still required to occupy 8 bytes. */
1399 7c5a90dd Richard Henderson
        val = 0;
1400 7c5a90dd Richard Henderson
        break;
1401 7c5a90dd Richard Henderson
    default:
1402 7c5a90dd Richard Henderson
        return 0;
1403 19bf517b aurel32
    }
1404 7c5a90dd Richard Henderson
    GET_REGL(val);
1405 19bf517b aurel32
}
1406 19bf517b aurel32
1407 19bf517b aurel32
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1408 19bf517b aurel32
{
1409 7c5a90dd Richard Henderson
    target_ulong tmp = ldtul_p(mem_buf);
1410 7c5a90dd Richard Henderson
    CPU_DoubleU d;
1411 19bf517b aurel32
1412 7c5a90dd Richard Henderson
    switch (n) {
1413 7c5a90dd Richard Henderson
    case 0 ... 30:
1414 19bf517b aurel32
        env->ir[n] = tmp;
1415 7c5a90dd Richard Henderson
        break;
1416 7c5a90dd Richard Henderson
    case 32 ... 62:
1417 7c5a90dd Richard Henderson
        d.ll = tmp;
1418 7c5a90dd Richard Henderson
        env->fir[n - 32] = d.d;
1419 7c5a90dd Richard Henderson
        break;
1420 7c5a90dd Richard Henderson
    case 63:
1421 7c5a90dd Richard Henderson
        cpu_alpha_store_fpcr(env, tmp);
1422 7c5a90dd Richard Henderson
        break;
1423 7c5a90dd Richard Henderson
    case 64:
1424 7c5a90dd Richard Henderson
        env->pc = tmp;
1425 7c5a90dd Richard Henderson
        break;
1426 7c5a90dd Richard Henderson
    case 66:
1427 7c5a90dd Richard Henderson
        env->unique = tmp;
1428 7c5a90dd Richard Henderson
        break;
1429 7c5a90dd Richard Henderson
    case 31:
1430 7c5a90dd Richard Henderson
    case 65:
1431 7c5a90dd Richard Henderson
        /* 31 really is the zero register; 65 is unassigned in the
1432 7c5a90dd Richard Henderson
           gdb protocol, but is still required to occupy 8 bytes. */
1433 7c5a90dd Richard Henderson
        break;
1434 7c5a90dd Richard Henderson
    default:
1435 7c5a90dd Richard Henderson
        return 0;
1436 19bf517b aurel32
    }
1437 19bf517b aurel32
    return 8;
1438 19bf517b aurel32
}
1439 afcb0e45 Alexander Graf
#elif defined (TARGET_S390X)
1440 afcb0e45 Alexander Graf
1441 afcb0e45 Alexander Graf
#define NUM_CORE_REGS S390_NUM_TOTAL_REGS
1442 afcb0e45 Alexander Graf
1443 afcb0e45 Alexander Graf
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1444 afcb0e45 Alexander Graf
{
1445 afcb0e45 Alexander Graf
    switch (n) {
1446 afcb0e45 Alexander Graf
        case S390_PSWM_REGNUM: GET_REGL(env->psw.mask); break;
1447 afcb0e45 Alexander Graf
        case S390_PSWA_REGNUM: GET_REGL(env->psw.addr); break;
1448 afcb0e45 Alexander Graf
        case S390_R0_REGNUM ... S390_R15_REGNUM:
1449 afcb0e45 Alexander Graf
            GET_REGL(env->regs[n-S390_R0_REGNUM]); break;
1450 afcb0e45 Alexander Graf
        case S390_A0_REGNUM ... S390_A15_REGNUM:
1451 afcb0e45 Alexander Graf
            GET_REG32(env->aregs[n-S390_A0_REGNUM]); break;
1452 afcb0e45 Alexander Graf
        case S390_FPC_REGNUM: GET_REG32(env->fpc); break;
1453 afcb0e45 Alexander Graf
        case S390_F0_REGNUM ... S390_F15_REGNUM:
1454 afcb0e45 Alexander Graf
            /* XXX */
1455 afcb0e45 Alexander Graf
            break;
1456 afcb0e45 Alexander Graf
        case S390_PC_REGNUM: GET_REGL(env->psw.addr); break;
1457 59467bac Alexander Graf
        case S390_CC_REGNUM:
1458 59467bac Alexander Graf
            env->cc_op = calc_cc(env, env->cc_op, env->cc_src, env->cc_dst,
1459 59467bac Alexander Graf
                                 env->cc_vr);
1460 59467bac Alexander Graf
            GET_REG32(env->cc_op);
1461 59467bac Alexander Graf
            break;
1462 afcb0e45 Alexander Graf
    }
1463 afcb0e45 Alexander Graf
1464 afcb0e45 Alexander Graf
    return 0;
1465 afcb0e45 Alexander Graf
}
1466 afcb0e45 Alexander Graf
1467 afcb0e45 Alexander Graf
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1468 afcb0e45 Alexander Graf
{
1469 afcb0e45 Alexander Graf
    target_ulong tmpl;
1470 afcb0e45 Alexander Graf
    uint32_t tmp32;
1471 afcb0e45 Alexander Graf
    int r = 8;
1472 afcb0e45 Alexander Graf
    tmpl = ldtul_p(mem_buf);
1473 afcb0e45 Alexander Graf
    tmp32 = ldl_p(mem_buf);
1474 afcb0e45 Alexander Graf
1475 afcb0e45 Alexander Graf
    switch (n) {
1476 afcb0e45 Alexander Graf
        case S390_PSWM_REGNUM: env->psw.mask = tmpl; break;
1477 afcb0e45 Alexander Graf
        case S390_PSWA_REGNUM: env->psw.addr = tmpl; break;
1478 afcb0e45 Alexander Graf
        case S390_R0_REGNUM ... S390_R15_REGNUM:
1479 afcb0e45 Alexander Graf
            env->regs[n-S390_R0_REGNUM] = tmpl; break;
1480 afcb0e45 Alexander Graf
        case S390_A0_REGNUM ... S390_A15_REGNUM:
1481 afcb0e45 Alexander Graf
            env->aregs[n-S390_A0_REGNUM] = tmp32; r=4; break;
1482 afcb0e45 Alexander Graf
        case S390_FPC_REGNUM: env->fpc = tmp32; r=4; break;
1483 afcb0e45 Alexander Graf
        case S390_F0_REGNUM ... S390_F15_REGNUM:
1484 afcb0e45 Alexander Graf
            /* XXX */
1485 afcb0e45 Alexander Graf
            break;
1486 afcb0e45 Alexander Graf
        case S390_PC_REGNUM: env->psw.addr = tmpl; break;
1487 59467bac Alexander Graf
        case S390_CC_REGNUM: env->cc_op = tmp32; r=4; break;
1488 afcb0e45 Alexander Graf
    }
1489 afcb0e45 Alexander Graf
1490 afcb0e45 Alexander Graf
    return r;
1491 afcb0e45 Alexander Graf
}
1492 0c45d3d4 Michael Walle
#elif defined (TARGET_LM32)
1493 0c45d3d4 Michael Walle
1494 0c45d3d4 Michael Walle
#include "hw/lm32_pic.h"
1495 0c45d3d4 Michael Walle
#define NUM_CORE_REGS (32 + 7)
1496 0c45d3d4 Michael Walle
1497 0c45d3d4 Michael Walle
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1498 0c45d3d4 Michael Walle
{
1499 0c45d3d4 Michael Walle
    if (n < 32) {
1500 0c45d3d4 Michael Walle
        GET_REG32(env->regs[n]);
1501 0c45d3d4 Michael Walle
    } else {
1502 0c45d3d4 Michael Walle
        switch (n) {
1503 0c45d3d4 Michael Walle
        case 32:
1504 0c45d3d4 Michael Walle
            GET_REG32(env->pc);
1505 0c45d3d4 Michael Walle
            break;
1506 0c45d3d4 Michael Walle
        /* FIXME: put in right exception ID */
1507 0c45d3d4 Michael Walle
        case 33:
1508 0c45d3d4 Michael Walle
            GET_REG32(0);
1509 0c45d3d4 Michael Walle
            break;
1510 0c45d3d4 Michael Walle
        case 34:
1511 0c45d3d4 Michael Walle
            GET_REG32(env->eba);
1512 0c45d3d4 Michael Walle
            break;
1513 0c45d3d4 Michael Walle
        case 35:
1514 0c45d3d4 Michael Walle
            GET_REG32(env->deba);
1515 0c45d3d4 Michael Walle
            break;
1516 0c45d3d4 Michael Walle
        case 36:
1517 0c45d3d4 Michael Walle
            GET_REG32(env->ie);
1518 0c45d3d4 Michael Walle
            break;
1519 0c45d3d4 Michael Walle
        case 37:
1520 0c45d3d4 Michael Walle
            GET_REG32(lm32_pic_get_im(env->pic_state));
1521 0c45d3d4 Michael Walle
            break;
1522 0c45d3d4 Michael Walle
        case 38:
1523 0c45d3d4 Michael Walle
            GET_REG32(lm32_pic_get_ip(env->pic_state));
1524 0c45d3d4 Michael Walle
            break;
1525 0c45d3d4 Michael Walle
        }
1526 0c45d3d4 Michael Walle
    }
1527 0c45d3d4 Michael Walle
    return 0;
1528 0c45d3d4 Michael Walle
}
1529 0c45d3d4 Michael Walle
1530 0c45d3d4 Michael Walle
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1531 0c45d3d4 Michael Walle
{
1532 0c45d3d4 Michael Walle
    uint32_t tmp;
1533 0c45d3d4 Michael Walle
1534 0c45d3d4 Michael Walle
    if (n > NUM_CORE_REGS) {
1535 0c45d3d4 Michael Walle
        return 0;
1536 0c45d3d4 Michael Walle
    }
1537 0c45d3d4 Michael Walle
1538 0c45d3d4 Michael Walle
    tmp = ldl_p(mem_buf);
1539 0c45d3d4 Michael Walle
1540 0c45d3d4 Michael Walle
    if (n < 32) {
1541 0c45d3d4 Michael Walle
        env->regs[n] = tmp;
1542 0c45d3d4 Michael Walle
    } else {
1543 0c45d3d4 Michael Walle
        switch (n) {
1544 0c45d3d4 Michael Walle
        case 32:
1545 0c45d3d4 Michael Walle
            env->pc = tmp;
1546 0c45d3d4 Michael Walle
            break;
1547 0c45d3d4 Michael Walle
        case 34:
1548 0c45d3d4 Michael Walle
            env->eba = tmp;
1549 0c45d3d4 Michael Walle
            break;
1550 0c45d3d4 Michael Walle
        case 35:
1551 0c45d3d4 Michael Walle
            env->deba = tmp;
1552 0c45d3d4 Michael Walle
            break;
1553 0c45d3d4 Michael Walle
        case 36:
1554 0c45d3d4 Michael Walle
            env->ie = tmp;
1555 0c45d3d4 Michael Walle
            break;
1556 0c45d3d4 Michael Walle
        case 37:
1557 0c45d3d4 Michael Walle
            lm32_pic_set_im(env->pic_state, tmp);
1558 0c45d3d4 Michael Walle
            break;
1559 0c45d3d4 Michael Walle
        case 38:
1560 0c45d3d4 Michael Walle
            lm32_pic_set_ip(env->pic_state, tmp);
1561 0c45d3d4 Michael Walle
            break;
1562 0c45d3d4 Michael Walle
        }
1563 0c45d3d4 Michael Walle
    }
1564 0c45d3d4 Michael Walle
    return 4;
1565 0c45d3d4 Michael Walle
}
1566 ccfcaba6 Max Filippov
#elif defined(TARGET_XTENSA)
1567 ccfcaba6 Max Filippov
1568 ccfcaba6 Max Filippov
/* Use num_core_regs to see only non-privileged registers in an unmodified gdb.
1569 ccfcaba6 Max Filippov
 * Use num_regs to see all registers. gdb modification is required for that:
1570 ccfcaba6 Max Filippov
 * reset bit 0 in the 'flags' field of the registers definitions in the
1571 ccfcaba6 Max Filippov
 * gdb/xtensa-config.c inside gdb source tree or inside gdb overlay.
1572 ccfcaba6 Max Filippov
 */
1573 ccfcaba6 Max Filippov
#define NUM_CORE_REGS (env->config->gdb_regmap.num_regs)
1574 ccfcaba6 Max Filippov
#define num_g_regs NUM_CORE_REGS
1575 ccfcaba6 Max Filippov
1576 ccfcaba6 Max Filippov
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1577 ccfcaba6 Max Filippov
{
1578 ccfcaba6 Max Filippov
    const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1579 ccfcaba6 Max Filippov
1580 ccfcaba6 Max Filippov
    if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1581 ccfcaba6 Max Filippov
        return 0;
1582 ccfcaba6 Max Filippov
    }
1583 ccfcaba6 Max Filippov
1584 ccfcaba6 Max Filippov
    switch (reg->type) {
1585 ccfcaba6 Max Filippov
    case 9: /*pc*/
1586 ccfcaba6 Max Filippov
        GET_REG32(env->pc);
1587 ccfcaba6 Max Filippov
        break;
1588 ccfcaba6 Max Filippov
1589 ccfcaba6 Max Filippov
    case 1: /*ar*/
1590 ccfcaba6 Max Filippov
        xtensa_sync_phys_from_window(env);
1591 ccfcaba6 Max Filippov
        GET_REG32(env->phys_regs[(reg->targno & 0xff) % env->config->nareg]);
1592 ccfcaba6 Max Filippov
        break;
1593 ccfcaba6 Max Filippov
1594 ccfcaba6 Max Filippov
    case 2: /*SR*/
1595 ccfcaba6 Max Filippov
        GET_REG32(env->sregs[reg->targno & 0xff]);
1596 ccfcaba6 Max Filippov
        break;
1597 ccfcaba6 Max Filippov
1598 ccfcaba6 Max Filippov
    case 3: /*UR*/
1599 ccfcaba6 Max Filippov
        GET_REG32(env->uregs[reg->targno & 0xff]);
1600 ccfcaba6 Max Filippov
        break;
1601 ccfcaba6 Max Filippov
1602 ccfcaba6 Max Filippov
    case 8: /*a*/
1603 ccfcaba6 Max Filippov
        GET_REG32(env->regs[reg->targno & 0x0f]);
1604 ccfcaba6 Max Filippov
        break;
1605 ccfcaba6 Max Filippov
1606 ccfcaba6 Max Filippov
    default:
1607 ccfcaba6 Max Filippov
        qemu_log("%s from reg %d of unsupported type %d\n",
1608 ccfcaba6 Max Filippov
                __func__, n, reg->type);
1609 ccfcaba6 Max Filippov
        return 0;
1610 ccfcaba6 Max Filippov
    }
1611 ccfcaba6 Max Filippov
}
1612 ccfcaba6 Max Filippov
1613 ccfcaba6 Max Filippov
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1614 ccfcaba6 Max Filippov
{
1615 ccfcaba6 Max Filippov
    uint32_t tmp;
1616 ccfcaba6 Max Filippov
    const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
1617 ccfcaba6 Max Filippov
1618 ccfcaba6 Max Filippov
    if (n < 0 || n >= env->config->gdb_regmap.num_regs) {
1619 ccfcaba6 Max Filippov
        return 0;
1620 ccfcaba6 Max Filippov
    }
1621 ccfcaba6 Max Filippov
1622 ccfcaba6 Max Filippov
    tmp = ldl_p(mem_buf);
1623 ccfcaba6 Max Filippov
1624 ccfcaba6 Max Filippov
    switch (reg->type) {
1625 ccfcaba6 Max Filippov
    case 9: /*pc*/
1626 ccfcaba6 Max Filippov
        env->pc = tmp;
1627 ccfcaba6 Max Filippov
        break;
1628 ccfcaba6 Max Filippov
1629 ccfcaba6 Max Filippov
    case 1: /*ar*/
1630 ccfcaba6 Max Filippov
        env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
1631 ccfcaba6 Max Filippov
        xtensa_sync_window_from_phys(env);
1632 ccfcaba6 Max Filippov
        break;
1633 ccfcaba6 Max Filippov
1634 ccfcaba6 Max Filippov
    case 2: /*SR*/
1635 ccfcaba6 Max Filippov
        env->sregs[reg->targno & 0xff] = tmp;
1636 ccfcaba6 Max Filippov
        break;
1637 ccfcaba6 Max Filippov
1638 ccfcaba6 Max Filippov
    case 3: /*UR*/
1639 ccfcaba6 Max Filippov
        env->uregs[reg->targno & 0xff] = tmp;
1640 ccfcaba6 Max Filippov
        break;
1641 ccfcaba6 Max Filippov
1642 ccfcaba6 Max Filippov
    case 8: /*a*/
1643 ccfcaba6 Max Filippov
        env->regs[reg->targno & 0x0f] = tmp;
1644 ccfcaba6 Max Filippov
        break;
1645 ccfcaba6 Max Filippov
1646 ccfcaba6 Max Filippov
    default:
1647 ccfcaba6 Max Filippov
        qemu_log("%s to reg %d of unsupported type %d\n",
1648 ccfcaba6 Max Filippov
                __func__, n, reg->type);
1649 ccfcaba6 Max Filippov
        return 0;
1650 ccfcaba6 Max Filippov
    }
1651 ccfcaba6 Max Filippov
1652 ccfcaba6 Max Filippov
    return 4;
1653 ccfcaba6 Max Filippov
}
1654 56aebc89 pbrook
#else
1655 56aebc89 pbrook
1656 56aebc89 pbrook
#define NUM_CORE_REGS 0
1657 56aebc89 pbrook
1658 56aebc89 pbrook
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
1659 f1ccf904 ths
{
1660 56aebc89 pbrook
    return 0;
1661 f1ccf904 ths
}
1662 f1ccf904 ths
1663 56aebc89 pbrook
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
1664 f1ccf904 ths
{
1665 56aebc89 pbrook
    return 0;
1666 56aebc89 pbrook
}
1667 f1ccf904 ths
1668 56aebc89 pbrook
#endif
1669 f1ccf904 ths
1670 ccfcaba6 Max Filippov
#if !defined(TARGET_XTENSA)
1671 56aebc89 pbrook
static int num_g_regs = NUM_CORE_REGS;
1672 ccfcaba6 Max Filippov
#endif
1673 f1ccf904 ths
1674 56aebc89 pbrook
#ifdef GDB_CORE_XML
1675 56aebc89 pbrook
/* Encode data using the encoding for 'x' packets.  */
1676 56aebc89 pbrook
static int memtox(char *buf, const char *mem, int len)
1677 56aebc89 pbrook
{
1678 56aebc89 pbrook
    char *p = buf;
1679 56aebc89 pbrook
    char c;
1680 56aebc89 pbrook
1681 56aebc89 pbrook
    while (len--) {
1682 56aebc89 pbrook
        c = *(mem++);
1683 56aebc89 pbrook
        switch (c) {
1684 56aebc89 pbrook
        case '#': case '$': case '*': case '}':
1685 56aebc89 pbrook
            *(p++) = '}';
1686 56aebc89 pbrook
            *(p++) = c ^ 0x20;
1687 56aebc89 pbrook
            break;
1688 56aebc89 pbrook
        default:
1689 56aebc89 pbrook
            *(p++) = c;
1690 56aebc89 pbrook
            break;
1691 56aebc89 pbrook
        }
1692 56aebc89 pbrook
    }
1693 56aebc89 pbrook
    return p - buf;
1694 56aebc89 pbrook
}
1695 f1ccf904 ths
1696 3faf778e aurel32
static const char *get_feature_xml(const char *p, const char **newp)
1697 56aebc89 pbrook
{
1698 56aebc89 pbrook
    size_t len;
1699 56aebc89 pbrook
    int i;
1700 56aebc89 pbrook
    const char *name;
1701 56aebc89 pbrook
    static char target_xml[1024];
1702 56aebc89 pbrook
1703 56aebc89 pbrook
    len = 0;
1704 56aebc89 pbrook
    while (p[len] && p[len] != ':')
1705 56aebc89 pbrook
        len++;
1706 56aebc89 pbrook
    *newp = p + len;
1707 56aebc89 pbrook
1708 56aebc89 pbrook
    name = NULL;
1709 56aebc89 pbrook
    if (strncmp(p, "target.xml", len) == 0) {
1710 56aebc89 pbrook
        /* Generate the XML description for this CPU.  */
1711 56aebc89 pbrook
        if (!target_xml[0]) {
1712 56aebc89 pbrook
            GDBRegisterState *r;
1713 56aebc89 pbrook
1714 5b3715bf blueswir1
            snprintf(target_xml, sizeof(target_xml),
1715 5b3715bf blueswir1
                     "<?xml version=\"1.0\"?>"
1716 5b3715bf blueswir1
                     "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
1717 5b3715bf blueswir1
                     "<target>"
1718 5b3715bf blueswir1
                     "<xi:include href=\"%s\"/>",
1719 5b3715bf blueswir1
                     GDB_CORE_XML);
1720 56aebc89 pbrook
1721 880a7578 aliguori
            for (r = first_cpu->gdb_regs; r; r = r->next) {
1722 2dc766da blueswir1
                pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
1723 2dc766da blueswir1
                pstrcat(target_xml, sizeof(target_xml), r->xml);
1724 2dc766da blueswir1
                pstrcat(target_xml, sizeof(target_xml), "\"/>");
1725 56aebc89 pbrook
            }
1726 2dc766da blueswir1
            pstrcat(target_xml, sizeof(target_xml), "</target>");
1727 56aebc89 pbrook
        }
1728 56aebc89 pbrook
        return target_xml;
1729 56aebc89 pbrook
    }
1730 56aebc89 pbrook
    for (i = 0; ; i++) {
1731 56aebc89 pbrook
        name = xml_builtin[i][0];
1732 56aebc89 pbrook
        if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
1733 56aebc89 pbrook
            break;
1734 56aebc89 pbrook
    }
1735 56aebc89 pbrook
    return name ? xml_builtin[i][1] : NULL;
1736 56aebc89 pbrook
}
1737 56aebc89 pbrook
#endif
1738 f1ccf904 ths
1739 56aebc89 pbrook
static int gdb_read_register(CPUState *env, uint8_t *mem_buf, int reg)
1740 56aebc89 pbrook
{
1741 56aebc89 pbrook
    GDBRegisterState *r;
1742 f1ccf904 ths
1743 56aebc89 pbrook
    if (reg < NUM_CORE_REGS)
1744 56aebc89 pbrook
        return cpu_gdb_read_register(env, mem_buf, reg);
1745 f1ccf904 ths
1746 56aebc89 pbrook
    for (r = env->gdb_regs; r; r = r->next) {
1747 56aebc89 pbrook
        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1748 56aebc89 pbrook
            return r->get_reg(env, mem_buf, reg - r->base_reg);
1749 56aebc89 pbrook
        }
1750 56aebc89 pbrook
    }
1751 56aebc89 pbrook
    return 0;
1752 f1ccf904 ths
}
1753 f1ccf904 ths
1754 56aebc89 pbrook
static int gdb_write_register(CPUState *env, uint8_t *mem_buf, int reg)
1755 f1ccf904 ths
{
1756 56aebc89 pbrook
    GDBRegisterState *r;
1757 f1ccf904 ths
1758 56aebc89 pbrook
    if (reg < NUM_CORE_REGS)
1759 56aebc89 pbrook
        return cpu_gdb_write_register(env, mem_buf, reg);
1760 56aebc89 pbrook
1761 56aebc89 pbrook
    for (r = env->gdb_regs; r; r = r->next) {
1762 56aebc89 pbrook
        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
1763 56aebc89 pbrook
            return r->set_reg(env, mem_buf, reg - r->base_reg);
1764 56aebc89 pbrook
        }
1765 56aebc89 pbrook
    }
1766 6da41eaf bellard
    return 0;
1767 6da41eaf bellard
}
1768 6da41eaf bellard
1769 ccfcaba6 Max Filippov
#if !defined(TARGET_XTENSA)
1770 56aebc89 pbrook
/* Register a supplemental set of CPU registers.  If g_pos is nonzero it
1771 56aebc89 pbrook
   specifies the first register number and these registers are included in
1772 56aebc89 pbrook
   a standard "g" packet.  Direction is relative to gdb, i.e. get_reg is
1773 56aebc89 pbrook
   gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
1774 56aebc89 pbrook
 */
1775 56aebc89 pbrook
1776 56aebc89 pbrook
void gdb_register_coprocessor(CPUState * env,
1777 56aebc89 pbrook
                             gdb_reg_cb get_reg, gdb_reg_cb set_reg,
1778 56aebc89 pbrook
                             int num_regs, const char *xml, int g_pos)
1779 6da41eaf bellard
{
1780 56aebc89 pbrook
    GDBRegisterState *s;
1781 56aebc89 pbrook
    GDBRegisterState **p;
1782 56aebc89 pbrook
    static int last_reg = NUM_CORE_REGS;
1783 56aebc89 pbrook
1784 56aebc89 pbrook
    p = &env->gdb_regs;
1785 56aebc89 pbrook
    while (*p) {
1786 56aebc89 pbrook
        /* Check for duplicates.  */
1787 56aebc89 pbrook
        if (strcmp((*p)->xml, xml) == 0)
1788 56aebc89 pbrook
            return;
1789 56aebc89 pbrook
        p = &(*p)->next;
1790 56aebc89 pbrook
    }
1791 9643c25f Stefan Weil
1792 9643c25f Stefan Weil
    s = g_new0(GDBRegisterState, 1);
1793 9643c25f Stefan Weil
    s->base_reg = last_reg;
1794 9643c25f Stefan Weil
    s->num_regs = num_regs;
1795 9643c25f Stefan Weil
    s->get_reg = get_reg;
1796 9643c25f Stefan Weil
    s->set_reg = set_reg;
1797 9643c25f Stefan Weil
    s->xml = xml;
1798 9643c25f Stefan Weil
1799 56aebc89 pbrook
    /* Add to end of list.  */
1800 56aebc89 pbrook
    last_reg += num_regs;
1801 56aebc89 pbrook
    *p = s;
1802 56aebc89 pbrook
    if (g_pos) {
1803 56aebc89 pbrook
        if (g_pos != s->base_reg) {
1804 56aebc89 pbrook
            fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
1805 56aebc89 pbrook
                    "Expected %d got %d\n", xml, g_pos, s->base_reg);
1806 56aebc89 pbrook
        } else {
1807 56aebc89 pbrook
            num_g_regs = last_reg;
1808 56aebc89 pbrook
        }
1809 56aebc89 pbrook
    }
1810 6da41eaf bellard
}
1811 ccfcaba6 Max Filippov
#endif
1812 6da41eaf bellard
1813 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
1814 a1d1bb31 aliguori
static const int xlat_gdb_type[] = {
1815 a1d1bb31 aliguori
    [GDB_WATCHPOINT_WRITE]  = BP_GDB | BP_MEM_WRITE,
1816 a1d1bb31 aliguori
    [GDB_WATCHPOINT_READ]   = BP_GDB | BP_MEM_READ,
1817 a1d1bb31 aliguori
    [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
1818 a1d1bb31 aliguori
};
1819 a1d1bb31 aliguori
#endif
1820 a1d1bb31 aliguori
1821 880a7578 aliguori
static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
1822 a1d1bb31 aliguori
{
1823 880a7578 aliguori
    CPUState *env;
1824 880a7578 aliguori
    int err = 0;
1825 880a7578 aliguori
1826 e22a25c9 aliguori
    if (kvm_enabled())
1827 e22a25c9 aliguori
        return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1828 e22a25c9 aliguori
1829 a1d1bb31 aliguori
    switch (type) {
1830 a1d1bb31 aliguori
    case GDB_BREAKPOINT_SW:
1831 a1d1bb31 aliguori
    case GDB_BREAKPOINT_HW:
1832 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1833 880a7578 aliguori
            err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
1834 880a7578 aliguori
            if (err)
1835 880a7578 aliguori
                break;
1836 880a7578 aliguori
        }
1837 880a7578 aliguori
        return err;
1838 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
1839 a1d1bb31 aliguori
    case GDB_WATCHPOINT_WRITE:
1840 a1d1bb31 aliguori
    case GDB_WATCHPOINT_READ:
1841 a1d1bb31 aliguori
    case GDB_WATCHPOINT_ACCESS:
1842 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1843 880a7578 aliguori
            err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
1844 880a7578 aliguori
                                        NULL);
1845 880a7578 aliguori
            if (err)
1846 880a7578 aliguori
                break;
1847 880a7578 aliguori
        }
1848 880a7578 aliguori
        return err;
1849 a1d1bb31 aliguori
#endif
1850 a1d1bb31 aliguori
    default:
1851 a1d1bb31 aliguori
        return -ENOSYS;
1852 a1d1bb31 aliguori
    }
1853 a1d1bb31 aliguori
}
1854 a1d1bb31 aliguori
1855 880a7578 aliguori
static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
1856 a1d1bb31 aliguori
{
1857 880a7578 aliguori
    CPUState *env;
1858 880a7578 aliguori
    int err = 0;
1859 880a7578 aliguori
1860 e22a25c9 aliguori
    if (kvm_enabled())
1861 e22a25c9 aliguori
        return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
1862 e22a25c9 aliguori
1863 a1d1bb31 aliguori
    switch (type) {
1864 a1d1bb31 aliguori
    case GDB_BREAKPOINT_SW:
1865 a1d1bb31 aliguori
    case GDB_BREAKPOINT_HW:
1866 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1867 880a7578 aliguori
            err = cpu_breakpoint_remove(env, addr, BP_GDB);
1868 880a7578 aliguori
            if (err)
1869 880a7578 aliguori
                break;
1870 880a7578 aliguori
        }
1871 880a7578 aliguori
        return err;
1872 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
1873 a1d1bb31 aliguori
    case GDB_WATCHPOINT_WRITE:
1874 a1d1bb31 aliguori
    case GDB_WATCHPOINT_READ:
1875 a1d1bb31 aliguori
    case GDB_WATCHPOINT_ACCESS:
1876 880a7578 aliguori
        for (env = first_cpu; env != NULL; env = env->next_cpu) {
1877 880a7578 aliguori
            err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
1878 880a7578 aliguori
            if (err)
1879 880a7578 aliguori
                break;
1880 880a7578 aliguori
        }
1881 880a7578 aliguori
        return err;
1882 a1d1bb31 aliguori
#endif
1883 a1d1bb31 aliguori
    default:
1884 a1d1bb31 aliguori
        return -ENOSYS;
1885 a1d1bb31 aliguori
    }
1886 a1d1bb31 aliguori
}
1887 a1d1bb31 aliguori
1888 880a7578 aliguori
static void gdb_breakpoint_remove_all(void)
1889 a1d1bb31 aliguori
{
1890 880a7578 aliguori
    CPUState *env;
1891 880a7578 aliguori
1892 e22a25c9 aliguori
    if (kvm_enabled()) {
1893 e22a25c9 aliguori
        kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
1894 e22a25c9 aliguori
        return;
1895 e22a25c9 aliguori
    }
1896 e22a25c9 aliguori
1897 880a7578 aliguori
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
1898 880a7578 aliguori
        cpu_breakpoint_remove_all(env, BP_GDB);
1899 a1d1bb31 aliguori
#ifndef CONFIG_USER_ONLY
1900 880a7578 aliguori
        cpu_watchpoint_remove_all(env, BP_GDB);
1901 a1d1bb31 aliguori
#endif
1902 880a7578 aliguori
    }
1903 a1d1bb31 aliguori
}
1904 a1d1bb31 aliguori
1905 fab9d284 aurel32
static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
1906 fab9d284 aurel32
{
1907 fab9d284 aurel32
#if defined(TARGET_I386)
1908 4c0960c0 Avi Kivity
    cpu_synchronize_state(s->c_cpu);
1909 fab9d284 aurel32
    s->c_cpu->eip = pc;
1910 fab9d284 aurel32
#elif defined (TARGET_PPC)
1911 fab9d284 aurel32
    s->c_cpu->nip = pc;
1912 fab9d284 aurel32
#elif defined (TARGET_SPARC)
1913 fab9d284 aurel32
    s->c_cpu->pc = pc;
1914 fab9d284 aurel32
    s->c_cpu->npc = pc + 4;
1915 fab9d284 aurel32
#elif defined (TARGET_ARM)
1916 fab9d284 aurel32
    s->c_cpu->regs[15] = pc;
1917 fab9d284 aurel32
#elif defined (TARGET_SH4)
1918 fab9d284 aurel32
    s->c_cpu->pc = pc;
1919 fab9d284 aurel32
#elif defined (TARGET_MIPS)
1920 ff1d1977 Nathan Froyd
    s->c_cpu->active_tc.PC = pc & ~(target_ulong)1;
1921 ff1d1977 Nathan Froyd
    if (pc & 1) {
1922 ff1d1977 Nathan Froyd
        s->c_cpu->hflags |= MIPS_HFLAG_M16;
1923 ff1d1977 Nathan Froyd
    } else {
1924 ff1d1977 Nathan Froyd
        s->c_cpu->hflags &= ~(MIPS_HFLAG_M16);
1925 ff1d1977 Nathan Froyd
    }
1926 d74d6a99 Edgar E. Iglesias
#elif defined (TARGET_MICROBLAZE)
1927 d74d6a99 Edgar E. Iglesias
    s->c_cpu->sregs[SR_PC] = pc;
1928 fab9d284 aurel32
#elif defined (TARGET_CRIS)
1929 fab9d284 aurel32
    s->c_cpu->pc = pc;
1930 fab9d284 aurel32
#elif defined (TARGET_ALPHA)
1931 fab9d284 aurel32
    s->c_cpu->pc = pc;
1932 afcb0e45 Alexander Graf
#elif defined (TARGET_S390X)
1933 afcb0e45 Alexander Graf
    cpu_synchronize_state(s->c_cpu);
1934 afcb0e45 Alexander Graf
    s->c_cpu->psw.addr = pc;
1935 0c45d3d4 Michael Walle
#elif defined (TARGET_LM32)
1936 0c45d3d4 Michael Walle
    s->c_cpu->pc = pc;
1937 ccfcaba6 Max Filippov
#elif defined(TARGET_XTENSA)
1938 ccfcaba6 Max Filippov
    s->c_cpu->pc = pc;
1939 fab9d284 aurel32
#endif
1940 fab9d284 aurel32
}
1941 fab9d284 aurel32
1942 1e9fa730 Nathan Froyd
static inline int gdb_id(CPUState *env)
1943 1e9fa730 Nathan Froyd
{
1944 2f7bb878 Juan Quintela
#if defined(CONFIG_USER_ONLY) && defined(CONFIG_USE_NPTL)
1945 1e9fa730 Nathan Froyd
    return env->host_tid;
1946 1e9fa730 Nathan Froyd
#else
1947 1e9fa730 Nathan Froyd
    return env->cpu_index + 1;
1948 1e9fa730 Nathan Froyd
#endif
1949 1e9fa730 Nathan Froyd
}
1950 1e9fa730 Nathan Froyd
1951 1e9fa730 Nathan Froyd
static CPUState *find_cpu(uint32_t thread_id)
1952 1e9fa730 Nathan Froyd
{
1953 1e9fa730 Nathan Froyd
    CPUState *env;
1954 1e9fa730 Nathan Froyd
1955 1e9fa730 Nathan Froyd
    for (env = first_cpu; env != NULL; env = env->next_cpu) {
1956 1e9fa730 Nathan Froyd
        if (gdb_id(env) == thread_id) {
1957 1e9fa730 Nathan Froyd
            return env;
1958 1e9fa730 Nathan Froyd
        }
1959 1e9fa730 Nathan Froyd
    }
1960 1e9fa730 Nathan Froyd
1961 1e9fa730 Nathan Froyd
    return NULL;
1962 1e9fa730 Nathan Froyd
}
1963 1e9fa730 Nathan Froyd
1964 880a7578 aliguori
static int gdb_handle_packet(GDBState *s, const char *line_buf)
1965 b4608c04 bellard
{
1966 880a7578 aliguori
    CPUState *env;
1967 b4608c04 bellard
    const char *p;
1968 1e9fa730 Nathan Froyd
    uint32_t thread;
1969 1e9fa730 Nathan Froyd
    int ch, reg_size, type, res;
1970 56aebc89 pbrook
    char buf[MAX_PACKET_LENGTH];
1971 56aebc89 pbrook
    uint8_t mem_buf[MAX_PACKET_LENGTH];
1972 56aebc89 pbrook
    uint8_t *registers;
1973 9d9754a3 bellard
    target_ulong addr, len;
1974 3b46e624 ths
1975 858693c6 bellard
#ifdef DEBUG_GDB
1976 858693c6 bellard
    printf("command='%s'\n", line_buf);
1977 858693c6 bellard
#endif
1978 858693c6 bellard
    p = line_buf;
1979 858693c6 bellard
    ch = *p++;
1980 858693c6 bellard
    switch(ch) {
1981 858693c6 bellard
    case '?':
1982 1fddef4b bellard
        /* TODO: Make this return the correct value for user-mode.  */
1983 ca587a8e aurel32
        snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
1984 1e9fa730 Nathan Froyd
                 gdb_id(s->c_cpu));
1985 858693c6 bellard
        put_packet(s, buf);
1986 7d03f82f edgar_igl
        /* Remove all the breakpoints when this query is issued,
1987 7d03f82f edgar_igl
         * because gdb is doing and initial connect and the state
1988 7d03f82f edgar_igl
         * should be cleaned up.
1989 7d03f82f edgar_igl
         */
1990 880a7578 aliguori
        gdb_breakpoint_remove_all();
1991 858693c6 bellard
        break;
1992 858693c6 bellard
    case 'c':
1993 858693c6 bellard
        if (*p != '\0') {
1994 9d9754a3 bellard
            addr = strtoull(p, (char **)&p, 16);
1995 fab9d284 aurel32
            gdb_set_cpu_pc(s, addr);
1996 858693c6 bellard
        }
1997 ca587a8e aurel32
        s->signal = 0;
1998 ba70a624 edgar_igl
        gdb_continue(s);
1999 41625033 bellard
        return RS_IDLE;
2000 1f487ee9 edgar_igl
    case 'C':
2001 ca587a8e aurel32
        s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
2002 ca587a8e aurel32
        if (s->signal == -1)
2003 ca587a8e aurel32
            s->signal = 0;
2004 1f487ee9 edgar_igl
        gdb_continue(s);
2005 1f487ee9 edgar_igl
        return RS_IDLE;
2006 dd32aa10 Jan Kiszka
    case 'v':
2007 dd32aa10 Jan Kiszka
        if (strncmp(p, "Cont", 4) == 0) {
2008 dd32aa10 Jan Kiszka
            int res_signal, res_thread;
2009 dd32aa10 Jan Kiszka
2010 dd32aa10 Jan Kiszka
            p += 4;
2011 dd32aa10 Jan Kiszka
            if (*p == '?') {
2012 dd32aa10 Jan Kiszka
                put_packet(s, "vCont;c;C;s;S");
2013 dd32aa10 Jan Kiszka
                break;
2014 dd32aa10 Jan Kiszka
            }
2015 dd32aa10 Jan Kiszka
            res = 0;
2016 dd32aa10 Jan Kiszka
            res_signal = 0;
2017 dd32aa10 Jan Kiszka
            res_thread = 0;
2018 dd32aa10 Jan Kiszka
            while (*p) {
2019 dd32aa10 Jan Kiszka
                int action, signal;
2020 dd32aa10 Jan Kiszka
2021 dd32aa10 Jan Kiszka
                if (*p++ != ';') {
2022 dd32aa10 Jan Kiszka
                    res = 0;
2023 dd32aa10 Jan Kiszka
                    break;
2024 dd32aa10 Jan Kiszka
                }
2025 dd32aa10 Jan Kiszka
                action = *p++;
2026 dd32aa10 Jan Kiszka
                signal = 0;
2027 dd32aa10 Jan Kiszka
                if (action == 'C' || action == 'S') {
2028 dd32aa10 Jan Kiszka
                    signal = strtoul(p, (char **)&p, 16);
2029 dd32aa10 Jan Kiszka
                } else if (action != 'c' && action != 's') {
2030 dd32aa10 Jan Kiszka
                    res = 0;
2031 dd32aa10 Jan Kiszka
                    break;
2032 dd32aa10 Jan Kiszka
                }
2033 dd32aa10 Jan Kiszka
                thread = 0;
2034 dd32aa10 Jan Kiszka
                if (*p == ':') {
2035 dd32aa10 Jan Kiszka
                    thread = strtoull(p+1, (char **)&p, 16);
2036 dd32aa10 Jan Kiszka
                }
2037 dd32aa10 Jan Kiszka
                action = tolower(action);
2038 dd32aa10 Jan Kiszka
                if (res == 0 || (res == 'c' && action == 's')) {
2039 dd32aa10 Jan Kiszka
                    res = action;
2040 dd32aa10 Jan Kiszka
                    res_signal = signal;
2041 dd32aa10 Jan Kiszka
                    res_thread = thread;
2042 dd32aa10 Jan Kiszka
                }
2043 dd32aa10 Jan Kiszka
            }
2044 dd32aa10 Jan Kiszka
            if (res) {
2045 dd32aa10 Jan Kiszka
                if (res_thread != -1 && res_thread != 0) {
2046 dd32aa10 Jan Kiszka
                    env = find_cpu(res_thread);
2047 dd32aa10 Jan Kiszka
                    if (env == NULL) {
2048 dd32aa10 Jan Kiszka
                        put_packet(s, "E22");
2049 dd32aa10 Jan Kiszka
                        break;
2050 dd32aa10 Jan Kiszka
                    }
2051 dd32aa10 Jan Kiszka
                    s->c_cpu = env;
2052 dd32aa10 Jan Kiszka
                }
2053 dd32aa10 Jan Kiszka
                if (res == 's') {
2054 dd32aa10 Jan Kiszka
                    cpu_single_step(s->c_cpu, sstep_flags);
2055 dd32aa10 Jan Kiszka
                }
2056 dd32aa10 Jan Kiszka
                s->signal = res_signal;
2057 dd32aa10 Jan Kiszka
                gdb_continue(s);
2058 dd32aa10 Jan Kiszka
                return RS_IDLE;
2059 dd32aa10 Jan Kiszka
            }
2060 dd32aa10 Jan Kiszka
            break;
2061 dd32aa10 Jan Kiszka
        } else {
2062 dd32aa10 Jan Kiszka
            goto unknown_command;
2063 dd32aa10 Jan Kiszka
        }
2064 7d03f82f edgar_igl
    case 'k':
2065 7d03f82f edgar_igl
        /* Kill the target */
2066 7d03f82f edgar_igl
        fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
2067 7d03f82f edgar_igl
        exit(0);
2068 7d03f82f edgar_igl
    case 'D':
2069 7d03f82f edgar_igl
        /* Detach packet */
2070 880a7578 aliguori
        gdb_breakpoint_remove_all();
2071 7ea06da3 Daniel Gutson
        gdb_syscall_mode = GDB_SYS_DISABLED;
2072 7d03f82f edgar_igl
        gdb_continue(s);
2073 7d03f82f edgar_igl
        put_packet(s, "OK");
2074 7d03f82f edgar_igl
        break;
2075 858693c6 bellard
    case 's':
2076 858693c6 bellard
        if (*p != '\0') {
2077 8fac5803 ths
            addr = strtoull(p, (char **)&p, 16);
2078 fab9d284 aurel32
            gdb_set_cpu_pc(s, addr);
2079 858693c6 bellard
        }
2080 880a7578 aliguori
        cpu_single_step(s->c_cpu, sstep_flags);
2081 ba70a624 edgar_igl
        gdb_continue(s);
2082 41625033 bellard
        return RS_IDLE;
2083 a2d1ebaf pbrook
    case 'F':
2084 a2d1ebaf pbrook
        {
2085 a2d1ebaf pbrook
            target_ulong ret;
2086 a2d1ebaf pbrook
            target_ulong err;
2087 a2d1ebaf pbrook
2088 a2d1ebaf pbrook
            ret = strtoull(p, (char **)&p, 16);
2089 a2d1ebaf pbrook
            if (*p == ',') {
2090 a2d1ebaf pbrook
                p++;
2091 a2d1ebaf pbrook
                err = strtoull(p, (char **)&p, 16);
2092 a2d1ebaf pbrook
            } else {
2093 a2d1ebaf pbrook
                err = 0;
2094 a2d1ebaf pbrook
            }
2095 a2d1ebaf pbrook
            if (*p == ',')
2096 a2d1ebaf pbrook
                p++;
2097 a2d1ebaf pbrook
            type = *p;
2098 a2d1ebaf pbrook
            if (gdb_current_syscall_cb)
2099 880a7578 aliguori
                gdb_current_syscall_cb(s->c_cpu, ret, err);
2100 a2d1ebaf pbrook
            if (type == 'C') {
2101 a2d1ebaf pbrook
                put_packet(s, "T02");
2102 a2d1ebaf pbrook
            } else {
2103 ba70a624 edgar_igl
                gdb_continue(s);
2104 a2d1ebaf pbrook
            }
2105 a2d1ebaf pbrook
        }
2106 a2d1ebaf pbrook
        break;
2107 858693c6 bellard
    case 'g':
2108 4c0960c0 Avi Kivity
        cpu_synchronize_state(s->g_cpu);
2109 ccfcaba6 Max Filippov
        env = s->g_cpu;
2110 56aebc89 pbrook
        len = 0;
2111 56aebc89 pbrook
        for (addr = 0; addr < num_g_regs; addr++) {
2112 880a7578 aliguori
            reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
2113 56aebc89 pbrook
            len += reg_size;
2114 56aebc89 pbrook
        }
2115 56aebc89 pbrook
        memtohex(buf, mem_buf, len);
2116 858693c6 bellard
        put_packet(s, buf);
2117 858693c6 bellard
        break;
2118 858693c6 bellard
    case 'G':
2119 4c0960c0 Avi Kivity
        cpu_synchronize_state(s->g_cpu);
2120 ccfcaba6 Max Filippov
        env = s->g_cpu;
2121 56aebc89 pbrook
        registers = mem_buf;
2122 858693c6 bellard
        len = strlen(p) / 2;
2123 858693c6 bellard
        hextomem((uint8_t *)registers, p, len);
2124 56aebc89 pbrook
        for (addr = 0; addr < num_g_regs && len > 0; addr++) {
2125 880a7578 aliguori
            reg_size = gdb_write_register(s->g_cpu, registers, addr);
2126 56aebc89 pbrook
            len -= reg_size;
2127 56aebc89 pbrook
            registers += reg_size;
2128 56aebc89 pbrook
        }
2129 858693c6 bellard
        put_packet(s, "OK");
2130 858693c6 bellard
        break;
2131 858693c6 bellard
    case 'm':
2132 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
2133 858693c6 bellard
        if (*p == ',')
2134 858693c6 bellard
            p++;
2135 9d9754a3 bellard
        len = strtoull(p, NULL, 16);
2136 44520db1 Fabien Chouteau
        if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 0) != 0) {
2137 6f970bd9 bellard
            put_packet (s, "E14");
2138 6f970bd9 bellard
        } else {
2139 6f970bd9 bellard
            memtohex(buf, mem_buf, len);
2140 6f970bd9 bellard
            put_packet(s, buf);
2141 6f970bd9 bellard
        }
2142 858693c6 bellard
        break;
2143 858693c6 bellard
    case 'M':
2144 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
2145 858693c6 bellard
        if (*p == ',')
2146 858693c6 bellard
            p++;
2147 9d9754a3 bellard
        len = strtoull(p, (char **)&p, 16);
2148 b328f873 bellard
        if (*p == ':')
2149 858693c6 bellard
            p++;
2150 858693c6 bellard
        hextomem(mem_buf, p, len);
2151 44520db1 Fabien Chouteau
        if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, 1) != 0) {
2152 905f20b1 bellard
            put_packet(s, "E14");
2153 44520db1 Fabien Chouteau
        } else {
2154 858693c6 bellard
            put_packet(s, "OK");
2155 44520db1 Fabien Chouteau
        }
2156 858693c6 bellard
        break;
2157 56aebc89 pbrook
    case 'p':
2158 56aebc89 pbrook
        /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
2159 56aebc89 pbrook
           This works, but can be very slow.  Anything new enough to
2160 56aebc89 pbrook
           understand XML also knows how to use this properly.  */
2161 56aebc89 pbrook
        if (!gdb_has_xml)
2162 56aebc89 pbrook
            goto unknown_command;
2163 56aebc89 pbrook
        addr = strtoull(p, (char **)&p, 16);
2164 880a7578 aliguori
        reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
2165 56aebc89 pbrook
        if (reg_size) {
2166 56aebc89 pbrook
            memtohex(buf, mem_buf, reg_size);
2167 56aebc89 pbrook
            put_packet(s, buf);
2168 56aebc89 pbrook
        } else {
2169 56aebc89 pbrook
            put_packet(s, "E14");
2170 56aebc89 pbrook
        }
2171 56aebc89 pbrook
        break;
2172 56aebc89 pbrook
    case 'P':
2173 56aebc89 pbrook
        if (!gdb_has_xml)
2174 56aebc89 pbrook
            goto unknown_command;
2175 56aebc89 pbrook
        addr = strtoull(p, (char **)&p, 16);
2176 56aebc89 pbrook
        if (*p == '=')
2177 56aebc89 pbrook
            p++;
2178 56aebc89 pbrook
        reg_size = strlen(p) / 2;
2179 56aebc89 pbrook
        hextomem(mem_buf, p, reg_size);
2180 880a7578 aliguori
        gdb_write_register(s->g_cpu, mem_buf, addr);
2181 56aebc89 pbrook
        put_packet(s, "OK");
2182 56aebc89 pbrook
        break;
2183 858693c6 bellard
    case 'Z':
2184 858693c6 bellard
    case 'z':
2185 858693c6 bellard
        type = strtoul(p, (char **)&p, 16);
2186 858693c6 bellard
        if (*p == ',')
2187 858693c6 bellard
            p++;
2188 9d9754a3 bellard
        addr = strtoull(p, (char **)&p, 16);
2189 858693c6 bellard
        if (*p == ',')
2190 858693c6 bellard
            p++;
2191 9d9754a3 bellard
        len = strtoull(p, (char **)&p, 16);
2192 a1d1bb31 aliguori
        if (ch == 'Z')
2193 880a7578 aliguori
            res = gdb_breakpoint_insert(addr, len, type);
2194 a1d1bb31 aliguori
        else
2195 880a7578 aliguori
            res = gdb_breakpoint_remove(addr, len, type);
2196 a1d1bb31 aliguori
        if (res >= 0)
2197 a1d1bb31 aliguori
             put_packet(s, "OK");
2198 a1d1bb31 aliguori
        else if (res == -ENOSYS)
2199 0f459d16 pbrook
            put_packet(s, "");
2200 a1d1bb31 aliguori
        else
2201 a1d1bb31 aliguori
            put_packet(s, "E22");
2202 858693c6 bellard
        break;
2203 880a7578 aliguori
    case 'H':
2204 880a7578 aliguori
        type = *p++;
2205 880a7578 aliguori
        thread = strtoull(p, (char **)&p, 16);
2206 880a7578 aliguori
        if (thread == -1 || thread == 0) {
2207 880a7578 aliguori
            put_packet(s, "OK");
2208 880a7578 aliguori
            break;
2209 880a7578 aliguori
        }
2210 1e9fa730 Nathan Froyd
        env = find_cpu(thread);
2211 880a7578 aliguori
        if (env == NULL) {
2212 880a7578 aliguori
            put_packet(s, "E22");
2213 880a7578 aliguori
            break;
2214 880a7578 aliguori
        }
2215 880a7578 aliguori
        switch (type) {
2216 880a7578 aliguori
        case 'c':
2217 880a7578 aliguori
            s->c_cpu = env;
2218 880a7578 aliguori
            put_packet(s, "OK");
2219 880a7578 aliguori
            break;
2220 880a7578 aliguori
        case 'g':
2221 880a7578 aliguori
            s->g_cpu = env;
2222 880a7578 aliguori
            put_packet(s, "OK");
2223 880a7578 aliguori
            break;
2224 880a7578 aliguori
        default:
2225 880a7578 aliguori
             put_packet(s, "E22");
2226 880a7578 aliguori
             break;
2227 880a7578 aliguori
        }
2228 880a7578 aliguori
        break;
2229 880a7578 aliguori
    case 'T':
2230 880a7578 aliguori
        thread = strtoull(p, (char **)&p, 16);
2231 1e9fa730 Nathan Froyd
        env = find_cpu(thread);
2232 1e9fa730 Nathan Froyd
2233 1e9fa730 Nathan Froyd
        if (env != NULL) {
2234 1e9fa730 Nathan Froyd
            put_packet(s, "OK");
2235 1e9fa730 Nathan Froyd
        } else {
2236 880a7578 aliguori
            put_packet(s, "E22");
2237 1e9fa730 Nathan Froyd
        }
2238 880a7578 aliguori
        break;
2239 978efd6a pbrook
    case 'q':
2240 60897d36 edgar_igl
    case 'Q':
2241 60897d36 edgar_igl
        /* parse any 'q' packets here */
2242 60897d36 edgar_igl
        if (!strcmp(p,"qemu.sstepbits")) {
2243 60897d36 edgar_igl
            /* Query Breakpoint bit definitions */
2244 363a37d5 blueswir1
            snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
2245 363a37d5 blueswir1
                     SSTEP_ENABLE,
2246 363a37d5 blueswir1
                     SSTEP_NOIRQ,
2247 363a37d5 blueswir1
                     SSTEP_NOTIMER);
2248 60897d36 edgar_igl
            put_packet(s, buf);
2249 60897d36 edgar_igl
            break;
2250 60897d36 edgar_igl
        } else if (strncmp(p,"qemu.sstep",10) == 0) {
2251 60897d36 edgar_igl
            /* Display or change the sstep_flags */
2252 60897d36 edgar_igl
            p += 10;
2253 60897d36 edgar_igl
            if (*p != '=') {
2254 60897d36 edgar_igl
                /* Display current setting */
2255 363a37d5 blueswir1
                snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
2256 60897d36 edgar_igl
                put_packet(s, buf);
2257 60897d36 edgar_igl
                break;
2258 60897d36 edgar_igl
            }
2259 60897d36 edgar_igl
            p++;
2260 60897d36 edgar_igl
            type = strtoul(p, (char **)&p, 16);
2261 60897d36 edgar_igl
            sstep_flags = type;
2262 60897d36 edgar_igl
            put_packet(s, "OK");
2263 60897d36 edgar_igl
            break;
2264 880a7578 aliguori
        } else if (strcmp(p,"C") == 0) {
2265 880a7578 aliguori
            /* "Current thread" remains vague in the spec, so always return
2266 880a7578 aliguori
             *  the first CPU (gdb returns the first thread). */
2267 880a7578 aliguori
            put_packet(s, "QC1");
2268 880a7578 aliguori
            break;
2269 880a7578 aliguori
        } else if (strcmp(p,"fThreadInfo") == 0) {
2270 880a7578 aliguori
            s->query_cpu = first_cpu;
2271 880a7578 aliguori
            goto report_cpuinfo;
2272 880a7578 aliguori
        } else if (strcmp(p,"sThreadInfo") == 0) {
2273 880a7578 aliguori
        report_cpuinfo:
2274 880a7578 aliguori
            if (s->query_cpu) {
2275 1e9fa730 Nathan Froyd
                snprintf(buf, sizeof(buf), "m%x", gdb_id(s->query_cpu));
2276 880a7578 aliguori
                put_packet(s, buf);
2277 880a7578 aliguori
                s->query_cpu = s->query_cpu->next_cpu;
2278 880a7578 aliguori
            } else
2279 880a7578 aliguori
                put_packet(s, "l");
2280 880a7578 aliguori
            break;
2281 880a7578 aliguori
        } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
2282 880a7578 aliguori
            thread = strtoull(p+16, (char **)&p, 16);
2283 1e9fa730 Nathan Froyd
            env = find_cpu(thread);
2284 1e9fa730 Nathan Froyd
            if (env != NULL) {
2285 4c0960c0 Avi Kivity
                cpu_synchronize_state(env);
2286 1e9fa730 Nathan Froyd
                len = snprintf((char *)mem_buf, sizeof(mem_buf),
2287 1e9fa730 Nathan Froyd
                               "CPU#%d [%s]", env->cpu_index,
2288 1e9fa730 Nathan Froyd
                               env->halted ? "halted " : "running");
2289 1e9fa730 Nathan Froyd
                memtohex(buf, mem_buf, len);
2290 1e9fa730 Nathan Froyd
                put_packet(s, buf);
2291 1e9fa730 Nathan Froyd
            }
2292 880a7578 aliguori
            break;
2293 60897d36 edgar_igl
        }
2294 0b8a988c blueswir1
#ifdef CONFIG_USER_ONLY
2295 60897d36 edgar_igl
        else if (strncmp(p, "Offsets", 7) == 0) {
2296 880a7578 aliguori
            TaskState *ts = s->c_cpu->opaque;
2297 978efd6a pbrook
2298 363a37d5 blueswir1
            snprintf(buf, sizeof(buf),
2299 363a37d5 blueswir1
                     "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
2300 363a37d5 blueswir1
                     ";Bss=" TARGET_ABI_FMT_lx,
2301 363a37d5 blueswir1
                     ts->info->code_offset,
2302 363a37d5 blueswir1
                     ts->info->data_offset,
2303 363a37d5 blueswir1
                     ts->info->data_offset);
2304 978efd6a pbrook
            put_packet(s, buf);
2305 978efd6a pbrook
            break;
2306 978efd6a pbrook
        }
2307 0b8a988c blueswir1
#else /* !CONFIG_USER_ONLY */
2308 8a34a0fb aliguori
        else if (strncmp(p, "Rcmd,", 5) == 0) {
2309 8a34a0fb aliguori
            int len = strlen(p + 5);
2310 8a34a0fb aliguori
2311 8a34a0fb aliguori
            if ((len % 2) != 0) {
2312 8a34a0fb aliguori
                put_packet(s, "E01");
2313 8a34a0fb aliguori
                break;
2314 8a34a0fb aliguori
            }
2315 8a34a0fb aliguori
            hextomem(mem_buf, p + 5, len);
2316 8a34a0fb aliguori
            len = len / 2;
2317 8a34a0fb aliguori
            mem_buf[len++] = 0;
2318 fa5efccb Anthony Liguori
            qemu_chr_be_write(s->mon_chr, mem_buf, len);
2319 8a34a0fb aliguori
            put_packet(s, "OK");
2320 8a34a0fb aliguori
            break;
2321 8a34a0fb aliguori
        }
2322 0b8a988c blueswir1
#endif /* !CONFIG_USER_ONLY */
2323 56aebc89 pbrook
        if (strncmp(p, "Supported", 9) == 0) {
2324 5b3715bf blueswir1
            snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
2325 56aebc89 pbrook
#ifdef GDB_CORE_XML
2326 2dc766da blueswir1
            pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
2327 56aebc89 pbrook
#endif
2328 56aebc89 pbrook
            put_packet(s, buf);
2329 56aebc89 pbrook
            break;
2330 56aebc89 pbrook
        }
2331 56aebc89 pbrook
#ifdef GDB_CORE_XML
2332 56aebc89 pbrook
        if (strncmp(p, "Xfer:features:read:", 19) == 0) {
2333 56aebc89 pbrook
            const char *xml;
2334 56aebc89 pbrook
            target_ulong total_len;
2335 56aebc89 pbrook
2336 56aebc89 pbrook
            gdb_has_xml = 1;
2337 56aebc89 pbrook
            p += 19;
2338 880a7578 aliguori
            xml = get_feature_xml(p, &p);
2339 56aebc89 pbrook
            if (!xml) {
2340 5b3715bf blueswir1
                snprintf(buf, sizeof(buf), "E00");
2341 56aebc89 pbrook
                put_packet(s, buf);
2342 56aebc89 pbrook
                break;
2343 56aebc89 pbrook
            }
2344 56aebc89 pbrook
2345 56aebc89 pbrook
            if (*p == ':')
2346 56aebc89 pbrook
                p++;
2347 56aebc89 pbrook
            addr = strtoul(p, (char **)&p, 16);
2348 56aebc89 pbrook
            if (*p == ',')
2349 56aebc89 pbrook
                p++;
2350 56aebc89 pbrook
            len = strtoul(p, (char **)&p, 16);
2351 56aebc89 pbrook
2352 56aebc89 pbrook
            total_len = strlen(xml);
2353 56aebc89 pbrook
            if (addr > total_len) {
2354 5b3715bf blueswir1
                snprintf(buf, sizeof(buf), "E00");
2355 56aebc89 pbrook
                put_packet(s, buf);
2356 56aebc89 pbrook
                break;
2357 56aebc89 pbrook
            }
2358 56aebc89 pbrook
            if (len > (MAX_PACKET_LENGTH - 5) / 2)
2359 56aebc89 pbrook
                len = (MAX_PACKET_LENGTH - 5) / 2;
2360 56aebc89 pbrook
            if (len < total_len - addr) {
2361 56aebc89 pbrook
                buf[0] = 'm';
2362 56aebc89 pbrook
                len = memtox(buf + 1, xml + addr, len);
2363 56aebc89 pbrook
            } else {
2364 56aebc89 pbrook
                buf[0] = 'l';
2365 56aebc89 pbrook
                len = memtox(buf + 1, xml + addr, total_len - addr);
2366 56aebc89 pbrook
            }
2367 56aebc89 pbrook
            put_packet_binary(s, buf, len + 1);
2368 56aebc89 pbrook
            break;
2369 56aebc89 pbrook
        }
2370 56aebc89 pbrook
#endif
2371 56aebc89 pbrook
        /* Unrecognised 'q' command.  */
2372 56aebc89 pbrook
        goto unknown_command;
2373 56aebc89 pbrook
2374 858693c6 bellard
    default:
2375 56aebc89 pbrook
    unknown_command:
2376 858693c6 bellard
        /* put empty packet */
2377 858693c6 bellard
        buf[0] = '\0';
2378 858693c6 bellard
        put_packet(s, buf);
2379 858693c6 bellard
        break;
2380 858693c6 bellard
    }
2381 858693c6 bellard
    return RS_IDLE;
2382 858693c6 bellard
}
2383 858693c6 bellard
2384 880a7578 aliguori
void gdb_set_stop_cpu(CPUState *env)
2385 880a7578 aliguori
{
2386 880a7578 aliguori
    gdbserver_state->c_cpu = env;
2387 880a7578 aliguori
    gdbserver_state->g_cpu = env;
2388 880a7578 aliguori
}
2389 880a7578 aliguori
2390 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
2391 1dfb4dd9 Luiz Capitulino
static void gdb_vm_state_change(void *opaque, int running, RunState state)
2392 858693c6 bellard
{
2393 880a7578 aliguori
    GDBState *s = gdbserver_state;
2394 880a7578 aliguori
    CPUState *env = s->c_cpu;
2395 858693c6 bellard
    char buf[256];
2396 d6fc1b39 aliguori
    const char *type;
2397 858693c6 bellard
    int ret;
2398 858693c6 bellard
2399 425189a8 Jan Kiszka
    if (running || s->state == RS_INACTIVE || s->state == RS_SYSCALL) {
2400 a2d1ebaf pbrook
        return;
2401 e07bbac5 Jan Kiszka
    }
2402 1dfb4dd9 Luiz Capitulino
    switch (state) {
2403 0461d5a6 Luiz Capitulino
    case RUN_STATE_DEBUG:
2404 880a7578 aliguori
        if (env->watchpoint_hit) {
2405 880a7578 aliguori
            switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
2406 a1d1bb31 aliguori
            case BP_MEM_READ:
2407 d6fc1b39 aliguori
                type = "r";
2408 d6fc1b39 aliguori
                break;
2409 a1d1bb31 aliguori
            case BP_MEM_ACCESS:
2410 d6fc1b39 aliguori
                type = "a";
2411 d6fc1b39 aliguori
                break;
2412 d6fc1b39 aliguori
            default:
2413 d6fc1b39 aliguori
                type = "";
2414 d6fc1b39 aliguori
                break;
2415 d6fc1b39 aliguori
            }
2416 880a7578 aliguori
            snprintf(buf, sizeof(buf),
2417 880a7578 aliguori
                     "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
2418 1e9fa730 Nathan Froyd
                     GDB_SIGNAL_TRAP, gdb_id(env), type,
2419 880a7578 aliguori
                     env->watchpoint_hit->vaddr);
2420 880a7578 aliguori
            env->watchpoint_hit = NULL;
2421 425189a8 Jan Kiszka
            goto send_packet;
2422 6658ffb8 pbrook
        }
2423 425189a8 Jan Kiszka
        tb_flush(env);
2424 ca587a8e aurel32
        ret = GDB_SIGNAL_TRAP;
2425 425189a8 Jan Kiszka
        break;
2426 0461d5a6 Luiz Capitulino
    case RUN_STATE_PAUSED:
2427 9781e040 aliguori
        ret = GDB_SIGNAL_INT;
2428 425189a8 Jan Kiszka
        break;
2429 0461d5a6 Luiz Capitulino
    case RUN_STATE_SHUTDOWN:
2430 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_QUIT;
2431 425189a8 Jan Kiszka
        break;
2432 0461d5a6 Luiz Capitulino
    case RUN_STATE_IO_ERROR:
2433 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_IO;
2434 425189a8 Jan Kiszka
        break;
2435 0461d5a6 Luiz Capitulino
    case RUN_STATE_WATCHDOG:
2436 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_ALRM;
2437 425189a8 Jan Kiszka
        break;
2438 0461d5a6 Luiz Capitulino
    case RUN_STATE_INTERNAL_ERROR:
2439 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_ABRT;
2440 425189a8 Jan Kiszka
        break;
2441 0461d5a6 Luiz Capitulino
    case RUN_STATE_SAVE_VM:
2442 0461d5a6 Luiz Capitulino
    case RUN_STATE_RESTORE_VM:
2443 425189a8 Jan Kiszka
        return;
2444 0461d5a6 Luiz Capitulino
    case RUN_STATE_FINISH_MIGRATE:
2445 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_XCPU;
2446 425189a8 Jan Kiszka
        break;
2447 425189a8 Jan Kiszka
    default:
2448 425189a8 Jan Kiszka
        ret = GDB_SIGNAL_UNKNOWN;
2449 425189a8 Jan Kiszka
        break;
2450 bbeb7b5c bellard
    }
2451 1e9fa730 Nathan Froyd
    snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, gdb_id(env));
2452 425189a8 Jan Kiszka
2453 425189a8 Jan Kiszka
send_packet:
2454 858693c6 bellard
    put_packet(s, buf);
2455 425189a8 Jan Kiszka
2456 425189a8 Jan Kiszka
    /* disable single step if it was enabled */
2457 425189a8 Jan Kiszka
    cpu_single_step(env, 0);
2458 858693c6 bellard
}
2459 1fddef4b bellard
#endif
2460 858693c6 bellard
2461 a2d1ebaf pbrook
/* Send a gdb syscall request.
2462 a2d1ebaf pbrook
   This accepts limited printf-style format specifiers, specifically:
2463 a87295e8 pbrook
    %x  - target_ulong argument printed in hex.
2464 a87295e8 pbrook
    %lx - 64-bit argument printed in hex.
2465 a87295e8 pbrook
    %s  - string pointer (target_ulong) and length (int) pair.  */
2466 7ccfb2eb blueswir1
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
2467 a2d1ebaf pbrook
{
2468 a2d1ebaf pbrook
    va_list va;
2469 a2d1ebaf pbrook
    char buf[256];
2470 a2d1ebaf pbrook
    char *p;
2471 a2d1ebaf pbrook
    target_ulong addr;
2472 a87295e8 pbrook
    uint64_t i64;
2473 a2d1ebaf pbrook
    GDBState *s;
2474 a2d1ebaf pbrook
2475 880a7578 aliguori
    s = gdbserver_state;
2476 a2d1ebaf pbrook
    if (!s)
2477 a2d1ebaf pbrook
        return;
2478 a2d1ebaf pbrook
    gdb_current_syscall_cb = cb;
2479 a2d1ebaf pbrook
    s->state = RS_SYSCALL;
2480 a2d1ebaf pbrook
#ifndef CONFIG_USER_ONLY
2481 0461d5a6 Luiz Capitulino
    vm_stop(RUN_STATE_DEBUG);
2482 a2d1ebaf pbrook
#endif
2483 a2d1ebaf pbrook
    s->state = RS_IDLE;
2484 a2d1ebaf pbrook
    va_start(va, fmt);
2485 a2d1ebaf pbrook
    p = buf;
2486 a2d1ebaf pbrook
    *(p++) = 'F';
2487 a2d1ebaf pbrook
    while (*fmt) {
2488 a2d1ebaf pbrook
        if (*fmt == '%') {
2489 a2d1ebaf pbrook
            fmt++;
2490 a2d1ebaf pbrook
            switch (*fmt++) {
2491 a2d1ebaf pbrook
            case 'x':
2492 a2d1ebaf pbrook
                addr = va_arg(va, target_ulong);
2493 363a37d5 blueswir1
                p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx, addr);
2494 a2d1ebaf pbrook
                break;
2495 a87295e8 pbrook
            case 'l':
2496 a87295e8 pbrook
                if (*(fmt++) != 'x')
2497 a87295e8 pbrook
                    goto bad_format;
2498 a87295e8 pbrook
                i64 = va_arg(va, uint64_t);
2499 363a37d5 blueswir1
                p += snprintf(p, &buf[sizeof(buf)] - p, "%" PRIx64, i64);
2500 a87295e8 pbrook
                break;
2501 a2d1ebaf pbrook
            case 's':
2502 a2d1ebaf pbrook
                addr = va_arg(va, target_ulong);
2503 363a37d5 blueswir1
                p += snprintf(p, &buf[sizeof(buf)] - p, TARGET_FMT_lx "/%x",
2504 363a37d5 blueswir1
                              addr, va_arg(va, int));
2505 a2d1ebaf pbrook
                break;
2506 a2d1ebaf pbrook
            default:
2507 a87295e8 pbrook
            bad_format:
2508 a2d1ebaf pbrook
                fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
2509 a2d1ebaf pbrook
                        fmt - 1);
2510 a2d1ebaf pbrook
                break;
2511 a2d1ebaf pbrook
            }
2512 a2d1ebaf pbrook
        } else {
2513 a2d1ebaf pbrook
            *(p++) = *(fmt++);
2514 a2d1ebaf pbrook
        }
2515 a2d1ebaf pbrook
    }
2516 8a93e02a pbrook
    *p = 0;
2517 a2d1ebaf pbrook
    va_end(va);
2518 a2d1ebaf pbrook
    put_packet(s, buf);
2519 a2d1ebaf pbrook
#ifdef CONFIG_USER_ONLY
2520 880a7578 aliguori
    gdb_handlesig(s->c_cpu, 0);
2521 a2d1ebaf pbrook
#else
2522 3098dba0 aurel32
    cpu_exit(s->c_cpu);
2523 a2d1ebaf pbrook
#endif
2524 a2d1ebaf pbrook
}
2525 a2d1ebaf pbrook
2526 6a00d601 bellard
static void gdb_read_byte(GDBState *s, int ch)
2527 858693c6 bellard
{
2528 858693c6 bellard
    int i, csum;
2529 60fe76f3 ths
    uint8_t reply;
2530 858693c6 bellard
2531 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
2532 4046d913 pbrook
    if (s->last_packet_len) {
2533 4046d913 pbrook
        /* Waiting for a response to the last packet.  If we see the start
2534 4046d913 pbrook
           of a new command then abandon the previous response.  */
2535 4046d913 pbrook
        if (ch == '-') {
2536 4046d913 pbrook
#ifdef DEBUG_GDB
2537 4046d913 pbrook
            printf("Got NACK, retransmitting\n");
2538 4046d913 pbrook
#endif
2539 ffe8ab83 ths
            put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
2540 4046d913 pbrook
        }
2541 4046d913 pbrook
#ifdef DEBUG_GDB
2542 4046d913 pbrook
        else if (ch == '+')
2543 4046d913 pbrook
            printf("Got ACK\n");
2544 4046d913 pbrook
        else
2545 4046d913 pbrook
            printf("Got '%c' when expecting ACK/NACK\n", ch);
2546 4046d913 pbrook
#endif
2547 4046d913 pbrook
        if (ch == '+' || ch == '$')
2548 4046d913 pbrook
            s->last_packet_len = 0;
2549 4046d913 pbrook
        if (ch != '$')
2550 4046d913 pbrook
            return;
2551 4046d913 pbrook
    }
2552 1354869c Luiz Capitulino
    if (runstate_is_running()) {
2553 858693c6 bellard
        /* when the CPU is running, we cannot do anything except stop
2554 858693c6 bellard
           it when receiving a char */
2555 0461d5a6 Luiz Capitulino
        vm_stop(RUN_STATE_PAUSED);
2556 5fafdf24 ths
    } else
2557 1fddef4b bellard
#endif
2558 41625033 bellard
    {
2559 858693c6 bellard
        switch(s->state) {
2560 858693c6 bellard
        case RS_IDLE:
2561 858693c6 bellard
            if (ch == '$') {
2562 858693c6 bellard
                s->line_buf_index = 0;
2563 858693c6 bellard
                s->state = RS_GETLINE;
2564 c33a346e bellard
            }
2565 b4608c04 bellard
            break;
2566 858693c6 bellard
        case RS_GETLINE:
2567 858693c6 bellard
            if (ch == '#') {
2568 858693c6 bellard
            s->state = RS_CHKSUM1;
2569 858693c6 bellard
            } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
2570 858693c6 bellard
                s->state = RS_IDLE;
2571 4c3a88a2 bellard
            } else {
2572 858693c6 bellard
            s->line_buf[s->line_buf_index++] = ch;
2573 4c3a88a2 bellard
            }
2574 4c3a88a2 bellard
            break;
2575 858693c6 bellard
        case RS_CHKSUM1:
2576 858693c6 bellard
            s->line_buf[s->line_buf_index] = '\0';
2577 858693c6 bellard
            s->line_csum = fromhex(ch) << 4;
2578 858693c6 bellard
            s->state = RS_CHKSUM2;
2579 858693c6 bellard
            break;
2580 858693c6 bellard
        case RS_CHKSUM2:
2581 858693c6 bellard
            s->line_csum |= fromhex(ch);
2582 858693c6 bellard
            csum = 0;
2583 858693c6 bellard
            for(i = 0; i < s->line_buf_index; i++) {
2584 858693c6 bellard
                csum += s->line_buf[i];
2585 858693c6 bellard
            }
2586 858693c6 bellard
            if (s->line_csum != (csum & 0xff)) {
2587 60fe76f3 ths
                reply = '-';
2588 60fe76f3 ths
                put_buffer(s, &reply, 1);
2589 858693c6 bellard
                s->state = RS_IDLE;
2590 4c3a88a2 bellard
            } else {
2591 60fe76f3 ths
                reply = '+';
2592 60fe76f3 ths
                put_buffer(s, &reply, 1);
2593 880a7578 aliguori
                s->state = gdb_handle_packet(s, s->line_buf);
2594 4c3a88a2 bellard
            }
2595 4c3a88a2 bellard
            break;
2596 a2d1ebaf pbrook
        default:
2597 a2d1ebaf pbrook
            abort();
2598 858693c6 bellard
        }
2599 858693c6 bellard
    }
2600 858693c6 bellard
}
2601 858693c6 bellard
2602 0e1c9c54 Paul Brook
/* Tell the remote gdb that the process has exited.  */
2603 0e1c9c54 Paul Brook
void gdb_exit(CPUState *env, int code)
2604 0e1c9c54 Paul Brook
{
2605 0e1c9c54 Paul Brook
  GDBState *s;
2606 0e1c9c54 Paul Brook
  char buf[4];
2607 0e1c9c54 Paul Brook
2608 0e1c9c54 Paul Brook
  s = gdbserver_state;
2609 0e1c9c54 Paul Brook
  if (!s) {
2610 0e1c9c54 Paul Brook
      return;
2611 0e1c9c54 Paul Brook
  }
2612 0e1c9c54 Paul Brook
#ifdef CONFIG_USER_ONLY
2613 0e1c9c54 Paul Brook
  if (gdbserver_fd < 0 || s->fd < 0) {
2614 0e1c9c54 Paul Brook
      return;
2615 0e1c9c54 Paul Brook
  }
2616 0e1c9c54 Paul Brook
#endif
2617 0e1c9c54 Paul Brook
2618 0e1c9c54 Paul Brook
  snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
2619 0e1c9c54 Paul Brook
  put_packet(s, buf);
2620 e2af15b2 Fabien Chouteau
2621 e2af15b2 Fabien Chouteau
#ifndef CONFIG_USER_ONLY
2622 e2af15b2 Fabien Chouteau
  if (s->chr) {
2623 70f24fb6 Anthony Liguori
      qemu_chr_delete(s->chr);
2624 e2af15b2 Fabien Chouteau
  }
2625 e2af15b2 Fabien Chouteau
#endif
2626 0e1c9c54 Paul Brook
}
2627 0e1c9c54 Paul Brook
2628 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
2629 1fddef4b bellard
int
2630 ca587a8e aurel32
gdb_queuesig (void)
2631 ca587a8e aurel32
{
2632 ca587a8e aurel32
    GDBState *s;
2633 ca587a8e aurel32
2634 ca587a8e aurel32
    s = gdbserver_state;
2635 ca587a8e aurel32
2636 ca587a8e aurel32
    if (gdbserver_fd < 0 || s->fd < 0)
2637 ca587a8e aurel32
        return 0;
2638 ca587a8e aurel32
    else
2639 ca587a8e aurel32
        return 1;
2640 ca587a8e aurel32
}
2641 ca587a8e aurel32
2642 ca587a8e aurel32
int
2643 1fddef4b bellard
gdb_handlesig (CPUState *env, int sig)
2644 1fddef4b bellard
{
2645 1fddef4b bellard
  GDBState *s;
2646 1fddef4b bellard
  char buf[256];
2647 1fddef4b bellard
  int n;
2648 1fddef4b bellard
2649 880a7578 aliguori
  s = gdbserver_state;
2650 1f487ee9 edgar_igl
  if (gdbserver_fd < 0 || s->fd < 0)
2651 1f487ee9 edgar_igl
    return sig;
2652 1fddef4b bellard
2653 1fddef4b bellard
  /* disable single step if it was enabled */
2654 1fddef4b bellard
  cpu_single_step(env, 0);
2655 1fddef4b bellard
  tb_flush(env);
2656 1fddef4b bellard
2657 1fddef4b bellard
  if (sig != 0)
2658 1fddef4b bellard
    {
2659 ca587a8e aurel32
      snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb (sig));
2660 1fddef4b bellard
      put_packet(s, buf);
2661 1fddef4b bellard
    }
2662 1f487ee9 edgar_igl
  /* put_packet() might have detected that the peer terminated the 
2663 1f487ee9 edgar_igl
     connection.  */
2664 1f487ee9 edgar_igl
  if (s->fd < 0)
2665 1f487ee9 edgar_igl
      return sig;
2666 1fddef4b bellard
2667 1fddef4b bellard
  sig = 0;
2668 1fddef4b bellard
  s->state = RS_IDLE;
2669 41625033 bellard
  s->running_state = 0;
2670 41625033 bellard
  while (s->running_state == 0) {
2671 1fddef4b bellard
      n = read (s->fd, buf, 256);
2672 1fddef4b bellard
      if (n > 0)
2673 1fddef4b bellard
        {
2674 1fddef4b bellard
          int i;
2675 1fddef4b bellard
2676 1fddef4b bellard
          for (i = 0; i < n; i++)
2677 6a00d601 bellard
            gdb_read_byte (s, buf[i]);
2678 1fddef4b bellard
        }
2679 1fddef4b bellard
      else if (n == 0 || errno != EAGAIN)
2680 1fddef4b bellard
        {
2681 e7d81004 Stefan Weil
          /* XXX: Connection closed.  Should probably wait for another
2682 1fddef4b bellard
             connection before continuing.  */
2683 1fddef4b bellard
          return sig;
2684 1fddef4b bellard
        }
2685 41625033 bellard
  }
2686 1f487ee9 edgar_igl
  sig = s->signal;
2687 1f487ee9 edgar_igl
  s->signal = 0;
2688 1fddef4b bellard
  return sig;
2689 1fddef4b bellard
}
2690 e9009676 bellard
2691 ca587a8e aurel32
/* Tell the remote gdb that the process has exited due to SIG.  */
2692 ca587a8e aurel32
void gdb_signalled(CPUState *env, int sig)
2693 ca587a8e aurel32
{
2694 ca587a8e aurel32
  GDBState *s;
2695 ca587a8e aurel32
  char buf[4];
2696 ca587a8e aurel32
2697 ca587a8e aurel32
  s = gdbserver_state;
2698 ca587a8e aurel32
  if (gdbserver_fd < 0 || s->fd < 0)
2699 ca587a8e aurel32
    return;
2700 ca587a8e aurel32
2701 ca587a8e aurel32
  snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb (sig));
2702 ca587a8e aurel32
  put_packet(s, buf);
2703 ca587a8e aurel32
}
2704 1fddef4b bellard
2705 880a7578 aliguori
static void gdb_accept(void)
2706 858693c6 bellard
{
2707 858693c6 bellard
    GDBState *s;
2708 858693c6 bellard
    struct sockaddr_in sockaddr;
2709 858693c6 bellard
    socklen_t len;
2710 858693c6 bellard
    int val, fd;
2711 858693c6 bellard
2712 858693c6 bellard
    for(;;) {
2713 858693c6 bellard
        len = sizeof(sockaddr);
2714 858693c6 bellard
        fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
2715 858693c6 bellard
        if (fd < 0 && errno != EINTR) {
2716 858693c6 bellard
            perror("accept");
2717 858693c6 bellard
            return;
2718 858693c6 bellard
        } else if (fd >= 0) {
2719 40ff6d7e Kevin Wolf
#ifndef _WIN32
2720 40ff6d7e Kevin Wolf
            fcntl(fd, F_SETFD, FD_CLOEXEC);
2721 40ff6d7e Kevin Wolf
#endif
2722 b4608c04 bellard
            break;
2723 b4608c04 bellard
        }
2724 b4608c04 bellard
    }
2725 858693c6 bellard
2726 858693c6 bellard
    /* set short latency */
2727 858693c6 bellard
    val = 1;
2728 8f447cc7 bellard
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
2729 3b46e624 ths
2730 7267c094 Anthony Liguori
    s = g_malloc0(sizeof(GDBState));
2731 880a7578 aliguori
    s->c_cpu = first_cpu;
2732 880a7578 aliguori
    s->g_cpu = first_cpu;
2733 858693c6 bellard
    s->fd = fd;
2734 56aebc89 pbrook
    gdb_has_xml = 0;
2735 858693c6 bellard
2736 880a7578 aliguori
    gdbserver_state = s;
2737 a2d1ebaf pbrook
2738 858693c6 bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
2739 858693c6 bellard
}
2740 858693c6 bellard
2741 858693c6 bellard
static int gdbserver_open(int port)
2742 858693c6 bellard
{
2743 858693c6 bellard
    struct sockaddr_in sockaddr;
2744 858693c6 bellard
    int fd, val, ret;
2745 858693c6 bellard
2746 858693c6 bellard
    fd = socket(PF_INET, SOCK_STREAM, 0);
2747 858693c6 bellard
    if (fd < 0) {
2748 858693c6 bellard
        perror("socket");
2749 858693c6 bellard
        return -1;
2750 858693c6 bellard
    }
2751 40ff6d7e Kevin Wolf
#ifndef _WIN32
2752 40ff6d7e Kevin Wolf
    fcntl(fd, F_SETFD, FD_CLOEXEC);
2753 40ff6d7e Kevin Wolf
#endif
2754 858693c6 bellard
2755 858693c6 bellard
    /* allow fast reuse */
2756 858693c6 bellard
    val = 1;
2757 8f447cc7 bellard
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
2758 858693c6 bellard
2759 858693c6 bellard
    sockaddr.sin_family = AF_INET;
2760 858693c6 bellard
    sockaddr.sin_port = htons(port);
2761 858693c6 bellard
    sockaddr.sin_addr.s_addr = 0;
2762 858693c6 bellard
    ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
2763 858693c6 bellard
    if (ret < 0) {
2764 858693c6 bellard
        perror("bind");
2765 bb16172c Peter Maydell
        close(fd);
2766 858693c6 bellard
        return -1;
2767 858693c6 bellard
    }
2768 858693c6 bellard
    ret = listen(fd, 0);
2769 858693c6 bellard
    if (ret < 0) {
2770 858693c6 bellard
        perror("listen");
2771 bb16172c Peter Maydell
        close(fd);
2772 858693c6 bellard
        return -1;
2773 858693c6 bellard
    }
2774 858693c6 bellard
    return fd;
2775 858693c6 bellard
}
2776 858693c6 bellard
2777 858693c6 bellard
int gdbserver_start(int port)
2778 858693c6 bellard
{
2779 858693c6 bellard
    gdbserver_fd = gdbserver_open(port);
2780 858693c6 bellard
    if (gdbserver_fd < 0)
2781 858693c6 bellard
        return -1;
2782 858693c6 bellard
    /* accept connections */
2783 880a7578 aliguori
    gdb_accept();
2784 4046d913 pbrook
    return 0;
2785 4046d913 pbrook
}
2786 2b1319c8 aurel32
2787 2b1319c8 aurel32
/* Disable gdb stub for child processes.  */
2788 2b1319c8 aurel32
void gdbserver_fork(CPUState *env)
2789 2b1319c8 aurel32
{
2790 2b1319c8 aurel32
    GDBState *s = gdbserver_state;
2791 9f6164d6 edgar_igl
    if (gdbserver_fd < 0 || s->fd < 0)
2792 2b1319c8 aurel32
      return;
2793 2b1319c8 aurel32
    close(s->fd);
2794 2b1319c8 aurel32
    s->fd = -1;
2795 2b1319c8 aurel32
    cpu_breakpoint_remove_all(env, BP_GDB);
2796 2b1319c8 aurel32
    cpu_watchpoint_remove_all(env, BP_GDB);
2797 2b1319c8 aurel32
}
2798 1fddef4b bellard
#else
2799 aa1f17c1 ths
static int gdb_chr_can_receive(void *opaque)
2800 4046d913 pbrook
{
2801 56aebc89 pbrook
  /* We can handle an arbitrarily large amount of data.
2802 56aebc89 pbrook
   Pick the maximum packet size, which is as good as anything.  */
2803 56aebc89 pbrook
  return MAX_PACKET_LENGTH;
2804 4046d913 pbrook
}
2805 4046d913 pbrook
2806 aa1f17c1 ths
static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
2807 4046d913 pbrook
{
2808 4046d913 pbrook
    int i;
2809 4046d913 pbrook
2810 4046d913 pbrook
    for (i = 0; i < size; i++) {
2811 880a7578 aliguori
        gdb_read_byte(gdbserver_state, buf[i]);
2812 4046d913 pbrook
    }
2813 4046d913 pbrook
}
2814 4046d913 pbrook
2815 4046d913 pbrook
static void gdb_chr_event(void *opaque, int event)
2816 4046d913 pbrook
{
2817 4046d913 pbrook
    switch (event) {
2818 b6b8df56 Amit Shah
    case CHR_EVENT_OPENED:
2819 0461d5a6 Luiz Capitulino
        vm_stop(RUN_STATE_PAUSED);
2820 56aebc89 pbrook
        gdb_has_xml = 0;
2821 4046d913 pbrook
        break;
2822 4046d913 pbrook
    default:
2823 4046d913 pbrook
        break;
2824 4046d913 pbrook
    }
2825 4046d913 pbrook
}
2826 4046d913 pbrook
2827 8a34a0fb aliguori
static void gdb_monitor_output(GDBState *s, const char *msg, int len)
2828 8a34a0fb aliguori
{
2829 8a34a0fb aliguori
    char buf[MAX_PACKET_LENGTH];
2830 8a34a0fb aliguori
2831 8a34a0fb aliguori
    buf[0] = 'O';
2832 8a34a0fb aliguori
    if (len > (MAX_PACKET_LENGTH/2) - 1)
2833 8a34a0fb aliguori
        len = (MAX_PACKET_LENGTH/2) - 1;
2834 8a34a0fb aliguori
    memtohex(buf + 1, (uint8_t *)msg, len);
2835 8a34a0fb aliguori
    put_packet(s, buf);
2836 8a34a0fb aliguori
}
2837 8a34a0fb aliguori
2838 8a34a0fb aliguori
static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
2839 8a34a0fb aliguori
{
2840 8a34a0fb aliguori
    const char *p = (const char *)buf;
2841 8a34a0fb aliguori
    int max_sz;
2842 8a34a0fb aliguori
2843 8a34a0fb aliguori
    max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
2844 8a34a0fb aliguori
    for (;;) {
2845 8a34a0fb aliguori
        if (len <= max_sz) {
2846 8a34a0fb aliguori
            gdb_monitor_output(gdbserver_state, p, len);
2847 8a34a0fb aliguori
            break;
2848 8a34a0fb aliguori
        }
2849 8a34a0fb aliguori
        gdb_monitor_output(gdbserver_state, p, max_sz);
2850 8a34a0fb aliguori
        p += max_sz;
2851 8a34a0fb aliguori
        len -= max_sz;
2852 8a34a0fb aliguori
    }
2853 8a34a0fb aliguori
    return len;
2854 8a34a0fb aliguori
}
2855 8a34a0fb aliguori
2856 59030a8c aliguori
#ifndef _WIN32
2857 59030a8c aliguori
static void gdb_sigterm_handler(int signal)
2858 59030a8c aliguori
{
2859 1354869c Luiz Capitulino
    if (runstate_is_running()) {
2860 0461d5a6 Luiz Capitulino
        vm_stop(RUN_STATE_PAUSED);
2861 e07bbac5 Jan Kiszka
    }
2862 59030a8c aliguori
}
2863 59030a8c aliguori
#endif
2864 59030a8c aliguori
2865 59030a8c aliguori
int gdbserver_start(const char *device)
2866 4046d913 pbrook
{
2867 4046d913 pbrook
    GDBState *s;
2868 59030a8c aliguori
    char gdbstub_device_name[128];
2869 36556b20 aliguori
    CharDriverState *chr = NULL;
2870 36556b20 aliguori
    CharDriverState *mon_chr;
2871 cfc3475a pbrook
2872 59030a8c aliguori
    if (!device)
2873 59030a8c aliguori
        return -1;
2874 59030a8c aliguori
    if (strcmp(device, "none") != 0) {
2875 59030a8c aliguori
        if (strstart(device, "tcp:", NULL)) {
2876 59030a8c aliguori
            /* enforce required TCP attributes */
2877 59030a8c aliguori
            snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
2878 59030a8c aliguori
                     "%s,nowait,nodelay,server", device);
2879 59030a8c aliguori
            device = gdbstub_device_name;
2880 36556b20 aliguori
        }
2881 59030a8c aliguori
#ifndef _WIN32
2882 59030a8c aliguori
        else if (strcmp(device, "stdio") == 0) {
2883 59030a8c aliguori
            struct sigaction act;
2884 4046d913 pbrook
2885 59030a8c aliguori
            memset(&act, 0, sizeof(act));
2886 59030a8c aliguori
            act.sa_handler = gdb_sigterm_handler;
2887 59030a8c aliguori
            sigaction(SIGINT, &act, NULL);
2888 59030a8c aliguori
        }
2889 59030a8c aliguori
#endif
2890 27143a44 Anthony Liguori
        chr = qemu_chr_new("gdb", device, NULL);
2891 36556b20 aliguori
        if (!chr)
2892 36556b20 aliguori
            return -1;
2893 36556b20 aliguori
2894 36556b20 aliguori
        qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2895 36556b20 aliguori
                              gdb_chr_event, NULL);
2896 cfc3475a pbrook
    }
2897 cfc3475a pbrook
2898 36556b20 aliguori
    s = gdbserver_state;
2899 36556b20 aliguori
    if (!s) {
2900 7267c094 Anthony Liguori
        s = g_malloc0(sizeof(GDBState));
2901 36556b20 aliguori
        gdbserver_state = s;
2902 4046d913 pbrook
2903 36556b20 aliguori
        qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2904 36556b20 aliguori
2905 36556b20 aliguori
        /* Initialize a monitor terminal for gdb */
2906 7267c094 Anthony Liguori
        mon_chr = g_malloc0(sizeof(*mon_chr));
2907 36556b20 aliguori
        mon_chr->chr_write = gdb_monitor_write;
2908 36556b20 aliguori
        monitor_init(mon_chr, 0);
2909 36556b20 aliguori
    } else {
2910 36556b20 aliguori
        if (s->chr)
2911 70f24fb6 Anthony Liguori
            qemu_chr_delete(s->chr);
2912 36556b20 aliguori
        mon_chr = s->mon_chr;
2913 36556b20 aliguori
        memset(s, 0, sizeof(GDBState));
2914 36556b20 aliguori
    }
2915 880a7578 aliguori
    s->c_cpu = first_cpu;
2916 880a7578 aliguori
    s->g_cpu = first_cpu;
2917 4046d913 pbrook
    s->chr = chr;
2918 36556b20 aliguori
    s->state = chr ? RS_IDLE : RS_INACTIVE;
2919 36556b20 aliguori
    s->mon_chr = mon_chr;
2920 8a34a0fb aliguori
2921 b4608c04 bellard
    return 0;
2922 b4608c04 bellard
}
2923 4046d913 pbrook
#endif