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