Statistics
| Branch: | Revision:

root / gdbstub.c @ 67f36560

History | View | Annotate | Download (22.4 kB)

1 b4608c04 bellard
/*
2 b4608c04 bellard
 * gdb server stub
3 b4608c04 bellard
 * 
4 3475187d bellard
 * Copyright (c) 2003-2005 Fabrice Bellard
5 b4608c04 bellard
 *
6 b4608c04 bellard
 * This library is free software; you can redistribute it and/or
7 b4608c04 bellard
 * modify it under the terms of the GNU Lesser General Public
8 b4608c04 bellard
 * License as published by the Free Software Foundation; either
9 b4608c04 bellard
 * version 2 of the License, or (at your option) any later version.
10 b4608c04 bellard
 *
11 b4608c04 bellard
 * This library is distributed in the hope that it will be useful,
12 b4608c04 bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 b4608c04 bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 b4608c04 bellard
 * Lesser General Public License for more details.
15 b4608c04 bellard
 *
16 b4608c04 bellard
 * You should have received a copy of the GNU Lesser General Public
17 b4608c04 bellard
 * License along with this library; if not, write to the Free Software
18 b4608c04 bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 b4608c04 bellard
 */
20 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
21 1fddef4b bellard
#include <stdlib.h>
22 1fddef4b bellard
#include <stdio.h>
23 1fddef4b bellard
#include <stdarg.h>
24 1fddef4b bellard
#include <string.h>
25 1fddef4b bellard
#include <errno.h>
26 1fddef4b bellard
#include <unistd.h>
27 1fddef4b bellard
28 1fddef4b bellard
#include "qemu.h"
29 1fddef4b bellard
#else
30 67b915a5 bellard
#include "vl.h"
31 1fddef4b bellard
#endif
32 67b915a5 bellard
33 b4608c04 bellard
#include <sys/socket.h>
34 b4608c04 bellard
#include <netinet/in.h>
35 b4608c04 bellard
#include <netinet/tcp.h>
36 b4608c04 bellard
#include <signal.h>
37 b4608c04 bellard
38 4abe615b bellard
//#define DEBUG_GDB
39 b4608c04 bellard
40 858693c6 bellard
enum RSState {
41 858693c6 bellard
    RS_IDLE,
42 858693c6 bellard
    RS_GETLINE,
43 858693c6 bellard
    RS_CHKSUM1,
44 858693c6 bellard
    RS_CHKSUM2,
45 858693c6 bellard
};
46 1fddef4b bellard
/* XXX: This is not thread safe.  Do we care?  */
47 1fddef4b bellard
static int gdbserver_fd = -1;
48 b4608c04 bellard
49 858693c6 bellard
typedef struct GDBState {
50 6a00d601 bellard
    CPUState *env; /* current CPU */
51 41625033 bellard
    enum RSState state; /* parsing state */
52 858693c6 bellard
    int fd;
53 858693c6 bellard
    char line_buf[4096];
54 858693c6 bellard
    int line_buf_index;
55 858693c6 bellard
    int line_csum;
56 41625033 bellard
#ifdef CONFIG_USER_ONLY
57 41625033 bellard
    int running_state;
58 41625033 bellard
#endif
59 858693c6 bellard
} GDBState;
60 b4608c04 bellard
61 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
62 1fddef4b bellard
/* XXX: remove this hack.  */
63 1fddef4b bellard
static GDBState gdbserver_state;
64 1fddef4b bellard
#endif
65 1fddef4b bellard
66 858693c6 bellard
static int get_char(GDBState *s)
67 b4608c04 bellard
{
68 b4608c04 bellard
    uint8_t ch;
69 b4608c04 bellard
    int ret;
70 b4608c04 bellard
71 b4608c04 bellard
    for(;;) {
72 858693c6 bellard
        ret = read(s->fd, &ch, 1);
73 b4608c04 bellard
        if (ret < 0) {
74 b4608c04 bellard
            if (errno != EINTR && errno != EAGAIN)
75 b4608c04 bellard
                return -1;
76 b4608c04 bellard
        } else if (ret == 0) {
77 b4608c04 bellard
            return -1;
78 b4608c04 bellard
        } else {
79 b4608c04 bellard
            break;
80 b4608c04 bellard
        }
81 b4608c04 bellard
    }
82 b4608c04 bellard
    return ch;
83 b4608c04 bellard
}
84 b4608c04 bellard
85 858693c6 bellard
static void put_buffer(GDBState *s, const uint8_t *buf, int len)
86 b4608c04 bellard
{
87 b4608c04 bellard
    int ret;
88 b4608c04 bellard
89 b4608c04 bellard
    while (len > 0) {
90 858693c6 bellard
        ret = write(s->fd, buf, len);
91 b4608c04 bellard
        if (ret < 0) {
92 b4608c04 bellard
            if (errno != EINTR && errno != EAGAIN)
93 b4608c04 bellard
                return;
94 b4608c04 bellard
        } else {
95 b4608c04 bellard
            buf += ret;
96 b4608c04 bellard
            len -= ret;
97 b4608c04 bellard
        }
98 b4608c04 bellard
    }
99 b4608c04 bellard
}
100 b4608c04 bellard
101 b4608c04 bellard
static inline int fromhex(int v)
102 b4608c04 bellard
{
103 b4608c04 bellard
    if (v >= '0' && v <= '9')
104 b4608c04 bellard
        return v - '0';
105 b4608c04 bellard
    else if (v >= 'A' && v <= 'F')
106 b4608c04 bellard
        return v - 'A' + 10;
107 b4608c04 bellard
    else if (v >= 'a' && v <= 'f')
108 b4608c04 bellard
        return v - 'a' + 10;
109 b4608c04 bellard
    else
110 b4608c04 bellard
        return 0;
111 b4608c04 bellard
}
112 b4608c04 bellard
113 b4608c04 bellard
static inline int tohex(int v)
114 b4608c04 bellard
{
115 b4608c04 bellard
    if (v < 10)
116 b4608c04 bellard
        return v + '0';
117 b4608c04 bellard
    else
118 b4608c04 bellard
        return v - 10 + 'a';
119 b4608c04 bellard
}
120 b4608c04 bellard
121 b4608c04 bellard
static void memtohex(char *buf, const uint8_t *mem, int len)
122 b4608c04 bellard
{
123 b4608c04 bellard
    int i, c;
124 b4608c04 bellard
    char *q;
125 b4608c04 bellard
    q = buf;
126 b4608c04 bellard
    for(i = 0; i < len; i++) {
127 b4608c04 bellard
        c = mem[i];
128 b4608c04 bellard
        *q++ = tohex(c >> 4);
129 b4608c04 bellard
        *q++ = tohex(c & 0xf);
130 b4608c04 bellard
    }
131 b4608c04 bellard
    *q = '\0';
132 b4608c04 bellard
}
133 b4608c04 bellard
134 b4608c04 bellard
static void hextomem(uint8_t *mem, const char *buf, int len)
135 b4608c04 bellard
{
136 b4608c04 bellard
    int i;
137 b4608c04 bellard
138 b4608c04 bellard
    for(i = 0; i < len; i++) {
139 b4608c04 bellard
        mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
140 b4608c04 bellard
        buf += 2;
141 b4608c04 bellard
    }
142 b4608c04 bellard
}
143 b4608c04 bellard
144 b4608c04 bellard
/* return -1 if error, 0 if OK */
145 858693c6 bellard
static int put_packet(GDBState *s, char *buf)
146 b4608c04 bellard
{
147 b4608c04 bellard
    char buf1[3];
148 b4608c04 bellard
    int len, csum, ch, i;
149 b4608c04 bellard
150 b4608c04 bellard
#ifdef DEBUG_GDB
151 b4608c04 bellard
    printf("reply='%s'\n", buf);
152 b4608c04 bellard
#endif
153 b4608c04 bellard
154 b4608c04 bellard
    for(;;) {
155 b4608c04 bellard
        buf1[0] = '$';
156 858693c6 bellard
        put_buffer(s, buf1, 1);
157 b4608c04 bellard
        len = strlen(buf);
158 858693c6 bellard
        put_buffer(s, buf, len);
159 b4608c04 bellard
        csum = 0;
160 b4608c04 bellard
        for(i = 0; i < len; i++) {
161 b4608c04 bellard
            csum += buf[i];
162 b4608c04 bellard
        }
163 b4608c04 bellard
        buf1[0] = '#';
164 b4608c04 bellard
        buf1[1] = tohex((csum >> 4) & 0xf);
165 b4608c04 bellard
        buf1[2] = tohex((csum) & 0xf);
166 b4608c04 bellard
167 858693c6 bellard
        put_buffer(s, buf1, 3);
168 b4608c04 bellard
169 858693c6 bellard
        ch = get_char(s);
170 b4608c04 bellard
        if (ch < 0)
171 b4608c04 bellard
            return -1;
172 b4608c04 bellard
        if (ch == '+')
173 b4608c04 bellard
            break;
174 b4608c04 bellard
    }
175 b4608c04 bellard
    return 0;
176 b4608c04 bellard
}
177 b4608c04 bellard
178 6da41eaf bellard
#if defined(TARGET_I386)
179 6da41eaf bellard
180 6da41eaf bellard
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
181 6da41eaf bellard
{
182 e95c8d51 bellard
    uint32_t *registers = (uint32_t *)mem_buf;
183 6da41eaf bellard
    int i, fpus;
184 6da41eaf bellard
185 6da41eaf bellard
    for(i = 0; i < 8; i++) {
186 e95c8d51 bellard
        registers[i] = env->regs[i];
187 6da41eaf bellard
    }
188 e95c8d51 bellard
    registers[8] = env->eip;
189 e95c8d51 bellard
    registers[9] = env->eflags;
190 e95c8d51 bellard
    registers[10] = env->segs[R_CS].selector;
191 e95c8d51 bellard
    registers[11] = env->segs[R_SS].selector;
192 e95c8d51 bellard
    registers[12] = env->segs[R_DS].selector;
193 e95c8d51 bellard
    registers[13] = env->segs[R_ES].selector;
194 e95c8d51 bellard
    registers[14] = env->segs[R_FS].selector;
195 e95c8d51 bellard
    registers[15] = env->segs[R_GS].selector;
196 6da41eaf bellard
    /* XXX: convert floats */
197 6da41eaf bellard
    for(i = 0; i < 8; i++) {
198 6da41eaf bellard
        memcpy(mem_buf + 16 * 4 + i * 10, &env->fpregs[i], 10);
199 6da41eaf bellard
    }
200 e95c8d51 bellard
    registers[36] = env->fpuc;
201 6da41eaf bellard
    fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
202 e95c8d51 bellard
    registers[37] = fpus;
203 e95c8d51 bellard
    registers[38] = 0; /* XXX: convert tags */
204 e95c8d51 bellard
    registers[39] = 0; /* fiseg */
205 e95c8d51 bellard
    registers[40] = 0; /* fioff */
206 e95c8d51 bellard
    registers[41] = 0; /* foseg */
207 e95c8d51 bellard
    registers[42] = 0; /* fooff */
208 e95c8d51 bellard
    registers[43] = 0; /* fop */
209 e95c8d51 bellard
    
210 e95c8d51 bellard
    for(i = 0; i < 16; i++)
211 e95c8d51 bellard
        tswapls(&registers[i]);
212 e95c8d51 bellard
    for(i = 36; i < 44; i++)
213 e95c8d51 bellard
        tswapls(&registers[i]);
214 6da41eaf bellard
    return 44 * 4;
215 6da41eaf bellard
}
216 6da41eaf bellard
217 6da41eaf bellard
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
218 6da41eaf bellard
{
219 6da41eaf bellard
    uint32_t *registers = (uint32_t *)mem_buf;
220 6da41eaf bellard
    int i;
221 6da41eaf bellard
222 6da41eaf bellard
    for(i = 0; i < 8; i++) {
223 6da41eaf bellard
        env->regs[i] = tswapl(registers[i]);
224 6da41eaf bellard
    }
225 e95c8d51 bellard
    env->eip = tswapl(registers[8]);
226 e95c8d51 bellard
    env->eflags = tswapl(registers[9]);
227 6da41eaf bellard
#if defined(CONFIG_USER_ONLY)
228 6da41eaf bellard
#define LOAD_SEG(index, sreg)\
229 6da41eaf bellard
            if (tswapl(registers[index]) != env->segs[sreg].selector)\
230 6da41eaf bellard
                cpu_x86_load_seg(env, sreg, tswapl(registers[index]));
231 6da41eaf bellard
            LOAD_SEG(10, R_CS);
232 6da41eaf bellard
            LOAD_SEG(11, R_SS);
233 6da41eaf bellard
            LOAD_SEG(12, R_DS);
234 6da41eaf bellard
            LOAD_SEG(13, R_ES);
235 6da41eaf bellard
            LOAD_SEG(14, R_FS);
236 6da41eaf bellard
            LOAD_SEG(15, R_GS);
237 6da41eaf bellard
#endif
238 6da41eaf bellard
}
239 6da41eaf bellard
240 9e62fd7f bellard
#elif defined (TARGET_PPC)
241 9e62fd7f bellard
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
242 9e62fd7f bellard
{
243 a541f297 bellard
    uint32_t *registers = (uint32_t *)mem_buf, tmp;
244 9e62fd7f bellard
    int i;
245 9e62fd7f bellard
246 9e62fd7f bellard
    /* fill in gprs */
247 a541f297 bellard
    for(i = 0; i < 32; i++) {
248 e95c8d51 bellard
        registers[i] = tswapl(env->gpr[i]);
249 9e62fd7f bellard
    }
250 9e62fd7f bellard
    /* fill in fprs */
251 9e62fd7f bellard
    for (i = 0; i < 32; i++) {
252 e95c8d51 bellard
        registers[(i * 2) + 32] = tswapl(*((uint32_t *)&env->fpr[i]));
253 e95c8d51 bellard
        registers[(i * 2) + 33] = tswapl(*((uint32_t *)&env->fpr[i] + 1));
254 9e62fd7f bellard
    }
255 9e62fd7f bellard
    /* nip, msr, ccr, lnk, ctr, xer, mq */
256 e95c8d51 bellard
    registers[96] = tswapl(env->nip);
257 3fc6c082 bellard
    registers[97] = tswapl(do_load_msr(env));
258 9e62fd7f bellard
    tmp = 0;
259 9e62fd7f bellard
    for (i = 0; i < 8; i++)
260 a541f297 bellard
        tmp |= env->crf[i] << (32 - ((i + 1) * 4));
261 e95c8d51 bellard
    registers[98] = tswapl(tmp);
262 e95c8d51 bellard
    registers[99] = tswapl(env->lr);
263 e95c8d51 bellard
    registers[100] = tswapl(env->ctr);
264 3fc6c082 bellard
    registers[101] = tswapl(do_load_xer(env));
265 e95c8d51 bellard
    registers[102] = 0;
266 a541f297 bellard
267 a541f297 bellard
    return 103 * 4;
268 9e62fd7f bellard
}
269 9e62fd7f bellard
270 9e62fd7f bellard
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
271 9e62fd7f bellard
{
272 9e62fd7f bellard
    uint32_t *registers = (uint32_t *)mem_buf;
273 9e62fd7f bellard
    int i;
274 9e62fd7f bellard
275 9e62fd7f bellard
    /* fill in gprs */
276 9e62fd7f bellard
    for (i = 0; i < 32; i++) {
277 e95c8d51 bellard
        env->gpr[i] = tswapl(registers[i]);
278 9e62fd7f bellard
    }
279 9e62fd7f bellard
    /* fill in fprs */
280 9e62fd7f bellard
    for (i = 0; i < 32; i++) {
281 e95c8d51 bellard
        *((uint32_t *)&env->fpr[i]) = tswapl(registers[(i * 2) + 32]);
282 e95c8d51 bellard
        *((uint32_t *)&env->fpr[i] + 1) = tswapl(registers[(i * 2) + 33]);
283 9e62fd7f bellard
    }
284 9e62fd7f bellard
    /* nip, msr, ccr, lnk, ctr, xer, mq */
285 e95c8d51 bellard
    env->nip = tswapl(registers[96]);
286 3fc6c082 bellard
    do_store_msr(env, tswapl(registers[97]));
287 e95c8d51 bellard
    registers[98] = tswapl(registers[98]);
288 9e62fd7f bellard
    for (i = 0; i < 8; i++)
289 a541f297 bellard
        env->crf[i] = (registers[98] >> (32 - ((i + 1) * 4))) & 0xF;
290 e95c8d51 bellard
    env->lr = tswapl(registers[99]);
291 e95c8d51 bellard
    env->ctr = tswapl(registers[100]);
292 3fc6c082 bellard
    do_store_xer(env, tswapl(registers[101]));
293 e95c8d51 bellard
}
294 e95c8d51 bellard
#elif defined (TARGET_SPARC)
295 e95c8d51 bellard
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
296 e95c8d51 bellard
{
297 3475187d bellard
    target_ulong *registers = (target_ulong *)mem_buf;
298 e95c8d51 bellard
    int i;
299 e95c8d51 bellard
300 e95c8d51 bellard
    /* fill in g0..g7 */
301 48b2c193 bellard
    for(i = 0; i < 8; i++) {
302 e95c8d51 bellard
        registers[i] = tswapl(env->gregs[i]);
303 e95c8d51 bellard
    }
304 e95c8d51 bellard
    /* fill in register window */
305 e95c8d51 bellard
    for(i = 0; i < 24; i++) {
306 e95c8d51 bellard
        registers[i + 8] = tswapl(env->regwptr[i]);
307 e95c8d51 bellard
    }
308 e95c8d51 bellard
    /* fill in fprs */
309 e95c8d51 bellard
    for (i = 0; i < 32; i++) {
310 e95c8d51 bellard
        registers[i + 32] = tswapl(*((uint32_t *)&env->fpr[i]));
311 e95c8d51 bellard
    }
312 3475187d bellard
#ifndef TARGET_SPARC64
313 e95c8d51 bellard
    /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
314 e95c8d51 bellard
    registers[64] = tswapl(env->y);
315 3475187d bellard
    {
316 3475187d bellard
        target_ulong tmp;
317 3475187d bellard
318 3475187d bellard
        tmp = GET_PSR(env);
319 3475187d bellard
        registers[65] = tswapl(tmp);
320 3475187d bellard
    }
321 e95c8d51 bellard
    registers[66] = tswapl(env->wim);
322 e95c8d51 bellard
    registers[67] = tswapl(env->tbr);
323 e95c8d51 bellard
    registers[68] = tswapl(env->pc);
324 e95c8d51 bellard
    registers[69] = tswapl(env->npc);
325 e95c8d51 bellard
    registers[70] = tswapl(env->fsr);
326 e95c8d51 bellard
    registers[71] = 0; /* csr */
327 e95c8d51 bellard
    registers[72] = 0;
328 3475187d bellard
    return 73 * sizeof(target_ulong);
329 3475187d bellard
#else
330 3475187d bellard
    for (i = 0; i < 32; i += 2) {
331 3475187d bellard
        registers[i/2 + 64] = tswapl(*((uint64_t *)&env->fpr[i]));
332 3475187d bellard
    }
333 3475187d bellard
    registers[81] = tswapl(env->pc);
334 3475187d bellard
    registers[82] = tswapl(env->npc);
335 3475187d bellard
    registers[83] = tswapl(env->tstate[env->tl]);
336 3475187d bellard
    registers[84] = tswapl(env->fsr);
337 3475187d bellard
    registers[85] = tswapl(env->fprs);
338 3475187d bellard
    registers[86] = tswapl(env->y);
339 3475187d bellard
    return 87 * sizeof(target_ulong);
340 3475187d bellard
#endif
341 e95c8d51 bellard
}
342 e95c8d51 bellard
343 e95c8d51 bellard
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
344 e95c8d51 bellard
{
345 3475187d bellard
    target_ulong *registers = (target_ulong *)mem_buf;
346 e95c8d51 bellard
    int i;
347 e95c8d51 bellard
348 e95c8d51 bellard
    /* fill in g0..g7 */
349 e95c8d51 bellard
    for(i = 0; i < 7; i++) {
350 e95c8d51 bellard
        env->gregs[i] = tswapl(registers[i]);
351 e95c8d51 bellard
    }
352 e95c8d51 bellard
    /* fill in register window */
353 e95c8d51 bellard
    for(i = 0; i < 24; i++) {
354 3475187d bellard
        env->regwptr[i] = tswapl(registers[i + 8]);
355 e95c8d51 bellard
    }
356 e95c8d51 bellard
    /* fill in fprs */
357 e95c8d51 bellard
    for (i = 0; i < 32; i++) {
358 e95c8d51 bellard
        *((uint32_t *)&env->fpr[i]) = tswapl(registers[i + 32]);
359 e95c8d51 bellard
    }
360 3475187d bellard
#ifndef TARGET_SPARC64
361 e95c8d51 bellard
    /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
362 e95c8d51 bellard
    env->y = tswapl(registers[64]);
363 e80cfcfc bellard
    PUT_PSR(env, tswapl(registers[65]));
364 e95c8d51 bellard
    env->wim = tswapl(registers[66]);
365 e95c8d51 bellard
    env->tbr = tswapl(registers[67]);
366 e95c8d51 bellard
    env->pc = tswapl(registers[68]);
367 e95c8d51 bellard
    env->npc = tswapl(registers[69]);
368 e95c8d51 bellard
    env->fsr = tswapl(registers[70]);
369 3475187d bellard
#else
370 3475187d bellard
    for (i = 0; i < 32; i += 2) {
371 3475187d bellard
        uint64_t tmp;
372 3475187d bellard
        tmp = tswapl(registers[i/2 + 64]) << 32;
373 3475187d bellard
        tmp |= tswapl(registers[i/2 + 64 + 1]);
374 3475187d bellard
        *((uint64_t *)&env->fpr[i]) = tmp;
375 3475187d bellard
    }
376 3475187d bellard
    env->pc = tswapl(registers[81]);
377 3475187d bellard
    env->npc = tswapl(registers[82]);
378 3475187d bellard
    env->tstate[env->tl] = tswapl(registers[83]);
379 3475187d bellard
    env->fsr = tswapl(registers[84]);
380 3475187d bellard
    env->fprs = tswapl(registers[85]);
381 3475187d bellard
    env->y = tswapl(registers[86]);
382 3475187d bellard
#endif
383 9e62fd7f bellard
}
384 1fddef4b bellard
#elif defined (TARGET_ARM)
385 1fddef4b bellard
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
386 1fddef4b bellard
{
387 1fddef4b bellard
    int i;
388 1fddef4b bellard
    uint8_t *ptr;
389 1fddef4b bellard
390 1fddef4b bellard
    ptr = mem_buf;
391 1fddef4b bellard
    /* 16 core integer registers (4 bytes each).  */
392 1fddef4b bellard
    for (i = 0; i < 16; i++)
393 1fddef4b bellard
      {
394 1fddef4b bellard
        *(uint32_t *)ptr = tswapl(env->regs[i]);
395 1fddef4b bellard
        ptr += 4;
396 1fddef4b bellard
      }
397 1fddef4b bellard
    /* 8 FPA registers (12 bytes each), FPS (4 bytes).
398 1fddef4b bellard
       Not yet implemented.  */
399 1fddef4b bellard
    memset (ptr, 0, 8 * 12 + 4);
400 1fddef4b bellard
    ptr += 8 * 12 + 4;
401 1fddef4b bellard
    /* CPSR (4 bytes).  */
402 b5ff1b31 bellard
    *(uint32_t *)ptr = tswapl (cpsr_read(env));
403 1fddef4b bellard
    ptr += 4;
404 1fddef4b bellard
405 1fddef4b bellard
    return ptr - mem_buf;
406 1fddef4b bellard
}
407 6da41eaf bellard
408 1fddef4b bellard
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
409 1fddef4b bellard
{
410 1fddef4b bellard
    int i;
411 1fddef4b bellard
    uint8_t *ptr;
412 1fddef4b bellard
413 1fddef4b bellard
    ptr = mem_buf;
414 1fddef4b bellard
    /* Core integer registers.  */
415 1fddef4b bellard
    for (i = 0; i < 16; i++)
416 1fddef4b bellard
      {
417 1fddef4b bellard
        env->regs[i] = tswapl(*(uint32_t *)ptr);
418 1fddef4b bellard
        ptr += 4;
419 1fddef4b bellard
      }
420 1fddef4b bellard
    /* Ignore FPA regs and scr.  */
421 1fddef4b bellard
    ptr += 8 * 12 + 4;
422 b5ff1b31 bellard
    cpsr_write (env, tswapl(*(uint32_t *)ptr), 0xffffffff);
423 1fddef4b bellard
}
424 6f970bd9 bellard
#elif defined (TARGET_MIPS)
425 6f970bd9 bellard
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
426 6f970bd9 bellard
{
427 6f970bd9 bellard
    int i;
428 6f970bd9 bellard
    uint8_t *ptr;
429 6f970bd9 bellard
430 6f970bd9 bellard
    ptr = mem_buf;
431 6f970bd9 bellard
    for (i = 0; i < 32; i++)
432 6f970bd9 bellard
      {
433 6f970bd9 bellard
        *(uint32_t *)ptr = tswapl(env->gpr[i]);
434 6f970bd9 bellard
        ptr += 4;
435 6f970bd9 bellard
      }
436 6f970bd9 bellard
437 6f970bd9 bellard
    *(uint32_t *)ptr = tswapl(env->CP0_Status);
438 6f970bd9 bellard
    ptr += 4;
439 6f970bd9 bellard
440 6f970bd9 bellard
    *(uint32_t *)ptr = tswapl(env->LO);
441 6f970bd9 bellard
    ptr += 4;
442 6f970bd9 bellard
443 6f970bd9 bellard
    *(uint32_t *)ptr = tswapl(env->HI);
444 6f970bd9 bellard
    ptr += 4;
445 6f970bd9 bellard
446 6f970bd9 bellard
    *(uint32_t *)ptr = tswapl(env->CP0_BadVAddr);
447 6f970bd9 bellard
    ptr += 4;
448 6f970bd9 bellard
449 6f970bd9 bellard
    *(uint32_t *)ptr = tswapl(env->CP0_Cause);
450 6f970bd9 bellard
    ptr += 4;
451 6f970bd9 bellard
452 6f970bd9 bellard
    *(uint32_t *)ptr = tswapl(env->PC);
453 6f970bd9 bellard
    ptr += 4;
454 6f970bd9 bellard
455 6f970bd9 bellard
    /* 32 FP registers, fsr, fir, fp.  Not yet implemented.  */
456 6f970bd9 bellard
457 6f970bd9 bellard
    return ptr - mem_buf;
458 6f970bd9 bellard
}
459 6f970bd9 bellard
460 6f970bd9 bellard
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
461 6f970bd9 bellard
{
462 6f970bd9 bellard
    int i;
463 6f970bd9 bellard
    uint8_t *ptr;
464 6f970bd9 bellard
465 6f970bd9 bellard
    ptr = mem_buf;
466 6f970bd9 bellard
    for (i = 0; i < 32; i++)
467 6f970bd9 bellard
      {
468 6f970bd9 bellard
        env->gpr[i] = tswapl(*(uint32_t *)ptr);
469 6f970bd9 bellard
        ptr += 4;
470 6f970bd9 bellard
      }
471 6f970bd9 bellard
472 6f970bd9 bellard
    env->CP0_Status = tswapl(*(uint32_t *)ptr);
473 6f970bd9 bellard
    ptr += 4;
474 6f970bd9 bellard
475 6f970bd9 bellard
    env->LO = tswapl(*(uint32_t *)ptr);
476 6f970bd9 bellard
    ptr += 4;
477 6f970bd9 bellard
478 6f970bd9 bellard
    env->HI = tswapl(*(uint32_t *)ptr);
479 6f970bd9 bellard
    ptr += 4;
480 6f970bd9 bellard
481 6f970bd9 bellard
    env->CP0_BadVAddr = tswapl(*(uint32_t *)ptr);
482 6f970bd9 bellard
    ptr += 4;
483 6f970bd9 bellard
484 6f970bd9 bellard
    env->CP0_Cause = tswapl(*(uint32_t *)ptr);
485 6f970bd9 bellard
    ptr += 4;
486 6f970bd9 bellard
487 6f970bd9 bellard
    env->PC = tswapl(*(uint32_t *)ptr);
488 6f970bd9 bellard
    ptr += 4;
489 6f970bd9 bellard
}
490 fdf9b3e8 bellard
#elif defined (TARGET_SH4)
491 fdf9b3e8 bellard
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
492 fdf9b3e8 bellard
{
493 fdf9b3e8 bellard
  uint32_t *ptr = (uint32_t *)mem_buf;
494 fdf9b3e8 bellard
  int i;
495 fdf9b3e8 bellard
496 fdf9b3e8 bellard
#define SAVE(x) *ptr++=tswapl(x)
497 fdf9b3e8 bellard
  for (i = 0; i < 16; i++) SAVE(env->gregs[i]);
498 fdf9b3e8 bellard
  SAVE (env->pc);
499 fdf9b3e8 bellard
  SAVE (env->pr);
500 fdf9b3e8 bellard
  SAVE (env->gbr);
501 fdf9b3e8 bellard
  SAVE (env->vbr);
502 fdf9b3e8 bellard
  SAVE (env->mach);
503 fdf9b3e8 bellard
  SAVE (env->macl);
504 fdf9b3e8 bellard
  SAVE (env->sr);
505 fdf9b3e8 bellard
  SAVE (0); /* TICKS */
506 fdf9b3e8 bellard
  SAVE (0); /* STALLS */
507 fdf9b3e8 bellard
  SAVE (0); /* CYCLES */
508 fdf9b3e8 bellard
  SAVE (0); /* INSTS */
509 fdf9b3e8 bellard
  SAVE (0); /* PLR */
510 fdf9b3e8 bellard
511 fdf9b3e8 bellard
  return ((uint8_t *)ptr - mem_buf);
512 fdf9b3e8 bellard
}
513 fdf9b3e8 bellard
514 fdf9b3e8 bellard
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
515 fdf9b3e8 bellard
{
516 fdf9b3e8 bellard
  uint32_t *ptr = (uint32_t *)mem_buf;
517 fdf9b3e8 bellard
  int i;
518 fdf9b3e8 bellard
519 fdf9b3e8 bellard
#define LOAD(x) (x)=*ptr++;
520 fdf9b3e8 bellard
  for (i = 0; i < 16; i++) LOAD(env->gregs[i]);
521 fdf9b3e8 bellard
  LOAD (env->pc);
522 fdf9b3e8 bellard
  LOAD (env->pr);
523 fdf9b3e8 bellard
  LOAD (env->gbr);
524 fdf9b3e8 bellard
  LOAD (env->vbr);
525 fdf9b3e8 bellard
  LOAD (env->mach);
526 fdf9b3e8 bellard
  LOAD (env->macl);
527 fdf9b3e8 bellard
  LOAD (env->sr);
528 fdf9b3e8 bellard
}
529 1fddef4b bellard
#else
530 6da41eaf bellard
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
531 6da41eaf bellard
{
532 6da41eaf bellard
    return 0;
533 6da41eaf bellard
}
534 6da41eaf bellard
535 6da41eaf bellard
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
536 6da41eaf bellard
{
537 6da41eaf bellard
}
538 6da41eaf bellard
539 6da41eaf bellard
#endif
540 b4608c04 bellard
541 1fddef4b bellard
static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
542 b4608c04 bellard
{
543 b4608c04 bellard
    const char *p;
544 858693c6 bellard
    int ch, reg_size, type;
545 b4608c04 bellard
    char buf[4096];
546 b4608c04 bellard
    uint8_t mem_buf[2000];
547 b4608c04 bellard
    uint32_t *registers;
548 b4608c04 bellard
    uint32_t addr, len;
549 b4608c04 bellard
    
550 858693c6 bellard
#ifdef DEBUG_GDB
551 858693c6 bellard
    printf("command='%s'\n", line_buf);
552 858693c6 bellard
#endif
553 858693c6 bellard
    p = line_buf;
554 858693c6 bellard
    ch = *p++;
555 858693c6 bellard
    switch(ch) {
556 858693c6 bellard
    case '?':
557 1fddef4b bellard
        /* TODO: Make this return the correct value for user-mode.  */
558 858693c6 bellard
        snprintf(buf, sizeof(buf), "S%02x", SIGTRAP);
559 858693c6 bellard
        put_packet(s, buf);
560 858693c6 bellard
        break;
561 858693c6 bellard
    case 'c':
562 858693c6 bellard
        if (*p != '\0') {
563 858693c6 bellard
            addr = strtoul(p, (char **)&p, 16);
564 4c3a88a2 bellard
#if defined(TARGET_I386)
565 858693c6 bellard
            env->eip = addr;
566 5be1a8e0 bellard
#elif defined (TARGET_PPC)
567 858693c6 bellard
            env->nip = addr;
568 8d5f07fa bellard
#elif defined (TARGET_SPARC)
569 8d5f07fa bellard
            env->pc = addr;
570 8d5f07fa bellard
            env->npc = addr + 4;
571 b5ff1b31 bellard
#elif defined (TARGET_ARM)
572 b5ff1b31 bellard
            env->regs[15] = addr;
573 fdf9b3e8 bellard
#elif defined (TARGET_SH4)
574 fdf9b3e8 bellard
            env->pc = addr;
575 4c3a88a2 bellard
#endif
576 858693c6 bellard
        }
577 41625033 bellard
#ifdef CONFIG_USER_ONLY
578 41625033 bellard
        s->running_state = 1;
579 41625033 bellard
#else
580 41625033 bellard
        vm_start();
581 41625033 bellard
#endif
582 41625033 bellard
        return RS_IDLE;
583 858693c6 bellard
    case 's':
584 858693c6 bellard
        if (*p != '\0') {
585 858693c6 bellard
            addr = strtoul(p, (char **)&p, 16);
586 c33a346e bellard
#if defined(TARGET_I386)
587 858693c6 bellard
            env->eip = addr;
588 5be1a8e0 bellard
#elif defined (TARGET_PPC)
589 858693c6 bellard
            env->nip = addr;
590 8d5f07fa bellard
#elif defined (TARGET_SPARC)
591 8d5f07fa bellard
            env->pc = addr;
592 8d5f07fa bellard
            env->npc = addr + 4;
593 b5ff1b31 bellard
#elif defined (TARGET_ARM)
594 b5ff1b31 bellard
            env->regs[15] = addr;
595 fdf9b3e8 bellard
#elif defined (TARGET_SH4)
596 fdf9b3e8 bellard
            env->pc = addr;
597 c33a346e bellard
#endif
598 858693c6 bellard
        }
599 858693c6 bellard
        cpu_single_step(env, 1);
600 41625033 bellard
#ifdef CONFIG_USER_ONLY
601 41625033 bellard
        s->running_state = 1;
602 41625033 bellard
#else
603 41625033 bellard
        vm_start();
604 41625033 bellard
#endif
605 41625033 bellard
        return RS_IDLE;
606 858693c6 bellard
    case 'g':
607 858693c6 bellard
        reg_size = cpu_gdb_read_registers(env, mem_buf);
608 858693c6 bellard
        memtohex(buf, mem_buf, reg_size);
609 858693c6 bellard
        put_packet(s, buf);
610 858693c6 bellard
        break;
611 858693c6 bellard
    case 'G':
612 858693c6 bellard
        registers = (void *)mem_buf;
613 858693c6 bellard
        len = strlen(p) / 2;
614 858693c6 bellard
        hextomem((uint8_t *)registers, p, len);
615 858693c6 bellard
        cpu_gdb_write_registers(env, mem_buf, len);
616 858693c6 bellard
        put_packet(s, "OK");
617 858693c6 bellard
        break;
618 858693c6 bellard
    case 'm':
619 858693c6 bellard
        addr = strtoul(p, (char **)&p, 16);
620 858693c6 bellard
        if (*p == ',')
621 858693c6 bellard
            p++;
622 858693c6 bellard
        len = strtoul(p, NULL, 16);
623 6f970bd9 bellard
        if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) {
624 6f970bd9 bellard
            put_packet (s, "E14");
625 6f970bd9 bellard
        } else {
626 6f970bd9 bellard
            memtohex(buf, mem_buf, len);
627 6f970bd9 bellard
            put_packet(s, buf);
628 6f970bd9 bellard
        }
629 858693c6 bellard
        break;
630 858693c6 bellard
    case 'M':
631 858693c6 bellard
        addr = strtoul(p, (char **)&p, 16);
632 858693c6 bellard
        if (*p == ',')
633 858693c6 bellard
            p++;
634 858693c6 bellard
        len = strtoul(p, (char **)&p, 16);
635 b328f873 bellard
        if (*p == ':')
636 858693c6 bellard
            p++;
637 858693c6 bellard
        hextomem(mem_buf, p, len);
638 858693c6 bellard
        if (cpu_memory_rw_debug(env, addr, mem_buf, len, 1) != 0)
639 905f20b1 bellard
            put_packet(s, "E14");
640 858693c6 bellard
        else
641 858693c6 bellard
            put_packet(s, "OK");
642 858693c6 bellard
        break;
643 858693c6 bellard
    case 'Z':
644 858693c6 bellard
        type = strtoul(p, (char **)&p, 16);
645 858693c6 bellard
        if (*p == ',')
646 858693c6 bellard
            p++;
647 858693c6 bellard
        addr = strtoul(p, (char **)&p, 16);
648 858693c6 bellard
        if (*p == ',')
649 858693c6 bellard
            p++;
650 858693c6 bellard
        len = strtoul(p, (char **)&p, 16);
651 858693c6 bellard
        if (type == 0 || type == 1) {
652 858693c6 bellard
            if (cpu_breakpoint_insert(env, addr) < 0)
653 858693c6 bellard
                goto breakpoint_error;
654 858693c6 bellard
            put_packet(s, "OK");
655 858693c6 bellard
        } else {
656 858693c6 bellard
        breakpoint_error:
657 905f20b1 bellard
            put_packet(s, "E22");
658 858693c6 bellard
        }
659 858693c6 bellard
        break;
660 858693c6 bellard
    case 'z':
661 858693c6 bellard
        type = strtoul(p, (char **)&p, 16);
662 858693c6 bellard
        if (*p == ',')
663 858693c6 bellard
            p++;
664 858693c6 bellard
        addr = strtoul(p, (char **)&p, 16);
665 858693c6 bellard
        if (*p == ',')
666 858693c6 bellard
            p++;
667 858693c6 bellard
        len = strtoul(p, (char **)&p, 16);
668 858693c6 bellard
        if (type == 0 || type == 1) {
669 858693c6 bellard
            cpu_breakpoint_remove(env, addr);
670 858693c6 bellard
            put_packet(s, "OK");
671 858693c6 bellard
        } else {
672 858693c6 bellard
            goto breakpoint_error;
673 858693c6 bellard
        }
674 858693c6 bellard
        break;
675 858693c6 bellard
    default:
676 858693c6 bellard
        //        unknown_command:
677 858693c6 bellard
        /* put empty packet */
678 858693c6 bellard
        buf[0] = '\0';
679 858693c6 bellard
        put_packet(s, buf);
680 858693c6 bellard
        break;
681 858693c6 bellard
    }
