halt state support for ppc
[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 (env->cpsr);
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     env->cpsr = tswapl(*(uint32_t *)ptr);
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 #endif
467         }
468 #ifdef CONFIG_USER_ONLY
469         s->running_state = 1;
470 #else
471         vm_start();
472 #endif
473         return RS_IDLE;
474     case 's':
475         if (*p != '\0') {
476             addr = strtoul(p, (char **)&p, 16);
477 #if defined(TARGET_I386)
478             env->eip = addr;
479 #elif defined (TARGET_PPC)
480             env->nip = addr;
481 #elif defined (TARGET_SPARC)
482             env->pc = addr;
483             env->npc = addr + 4;
484 #endif
485         }
486         cpu_single_step(env, 1);
487 #ifdef CONFIG_USER_ONLY
488         s->running_state = 1;
489 #else
490         vm_start();
491 #endif
492         return RS_IDLE;
493     case 'g':
494         reg_size = cpu_gdb_read_registers(env, mem_buf);
495         memtohex(buf, mem_buf, reg_size);
496         put_packet(s, buf);
497         break;
498     case 'G':
499         registers = (void *)mem_buf;
500         len = strlen(p) / 2;
501         hextomem((uint8_t *)registers, p, len);
502         cpu_gdb_write_registers(env, mem_buf, len);
503         put_packet(s, "OK");
504         break;
505     case 'm':
506         addr = strtoul(p, (char **)&p, 16);
507         if (*p == ',')
508             p++;
509         len = strtoul(p, NULL, 16);
510         if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0)
511             memset(mem_buf, 0, len);
512         memtohex(buf, mem_buf, len);
513         put_packet(s, buf);
514         break;
515     case 'M':
516         addr = strtoul(p, (char **)&p, 16);
517         if (*p == ',')
518             p++;
519         len = strtoul(p, (char **)&p, 16);
520         if (*p == ':')
521             p++;
522         hextomem(mem_buf, p, len);
523         if (cpu_memory_rw_debug(env, addr, mem_buf, len, 1) != 0)
524             put_packet(s, "E14");
525         else
526             put_packet(s, "OK");
527         break;
528     case 'Z':
529         type = strtoul(p, (char **)&p, 16);
530         if (*p == ',')
531             p++;
532         addr = strtoul(p, (char **)&p, 16);
533         if (*p == ',')
534             p++;
535         len = strtoul(p, (char **)&p, 16);
536         if (type == 0 || type == 1) {
537             if (cpu_breakpoint_insert(env, addr) < 0)
538                 goto breakpoint_error;
539             put_packet(s, "OK");
540         } else {
541         breakpoint_error:
542             put_packet(s, "E22");
543         }
544         break;
545     case 'z':
546         type = strtoul(p, (char **)&p, 16);
547         if (*p == ',')
548             p++;
549         addr = strtoul(p, (char **)&p, 16);
550         if (*p == ',')
551             p++;
552         len = strtoul(p, (char **)&p, 16);
553         if (type == 0 || type == 1) {
554             cpu_breakpoint_remove(env, addr);
555             put_packet(s, "OK");
556         } else {
557             goto breakpoint_error;
558         }
559         break;
560     default:
561         //        unknown_command:
562         /* put empty packet */
563         buf[0] = '\0';
564         put_packet(s, buf);
565         break;
566     }
567     return RS_IDLE;
568 }
569
570 extern void tb_flush(CPUState *env);
571
572 #ifndef CONFIG_USER_ONLY
573 static void gdb_vm_stopped(void *opaque, int reason)
574 {
575     GDBState *s = opaque;
576     char buf[256];
577     int ret;
578
579     /* disable single step if it was enable */
580     cpu_single_step(s->env, 0);
581
582     if (reason == EXCP_DEBUG) {
583         tb_flush(s->env);
584         ret = SIGTRAP;
585     }
586     else
587         ret = 0;
588     snprintf(buf, sizeof(buf), "S%02x", ret);
589     put_packet(s, buf);
590 }
591 #endif
592
593 static void gdb_read_byte(GDBState *s, int ch)
594 {
595     CPUState *env = s->env;
596     int i, csum;
597     char reply[1];
598
599 #ifndef CONFIG_USER_ONLY
600     if (vm_running) {
601         /* when the CPU is running, we cannot do anything except stop
602            it when receiving a char */
603         vm_stop(EXCP_INTERRUPT);
604     } else 
605 #endif
606     {
607         switch(s->state) {
608         case RS_IDLE:
609             if (ch == '$') {
610                 s->line_buf_index = 0;
611                 s->state = RS_GETLINE;
612             }
613             break;
614         case RS_GETLINE:
615             if (ch == '#') {
616             s->state = RS_CHKSUM1;
617             } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
618                 s->state = RS_IDLE;
619             } else {
620             s->line_buf[s->line_buf_index++] = ch;
621             }
622             break;
623         case RS_CHKSUM1:
624             s->line_buf[s->line_buf_index] = '\0';
625             s->line_csum = fromhex(ch) << 4;
626             s->state = RS_CHKSUM2;
627             break;
628         case RS_CHKSUM2:
629             s->line_csum |= fromhex(ch);
630             csum = 0;
631             for(i = 0; i < s->line_buf_index; i++) {
632                 csum += s->line_buf[i];
633             }
634             if (s->line_csum != (csum & 0xff)) {
635                 reply[0] = '-';
636                 put_buffer(s, reply, 1);
637                 s->state = RS_IDLE;
638             } else {
639                 reply[0] = '+';
640                 put_buffer(s, reply, 1);
641                 s->state = gdb_handle_packet(s, env, s->line_buf);
642             }
643             break;
644         }
645     }
646 }
647
648 #ifdef CONFIG_USER_ONLY
649 int
650 gdb_handlesig (CPUState *env, int sig)
651 {
652   GDBState *s;
653   char buf[256];
654   int n;
655
656   if (gdbserver_fd < 0)
657     return sig;
658
659   s = &gdbserver_state;
660
661   /* disable single step if it was enabled */
662   cpu_single_step(env, 0);
663   tb_flush(env);
664
665   if (sig != 0)
666     {
667       snprintf(buf, sizeof(buf), "S%02x", sig);
668       put_packet(s, buf);
669     }
670
671   sig = 0;
672   s->state = RS_IDLE;
673   s->running_state = 0;
674   while (s->running_state == 0) {
675       n = read (s->fd, buf, 256);
676       if (n > 0)
677         {
678           int i;
679
680           for (i = 0; i < n; i++)
681             gdb_read_byte (s, buf[i]);
682         }
683       else if (n == 0 || errno != EAGAIN)
684         {
685           /* XXX: Connection closed.  Should probably wait for annother
686              connection before continuing.  */
687           return sig;
688         }
689   }
690   return sig;
691 }
692
693 /* Tell the remote gdb that the process has exited.  */
694 void gdb_exit(CPUState *env, int code)
695 {
696   GDBState *s;
697   char buf[4];
698
699   if (gdbserver_fd < 0)
700     return;
701
702   s = &gdbserver_state;
703
704   snprintf(buf, sizeof(buf), "W%02x", code);
705   put_packet(s, buf);
706 }
707
708 #else
709 static void gdb_read(void *opaque)
710 {
711     GDBState *s = opaque;
712     int i, size;
713     uint8_t buf[4096];
714
715     size = read(s->fd, buf, sizeof(buf));
716     if (size < 0)
717         return;
718     if (size == 0) {
719         /* end of connection */
720         qemu_del_vm_stop_handler(gdb_vm_stopped, s);
721         qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
722         qemu_free(s);
723         vm_start();
724     } else {
725         for(i = 0; i < size; i++)
726             gdb_read_byte(s, buf[i]);
727     }
728 }
729
730 #endif
731
732 static void gdb_accept(void *opaque)
733 {
734     GDBState *s;
735     struct sockaddr_in sockaddr;
736     socklen_t len;
737     int val, fd;
738
739     for(;;) {
740         len = sizeof(sockaddr);
741         fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
742         if (fd < 0 && errno != EINTR) {
743             perror("accept");
744             return;
745         } else if (fd >= 0) {
746             break;
747         }
748     }
749
750     /* set short latency */
751     val = 1;
752     setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
753     
754 #ifdef CONFIG_USER_ONLY
755     s = &gdbserver_state;
756     memset (s, 0, sizeof (GDBState));
757 #else
758     s = qemu_mallocz(sizeof(GDBState));
759     if (!s) {
760         close(fd);
761         return;
762     }
763 #endif
764     s->env = first_cpu; /* XXX: allow to change CPU */
765     s->fd = fd;
766
767     fcntl(fd, F_SETFL, O_NONBLOCK);
768
769 #ifndef CONFIG_USER_ONLY
770     /* stop the VM */
771     vm_stop(EXCP_INTERRUPT);
772
773     /* start handling I/O */
774     qemu_set_fd_handler(s->fd, gdb_read, NULL, s);
775     /* when the VM is stopped, the following callback is called */
776     qemu_add_vm_stop_handler(gdb_vm_stopped, s);
777 #endif
778 }
779
780 static int gdbserver_open(int port)
781 {
782     struct sockaddr_in sockaddr;
783     int fd, val, ret;
784
785     fd = socket(PF_INET, SOCK_STREAM, 0);
786     if (fd < 0) {
787         perror("socket");
788         return -1;
789     }
790
791     /* allow fast reuse */
792     val = 1;
793     setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
794
795     sockaddr.sin_family = AF_INET;
796     sockaddr.sin_port = htons(port);
797     sockaddr.sin_addr.s_addr = 0;
798     ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
799     if (ret < 0) {
800         perror("bind");
801         return -1;
802     }
803     ret = listen(fd, 0);
804     if (ret < 0) {
805         perror("listen");
806         return -1;
807     }
808 #ifndef CONFIG_USER_ONLY
809     fcntl(fd, F_SETFL, O_NONBLOCK);
810 #endif
811     return fd;
812 }
813
814 int gdbserver_start(int port)
815 {
816     gdbserver_fd = gdbserver_open(port);
817     if (gdbserver_fd < 0)
818         return -1;
819     /* accept connections */
820 #ifdef CONFIG_USER_ONLY
821     gdb_accept (NULL);
822 #else
823     qemu_set_fd_handler(gdbserver_fd, gdb_accept, NULL, NULL);
824 #endif
825     return 0;
826 }