Statistics
| Branch: | Revision:

root / gdbstub.c @ db895a1e

History | View | Annotate | Download (76.2 kB)

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