682 858693c6 bellard
    return RS_IDLE;
683 858693c6 bellard
}
684 858693c6 bellard
685 612458f5 bellard
extern void tb_flush(CPUState *env);
686 612458f5 bellard
687 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
688 858693c6 bellard
static void gdb_vm_stopped(void *opaque, int reason)
689 858693c6 bellard
{
690 858693c6 bellard
    GDBState *s = opaque;
691 858693c6 bellard
    char buf[256];
692 858693c6 bellard
    int ret;
693 858693c6 bellard
694 858693c6 bellard
    /* disable single step if it was enable */
695 6a00d601 bellard
    cpu_single_step(s->env, 0);
696 858693c6 bellard
697 e80cfcfc bellard
    if (reason == EXCP_DEBUG) {
698 6a00d601 bellard
        tb_flush(s->env);
699 858693c6 bellard
        ret = SIGTRAP;
700 bbeb7b5c bellard
    } else if (reason == EXCP_INTERRUPT) {
701 bbeb7b5c bellard
        ret = SIGINT;
702 bbeb7b5c bellard
    } else {
703 858693c6 bellard
        ret = 0;
704 bbeb7b5c bellard
    }
705 858693c6 bellard
    snprintf(buf, sizeof(buf), "S%02x", ret);
706 858693c6 bellard
    put_packet(s, buf);
707 858693c6 bellard
}
708 1fddef4b bellard
#endif
709 858693c6 bellard
710 6a00d601 bellard
static void gdb_read_byte(GDBState *s, int ch)
711 858693c6 bellard
{
712 6a00d601 bellard
    CPUState *env = s->env;
713 858693c6 bellard
    int i, csum;
714 858693c6 bellard
    char reply[1];
715 858693c6 bellard
716 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
717 858693c6 bellard
    if (vm_running) {
718 858693c6 bellard
        /* when the CPU is running, we cannot do anything except stop
719 858693c6 bellard
           it when receiving a char */
720 858693c6 bellard
        vm_stop(EXCP_INTERRUPT);
721 41625033 bellard
    } else 
722 1fddef4b bellard
#endif
723 41625033 bellard
    {
724 858693c6 bellard
        switch(s->state) {
725 858693c6 bellard
        case RS_IDLE:
726 858693c6 bellard
            if (ch == '$') {
727 858693c6 bellard
                s->line_buf_index = 0;
728 858693c6 bellard
                s->state = RS_GETLINE;
729 c33a346e bellard
            }
730 b4608c04 bellard
            break;
731 858693c6 bellard
        case RS_GETLINE:
732 858693c6 bellard
            if (ch == '#') {
733 858693c6 bellard
            s->state = RS_CHKSUM1;
734 858693c6 bellard
            } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
735 858693c6 bellard
                s->state = RS_IDLE;
736 4c3a88a2 bellard
            } else {
737 858693c6 bellard
            s->line_buf[s->line_buf_index++] = ch;
738 4c3a88a2 bellard
            }
739 4c3a88a2 bellard
            break;
740 858693c6 bellard
        case RS_CHKSUM1:
741 858693c6 bellard
            s->line_buf[s->line_buf_index] = '\0';
742 858693c6 bellard
            s->line_csum = fromhex(ch) << 4;
743 858693c6 bellard
            s->state = RS_CHKSUM2;
744 858693c6 bellard
            break;
745 858693c6 bellard
        case RS_CHKSUM2:
746 858693c6 bellard
            s->line_csum |= fromhex(ch);
747 858693c6 bellard
            csum = 0;
748 858693c6 bellard
            for(i = 0; i < s->line_buf_index; i++) {
749 858693c6 bellard
                csum += s->line_buf[i];
750 858693c6 bellard
            }
751 858693c6 bellard
            if (s->line_csum != (csum & 0xff)) {
752 858693c6 bellard
                reply[0] = '-';
753 858693c6 bellard
                put_buffer(s, reply, 1);
754 858693c6 bellard
                s->state = RS_IDLE;
755 4c3a88a2 bellard
            } else {
756 858693c6 bellard
                reply[0] = '+';
757 858693c6 bellard
                put_buffer(s, reply, 1);
758 1fddef4b bellard
                s->state = gdb_handle_packet(s, env, s->line_buf);
759 4c3a88a2 bellard
            }
760 4c3a88a2 bellard
            break;
761 858693c6 bellard
        }
762 858693c6 bellard
    }
