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