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