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