Static tracepoints support, and UST integration.
[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,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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 int remote_desc = INVALID_DESCRIPTOR;
111 static int 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
128 gdb_connected (void)
129 {
130 return remote_desc != INVALID_DESCRIPTOR;
131 }
132
133 static void
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
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
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, (struct sockaddr *) &sockaddr, &len) < 0
332 || len < sizeof (sockaddr))
333 perror_with_name ("Can't determine port");
334 port = ntohs (sockaddr.sin_port);
335 }
336
337 fprintf (stderr, "Listening on port %d\n", port);
338 fflush (stderr);
339
340 /* Register the event loop handler. */
341 add_file_handler (listen_desc, handle_accept_event, NULL);
342
343 transport_is_reliable = 1;
344 }
345 }
346
347 void
348 remote_close (void)
349 {
350 delete_file_handler (remote_desc);
351
352 #ifdef USE_WIN32API
353 closesocket (remote_desc);
354 #else
355 close (remote_desc);
356 #endif
357 remote_desc = INVALID_DESCRIPTOR;
358
359 reset_readchar ();
360 }
361
362 /* Convert hex digit A to a number. */
363
364 static int
365 fromhex (int a)
366 {
367 if (a >= '0' && a <= '9')
368 return a - '0';
369 else if (a >= 'a' && a <= 'f')
370 return a - 'a' + 10;
371 else
372 error ("Reply contains invalid hex digit");
373 return 0;
374 }
375
376 #endif
377
378 static const char hexchars[] = "0123456789abcdef";
379
380 static int
381 ishex (int ch, int *val)
382 {
383 if ((ch >= 'a') && (ch <= 'f'))
384 {
385 *val = ch - 'a' + 10;
386 return 1;
387 }
388 if ((ch >= 'A') && (ch <= 'F'))
389 {
390 *val = ch - 'A' + 10;
391 return 1;
392 }
393 if ((ch >= '0') && (ch <= '9'))
394 {
395 *val = ch - '0';
396 return 1;
397 }
398 return 0;
399 }
400
401 #ifndef IN_PROCESS_AGENT
402
403 int
404 unhexify (char *bin, const char *hex, int count)
405 {
406 int i;
407
408 for (i = 0; i < count; i++)
409 {
410 if (hex[0] == 0 || hex[1] == 0)
411 {
412 /* Hex string is short, or of uneven length.
413 Return the count that has been converted so far. */
414 return i;
415 }
416 *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]);
417 hex += 2;
418 }
419 return i;
420 }
421
422 void
423 decode_address (CORE_ADDR *addrp, const char *start, int len)
424 {
425 CORE_ADDR addr;
426 char ch;
427 int i;
428
429 addr = 0;
430 for (i = 0; i < len; i++)
431 {
432 ch = start[i];
433 addr = addr << 4;
434 addr = addr | (fromhex (ch) & 0x0f);
435 }
436 *addrp = addr;
437 }
438
439 const char *
440 decode_address_to_semicolon (CORE_ADDR *addrp, const char *start)
441 {
442 const char *end;
443
444 end = start;
445 while (*end != '\0' && *end != ';')
446 end++;
447
448 decode_address (addrp, start, end - start);
449
450 if (*end == ';')
451 end++;
452 return end;
453 }
454
455 #endif
456
457 /* Convert number NIB to a hex digit. */
458
459 static int
460 tohex (int nib)
461 {
462 if (nib < 10)
463 return '0' + nib;
464 else
465 return 'a' + nib - 10;
466 }
467
468 #ifndef IN_PROCESS_AGENT
469
470 int
471 hexify (char *hex, const char *bin, int count)
472 {
473 int i;
474
475 /* May use a length, or a nul-terminated string as input. */
476 if (count == 0)
477 count = strlen (bin);
478
479 for (i = 0; i < count; i++)
480 {
481 *hex++ = tohex ((*bin >> 4) & 0xf);
482 *hex++ = tohex (*bin++ & 0xf);
483 }
484 *hex = 0;
485 return i;
486 }
487
488 /* Convert BUFFER, binary data at least LEN bytes long, into escaped
489 binary data in OUT_BUF. Set *OUT_LEN to the length of the data
490 encoded in OUT_BUF, and return the number of bytes in OUT_BUF
491 (which may be more than *OUT_LEN due to escape characters). The
492 total number of bytes in the output buffer will be at most
493 OUT_MAXLEN. */
494
495 int
496 remote_escape_output (const gdb_byte *buffer, int len,
497 gdb_byte *out_buf, int *out_len,
498 int out_maxlen)
499 {
500 int input_index, output_index;
501
502 output_index = 0;
503 for (input_index = 0; input_index < len; input_index++)
504 {
505 gdb_byte b = buffer[input_index];
506
507 if (b == '$' || b == '#' || b == '}' || b == '*')
508 {
509 /* These must be escaped. */
510 if (output_index + 2 > out_maxlen)
511 break;
512 out_buf[output_index++] = '}';
513 out_buf[output_index++] = b ^ 0x20;
514 }
515 else
516 {
517 if (output_index + 1 > out_maxlen)
518 break;
519 out_buf[output_index++] = b;
520 }
521 }
522
523 *out_len = input_index;
524 return output_index;
525 }
526
527 /* Convert BUFFER, escaped data LEN bytes long, into binary data
528 in OUT_BUF. Return the number of bytes written to OUT_BUF.
529 Raise an error if the total number of bytes exceeds OUT_MAXLEN.
530
531 This function reverses remote_escape_output. It allows more
532 escaped characters than that function does, in particular because
533 '*' must be escaped to avoid the run-length encoding processing
534 in reading packets. */
535
536 static int
537 remote_unescape_input (const gdb_byte *buffer, int len,
538 gdb_byte *out_buf, int out_maxlen)
539 {
540 int input_index, output_index;
541 int escaped;
542
543 output_index = 0;
544 escaped = 0;
545 for (input_index = 0; input_index < len; input_index++)
546 {
547 gdb_byte b = buffer[input_index];
548
549 if (output_index + 1 > out_maxlen)
550 error ("Received too much data from the target.");
551
552 if (escaped)
553 {
554 out_buf[output_index++] = b ^ 0x20;
555 escaped = 0;
556 }
557 else if (b == '}')
558 escaped = 1;
559 else
560 out_buf[output_index++] = b;
561 }
562
563 if (escaped)
564 error ("Unmatched escape character in target response.");
565
566 return output_index;
567 }
568
569 /* Look for a sequence of characters which can be run-length encoded.
570 If there are any, update *CSUM and *P. Otherwise, output the
571 single character. Return the number of characters consumed. */
572
573 static int
574 try_rle (char *buf, int remaining, unsigned char *csum, char **p)
575 {
576 int n;
577
578 /* Always output the character. */
579 *csum += buf[0];
580 *(*p)++ = buf[0];
581
582 /* Don't go past '~'. */
583 if (remaining > 97)
584 remaining = 97;
585
586 for (n = 1; n < remaining; n++)
587 if (buf[n] != buf[0])
588 break;
589
590 /* N is the index of the first character not the same as buf[0].
591 buf[0] is counted twice, so by decrementing N, we get the number
592 of characters the RLE sequence will replace. */
593 n--;
594
595 if (n < 3)
596 return 1;
597
598 /* Skip the frame characters. The manual says to skip '+' and '-'
599 also, but there's no reason to. Unfortunately these two unusable
600 characters double the encoded length of a four byte zero
601 value. */
602 while (n + 29 == '$' || n + 29 == '#')
603 n--;
604
605 *csum += '*';
606 *(*p)++ = '*';
607 *csum += n + 29;
608 *(*p)++ = n + 29;
609
610 return n + 1;
611 }
612
613 #endif
614
615 char *
616 unpack_varlen_hex (char *buff, /* packet to parse */
617 ULONGEST *result)
618 {
619 int nibble;
620 ULONGEST retval = 0;
621
622 while (ishex (*buff, &nibble))
623 {
624 buff++;
625 retval = retval << 4;
626 retval |= nibble & 0x0f;
627 }
628 *result = retval;
629 return buff;
630 }
631
632 #ifndef IN_PROCESS_AGENT
633
634 /* Write a PTID to BUF. Returns BUF+CHARACTERS_WRITTEN. */
635
636 char *
637 write_ptid (char *buf, ptid_t ptid)
638 {
639 int pid, tid;
640
641 if (multi_process)
642 {
643 pid = ptid_get_pid (ptid);
644 if (pid < 0)
645 buf += sprintf (buf, "p-%x.", -pid);
646 else
647 buf += sprintf (buf, "p%x.", pid);
648 }
649 tid = ptid_get_lwp (ptid);
650 if (tid < 0)
651 buf += sprintf (buf, "-%x", -tid);
652 else
653 buf += sprintf (buf, "%x", tid);
654
655 return buf;
656 }
657
658 ULONGEST
659 hex_or_minus_one (char *buf, char **obuf)
660 {
661 ULONGEST ret;
662
663 if (strncmp (buf, "-1", 2) == 0)
664 {
665 ret = (ULONGEST) -1;
666 buf += 2;
667 }
668 else
669 buf = unpack_varlen_hex (buf, &ret);
670
671 if (obuf)
672 *obuf = buf;
673
674 return ret;
675 }
676
677 /* Extract a PTID from BUF. If non-null, OBUF is set to the to one
678 passed the last parsed char. Returns null_ptid on error. */
679 ptid_t
680 read_ptid (char *buf, char **obuf)
681 {
682 char *p = buf;
683 char *pp;
684 ULONGEST pid = 0, tid = 0;
685
686 if (*p == 'p')
687 {
688 /* Multi-process ptid. */
689 pp = unpack_varlen_hex (p + 1, &pid);
690 if (*pp != '.')
691 error ("invalid remote ptid: %s\n", p);
692
693 p = pp + 1;
694
695 tid = hex_or_minus_one (p, &pp);
696
697 if (obuf)
698 *obuf = pp;
699 return ptid_build (pid, tid, 0);
700 }
701
702 /* No multi-process. Just a tid. */
703 tid = hex_or_minus_one (p, &pp);
704
705 /* Since the stub is not sending a process id, then default to
706 what's in the current inferior. */
707 pid = ptid_get_pid (((struct inferior_list_entry *) current_inferior)->id);
708
709 if (obuf)
710 *obuf = pp;
711 return ptid_build (pid, tid, 0);
712 }
713
714 /* Send a packet to the remote machine, with error checking.
715 The data of the packet is in BUF, and the length of the
716 packet is in CNT. Returns >= 0 on success, -1 otherwise. */
717
718 static int
719 putpkt_binary_1 (char *buf, int cnt, int is_notif)
720 {
721 int i;
722 unsigned char csum = 0;
723 char *buf2;
724 char *p;
725 int cc;
726
727 buf2 = xmalloc (PBUFSIZ);
728
729 /* Copy the packet into buffer BUF2, encapsulating it
730 and giving it a checksum. */
731
732 p = buf2;
733 if (is_notif)
734 *p++ = '%';
735 else
736 *p++ = '$';
737
738 for (i = 0; i < cnt;)
739 i += try_rle (buf + i, cnt - i, &csum, &p);
740
741 *p++ = '#';
742 *p++ = tohex ((csum >> 4) & 0xf);
743 *p++ = tohex (csum & 0xf);
744
745 *p = '\0';
746
747 /* Send it over and over until we get a positive ack. */
748
749 do
750 {
751 if (write (remote_desc, buf2, p - buf2) != p - buf2)
752 {
753 perror ("putpkt(write)");
754 free (buf2);
755 return -1;
756 }
757
758 if (noack_mode || is_notif)
759 {
760 /* Don't expect an ack then. */
761 if (remote_debug)
762 {
763 if (is_notif)
764 fprintf (stderr, "putpkt (\"%s\"); [notif]\n", buf2);
765 else
766 fprintf (stderr, "putpkt (\"%s\"); [noack mode]\n", buf2);
767 fflush (stderr);
768 }
769 break;
770 }
771
772 if (remote_debug)
773 {
774 fprintf (stderr, "putpkt (\"%s\"); [looking for ack]\n", buf2);
775 fflush (stderr);
776 }
777
778 cc = readchar ();
779
780 if (cc < 0)
781 {
782 free (buf2);
783 return -1;
784 }
785
786 if (remote_debug)
787 {
788 fprintf (stderr, "[received '%c' (0x%x)]\n", cc, cc);
789 fflush (stderr);
790 }
791
792 /* Check for an input interrupt while we're here. */
793 if (cc == '\003' && current_inferior != NULL)
794 (*the_target->request_interrupt) ();
795 }
796 while (cc != '+');
797
798 free (buf2);
799 return 1; /* Success! */
800 }
801
802 int
803 putpkt_binary (char *buf, int cnt)
804 {
805 return putpkt_binary_1 (buf, cnt, 0);
806 }
807
808 /* Send a packet to the remote machine, with error checking. The data
809 of the packet is in BUF, and the packet should be a NUL-terminated
810 string. Returns >= 0 on success, -1 otherwise. */
811
812 int
813 putpkt (char *buf)
814 {
815 return putpkt_binary (buf, strlen (buf));
816 }
817
818 int
819 putpkt_notif (char *buf)
820 {
821 return putpkt_binary_1 (buf, strlen (buf), 1);
822 }
823
824 /* Come here when we get an input interrupt from the remote side. This
825 interrupt should only be active while we are waiting for the child to do
826 something. Thus this assumes readchar:bufcnt is 0.
827 About the only thing that should come through is a ^C, which
828 will cause us to request child interruption. */
829
830 static void
831 input_interrupt (int unused)
832 {
833 fd_set readset;
834 struct timeval immediate = { 0, 0 };
835
836 /* Protect against spurious interrupts. This has been observed to
837 be a problem under NetBSD 1.4 and 1.5. */
838
839 FD_ZERO (&readset);
840 FD_SET (remote_desc, &readset);
841 if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0)
842 {
843 int cc;
844 char c = 0;
845
846 cc = read (remote_desc, &c, 1);
847
848 if (cc != 1 || c != '\003' || current_inferior == NULL)
849 {
850 fprintf (stderr, "input_interrupt, count = %d c = %d ('%c')\n",
851 cc, c, c);
852 return;
853 }
854
855 (*the_target->request_interrupt) ();
856 }
857 }
858
859 /* Check if the remote side sent us an interrupt request (^C). */
860 void
861 check_remote_input_interrupt_request (void)
862 {
863 /* This function may be called before establishing communications,
864 therefore we need to validate the remote descriptor. */
865
866 if (remote_desc == INVALID_DESCRIPTOR)
867 return;
868
869 input_interrupt (0);
870 }
871
872 /* Asynchronous I/O support. SIGIO must be enabled when waiting, in order to
873 accept Control-C from the client, and must be disabled when talking to
874 the client. */
875
876 static void
877 unblock_async_io (void)
878 {
879 #ifndef USE_WIN32API
880 sigset_t sigio_set;
881
882 sigemptyset (&sigio_set);
883 sigaddset (&sigio_set, SIGIO);
884 sigprocmask (SIG_UNBLOCK, &sigio_set, NULL);
885 #endif
886 }
887
888 #ifdef __QNX__
889 static void
890 nto_comctrl (int enable)
891 {
892 struct sigevent event;
893
894 if (enable)
895 {
896 event.sigev_notify = SIGEV_SIGNAL_THREAD;
897 event.sigev_signo = SIGIO;
898 event.sigev_code = 0;
899 event.sigev_value.sival_ptr = NULL;
900 event.sigev_priority = -1;
901 ionotify (remote_desc, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_INPUT,
902 &event);
903 }
904 else
905 ionotify (remote_desc, _NOTIFY_ACTION_POLL, _NOTIFY_COND_INPUT, NULL);
906 }
907 #endif /* __QNX__ */
908
909
910 /* Current state of asynchronous I/O. */
911 static int async_io_enabled;
912
913 /* Enable asynchronous I/O. */
914 void
915 enable_async_io (void)
916 {
917 if (async_io_enabled)
918 return;
919
920 #ifndef USE_WIN32API
921 signal (SIGIO, input_interrupt);
922 #endif
923 async_io_enabled = 1;
924 #ifdef __QNX__
925 nto_comctrl (1);
926 #endif /* __QNX__ */
927 }
928
929 /* Disable asynchronous I/O. */
930 void
931 disable_async_io (void)
932 {
933 if (!async_io_enabled)
934 return;
935
936 #ifndef USE_WIN32API
937 signal (SIGIO, SIG_IGN);
938 #endif
939 async_io_enabled = 0;
940 #ifdef __QNX__
941 nto_comctrl (0);
942 #endif /* __QNX__ */
943
944 }
945
946 void
947 initialize_async_io (void)
948 {
949 /* Make sure that async I/O starts disabled. */
950 async_io_enabled = 1;
951 disable_async_io ();
952
953 /* Make sure the signal is unblocked. */
954 unblock_async_io ();
955 }
956
957 /* Internal buffer used by readchar.
958 These are global to readchar because reschedule_remote needs to be
959 able to tell whether the buffer is empty. */
960
961 static unsigned char readchar_buf[BUFSIZ];
962 static int readchar_bufcnt = 0;
963 static unsigned char *readchar_bufp;
964
965 /* Returns next char from remote GDB. -1 if error. */
966
967 static int
968 readchar (void)
969 {
970 int ch;
971
972 if (readchar_bufcnt == 0)
973 {
974 readchar_bufcnt = read (remote_desc, readchar_buf, sizeof (readchar_buf));
975
976 if (readchar_bufcnt <= 0)
977 {
978 if (readchar_bufcnt == 0)
979 fprintf (stderr, "readchar: Got EOF\n");
980 else
981 perror ("readchar");
982
983 return -1;
984 }
985
986 readchar_bufp = readchar_buf;
987 }
988
989 readchar_bufcnt--;
990 ch = *readchar_bufp++;
991 reschedule ();
992 return ch;
993 }
994
995 /* Reset the readchar state machine. */
996
997 static void
998 reset_readchar (void)
999 {
1000 readchar_bufcnt = 0;
1001 if (readchar_callback != NOT_SCHEDULED)
1002 {
1003 delete_callback_event (readchar_callback);
1004 readchar_callback = NOT_SCHEDULED;
1005 }
1006 }
1007
1008 /* Process remaining data in readchar_buf. */
1009
1010 static int
1011 process_remaining (void *context)
1012 {
1013 int res;
1014
1015 /* This is a one-shot event. */
1016 readchar_callback = NOT_SCHEDULED;
1017
1018 if (readchar_bufcnt > 0)
1019 res = handle_serial_event (0, NULL);
1020 else
1021 res = 0;
1022
1023 return res;
1024 }
1025
1026 /* If there is still data in the buffer, queue another event to process it,
1027 we can't sleep in select yet. */
1028
1029 static void
1030 reschedule (void)
1031 {
1032 if (readchar_bufcnt > 0 && readchar_callback == NOT_SCHEDULED)
1033 readchar_callback = append_callback_event (process_remaining, NULL);
1034 }
1035
1036 /* Read a packet from the remote machine, with error checking,
1037 and store it in BUF. Returns length of packet, or negative if error. */
1038
1039 int
1040 getpkt (char *buf)
1041 {
1042 char *bp;
1043 unsigned char csum, c1, c2;
1044 int c;
1045
1046 while (1)
1047 {
1048 csum = 0;
1049
1050 while (1)
1051 {
1052 c = readchar ();
1053 if (c == '$')
1054 break;
1055 if (remote_debug)
1056 {
1057 fprintf (stderr, "[getpkt: discarding char '%c']\n", c);
1058 fflush (stderr);
1059 }
1060
1061 if (c < 0)
1062 return -1;
1063 }
1064
1065 bp = buf;
1066 while (1)
1067 {
1068 c = readchar ();
1069 if (c < 0)
1070 return -1;
1071 if (c == '#')
1072 break;
1073 *bp++ = c;
1074 csum += c;
1075 }
1076 *bp = 0;
1077
1078 c1 = fromhex (readchar ());
1079 c2 = fromhex (readchar ());
1080
1081 if (csum == (c1 << 4) + c2)
1082 break;
1083
1084 if (noack_mode)
1085 {
1086 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s [no-ack-mode, Bad medium?]\n",
1087 (c1 << 4) + c2, csum, buf);
1088 /* Not much we can do, GDB wasn't expecting an ack/nac. */
1089 break;
1090 }
1091
1092 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
1093 (c1 << 4) + c2, csum, buf);
1094 write (remote_desc, "-", 1);
1095 }
1096
1097 if (!noack_mode)
1098 {
1099 if (remote_debug)
1100 {
1101 fprintf (stderr, "getpkt (\"%s\"); [sending ack] \n", buf);
1102 fflush (stderr);
1103 }
1104
1105 write (remote_desc, "+", 1);
1106
1107 if (remote_debug)
1108 {
1109 fprintf (stderr, "[sent ack]\n");
1110 fflush (stderr);
1111 }
1112 }
1113 else
1114 {
1115 if (remote_debug)
1116 {
1117 fprintf (stderr, "getpkt (\"%s\"); [no ack sent] \n", buf);
1118 fflush (stderr);
1119 }
1120 }
1121
1122 return bp - buf;
1123 }
1124
1125 void
1126 write_ok (char *buf)
1127 {
1128 buf[0] = 'O';
1129 buf[1] = 'K';
1130 buf[2] = '\0';
1131 }
1132
1133 void
1134 write_enn (char *buf)
1135 {
1136 /* Some day, we should define the meanings of the error codes... */
1137 buf[0] = 'E';
1138 buf[1] = '0';
1139 buf[2] = '1';
1140 buf[3] = '\0';
1141 }
1142
1143 #endif
1144
1145 void
1146 convert_int_to_ascii (const unsigned char *from, char *to, int n)
1147 {
1148 int nib;
1149 int ch;
1150 while (n--)
1151 {
1152 ch = *from++;
1153 nib = ((ch & 0xf0) >> 4) & 0x0f;
1154 *to++ = tohex (nib);
1155 nib = ch & 0x0f;
1156 *to++ = tohex (nib);
1157 }
1158 *to++ = 0;
1159 }
1160
1161 #ifndef IN_PROCESS_AGENT
1162
1163 void
1164 convert_ascii_to_int (const char *from, unsigned char *to, int n)
1165 {
1166 int nib1, nib2;
1167 while (n--)
1168 {
1169 nib1 = fromhex (*from++);
1170 nib2 = fromhex (*from++);
1171 *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f);
1172 }
1173 }
1174
1175 static char *
1176 outreg (struct regcache *regcache, int regno, char *buf)
1177 {
1178 if ((regno >> 12) != 0)
1179 *buf++ = tohex ((regno >> 12) & 0xf);
1180 if ((regno >> 8) != 0)
1181 *buf++ = tohex ((regno >> 8) & 0xf);
1182 *buf++ = tohex ((regno >> 4) & 0xf);
1183 *buf++ = tohex (regno & 0xf);
1184 *buf++ = ':';
1185 collect_register_as_string (regcache, regno, buf);
1186 buf += 2 * register_size (regno);
1187 *buf++ = ';';
1188
1189 return buf;
1190 }
1191
1192 void
1193 new_thread_notify (int id)
1194 {
1195 char own_buf[256];
1196
1197 /* The `n' response is not yet part of the remote protocol. Do nothing. */
1198 if (1)
1199 return;
1200
1201 if (server_waiting == 0)
1202 return;
1203
1204 sprintf (own_buf, "n%x", id);
1205 disable_async_io ();
1206 putpkt (own_buf);
1207 enable_async_io ();
1208 }
1209
1210 void
1211 dead_thread_notify (int id)
1212 {
1213 char own_buf[256];
1214
1215 /* The `x' response is not yet part of the remote protocol. Do nothing. */
1216 if (1)
1217 return;
1218
1219 sprintf (own_buf, "x%x", id);
1220 disable_async_io ();
1221 putpkt (own_buf);
1222 enable_async_io ();
1223 }
1224
1225 void
1226 prepare_resume_reply (char *buf, ptid_t ptid,
1227 struct target_waitstatus *status)
1228 {
1229 if (debug_threads)
1230 fprintf (stderr, "Writing resume reply for %s:%d\n\n",
1231 target_pid_to_str (ptid), status->kind);
1232
1233 switch (status->kind)
1234 {
1235 case TARGET_WAITKIND_STOPPED:
1236 {
1237 struct thread_info *saved_inferior;
1238 const char **regp;
1239 struct regcache *regcache;
1240
1241 sprintf (buf, "T%02x", status->value.sig);
1242 buf += strlen (buf);
1243
1244 regp = gdbserver_expedite_regs;
1245
1246 saved_inferior = current_inferior;
1247
1248 current_inferior = find_thread_ptid (ptid);
1249
1250 regcache = get_thread_regcache (current_inferior, 1);
1251
1252 if (the_target->stopped_by_watchpoint != NULL
1253 && (*the_target->stopped_by_watchpoint) ())
1254 {
1255 CORE_ADDR addr;
1256 int i;
1257
1258 strncpy (buf, "watch:", 6);
1259 buf += 6;
1260
1261 addr = (*the_target->stopped_data_address) ();
1262
1263 /* Convert each byte of the address into two hexadecimal
1264 chars. Note that we take sizeof (void *) instead of
1265 sizeof (addr); this is to avoid sending a 64-bit
1266 address to a 32-bit GDB. */
1267 for (i = sizeof (void *) * 2; i > 0; i--)
1268 *buf++ = tohex ((addr >> (i - 1) * 4) & 0xf);
1269 *buf++ = ';';
1270 }
1271
1272 while (*regp)
1273 {
1274 buf = outreg (regcache, find_regno (*regp), buf);
1275 regp ++;
1276 }
1277 *buf = '\0';
1278
1279 /* Formerly, if the debugger had not used any thread features
1280 we would not burden it with a thread status response. This
1281 was for the benefit of GDB 4.13 and older. However, in
1282 recent GDB versions the check (``if (cont_thread != 0)'')
1283 does not have the desired effect because of sillyness in
1284 the way that the remote protocol handles specifying a
1285 thread. Since thread support relies on qSymbol support
1286 anyway, assume GDB can handle threads. */
1287
1288 if (using_threads && !disable_packet_Tthread)
1289 {
1290 /* This if (1) ought to be unnecessary. But remote_wait
1291 in GDB will claim this event belongs to inferior_ptid
1292 if we do not specify a thread, and there's no way for
1293 gdbserver to know what inferior_ptid is. */
1294 if (1 || !ptid_equal (general_thread, ptid))
1295 {
1296 int core = -1;
1297 /* In non-stop, don't change the general thread behind
1298 GDB's back. */
1299 if (!non_stop)
1300 general_thread = ptid;
1301 sprintf (buf, "thread:");
1302 buf += strlen (buf);
1303 buf = write_ptid (buf, ptid);
1304 strcat (buf, ";");
1305 buf += strlen (buf);
1306
1307 if (the_target->core_of_thread)
1308 core = (*the_target->core_of_thread) (ptid);
1309 if (core != -1)
1310 {
1311 sprintf (buf, "core:");
1312 buf += strlen (buf);
1313 sprintf (buf, "%x", core);
1314 strcat (buf, ";");
1315 buf += strlen (buf);
1316 }
1317 }
1318 }
1319
1320 if (dlls_changed)
1321 {
1322 strcpy (buf, "library:;");
1323 buf += strlen (buf);
1324 dlls_changed = 0;
1325 }
1326
1327 current_inferior = saved_inferior;
1328 }
1329 break;
1330 case TARGET_WAITKIND_EXITED:
1331 if (multi_process)
1332 sprintf (buf, "W%x;process:%x",
1333 status->value.integer, ptid_get_pid (ptid));
1334 else
1335 sprintf (buf, "W%02x", status->value.integer);
1336 break;
1337 case TARGET_WAITKIND_SIGNALLED:
1338 if (multi_process)
1339 sprintf (buf, "X%x;process:%x",
1340 status->value.sig, ptid_get_pid (ptid));
1341 else
1342 sprintf (buf, "X%02x", status->value.sig);
1343 break;
1344 default:
1345 error ("unhandled waitkind");
1346 break;
1347 }
1348 }
1349
1350 void
1351 decode_m_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr)
1352 {
1353 int i = 0, j = 0;
1354 char ch;
1355 *mem_addr_ptr = *len_ptr = 0;
1356
1357 while ((ch = from[i++]) != ',')
1358 {
1359 *mem_addr_ptr = *mem_addr_ptr << 4;
1360 *mem_addr_ptr |= fromhex (ch) & 0x0f;
1361 }
1362
1363 for (j = 0; j < 4; j++)
1364 {
1365 if ((ch = from[i++]) == 0)
1366 break;
1367 *len_ptr = *len_ptr << 4;
1368 *len_ptr |= fromhex (ch) & 0x0f;
1369 }
1370 }
1371
1372 void
1373 decode_M_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr,
1374 unsigned char **to_p)
1375 {
1376 int i = 0;
1377 char ch;
1378 *mem_addr_ptr = *len_ptr = 0;
1379
1380 while ((ch = from[i++]) != ',')
1381 {
1382 *mem_addr_ptr = *mem_addr_ptr << 4;
1383 *mem_addr_ptr |= fromhex (ch) & 0x0f;
1384 }
1385
1386 while ((ch = from[i++]) != ':')
1387 {
1388 *len_ptr = *len_ptr << 4;
1389 *len_ptr |= fromhex (ch) & 0x0f;
1390 }
1391
1392 if (*to_p == NULL)
1393 *to_p = xmalloc (*len_ptr);
1394
1395 convert_ascii_to_int (&from[i++], *to_p, *len_ptr);
1396 }
1397
1398 int
1399 decode_X_packet (char *from, int packet_len, CORE_ADDR *mem_addr_ptr,
1400 unsigned int *len_ptr, unsigned char **to_p)
1401 {
1402 int i = 0;
1403 char ch;
1404 *mem_addr_ptr = *len_ptr = 0;
1405
1406 while ((ch = from[i++]) != ',')
1407 {
1408 *mem_addr_ptr = *mem_addr_ptr << 4;
1409 *mem_addr_ptr |= fromhex (ch) & 0x0f;
1410 }
1411
1412 while ((ch = from[i++]) != ':')
1413 {
1414 *len_ptr = *len_ptr << 4;
1415 *len_ptr |= fromhex (ch) & 0x0f;
1416 }
1417
1418 if (*to_p == NULL)
1419 *to_p = xmalloc (*len_ptr);
1420
1421 if (remote_unescape_input ((const gdb_byte *) &from[i], packet_len - i,
1422 *to_p, *len_ptr) != *len_ptr)
1423 return -1;
1424
1425 return 0;
1426 }
1427
1428 /* Decode a qXfer write request. */
1429 int
1430 decode_xfer_write (char *buf, int packet_len, char **annex, CORE_ADDR *offset,
1431 unsigned int *len, unsigned char *data)
1432 {
1433 char ch;
1434
1435 /* Extract and NUL-terminate the annex. */
1436 *annex = buf;
1437 while (*buf && *buf != ':')
1438 buf++;
1439 if (*buf == '\0')
1440 return -1;
1441 *buf++ = 0;
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 - *annex;
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
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
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
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
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
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
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 *
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
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
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
1798 buffer_init (struct buffer *buffer)
1799 {
1800 memset (buffer, 0, sizeof (*buffer));
1801 }
1802
1803 char*
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
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
This page took 0.069676 seconds and 4 git commands to generate.