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>
40 struct ui_file
*gdb_stdlog
;
42 static int remote_desc
;
44 /* Open a connection to a remote debugger.
45 NAME is the filename used for communication. */
48 remote_open (char *name
)
52 if (!strchr (name
, ':'))
54 remote_desc
= open (name
, O_RDWR
);
56 perror_with_name ("Could not open remote device");
60 struct termios termios
;
61 tcgetattr (remote_desc
, &termios
);
66 termios
.c_cflag
&= ~(CSIZE
| PARENB
);
67 termios
.c_cflag
|= CLOCAL
| CS8
;
68 termios
.c_cc
[VMIN
] = 1;
69 termios
.c_cc
[VTIME
] = 0;
71 tcsetattr (remote_desc
, TCSANOW
, &termios
);
78 ioctl (remote_desc
, TCGETA
, &termio
);
83 termio
.c_cflag
&= ~(CSIZE
| PARENB
);
84 termio
.c_cflag
|= CLOCAL
| CS8
;
85 termio
.c_cc
[VMIN
] = 1;
86 termio
.c_cc
[VTIME
] = 0;
88 ioctl (remote_desc
, TCSETA
, &termio
);
96 ioctl (remote_desc
, TIOCGETP
, &sg
);
98 ioctl (remote_desc
, TIOCSETP
, &sg
);
108 struct sockaddr_in sockaddr
;
110 struct protoent
*protoent
;
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 protoent
= getprotobyname ("tcp");
141 perror_with_name ("getprotobyname");
143 /* Enable TCP keep alive process. */
145 setsockopt (tmp_desc
, SOL_SOCKET
, SO_KEEPALIVE
, (char *) &tmp
, sizeof (tmp
));
147 /* Tell TCP not to delay small packets. This greatly speeds up
148 interactive response. */
150 setsockopt (remote_desc
, protoent
->p_proto
, TCP_NODELAY
,
151 (char *) &tmp
, sizeof (tmp
));
153 close (tmp_desc
); /* No longer need this */
155 signal (SIGPIPE
, SIG_IGN
); /* If we don't do this, then gdbserver simply
156 exits when the remote side dies. */
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 ());
167 fprintf (stderr
, "Remote debugging using %s\n", name
);
176 /* Convert hex digit A to a number. */
181 if (a
>= '0' && a
<= '9')
183 else if (a
>= 'a' && a
<= 'f')
186 error ("Reply contains invalid hex digit");
190 /* Convert number NIB to a hex digit. */
198 return 'a' + nib
- 10;
201 /* Send a packet to the remote machine, with error checking.
202 The data of the packet is in BUF. Returns >= 0 on success, -1 otherwise. */
208 unsigned char csum
= 0;
211 int cnt
= strlen (buf
);
214 buf2
= malloc (PBUFSIZ
);
216 /* Copy the packet into buffer BUF2, encapsulating it
217 and giving it a checksum. */
222 for (i
= 0; i
< cnt
; i
++)
228 *p
++ = tohex ((csum
>> 4) & 0xf);
229 *p
++ = tohex (csum
& 0xf);
233 /* Send it over and over until we get a positive ack. */
239 if (write (remote_desc
, buf2
, p
- buf2
) != p
- buf2
)
241 perror ("putpkt(write)");
246 printf ("putpkt (\"%s\"); [looking for ack]\n", buf2
);
247 cc
= read (remote_desc
, buf3
, 1);
249 printf ("[received '%c' (0x%x)]\n", buf3
[0], buf3
[0]);
253 fprintf (stderr
, "putpkt(read): Got EOF\n");
255 perror ("putpkt(read)");
261 while (buf3
[0] != '+');
264 return 1; /* Success! */
267 /* Come here when we get an input interrupt from the remote side. This
268 interrupt should only be active while we are waiting for the child to do
269 something. About the only thing that should come through is a ^C, which
270 will cause us to send a SIGINT to the child. */
273 input_interrupt (int unused
)
276 struct timeval immediate
= { 0, 0 };
278 /* Protect against spurious interrupts. This has been observed to
279 be a problem under NetBSD 1.4 and 1.5. */
282 FD_SET (remote_desc
, &readset
);
283 if (select (remote_desc
+ 1, &readset
, 0, 0, &immediate
) > 0)
288 cc
= read (remote_desc
, &c
, 1);
290 if (cc
!= 1 || c
!= '\003')
292 fprintf (stderr
, "input_interrupt, cc = %d c = %d\n", cc
, c
);
296 kill (inferior_pid
, SIGINT
);
301 enable_async_io (void)
303 signal (SIGIO
, input_interrupt
);
307 disable_async_io (void)
309 signal (SIGIO
, SIG_IGN
);
312 /* Returns next char from remote GDB. -1 if error. */
317 static char buf
[BUFSIZ
];
318 static int bufcnt
= 0;
322 return *bufp
++ & 0x7f;
324 bufcnt
= read (remote_desc
, buf
, sizeof (buf
));
329 fprintf (stderr
, "readchar: Got EOF\n");
338 return *bufp
++ & 0x7f;
341 /* Read a packet from the remote machine, with error checking,
342 and store it in BUF. Returns length of packet, or negative if error. */
348 unsigned char csum
, c1
, c2
;
361 printf ("[getpkt: discarding char '%c']\n", c
);
379 c1
= fromhex (readchar ());
380 c2
= fromhex (readchar ());
382 if (csum
== (c1
<< 4) + c2
)
385 fprintf (stderr
, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
386 (c1
<< 4) + c2
, csum
, buf
);
387 write (remote_desc
, "-", 1);
391 printf ("getpkt (\"%s\"); [sending ack] \n", buf
);
393 write (remote_desc
, "+", 1);
396 printf ("[sent ack]\n");
409 write_enn (char *buf
)
418 convert_int_to_ascii (char *from
, char *to
, int n
)
425 nib
= ((ch
& 0xf0) >> 4) & 0x0f;
435 convert_ascii_to_int (char *from
, char *to
, int n
)
440 nib1
= fromhex (*from
++);
441 nib2
= fromhex (*from
++);
442 *to
++ = (((nib1
& 0x0f) << 4) & 0xf0) | (nib2
& 0x0f);
447 outreg (int regno
, char *buf
)
449 int regsize
= register_size (regno
);
451 if ((regno
>> 12) != 0)
452 *buf
++ = tohex ((regno
>> 12) & 0xf);
453 if ((regno
>> 8) != 0)
454 *buf
++ = tohex ((regno
>> 8) & 0xf);
455 *buf
++ = tohex ((regno
>> 4) & 0xf);
456 *buf
++ = tohex (regno
& 0xf);
458 convert_int_to_ascii (register_data (regno
), buf
, regsize
);
466 prepare_resume_reply (char *buf
, char status
, unsigned char signo
)
472 /* FIXME! Should be converting this signal number (numbered
473 according to the signal numbering of the system we are running on)
474 to the signal numbers used by the gdb protocol (see enum target_signal
476 nib
= ((signo
& 0xf0) >> 4);
477 *buf
++ = tohex (nib
);
479 *buf
++ = tohex (nib
);
483 const char **regp
= gdbserver_expedite_regs
;
486 buf
= outreg (find_regno (*regp
), buf
);
490 /* If the debugger hasn't used any thread features, don't burden it with
491 threads. If we didn't check this, GDB 4.13 and older would choke. */
492 if (cont_thread
!= 0)
494 if (old_thread_from_wait
!= thread_from_wait
)
496 sprintf (buf
, "thread:%x;", thread_from_wait
);
498 old_thread_from_wait
= thread_from_wait
;
502 /* For W and X, we're done. */
507 decode_m_packet (char *from
, CORE_ADDR
*mem_addr_ptr
, unsigned int *len_ptr
)
511 *mem_addr_ptr
= *len_ptr
= 0;
513 while ((ch
= from
[i
++]) != ',')
515 *mem_addr_ptr
= *mem_addr_ptr
<< 4;
516 *mem_addr_ptr
|= fromhex (ch
) & 0x0f;
519 for (j
= 0; j
< 4; j
++)
521 if ((ch
= from
[i
++]) == 0)
523 *len_ptr
= *len_ptr
<< 4;
524 *len_ptr
|= fromhex (ch
) & 0x0f;
529 decode_M_packet (char *from
, CORE_ADDR
*mem_addr_ptr
, unsigned int *len_ptr
,
534 *mem_addr_ptr
= *len_ptr
= 0;
536 while ((ch
= from
[i
++]) != ',')
538 *mem_addr_ptr
= *mem_addr_ptr
<< 4;
539 *mem_addr_ptr
|= fromhex (ch
) & 0x0f;
542 while ((ch
= from
[i
++]) != ':')
544 *len_ptr
= *len_ptr
<< 4;
545 *len_ptr
|= fromhex (ch
) & 0x0f;
548 convert_ascii_to_int (&from
[i
++], to
, *len_ptr
);
This page took 0.043016 seconds and 4 git commands to generate.