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