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");
190 unhexify (char *bin
, const char *hex
, int count
)
194 for (i
= 0; i
< count
; i
++)
196 if (hex
[0] == 0 || hex
[1] == 0)
198 /* Hex string is short, or of uneven length.
199 Return the count that has been converted so far. */
202 *bin
++ = fromhex (hex
[0]) * 16 + fromhex (hex
[1]);
208 /* Convert number NIB to a hex digit. */
216 return 'a' + nib
- 10;
220 hexify (char *hex
, const char *bin
, int count
)
224 /* May use a length, or a nul-terminated string as input. */
226 count
= strlen (bin
);
228 for (i
= 0; i
< count
; i
++)
230 *hex
++ = tohex ((*bin
>> 4) & 0xf);
231 *hex
++ = tohex (*bin
++ & 0xf);
237 /* Send a packet to the remote machine, with error checking.
238 The data of the packet is in BUF. Returns >= 0 on success, -1 otherwise. */
244 unsigned char csum
= 0;
247 int cnt
= strlen (buf
);
250 buf2
= malloc (PBUFSIZ
);
252 /* Copy the packet into buffer BUF2, encapsulating it
253 and giving it a checksum. */
258 for (i
= 0; i
< cnt
; i
++)
264 *p
++ = tohex ((csum
>> 4) & 0xf);
265 *p
++ = tohex (csum
& 0xf);
269 /* Send it over and over until we get a positive ack. */
275 if (write (remote_desc
, buf2
, p
- buf2
) != p
- buf2
)
277 perror ("putpkt(write)");
282 printf ("putpkt (\"%s\"); [looking for ack]\n", buf2
);
283 cc
= read (remote_desc
, buf3
, 1);
285 printf ("[received '%c' (0x%x)]\n", buf3
[0], buf3
[0]);
289 fprintf (stderr
, "putpkt(read): Got EOF\n");
291 perror ("putpkt(read)");
297 while (buf3
[0] != '+');
300 return 1; /* Success! */
303 /* Come here when we get an input interrupt from the remote side. This
304 interrupt should only be active while we are waiting for the child to do
305 something. About the only thing that should come through is a ^C, which
306 will cause us to send a SIGINT to the child. */
309 input_interrupt (int unused
)
312 struct timeval immediate
= { 0, 0 };
314 /* Protect against spurious interrupts. This has been observed to
315 be a problem under NetBSD 1.4 and 1.5. */
318 FD_SET (remote_desc
, &readset
);
319 if (select (remote_desc
+ 1, &readset
, 0, 0, &immediate
) > 0)
324 cc
= read (remote_desc
, &c
, 1);
326 if (cc
!= 1 || c
!= '\003')
328 fprintf (stderr
, "input_interrupt, cc = %d c = %d\n", cc
, c
);
332 kill (signal_pid
, SIGINT
);
337 enable_async_io (void)
339 signal (SIGIO
, input_interrupt
);
343 disable_async_io (void)
345 signal (SIGIO
, SIG_IGN
);
348 /* Returns next char from remote GDB. -1 if error. */
353 static char buf
[BUFSIZ
];
354 static int bufcnt
= 0;
358 return *bufp
++ & 0x7f;
360 bufcnt
= read (remote_desc
, buf
, sizeof (buf
));
365 fprintf (stderr
, "readchar: Got EOF\n");
374 return *bufp
++ & 0x7f;
377 /* Read a packet from the remote machine, with error checking,
378 and store it in BUF. Returns length of packet, or negative if error. */
384 unsigned char csum
, c1
, c2
;
397 printf ("[getpkt: discarding char '%c']\n", c
);
415 c1
= fromhex (readchar ());
416 c2
= fromhex (readchar ());
418 if (csum
== (c1
<< 4) + c2
)
421 fprintf (stderr
, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
422 (c1
<< 4) + c2
, csum
, buf
);
423 write (remote_desc
, "-", 1);
427 printf ("getpkt (\"%s\"); [sending ack] \n", buf
);
429 write (remote_desc
, "+", 1);
432 printf ("[sent ack]\n");
445 write_enn (char *buf
)
454 convert_int_to_ascii (char *from
, char *to
, int n
)
461 nib
= ((ch
& 0xf0) >> 4) & 0x0f;
471 convert_ascii_to_int (char *from
, char *to
, int n
)
476 nib1
= fromhex (*from
++);
477 nib2
= fromhex (*from
++);
478 *to
++ = (((nib1
& 0x0f) << 4) & 0xf0) | (nib2
& 0x0f);
483 outreg (int regno
, char *buf
)
485 int regsize
= register_size (regno
);
487 if ((regno
>> 12) != 0)
488 *buf
++ = tohex ((regno
>> 12) & 0xf);
489 if ((regno
>> 8) != 0)
490 *buf
++ = tohex ((regno
>> 8) & 0xf);
491 *buf
++ = tohex ((regno
>> 4) & 0xf);
492 *buf
++ = tohex (regno
& 0xf);
494 convert_int_to_ascii (register_data (regno
), buf
, regsize
);
502 prepare_resume_reply (char *buf
, char status
, unsigned char signo
)
508 sig
= (int)target_signal_from_host (signo
);
510 nib
= ((sig
& 0xf0) >> 4);
511 *buf
++ = tohex (nib
);
513 *buf
++ = tohex (nib
);
517 const char **regp
= gdbserver_expedite_regs
;
520 buf
= outreg (find_regno (*regp
), buf
);
524 /* If the debugger hasn't used any thread features, don't burden it with
525 threads. If we didn't check this, GDB 4.13 and older would choke. */
526 if (cont_thread
!= 0)
528 if (old_thread_from_wait
!= thread_from_wait
)
530 sprintf (buf
, "thread:%x;", thread_from_wait
);
532 old_thread_from_wait
= thread_from_wait
;
536 /* For W and X, we're done. */
541 decode_m_packet (char *from
, CORE_ADDR
*mem_addr_ptr
, unsigned int *len_ptr
)
545 *mem_addr_ptr
= *len_ptr
= 0;
547 while ((ch
= from
[i
++]) != ',')
549 *mem_addr_ptr
= *mem_addr_ptr
<< 4;
550 *mem_addr_ptr
|= fromhex (ch
) & 0x0f;
553 for (j
= 0; j
< 4; j
++)
555 if ((ch
= from
[i
++]) == 0)
557 *len_ptr
= *len_ptr
<< 4;
558 *len_ptr
|= fromhex (ch
) & 0x0f;
563 decode_M_packet (char *from
, CORE_ADDR
*mem_addr_ptr
, unsigned int *len_ptr
,
568 *mem_addr_ptr
= *len_ptr
= 0;
570 while ((ch
= from
[i
++]) != ',')
572 *mem_addr_ptr
= *mem_addr_ptr
<< 4;
573 *mem_addr_ptr
|= fromhex (ch
) & 0x0f;
576 while ((ch
= from
[i
++]) != ':')
578 *len_ptr
= *len_ptr
<< 4;
579 *len_ptr
|= fromhex (ch
) & 0x0f;
582 convert_ascii_to_int (&from
[i
++], to
, *len_ptr
);
This page took 0.059982 seconds and 4 git commands to generate.