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 /* Open a connection to a remote debugger.
46 NAME is the filename used for communication. */
49 remote_open (char *name)
53 if (!strchr (name, ':'))
55 remote_desc = open (name, O_RDWR);
57 perror_with_name ("Could not open remote device");
61 struct termios termios;
62 tcgetattr (remote_desc, &termios);
67 termios.c_cflag &= ~(CSIZE | PARENB);
68 termios.c_cflag |= CLOCAL | CS8;
69 termios.c_cc[VMIN] = 1;
70 termios.c_cc[VTIME] = 0;
72 tcsetattr (remote_desc, TCSANOW, &termios);
79 ioctl (remote_desc, TCGETA, &termio);
84 termio.c_cflag &= ~(CSIZE | PARENB);
85 termio.c_cflag |= CLOCAL | CS8;
86 termio.c_cc[VMIN] = 1;
87 termio.c_cc[VTIME] = 0;
89 ioctl (remote_desc, TCSETA, &termio);
97 ioctl (remote_desc, TIOCGETP, &sg);
99 ioctl (remote_desc, TIOCSETP, &sg);
103 fprintf (stderr, "Remote debugging using %s\n", name);
109 struct sockaddr_in sockaddr;
113 port_str = strchr (name, ':');
115 port = atoi (port_str + 1);
117 tmp_desc = socket (PF_INET, SOCK_STREAM, 0);
119 perror_with_name ("Can't open socket");
121 /* Allow rapid reuse of this port. */
123 setsockopt (tmp_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
126 sockaddr.sin_family = PF_INET;
127 sockaddr.sin_port = htons (port);
128 sockaddr.sin_addr.s_addr = INADDR_ANY;
130 if (bind (tmp_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr))
131 || listen (tmp_desc, 1))
132 perror_with_name ("Can't bind address");
134 tmp = sizeof (sockaddr);
135 remote_desc = accept (tmp_desc, (struct sockaddr *) &sockaddr, &tmp);
136 if (remote_desc == -1)
137 perror_with_name ("Accept failed");
139 /* Enable TCP keep alive process. */
141 setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp));
143 /* Tell TCP not to delay small packets. This greatly speeds up
144 interactive response. */
146 setsockopt (remote_desc, IPPROTO_TCP, TCP_NODELAY,
147 (char *) &tmp, sizeof (tmp));
149 close (tmp_desc); /* No longer need this */
151 signal (SIGPIPE, SIG_IGN); /* If we don't do this, then gdbserver simply
152 exits when the remote side dies. */
154 /* Convert IP address to string. */
155 fprintf (stderr, "Remote debugging from host %s\n",
156 inet_ntoa (sockaddr.sin_addr));
159 #if defined(F_SETFL) && defined (FASYNC)
160 save_fcntl_flags = fcntl (remote_desc, F_GETFL, 0);
161 fcntl (remote_desc, F_SETFL, save_fcntl_flags | FASYNC);
162 #if defined (F_SETOWN)
163 fcntl (remote_desc, F_SETOWN, getpid ());
175 /* Convert hex digit A to a number. */
180 if (a >= '0' && a <= '9')
182 else if (a >= 'a' && a <= 'f')
185 error ("Reply contains invalid hex digit");
189 /* Convert number NIB to a hex digit. */
197 return 'a' + nib - 10;
200 /* Send a packet to the remote machine, with error checking.
201 The data of the packet is in BUF. Returns >= 0 on success, -1 otherwise. */
207 unsigned char csum = 0;
210 int cnt = strlen (buf);
213 buf2 = malloc (PBUFSIZ);
215 /* Copy the packet into buffer BUF2, encapsulating it
216 and giving it a checksum. */
221 for (i = 0; i < cnt; i++)
227 *p++ = tohex ((csum >> 4) & 0xf);
228 *p++ = tohex (csum & 0xf);
232 /* Send it over and over until we get a positive ack. */
238 if (write (remote_desc, buf2, p - buf2) != p - buf2)
240 perror ("putpkt(write)");
245 printf ("putpkt (\"%s\"); [looking for ack]\n", buf2);
246 cc = read (remote_desc, buf3, 1);
248 printf ("[received '%c' (0x%x)]\n", buf3[0], buf3[0]);
252 fprintf (stderr, "putpkt(read): Got EOF\n");
254 perror ("putpkt(read)");
260 while (buf3[0] != '+');
263 return 1; /* Success! */
266 /* Come here when we get an input interrupt from the remote side. This
267 interrupt should only be active while we are waiting for the child to do
268 something. About the only thing that should come through is a ^C, which
269 will cause us to send a SIGINT to the child. */
272 input_interrupt (int unused)
275 struct timeval immediate = { 0, 0 };
277 /* Protect against spurious interrupts. This has been observed to
278 be a problem under NetBSD 1.4 and 1.5. */
281 FD_SET (remote_desc, &readset);
282 if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0)
287 cc = read (remote_desc, &c, 1);
289 if (cc != 1 || c != '\003')
291 fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c);
295 kill (inferior_pid, SIGINT);
300 enable_async_io (void)
302 signal (SIGIO, input_interrupt);
306 disable_async_io (void)
308 signal (SIGIO, SIG_IGN);
311 /* Returns next char from remote GDB. -1 if error. */
316 static char buf[BUFSIZ];
317 static int bufcnt = 0;
321 return *bufp++ & 0x7f;
323 bufcnt = read (remote_desc, buf, sizeof (buf));
328 fprintf (stderr, "readchar: Got EOF\n");
337 return *bufp++ & 0x7f;
340 /* Read a packet from the remote machine, with error checking,
341 and store it in BUF. Returns length of packet, or negative if error. */
347 unsigned char csum, c1, c2;
360 printf ("[getpkt: discarding char '%c']\n", c);
378 c1 = fromhex (readchar ());
379 c2 = fromhex (readchar ());
381 if (csum == (c1 << 4) + c2)
384 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
385 (c1 << 4) + c2, csum, buf);
386 write (remote_desc, "-", 1);
390 printf ("getpkt (\"%s\"); [sending ack] \n", buf);
392 write (remote_desc, "+", 1);
395 printf ("[sent ack]\n");
408 write_enn (char *buf)
417 convert_int_to_ascii (char *from, char *to, int n)
424 nib = ((ch & 0xf0) >> 4) & 0x0f;
434 convert_ascii_to_int (char *from, char *to, int n)
439 nib1 = fromhex (*from++);
440 nib2 = fromhex (*from++);
441 *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f);
446 outreg (int regno, char *buf)
448 int regsize = register_size (regno);
450 if ((regno >> 12) != 0)
451 *buf++ = tohex ((regno >> 12) & 0xf);
452 if ((regno >> 8) != 0)
453 *buf++ = tohex ((regno >> 8) & 0xf);
454 *buf++ = tohex ((regno >> 4) & 0xf);
455 *buf++ = tohex (regno & 0xf);
457 convert_int_to_ascii (register_data (regno), buf, regsize);
465 prepare_resume_reply (char *buf, char status, unsigned char signo)
471 sig = (int)target_signal_from_host (signo);
473 nib = ((sig & 0xf0) >> 4);
474 *buf++ = tohex (nib);
476 *buf++ = tohex (nib);
480 const char **regp = gdbserver_expedite_regs;
483 buf = outreg (find_regno (*regp), buf);
487 /* If the debugger hasn't used any thread features, don't burden it with
488 threads. If we didn't check this, GDB 4.13 and older would choke. */
489 if (cont_thread != 0)
491 if (old_thread_from_wait != thread_from_wait)
493 sprintf (buf, "thread:%x;", thread_from_wait);
495 old_thread_from_wait = thread_from_wait;
499 /* For W and X, we're done. */
504 decode_m_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr)
508 *mem_addr_ptr = *len_ptr = 0;
510 while ((ch = from[i++]) != ',')
512 *mem_addr_ptr = *mem_addr_ptr << 4;
513 *mem_addr_ptr |= fromhex (ch) & 0x0f;
516 for (j = 0; j < 4; j++)
518 if ((ch = from[i++]) == 0)
520 *len_ptr = *len_ptr << 4;
521 *len_ptr |= fromhex (ch) & 0x0f;
526 decode_M_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr,
531 *mem_addr_ptr = *len_ptr = 0;
533 while ((ch = from[i++]) != ',')
535 *mem_addr_ptr = *mem_addr_ptr << 4;
536 *mem_addr_ptr |= fromhex (ch) & 0x0f;
539 while ((ch = from[i++]) != ':')
541 *len_ptr = *len_ptr << 4;
542 *len_ptr |= fromhex (ch) & 0x0f;
545 convert_ascii_to_int (&from[i++], to, *len_ptr);