eb3062708054429d3143ee385e8874af6ec5ae44
[qemu] / gdbstub.c
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  */
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     enum RSState state; /* parsing state */
51     int fd;
52     char line_buf[4096];
53     int line_buf_index;
54     int line_csum;
55 #ifdef CONFIG_USER_ONLY
56     int running_state;
57 #endif
58 } GDBState;
59
60 #ifdef CONFIG_USER_ONLY
61 /* XXX: remove this hack.  */
62 static GDBState gdbserver_state;
63 #endif
64
65 static int get_char(GDBState *s)
66 {
67     uint8_t ch;
68     int ret;
69
70     for(;;) {
71         ret = read(s->fd, &ch, 1);
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
84 static void put_buffer(GDBState *s, const uint8_t *buf, int len)
85 {
86     int ret;
87
88     while (len > 0) {
89         ret = write(s->fd, buf, len);
90         if (ret < 0) {
91             if (errno != EINTR && errno != EAGAIN)
92                 return;
93         } else {
94             buf += ret;
95             len -= ret;
96         }
97     }
98 }
99
100 static 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
112 static inline int tohex(int v)
113 {
114     if (v < 10)
115         return v + '0';
116     else
117         return v - 10 + 'a';
118 }
119
120 static 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
133 static 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
143 /* return -1 if error, 0 if OK */
144 static int put_packet(GDBState *s, char *buf)
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] = '$';
155         put_buffer(s, buf1, 1);
156         len = strlen(buf);
157         put_buffer(s, buf, len);
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
166         put_buffer(s, buf1, 3);
167
168         ch = get_char(s);
169         if (ch < 0)
170             return -1;
171         if (ch == '+')
172             break;
173     }
174     return 0;
175 }
176
177 #if defined(TARGET_I386)
178
179 static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
180 {
181     uint32_t *registers = (uint32_t *)mem_buf;
182     int i, fpus;
183
184     for(i = 0; i < 8; i++) {
185         registers[i] = env->regs[i];
186     }
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;
195     /* XXX: convert floats */
196     for(i = 0; i < 8; i++) {
197         memcpy(mem_buf + 16 * 4 + i * 10, &env->fpregs[i], 10);
198     }
199     registers[36] = env->fpuc;
200     fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
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]);
213     return 44 * 4;
214 }
215
216 static 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     }
224     env->eip = tswapl(registers[8]);
225     env->eflags = tswapl(registers[9]);
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
239 #elif defined (TARGET_PPC)
240 static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
241 {
242     uint32_t *registers = (uint32_t *)mem_buf, tmp;
243     int i;
244
245     /* fill in gprs */
246     for(i = 0; i < 32; i++) {
247         registers[i] = tswapl(env->gpr[i]);
248     }
249     /* fill in fprs */
250     for (i = 0; i < 32; i++) {
251         registers[(i * 2) + 32] = tswapl(*((uint32_t *)&env->fpr[i]));
252         registers[(i * 2) + 33] = tswapl(*((uint32_t *)&env->fpr[i] + 1));
253     }
254     /* nip, msr, ccr, lnk, ctr, xer, mq */
255     registers[96] = tswapl(env->nip);
256     registers[97] = tswapl(_load_msr(env));
257     tmp = 0;
258     for (i = 0; i < 8; i++)
259         tmp |= env->crf[i] << (32 - ((i + 1) * 4));
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;
265
266     return 103 * 4;
267 }
268
269 static 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++) {
276         env->gpr[i] = tswapl(registers[i]);
277     }
278     /* fill in fprs */
279     for (i = 0; i < 32; i++) {
280         *((uint32_t *)&env->fpr[i]) = tswapl(registers[(i * 2) + 32]);
281         *((uint32_t *)&env->fpr[i] + 1) = tswapl(registers[(i * 2) + 33]);
282     }
283     /* nip, msr, ccr, lnk, ctr, xer, mq */
284     env->nip = tswapl(registers[96]);
285     _store_msr(env, tswapl(registers[97]));
286     registers[98] = tswapl(registers[98]);
287     for (i = 0; i < 8; i++)
288         env->crf[i] = (registers[98] >> (32 - ((i + 1) * 4))) & 0xF;
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)
294 static 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);
313     tmp = GET_PSR(env);
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
326 static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
327 {
328     uint32_t *registers = (uint32_t *)mem_buf;
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]);
345     PUT_PSR(env, tswapl(registers[65]));
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]);
351 }
352 #elif defined (TARGET_ARM)
353 static 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 }
375
376 static 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
393 static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
394 {
395     return 0;
396 }
397
398 static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
399 {
400 }
401
402 #endif
403
404 static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
405 {
406     const char *p;
407     int ch, reg_size, type;
408     char buf[4096];
409     uint8_t mem_buf[2000];
410     uint32_t *registers;
411     uint32_t addr, len;
412     
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 '?':
420         /* TODO: Make this return the correct value for user-mode.  */
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);
427 #if defined(TARGET_I386)
428             env->eip = addr;
429 #elif defined (TARGET_PPC)
430             env->nip = addr;
431 #elif defined (TARGET_SPARC)
432             env->pc = addr;
433             env->npc = addr + 4;
434 #endif
435         }
436 #ifdef CONFIG_USER_ONLY
437         s->running_state = 1;
438 #else
439         vm_start();
440 #endif
441         return RS_IDLE;
442     case 's':
443         if (*p != '\0') {
444             addr = strtoul(p, (char **)&p, 16);
445 #if defined(TARGET_I386)
446             env->eip = addr;
447 #elif defined (TARGET_PPC)
448             env->nip = addr;
449 #elif defined (TARGET_SPARC)
450             env->pc = addr;
451             env->npc = addr + 4;
452 #endif
453         }
454         cpu_single_step(env, 1);
455 #ifdef CONFIG_USER_ONLY
456         s->running_state = 1;
457 #else
458         vm_start();
459 #endif
460         return RS_IDLE;
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);
488         if (*p == ':')
489             p++;
490         hextomem(mem_buf, p, len);
491         if (cpu_memory_rw_debug(env, addr, mem_buf, len, 1) != 0)
492             put_packet(s, "ENN");
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:
510             put_packet(s, "ENN");
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
538 extern void tb_flush(CPUState *env);
539
540 #ifndef CONFIG_USER_ONLY
541 static 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
550     if (reason == EXCP_DEBUG) {
551         tb_flush(cpu_single_env);
552         ret = SIGTRAP;
553     }
554     else
555         ret = 0;
556     snprintf(buf, sizeof(buf), "S%02x", ret);
557     put_packet(s, buf);
558 }
559 #endif
560
561 static void gdb_read_byte(GDBState *s, CPUState *env, int ch)
562 {
563     int i, csum;
564     char reply[1];
565
566 #ifndef CONFIG_USER_ONLY
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);
571     } else 
572 #endif
573     {
574         switch(s->state) {
575         case RS_IDLE:
576             if (ch == '$') {
577                 s->line_buf_index = 0;
578                 s->state = RS_GETLINE;
579             }
580             break;
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;
586             } else {
587             s->line_buf[s->line_buf_index++] = ch;
588             }
589             break;
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;
605             } else {
606                 reply[0] = '+';
607                 put_buffer(s, reply, 1);
608                 s->state = gdb_handle_packet(s, env, s->line_buf);
609             }
610             break;
611         }
612     }
613 }
614
615 #ifdef CONFIG_USER_ONLY
616 int
617 gdb_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
638   sig = 0;
639   s->state = RS_IDLE;
640   s->running_state = 0;
641   while (s->running_state == 0) {
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         }
656   }
657   return sig;
658 }
659 #else
660 static int gdb_can_read(void *opaque)
661 {
662     return 256;
663 }
664
665 static void gdb_read(void *opaque, const uint8_t *buf, int size)
666 {
667     GDBState *s = opaque;
668     int i;
669     if (size == 0) {
670         /* end of connection */
671         qemu_del_vm_stop_handler(gdb_vm_stopped, s);
672         qemu_del_fd_read_handler(s->fd);
673         qemu_free(s);
674         vm_start();
675     } else {
676         for(i = 0; i < size; i++)
677             gdb_read_byte(s, cpu_single_env, buf[i]);
678     }
679 }
680
681 #endif
682
683 static void gdb_accept(void *opaque, const uint8_t *buf, int size)
684 {
685     GDBState *s;
686     struct sockaddr_in sockaddr;
687     socklen_t len;
688     int val, fd;
689
690     for(;;) {
691         len = sizeof(sockaddr);
692         fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
693         if (fd < 0 && errno != EINTR) {
694             perror("accept");
695             return;
696         } else if (fd >= 0) {
697             break;
698         }
699     }
700
701     /* set short latency */
702     val = 1;
703     setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
704     
705 #ifdef CONFIG_USER_ONLY
706     s = &gdbserver_state;
707     memset (s, 0, sizeof (GDBState));
708 #else
709     s = qemu_mallocz(sizeof(GDBState));
710     if (!s) {
711         close(fd);
712         return;
713     }
714 #endif
715     s->fd = fd;
716
717     fcntl(fd, F_SETFL, O_NONBLOCK);
718
719 #ifndef CONFIG_USER_ONLY
720     /* stop the VM */
721     vm_stop(EXCP_INTERRUPT);
722
723     /* start handling I/O */
724     qemu_add_fd_read_handler(s->fd, gdb_can_read, gdb_read, s);
725     /* when the VM is stopped, the following callback is called */
726     qemu_add_vm_stop_handler(gdb_vm_stopped, s);
727 #endif
728 }
729
730 static int gdbserver_open(int port)
731 {
732     struct sockaddr_in sockaddr;
733     int fd, val, ret;
734
735     fd = socket(PF_INET, SOCK_STREAM, 0);
736     if (fd < 0) {
737         perror("socket");
738         return -1;
739     }
740
741     /* allow fast reuse */
742     val = 1;
743     setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
744
745     sockaddr.sin_family = AF_INET;
746     sockaddr.sin_port = htons(port);
747     sockaddr.sin_addr.s_addr = 0;
748     ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
749     if (ret < 0) {
750         perror("bind");
751         return -1;
752     }
753     ret = listen(fd, 0);
754     if (ret < 0) {
755         perror("listen");
756         return -1;
757     }
758 #ifndef CONFIG_USER_ONLY
759     fcntl(fd, F_SETFL, O_NONBLOCK);
760 #endif
761     return fd;
762 }
763
764 int gdbserver_start(int port)
765 {
766     gdbserver_fd = gdbserver_open(port);
767     if (gdbserver_fd < 0)
768         return -1;
769     /* accept connections */
770 #ifdef CONFIG_USER_ONLY
771     gdb_accept (NULL, NULL, 0);
772 #else
773     qemu_add_fd_read_handler(gdbserver_fd, NULL, gdb_accept, NULL);
774 #endif
775     return 0;
776 }