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