1 /* Remote utility routines for the remote server for GDB.
2    Copyright (C) 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
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 3 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, see <http://www.gnu.org/licenses/>.  */
20 
21 #include "server.h"
22 #include "terminal.h"
23 #include "target.h"
24 #include <stdio.h>
25 #include <string.h>
26 #if HAVE_SYS_IOCTL_H
27 #include <sys/ioctl.h>
28 #endif
29 #if HAVE_SYS_FILE_H
30 #include <sys/file.h>
31 #endif
32 #if HAVE_NETINET_IN_H
33 #include <netinet/in.h>
34 #endif
35 #if HAVE_SYS_SOCKET_H
36 #include <sys/socket.h>
37 #endif
38 #if HAVE_NETDB_H
39 #include <netdb.h>
40 #endif
41 #if HAVE_NETINET_TCP_H
42 #include <netinet/tcp.h>
43 #endif
44 #if HAVE_SYS_IOCTL_H
45 #include <sys/ioctl.h>
46 #endif
47 #if HAVE_SIGNAL_H
48 #include <signal.h>
49 #endif
50 #if HAVE_FCNTL_H
51 #include <fcntl.h>
52 #endif
53 #include <sys/time.h>
54 #if HAVE_UNISTD_H
55 #include <unistd.h>
56 #endif
57 #if HAVE_ARPA_INET_H
58 #include <arpa/inet.h>
59 #endif
60 #include <sys/stat.h>
61 #if HAVE_ERRNO_H
62 #include <errno.h>
63 #endif
64 
65 #if USE_WIN32API
66 #include <winsock2.h>
67 #endif
68 
69 #if __QNX__
70 #include <sys/iomgr.h>
71 #endif /* __QNX__ */
72 
73 #ifndef HAVE_SOCKLEN_T
74 typedef int socklen_t;
75 #endif
76 
77 #ifndef IN_PROCESS_AGENT
78 
79 #if USE_WIN32API
80 # define INVALID_DESCRIPTOR INVALID_SOCKET
81 #else
82 # define INVALID_DESCRIPTOR -1
83 #endif
84 
85 /* Extra value for readchar_callback.  */
86 enum {
87   /* The callback is currently not scheduled.  */
88   NOT_SCHEDULED = -1
89 };
90 
91 /* Status of the readchar callback.
92    Either NOT_SCHEDULED or the callback id.  */
93 static int readchar_callback = NOT_SCHEDULED;
94 
95 static int readchar (void);
96 static void reset_readchar (void);
97 static void reschedule (void);
98 
99 /* A cache entry for a successfully looked-up symbol.  */
100 struct sym_cache
101 {
102   char *name;
103   CORE_ADDR addr;
104   struct sym_cache *next;
105 };
106 
107 int remote_debug = 0;
108 struct ui_file *gdb_stdlog;
109 
110 static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
111 static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
112 
113 /* FIXME headerize? */
114 extern int using_threads;
115 extern int debug_threads;
116 
117 /* If true, then GDB has requested noack mode.  */
118 int noack_mode = 0;
119 /* If true, then we tell GDB to use noack mode by default.  */
120 int transport_is_reliable = 0;
121 
122 #ifdef USE_WIN32API
123 # define read(fd, buf, len) recv (fd, (char *) buf, len, 0)
124 # define write(fd, buf, len) send (fd, (char *) buf, len, 0)
125 #endif
126 
127 int
gdb_connected(void)128 gdb_connected (void)
129 {
130   return remote_desc != INVALID_DESCRIPTOR;
131 }
132 
133 static void
enable_async_notification(int fd)134 enable_async_notification (int fd)
135 {
136 #if defined(F_SETFL) && defined (FASYNC)
137   int save_fcntl_flags;
138 
139   save_fcntl_flags = fcntl (fd, F_GETFL, 0);
140   fcntl (fd, F_SETFL, save_fcntl_flags | FASYNC);
141 #if defined (F_SETOWN)
142   fcntl (fd, F_SETOWN, getpid ());
143 #endif
144 #endif
145 }
146 
147 static int
handle_accept_event(int err,gdb_client_data client_data)148 handle_accept_event (int err, gdb_client_data client_data)
149 {
150   struct sockaddr_in sockaddr;
151   socklen_t tmp;
152 
153   if (debug_threads)
154     fprintf (stderr, "handling possible accept event\n");
155 
156   tmp = sizeof (sockaddr);
157   remote_desc = accept (listen_desc, (struct sockaddr *) &sockaddr, &tmp);
158   if (remote_desc == -1)
159     perror_with_name ("Accept failed");
160 
161   /* Enable TCP keep alive process. */
162   tmp = 1;
163   setsockopt (remote_desc, SOL_SOCKET, SO_KEEPALIVE,
164 	      (char *) &tmp, sizeof (tmp));
165 
166   /* Tell TCP not to delay small packets.  This greatly speeds up
167      interactive response. */
168   tmp = 1;
169   setsockopt (remote_desc, IPPROTO_TCP, TCP_NODELAY,
170 	      (char *) &tmp, sizeof (tmp));
171 
172 #ifndef USE_WIN32API
173   close (listen_desc);		/* No longer need this */
174 
175   signal (SIGPIPE, SIG_IGN);	/* If we don't do this, then gdbserver simply
176 				   exits when the remote side dies.  */
177 #else
178   closesocket (listen_desc);	/* No longer need this */
179 #endif
180 
181   delete_file_handler (listen_desc);
182 
183   /* Convert IP address to string.  */
184   fprintf (stderr, "Remote debugging from host %s\n",
185 	   inet_ntoa (sockaddr.sin_addr));
186 
187   enable_async_notification (remote_desc);
188 
189   /* Register the event loop handler.  */
190   add_file_handler (remote_desc, handle_serial_event, NULL);
191 
192   /* We have a new GDB connection now.  If we were disconnected
193      tracing, there's a window where the target could report a stop
194      event to the event loop, and since we have a connection now, we'd
195      try to send vStopped notifications to GDB.  But, don't do that
196      until GDB as selected all-stop/non-stop, and has queried the
197      threads' status ('?').  */
198   target_async (0);
199 
200   return 0;
201 }
202 
203 /* Open a connection to a remote debugger.
204    NAME is the filename used for communication.  */
205 
206 void
remote_open(char * name)207 remote_open (char *name)
208 {
209   char *port_str;
210 
211   port_str = strchr (name, ':');
212   if (port_str == NULL)
213     {
214 #ifdef USE_WIN32API
215       error ("Only <host>:<port> is supported on this platform.");
216 #else
217       struct stat statbuf;
218 
219       if (stat (name, &statbuf) == 0
220 	  && (S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode)))
221 	remote_desc = open (name, O_RDWR);
222       else
223 	{
224 	  errno = EINVAL;
225 	  remote_desc = -1;
226 	}
227 
228       if (remote_desc < 0)
229 	perror_with_name ("Could not open remote device");
230 
231 #ifdef HAVE_TERMIOS
232       {
233 	struct termios termios;
234 	tcgetattr (remote_desc, &termios);
235 
236 	termios.c_iflag = 0;
237 	termios.c_oflag = 0;
238 	termios.c_lflag = 0;
239 	termios.c_cflag &= ~(CSIZE | PARENB);
240 	termios.c_cflag |= CLOCAL | CS8;
241 	termios.c_cc[VMIN] = 1;
242 	termios.c_cc[VTIME] = 0;
243 
244 	tcsetattr (remote_desc, TCSANOW, &termios);
245       }
246 #endif
247 
248 #ifdef HAVE_TERMIO
249       {
250 	struct termio termio;
251 	ioctl (remote_desc, TCGETA, &termio);
252 
253 	termio.c_iflag = 0;
254 	termio.c_oflag = 0;
255 	termio.c_lflag = 0;
256 	termio.c_cflag &= ~(CSIZE | PARENB);
257 	termio.c_cflag |= CLOCAL | CS8;
258 	termio.c_cc[VMIN] = 1;
259 	termio.c_cc[VTIME] = 0;
260 
261 	ioctl (remote_desc, TCSETA, &termio);
262       }
263 #endif
264 
265 #ifdef HAVE_SGTTY
266       {
267 	struct sgttyb sg;
268 
269 	ioctl (remote_desc, TIOCGETP, &sg);
270 	sg.sg_flags = RAW;
271 	ioctl (remote_desc, TIOCSETP, &sg);
272       }
273 #endif
274 
275       fprintf (stderr, "Remote debugging using %s\n", name);
276 
277       transport_is_reliable = 0;
278 
279       enable_async_notification (remote_desc);
280 
281       /* Register the event loop handler.  */
282       add_file_handler (remote_desc, handle_serial_event, NULL);
283 #endif /* USE_WIN32API */
284     }
285   else
286     {
287 #ifdef USE_WIN32API
288       static int winsock_initialized;
289 #endif
290       int port;
291       struct sockaddr_in sockaddr;
292       socklen_t tmp;
293       char *port_end;
294 
295       port = strtoul (port_str + 1, &port_end, 10);
296       if (port_str[1] == '\0' || *port_end != '\0')
297 	fatal ("Bad port argument: %s", name);
298 
299 #ifdef USE_WIN32API
300       if (!winsock_initialized)
301 	{
302 	  WSADATA wsad;
303 
304 	  WSAStartup (MAKEWORD (1, 0), &wsad);
305 	  winsock_initialized = 1;
306 	}
307 #endif
308 
309       listen_desc = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
310       if (listen_desc == -1)
311 	perror_with_name ("Can't open socket");
312 
313       /* Allow rapid reuse of this port. */
314       tmp = 1;
315       setsockopt (listen_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
316 		  sizeof (tmp));
317 
318       sockaddr.sin_family = PF_INET;
319       sockaddr.sin_port = htons (port);
320       sockaddr.sin_addr.s_addr = INADDR_ANY;
321 
322       if (bind (listen_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr))
323 	  || listen (listen_desc, 1))
324 	perror_with_name ("Can't bind address");
325 
326       /* If port is zero, a random port will be selected, and the
327 	 fprintf below needs to know what port was selected.  */
328       if (port == 0)
329 	{
330 	  socklen_t len = sizeof (sockaddr);
331 	  if (getsockname (listen_desc,
332 			   (struct sockaddr *) &sockaddr, &len) < 0
333 	      || len < sizeof (sockaddr))
334 	    perror_with_name ("Can't determine port");
335 	  port = ntohs (sockaddr.sin_port);
336 	}
337 
338       fprintf (stderr, "Listening on port %d\n", port);
339       fflush (stderr);
340 
341       /* Register the event loop handler.  */
342       add_file_handler (listen_desc, handle_accept_event, NULL);
343 
344       transport_is_reliable = 1;
345     }
346 }
347 
348 void
remote_close(void)349 remote_close (void)
350 {
351   delete_file_handler (remote_desc);
352 
353 #ifdef USE_WIN32API
354   closesocket (remote_desc);
355 #else
356   close (remote_desc);
357 #endif
358   remote_desc = INVALID_DESCRIPTOR;
359 
360   reset_readchar ();
361 }
362 
363 /* Convert hex digit A to a number.  */
364 
365 static int
fromhex(int a)366 fromhex (int a)
367 {
368   if (a >= '0' && a <= '9')
369     return a - '0';
370   else if (a >= 'a' && a <= 'f')
371     return a - 'a' + 10;
372   else
373     error ("Reply contains invalid hex digit");
374   return 0;
375 }
376 
377 #endif
378 
379 static const char hexchars[] = "0123456789abcdef";
380 
381 static int
ishex(int ch,int * val)382 ishex (int ch, int *val)
383 {
384   if ((ch >= 'a') && (ch <= 'f'))
385     {
386       *val = ch - 'a' + 10;
387       return 1;
388     }
389   if ((ch >= 'A') && (ch <= 'F'))
390     {
391       *val = ch - 'A' + 10;
392       return 1;
393     }
394   if ((ch >= '0') && (ch <= '9'))
395     {
396       *val = ch - '0';
397       return 1;
398     }
399   return 0;
400 }
401 
402 #ifndef IN_PROCESS_AGENT
403 
404 int
unhexify(char * bin,const char * hex,int count)405 unhexify (char *bin, const char *hex, int count)
406 {
407   int i;
408 
409   for (i = 0; i < count; i++)
410     {
411       if (hex[0] == 0 || hex[1] == 0)
412 	{
413 	  /* Hex string is short, or of uneven length.
414 	     Return the count that has been converted so far. */
415 	  return i;
416 	}
417       *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]);
418       hex += 2;
419     }
420   return i;
421 }
422 
423 void
decode_address(CORE_ADDR * addrp,const char * start,int len)424 decode_address (CORE_ADDR *addrp, const char *start, int len)
425 {
426   CORE_ADDR addr;
427   char ch;
428   int i;
429 
430   addr = 0;
431   for (i = 0; i < len; i++)
432     {
433       ch = start[i];
434       addr = addr << 4;
435       addr = addr | (fromhex (ch) & 0x0f);
436     }
437   *addrp = addr;
438 }
439 
440 const char *
decode_address_to_semicolon(CORE_ADDR * addrp,const char * start)441 decode_address_to_semicolon (CORE_ADDR *addrp, const char *start)
442 {
443   const char *end;
444 
445   end = start;
446   while (*end != '\0' && *end != ';')
447     end++;
448 
449   decode_address (addrp, start, end - start);
450 
451   if (*end == ';')
452     end++;
453   return end;
454 }
455 
456 #endif
457 
458 /* Convert number NIB to a hex digit.  */
459 
460 static int
tohex(int nib)461 tohex (int nib)
462 {
463   if (nib < 10)
464     return '0' + nib;
465   else
466     return 'a' + nib - 10;
467 }
468 
469 #ifndef IN_PROCESS_AGENT
470 
471 int
hexify(char * hex,const char * bin,int count)472 hexify (char *hex, const char *bin, int count)
473 {
474   int i;
475 
476   /* May use a length, or a nul-terminated string as input. */
477   if (count == 0)
478     count = strlen (bin);
479 
480   for (i = 0; i < count; i++)
481     {
482       *hex++ = tohex ((*bin >> 4) & 0xf);
483       *hex++ = tohex (*bin++ & 0xf);
484     }
485   *hex = 0;
486   return i;
487 }
488 
489 /* Convert BUFFER, binary data at least LEN bytes long, into escaped
490    binary data in OUT_BUF.  Set *OUT_LEN to the length of the data
491    encoded in OUT_BUF, and return the number of bytes in OUT_BUF
492    (which may be more than *OUT_LEN due to escape characters).  The
493    total number of bytes in the output buffer will be at most
494    OUT_MAXLEN.  */
495 
496 int
remote_escape_output(const gdb_byte * buffer,int len,gdb_byte * out_buf,int * out_len,int out_maxlen)497 remote_escape_output (const gdb_byte *buffer, int len,
498 		      gdb_byte *out_buf, int *out_len,
499 		      int out_maxlen)
500 {
501   int input_index, output_index;
502 
503   output_index = 0;
504   for (input_index = 0; input_index < len; input_index++)
505     {
506       gdb_byte b = buffer[input_index];
507 
508       if (b == '$' || b == '#' || b == '}' || b == '*')
509 	{
510 	  /* These must be escaped.  */
511 	  if (output_index + 2 > out_maxlen)
512 	    break;
513 	  out_buf[output_index++] = '}';
514 	  out_buf[output_index++] = b ^ 0x20;
515 	}
516       else
517 	{
518 	  if (output_index + 1 > out_maxlen)
519 	    break;
520 	  out_buf[output_index++] = b;
521 	}
522     }
523 
524   *out_len = input_index;
525   return output_index;
526 }
527 
528 /* Convert BUFFER, escaped data LEN bytes long, into binary data
529    in OUT_BUF.  Return the number of bytes written to OUT_BUF.
530    Raise an error if the total number of bytes exceeds OUT_MAXLEN.
531 
532    This function reverses remote_escape_output.  It allows more
533    escaped characters than that function does, in particular because
534    '*' must be escaped to avoid the run-length encoding processing
535    in reading packets.  */
536 
537 static int
remote_unescape_input(const gdb_byte * buffer,int len,gdb_byte * out_buf,int out_maxlen)538 remote_unescape_input (const gdb_byte *buffer, int len,
539 		       gdb_byte *out_buf, int out_maxlen)
540 {
541   int input_index, output_index;
542   int escaped;
543 
544   output_index = 0;
545   escaped = 0;
546   for (input_index = 0; input_index < len; input_index++)
547     {
548       gdb_byte b = buffer[input_index];
549 
550       if (output_index + 1 > out_maxlen)
551 	error ("Received too much data from the target.");
552 
553       if (escaped)
554 	{
555 	  out_buf[output_index++] = b ^ 0x20;
556 	  escaped = 0;
557 	}
558       else if (b == '}')
559 	escaped = 1;
560       else
561 	out_buf[output_index++] = b;
562     }
563 
564   if (escaped)
565     error ("Unmatched escape character in target response.");
566 
567   return output_index;
568 }
569 
570 /* Look for a sequence of characters which can be run-length encoded.
571    If there are any, update *CSUM and *P.  Otherwise, output the
572    single character.  Return the number of characters consumed.  */
573 
574 static int
try_rle(char * buf,int remaining,unsigned char * csum,char ** p)575 try_rle (char *buf, int remaining, unsigned char *csum, char **p)
576 {
577   int n;
578 
579   /* Always output the character.  */
580   *csum += buf[0];
581   *(*p)++ = buf[0];
582 
583   /* Don't go past '~'.  */
584   if (remaining > 97)
585     remaining = 97;
586 
587   for (n = 1; n < remaining; n++)
588     if (buf[n] != buf[0])
589       break;
590 
591   /* N is the index of the first character not the same as buf[0].
592      buf[0] is counted twice, so by decrementing N, we get the number
593      of characters the RLE sequence will replace.  */
594   n--;
595 
596   if (n < 3)
597     return 1;
598 
599   /* Skip the frame characters.  The manual says to skip '+' and '-'
600      also, but there's no reason to.  Unfortunately these two unusable
601      characters double the encoded length of a four byte zero
602      value.  */
603   while (n + 29 == '$' || n + 29 == '#')
604     n--;
605 
606   *csum += '*';
607   *(*p)++ = '*';
608   *csum += n + 29;
609   *(*p)++ = n + 29;
610 
611   return n + 1;
612 }
613 
614 #endif
615 
616 char *
unpack_varlen_hex(char * buff,ULONGEST * result)617 unpack_varlen_hex (char *buff,	/* packet to parse */
618 		   ULONGEST *result)
619 {
620   int nibble;
621   ULONGEST retval = 0;
622 
623   while (ishex (*buff, &nibble))
624     {
625       buff++;
626       retval = retval << 4;
627       retval |= nibble & 0x0f;
628     }
629   *result = retval;
630   return buff;
631 }
632 
633 #ifndef IN_PROCESS_AGENT
634 
635 /* Write a PTID to BUF.  Returns BUF+CHARACTERS_WRITTEN.  */
636 
637 char *
write_ptid(char * buf,ptid_t ptid)638 write_ptid (char *buf, ptid_t ptid)
639 {
640   int pid, tid;
641 
642   if (multi_process)
643     {
644       pid = ptid_get_pid (ptid);
645       if (pid < 0)
646 	buf += sprintf (buf, "p-%x.", -pid);
647       else
648 	buf += sprintf (buf, "p%x.", pid);
649     }
650   tid = ptid_get_lwp (ptid);
651   if (tid < 0)
652     buf += sprintf (buf, "-%x", -tid);
653   else
654     buf += sprintf (buf, "%x", tid);
655 
656   return buf;
657 }
658 
659 ULONGEST
hex_or_minus_one(char * buf,char ** obuf)660 hex_or_minus_one (char *buf, char **obuf)
661 {
662   ULONGEST ret;
663 
664   if (strncmp (buf, "-1", 2) == 0)
665     {
666       ret = (ULONGEST) -1;
667       buf += 2;
668     }
669   else
670     buf = unpack_varlen_hex (buf, &ret);
671 
672   if (obuf)
673     *obuf = buf;
674 
675   return ret;
676 }
677 
678 /* Extract a PTID from BUF.  If non-null, OBUF is set to the to one
679    passed the last parsed char.  Returns null_ptid on error.  */
680 ptid_t
read_ptid(char * buf,char ** obuf)681 read_ptid (char *buf, char **obuf)
682 {
683   char *p = buf;
684   char *pp;
685   ULONGEST pid = 0, tid = 0;
686 
687   if (*p == 'p')
688     {
689       /* Multi-process ptid.  */
690       pp = unpack_varlen_hex (p + 1, &pid);
691       if (*pp != '.')
692 	error ("invalid remote ptid: %s\n", p);
693 
694       p = pp + 1;
695 
696       tid = hex_or_minus_one (p, &pp);
697 
698       if (obuf)
699 	*obuf = pp;
700       return ptid_build (pid, tid, 0);
701     }
702 
703   /* No multi-process.  Just a tid.  */
704   tid = hex_or_minus_one (p, &pp);
705 
706   /* Since the stub is not sending a process id, then default to
707      what's in the current inferior.  */
708   pid = ptid_get_pid (((struct inferior_list_entry *) current_inferior)->id);
709 
710   if (obuf)
711     *obuf = pp;
712   return ptid_build (pid, tid, 0);
713 }
714 
715 /* Send a packet to the remote machine, with error checking.
716    The data of the packet is in BUF, and the length of the
717    packet is in CNT.  Returns >= 0 on success, -1 otherwise.  */
718 
719 static int
putpkt_binary_1(char * buf,int cnt,int is_notif)720 putpkt_binary_1 (char *buf, int cnt, int is_notif)
721 {
722   int i;
723   unsigned char csum = 0;
724   char *buf2;
725   char *p;
726   int cc;
727 
728   buf2 = xmalloc (strlen ("$") + cnt + strlen ("#nn") + 1);
729 
730   /* Copy the packet into buffer BUF2, encapsulating it
731      and giving it a checksum.  */
732 
733   p = buf2;
734   if (is_notif)
735     *p++ = '%';
736   else
737     *p++ = '$';
738 
739   for (i = 0; i < cnt;)
740     i += try_rle (buf + i, cnt - i, &csum, &p);
741 
742   *p++ = '#';
743   *p++ = tohex ((csum >> 4) & 0xf);
744   *p++ = tohex (csum & 0xf);
745 
746   *p = '\0';
747 
748   /* Send it over and over until we get a positive ack.  */
749 
750   do
751     {
752       if (write (remote_desc, buf2, p - buf2) != p - buf2)
753 	{
754 	  perror ("putpkt(write)");
755 	  free (buf2);
756 	  return -1;
757 	}
758 
759       if (noack_mode || is_notif)
760 	{
761 	  /* Don't expect an ack then.  */
762 	  if (remote_debug)
763 	    {
764 	      if (is_notif)
765 		fprintf (stderr, "putpkt (\"%s\"); [notif]\n", buf2);
766 	      else
767 		fprintf (stderr, "putpkt (\"%s\"); [noack mode]\n", buf2);
768 	      fflush (stderr);
769 	    }
770 	  break;
771 	}
772 
773       if (remote_debug)
774 	{
775 	  fprintf (stderr, "putpkt (\"%s\"); [looking for ack]\n", buf2);
776 	  fflush (stderr);
777 	}
778 
779       cc = readchar ();
780 
781       if (cc < 0)
782 	{
783 	  free (buf2);
784 	  return -1;
785 	}
786 
787       if (remote_debug)
788 	{
789 	  fprintf (stderr, "[received '%c' (0x%x)]\n", cc, cc);
790 	  fflush (stderr);
791 	}
792 
793       /* Check for an input interrupt while we're here.  */
794       if (cc == '\003' && current_inferior != NULL)
795 	(*the_target->request_interrupt) ();
796     }
797   while (cc != '+');
798 
799   free (buf2);
800   return 1;			/* Success! */
801 }
802 
803 int
putpkt_binary(char * buf,int cnt)804 putpkt_binary (char *buf, int cnt)
805 {
806   return putpkt_binary_1 (buf, cnt, 0);
807 }
808 
809 /* Send a packet to the remote machine, with error checking.  The data
810    of the packet is in BUF, and the packet should be a NUL-terminated
811    string.  Returns >= 0 on success, -1 otherwise.  */
812 
813 int
putpkt(char * buf)814 putpkt (char *buf)
815 {
816   return putpkt_binary (buf, strlen (buf));
817 }
818 
819 int
putpkt_notif(char * buf)820 putpkt_notif (char *buf)
821 {
822   return putpkt_binary_1 (buf, strlen (buf), 1);
823 }
824 
825 /* Come here when we get an input interrupt from the remote side.  This
826    interrupt should only be active while we are waiting for the child to do
827    something.  Thus this assumes readchar:bufcnt is 0.
828    About the only thing that should come through is a ^C, which
829    will cause us to request child interruption.  */
830 
831 static void
input_interrupt(int unused)832 input_interrupt (int unused)
833 {
834   fd_set readset;
835   struct timeval immediate = { 0, 0 };
836 
837   /* Protect against spurious interrupts.  This has been observed to
838      be a problem under NetBSD 1.4 and 1.5.  */
839 
840   FD_ZERO (&readset);
841   FD_SET (remote_desc, &readset);
842   if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0)
843     {
844       int cc;
845       char c = 0;
846 
847       cc = read (remote_desc, &c, 1);
848 
849       if (cc != 1 || c != '\003' || current_inferior == NULL)
850 	{
851 	  fprintf (stderr, "input_interrupt, count = %d c = %d ('%c')\n",
852 		   cc, c, c);
853 	  return;
854 	}
855 
856       (*the_target->request_interrupt) ();
857     }
858 }
859 
860 /* Check if the remote side sent us an interrupt request (^C).  */
861 void
check_remote_input_interrupt_request(void)862 check_remote_input_interrupt_request (void)
863 {
864   /* This function may be called before establishing communications,
865      therefore we need to validate the remote descriptor.  */
866 
867   if (remote_desc == INVALID_DESCRIPTOR)
868     return;
869 
870   input_interrupt (0);
871 }
872 
873 /* Asynchronous I/O support.  SIGIO must be enabled when waiting, in order to
874    accept Control-C from the client, and must be disabled when talking to
875    the client.  */
876 
877 static void
unblock_async_io(void)878 unblock_async_io (void)
879 {
880 #ifndef USE_WIN32API
881   sigset_t sigio_set;
882 
883   sigemptyset (&sigio_set);
884   sigaddset (&sigio_set, SIGIO);
885   sigprocmask (SIG_UNBLOCK, &sigio_set, NULL);
886 #endif
887 }
888 
889 #ifdef __QNX__
890 static void
nto_comctrl(int enable)891 nto_comctrl (int enable)
892 {
893   struct sigevent event;
894 
895   if (enable)
896     {
897       event.sigev_notify = SIGEV_SIGNAL_THREAD;
898       event.sigev_signo = SIGIO;
899       event.sigev_code = 0;
900       event.sigev_value.sival_ptr = NULL;
901       event.sigev_priority = -1;
902       ionotify (remote_desc, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_INPUT,
903 		&event);
904     }
905   else
906     ionotify (remote_desc, _NOTIFY_ACTION_POLL, _NOTIFY_COND_INPUT, NULL);
907 }
908 #endif /* __QNX__ */
909 
910 
911 /* Current state of asynchronous I/O.  */
912 static int async_io_enabled;
913 
914 /* Enable asynchronous I/O.  */
915 void
enable_async_io(void)916 enable_async_io (void)
917 {
918   if (async_io_enabled)
919     return;
920 
921 #ifndef USE_WIN32API
922   signal (SIGIO, input_interrupt);
923 #endif
924   async_io_enabled = 1;
925 #ifdef __QNX__
926   nto_comctrl (1);
927 #endif /* __QNX__ */
928 }
929 
930 /* Disable asynchronous I/O.  */
931 void
disable_async_io(void)932 disable_async_io (void)
933 {
934   if (!async_io_enabled)
935     return;
936 
937 #ifndef USE_WIN32API
938   signal (SIGIO, SIG_IGN);
939 #endif
940   async_io_enabled = 0;
941 #ifdef __QNX__
942   nto_comctrl (0);
943 #endif /* __QNX__ */
944 
945 }
946 
947 void
initialize_async_io(void)948 initialize_async_io (void)
949 {
950   /* Make sure that async I/O starts disabled.  */
951   async_io_enabled = 1;
952   disable_async_io ();
953 
954   /* Make sure the signal is unblocked.  */
955   unblock_async_io ();
956 }
957 
958 /* Internal buffer used by readchar.
959    These are global to readchar because reschedule_remote needs to be
960    able to tell whether the buffer is empty.  */
961 
962 static unsigned char readchar_buf[BUFSIZ];
963 static int readchar_bufcnt = 0;
964 static unsigned char *readchar_bufp;
965 
966 /* Returns next char from remote GDB.  -1 if error.  */
967 
968 static int
readchar(void)969 readchar (void)
970 {
971   int ch;
972 
973   if (readchar_bufcnt == 0)
974     {
975       readchar_bufcnt = read (remote_desc, readchar_buf,
976 			      sizeof (readchar_buf));
977 
978       if (readchar_bufcnt <= 0)
979 	{
980 	  if (readchar_bufcnt == 0)
981 	    fprintf (stderr, "readchar: Got EOF\n");
982 	  else
983 	    perror ("readchar");
984 
985 	  return -1;
986 	}
987 
988       readchar_bufp = readchar_buf;
989     }
990 
991   readchar_bufcnt--;
992   ch = *readchar_bufp++;
993   reschedule ();
994   return ch;
995 }
996 
997 /* Reset the readchar state machine.  */
998 
999 static void
reset_readchar(void)1000 reset_readchar (void)
1001 {
1002   readchar_bufcnt = 0;
1003   if (readchar_callback != NOT_SCHEDULED)
1004     {
1005       delete_callback_event (readchar_callback);
1006       readchar_callback = NOT_SCHEDULED;
1007     }
1008 }
1009 
1010 /* Process remaining data in readchar_buf.  */
1011 
1012 static int
process_remaining(void * context)1013 process_remaining (void *context)
1014 {
1015   int res;
1016 
1017   /* This is a one-shot event.  */
1018   readchar_callback = NOT_SCHEDULED;
1019 
1020   if (readchar_bufcnt > 0)
1021     res = handle_serial_event (0, NULL);
1022   else
1023     res = 0;
1024 
1025   return res;
1026 }
1027 
1028 /* If there is still data in the buffer, queue another event to process it,
1029    we can't sleep in select yet.  */
1030 
1031 static void
reschedule(void)1032 reschedule (void)
1033 {
1034   if (readchar_bufcnt > 0 && readchar_callback == NOT_SCHEDULED)
1035     readchar_callback = append_callback_event (process_remaining, NULL);
1036 }
1037 
1038 /* Read a packet from the remote machine, with error checking,
1039    and store it in BUF.  Returns length of packet, or negative if error. */
1040 
1041 int
getpkt(char * buf)1042 getpkt (char *buf)
1043 {
1044   char *bp;
1045   unsigned char csum, c1, c2;
1046   int c;
1047 
1048   while (1)
1049     {
1050       csum = 0;
1051 
1052       while (1)
1053 	{
1054 	  c = readchar ();
1055 	  if (c == '$')
1056 	    break;
1057 	  if (remote_debug)
1058 	    {
1059 	      fprintf (stderr, "[getpkt: discarding char '%c']\n", c);
1060 	      fflush (stderr);
1061 	    }
1062 
1063 	  if (c < 0)
1064 	    return -1;
1065 	}
1066 
1067       bp = buf;
1068       while (1)
1069 	{
1070 	  c = readchar ();
1071 	  if (c < 0)
1072 	    return -1;
1073 	  if (c == '#')
1074 	    break;
1075 	  *bp++ = c;
1076 	  csum += c;
1077 	}
1078       *bp = 0;
1079 
1080       c1 = fromhex (readchar ());
1081       c2 = fromhex (readchar ());
1082 
1083       if (csum == (c1 << 4) + c2)
1084 	break;
1085 
1086       if (noack_mode)
1087 	{
1088 	  fprintf (stderr,
1089 		   "Bad checksum, sentsum=0x%x, csum=0x%x, "
1090 		   "buf=%s [no-ack-mode, Bad medium?]\n",
1091 		   (c1 << 4) + c2, csum, buf);
1092 	  /* Not much we can do, GDB wasn't expecting an ack/nac.  */
1093 	  break;
1094 	}
1095 
1096       fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
1097 	       (c1 << 4) + c2, csum, buf);
1098       if (write (remote_desc, "-", 1) != 1)
1099 	return -1;
1100     }
1101 
1102   if (!noack_mode)
1103     {
1104       if (remote_debug)
1105 	{
1106 	  fprintf (stderr, "getpkt (\"%s\");  [sending ack] \n", buf);
1107 	  fflush (stderr);
1108 	}
1109 
1110       if (write (remote_desc, "+", 1) != 1)
1111 	return -1;
1112 
1113       if (remote_debug)
1114 	{
1115 	  fprintf (stderr, "[sent ack]\n");
1116 	  fflush (stderr);
1117 	}
1118     }
1119   else
1120     {
1121       if (remote_debug)
1122 	{
1123 	  fprintf (stderr, "getpkt (\"%s\");  [no ack sent] \n", buf);
1124 	  fflush (stderr);
1125 	}
1126     }
1127 
1128   return bp - buf;
1129 }
1130 
1131 void
write_ok(char * buf)1132 write_ok (char *buf)
1133 {
1134   buf[0] = 'O';
1135   buf[1] = 'K';
1136   buf[2] = '\0';
1137 }
1138 
1139 void
write_enn(char * buf)1140 write_enn (char *buf)
1141 {
1142   /* Some day, we should define the meanings of the error codes... */
1143   buf[0] = 'E';
1144   buf[1] = '0';
1145   buf[2] = '1';
1146   buf[3] = '\0';
1147 }
1148 
1149 #endif
1150 
1151 void
convert_int_to_ascii(const unsigned char * from,char * to,int n)1152 convert_int_to_ascii (const unsigned char *from, char *to, int n)
1153 {
1154   int nib;
1155   int ch;
1156   while (n--)
1157     {
1158       ch = *from++;
1159       nib = ((ch & 0xf0) >> 4) & 0x0f;
1160       *to++ = tohex (nib);
1161       nib = ch & 0x0f;
1162       *to++ = tohex (nib);
1163     }
1164   *to++ = 0;
1165 }
1166 
1167 #ifndef IN_PROCESS_AGENT
1168 
1169 void
convert_ascii_to_int(const char * from,unsigned char * to,int n)1170 convert_ascii_to_int (const char *from, unsigned char *to, int n)
1171 {
1172   int nib1, nib2;
1173   while (n--)
1174     {
1175       nib1 = fromhex (*from++);
1176       nib2 = fromhex (*from++);
1177       *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f);
1178     }
1179 }
1180 
1181 static char *
outreg(struct regcache * regcache,int regno,char * buf)1182 outreg (struct regcache *regcache, int regno, char *buf)
1183 {
1184   if ((regno >> 12) != 0)
1185     *buf++ = tohex ((regno >> 12) & 0xf);
1186   if ((regno >> 8) != 0)
1187     *buf++ = tohex ((regno >> 8) & 0xf);
1188   *buf++ = tohex ((regno >> 4) & 0xf);
1189   *buf++ = tohex (regno & 0xf);
1190   *buf++ = ':';
1191   collect_register_as_string (regcache, regno, buf);
1192   buf += 2 * register_size (regno);
1193   *buf++ = ';';
1194 
1195   return buf;
1196 }
1197 
1198 void
new_thread_notify(int id)1199 new_thread_notify (int id)
1200 {
1201   char own_buf[256];
1202 
1203   /* The `n' response is not yet part of the remote protocol.  Do nothing.  */
1204   if (1)
1205     return;
1206 
1207   if (server_waiting == 0)
1208     return;
1209 
1210   sprintf (own_buf, "n%x", id);
1211   disable_async_io ();
1212   putpkt (own_buf);
1213   enable_async_io ();
1214 }
1215 
1216 void
dead_thread_notify(int id)1217 dead_thread_notify (int id)
1218 {
1219   char own_buf[256];
1220 
1221   /* The `x' response is not yet part of the remote protocol.  Do nothing.  */
1222   if (1)
1223     return;
1224 
1225   sprintf (own_buf, "x%x", id);
1226   disable_async_io ();
1227   putpkt (own_buf);
1228   enable_async_io ();
1229 }
1230 
1231 void
prepare_resume_reply(char * buf,ptid_t ptid,struct target_waitstatus * status)1232 prepare_resume_reply (char *buf, ptid_t ptid,
1233 		      struct target_waitstatus *status)
1234 {
1235   if (debug_threads)
1236     fprintf (stderr, "Writing resume reply for %s:%d\n\n",
1237 	     target_pid_to_str (ptid), status->kind);
1238 
1239   switch (status->kind)
1240     {
1241     case TARGET_WAITKIND_STOPPED:
1242       {
1243 	struct thread_info *saved_inferior;
1244 	const char **regp;
1245 	struct regcache *regcache;
1246 
1247 	sprintf (buf, "T%02x", status->value.sig);
1248 	buf += strlen (buf);
1249 
1250 	regp = gdbserver_expedite_regs;
1251 
1252 	saved_inferior = current_inferior;
1253 
1254 	current_inferior = find_thread_ptid (ptid);
1255 
1256 	regcache = get_thread_regcache (current_inferior, 1);
1257 
1258 	if (the_target->stopped_by_watchpoint != NULL
1259 	    && (*the_target->stopped_by_watchpoint) ())
1260 	  {
1261 	    CORE_ADDR addr;
1262 	    int i;
1263 
1264 	    strncpy (buf, "watch:", 6);
1265 	    buf += 6;
1266 
1267 	    addr = (*the_target->stopped_data_address) ();
1268 
1269 	    /* Convert each byte of the address into two hexadecimal
1270 	       chars.  Note that we take sizeof (void *) instead of
1271 	       sizeof (addr); this is to avoid sending a 64-bit
1272 	       address to a 32-bit GDB.  */
1273 	    for (i = sizeof (void *) * 2; i > 0; i--)
1274 	      *buf++ = tohex ((addr >> (i - 1) * 4) & 0xf);
1275 	    *buf++ = ';';
1276 	  }
1277 
1278 	while (*regp)
1279 	  {
1280 	    buf = outreg (regcache, find_regno (*regp), buf);
1281 	    regp ++;
1282 	  }
1283 	*buf = '\0';
1284 
1285 	/* Formerly, if the debugger had not used any thread features
1286 	   we would not burden it with a thread status response.  This
1287 	   was for the benefit of GDB 4.13 and older.  However, in
1288 	   recent GDB versions the check (``if (cont_thread != 0)'')
1289 	   does not have the desired effect because of sillyness in
1290 	   the way that the remote protocol handles specifying a
1291 	   thread.  Since thread support relies on qSymbol support
1292 	   anyway, assume GDB can handle threads.  */
1293 
1294 	if (using_threads && !disable_packet_Tthread)
1295 	  {
1296 	    /* This if (1) ought to be unnecessary.  But remote_wait
1297 	       in GDB will claim this event belongs to inferior_ptid
1298 	       if we do not specify a thread, and there's no way for
1299 	       gdbserver to know what inferior_ptid is.  */
1300 	    if (1 || !ptid_equal (general_thread, ptid))
1301 	      {
1302 		int core = -1;
1303 		/* In non-stop, don't change the general thread behind
1304 		   GDB's back.  */
1305 		if (!non_stop)
1306 		  general_thread = ptid;
1307 		sprintf (buf, "thread:");
1308 		buf += strlen (buf);
1309 		buf = write_ptid (buf, ptid);
1310 		strcat (buf, ";");
1311 		buf += strlen (buf);
1312 
1313 		if (the_target->core_of_thread)
1314 		  core = (*the_target->core_of_thread) (ptid);
1315 		if (core != -1)
1316 		  {
1317 		    sprintf (buf, "core:");
1318 		    buf += strlen (buf);
1319 		    sprintf (buf, "%x", core);
1320 		    strcat (buf, ";");
1321 		    buf += strlen (buf);
1322 		  }
1323 	      }
1324 	  }
1325 
1326 	if (dlls_changed)
1327 	  {
1328 	    strcpy (buf, "library:;");
1329 	    buf += strlen (buf);
1330 	    dlls_changed = 0;
1331 	  }
1332 
1333 	current_inferior = saved_inferior;
1334       }
1335       break;
1336     case TARGET_WAITKIND_EXITED:
1337       if (multi_process)
1338 	sprintf (buf, "W%x;process:%x",
1339 		 status->value.integer, ptid_get_pid (ptid));
1340       else
1341 	sprintf (buf, "W%02x", status->value.integer);
1342       break;
1343     case TARGET_WAITKIND_SIGNALLED:
1344       if (multi_process)
1345 	sprintf (buf, "X%x;process:%x",
1346 		 status->value.sig, ptid_get_pid (ptid));
1347       else
1348 	sprintf (buf, "X%02x", status->value.sig);
1349       break;
1350     default:
1351       error ("unhandled waitkind");
1352       break;
1353     }
1354 }
1355 
1356 void
decode_m_packet(char * from,CORE_ADDR * mem_addr_ptr,unsigned int * len_ptr)1357 decode_m_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr)
1358 {
1359   int i = 0, j = 0;
1360   char ch;
1361   *mem_addr_ptr = *len_ptr = 0;
1362 
1363   while ((ch = from[i++]) != ',')
1364     {
1365       *mem_addr_ptr = *mem_addr_ptr << 4;
1366       *mem_addr_ptr |= fromhex (ch) & 0x0f;
1367     }
1368 
1369   for (j = 0; j < 4; j++)
1370     {
1371       if ((ch = from[i++]) == 0)
1372 	break;
1373       *len_ptr = *len_ptr << 4;
1374       *len_ptr |= fromhex (ch) & 0x0f;
1375     }
1376 }
1377 
1378 void
decode_M_packet(char * from,CORE_ADDR * mem_addr_ptr,unsigned int * len_ptr,unsigned char ** to_p)1379 decode_M_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr,
1380 		 unsigned char **to_p)
1381 {
1382   int i = 0;
1383   char ch;
1384   *mem_addr_ptr = *len_ptr = 0;
1385 
1386   while ((ch = from[i++]) != ',')
1387     {
1388       *mem_addr_ptr = *mem_addr_ptr << 4;
1389       *mem_addr_ptr |= fromhex (ch) & 0x0f;
1390     }
1391 
1392   while ((ch = from[i++]) != ':')
1393     {
1394       *len_ptr = *len_ptr << 4;
1395       *len_ptr |= fromhex (ch) & 0x0f;
1396     }
1397 
1398   if (*to_p == NULL)
1399     *to_p = xmalloc (*len_ptr);
1400 
1401   convert_ascii_to_int (&from[i++], *to_p, *len_ptr);
1402 }
1403 
1404 int
decode_X_packet(char * from,int packet_len,CORE_ADDR * mem_addr_ptr,unsigned int * len_ptr,unsigned char ** to_p)1405 decode_X_packet (char *from, int packet_len, CORE_ADDR *mem_addr_ptr,
1406 		 unsigned int *len_ptr, unsigned char **to_p)
1407 {
1408   int i = 0;
1409   char ch;
1410   *mem_addr_ptr = *len_ptr = 0;
1411 
1412   while ((ch = from[i++]) != ',')
1413     {
1414       *mem_addr_ptr = *mem_addr_ptr << 4;
1415       *mem_addr_ptr |= fromhex (ch) & 0x0f;
1416     }
1417 
1418   while ((ch = from[i++]) != ':')
1419     {
1420       *len_ptr = *len_ptr << 4;
1421       *len_ptr |= fromhex (ch) & 0x0f;
1422     }
1423 
1424   if (*to_p == NULL)
1425     *to_p = xmalloc (*len_ptr);
1426 
1427   if (remote_unescape_input ((const gdb_byte *) &from[i], packet_len - i,
1428 			     *to_p, *len_ptr) != *len_ptr)
1429     return -1;
1430 
1431   return 0;
1432 }
1433 
1434 /* Decode a qXfer write request.  */
1435 
1436 int
decode_xfer_write(char * buf,int packet_len,CORE_ADDR * offset,unsigned int * len,unsigned char * data)1437 decode_xfer_write (char *buf, int packet_len, CORE_ADDR *offset,
1438 		   unsigned int *len, unsigned char *data)
1439 {
1440   char ch;
1441   char *b = buf;
1442 
1443   /* Extract the offset.  */
1444   *offset = 0;
1445   while ((ch = *buf++) != ':')
1446     {
1447       *offset = *offset << 4;
1448       *offset |= fromhex (ch) & 0x0f;
1449     }
1450 
1451   /* Get encoded data.  */
1452   packet_len -= buf - b;
1453   *len = remote_unescape_input ((const gdb_byte *) buf, packet_len,
1454 				data, packet_len);
1455   return 0;
1456 }
1457 
1458 /* Decode the parameters of a qSearch:memory packet.  */
1459 
1460 int
decode_search_memory_packet(const char * buf,int packet_len,CORE_ADDR * start_addrp,CORE_ADDR * search_space_lenp,gdb_byte * pattern,unsigned int * pattern_lenp)1461 decode_search_memory_packet (const char *buf, int packet_len,
1462 			     CORE_ADDR *start_addrp,
1463 			     CORE_ADDR *search_space_lenp,
1464 			     gdb_byte *pattern, unsigned int *pattern_lenp)
1465 {
1466   const char *p = buf;
1467 
1468   p = decode_address_to_semicolon (start_addrp, p);
1469   p = decode_address_to_semicolon (search_space_lenp, p);
1470   packet_len -= p - buf;
1471   *pattern_lenp = remote_unescape_input ((const gdb_byte *) p, packet_len,
1472 					 pattern, packet_len);
1473   return 0;
1474 }
1475 
1476 static void
free_sym_cache(struct sym_cache * sym)1477 free_sym_cache (struct sym_cache *sym)
1478 {
1479   if (sym != NULL)
1480     {
1481       free (sym->name);
1482       free (sym);
1483     }
1484 }
1485 
1486 void
clear_symbol_cache(struct sym_cache ** symcache_p)1487 clear_symbol_cache (struct sym_cache **symcache_p)
1488 {
1489   struct sym_cache *sym, *next;
1490 
1491   /* Check the cache first.  */
1492   for (sym = *symcache_p; sym; sym = next)
1493     {
1494       next = sym->next;
1495       free_sym_cache (sym);
1496     }
1497 
1498   *symcache_p = NULL;
1499 }
1500 
1501 /* Get the address of NAME, and return it in ADDRP if found.  if
1502    MAY_ASK_GDB is false, assume symbol cache misses are failures.
1503    Returns 1 if the symbol is found, 0 if it is not, -1 on error.  */
1504 
1505 int
look_up_one_symbol(const char * name,CORE_ADDR * addrp,int may_ask_gdb)1506 look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb)
1507 {
1508   char own_buf[266], *p, *q;
1509   int len;
1510   struct sym_cache *sym;
1511   struct process_info *proc;
1512 
1513   proc = current_process ();
1514 
1515   /* Check the cache first.  */
1516   for (sym = proc->symbol_cache; sym; sym = sym->next)
1517     if (strcmp (name, sym->name) == 0)
1518       {
1519 	*addrp = sym->addr;
1520 	return 1;
1521       }
1522 
1523   /* It might not be an appropriate time to look up a symbol,
1524      e.g. while we're trying to fetch registers.  */
1525   if (!may_ask_gdb)
1526     return 0;
1527 
1528   /* Send the request.  */
1529   strcpy (own_buf, "qSymbol:");
1530   hexify (own_buf + strlen ("qSymbol:"), name, strlen (name));
1531   if (putpkt (own_buf) < 0)
1532     return -1;
1533 
1534   /* FIXME:  Eventually add buffer overflow checking (to getpkt?)  */
1535   len = getpkt (own_buf);
1536   if (len < 0)
1537     return -1;
1538 
1539   /* We ought to handle pretty much any packet at this point while we
1540      wait for the qSymbol "response".  That requires re-entering the
1541      main loop.  For now, this is an adequate approximation; allow
1542      GDB to read from memory while it figures out the address of the
1543      symbol.  */
1544   while (own_buf[0] == 'm')
1545     {
1546       CORE_ADDR mem_addr;
1547       unsigned char *mem_buf;
1548       unsigned int mem_len;
1549 
1550       decode_m_packet (&own_buf[1], &mem_addr, &mem_len);
1551       mem_buf = xmalloc (mem_len);
1552       if (read_inferior_memory (mem_addr, mem_buf, mem_len) == 0)
1553 	convert_int_to_ascii (mem_buf, own_buf, mem_len);
1554       else
1555 	write_enn (own_buf);
1556       free (mem_buf);
1557       if (putpkt (own_buf) < 0)
1558 	return -1;
1559       len = getpkt (own_buf);
1560       if (len < 0)
1561 	return -1;
1562     }
1563 
1564   if (strncmp (own_buf, "qSymbol:", strlen ("qSymbol:")) != 0)
1565     {
1566       warning ("Malformed response to qSymbol, ignoring: %s\n", own_buf);
1567       return -1;
1568     }
1569 
1570   p = own_buf + strlen ("qSymbol:");
1571   q = p;
1572   while (*q && *q != ':')
1573     q++;
1574 
1575   /* Make sure we found a value for the symbol.  */
1576   if (p == q || *q == '\0')
1577     return 0;
1578 
1579   decode_address (addrp, p, q - p);
1580 
1581   /* Save the symbol in our cache.  */
1582   sym = xmalloc (sizeof (*sym));
1583   sym->name = xstrdup (name);
1584   sym->addr = *addrp;
1585   sym->next = proc->symbol_cache;
1586   proc->symbol_cache = sym;
1587 
1588   return 1;
1589 }
1590 
1591 /* Relocate an instruction to execute at a different address.  OLDLOC
1592    is the address in the inferior memory where the instruction to
1593    relocate is currently at.  On input, TO points to the destination
1594    where we want the instruction to be copied (and possibly adjusted)
1595    to.  On output, it points to one past the end of the resulting
1596    instruction(s).  The effect of executing the instruction at TO
1597    shall be the same as if executing it at FROM.  For example, call
1598    instructions that implicitly push the return address on the stack
1599    should be adjusted to return to the instruction after OLDLOC;
1600    relative branches, and other PC-relative instructions need the
1601    offset adjusted; etc.  Returns 0 on success, -1 on failure.  */
1602 
1603 int
relocate_instruction(CORE_ADDR * to,CORE_ADDR oldloc)1604 relocate_instruction (CORE_ADDR *to, CORE_ADDR oldloc)
1605 {
1606   char own_buf[266];
1607   int len;
1608   ULONGEST written = 0;
1609 
1610   /* Send the request.  */
1611   strcpy (own_buf, "qRelocInsn:");
1612   sprintf (own_buf, "qRelocInsn:%s;%s", paddress (oldloc),
1613 	   paddress (*to));
1614   if (putpkt (own_buf) < 0)
1615     return -1;
1616 
1617   /* FIXME:  Eventually add buffer overflow checking (to getpkt?)  */
1618   len = getpkt (own_buf);
1619   if (len < 0)
1620     return -1;
1621 
1622   /* We ought to handle pretty much any packet at this point while we
1623      wait for the qRelocInsn "response".  That requires re-entering
1624      the main loop.  For now, this is an adequate approximation; allow
1625      GDB to access memory.  */
1626   while (own_buf[0] == 'm' || own_buf[0] == 'M' || own_buf[0] == 'X')
1627     {
1628       CORE_ADDR mem_addr;
1629       unsigned char *mem_buf = NULL;
1630       unsigned int mem_len;
1631 
1632       if (own_buf[0] == 'm')
1633 	{
1634 	  decode_m_packet (&own_buf[1], &mem_addr, &mem_len);
1635 	  mem_buf = xmalloc (mem_len);
1636 	  if (read_inferior_memory (mem_addr, mem_buf, mem_len) == 0)
1637 	    convert_int_to_ascii (mem_buf, own_buf, mem_len);
1638 	  else
1639 	    write_enn (own_buf);
1640 	}
1641       else if (own_buf[0] == 'X')
1642 	{
1643 	  if (decode_X_packet (&own_buf[1], len - 1, &mem_addr,
1644 			       &mem_len, &mem_buf) < 0
1645 	      || write_inferior_memory (mem_addr, mem_buf, mem_len) != 0)
1646 	    write_enn (own_buf);
1647 	  else
1648 	    write_ok (own_buf);
1649 	}
1650       else
1651 	{
1652 	  decode_M_packet (&own_buf[1], &mem_addr, &mem_len, &mem_buf);
1653 	  if (write_inferior_memory (mem_addr, mem_buf, mem_len) == 0)
1654 	    write_ok (own_buf);
1655 	  else
1656 	    write_enn (own_buf);
1657 	}
1658       free (mem_buf);
1659       if (putpkt (own_buf) < 0)
1660 	return -1;
1661       len = getpkt (own_buf);
1662       if (len < 0)
1663 	return -1;
1664     }
1665 
1666   if (own_buf[0] == 'E')
1667     {
1668       warning ("An error occurred while relocating an instruction: %s\n",
1669 	       own_buf);
1670       return -1;
1671     }
1672 
1673   if (strncmp (own_buf, "qRelocInsn:", strlen ("qRelocInsn:")) != 0)
1674     {
1675       warning ("Malformed response to qRelocInsn, ignoring: %s\n",
1676 	       own_buf);
1677       return -1;
1678     }
1679 
1680   unpack_varlen_hex (own_buf + strlen ("qRelocInsn:"), &written);
1681 
1682   *to += written;
1683   return 0;
1684 }
1685 
1686 void
monitor_output(const char * msg)1687 monitor_output (const char *msg)
1688 {
1689   char *buf = xmalloc (strlen (msg) * 2 + 2);
1690 
1691   buf[0] = 'O';
1692   hexify (buf + 1, msg, 0);
1693 
1694   putpkt (buf);
1695   free (buf);
1696 }
1697 
1698 /* Return a malloc allocated string with special characters from TEXT
1699    replaced by entity references.  */
1700 
1701 char *
xml_escape_text(const char * text)1702 xml_escape_text (const char *text)
1703 {
1704   char *result;
1705   int i, special;
1706 
1707   /* Compute the length of the result.  */
1708   for (i = 0, special = 0; text[i] != '\0'; i++)
1709     switch (text[i])
1710       {
1711       case '\'':
1712       case '\"':
1713 	special += 5;
1714 	break;
1715       case '&':
1716 	special += 4;
1717 	break;
1718       case '<':
1719       case '>':
1720 	special += 3;
1721 	break;
1722       default:
1723 	break;
1724       }
1725 
1726   /* Expand the result.  */
1727   result = xmalloc (i + special + 1);
1728   for (i = 0, special = 0; text[i] != '\0'; i++)
1729     switch (text[i])
1730       {
1731       case '\'':
1732 	strcpy (result + i + special, "&apos;");
1733 	special += 5;
1734 	break;
1735       case '\"':
1736 	strcpy (result + i + special, "&quot;");
1737 	special += 5;
1738 	break;
1739       case '&':
1740 	strcpy (result + i + special, "&amp;");
1741 	special += 4;
1742 	break;
1743       case '<':
1744 	strcpy (result + i + special, "&lt;");
1745 	special += 3;
1746 	break;
1747       case '>':
1748 	strcpy (result + i + special, "&gt;");
1749 	special += 3;
1750 	break;
1751       default:
1752 	result[i + special] = text[i];
1753 	break;
1754       }
1755   result[i + special] = '\0';
1756 
1757   return result;
1758 }
1759 
1760 void
buffer_grow(struct buffer * buffer,const char * data,size_t size)1761 buffer_grow (struct buffer *buffer, const char *data, size_t size)
1762 {
1763   char *new_buffer;
1764   size_t new_buffer_size;
1765 
1766   if (size == 0)
1767     return;
1768 
1769   new_buffer_size = buffer->buffer_size;
1770 
1771   if (new_buffer_size == 0)
1772     new_buffer_size = 1;
1773 
1774   while (buffer->used_size + size > new_buffer_size)
1775     new_buffer_size *= 2;
1776   new_buffer = realloc (buffer->buffer, new_buffer_size);
1777   if (!new_buffer)
1778     abort ();
1779   memcpy (new_buffer + buffer->used_size, data, size);
1780   buffer->buffer = new_buffer;
1781   buffer->buffer_size = new_buffer_size;
1782   buffer->used_size += size;
1783 }
1784 
1785 void
buffer_free(struct buffer * buffer)1786 buffer_free (struct buffer *buffer)
1787 {
1788   if (!buffer)
1789     return;
1790 
1791   free (buffer->buffer);
1792   buffer->buffer = NULL;
1793   buffer->buffer_size = 0;
1794   buffer->used_size = 0;
1795 }
1796 
1797 void
buffer_init(struct buffer * buffer)1798 buffer_init (struct buffer *buffer)
1799 {
1800   memset (buffer, 0, sizeof (*buffer));
1801 }
1802 
1803 char*
buffer_finish(struct buffer * buffer)1804 buffer_finish (struct buffer *buffer)
1805 {
1806   char *ret = buffer->buffer;
1807   buffer->buffer = NULL;
1808   buffer->buffer_size = 0;
1809   buffer->used_size = 0;
1810   return ret;
1811 }
1812 
1813 void
buffer_xml_printf(struct buffer * buffer,const char * format,...)1814 buffer_xml_printf (struct buffer *buffer, const char *format, ...)
1815 {
1816   va_list ap;
1817   const char *f;
1818   const char *prev;
1819   int percent = 0;
1820 
1821   va_start (ap, format);
1822 
1823   prev = format;
1824   for (f = format; *f; f++)
1825     {
1826       if (percent)
1827        {
1828 	 switch (*f)
1829 	   {
1830 	   case 's':
1831 	     {
1832 	       char *p;
1833 	       char *a = va_arg (ap, char *);
1834 	       buffer_grow (buffer, prev, f - prev - 1);
1835 	       p = xml_escape_text (a);
1836 	       buffer_grow_str (buffer, p);
1837 	       free (p);
1838 	       prev = f + 1;
1839 	     }
1840 	     break;
1841 	   case 'd':
1842 	     {
1843 	       int i = va_arg (ap, int);
1844 	       char b[sizeof ("4294967295")];
1845 
1846 	       buffer_grow (buffer, prev, f - prev - 1);
1847 	       sprintf (b, "%d", i);
1848 	       buffer_grow_str (buffer, b);
1849 	       prev = f + 1;
1850 	     }
1851 	   }
1852 	 percent = 0;
1853        }
1854       else if (*f == '%')
1855        percent = 1;
1856     }
1857 
1858   buffer_grow_str (buffer, prev);
1859   va_end (ap);
1860 }
1861 
1862 #endif
1863