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