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