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