763 858693c6 bellard
}
764 858693c6 bellard
765 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
766 1fddef4b bellard
int
767 1fddef4b bellard
gdb_handlesig (CPUState *env, int sig)
768 1fddef4b bellard
{
769 1fddef4b bellard
  GDBState *s;
770 1fddef4b bellard
  char buf[256];
771 1fddef4b bellard
  int n;
772 1fddef4b bellard
773 1fddef4b bellard
  if (gdbserver_fd < 0)
774 1fddef4b bellard
    return sig;
775 1fddef4b bellard
776 1fddef4b bellard
  s = &gdbserver_state;
777 1fddef4b bellard
778 1fddef4b bellard
  /* disable single step if it was enabled */
779 1fddef4b bellard
  cpu_single_step(env, 0);
780 1fddef4b bellard
  tb_flush(env);
781 1fddef4b bellard
782 1fddef4b bellard
  if (sig != 0)
783 1fddef4b bellard
    {
784 1fddef4b bellard
      snprintf(buf, sizeof(buf), "S%02x", sig);
785 1fddef4b bellard
      put_packet(s, buf);
786 1fddef4b bellard
    }
787 1fddef4b bellard
788 1fddef4b bellard
  sig = 0;
789 1fddef4b bellard
  s->state = RS_IDLE;
790 41625033 bellard
  s->running_state = 0;
791 41625033 bellard
  while (s->running_state == 0) {
792 1fddef4b bellard
      n = read (s->fd, buf, 256);
793 1fddef4b bellard
      if (n > 0)
794 1fddef4b bellard
        {
795 1fddef4b bellard
          int i;
796 1fddef4b bellard
797 1fddef4b bellard
          for (i = 0; i < n; i++)
798 6a00d601 bellard
            gdb_read_byte (s, buf[i]);
799 1fddef4b bellard
        }
800 1fddef4b bellard
      else if (n == 0 || errno != EAGAIN)
801 1fddef4b bellard
        {
802 1fddef4b bellard
          /* XXX: Connection closed.  Should probably wait for annother
803 1fddef4b bellard
             connection before continuing.  */
804 1fddef4b bellard
          return sig;
805 1fddef4b bellard
        }
806 41625033 bellard
  }
807 1fddef4b bellard
  return sig;
808 1fddef4b bellard
}
809 e9009676 bellard
810 e9009676 bellard
/* Tell the remote gdb that the process has exited.  */
811 e9009676 bellard
void gdb_exit(CPUState *env, int code)
812 e9009676 bellard
{
813 e9009676 bellard
  GDBState *s;
814 e9009676 bellard
  char buf[4];
815 e9009676 bellard
816 e9009676 bellard
  if (gdbserver_fd < 0)
817 e9009676 bellard
    return;
818 e9009676 bellard
819 e9009676 bellard
  s = &gdbserver_state;
820 e9009676 bellard
821 e9009676 bellard
  snprintf(buf, sizeof(buf), "W%02x", code);
822 e9009676 bellard
  put_packet(s, buf);
823 e9009676 bellard
}
824 e9009676 bellard
825 1fddef4b bellard
#else
826 7c9d8e07 bellard
static void gdb_read(void *opaque)
827 858693c6 bellard
{
828 858693c6 bellard
    GDBState *s = opaque;
829 7c9d8e07 bellard
    int i, size;
830 7c9d8e07 bellard
    uint8_t buf[4096];
831 7c9d8e07 bellard
832 7c9d8e07 bellard
    size = read(s->fd, buf, sizeof(buf));
833 7c9d8e07 bellard
    if (size < 0)
834 7c9d8e07 bellard
        return;
835 858693c6 bellard
    if (size == 0) {
836 858693c6 bellard
        /* end of connection */
837 858693c6 bellard
        qemu_del_vm_stop_handler(gdb_vm_stopped, s);
838 7c9d8e07 bellard
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
839 858693c6 bellard
        qemu_free(s);
840 858693c6 bellard
        vm_start();
841 858693c6 bellard
    } else {
842 858693c6 bellard
        for(i = 0; i < size; i++)
843 6a00d601 bellard
            gdb_read_byte(s, buf[i]);
844 858693c6 bellard
    }
845 858693c6 bellard
}
846 858693c6 bellard
847 1fddef4b bellard
#endif
848 1fddef4b bellard
849 7c9d8e07 bellard
static void gdb_accept(void *opaque)
850 858693c6 bellard
{
851 858693c6 bellard
    GDBState *s;
852 858693c6 bellard
    struct sockaddr_in sockaddr;
853 858693c6 bellard
    socklen_t len;
854 858693c6 bellard
    int val, fd;
855 858693c6 bellard
856 858693c6 bellard
    for(;;) {
857 858693c6 bellard
        len = sizeof(sockaddr);
858 858693c6 bellard
        fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
859 858693c6 bellard
        if (fd < 0 && errno != EINTR) {
860 858693c6 bellard
            perror("accept");
861 858693c6 bellard
            return;
862 858693c6 bellard
        } else if (fd >= 0) {
863 b4608c04 bellard
            break;
864 b4608c04 bellard
        }
865 b4608c04 bellard
    }
866 858693c6 bellard
867 858693c6 bellard
    /* set short latency */
868 858693c6 bellard
    val = 1;
869 7d3505c5 bellard
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
870 858693c6 bellard
    
871 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
872 1fddef4b bellard
    s = &gdbserver_state;
873 1fddef4b bellard
    memset (s, 0, sizeof (GDBState));
874 1fddef4b bellard
#else
875 858693c6 bellard
    s = qemu_mallocz(sizeof(GDBState));
876 858693c6 bellard
    if (!s) {
877 858693c6 bellard
        close(fd);
878 858693c6 bellard
        return;
879 858693c6 bellard
    }
880 1fddef4b bellard
#endif
881 6a00d601 bellard
    s->env = first_cpu; /* XXX: allow to change CPU */
882 858693c6 bellard
    s->fd = fd;
883 858693c6 bellard
884 858693c6 bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
885 858693c6 bellard
886 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
887 858693c6 bellard
    /* stop the VM */
888 858693c6 bellard
    vm_stop(EXCP_INTERRUPT);
889 858693c6 bellard
890 858693c6 bellard
    /* start handling I/O */
891 7c9d8e07 bellard
    qemu_set_fd_handler(s->fd, gdb_read, NULL, s);
892 858693c6 bellard
    /* when the VM is stopped, the following callback is called */
893 858693c6 bellard
    qemu_add_vm_stop_handler(gdb_vm_stopped, s);
894 1fddef4b bellard
#endif
895 858693c6 bellard
}
896 858693c6 bellard
897 858693c6 bellard
static int gdbserver_open(int port)
898 858693c6 bellard
{
899 858693c6 bellard
    struct sockaddr_in sockaddr;
900 858693c6 bellard
    int fd, val, ret;
901 858693c6 bellard
902 858693c6 bellard
    fd = socket(PF_INET, SOCK_STREAM, 0);
903 858693c6 bellard
    if (fd < 0) {
904 858693c6 bellard
        perror("socket");
905 858693c6 bellard
        return -1;
906 858693c6 bellard
    }
907 858693c6 bellard
908 858693c6 bellard
    /* allow fast reuse */
909 858693c6 bellard
    val = 1;
910 858693c6 bellard
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
911 858693c6 bellard
912 858693c6 bellard
    sockaddr.sin_family = AF_INET;
913 858693c6 bellard
    sockaddr.sin_port = htons(port);
914 858693c6 bellard
    sockaddr.sin_addr.s_addr = 0;
915 858693c6 bellard
    ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
916 858693c6 bellard
    if (ret < 0) {
917 858693c6 bellard
        perror("bind");
918 858693c6 bellard
        return -1;
919 858693c6 bellard
    }
920 858693c6 bellard
    ret = listen(fd, 0);
921 858693c6 bellard
    if (ret < 0) {
922 858693c6 bellard
        perror("listen");
923 858693c6 bellard
        return -1;
924 858693c6 bellard
    }
925 1fddef4b bellard
#ifndef CONFIG_USER_ONLY
926 858693c6 bellard
    fcntl(fd, F_SETFL, O_NONBLOCK);
927 1fddef4b bellard
#endif
928 858693c6 bellard
    return fd;
929 858693c6 bellard
}
930 858693c6 bellard
931 858693c6 bellard
int gdbserver_start(int port)
932 858693c6 bellard
{
933 858693c6 bellard
    gdbserver_fd = gdbserver_open(port);
934 858693c6 bellard
    if (gdbserver_fd < 0)
935 858693c6 bellard
        return -1;
936 858693c6 bellard
    /* accept connections */
937 1fddef4b bellard
#ifdef CONFIG_USER_ONLY
938 7c9d8e07 bellard
    gdb_accept (NULL);
939 1fddef4b bellard
#else
940 7c9d8e07 bellard
    qemu_set_fd_handler(gdbserver_fd, gdb_accept, NULL, NULL);
941 1fddef4b bellard
#endif
942 b4608c04 bellard
    return 0;
943 b4608c04 bellard
}