1 /* Remote utility routines for the remote server for GDB.
2 Copyright 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
27 #include <sys/ioctl.h>
29 #include <netinet/in.h>
30 #include <sys/socket.h>
32 #include <netinet/tcp.h>
33 #include <sys/ioctl.h>
38 #include <arpa/inet.h>
41 struct ui_file
*gdb_stdlog
;
43 static int remote_desc
;
45 /* FIXME headerize? */
46 extern int using_threads
;
47 extern int debug_threads
;
49 /* Open a connection to a remote debugger.
50 NAME is the filename used for communication. */
53 remote_open (char *name
)
57 if (!strchr (name
, ':'))
59 remote_desc
= open (name
, O_RDWR
);
61 perror_with_name ("Could not open remote device");
65 struct termios termios
;
66 tcgetattr (remote_desc
, &termios
);
71 termios
.c_cflag
&= ~(CSIZE
| PARENB
);
72 termios
.c_cflag
|= CLOCAL
| CS8
;
73 termios
.c_cc
[VMIN
] = 1;
74 termios
.c_cc
[VTIME
] = 0;
76 tcsetattr (remote_desc
, TCSANOW
, &termios
);
83 ioctl (remote_desc
, TCGETA
, &termio
);
88 termio
.c_cflag
&= ~(CSIZE
| PARENB
);
89 termio
.c_cflag
|= CLOCAL
| CS8
;
90 termio
.c_cc
[VMIN
] = 1;
91 termio
.c_cc
[VTIME
] = 0;
93 ioctl (remote_desc
, TCSETA
, &termio
);
101 ioctl (remote_desc
, TIOCGETP
, &sg
);
103 ioctl (remote_desc
, TIOCSETP
, &sg
);
107 fprintf (stderr
, "Remote debugging using %s\n", name
);
113 struct sockaddr_in sockaddr
;
117 port_str
= strchr (name
, ':');
119 port
= atoi (port_str
+ 1);
121 tmp_desc
= socket (PF_INET
, SOCK_STREAM
, 0);
123 perror_with_name ("Can't open socket");
125 /* Allow rapid reuse of this port. */
127 setsockopt (tmp_desc
, SOL_SOCKET
, SO_REUSEADDR
, (char *) &tmp
,
130 sockaddr
.sin_family
= PF_INET
;
131 sockaddr
.sin_port
= htons (port
);
132 sockaddr
.sin_addr
.s_addr
= INADDR_ANY
;
134 if (bind (tmp_desc
, (struct sockaddr
*) &sockaddr
, sizeof (sockaddr
))
135 || listen (tmp_desc
, 1))
136 perror_with_name ("Can't bind address");
138 fprintf (stderr
, "Listening on port %d\n", port
);
140 tmp
= sizeof (sockaddr
);
141 remote_desc
= accept (tmp_desc
, (struct sockaddr
*) &sockaddr
, &tmp
);
142 if (remote_desc
== -1)
143 perror_with_name ("Accept failed");
145 /* Enable TCP keep alive process. */
147 setsockopt (tmp_desc
, SOL_SOCKET
, SO_KEEPALIVE
, (char *) &tmp
, sizeof (tmp
));
149 /* Tell TCP not to delay small packets. This greatly speeds up
150 interactive response. */
152 setsockopt (remote_desc
, IPPROTO_TCP
, TCP_NODELAY
,
153 (char *) &tmp
, sizeof (tmp
));
155 close (tmp_desc
); /* No longer need this */
157 signal (SIGPIPE
, SIG_IGN
); /* If we don't do this, then gdbserver simply
158 exits when the remote side dies. */
160 /* Convert IP address to string. */
161 fprintf (stderr
, "Remote debugging from host %s\n",
162 inet_ntoa (sockaddr
.sin_addr
));
165 #if defined(F_SETFL) && defined (FASYNC)
166 save_fcntl_flags
= fcntl (remote_desc
, F_GETFL
, 0);
167 fcntl (remote_desc
, F_SETFL
, save_fcntl_flags
| FASYNC
);
168 #if defined (F_SETOWN)
169 fcntl (remote_desc
, F_SETOWN
, getpid ());
181 /* Convert hex digit A to a number. */
186 if (a
>= '0' && a
<= '9')
188 else if (a
>= 'a' && a
<= 'f')
191 error ("Reply contains invalid hex digit");
196 unhexify (char *bin
, const char *hex
, int count
)
200 for (i
= 0; i
< count
; i
++)
202 if (hex
[0] == 0 || hex
[1] == 0)
204 /* Hex string is short, or of uneven length.
205 Return the count that has been converted so far. */
208 *bin
++ = fromhex (hex
[0]) * 16 + fromhex (hex
[1]);
215 decode_address (CORE_ADDR
*addrp
, const char *start
, int len
)
222 for (i
= 0; i
< len
; i
++)
226 addr
= addr
| (fromhex (ch
) & 0x0f);
231 /* Convert number NIB to a hex digit. */
239 return 'a' + nib
- 10;
243 hexify (char *hex
, const char *bin
, int count
)
247 /* May use a length, or a nul-terminated string as input. */
249 count
= strlen (bin
);
251 for (i
= 0; i
< count
; i
++)
253 *hex
++ = tohex ((*bin
>> 4) & 0xf);
254 *hex
++ = tohex (*bin
++ & 0xf);
260 /* Send a packet to the remote machine, with error checking.
261 The data of the packet is in BUF. Returns >= 0 on success, -1 otherwise. */
267 unsigned char csum
= 0;
270 int cnt
= strlen (buf
);
273 buf2
= malloc (PBUFSIZ
);
275 /* Copy the packet into buffer BUF2, encapsulating it
276 and giving it a checksum. */
281 for (i
= 0; i
< cnt
; i
++)
287 *p
++ = tohex ((csum
>> 4) & 0xf);
288 *p
++ = tohex (csum
& 0xf);
292 /* Send it over and over until we get a positive ack. */
298 if (write (remote_desc
, buf2
, p
- buf2
) != p
- buf2
)
300 perror ("putpkt(write)");
306 fprintf (stderr
, "putpkt (\"%s\"); [looking for ack]\n", buf2
);
309 cc
= read (remote_desc
, buf3
, 1);
312 fprintf (stderr
, "[received '%c' (0x%x)]\n", buf3
[0], buf3
[0]);
319 fprintf (stderr
, "putpkt(read): Got EOF\n");
321 perror ("putpkt(read)");
327 /* Check for an input interrupt while we're here. */
328 if (buf3
[0] == '\003')
329 (*the_target
->send_signal
) (SIGINT
);
331 while (buf3
[0] != '+');
334 return 1; /* Success! */
337 /* Come here when we get an input interrupt from the remote side. This
338 interrupt should only be active while we are waiting for the child to do
339 something. About the only thing that should come through is a ^C, which
340 will cause us to send a SIGINT to the child. */
343 input_interrupt (int unused
)
346 struct timeval immediate
= { 0, 0 };
348 /* Protect against spurious interrupts. This has been observed to
349 be a problem under NetBSD 1.4 and 1.5. */
352 FD_SET (remote_desc
, &readset
);
353 if (select (remote_desc
+ 1, &readset
, 0, 0, &immediate
) > 0)
358 cc
= read (remote_desc
, &c
, 1);
360 if (cc
!= 1 || c
!= '\003')
362 fprintf (stderr
, "input_interrupt, cc = %d c = %d\n", cc
, c
);
366 (*the_target
->send_signal
) (SIGINT
);
371 block_async_io (void)
374 sigemptyset (&sigio_set
);
375 sigaddset (&sigio_set
, SIGIO
);
376 sigprocmask (SIG_BLOCK
, &sigio_set
, NULL
);
380 unblock_async_io (void)
383 sigemptyset (&sigio_set
);
384 sigaddset (&sigio_set
, SIGIO
);
385 sigprocmask (SIG_UNBLOCK
, &sigio_set
, NULL
);
389 enable_async_io (void)
391 signal (SIGIO
, input_interrupt
);
395 disable_async_io (void)
397 signal (SIGIO
, SIG_IGN
);
400 /* Returns next char from remote GDB. -1 if error. */
405 static char buf
[BUFSIZ
];
406 static int bufcnt
= 0;
410 return *bufp
++ & 0x7f;
412 bufcnt
= read (remote_desc
, buf
, sizeof (buf
));
417 fprintf (stderr
, "readchar: Got EOF\n");
426 return *bufp
++ & 0x7f;
429 /* Read a packet from the remote machine, with error checking,
430 and store it in BUF. Returns length of packet, or negative if error. */
436 unsigned char csum
, c1
, c2
;
450 fprintf (stderr
, "[getpkt: discarding char '%c']\n", c
);
471 c1
= fromhex (readchar ());
472 c2
= fromhex (readchar ());
474 if (csum
== (c1
<< 4) + c2
)
477 fprintf (stderr
, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
478 (c1
<< 4) + c2
, csum
, buf
);
479 write (remote_desc
, "-", 1);
484 fprintf (stderr
, "getpkt (\"%s\"); [sending ack] \n", buf
);
488 write (remote_desc
, "+", 1);
492 fprintf (stderr
, "[sent ack]\n");
508 write_enn (char *buf
)
510 /* Some day, we should define the meanings of the error codes... */
518 convert_int_to_ascii (char *from
, char *to
, int n
)
525 nib
= ((ch
& 0xf0) >> 4) & 0x0f;
535 convert_ascii_to_int (char *from
, char *to
, int n
)
540 nib1
= fromhex (*from
++);
541 nib2
= fromhex (*from
++);
542 *to
++ = (((nib1
& 0x0f) << 4) & 0xf0) | (nib2
& 0x0f);
547 outreg (int regno
, char *buf
)
549 if ((regno
>> 12) != 0)
550 *buf
++ = tohex ((regno
>> 12) & 0xf);
551 if ((regno
>> 8) != 0)
552 *buf
++ = tohex ((regno
>> 8) & 0xf);
553 *buf
++ = tohex ((regno
>> 4) & 0xf);
554 *buf
++ = tohex (regno
& 0xf);
556 collect_register_as_string (regno
, buf
);
557 buf
+= 2 * register_size (regno
);
564 new_thread_notify (int id
)
568 /* The `n' response is not yet part of the remote protocol. Do nothing. */
572 if (server_waiting
== 0)
575 sprintf (own_buf
, "n%x", id
);
582 dead_thread_notify (int id
)
586 /* The `x' response is not yet part of the remote protocol. Do nothing. */
590 sprintf (own_buf
, "x%x", id
);
597 prepare_resume_reply (char *buf
, char status
, unsigned char signo
)
603 sig
= (int)target_signal_from_host (signo
);
605 nib
= ((sig
& 0xf0) >> 4);
606 *buf
++ = tohex (nib
);
608 *buf
++ = tohex (nib
);
612 const char **regp
= gdbserver_expedite_regs
;
615 buf
= outreg (find_regno (*regp
), buf
);
619 /* Formerly, if the debugger had not used any thread features we would not
620 burden it with a thread status response. This was for the benefit of
621 GDB 4.13 and older. However, in recent GDB versions the check
622 (``if (cont_thread != 0)'') does not have the desired effect because of
623 sillyness in the way that the remote protocol handles specifying a thread.
624 Since thread support relies on qSymbol support anyway, assume GDB can handle
629 /* FIXME right place to set this? */
630 thread_from_wait
= ((struct inferior_list_entry
*)current_inferior
)->id
;
632 fprintf (stderr
, "Writing resume reply for %d\n\n", thread_from_wait
);
633 /* This if (1) ought to be unnecessary. But remote_wait in GDB
634 will claim this event belongs to inferior_ptid if we do not
635 specify a thread, and there's no way for gdbserver to know
636 what inferior_ptid is. */
637 if (1 || old_thread_from_wait
!= thread_from_wait
)
639 general_thread
= thread_from_wait
;
640 sprintf (buf
, "thread:%x;", thread_from_wait
);
642 old_thread_from_wait
= thread_from_wait
;
646 /* For W and X, we're done. */
651 decode_m_packet (char *from
, CORE_ADDR
*mem_addr_ptr
, unsigned int *len_ptr
)
655 *mem_addr_ptr
= *len_ptr
= 0;
657 while ((ch
= from
[i
++]) != ',')
659 *mem_addr_ptr
= *mem_addr_ptr
<< 4;
660 *mem_addr_ptr
|= fromhex (ch
) & 0x0f;
663 for (j
= 0; j
< 4; j
++)
665 if ((ch
= from
[i
++]) == 0)
667 *len_ptr
= *len_ptr
<< 4;
668 *len_ptr
|= fromhex (ch
) & 0x0f;
673 decode_M_packet (char *from
, CORE_ADDR
*mem_addr_ptr
, unsigned int *len_ptr
,
678 *mem_addr_ptr
= *len_ptr
= 0;
680 while ((ch
= from
[i
++]) != ',')
682 *mem_addr_ptr
= *mem_addr_ptr
<< 4;
683 *mem_addr_ptr
|= fromhex (ch
) & 0x0f;
686 while ((ch
= from
[i
++]) != ':')
688 *len_ptr
= *len_ptr
<< 4;
689 *len_ptr
|= fromhex (ch
) & 0x0f;
692 convert_ascii_to_int (&from
[i
++], to
, *len_ptr
);
696 look_up_one_symbol (const char *name
, CORE_ADDR
*addrp
)
698 char own_buf
[266], *p
, *q
;
701 /* Send the request. */
702 strcpy (own_buf
, "qSymbol:");
703 hexify (own_buf
+ strlen ("qSymbol:"), name
, strlen (name
));
704 if (putpkt (own_buf
) < 0)
707 /* FIXME: Eventually add buffer overflow checking (to getpkt?) */
708 len
= getpkt (own_buf
);
712 if (strncmp (own_buf
, "qSymbol:", strlen ("qSymbol:")) != 0)
714 /* Malformed response. */
717 fprintf (stderr
, "Malformed response to qSymbol, ignoring.\n");
724 p
= own_buf
+ strlen ("qSymbol:");
726 while (*q
&& *q
!= ':')
729 /* Make sure we found a value for the symbol. */
730 if (p
== q
|| *q
== '\0')
733 decode_address (addrp
, p
, q
- p
);
This page took 0.047045 seconds and 5 git commands to generate.