* remote-utils.c (remote_open): Print a status notice after
[deliverable/binutils-gdb.git] / gdb / gdbserver / remote-utils.c
... / ...
CommitLineData
1/* Remote utility routines for the remote server for GDB.
2 Copyright 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004
4 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
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.
12
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.
17
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. */
22
23#include "server.h"
24#include "terminal.h"
25#include <stdio.h>
26#include <string.h>
27#include <sys/ioctl.h>
28#include <sys/file.h>
29#include <netinet/in.h>
30#include <sys/socket.h>
31#include <netdb.h>
32#include <netinet/tcp.h>
33#include <sys/ioctl.h>
34#include <signal.h>
35#include <fcntl.h>
36#include <sys/time.h>
37#include <unistd.h>
38#include <arpa/inet.h>
39
40int remote_debug = 0;
41struct ui_file *gdb_stdlog;
42
43static int remote_desc;
44
45/* FIXME headerize? */
46extern int using_threads;
47extern int debug_threads;
48
49/* Open a connection to a remote debugger.
50 NAME is the filename used for communication. */
51
52void
53remote_open (char *name)
54{
55 int save_fcntl_flags;
56
57 if (!strchr (name, ':'))
58 {
59 remote_desc = open (name, O_RDWR);
60 if (remote_desc < 0)
61 perror_with_name ("Could not open remote device");
62
63#ifdef HAVE_TERMIOS
64 {
65 struct termios termios;
66 tcgetattr (remote_desc, &termios);
67
68 termios.c_iflag = 0;
69 termios.c_oflag = 0;
70 termios.c_lflag = 0;
71 termios.c_cflag &= ~(CSIZE | PARENB);
72 termios.c_cflag |= CLOCAL | CS8;
73 termios.c_cc[VMIN] = 1;
74 termios.c_cc[VTIME] = 0;
75
76 tcsetattr (remote_desc, TCSANOW, &termios);
77 }
78#endif
79
80#ifdef HAVE_TERMIO
81 {
82 struct termio termio;
83 ioctl (remote_desc, TCGETA, &termio);
84
85 termio.c_iflag = 0;
86 termio.c_oflag = 0;
87 termio.c_lflag = 0;
88 termio.c_cflag &= ~(CSIZE | PARENB);
89 termio.c_cflag |= CLOCAL | CS8;
90 termio.c_cc[VMIN] = 1;
91 termio.c_cc[VTIME] = 0;
92
93 ioctl (remote_desc, TCSETA, &termio);
94 }
95#endif
96
97#ifdef HAVE_SGTTY
98 {
99 struct sgttyb sg;
100
101 ioctl (remote_desc, TIOCGETP, &sg);
102 sg.sg_flags = RAW;
103 ioctl (remote_desc, TIOCSETP, &sg);
104 }
105#endif
106
107 fprintf (stderr, "Remote debugging using %s\n", name);
108 }
109 else
110 {
111 char *port_str;
112 int port;
113 struct sockaddr_in sockaddr;
114 int tmp;
115 int tmp_desc;
116
117 port_str = strchr (name, ':');
118
119 port = atoi (port_str + 1);
120
121 tmp_desc = socket (PF_INET, SOCK_STREAM, 0);
122 if (tmp_desc < 0)
123 perror_with_name ("Can't open socket");
124
125 /* Allow rapid reuse of this port. */
126 tmp = 1;
127 setsockopt (tmp_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
128 sizeof (tmp));
129
130 sockaddr.sin_family = PF_INET;
131 sockaddr.sin_port = htons (port);
132 sockaddr.sin_addr.s_addr = INADDR_ANY;
133
134 if (bind (tmp_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr))
135 || listen (tmp_desc, 1))
136 perror_with_name ("Can't bind address");
137
138 fprintf (stderr, "Listening on port %d\n", port);
139
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");
144
145 /* Enable TCP keep alive process. */
146 tmp = 1;
147 setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp));
148
149 /* Tell TCP not to delay small packets. This greatly speeds up
150 interactive response. */
151 tmp = 1;
152 setsockopt (remote_desc, IPPROTO_TCP, TCP_NODELAY,
153 (char *) &tmp, sizeof (tmp));
154
155 close (tmp_desc); /* No longer need this */
156
157 signal (SIGPIPE, SIG_IGN); /* If we don't do this, then gdbserver simply
158 exits when the remote side dies. */
159
160 /* Convert IP address to string. */
161 fprintf (stderr, "Remote debugging from host %s\n",
162 inet_ntoa (sockaddr.sin_addr));
163 }
164
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 ());
170#endif
171#endif
172 disable_async_io ();
173}
174
175void
176remote_close (void)
177{
178 close (remote_desc);
179}
180
181/* Convert hex digit A to a number. */
182
183static int
184fromhex (int a)
185{
186 if (a >= '0' && a <= '9')
187 return a - '0';
188 else if (a >= 'a' && a <= 'f')
189 return a - 'a' + 10;
190 else
191 error ("Reply contains invalid hex digit");
192 return 0;
193}
194
195int
196unhexify (char *bin, const char *hex, int count)
197{
198 int i;
199
200 for (i = 0; i < count; i++)
201 {
202 if (hex[0] == 0 || hex[1] == 0)
203 {
204 /* Hex string is short, or of uneven length.
205 Return the count that has been converted so far. */
206 return i;
207 }
208 *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]);
209 hex += 2;
210 }
211 return i;
212}
213
214static void
215decode_address (CORE_ADDR *addrp, const char *start, int len)
216{
217 CORE_ADDR addr;
218 char ch;
219 int i;
220
221 addr = 0;
222 for (i = 0; i < len; i++)
223 {
224 ch = start[i];
225 addr = addr << 4;
226 addr = addr | (fromhex (ch) & 0x0f);
227 }
228 *addrp = addr;
229}
230
231/* Convert number NIB to a hex digit. */
232
233static int
234tohex (int nib)
235{
236 if (nib < 10)
237 return '0' + nib;
238 else
239 return 'a' + nib - 10;
240}
241
242int
243hexify (char *hex, const char *bin, int count)
244{
245 int i;
246
247 /* May use a length, or a nul-terminated string as input. */
248 if (count == 0)
249 count = strlen (bin);
250
251 for (i = 0; i < count; i++)
252 {
253 *hex++ = tohex ((*bin >> 4) & 0xf);
254 *hex++ = tohex (*bin++ & 0xf);
255 }
256 *hex = 0;
257 return i;
258}
259
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. */
262
263int
264putpkt (char *buf)
265{
266 int i;
267 unsigned char csum = 0;
268 char *buf2;
269 char buf3[1];
270 int cnt = strlen (buf);
271 char *p;
272
273 buf2 = malloc (PBUFSIZ);
274
275 /* Copy the packet into buffer BUF2, encapsulating it
276 and giving it a checksum. */
277
278 p = buf2;
279 *p++ = '$';
280
281 for (i = 0; i < cnt; i++)
282 {
283 csum += buf[i];
284 *p++ = buf[i];
285 }
286 *p++ = '#';
287 *p++ = tohex ((csum >> 4) & 0xf);
288 *p++ = tohex (csum & 0xf);
289
290 *p = '\0';
291
292 /* Send it over and over until we get a positive ack. */
293
294 do
295 {
296 int cc;
297
298 if (write (remote_desc, buf2, p - buf2) != p - buf2)
299 {
300 perror ("putpkt(write)");
301 return -1;
302 }
303
304 if (remote_debug)
305 {
306 fprintf (stderr, "putpkt (\"%s\"); [looking for ack]\n", buf2);
307 fflush (stderr);
308 }
309 cc = read (remote_desc, buf3, 1);
310 if (remote_debug)
311 {
312 fprintf (stderr, "[received '%c' (0x%x)]\n", buf3[0], buf3[0]);
313 fflush (stderr);
314 }
315
316 if (cc <= 0)
317 {
318 if (cc == 0)
319 fprintf (stderr, "putpkt(read): Got EOF\n");
320 else
321 perror ("putpkt(read)");
322
323 free (buf2);
324 return -1;
325 }
326
327 /* Check for an input interrupt while we're here. */
328 if (buf3[0] == '\003')
329 (*the_target->send_signal) (SIGINT);
330 }
331 while (buf3[0] != '+');
332
333 free (buf2);
334 return 1; /* Success! */
335}
336
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. */
341
342static void
343input_interrupt (int unused)
344{
345 fd_set readset;
346 struct timeval immediate = { 0, 0 };
347
348 /* Protect against spurious interrupts. This has been observed to
349 be a problem under NetBSD 1.4 and 1.5. */
350
351 FD_ZERO (&readset);
352 FD_SET (remote_desc, &readset);
353 if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0)
354 {
355 int cc;
356 char c;
357
358 cc = read (remote_desc, &c, 1);
359
360 if (cc != 1 || c != '\003')
361 {
362 fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c);
363 return;
364 }
365
366 (*the_target->send_signal) (SIGINT);
367 }
368}
369
370void
371enable_async_io (void)
372{
373 signal (SIGIO, input_interrupt);
374}
375
376void
377disable_async_io (void)
378{
379 signal (SIGIO, SIG_IGN);
380}
381
382/* Returns next char from remote GDB. -1 if error. */
383
384static int
385readchar (void)
386{
387 static char buf[BUFSIZ];
388 static int bufcnt = 0;
389 static char *bufp;
390
391 if (bufcnt-- > 0)
392 return *bufp++ & 0x7f;
393
394 bufcnt = read (remote_desc, buf, sizeof (buf));
395
396 if (bufcnt <= 0)
397 {
398 if (bufcnt == 0)
399 fprintf (stderr, "readchar: Got EOF\n");
400 else
401 perror ("readchar");
402
403 return -1;
404 }
405
406 bufp = buf;
407 bufcnt--;
408 return *bufp++ & 0x7f;
409}
410
411/* Read a packet from the remote machine, with error checking,
412 and store it in BUF. Returns length of packet, or negative if error. */
413
414int
415getpkt (char *buf)
416{
417 char *bp;
418 unsigned char csum, c1, c2;
419 int c;
420
421 while (1)
422 {
423 csum = 0;
424
425 while (1)
426 {
427 c = readchar ();
428 if (c == '$')
429 break;
430 if (remote_debug)
431 {
432 fprintf (stderr, "[getpkt: discarding char '%c']\n", c);
433 fflush (stderr);
434 }
435
436 if (c < 0)
437 return -1;
438 }
439
440 bp = buf;
441 while (1)
442 {
443 c = readchar ();
444 if (c < 0)
445 return -1;
446 if (c == '#')
447 break;
448 *bp++ = c;
449 csum += c;
450 }
451 *bp = 0;
452
453 c1 = fromhex (readchar ());
454 c2 = fromhex (readchar ());
455
456 if (csum == (c1 << 4) + c2)
457 break;
458
459 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
460 (c1 << 4) + c2, csum, buf);
461 write (remote_desc, "-", 1);
462 }
463
464 if (remote_debug)
465 {
466 fprintf (stderr, "getpkt (\"%s\"); [sending ack] \n", buf);
467 fflush (stderr);
468 }
469
470 write (remote_desc, "+", 1);
471
472 if (remote_debug)
473 {
474 fprintf (stderr, "[sent ack]\n");
475 fflush (stderr);
476 }
477
478 return bp - buf;
479}
480
481void
482write_ok (char *buf)
483{
484 buf[0] = 'O';
485 buf[1] = 'K';
486 buf[2] = '\0';
487}
488
489void
490write_enn (char *buf)
491{
492 /* Some day, we should define the meanings of the error codes... */
493 buf[0] = 'E';
494 buf[1] = '0';
495 buf[2] = '1';
496 buf[3] = '\0';
497}
498
499void
500convert_int_to_ascii (char *from, char *to, int n)
501{
502 int nib;
503 char ch;
504 while (n--)
505 {
506 ch = *from++;
507 nib = ((ch & 0xf0) >> 4) & 0x0f;
508 *to++ = tohex (nib);
509 nib = ch & 0x0f;
510 *to++ = tohex (nib);
511 }
512 *to++ = 0;
513}
514
515
516void
517convert_ascii_to_int (char *from, char *to, int n)
518{
519 int nib1, nib2;
520 while (n--)
521 {
522 nib1 = fromhex (*from++);
523 nib2 = fromhex (*from++);
524 *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f);
525 }
526}
527
528static char *
529outreg (int regno, char *buf)
530{
531 if ((regno >> 12) != 0)
532 *buf++ = tohex ((regno >> 12) & 0xf);
533 if ((regno >> 8) != 0)
534 *buf++ = tohex ((regno >> 8) & 0xf);
535 *buf++ = tohex ((regno >> 4) & 0xf);
536 *buf++ = tohex (regno & 0xf);
537 *buf++ = ':';
538 collect_register_as_string (regno, buf);
539 buf += 2 * register_size (regno);
540 *buf++ = ';';
541
542 return buf;
543}
544
545void
546new_thread_notify (int id)
547{
548 char own_buf[256];
549
550 /* The `n' response is not yet part of the remote protocol. Do nothing. */
551 if (1)
552 return;
553
554 if (server_waiting == 0)
555 return;
556
557 sprintf (own_buf, "n%x", id);
558 disable_async_io ();
559 putpkt (own_buf);
560 enable_async_io ();
561}
562
563void
564dead_thread_notify (int id)
565{
566 char own_buf[256];
567
568 /* The `x' response is not yet part of the remote protocol. Do nothing. */
569 if (1)
570 return;
571
572 sprintf (own_buf, "x%x", id);
573 disable_async_io ();
574 putpkt (own_buf);
575 enable_async_io ();
576}
577
578void
579prepare_resume_reply (char *buf, char status, unsigned char signo)
580{
581 int nib, sig;
582
583 *buf++ = status;
584
585 sig = (int)target_signal_from_host (signo);
586
587 nib = ((sig & 0xf0) >> 4);
588 *buf++ = tohex (nib);
589 nib = sig & 0x0f;
590 *buf++ = tohex (nib);
591
592 if (status == 'T')
593 {
594 const char **regp = gdbserver_expedite_regs;
595 while (*regp)
596 {
597 buf = outreg (find_regno (*regp), buf);
598 regp ++;
599 }
600
601 /* Formerly, if the debugger had not used any thread features we would not
602 burden it with a thread status response. This was for the benefit of
603 GDB 4.13 and older. However, in recent GDB versions the check
604 (``if (cont_thread != 0)'') does not have the desired effect because of
605 sillyness in the way that the remote protocol handles specifying a thread.
606 Since thread support relies on qSymbol support anyway, assume GDB can handle
607 threads. */
608
609 if (using_threads)
610 {
611 /* FIXME right place to set this? */
612 thread_from_wait = ((struct inferior_list_entry *)current_inferior)->id;
613 if (debug_threads)
614 fprintf (stderr, "Writing resume reply for %d\n\n", thread_from_wait);
615 if (old_thread_from_wait != thread_from_wait)
616 {
617 general_thread = thread_from_wait;
618 sprintf (buf, "thread:%x;", thread_from_wait);
619 buf += strlen (buf);
620 old_thread_from_wait = thread_from_wait;
621 }
622 }
623 }
624 /* For W and X, we're done. */
625 *buf++ = 0;
626}
627
628void
629decode_m_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr)
630{
631 int i = 0, j = 0;
632 char ch;
633 *mem_addr_ptr = *len_ptr = 0;
634
635 while ((ch = from[i++]) != ',')
636 {
637 *mem_addr_ptr = *mem_addr_ptr << 4;
638 *mem_addr_ptr |= fromhex (ch) & 0x0f;
639 }
640
641 for (j = 0; j < 4; j++)
642 {
643 if ((ch = from[i++]) == 0)
644 break;
645 *len_ptr = *len_ptr << 4;
646 *len_ptr |= fromhex (ch) & 0x0f;
647 }
648}
649
650void
651decode_M_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr,
652 char *to)
653{
654 int i = 0;
655 char ch;
656 *mem_addr_ptr = *len_ptr = 0;
657
658 while ((ch = from[i++]) != ',')
659 {
660 *mem_addr_ptr = *mem_addr_ptr << 4;
661 *mem_addr_ptr |= fromhex (ch) & 0x0f;
662 }
663
664 while ((ch = from[i++]) != ':')
665 {
666 *len_ptr = *len_ptr << 4;
667 *len_ptr |= fromhex (ch) & 0x0f;
668 }
669
670 convert_ascii_to_int (&from[i++], to, *len_ptr);
671}
672
673int
674look_up_one_symbol (const char *name, CORE_ADDR *addrp)
675{
676 char own_buf[266], *p, *q;
677 int len;
678
679 /* Send the request. */
680 strcpy (own_buf, "qSymbol:");
681 hexify (own_buf + strlen ("qSymbol:"), name, strlen (name));
682 if (putpkt (own_buf) < 0)
683 return -1;
684
685 /* FIXME: Eventually add buffer overflow checking (to getpkt?) */
686 len = getpkt (own_buf);
687 if (len < 0)
688 return -1;
689
690 if (strncmp (own_buf, "qSymbol:", strlen ("qSymbol:")) != 0)
691 {
692 /* Malformed response. */
693 if (remote_debug)
694 {
695 fprintf (stderr, "Malformed response to qSymbol, ignoring.\n");
696 fflush (stderr);
697 }
698
699 return -1;
700 }
701
702 p = own_buf + strlen ("qSymbol:");
703 q = p;
704 while (*q && *q != ':')
705 q++;
706
707 /* Make sure we found a value for the symbol. */
708 if (p == q || *q == '\0')
709 return 0;
710
711 decode_address (addrp, p, q - p);
712 return 1;
713}
714
This page took 0.037121 seconds and 4 git commands to generate.