a6726d578c557478828e4c735e52ba3e08c1e783
[deliverable/binutils-gdb.git] / gdb / gdbserver / remote-utils.c
1 /* Remote utility routines for the remote server for GDB.
2 Copyright (C) 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006
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., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
22
23 #include "server.h"
24 #if HAVE_TERMINAL_H
25 #include "terminal.h"
26 #endif
27 #include <stdio.h>
28 #include <string.h>
29 #if HAVE_SYS_IOCTL_H
30 #include <sys/ioctl.h>
31 #endif
32 #include <sys/file.h>
33 #if HAVE_NETINET_IN_H
34 #include <netinet/in.h>
35 #endif
36 #if HAVE_SYS_SOCKET_H
37 #include <sys/socket.h>
38 #endif
39 #if HAVE_NETDB_H
40 #include <netdb.h>
41 #endif
42 #if HAVE_NETINET_TCP_H
43 #include <netinet/tcp.h>
44 #endif
45 #if HAVE_SYS_IOCTL_H
46 #include <sys/ioctl.h>
47 #endif
48 #include <signal.h>
49 #include <fcntl.h>
50 #include <sys/time.h>
51 #include <unistd.h>
52 #if HAVE_ARPA_INET_H
53 #include <arpa/inet.h>
54 #endif
55
56 #if USE_WIN32API
57 #include <winsock.h>
58 #endif
59
60 #ifndef HAVE_SOCKLEN_T
61 typedef int socklen_t;
62 #endif
63
64 /* A cache entry for a successfully looked-up symbol. */
65 struct sym_cache
66 {
67 const char *name;
68 CORE_ADDR addr;
69 struct sym_cache *next;
70 };
71
72 /* The symbol cache. */
73 static struct sym_cache *symbol_cache;
74
75 /* If this flag has been set, assume cache misses are
76 failures. */
77 int all_symbols_looked_up;
78
79 int remote_debug = 0;
80 struct ui_file *gdb_stdlog;
81
82 static int remote_desc;
83
84 /* FIXME headerize? */
85 extern int using_threads;
86 extern int debug_threads;
87
88 /* Open a connection to a remote debugger.
89 NAME is the filename used for communication. */
90
91 void
92 remote_open (char *name)
93 {
94 #if defined(F_SETFL) && defined (FASYNC)
95 int save_fcntl_flags;
96 #endif
97
98 if (!strchr (name, ':'))
99 {
100 #ifdef USE_WIN32API
101 error ("Only <host>:<port> is supported on this platform.");
102 #else
103 remote_desc = open (name, O_RDWR);
104 if (remote_desc < 0)
105 perror_with_name ("Could not open remote device");
106
107 #ifdef HAVE_TERMIOS
108 {
109 struct termios termios;
110 tcgetattr (remote_desc, &termios);
111
112 termios.c_iflag = 0;
113 termios.c_oflag = 0;
114 termios.c_lflag = 0;
115 termios.c_cflag &= ~(CSIZE | PARENB);
116 termios.c_cflag |= CLOCAL | CS8;
117 termios.c_cc[VMIN] = 1;
118 termios.c_cc[VTIME] = 0;
119
120 tcsetattr (remote_desc, TCSANOW, &termios);
121 }
122 #endif
123
124 #ifdef HAVE_TERMIO
125 {
126 struct termio termio;
127 ioctl (remote_desc, TCGETA, &termio);
128
129 termio.c_iflag = 0;
130 termio.c_oflag = 0;
131 termio.c_lflag = 0;
132 termio.c_cflag &= ~(CSIZE | PARENB);
133 termio.c_cflag |= CLOCAL | CS8;
134 termio.c_cc[VMIN] = 1;
135 termio.c_cc[VTIME] = 0;
136
137 ioctl (remote_desc, TCSETA, &termio);
138 }
139 #endif
140
141 #ifdef HAVE_SGTTY
142 {
143 struct sgttyb sg;
144
145 ioctl (remote_desc, TIOCGETP, &sg);
146 sg.sg_flags = RAW;
147 ioctl (remote_desc, TIOCSETP, &sg);
148 }
149 #endif
150
151 fprintf (stderr, "Remote debugging using %s\n", name);
152 #endif /* USE_WIN32API */
153 }
154 else
155 {
156 #ifdef USE_WIN32API
157 static int winsock_initialized;
158 #endif
159 char *port_str;
160 int port;
161 struct sockaddr_in sockaddr;
162 socklen_t tmp;
163 int tmp_desc;
164
165 port_str = strchr (name, ':');
166
167 port = atoi (port_str + 1);
168
169 #ifdef USE_WIN32API
170 if (!winsock_initialized)
171 {
172 WSADATA wsad;
173
174 WSAStartup (MAKEWORD (1, 0), &wsad);
175 winsock_initialized = 1;
176 }
177 #endif
178
179 tmp_desc = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
180 if (tmp_desc < 0)
181 perror_with_name ("Can't open socket");
182
183 /* Allow rapid reuse of this port. */
184 tmp = 1;
185 setsockopt (tmp_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
186 sizeof (tmp));
187
188 sockaddr.sin_family = PF_INET;
189 sockaddr.sin_port = htons (port);
190 sockaddr.sin_addr.s_addr = INADDR_ANY;
191
192 if (bind (tmp_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr))
193 || listen (tmp_desc, 1))
194 perror_with_name ("Can't bind address");
195
196 fprintf (stderr, "Listening on port %d\n", port);
197 fflush (stderr);
198
199 tmp = sizeof (sockaddr);
200 remote_desc = accept (tmp_desc, (struct sockaddr *) &sockaddr, &tmp);
201 if (remote_desc == -1)
202 perror_with_name ("Accept failed");
203
204 /* Enable TCP keep alive process. */
205 tmp = 1;
206 setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp));
207
208 /* Tell TCP not to delay small packets. This greatly speeds up
209 interactive response. */
210 tmp = 1;
211 setsockopt (remote_desc, IPPROTO_TCP, TCP_NODELAY,
212 (char *) &tmp, sizeof (tmp));
213
214
215 #ifndef USE_WIN32API
216 close (tmp_desc); /* No longer need this */
217
218 signal (SIGPIPE, SIG_IGN); /* If we don't do this, then gdbserver simply
219 exits when the remote side dies. */
220 #else
221 closesocket (tmp_desc); /* No longer need this */
222 #endif
223
224 /* Convert IP address to string. */
225 fprintf (stderr, "Remote debugging from host %s\n",
226 inet_ntoa (sockaddr.sin_addr));
227 }
228
229 #if defined(F_SETFL) && defined (FASYNC)
230 save_fcntl_flags = fcntl (remote_desc, F_GETFL, 0);
231 fcntl (remote_desc, F_SETFL, save_fcntl_flags | FASYNC);
232 #if defined (F_SETOWN)
233 fcntl (remote_desc, F_SETOWN, getpid ());
234 #endif
235 #endif
236 disable_async_io ();
237 }
238
239 void
240 remote_close (void)
241 {
242 #ifdef USE_WIN32API
243 closesocket (remote_desc);
244 #else
245 close (remote_desc);
246 #endif
247 }
248
249 /* Convert hex digit A to a number. */
250
251 static int
252 fromhex (int a)
253 {
254 if (a >= '0' && a <= '9')
255 return a - '0';
256 else if (a >= 'a' && a <= 'f')
257 return a - 'a' + 10;
258 else
259 error ("Reply contains invalid hex digit");
260 return 0;
261 }
262
263 int
264 unhexify (char *bin, const char *hex, int count)
265 {
266 int i;
267
268 for (i = 0; i < count; i++)
269 {
270 if (hex[0] == 0 || hex[1] == 0)
271 {
272 /* Hex string is short, or of uneven length.
273 Return the count that has been converted so far. */
274 return i;
275 }
276 *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]);
277 hex += 2;
278 }
279 return i;
280 }
281
282 static void
283 decode_address (CORE_ADDR *addrp, const char *start, int len)
284 {
285 CORE_ADDR addr;
286 char ch;
287 int i;
288
289 addr = 0;
290 for (i = 0; i < len; i++)
291 {
292 ch = start[i];
293 addr = addr << 4;
294 addr = addr | (fromhex (ch) & 0x0f);
295 }
296 *addrp = addr;
297 }
298
299 /* Convert number NIB to a hex digit. */
300
301 static int
302 tohex (int nib)
303 {
304 if (nib < 10)
305 return '0' + nib;
306 else
307 return 'a' + nib - 10;
308 }
309
310 int
311 hexify (char *hex, const char *bin, int count)
312 {
313 int i;
314
315 /* May use a length, or a nul-terminated string as input. */
316 if (count == 0)
317 count = strlen (bin);
318
319 for (i = 0; i < count; i++)
320 {
321 *hex++ = tohex ((*bin >> 4) & 0xf);
322 *hex++ = tohex (*bin++ & 0xf);
323 }
324 *hex = 0;
325 return i;
326 }
327
328 /* Convert BUFFER, binary data at least LEN bytes long, into escaped
329 binary data in OUT_BUF. Set *OUT_LEN to the length of the data
330 encoded in OUT_BUF, and return the number of bytes in OUT_BUF
331 (which may be more than *OUT_LEN due to escape characters). The
332 total number of bytes in the output buffer will be at most
333 OUT_MAXLEN. */
334
335 int
336 remote_escape_output (const gdb_byte *buffer, int len,
337 gdb_byte *out_buf, int *out_len,
338 int out_maxlen)
339 {
340 int input_index, output_index;
341
342 output_index = 0;
343 for (input_index = 0; input_index < len; input_index++)
344 {
345 gdb_byte b = buffer[input_index];
346
347 if (b == '$' || b == '#' || b == '}' || b == '*')
348 {
349 /* These must be escaped. */
350 if (output_index + 2 > out_maxlen)
351 break;
352 out_buf[output_index++] = '}';
353 out_buf[output_index++] = b ^ 0x20;
354 }
355 else
356 {
357 if (output_index + 1 > out_maxlen)
358 break;
359 out_buf[output_index++] = b;
360 }
361 }
362
363 *out_len = input_index;
364 return output_index;
365 }
366
367 /* Convert BUFFER, escaped data LEN bytes long, into binary data
368 in OUT_BUF. Return the number of bytes written to OUT_BUF.
369 Raise an error if the total number of bytes exceeds OUT_MAXLEN.
370
371 This function reverses remote_escape_output. It allows more
372 escaped characters than that function does, in particular because
373 '*' must be escaped to avoid the run-length encoding processing
374 in reading packets. */
375
376 static int
377 remote_unescape_input (const gdb_byte *buffer, int len,
378 gdb_byte *out_buf, int out_maxlen)
379 {
380 int input_index, output_index;
381 int escaped;
382
383 output_index = 0;
384 escaped = 0;
385 for (input_index = 0; input_index < len; input_index++)
386 {
387 gdb_byte b = buffer[input_index];
388
389 if (output_index + 1 > out_maxlen)
390 error ("Received too much data from the target.");
391
392 if (escaped)
393 {
394 out_buf[output_index++] = b ^ 0x20;
395 escaped = 0;
396 }
397 else if (b == '}')
398 escaped = 1;
399 else
400 out_buf[output_index++] = b;
401 }
402
403 if (escaped)
404 error ("Unmatched escape character in target response.");
405
406 return output_index;
407 }
408
409 /* Look for a sequence of characters which can be run-length encoded.
410 If there are any, update *CSUM and *P. Otherwise, output the
411 single character. Return the number of characters consumed. */
412
413 static int
414 try_rle (char *buf, int remaining, unsigned char *csum, char **p)
415 {
416 int n;
417
418 /* Always output the character. */
419 *csum += buf[0];
420 *(*p)++ = buf[0];
421
422 /* Don't go past '~'. */
423 if (remaining > 97)
424 remaining = 97;
425
426 for (n = 1; n < remaining; n++)
427 if (buf[n] != buf[0])
428 break;
429
430 /* N is the index of the first character not the same as buf[0].
431 buf[0] is counted twice, so by decrementing N, we get the number
432 of characters the RLE sequence will replace. */
433 n--;
434
435 if (n < 3)
436 return 1;
437
438 /* Skip the frame characters. The manual says to skip '+' and '-'
439 also, but there's no reason to. Unfortunately these two unusable
440 characters double the encoded length of a four byte zero
441 value. */
442 while (n + 29 == '$' || n + 29 == '#')
443 n--;
444
445 *csum += '*';
446 *(*p)++ = '*';
447 *csum += n + 29;
448 *(*p)++ = n + 29;
449
450 return n + 1;
451 }
452
453 /* Send a packet to the remote machine, with error checking.
454 The data of the packet is in BUF, and the length of the
455 packet is in CNT. Returns >= 0 on success, -1 otherwise. */
456
457 int
458 putpkt_binary (char *buf, int cnt)
459 {
460 int i;
461 unsigned char csum = 0;
462 char *buf2;
463 char buf3[1];
464 char *p;
465
466 buf2 = malloc (PBUFSIZ);
467
468 /* Copy the packet into buffer BUF2, encapsulating it
469 and giving it a checksum. */
470
471 p = buf2;
472 *p++ = '$';
473
474 for (i = 0; i < cnt;)
475 i += try_rle (buf + i, cnt - i, &csum, &p);
476
477 *p++ = '#';
478 *p++ = tohex ((csum >> 4) & 0xf);
479 *p++ = tohex (csum & 0xf);
480
481 *p = '\0';
482
483 /* Send it over and over until we get a positive ack. */
484
485 do
486 {
487 int cc;
488
489 if (send (remote_desc, buf2, p - buf2, 0) != p - buf2)
490 {
491 perror ("putpkt(write)");
492 return -1;
493 }
494
495 if (remote_debug)
496 {
497 fprintf (stderr, "putpkt (\"%s\"); [looking for ack]\n", buf2);
498 fflush (stderr);
499 }
500 cc = recv (remote_desc, buf3, 1, 0);
501 if (remote_debug)
502 {
503 fprintf (stderr, "[received '%c' (0x%x)]\n", buf3[0], buf3[0]);
504 fflush (stderr);
505 }
506
507 if (cc <= 0)
508 {
509 if (cc == 0)
510 fprintf (stderr, "putpkt(read): Got EOF\n");
511 else
512 perror ("putpkt(read)");
513
514 free (buf2);
515 return -1;
516 }
517
518 /* Check for an input interrupt while we're here. */
519 if (buf3[0] == '\003')
520 (*the_target->send_signal) (SIGINT);
521 }
522 while (buf3[0] != '+');
523
524 free (buf2);
525 return 1; /* Success! */
526 }
527
528 /* Send a packet to the remote machine, with error checking. The data
529 of the packet is in BUF, and the packet should be a NUL-terminated
530 string. Returns >= 0 on success, -1 otherwise. */
531
532 int
533 putpkt (char *buf)
534 {
535 return putpkt_binary (buf, strlen (buf));
536 }
537
538 #ifndef USE_WIN32API
539
540 /* Come here when we get an input interrupt from the remote side. This
541 interrupt should only be active while we are waiting for the child to do
542 something. About the only thing that should come through is a ^C, which
543 will cause us to send a SIGINT to the child. */
544
545 static void
546 input_interrupt (int unused)
547 {
548 fd_set readset;
549 struct timeval immediate = { 0, 0 };
550
551 /* Protect against spurious interrupts. This has been observed to
552 be a problem under NetBSD 1.4 and 1.5. */
553
554 FD_ZERO (&readset);
555 FD_SET (remote_desc, &readset);
556 if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0)
557 {
558 int cc;
559 char c = 0;
560
561 cc = recv (remote_desc, &c, 1, 0);
562
563 if (cc != 1 || c != '\003')
564 {
565 fprintf (stderr, "input_interrupt, count = %d c = %d ('%c')\n",
566 cc, c, c);
567 return;
568 }
569
570 (*the_target->send_signal) (SIGINT);
571 }
572 }
573 #endif
574
575 /* Asynchronous I/O support. SIGIO must be enabled when waiting, in order to
576 accept Control-C from the client, and must be disabled when talking to
577 the client. */
578
579 void
580 block_async_io (void)
581 {
582 #ifndef USE_WIN32API
583 sigset_t sigio_set;
584 sigemptyset (&sigio_set);
585 sigaddset (&sigio_set, SIGIO);
586 sigprocmask (SIG_BLOCK, &sigio_set, NULL);
587 #endif
588 }
589
590 void
591 unblock_async_io (void)
592 {
593 #ifndef USE_WIN32API
594 sigset_t sigio_set;
595 sigemptyset (&sigio_set);
596 sigaddset (&sigio_set, SIGIO);
597 sigprocmask (SIG_UNBLOCK, &sigio_set, NULL);
598 #endif
599 }
600
601 /* Current state of asynchronous I/O. */
602 static int async_io_enabled;
603
604 /* Enable asynchronous I/O. */
605 void
606 enable_async_io (void)
607 {
608 if (async_io_enabled)
609 return;
610
611 #ifndef USE_WIN32API
612 signal (SIGIO, input_interrupt);
613 #endif
614 async_io_enabled = 1;
615 }
616
617 /* Disable asynchronous I/O. */
618 void
619 disable_async_io (void)
620 {
621 if (!async_io_enabled)
622 return;
623
624 #ifndef USE_WIN32API
625 signal (SIGIO, SIG_IGN);
626 #endif
627 async_io_enabled = 0;
628 }
629
630 /* Returns next char from remote GDB. -1 if error. */
631
632 static int
633 readchar (void)
634 {
635 static unsigned char buf[BUFSIZ];
636 static int bufcnt = 0;
637 static unsigned char *bufp;
638
639 if (bufcnt-- > 0)
640 return *bufp++;
641
642 bufcnt = recv (remote_desc, buf, sizeof (buf), 0);
643
644 if (bufcnt <= 0)
645 {
646 if (bufcnt == 0)
647 fprintf (stderr, "readchar: Got EOF\n");
648 else
649 perror ("readchar");
650
651 return -1;
652 }
653
654 bufp = buf;
655 bufcnt--;
656 return *bufp++ & 0x7f;
657 }
658
659 /* Read a packet from the remote machine, with error checking,
660 and store it in BUF. Returns length of packet, or negative if error. */
661
662 int
663 getpkt (char *buf)
664 {
665 char *bp;
666 unsigned char csum, c1, c2;
667 int c;
668
669 while (1)
670 {
671 csum = 0;
672
673 while (1)
674 {
675 c = readchar ();
676 if (c == '$')
677 break;
678 if (remote_debug)
679 {
680 fprintf (stderr, "[getpkt: discarding char '%c']\n", c);
681 fflush (stderr);
682 }
683
684 if (c < 0)
685 return -1;
686 }
687
688 bp = buf;
689 while (1)
690 {
691 c = readchar ();
692 if (c < 0)
693 return -1;
694 if (c == '#')
695 break;
696 *bp++ = c;
697 csum += c;
698 }
699 *bp = 0;
700
701 c1 = fromhex (readchar ());
702 c2 = fromhex (readchar ());
703
704 if (csum == (c1 << 4) + c2)
705 break;
706
707 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
708 (c1 << 4) + c2, csum, buf);
709 send (remote_desc, "-", 1, 0);
710 }
711
712 if (remote_debug)
713 {
714 fprintf (stderr, "getpkt (\"%s\"); [sending ack] \n", buf);
715 fflush (stderr);
716 }
717
718 send (remote_desc, "+", 1, 0);
719
720 if (remote_debug)
721 {
722 fprintf (stderr, "[sent ack]\n");
723 fflush (stderr);
724 }
725
726 return bp - buf;
727 }
728
729 void
730 write_ok (char *buf)
731 {
732 buf[0] = 'O';
733 buf[1] = 'K';
734 buf[2] = '\0';
735 }
736
737 void
738 write_enn (char *buf)
739 {
740 /* Some day, we should define the meanings of the error codes... */
741 buf[0] = 'E';
742 buf[1] = '0';
743 buf[2] = '1';
744 buf[3] = '\0';
745 }
746
747 void
748 convert_int_to_ascii (unsigned char *from, char *to, int n)
749 {
750 int nib;
751 int ch;
752 while (n--)
753 {
754 ch = *from++;
755 nib = ((ch & 0xf0) >> 4) & 0x0f;
756 *to++ = tohex (nib);
757 nib = ch & 0x0f;
758 *to++ = tohex (nib);
759 }
760 *to++ = 0;
761 }
762
763
764 void
765 convert_ascii_to_int (char *from, unsigned char *to, int n)
766 {
767 int nib1, nib2;
768 while (n--)
769 {
770 nib1 = fromhex (*from++);
771 nib2 = fromhex (*from++);
772 *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f);
773 }
774 }
775
776 static char *
777 outreg (int regno, char *buf)
778 {
779 if ((regno >> 12) != 0)
780 *buf++ = tohex ((regno >> 12) & 0xf);
781 if ((regno >> 8) != 0)
782 *buf++ = tohex ((regno >> 8) & 0xf);
783 *buf++ = tohex ((regno >> 4) & 0xf);
784 *buf++ = tohex (regno & 0xf);
785 *buf++ = ':';
786 collect_register_as_string (regno, buf);
787 buf += 2 * register_size (regno);
788 *buf++ = ';';
789
790 return buf;
791 }
792
793 void
794 new_thread_notify (int id)
795 {
796 char own_buf[256];
797
798 /* The `n' response is not yet part of the remote protocol. Do nothing. */
799 if (1)
800 return;
801
802 if (server_waiting == 0)
803 return;
804
805 sprintf (own_buf, "n%x", id);
806 disable_async_io ();
807 putpkt (own_buf);
808 enable_async_io ();
809 }
810
811 void
812 dead_thread_notify (int id)
813 {
814 char own_buf[256];
815
816 /* The `x' response is not yet part of the remote protocol. Do nothing. */
817 if (1)
818 return;
819
820 sprintf (own_buf, "x%x", id);
821 disable_async_io ();
822 putpkt (own_buf);
823 enable_async_io ();
824 }
825
826 void
827 prepare_resume_reply (char *buf, char status, unsigned char sig)
828 {
829 int nib;
830
831 *buf++ = status;
832
833 nib = ((sig & 0xf0) >> 4);
834 *buf++ = tohex (nib);
835 nib = sig & 0x0f;
836 *buf++ = tohex (nib);
837
838 if (status == 'T')
839 {
840 const char **regp = gdbserver_expedite_regs;
841
842 if (the_target->stopped_by_watchpoint != NULL
843 && (*the_target->stopped_by_watchpoint) ())
844 {
845 CORE_ADDR addr;
846 int i;
847
848 strncpy (buf, "watch:", 6);
849 buf += 6;
850
851 addr = (*the_target->stopped_data_address) ();
852
853 /* Convert each byte of the address into two hexadecimal chars.
854 Note that we take sizeof (void *) instead of sizeof (addr);
855 this is to avoid sending a 64-bit address to a 32-bit GDB. */
856 for (i = sizeof (void *) * 2; i > 0; i--)
857 {
858 *buf++ = tohex ((addr >> (i - 1) * 4) & 0xf);
859 }
860 *buf++ = ';';
861 }
862
863 while (*regp)
864 {
865 buf = outreg (find_regno (*regp), buf);
866 regp ++;
867 }
868
869 /* Formerly, if the debugger had not used any thread features we would not
870 burden it with a thread status response. This was for the benefit of
871 GDB 4.13 and older. However, in recent GDB versions the check
872 (``if (cont_thread != 0)'') does not have the desired effect because of
873 sillyness in the way that the remote protocol handles specifying a thread.
874 Since thread support relies on qSymbol support anyway, assume GDB can handle
875 threads. */
876
877 if (using_threads)
878 {
879 unsigned int gdb_id_from_wait;
880
881 /* FIXME right place to set this? */
882 thread_from_wait = ((struct inferior_list_entry *)current_inferior)->id;
883 gdb_id_from_wait = thread_to_gdb_id (current_inferior);
884
885 if (debug_threads)
886 fprintf (stderr, "Writing resume reply for %ld\n\n", thread_from_wait);
887 /* This if (1) ought to be unnecessary. But remote_wait in GDB
888 will claim this event belongs to inferior_ptid if we do not
889 specify a thread, and there's no way for gdbserver to know
890 what inferior_ptid is. */
891 if (1 || old_thread_from_wait != thread_from_wait)
892 {
893 general_thread = thread_from_wait;
894 sprintf (buf, "thread:%x;", gdb_id_from_wait);
895 buf += strlen (buf);
896 old_thread_from_wait = thread_from_wait;
897 }
898 }
899 }
900 /* For W and X, we're done. */
901 *buf++ = 0;
902 }
903
904 void
905 decode_m_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr)
906 {
907 int i = 0, j = 0;
908 char ch;
909 *mem_addr_ptr = *len_ptr = 0;
910
911 while ((ch = from[i++]) != ',')
912 {
913 *mem_addr_ptr = *mem_addr_ptr << 4;
914 *mem_addr_ptr |= fromhex (ch) & 0x0f;
915 }
916
917 for (j = 0; j < 4; j++)
918 {
919 if ((ch = from[i++]) == 0)
920 break;
921 *len_ptr = *len_ptr << 4;
922 *len_ptr |= fromhex (ch) & 0x0f;
923 }
924 }
925
926 void
927 decode_M_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr,
928 unsigned char *to)
929 {
930 int i = 0;
931 char ch;
932 *mem_addr_ptr = *len_ptr = 0;
933
934 while ((ch = from[i++]) != ',')
935 {
936 *mem_addr_ptr = *mem_addr_ptr << 4;
937 *mem_addr_ptr |= fromhex (ch) & 0x0f;
938 }
939
940 while ((ch = from[i++]) != ':')
941 {
942 *len_ptr = *len_ptr << 4;
943 *len_ptr |= fromhex (ch) & 0x0f;
944 }
945
946 convert_ascii_to_int (&from[i++], to, *len_ptr);
947 }
948
949 int
950 decode_X_packet (char *from, int packet_len, CORE_ADDR *mem_addr_ptr,
951 unsigned int *len_ptr, unsigned char *to)
952 {
953 int i = 0;
954 char ch;
955 *mem_addr_ptr = *len_ptr = 0;
956
957 while ((ch = from[i++]) != ',')
958 {
959 *mem_addr_ptr = *mem_addr_ptr << 4;
960 *mem_addr_ptr |= fromhex (ch) & 0x0f;
961 }
962
963 while ((ch = from[i++]) != ':')
964 {
965 *len_ptr = *len_ptr << 4;
966 *len_ptr |= fromhex (ch) & 0x0f;
967 }
968
969 if (remote_unescape_input ((const gdb_byte *) &from[i], packet_len - i,
970 to, *len_ptr) != *len_ptr)
971 return -1;
972
973 return 0;
974 }
975
976 /* Ask GDB for the address of NAME, and return it in ADDRP if found.
977 Returns 1 if the symbol is found, 0 if it is not, -1 on error. */
978
979 int
980 look_up_one_symbol (const char *name, CORE_ADDR *addrp)
981 {
982 char own_buf[266], *p, *q;
983 int len;
984 struct sym_cache *sym;
985
986 /* Check the cache first. */
987 for (sym = symbol_cache; sym; sym = sym->next)
988 if (strcmp (name, sym->name) == 0)
989 {
990 *addrp = sym->addr;
991 return 1;
992 }
993
994 /* If we've passed the call to thread_db_look_up_symbols, then
995 anything not in the cache must not exist; we're not interested
996 in any libraries loaded after that point, only in symbols in
997 libpthread.so. It might not be an appropriate time to look
998 up a symbol, e.g. while we're trying to fetch registers. */
999 if (all_symbols_looked_up)
1000 return 0;
1001
1002 /* Send the request. */
1003 strcpy (own_buf, "qSymbol:");
1004 hexify (own_buf + strlen ("qSymbol:"), name, strlen (name));
1005 if (putpkt (own_buf) < 0)
1006 return -1;
1007
1008 /* FIXME: Eventually add buffer overflow checking (to getpkt?) */
1009 len = getpkt (own_buf);
1010 if (len < 0)
1011 return -1;
1012
1013 if (strncmp (own_buf, "qSymbol:", strlen ("qSymbol:")) != 0)
1014 {
1015 /* Malformed response. */
1016 if (remote_debug)
1017 {
1018 fprintf (stderr, "Malformed response to qSymbol, ignoring.\n");
1019 fflush (stderr);
1020 }
1021
1022 return -1;
1023 }
1024
1025 p = own_buf + strlen ("qSymbol:");
1026 q = p;
1027 while (*q && *q != ':')
1028 q++;
1029
1030 /* Make sure we found a value for the symbol. */
1031 if (p == q || *q == '\0')
1032 return 0;
1033
1034 decode_address (addrp, p, q - p);
1035
1036 /* Save the symbol in our cache. */
1037 sym = malloc (sizeof (*sym));
1038 sym->name = strdup (name);
1039 sym->addr = *addrp;
1040 sym->next = symbol_cache;
1041 symbol_cache = sym;
1042
1043 return 1;
1044 }
This page took 0.052096 seconds and 4 git commands to generate.