Statistics
| Branch: | Revision:

root / gdbstub.c @ 0a9564b9

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