import gdb-19990504 snapshot
[deliverable/binutils-gdb.git] / gdb / remote.c
CommitLineData
c906108c
SS
1/* Remote target communications for serial-line targets in custom GDB protocol
2 Copyright 1988, 91, 92, 93, 94, 95, 96, 97, 1998
3 Free Software Foundation, Inc.
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21/* Remote communication protocol.
22
23 A debug packet whose contents are <data>
24 is encapsulated for transmission in the form:
25
26 $ <data> # CSUM1 CSUM2
27
28 <data> must be ASCII alphanumeric and cannot include characters
29 '$' or '#'. If <data> starts with two characters followed by
30 ':', then the existing stubs interpret this as a sequence number.
31
32 CSUM1 and CSUM2 are ascii hex representation of an 8-bit
33 checksum of <data>, the most significant nibble is sent first.
34 the hex digits 0-9,a-f are used.
35
36 Receiver responds with:
37
38 + - if CSUM is correct and ready for next packet
39 - - if CSUM is incorrect
40
41 <data> is as follows:
42 Most values are encoded in ascii hex digits. Signal numbers are according
43 to the numbering in target.h.
44
45 Request Packet
46
47 set thread Hct... Set thread for subsequent operations.
48 c = 'c' for thread used in step and
49 continue; t... can be -1 for all
50 threads.
51 c = 'g' for thread used in other
52 operations. If zero, pick a thread,
53 any thread.
54 reply OK for success
55 ENN for an error.
56
57 read registers g
58 reply XX....X Each byte of register data
59 is described by two hex digits.
60 Registers are in the internal order
61 for GDB, and the bytes in a register
62 are in the same order the machine uses.
63 or ENN for an error.
64
65 write regs GXX..XX Each byte of register data
66 is described by two hex digits.
67 reply OK for success
68 ENN for an error
69
70 write reg Pn...=r... Write register n... with value r...,
71 which contains two hex digits for each
72 byte in the register (target byte
73 order).
74 reply OK for success
75 ENN for an error
76 (not supported by all stubs).
77
78 read mem mAA..AA,LLLL AA..AA is address, LLLL is length.
79 reply XX..XX XX..XX is mem contents
80 Can be fewer bytes than requested
81 if able to read only part of the data.
82 or ENN NN is errno
83
84 write mem MAA..AA,LLLL:XX..XX
85 AA..AA is address,
86 LLLL is number of bytes,
87 XX..XX is data
88 reply OK for success
89 ENN for an error (this includes the case
90 where only part of the data was
91 written).
92
93 write mem XAA..AA,LLLL:XX..XX
94 (binary) AA..AA is address,
95 LLLL is number of bytes,
96 XX..XX is binary data
97 reply OK for success
98 ENN for an error
99
100 continue cAA..AA AA..AA is address to resume
101 If AA..AA is omitted,
102 resume at same address.
103
104 step sAA..AA AA..AA is address to resume
105 If AA..AA is omitted,
106 resume at same address.
107
108 continue with Csig;AA..AA Continue with signal sig (hex signal
109 signal number). If ;AA..AA is omitted,
110 resume at same address.
111
112 step with Ssig;AA..AA Like 'C' but step not continue.
113 signal
114
115 last signal ? Reply the current reason for stopping.
116 This is the same reply as is generated
117 for step or cont : SAA where AA is the
118 signal number.
119
120 detach D Reply OK.
121
122 There is no immediate reply to step or cont.
123 The reply comes when the machine stops.
124 It is SAA AA is the signal number.
125
126 or... TAAn...:r...;n...:r...;n...:r...;
127 AA = signal number
128 n... = register number (hex)
129 r... = register contents
130 n... = `thread'
131 r... = thread process ID. This is
132 a hex integer.
133 n... = other string not starting
134 with valid hex digit.
135 gdb should ignore this n,r pair
136 and go on to the next. This way
137 we can extend the protocol.
138 or... WAA The process exited, and AA is
139 the exit status. This is only
140 applicable for certains sorts of
141 targets.
142 or... XAA The process terminated with signal
143 AA.
144 or... OXX..XX XX..XX is hex encoding of ASCII data. This
145 can happen at any time while the
146 program is running and the debugger
147 should continue to wait for
148 'W', 'T', etc.
149
150 thread alive TXX Find out if the thread XX is alive.
151 reply OK thread is still alive
152 ENN thread is dead
153
154 remote restart RXX Restart the remote server
155
156 extended ops ! Use the extended remote protocol.
157 Sticky -- only needs to be set once.
158
159 kill request k
160
161 toggle debug d toggle debug flag (see 386 & 68k stubs)
162 reset r reset -- see sparc stub.
163 reserved <other> On other requests, the stub should
164 ignore the request and send an empty
165 response ($#<checksum>). This way
166 we can extend the protocol and GDB
167 can tell whether the stub it is
168 talking to uses the old or the new.
169 search tAA:PP,MM Search backwards starting at address
170 AA for a match with pattern PP and
171 mask MM. PP and MM are 4 bytes.
172 Not supported by all stubs.
173
174 general query qXXXX Request info about XXXX.
175 general set QXXXX=yyyy Set value of XXXX to yyyy.
176 query sect offs qOffsets Get section offsets. Reply is
177 Text=xxx;Data=yyy;Bss=zzz
178
179 Responses can be run-length encoded to save space. A '*' means that
180 the next character is an ASCII encoding giving a repeat count which
181 stands for that many repititions of the character preceding the '*'.
182 The encoding is n+29, yielding a printable character where n >=3
183 (which is where rle starts to win). Don't use an n > 126.
184
185 So
186 "0* " means the same as "0000". */
187
188#include "defs.h"
189#include "gdb_string.h"
190#include <ctype.h>
191#include <fcntl.h>
192#include "frame.h"
193#include "inferior.h"
194#include "bfd.h"
195#include "symfile.h"
196#include "target.h"
197#include "wait.h"
198/*#include "terminal.h"*/
199#include "gdbcmd.h"
200#include "objfiles.h"
201#include "gdb-stabs.h"
202#include "gdbthread.h"
203
204#include "dcache.h"
205
7a292a7a 206#include <ctype.h>
c906108c
SS
207#ifdef USG
208#include <sys/types.h>
209#endif
210
211#include <signal.h>
212#include "serial.h"
213
214/* Prototypes for local functions */
215
216static int remote_write_bytes PARAMS ((CORE_ADDR memaddr,
217 char *myaddr, int len));
218
219static int remote_read_bytes PARAMS ((CORE_ADDR memaddr,
220 char *myaddr, int len));
221
222static void remote_files_info PARAMS ((struct target_ops *ignore));
223
224static int remote_xfer_memory PARAMS ((CORE_ADDR memaddr, char * myaddr,
225 int len, int should_write,
226 struct target_ops * target));
227
228static void remote_prepare_to_store PARAMS ((void));
229
230static void remote_fetch_registers PARAMS ((int regno));
231
232static void remote_resume PARAMS ((int pid, int step,
233 enum target_signal siggnal));
234
235static int remote_start_remote PARAMS ((PTR));
236
237static void remote_open PARAMS ((char *name, int from_tty));
238
239static void extended_remote_open PARAMS ((char *name, int from_tty));
240
241static void remote_open_1 PARAMS ((char *, int, struct target_ops *,
242 int extended_p));
243
244static void remote_close PARAMS ((int quitting));
245
246static void remote_store_registers PARAMS ((int regno));
247
248static void remote_mourn PARAMS ((void));
249
250static void extended_remote_restart PARAMS ((void));
251
252static void extended_remote_mourn PARAMS ((void));
253
254static void extended_remote_create_inferior PARAMS ((char *, char *, char **));
255
256static void remote_mourn_1 PARAMS ((struct target_ops *));
257
258static void remote_send PARAMS ((char *buf));
259
260static int readchar PARAMS ((int timeout));
261
262static int remote_wait PARAMS ((int pid, struct target_waitstatus * status));
263
264static void remote_kill PARAMS ((void));
265
266static int tohex PARAMS ((int nib));
267
268static void remote_detach PARAMS ((char *args, int from_tty));
269
270static void remote_interrupt PARAMS ((int signo));
271
7a292a7a
SS
272static void remote_interrupt_twice PARAMS ((int signo));
273
c906108c
SS
274static void interrupt_query PARAMS ((void));
275
276static void set_thread PARAMS ((int, int));
277
278static int remote_thread_alive PARAMS ((int));
279
280static void get_offsets PARAMS ((void));
281
282static int read_frame PARAMS ((char *));
283
284static int remote_insert_breakpoint PARAMS ((CORE_ADDR, char *));
285
286static int remote_remove_breakpoint PARAMS ((CORE_ADDR, char *));
287
288static int hexnumlen PARAMS ((ULONGEST num));
289
290static void init_remote_ops PARAMS ((void));
291
292static void init_extended_remote_ops PARAMS ((void));
293
294static void remote_stop PARAMS ((void));
295
296static int ishex PARAMS ((int ch, int *val));
297
298static int stubhex PARAMS ((int ch));
299
300static int remote_query PARAMS ((int/*char*/, char *, char *, int *));
301
302static int hexnumstr PARAMS ((char *, ULONGEST));
303
304static CORE_ADDR remote_address_masked PARAMS ((CORE_ADDR));
305
306static void print_packet PARAMS ((char *));
307
308static unsigned long crc32 PARAMS ((unsigned char *, int, unsigned int));
309
310static void compare_sections_command PARAMS ((char *, int));
311
312static void packet_command PARAMS ((char *, int));
313
314static int stub_unpack_int PARAMS ((char *buff, int fieldlength));
315
316char *unpack_varlen_hex PARAMS ((char *buff, int *result));
317
318static char *unpack_nibble PARAMS ((char *buf, int *val));
319
320static char *pack_nibble PARAMS ((char *buf, int nibble));
321
322static char *pack_hex_byte PARAMS ((char *pkt, int/*unsigned char*/ byte));
323
324static char *unpack_byte PARAMS ((char *buf, int *value));
325
326static char *pack_int PARAMS ((char *buf, int value));
327
328static char *unpack_int PARAMS ((char *buf, int *value));
329
330static char *unpack_string PARAMS ((char *src, char *dest, int length));
331
332static char *pack_threadid PARAMS ((char *pkt, threadref *id));
333
334static char *unpack_threadid PARAMS ((char *inbuf, threadref *id));
335
336void int_to_threadref PARAMS ((threadref *id, int value));
337
338static int threadref_to_int PARAMS ((threadref *ref));
339
340static void copy_threadref PARAMS ((threadref *dest, threadref *src));
341
342static int threadmatch PARAMS ((threadref *dest, threadref *src));
343
344static char *pack_threadinfo_request PARAMS ((char *pkt, int mode,
345 threadref *id));
346
347static int remote_unpack_thread_info_response PARAMS ((char *pkt,
348 threadref *expectedref,
349 struct gdb_ext_thread_info *info));
350
351
352static int remote_get_threadinfo PARAMS ((threadref *threadid,
353 int fieldset, /*TAG mask */
354 struct gdb_ext_thread_info *info));
355
356static int adapt_remote_get_threadinfo PARAMS ((gdb_threadref *ref,
357 int selection,
358 struct gdb_ext_thread_info *info));
359
360static char *pack_threadlist_request PARAMS ((char *pkt, int startflag,
361 int threadcount,
362 threadref *nextthread));
363
364static int parse_threadlist_response PARAMS ((char *pkt,
365 int result_limit,
366 threadref *original_echo,
367 threadref *resultlist,
368 int *doneflag));
369
370static int remote_get_threadlist PARAMS ((int startflag,
371 threadref *nextthread,
372 int result_limit,
373 int *done,
374 int *result_count,
375 threadref *threadlist));
376
377typedef int (*rmt_thread_action) (threadref *ref, void *context);
378
379static int remote_threadlist_iterator PARAMS ((rmt_thread_action stepfunction,
380 void *context, int looplimit));
381
382static int remote_newthread_step PARAMS ((threadref *ref, void *context));
383
384static int remote_current_thread PARAMS ((int oldpid));
385
386int remote_find_new_threads PARAMS ((void));
387
388static void record_currthread PARAMS ((int currthread));
389
390static void init_remote_threads PARAMS ((void));
391
392/* exported functions */
393
394extern int fromhex PARAMS ((int a));
395
396extern void getpkt PARAMS ((char *buf, int forever));
397
398extern int putpkt PARAMS ((char *buf));
399
400static int putpkt_binary PARAMS ((char *buf, int cnt));
401
402void remote_console_output PARAMS ((char *));
403
404static void check_binary_download PARAMS ((CORE_ADDR addr));
405
406/* Define the target subroutine names */
407
408void open_remote_target PARAMS ((char *, int, struct target_ops *, int));
409
410void _initialize_remote PARAMS ((void));
411
412/* */
413
414static struct target_ops remote_ops;
415
416static struct target_ops extended_remote_ops;
417
418static struct target_thread_vector remote_thread_vec;
419
420/* This was 5 seconds, which is a long time to sit and wait.
421 Unless this is going though some terminal server or multiplexer or
422 other form of hairy serial connection, I would think 2 seconds would
423 be plenty. */
424
425/* Changed to allow option to set timeout value.
426 was static int remote_timeout = 2; */
427extern int remote_timeout;
428
429/* This variable chooses whether to send a ^C or a break when the user
430 requests program interruption. Although ^C is usually what remote
431 systems expect, and that is the default here, sometimes a break is
432 preferable instead. */
433
434static int remote_break;
435
c906108c
SS
436/* Descriptor for I/O to remote machine. Initialize it to NULL so that
437 remote_open knows that we don't have a file open when the program
438 starts. */
439static serial_t remote_desc = NULL;
440
441/* This variable (available to the user via "set remotebinarydownload")
442 dictates whether downloads are sent in binary (via the 'X' packet).
443 We assume that the stub can, and attempt to do it. This will be cleared if
444 the stub does not understand it. This switch is still needed, though
445 in cases when the packet is supported in the stub, but the connection
446 does not allow it (i.e., 7-bit serial connection only). */
447static int remote_binary_download = 1;
448
449/* Have we already checked whether binary downloads work? */
450static int remote_binary_checked;
451
452/* Having this larger than 400 causes us to be incompatible with m68k-stub.c
453 and i386-stub.c. Normally, no one would notice because it only matters
454 for writing large chunks of memory (e.g. in downloads). Also, this needs
455 to be more than 400 if required to hold the registers (see below, where
456 we round it up based on REGISTER_BYTES). */
457#define PBUFSIZ 400
458
459/* Maximum number of bytes to read/write at once. The value here
460 is chosen to fill up a packet (the headers account for the 32). */
461#define MAXBUFBYTES ((PBUFSIZ-32)/2)
462
463/* Round up PBUFSIZ to hold all the registers, at least. */
464/* The blank line after the #if seems to be required to work around a
465 bug in HP's PA compiler. */
466#if REGISTER_BYTES > MAXBUFBYTES
467
468#undef PBUFSIZ
469#define PBUFSIZ (REGISTER_BYTES * 2 + 32)
470#endif
471
472
473/* This variable sets the number of bytes to be written to the target
474 in a single packet. Normally PBUFSIZ is satisfactory, but some
475 targets need smaller values (perhaps because the receiving end
476 is slow). */
477
478static int remote_write_size = PBUFSIZ;
479
480/* This variable sets the number of bits in an address that are to be
481 sent in a memory ("M" or "m") packet. Normally, after stripping
482 leading zeros, the entire address would be sent. This variable
483 restricts the address to REMOTE_ADDRESS_SIZE bits. HISTORY: The
484 initial implementation of remote.c restricted the address sent in
485 memory packets to ``host::sizeof long'' bytes - (typically 32
486 bits). Consequently, for 64 bit targets, the upper 32 bits of an
487 address was never sent. Since fixing this bug may cause a break in
488 some remote targets this variable is principly provided to
489 facilitate backward compatibility. */
490
491static int remote_address_size;
492
493/* This is the size (in chars) of the first response to the `g' command. This
494 is used to limit the size of the memory read and write commands to prevent
495 stub buffers from overflowing. The size does not include headers and
496 trailers, it is only the payload size. */
497
498static int remote_register_buf_size = 0;
499
500/* Should we try the 'P' request? If this is set to one when the stub
501 doesn't support 'P', the only consequence is some unnecessary traffic. */
502static int stub_supports_P = 1;
503
504/* These are pointers to hook functions that may be set in order to
505 modify resume/wait behavior for a particular architecture. */
506
507void (*target_resume_hook) PARAMS ((void));
508void (*target_wait_loop_hook) PARAMS ((void));
509
510\f
511
512/* These are the threads which we last sent to the remote system.
513 -1 for all or -2 for not sent yet. */
514static int general_thread;
515static int cont_thread;
516
517/* Call this function as a result of
518 1) A halt indication (T packet) containing a thread id
519 2) A direct query of currthread
520 3) Successful execution of set thread
521 */
522
523static void
524record_currthread (currthread)
525 int currthread;
526{
527#if 0 /* target_wait must not modify inferior_pid! */
528 inferior_pid = currthread;
529#endif
530 general_thread = currthread;
531#if 0 /* setting cont_thread has a different meaning
532 from having the target report its thread id. */
533 cont_thread = currthread;
534#endif
535 /* If this is a new thread, add it to GDB's thread list.
536 If we leave it up to WFI to do this, bad things will happen. */
537 if (!in_thread_list (currthread))
538 add_thread (currthread);
539}
540
541#define MAGIC_NULL_PID 42000
542
543static void
544set_thread (th, gen)
545 int th;
546 int gen;
547{
548 char buf[PBUFSIZ];
549 int state = gen ? general_thread : cont_thread;
550
551 if (state == th)
552 return;
553
554 buf[0] = 'H';
555 buf[1] = gen ? 'g' : 'c';
556 if (th == MAGIC_NULL_PID)
557 {
558 buf[2] = '0';
559 buf[3] = '\0';
560 }
561 else if (th < 0)
562 sprintf (&buf[2], "-%x", -th);
563 else
564 sprintf (&buf[2], "%x", th);
565 putpkt (buf);
566 getpkt (buf, 0);
567 if (gen)
568 general_thread = th;
569 else
570 cont_thread = th;
571}
572\f
573/* Return nonzero if the thread TH is still alive on the remote system. */
574
575static int
576remote_thread_alive (th)
577 int th;
578{
579 char buf[PBUFSIZ];
580
581 buf[0] = 'T';
582 if (th < 0)
583 sprintf (&buf[1], "-%08x", -th);
584 else
585 sprintf (&buf[1], "%08x", th);
586 putpkt (buf);
587 getpkt (buf, 0);
588 return (buf[0] == 'O' && buf[1] == 'K');
589}
590
591/* About these extended threadlist and threadinfo packets. They are
592 variable length packets but, the fields within them are often fixed
593 length. They are redundent enough to send over UDP as is the
594 remote protocol in general. There is a matching unit test module
595 in libstub. */
596
597#define BUF_THREAD_ID_SIZE (OPAQUETHREADBYTES*2)
598
599/* encode 64 bits in 16 chars of hex */
600
601static const char hexchars[] = "0123456789abcdef";
602
603static int
604ishex (ch, val)
605 int ch;
606 int *val;
607{
608 if ((ch >= 'a') && (ch <= 'f'))
609 {
610 *val = ch - 'a' + 10;
611 return 1;
612 }
613 if ((ch >= 'A') && (ch <= 'F'))
614 {
615 *val = ch - 'A' + 10;
616 return 1;
617 }
618 if ((ch >= '0') && (ch <= '9'))
619 {
620 *val = ch - '0';
621 return 1;
622 }
623 return 0;
624}
625
626static int
627stubhex (ch)
628 int ch;
629{
630 if (ch >= 'a' && ch <= 'f')
631 return ch - 'a' + 10;
632 if (ch >= '0' && ch <= '9')
633 return ch - '0';
634 if (ch >= 'A' && ch <= 'F')
635 return ch - 'A' + 10;
636 return -1;
637}
638
639static int
640stub_unpack_int (buff, fieldlength)
641 char *buff;
642 int fieldlength;
643{
644 int nibble;
645 int retval = 0;
646
647 while (fieldlength)
648 {
649 nibble = stubhex (*buff++);
650 retval |= nibble;
651 fieldlength--;
652 if (fieldlength)
653 retval = retval << 4;
654 }
655 return retval;
656}
657
658char *
659unpack_varlen_hex (buff, result)
660 char *buff; /* packet to parse */
661 int *result;
662{
663 int nibble;
664 int retval = 0;
665
666 while (ishex (*buff, &nibble))
667 {
668 buff++;
669 retval = retval << 4;
670 retval |= nibble & 0x0f;
671 }
672 *result = retval;
673 return buff;
674}
675
676static char *
677unpack_nibble (buf, val)
678 char *buf;
679 int *val;
680{
681 ishex (*buf++, val);
682 return buf;
683}
684
685static char *
686pack_nibble (buf, nibble)
687 char *buf;
688 int nibble;
689{
690 *buf++ = hexchars[(nibble & 0x0f)];
691 return buf;
692}
693
694static char *
695pack_hex_byte (pkt, byte)
696 char *pkt;
697 int byte;
698{
699 *pkt++ = hexchars[(byte >> 4) & 0xf];
700 *pkt++ = hexchars[(byte & 0xf)];
701 return pkt;
702}
703
704static char *
705unpack_byte (buf, value)
706 char *buf;
707 int *value;
708{
709 *value = stub_unpack_int (buf, 2);
710 return buf + 2;
711}
712
713static char *
714pack_int (buf, value)
715 char *buf;
716 int value;
717{
718 buf = pack_hex_byte (buf, (value >> 24) & 0xff);
719 buf = pack_hex_byte (buf, (value >> 16) & 0xff);
720 buf = pack_hex_byte (buf, (value >> 8) & 0x0ff);
721 buf = pack_hex_byte (buf, (value & 0xff));
722 return buf;
723}
724
725static char *
726unpack_int (buf, value)
727 char *buf;
728 int *value;
729{
730 *value = stub_unpack_int (buf, 8);
731 return buf + 8;
732}
733
734#if 0 /* currently unused, uncomment when needed */
735static char *pack_string PARAMS ((char *pkt, char *string));
736
737static char *
738pack_string (pkt, string)
739 char *pkt;
740 char *string;
741{
742 char ch;
743 int len;
744
745 len = strlen (string);
746 if (len > 200)
747 len = 200; /* Bigger than most GDB packets, junk??? */
748 pkt = pack_hex_byte (pkt, len);
749 while (len-- > 0)
750 {
751 ch = *string++;
752 if ((ch == '\0') || (ch == '#'))
753 ch = '*'; /* Protect encapsulation */
754 *pkt++ = ch;
755 }
756 return pkt;
757}
758#endif /* 0 (unused) */
759
760static char *
761unpack_string (src, dest, length)
762 char *src;
763 char *dest;
764 int length;
765{
766 while (length--)
767 *dest++ = *src++;
768 *dest = '\0';
769 return src;
770}
771
772static char *
773pack_threadid (pkt, id)
774 char *pkt;
775 threadref *id;
776{
777 char *limit;
778 unsigned char *altid;
779
780 altid = (unsigned char *) id;
781 limit = pkt + BUF_THREAD_ID_SIZE;
782 while (pkt < limit)
783 pkt = pack_hex_byte (pkt, *altid++);
784 return pkt;
785}
786
787
788static char *
789unpack_threadid (inbuf, id)
790 char *inbuf;
791 threadref *id;
792{
793 char *altref;
794 char *limit = inbuf + BUF_THREAD_ID_SIZE;
795 int x, y;
796
797 altref = (char *) id;
798
799 while (inbuf < limit)
800 {
801 x = stubhex (*inbuf++);
802 y = stubhex (*inbuf++);
803 *altref++ = (x << 4) | y;
804 }
805 return inbuf;
806}
807
808/* Externally, threadrefs are 64 bits but internally, they are still
809 ints. This is due to a mismatch of specifications. We would like
810 to use 64bit thread references internally. This is an adapter
811 function. */
812
813void
814int_to_threadref (id, value)
815 threadref *id;
816 int value;
817{
818 unsigned char *scan;
819
820 scan = (unsigned char *) id;
821 {
822 int i = 4;
823 while (i--)
824 *scan++ = 0;
825 }
826 *scan++ = (value >> 24) & 0xff;
827 *scan++ = (value >> 16) & 0xff;
828 *scan++ = (value >> 8) & 0xff;
829 *scan++ = (value & 0xff);
830}
831
832static int
833threadref_to_int (ref)
834 threadref *ref;
835{
836 int i, value = 0;
837 unsigned char *scan;
838
839 scan = (char *) ref;
840 scan += 4;
841 i = 4;
842 while (i-- > 0)
843 value = (value << 8) | ((*scan++) & 0xff);
844 return value;
845}
846
847static void
848copy_threadref (dest, src)
849 threadref *dest;
850 threadref *src;
851{
852 int i;
853 unsigned char *csrc, *cdest;
854
855 csrc = (unsigned char *) src;
856 cdest = (unsigned char *) dest;
857 i = 8;
858 while (i--)
859 *cdest++ = *csrc++;
860}
861
862static int
863threadmatch (dest, src)
864 threadref *dest;
865 threadref *src;
866{
867 /* things are broken right now, so just assume we got a match */
868#if 0
869 unsigned char *srcp, *destp;
870 int i, result;
871 srcp = (char *) src;
872 destp = (char *) dest;
873
874 result = 1;
875 while (i-- > 0)
876 result &= (*srcp++ == *destp++) ? 1 : 0;
877 return result;
878#endif
879 return 1;
880}
881
882/*
883 threadid:1, # always request threadid
884 context_exists:2,
885 display:4,
886 unique_name:8,
887 more_display:16
888*/
889
890/* Encoding: 'Q':8,'P':8,mask:32,threadid:64 */
891
892static char *
893pack_threadinfo_request (pkt, mode, id)
894 char *pkt;
895 int mode;
896 threadref *id;
897{
898 *pkt++ = 'q'; /* Info Query */
899 *pkt++ = 'P'; /* process or thread info */
900 pkt = pack_int (pkt, mode); /* mode */
901 pkt = pack_threadid (pkt, id); /* threadid */
902 *pkt = '\0'; /* terminate */
903 return pkt;
904}
905
906/* These values tag the fields in a thread info response packet */
907/* Tagging the fields allows us to request specific fields and to
908 add more fields as time goes by */
909
910#define TAG_THREADID 1 /* Echo the thread identifier */
911#define TAG_EXISTS 2 /* Is this process defined enough to
912 fetch registers and its stack */
913#define TAG_DISPLAY 4 /* A short thing maybe to put on a window */
914#define TAG_THREADNAME 8 /* string, maps 1-to-1 with a thread is */
915#define TAG_MOREDISPLAY 16 /* Whatever the kernel wants to say about
916 the process*/
917
918static int
919remote_unpack_thread_info_response (pkt, expectedref, info)
920 char *pkt;
921 threadref *expectedref;
922 struct gdb_ext_thread_info *info;
923{
924 int mask, length;
925 unsigned int tag;
926 threadref ref;
927 char *limit = pkt + PBUFSIZ; /* plausable parsing limit */
928 int retval = 1;
929
930 /* info->threadid = 0; FIXME: implement zero_threadref */
931 info->active = 0;
932 info->display[0] = '\0';
933 info->shortname[0] = '\0';
934 info->more_display[0] = '\0';
935
936 /* Assume the characters indicating the packet type have been stripped */
937 pkt = unpack_int (pkt, &mask); /* arg mask */
938 pkt = unpack_threadid (pkt, &ref);
939
940 if (mask == 0)
941 warning ("Incomplete response to threadinfo request\n");
942 if (!threadmatch (&ref, expectedref))
943 { /* This is an answer to a different request */
944 warning ("ERROR RMT Thread info mismatch\n");
945 return 0;
946 }
947 copy_threadref (&info->threadid, &ref);
948
949 /* Loop on tagged fields , try to bail if somthing goes wrong */
950
951 while ((pkt < limit) && mask && *pkt) /* packets are terminated with nulls */
952 {
953 pkt = unpack_int (pkt, &tag); /* tag */
954 pkt = unpack_byte (pkt, &length); /* length */
955 if (!(tag & mask)) /* tags out of synch with mask */
956 {
957 warning ("ERROR RMT: threadinfo tag mismatch\n");
958 retval = 0;
959 break;
960 }
961 if (tag == TAG_THREADID)
962 {
963 if (length != 16)
964 {
965 warning ("ERROR RMT: length of threadid is not 16\n");
966 retval = 0;
967 break;
968 }
969 pkt = unpack_threadid (pkt, &ref);
970 mask = mask & ~TAG_THREADID;
971 continue;
972 }
973 if (tag == TAG_EXISTS)
974 {
975 info->active = stub_unpack_int (pkt, length);
976 pkt += length;
977 mask = mask & ~(TAG_EXISTS);
978 if (length > 8)
979 {
980 warning ("ERROR RMT: 'exists' length too long\n");
981 retval = 0;
982 break;
983 }
984 continue;
985 }
986 if (tag == TAG_THREADNAME)
987 {
988 pkt = unpack_string (pkt, &info->shortname[0], length);
989 mask = mask & ~TAG_THREADNAME;
990 continue;
991 }
992 if (tag == TAG_DISPLAY)
993 {
994 pkt = unpack_string (pkt, &info->display[0], length);
995 mask = mask & ~TAG_DISPLAY;
996 continue;
997 }
998 if (tag == TAG_MOREDISPLAY)
999 {
1000 pkt = unpack_string (pkt, &info->more_display[0], length);
1001 mask = mask & ~TAG_MOREDISPLAY;
1002 continue;
1003 }
1004 warning ("ERROR RMT: unknown thread info tag\n");
1005 break; /* Not a tag we know about */
1006 }
1007 return retval;
1008}
1009
1010static int
1011remote_get_threadinfo (threadid, fieldset, info)
1012 threadref *threadid;
1013 int fieldset; /* TAG mask */
1014 struct gdb_ext_thread_info *info;
1015{
1016 int result;
1017 char threadinfo_pkt[PBUFSIZ];
1018
1019 pack_threadinfo_request (threadinfo_pkt, fieldset, threadid);
1020 putpkt (threadinfo_pkt);
1021 getpkt (threadinfo_pkt, 0);
1022 result = remote_unpack_thread_info_response (threadinfo_pkt + 2, threadid,
1023 info);
1024 return result;
1025}
1026
1027/* Unfortunately, 61 bit thread-ids are bigger than the internal
1028 representation of a threadid. */
1029
1030static int
1031adapt_remote_get_threadinfo (ref, selection, info)
1032 gdb_threadref *ref;
1033 int selection;
1034 struct gdb_ext_thread_info *info;
1035{
1036 threadref lclref;
1037
1038 int_to_threadref (&lclref, *ref);
1039 return remote_get_threadinfo (&lclref, selection, info);
1040}
1041
1042/* Format: i'Q':8,i"L":8,initflag:8,batchsize:16,lastthreadid:32 */
1043
1044static char *
1045pack_threadlist_request (pkt, startflag, threadcount, nextthread)
1046 char *pkt;
1047 int startflag;
1048 int threadcount;
1049 threadref *nextthread;
1050{
1051 *pkt++ = 'q'; /* info query packet */
1052 *pkt++ = 'L'; /* Process LIST or threadLIST request */
1053 pkt = pack_nibble (pkt, startflag); /* initflag 1 bytes */
1054 pkt = pack_hex_byte (pkt, threadcount); /* threadcount 2 bytes */
1055 pkt = pack_threadid (pkt, nextthread); /* 64 bit thread identifier */
1056 *pkt = '\0';
1057 return pkt;
1058}
1059
1060/* Encoding: 'q':8,'M':8,count:16,done:8,argthreadid:64,(threadid:64)* */
1061
1062static int
1063parse_threadlist_response (pkt, result_limit, original_echo, resultlist,
1064 doneflag)
1065 char *pkt;
1066 int result_limit;
1067 threadref *original_echo;
1068 threadref *resultlist;
1069 int *doneflag;
1070{
1071 char *limit;
1072 int count, resultcount, done;
1073
1074 resultcount = 0;
1075 /* Assume the 'q' and 'M chars have been stripped. */
1076 limit = pkt + (PBUFSIZ - BUF_THREAD_ID_SIZE); /* done parse past here */
1077 pkt = unpack_byte (pkt, &count); /* count field */
1078 pkt = unpack_nibble (pkt, &done);
1079 /* The first threadid is the argument threadid. */
1080 pkt = unpack_threadid (pkt, original_echo); /* should match query packet */
1081 while ((count-- > 0) && (pkt < limit))
1082 {
1083 pkt = unpack_threadid (pkt, resultlist++);
1084 if (resultcount++ >= result_limit)
1085 break;
1086 }
1087 if (doneflag)
1088 *doneflag = done;
1089 return resultcount;
1090}
1091
1092static int
1093remote_get_threadlist (startflag, nextthread, result_limit,
1094 done, result_count, threadlist)
1095 int startflag;
1096 threadref *nextthread;
1097 int result_limit;
1098 int *done;
1099 int *result_count;
1100 threadref *threadlist;
1101
1102{
1103 static threadref echo_nextthread;
1104 char threadlist_packet[PBUFSIZ];
1105 char t_response[PBUFSIZ];
1106 int result = 1;
1107
1108 /* Trancate result limit to be smaller than the packet size */
1109 if ((((result_limit + 1) * BUF_THREAD_ID_SIZE) + 10) >= PBUFSIZ)
1110 result_limit = (PBUFSIZ / BUF_THREAD_ID_SIZE) - 2;
1111
1112 pack_threadlist_request (threadlist_packet,
1113 startflag, result_limit, nextthread);
1114 putpkt (threadlist_packet);
1115 getpkt (t_response, 0);
1116
1117 *result_count =
1118 parse_threadlist_response (t_response + 2, result_limit, &echo_nextthread,
1119 threadlist, done);
1120
1121 if (!threadmatch (&echo_nextthread, nextthread))
1122 {
1123 /* FIXME: This is a good reason to drop the packet */
1124 /* Possably, there is a duplicate response */
1125 /* Possabilities :
1126 retransmit immediatly - race conditions
1127 retransmit after timeout - yes
1128 exit
1129 wait for packet, then exit
1130 */
1131 warning ("HMM: threadlist did not echo arg thread, dropping it\n");
1132 return 0; /* I choose simply exiting */
1133 }
1134 if (*result_count <= 0)
1135 {
1136 if (*done != 1)
1137 {
1138 warning ("RMT ERROR : failed to get remote thread list\n");
1139 result = 0;
1140 }
1141 return result; /* break; */
1142 }
1143 if (*result_count > result_limit)
1144 {
1145 *result_count = 0;
1146 warning ("RMT ERROR: threadlist response longer than requested\n");
1147 return 0;
1148 }
1149 return result;
1150}
1151
1152/* This is the interface between remote and threads, remotes upper interface */
1153
1154/* remote_find_new_threads retrieves the thread list and for each
1155 thread in the list, looks up the thread in GDB's internal list,
1156 ading the thread if it does not already exist. This involves
1157 getting partial thread lists from the remote target so, polling the
1158 quit_flag is required. */
1159
1160
1161/* About this many threadisds fit in a packet. */
1162
1163#define MAXTHREADLISTRESULTS 32
1164
1165static int
1166remote_threadlist_iterator (stepfunction, context, looplimit)
1167 rmt_thread_action stepfunction;
1168 void *context;
1169 int looplimit;
1170{
1171 int done, i, result_count;
1172 int startflag = 1;
1173 int result = 1;
1174 int loopcount = 0;
1175 static threadref nextthread;
1176 static threadref resultthreadlist[MAXTHREADLISTRESULTS];
1177
1178 done = 0;
1179 while (!done)
1180 {
1181 if (loopcount++ > looplimit)
1182 {
1183 result = 0;
1184 warning ("Remote fetch threadlist -infinite loop-\n");
1185 break;
1186 }
1187 if (!remote_get_threadlist (startflag, &nextthread, MAXTHREADLISTRESULTS,
1188 &done, &result_count, resultthreadlist))
1189 {
1190 result = 0;
1191 break;
1192 }
1193 /* clear for later iterations */
1194 startflag = 0;
1195 /* Setup to resume next batch of thread references, set nextthread. */
1196 if (result_count >= 1)
1197 copy_threadref (&nextthread, &resultthreadlist[result_count - 1]);
1198 i = 0;
1199 while (result_count--)
1200 if (!(result = (*stepfunction) (&resultthreadlist[i++], context)))
1201 break;
1202 }
1203 return result;
1204}
1205
1206static int
1207remote_newthread_step (ref, context)
1208 threadref *ref;
1209 void *context;
1210{
1211 int pid;
1212
1213 pid = threadref_to_int (ref);
1214 if (!in_thread_list (pid))
1215 add_thread (pid);
1216 return 1; /* continue iterator */
1217}
1218
1219#define CRAZY_MAX_THREADS 1000
1220
1221static int
1222remote_current_thread (oldpid)
1223 int oldpid;
1224{
1225 char buf[PBUFSIZ];
1226
1227 putpkt ("qC");
1228 getpkt (buf, 0);
1229 if (buf[0] == 'Q' && buf[1] == 'C')
1230 return strtol (&buf[2], NULL, 16);
1231 else
1232 return oldpid;
1233}
1234
1235int
1236remote_find_new_threads ()
1237{
1238 int ret;
1239
1240 ret = remote_threadlist_iterator (remote_newthread_step, 0,
1241 CRAZY_MAX_THREADS);
1242 if (inferior_pid == MAGIC_NULL_PID) /* ack ack ack */
1243 inferior_pid = remote_current_thread (inferior_pid);
1244 return ret;
1245}
1246
1247/* Initialize the thread vector which is used by threads.c */
1248/* The thread stub is a package, it has an initializer */
1249
1250static void
1251init_remote_threads ()
1252{
1253 remote_thread_vec.find_new_threads = remote_find_new_threads;
1254 remote_thread_vec.get_thread_info = adapt_remote_get_threadinfo;
1255}
1256
1257\f
1258/* Restart the remote side; this is an extended protocol operation. */
1259
1260static void
1261extended_remote_restart ()
1262{
1263 char buf[PBUFSIZ];
1264
1265 /* Send the restart command; for reasons I don't understand the
1266 remote side really expects a number after the "R". */
1267 buf[0] = 'R';
1268 sprintf (&buf[1], "%x", 0);
1269 putpkt (buf);
1270
1271 /* Now query for status so this looks just like we restarted
1272 gdbserver from scratch. */
1273 putpkt ("?");
1274 getpkt (buf, 0);
1275}
1276\f
1277/* Clean up connection to a remote debugger. */
1278
1279/* ARGSUSED */
1280static void
1281remote_close (quitting)
1282 int quitting;
1283{
1284 if (remote_desc)
1285 SERIAL_CLOSE (remote_desc);
1286 remote_desc = NULL;
1287}
1288
1289/* Query the remote side for the text, data and bss offsets. */
1290
1291static void
1292get_offsets ()
1293{
1294 char buf[PBUFSIZ], *ptr;
1295 int lose;
1296 CORE_ADDR text_addr, data_addr, bss_addr;
1297 struct section_offsets *offs;
1298
1299 putpkt ("qOffsets");
1300
1301 getpkt (buf, 0);
1302
1303 if (buf[0] == '\000')
1304 return; /* Return silently. Stub doesn't support
1305 this command. */
1306 if (buf[0] == 'E')
1307 {
1308 warning ("Remote failure reply: %s", buf);
1309 return;
1310 }
1311
1312 /* Pick up each field in turn. This used to be done with scanf, but
1313 scanf will make trouble if CORE_ADDR size doesn't match
1314 conversion directives correctly. The following code will work
1315 with any size of CORE_ADDR. */
1316 text_addr = data_addr = bss_addr = 0;
1317 ptr = buf;
1318 lose = 0;
1319
1320 if (strncmp (ptr, "Text=", 5) == 0)
1321 {
1322 ptr += 5;
1323 /* Don't use strtol, could lose on big values. */
1324 while (*ptr && *ptr != ';')
1325 text_addr = (text_addr << 4) + fromhex (*ptr++);
1326 }
1327 else
1328 lose = 1;
1329
1330 if (!lose && strncmp (ptr, ";Data=", 6) == 0)
1331 {
1332 ptr += 6;
1333 while (*ptr && *ptr != ';')
1334 data_addr = (data_addr << 4) + fromhex (*ptr++);
1335 }
1336 else
1337 lose = 1;
1338
1339 if (!lose && strncmp (ptr, ";Bss=", 5) == 0)
1340 {
1341 ptr += 5;
1342 while (*ptr && *ptr != ';')
1343 bss_addr = (bss_addr << 4) + fromhex (*ptr++);
1344 }
1345 else
1346 lose = 1;
1347
1348 if (lose)
1349 error ("Malformed response to offset query, %s", buf);
1350
1351 if (symfile_objfile == NULL)
1352 return;
1353
1354 offs = (struct section_offsets *) alloca (sizeof (struct section_offsets)
1355 + symfile_objfile->num_sections
1356 * sizeof (offs->offsets));
1357 memcpy (offs, symfile_objfile->section_offsets,
1358 sizeof (struct section_offsets)
1359 + symfile_objfile->num_sections
1360 * sizeof (offs->offsets));
1361
1362 ANOFFSET (offs, SECT_OFF_TEXT) = text_addr;
1363
1364 /* This is a temporary kludge to force data and bss to use the same offsets
1365 because that's what nlmconv does now. The real solution requires changes
1366 to the stub and remote.c that I don't have time to do right now. */
1367
1368 ANOFFSET (offs, SECT_OFF_DATA) = data_addr;
1369 ANOFFSET (offs, SECT_OFF_BSS) = data_addr;
1370
1371 objfile_relocate (symfile_objfile, offs);
1372}
1373
1374/* Stub for catch_errors. */
1375
1376static int
1377remote_start_remote (dummy)
1378 PTR dummy;
1379{
1380 immediate_quit = 1; /* Allow user to interrupt it */
1381
1382 /* Ack any packet which the remote side has already sent. */
1383 SERIAL_WRITE (remote_desc, "+", 1);
1384
1385 /* Let the stub know that we want it to return the thread. */
1386 set_thread (-1, 0);
1387
1388 inferior_pid = remote_current_thread (inferior_pid);
1389
1390 get_offsets (); /* Get text, data & bss offsets */
1391
1392 putpkt ("?"); /* initiate a query from remote machine */
1393 immediate_quit = 0;
1394
1395 start_remote (); /* Initialize gdb process mechanisms */
1396 return 1;
1397}
1398
1399/* Open a connection to a remote debugger.
1400 NAME is the filename used for communication. */
1401
1402static void
1403remote_open (name, from_tty)
1404 char *name;
1405 int from_tty;
1406{
1407 remote_open_1 (name, from_tty, &remote_ops, 0);
1408}
1409
1410/* Open a connection to a remote debugger using the extended
1411 remote gdb protocol. NAME is the filename used for communication. */
1412
1413static void
1414extended_remote_open (name, from_tty)
1415 char *name;
1416 int from_tty;
1417{
1418 remote_open_1 (name, from_tty, &extended_remote_ops, 1/*extended_p*/);
1419}
1420
1421/* Generic code for opening a connection to a remote target. */
1422
1423static DCACHE *remote_dcache;
1424
1425static void
1426remote_open_1 (name, from_tty, target, extended_p)
1427 char *name;
1428 int from_tty;
1429 struct target_ops *target;
1430 int extended_p;
1431{
1432 if (name == 0)
1433 error ("To open a remote debug connection, you need to specify what\n\
1434serial device is attached to the remote system (e.g. /dev/ttya).");
1435
1436 target_preopen (from_tty);
1437
1438 unpush_target (target);
1439
1440 remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
1441
1442 remote_desc = SERIAL_OPEN (name);
1443 if (!remote_desc)
1444 perror_with_name (name);
1445
1446 if (baud_rate != -1)
1447 {
1448 if (SERIAL_SETBAUDRATE (remote_desc, baud_rate))
1449 {
1450 SERIAL_CLOSE (remote_desc);
1451 perror_with_name (name);
1452 }
1453 }
1454
1455
1456 SERIAL_RAW (remote_desc);
1457
1458 /* If there is something sitting in the buffer we might take it as a
1459 response to a command, which would be bad. */
1460 SERIAL_FLUSH_INPUT (remote_desc);
1461
1462 if (from_tty)
1463 {
1464 puts_filtered ("Remote debugging using ");
1465 puts_filtered (name);
1466 puts_filtered ("\n");
1467 }
1468 push_target (target); /* Switch to using remote target now */
1469
1470 /* The target vector does not have the thread functions in it yet,
1471 so we use this function to call back into the thread module and
1472 register the thread vector and its contained functions. */
1473 bind_target_thread_vector (&remote_thread_vec);
1474
1475 /* Start out by trying the 'P' request to set registers. We set
1476 this each time that we open a new target so that if the user
1477 switches from one stub to another, we can (if the target is
1478 closed and reopened) cope. */
1479 stub_supports_P = 1;
1480
1481 general_thread = -2;
1482 cont_thread = -2;
1483
1484 /* Force remote_write_bytes to check whether target supports
1485 binary downloading. */
1486 remote_binary_checked = 0;
1487
1488 /* Without this, some commands which require an active target (such
1489 as kill) won't work. This variable serves (at least) double duty
1490 as both the pid of the target process (if it has such), and as a
1491 flag indicating that a target is active. These functions should
1492 be split out into seperate variables, especially since GDB will
1493 someday have a notion of debugging several processes. */
1494
1495 inferior_pid = MAGIC_NULL_PID;
1496 /* Start the remote connection; if error (0), discard this target.
1497 In particular, if the user quits, be sure to discard it
1498 (we'd be in an inconsistent state otherwise). */
1499 if (!catch_errors (remote_start_remote, NULL,
1500 "Couldn't establish connection to remote target\n",
1501 RETURN_MASK_ALL))
1502 {
1503 pop_target ();
1504 return;
1505 }
1506
1507 if (extended_p)
1508 {
1509 /* tell the remote that we're using the extended protocol. */
1510 char buf[PBUFSIZ];
1511 putpkt ("!");
1512 getpkt (buf, 0);
1513 }
1514}
1515
1516/* This takes a program previously attached to and detaches it. After
1517 this is done, GDB can be used to debug some other program. We
1518 better not have left any breakpoints in the target program or it'll
1519 die when it hits one. */
1520
1521static void
1522remote_detach (args, from_tty)
1523 char *args;
1524 int from_tty;
1525{
1526 char buf[PBUFSIZ];
1527
1528 if (args)
1529 error ("Argument given to \"detach\" when remotely debugging.");
1530
1531 /* Tell the remote target to detach. */
1532 strcpy (buf, "D");
1533 remote_send (buf);
1534
1535 pop_target ();
1536 if (from_tty)
1537 puts_filtered ("Ending remote debugging.\n");
1538}
1539
1540/* Convert hex digit A to a number. */
1541
1542int
1543fromhex (a)
1544 int a;
1545{
1546 if (a >= '0' && a <= '9')
1547 return a - '0';
1548 else if (a >= 'a' && a <= 'f')
1549 return a - 'a' + 10;
1550 else if (a >= 'A' && a <= 'F')
1551 return a - 'A' + 10;
1552 else
1553 error ("Reply contains invalid hex digit %d", a);
1554}
1555
1556/* Convert number NIB to a hex digit. */
1557
1558static int
1559tohex (nib)
1560 int nib;
1561{
1562 if (nib < 10)
1563 return '0'+nib;
1564 else
1565 return 'a'+nib-10;
1566}
1567\f
1568/* Tell the remote machine to resume. */
1569
1570static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
1571
1572static int last_sent_step;
1573
1574static void
1575remote_resume (pid, step, siggnal)
1576 int pid, step;
1577 enum target_signal siggnal;
1578{
1579 char buf[PBUFSIZ];
1580
1581 if (pid == -1)
1582 set_thread (0, 0); /* run any thread */
1583 else
1584 set_thread (pid, 0); /* run this thread */
1585
1586 dcache_flush (remote_dcache);
1587
1588 last_sent_signal = siggnal;
1589 last_sent_step = step;
1590
1591 /* A hook for when we need to do something at the last moment before
1592 resumption. */
1593 if (target_resume_hook)
1594 (*target_resume_hook) ();
1595
1596 if (siggnal != TARGET_SIGNAL_0)
1597 {
1598 buf[0] = step ? 'S' : 'C';
1599 buf[1] = tohex (((int)siggnal >> 4) & 0xf);
1600 buf[2] = tohex ((int)siggnal & 0xf);
1601 buf[3] = '\0';
1602 }
1603 else
1604 strcpy (buf, step ? "s": "c");
1605
1606 putpkt (buf);
1607}
1608\f
1609/* Send ^C to target to halt it. Target will respond, and send us a
1610 packet. */
1611
1612static void (*ofunc) PARAMS ((int));
1613
7a292a7a
SS
1614/* The command line interface's stop routine. This function is installed
1615 as a signal handler for SIGINT. The first time a user requests a
1616 stop, we call remote_stop to send a break or ^C. If there is no
1617 response from the target (it didn't stop when the user requested it),
1618 we ask the user if he'd like to detach from the target. */
c906108c
SS
1619static void
1620remote_interrupt (signo)
1621 int signo;
1622{
7a292a7a
SS
1623 /* If this doesn't work, try more severe steps. */
1624 signal (signo, remote_interrupt_twice);
1625
1626 if (remote_debug)
1627 printf_unfiltered ("remote_interrupt called\n");
1628
1629 target_stop ();
1630}
1631
1632/* The user typed ^C twice. */
1633
1634static void
1635remote_interrupt_twice (signo)
1636 int signo;
1637{
1638 signal (signo, ofunc);
1639 interrupt_query ();
c906108c
SS
1640 signal (signo, remote_interrupt);
1641}
7a292a7a
SS
1642
1643/* This is the generic stop called via the target vector. When a target
1644 interrupt is requested, either by the command line or the GUI, we
1645 will eventually end up here. */
c906108c
SS
1646static void
1647remote_stop ()
1648{
7a292a7a
SS
1649 /* Send a break or a ^C, depending on user preference. */
1650 if (remote_debug)
1651 printf_unfiltered ("remote_stop called\n");
c906108c 1652
7a292a7a
SS
1653 if (remote_break)
1654 SERIAL_SEND_BREAK (remote_desc);
c906108c 1655 else
7a292a7a 1656 SERIAL_WRITE (remote_desc, "\003", 1);
c906108c
SS
1657}
1658
1659/* Ask the user what to do when an interrupt is received. */
1660
1661static void
1662interrupt_query ()
1663{
1664 target_terminal_ours ();
1665
1666 if (query ("Interrupted while waiting for the program.\n\
1667Give up (and stop debugging it)? "))
1668 {
1669 target_mourn_inferior ();
1670 return_to_top_level (RETURN_QUIT);
1671 }
1672
1673 target_terminal_inferior ();
1674}
1675
1676/* If nonzero, ignore the next kill. */
1677
1678int kill_kludge;
1679
1680void
1681remote_console_output (msg)
1682 char *msg;
1683{
1684 char *p;
1685
1686 for (p = msg; *p; p +=2)
1687 {
1688 char tb[2];
1689 char c = fromhex (p[0]) * 16 + fromhex (p[1]);
1690 tb[0] = c;
1691 tb[1] = 0;
1692 if (target_output_hook)
1693 target_output_hook (tb);
1694 else
1695 fputs_filtered (tb, gdb_stdout);
1696 }
1697}
1698
1699/* Wait until the remote machine stops, then return, storing status in
1700 STATUS just as `wait' would. Returns "pid" (though it's not clear
1701 what, if anything, that means in the case of this target). */
1702
1703static int
1704remote_wait (pid, status)
1705 int pid;
1706 struct target_waitstatus *status;
1707{
1708 unsigned char buf[PBUFSIZ];
1709 int thread_num = -1;
1710
1711 status->kind = TARGET_WAITKIND_EXITED;
1712 status->value.integer = 0;
1713
1714 while (1)
1715 {
1716 unsigned char *p;
1717
c906108c
SS
1718 ofunc = signal (SIGINT, remote_interrupt);
1719 getpkt ((char *) buf, 1);
1720 signal (SIGINT, ofunc);
1721
1722 /* This is a hook for when we need to do something (perhaps the
1723 collection of trace data) every time the target stops. */
1724 if (target_wait_loop_hook)
1725 (*target_wait_loop_hook) ();
1726
1727 switch (buf[0])
1728 {
1729 case 'E': /* Error of some sort */
1730 warning ("Remote failure reply: %s", buf);
1731 continue;
1732 case 'T': /* Status with PC, SP, FP, ... */
1733 {
1734 int i;
1735 long regno;
1736 char regs[MAX_REGISTER_RAW_SIZE];
1737
1738 /* Expedited reply, containing Signal, {regno, reg} repeat */
1739 /* format is: 'Tssn...:r...;n...:r...;n...:r...;#cc', where
1740 ss = signal number
1741 n... = register number
1742 r... = register contents
1743 */
1744 p = &buf[3]; /* after Txx */
1745
1746 while (*p)
1747 {
1748 unsigned char *p1;
1749 char *p_temp;
1750
1751 /* Read the register number */
1752 regno = strtol ((const char *) p, &p_temp, 16);
1753 p1 = (unsigned char *)p_temp;
1754
1755 if (p1 == p) /* No register number present here */
1756 {
1757 p1 = (unsigned char *) strchr ((const char *) p, ':');
1758 if (p1 == NULL)
1759 warning ("Malformed packet(a) (missing colon): %s\n\
1760Packet: '%s'\n",
1761 p, buf);
1762 if (strncmp ((const char *) p, "thread", p1 - p) == 0)
1763 {
1764 p_temp = unpack_varlen_hex (++p1, &thread_num);
1765 record_currthread (thread_num);
1766 p = (unsigned char *) p_temp;
1767 }
1768 }
1769 else
1770 {
1771 p = p1;
1772
1773 if (*p++ != ':')
1774 warning ("Malformed packet(b) (missing colon): %s\n\
1775Packet: '%s'\n",
1776 p, buf);
1777
1778 if (regno >= NUM_REGS)
1779 warning ("Remote sent bad register number %ld: %s\n\
1780Packet: '%s'\n",
1781 regno, p, buf);
1782
1783 for (i = 0; i < REGISTER_RAW_SIZE (regno); i++)
1784 {
1785 if (p[0] == 0 || p[1] == 0)
1786 warning ("Remote reply is too short: %s", buf);
1787 regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
1788 p += 2;
1789 }
1790 supply_register (regno, regs);
1791 }
1792
1793 if (*p++ != ';')
1794 {
1795 warning ("Remote register badly formatted: %s", buf);
1796 warning (" here: %s",p);
1797 }
1798 }
1799 }
1800 /* fall through */
1801 case 'S': /* Old style status, just signal only */
1802 status->kind = TARGET_WAITKIND_STOPPED;
1803 status->value.sig = (enum target_signal)
1804 (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
1805
1806 goto got_status;
1807 case 'W': /* Target exited */
1808 {
1809 /* The remote process exited. */
1810 status->kind = TARGET_WAITKIND_EXITED;
1811 status->value.integer = (fromhex (buf[1]) << 4) + fromhex (buf[2]);
1812 goto got_status;
1813 }
1814 case 'X':
1815 status->kind = TARGET_WAITKIND_SIGNALLED;
1816 status->value.sig = (enum target_signal)
1817 (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
1818 kill_kludge = 1;
1819
1820 goto got_status;
1821 case 'O': /* Console output */
1822 remote_console_output (buf + 1);
1823 continue;
1824 case '\0':
1825 if (last_sent_signal != TARGET_SIGNAL_0)
1826 {
1827 /* Zero length reply means that we tried 'S' or 'C' and
1828 the remote system doesn't support it. */
1829 target_terminal_ours_for_output ();
1830 printf_filtered
1831 ("Can't send signals to this remote system. %s not sent.\n",
1832 target_signal_to_name (last_sent_signal));
1833 last_sent_signal = TARGET_SIGNAL_0;
1834 target_terminal_inferior ();
1835
1836 strcpy ((char *) buf, last_sent_step ? "s" : "c");
1837 putpkt ((char *) buf);
1838 continue;
1839 }
1840 /* else fallthrough */
1841 default:
1842 warning ("Invalid remote reply: %s", buf);
1843 continue;
1844 }
1845 }
1846 got_status:
1847 if (thread_num != -1)
1848 {
1849 /* Initial thread value can only be acquired via wait, so deal with
1850 this marker which is used before the first thread value is
1851 acquired. */
1852 if (inferior_pid == MAGIC_NULL_PID)
1853 {
1854 inferior_pid = thread_num;
1855 if (!in_thread_list (inferior_pid))
1856 add_thread (inferior_pid);
1857 }
1858 return thread_num;
1859 }
1860 return inferior_pid;
1861}
1862
1863/* Number of bytes of registers this stub implements. */
1864
1865static int register_bytes_found;
1866
1867/* Read the remote registers into the block REGS. */
1868/* Currently we just read all the registers, so we don't use regno. */
1869
1870/* ARGSUSED */
1871static void
1872remote_fetch_registers (regno)
1873 int regno;
1874{
1875 char buf[PBUFSIZ];
1876 int i;
1877 char *p;
1878 char regs[REGISTER_BYTES];
1879
1880 set_thread (inferior_pid, 1);
1881
1882 sprintf (buf, "g");
1883 remote_send (buf);
1884
1885 if (remote_register_buf_size == 0)
1886 remote_register_buf_size = strlen (buf);
1887
1888 /* Unimplemented registers read as all bits zero. */
1889 memset (regs, 0, REGISTER_BYTES);
1890
1891 /* We can get out of synch in various cases. If the first character
1892 in the buffer is not a hex character, assume that has happened
1893 and try to fetch another packet to read. */
1894 while ((buf[0] < '0' || buf[0] > '9')
1895 && (buf[0] < 'a' || buf[0] > 'f')
1896 && buf[0] != 'x') /* New: unavailable register value */
1897 {
1898 if (remote_debug)
1899 printf_unfiltered ("Bad register packet; fetching a new packet\n");
1900 getpkt (buf, 0);
1901 }
1902
1903 /* Reply describes registers byte by byte, each byte encoded as two
1904 hex characters. Suck them all up, then supply them to the
1905 register cacheing/storage mechanism. */
1906
1907 p = buf;
1908 for (i = 0; i < REGISTER_BYTES; i++)
1909 {
1910 if (p[0] == 0)
1911 break;
1912 if (p[1] == 0)
1913 {
1914 warning ("Remote reply is of odd length: %s", buf);
1915 /* Don't change register_bytes_found in this case, and don't
1916 print a second warning. */
1917 goto supply_them;
1918 }
1919 if (p[0] == 'x' && p[1] == 'x')
1920 regs[i] = 0; /* 'x' */
1921 else
1922 regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
1923 p += 2;
1924 }
1925
1926 if (i != register_bytes_found)
1927 {
1928 register_bytes_found = i;
1929#ifdef REGISTER_BYTES_OK
1930 if (!REGISTER_BYTES_OK (i))
1931 warning ("Remote reply is too short: %s", buf);
1932#endif
1933 }
1934
1935 supply_them:
1936 for (i = 0; i < NUM_REGS; i++)
1937 {
1938 supply_register (i, &regs[REGISTER_BYTE(i)]);
1939 if (buf[REGISTER_BYTE(i) * 2] == 'x')
1940 register_valid[i] = -1; /* register value not available */
1941 }
1942}
1943
1944/* Prepare to store registers. Since we may send them all (using a
1945 'G' request), we have to read out the ones we don't want to change
1946 first. */
1947
1948static void
1949remote_prepare_to_store ()
1950{
1951 /* Make sure the entire registers array is valid. */
1952 read_register_bytes (0, (char *)NULL, REGISTER_BYTES);
1953}
1954
1955/* Store register REGNO, or all registers if REGNO == -1, from the contents
1956 of REGISTERS. FIXME: ignores errors. */
1957
1958static void
1959remote_store_registers (regno)
1960 int regno;
1961{
1962 char buf[PBUFSIZ];
1963 int i;
1964 char *p;
1965
1966 set_thread (inferior_pid, 1);
1967
1968 if (regno >= 0 && stub_supports_P)
1969 {
1970 /* Try storing a single register. */
1971 char *regp;
1972
1973 sprintf (buf, "P%x=", regno);
1974 p = buf + strlen (buf);
1975 regp = &registers[REGISTER_BYTE (regno)];
1976 for (i = 0; i < REGISTER_RAW_SIZE (regno); ++i)
1977 {
1978 *p++ = tohex ((regp[i] >> 4) & 0xf);
1979 *p++ = tohex (regp[i] & 0xf);
1980 }
1981 *p = '\0';
1982 remote_send (buf);
1983 if (buf[0] != '\0')
1984 {
1985 /* The stub understands the 'P' request. We are done. */
1986 return;
1987 }
1988
1989 /* The stub does not support the 'P' request. Use 'G' instead,
1990 and don't try using 'P' in the future (it will just waste our
1991 time). */
1992 stub_supports_P = 0;
1993 }
1994
1995 buf[0] = 'G';
1996
1997 /* Command describes registers byte by byte,
1998 each byte encoded as two hex characters. */
1999
2000 p = buf + 1;
2001 /* remote_prepare_to_store insures that register_bytes_found gets set. */
2002 for (i = 0; i < register_bytes_found; i++)
2003 {
2004 *p++ = tohex ((registers[i] >> 4) & 0xf);
2005 *p++ = tohex (registers[i] & 0xf);
2006 }
2007 *p = '\0';
2008
2009 remote_send (buf);
2010}
2011
2012/* Use of the data cache *used* to be disabled because it loses for looking
2013 at and changing hardware I/O ports and the like. Accepting `volatile'
2014 would perhaps be one way to fix it. Another idea would be to use the
2015 executable file for the text segment (for all SEC_CODE sections?
2016 For all SEC_READONLY sections?). This has problems if you want to
2017 actually see what the memory contains (e.g. self-modifying code,
2018 clobbered memory, user downloaded the wrong thing).
2019
2020 Because it speeds so much up, it's now enabled, if you're playing
2021 with registers you turn it of (set remotecache 0). */
2022
2023/* Read a word from remote address ADDR and return it.
2024 This goes through the data cache. */
2025
2026#if 0 /* unused? */
2027static int
2028remote_fetch_word (addr)
2029 CORE_ADDR addr;
2030{
2031 return dcache_fetch (remote_dcache, addr);
2032}
2033
2034/* Write a word WORD into remote address ADDR.
2035 This goes through the data cache. */
2036
2037static void
2038remote_store_word (addr, word)
2039 CORE_ADDR addr;
2040 int word;
2041{
2042 dcache_poke (remote_dcache, addr, word);
2043}
2044#endif /* 0 (unused?) */
2045
2046\f
2047
2048/* Return the number of hex digits in num. */
2049
2050static int
2051hexnumlen (num)
2052 ULONGEST num;
2053{
2054 int i;
2055
2056 for (i = 0; num != 0; i++)
2057 num >>= 4;
2058
2059 return max (i, 1);
2060}
2061
2062/* Set BUF to the hex digits representing NUM. */
2063
2064static int
2065hexnumstr (buf, num)
2066 char *buf;
2067 ULONGEST num;
2068{
2069 int i;
2070 int len = hexnumlen (num);
2071
2072 buf[len] = '\0';
2073
2074 for (i = len - 1; i >= 0; i--)
2075 {
2076 buf[i] = "0123456789abcdef" [(num & 0xf)];
2077 num >>= 4;
2078 }
2079
2080 return len;
2081}
2082
2083/* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */
2084
2085static CORE_ADDR
2086remote_address_masked (addr)
2087 CORE_ADDR addr;
2088{
2089 if (remote_address_size > 0
2090 && remote_address_size < (sizeof (ULONGEST) * 8))
2091 {
2092 /* Only create a mask when that mask can safely be constructed
2093 in a ULONGEST variable. */
2094 ULONGEST mask = 1;
2095 mask = (mask << remote_address_size) - 1;
2096 addr &= mask;
2097 }
2098 return addr;
2099}
2100
2101/* Determine whether the remote target supports binary downloading.
2102 This is accomplished by sending a no-op memory write of zero length
2103 to the target at the specified address. It does not suffice to send
2104 the whole packet, since many stubs strip the eighth bit and subsequently
7a292a7a
SS
2105 compute a wrong checksum, which causes real havoc with remote_write_bytes.
2106
2107 NOTE: This can still lose if the serial line is not eight-bit clean. In
2108 cases like this, the user should clear "remotebinarydownload". */
c906108c
SS
2109static void
2110check_binary_download (addr)
2111 CORE_ADDR addr;
2112{
2113 if (remote_binary_download && !remote_binary_checked)
2114 {
2115 char buf[PBUFSIZ], *p;
2116 remote_binary_checked = 1;
2117
2118 p = buf;
2119 *p++ = 'X';
2120 p += hexnumstr (p, (ULONGEST) addr);
2121 *p++ = ',';
2122 p += hexnumstr (p, (ULONGEST) 0);
2123 *p++ = ':';
2124 *p = '\0';
2125
2126 putpkt_binary (buf, (int) (p - buf));
2127 getpkt (buf, 0);
2128
2129 if (buf[0] == '\0')
2130 remote_binary_download = 0;
2131 }
2132
2133 if (remote_debug)
2134 {
2135 if (remote_binary_download)
2136 printf_unfiltered ("binary downloading suppported by target\n");
2137 else
2138 printf_unfiltered ("binary downloading NOT suppported by target\n");
2139 }
2140}
2141
2142/* Write memory data directly to the remote machine.
2143 This does not inform the data cache; the data cache uses this.
2144 MEMADDR is the address in the remote memory space.
2145 MYADDR is the address of the buffer in our space.
2146 LEN is the number of bytes.
2147
2148 Returns number of bytes transferred, or 0 for error. */
2149
2150static int
2151remote_write_bytes (memaddr, myaddr, len)
2152 CORE_ADDR memaddr;
2153 char *myaddr;
2154 int len;
2155{
2156 int max_buf_size; /* Max size of packet output buffer */
2157 int origlen;
2158
2159 /* Verify that the target can support a binary download */
2160 check_binary_download (memaddr);
2161
2162 /* Chop the transfer down if necessary */
2163
2164 max_buf_size = min (remote_write_size, PBUFSIZ);
2165 if (remote_register_buf_size != 0)
2166 max_buf_size = min (max_buf_size, remote_register_buf_size);
2167
7a292a7a 2168 /* Subtract header overhead from max payload size - $M<memaddr>,<len>:#nn */
c906108c
SS
2169 max_buf_size -= 2 + hexnumlen (memaddr + len - 1) + 1 + hexnumlen (len) + 4;
2170
2171 origlen = len;
2172 while (len > 0)
2173 {
2174 unsigned char buf[PBUFSIZ];
2175 unsigned char *p, *plen;
2176 int todo;
2177 int i;
2178
2179 /* construct "M"<memaddr>","<len>":" */
2180 /* sprintf (buf, "M%lx,%x:", (unsigned long) memaddr, todo); */
2181 memaddr = remote_address_masked (memaddr);
2182 p = buf;
2183 if (remote_binary_download)
2184 {
2185 *p++ = 'X';
2186 todo = min (len, max_buf_size);
2187 }
2188 else
2189 {
2190 *p++ = 'M';
2191 todo = min (len, max_buf_size / 2); /* num bytes that will fit */
2192 }
2193
2194 p += hexnumstr (p, (ULONGEST) memaddr);
2195 *p++ = ',';
2196
7a292a7a 2197 plen = p; /* remember where len field goes */
c906108c
SS
2198 p += hexnumstr (p, (ULONGEST) todo);
2199 *p++ = ':';
2200 *p = '\0';
2201
2202 /* We send target system values byte by byte, in increasing byte
2203 addresses, each byte encoded as two hex characters (or one
2204 binary character). */
2205 if (remote_binary_download)
2206 {
7a292a7a
SS
2207 int escaped = 0;
2208 for (i = 0;
c906108c 2209 (i < todo) && (i + escaped) < (max_buf_size - 2);
7a292a7a 2210 i++)
c906108c
SS
2211 {
2212 switch (myaddr[i] & 0xff)
2213 {
2214 case '$':
2215 case '#':
2216 case 0x7d:
2217 /* These must be escaped */
2218 escaped++;
2219 *p++ = 0x7d;
2220 *p++ = (myaddr[i] & 0xff) ^ 0x20;
2221 break;
2222 default:
2223 *p++ = myaddr[i] & 0xff;
2224 break;
2225 }
2226 }
2227
7a292a7a
SS
2228 if (i < todo)
2229 {
2230 /* Escape chars have filled up the buffer prematurely,
2231 and we have actually sent fewer bytes than planned.
2232 Fix-up the length field of the packet. */
c906108c
SS
2233
2234 /* FIXME: will fail if new len is a shorter string than
2235 old len. */
2236
7a292a7a
SS
2237 plen += hexnumstr (plen, (ULONGEST) i);
2238 *plen++ = ':';
2239 }
c906108c
SS
2240 }
2241 else
2242 {
2243 for (i = 0; i < todo; i++)
2244 {
2245 *p++ = tohex ((myaddr[i] >> 4) & 0xf);
2246 *p++ = tohex (myaddr[i] & 0xf);
2247 }
2248 *p = '\0';
2249 }
2250
2251 putpkt_binary (buf, (int) (p - buf));
2252 getpkt (buf, 0);
2253
2254 if (buf[0] == 'E')
2255 {
2256 /* There is no correspondance between what the remote protocol uses
2257 for errors and errno codes. We would like a cleaner way of
2258 representing errors (big enough to include errno codes, bfd_error
2259 codes, and others). But for now just return EIO. */
2260 errno = EIO;
2261 return 0;
2262 }
2263
2264 /* Increment by i, not by todo, in case escape chars
2265 caused us to send fewer bytes than we'd planned. */
2266 myaddr += i;
2267 memaddr += i;
2268 len -= i;
2269 }
2270 return origlen;
2271}
2272
2273/* Read memory data directly from the remote machine.
2274 This does not use the data cache; the data cache uses this.
2275 MEMADDR is the address in the remote memory space.
2276 MYADDR is the address of the buffer in our space.
2277 LEN is the number of bytes.
2278
2279 Returns number of bytes transferred, or 0 for error. */
2280
2281static int
2282remote_read_bytes (memaddr, myaddr, len)
2283 CORE_ADDR memaddr;
2284 char *myaddr;
2285 int len;
2286{
2287 int max_buf_size; /* Max size of packet output buffer */
2288 int origlen;
2289
2290 /* Chop the transfer down if necessary */
2291
2292 max_buf_size = min (remote_write_size, PBUFSIZ);
2293 if (remote_register_buf_size != 0)
2294 max_buf_size = min (max_buf_size, remote_register_buf_size);
2295
2296 origlen = len;
2297 while (len > 0)
2298 {
2299 char buf[PBUFSIZ];
2300 char *p;
2301 int todo;
2302 int i;
2303
2304 todo = min (len, max_buf_size / 2); /* num bytes that will fit */
2305
2306 /* construct "m"<memaddr>","<len>" */
2307 /* sprintf (buf, "m%lx,%x", (unsigned long) memaddr, todo); */
2308 memaddr = remote_address_masked (memaddr);
2309 p = buf;
2310 *p++ = 'm';
2311 p += hexnumstr (p, (ULONGEST) memaddr);
2312 *p++ = ',';
2313 p += hexnumstr (p, (ULONGEST) todo);
2314 *p = '\0';
2315
2316 putpkt (buf);
2317 getpkt (buf, 0);
2318
2319 if (buf[0] == 'E')
2320 {
2321 /* There is no correspondance between what the remote protocol uses
2322 for errors and errno codes. We would like a cleaner way of
2323 representing errors (big enough to include errno codes, bfd_error
2324 codes, and others). But for now just return EIO. */
2325 errno = EIO;
2326 return 0;
2327 }
2328
2329 /* Reply describes memory byte by byte,
2330 each byte encoded as two hex characters. */
2331
2332 p = buf;
2333 for (i = 0; i < todo; i++)
2334 {
2335 if (p[0] == 0 || p[1] == 0)
2336 /* Reply is short. This means that we were able to read
2337 only part of what we wanted to. */
2338 return i + (origlen - len);
2339 myaddr[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
2340 p += 2;
2341 }
2342 myaddr += todo;
2343 memaddr += todo;
2344 len -= todo;
2345 }
2346 return origlen;
2347}
2348\f
2349/* Read or write LEN bytes from inferior memory at MEMADDR,
2350 transferring to or from debugger address MYADDR. Write to inferior
2351 if SHOULD_WRITE is nonzero. Returns length of data written or
2352 read; 0 for error. */
2353
2354/* ARGSUSED */
2355static int
2356remote_xfer_memory (memaddr, myaddr, len, should_write, target)
2357 CORE_ADDR memaddr;
2358 char *myaddr;
2359 int len;
2360 int should_write;
2361 struct target_ops *target; /* ignored */
2362{
2363#ifdef REMOTE_TRANSLATE_XFER_ADDRESS
2364 CORE_ADDR targaddr;
2365 int targlen;
2366 REMOTE_TRANSLATE_XFER_ADDRESS (memaddr, len, targaddr, targlen);
2367 if (targlen == 0)
2368 return 0;
2369 memaddr = targaddr;
2370 len = targlen;
2371#endif
2372
2373 return dcache_xfer_memory (remote_dcache, memaddr, myaddr,
2374 len, should_write);
2375}
2376
2377
2378#if 0
2379/* Enable after 4.12. */
2380
2381void
2382remote_search (len, data, mask, startaddr, increment, lorange, hirange
2383 addr_found, data_found)
2384 int len;
2385 char *data;
2386 char *mask;
2387 CORE_ADDR startaddr;
2388 int increment;
2389 CORE_ADDR lorange;
2390 CORE_ADDR hirange;
2391 CORE_ADDR *addr_found;
2392 char *data_found;
2393{
2394 if (increment == -4 && len == 4)
2395 {
2396 long mask_long, data_long;
2397 long data_found_long;
2398 CORE_ADDR addr_we_found;
2399 char buf[PBUFSIZ];
2400 long returned_long[2];
2401 char *p;
2402
2403 mask_long = extract_unsigned_integer (mask, len);
2404 data_long = extract_unsigned_integer (data, len);
2405 sprintf (buf, "t%x:%x,%x", startaddr, data_long, mask_long);
2406 putpkt (buf);
2407 getpkt (buf, 0);
2408 if (buf[0] == '\0')
2409 {
2410 /* The stub doesn't support the 't' request. We might want to
2411 remember this fact, but on the other hand the stub could be
2412 switched on us. Maybe we should remember it only until
2413 the next "target remote". */
2414 generic_search (len, data, mask, startaddr, increment, lorange,
2415 hirange, addr_found, data_found);
2416 return;
2417 }
2418
2419 if (buf[0] == 'E')
2420 /* There is no correspondance between what the remote protocol uses
2421 for errors and errno codes. We would like a cleaner way of
2422 representing errors (big enough to include errno codes, bfd_error
2423 codes, and others). But for now just use EIO. */
2424 memory_error (EIO, startaddr);
2425 p = buf;
2426 addr_we_found = 0;
2427 while (*p != '\0' && *p != ',')
2428 addr_we_found = (addr_we_found << 4) + fromhex (*p++);
2429 if (*p == '\0')
2430 error ("Protocol error: short return for search");
2431
2432 data_found_long = 0;
2433 while (*p != '\0' && *p != ',')
2434 data_found_long = (data_found_long << 4) + fromhex (*p++);
2435 /* Ignore anything after this comma, for future extensions. */
2436
2437 if (addr_we_found < lorange || addr_we_found >= hirange)
2438 {
2439 *addr_found = 0;
2440 return;
2441 }
2442
2443 *addr_found = addr_we_found;
2444 *data_found = store_unsigned_integer (data_we_found, len);
2445 return;
2446 }
2447 generic_search (len, data, mask, startaddr, increment, lorange,
2448 hirange, addr_found, data_found);
2449}
2450#endif /* 0 */
2451\f
2452static void
2453remote_files_info (ignore)
2454 struct target_ops *ignore;
2455{
2456 puts_filtered ("Debugging a target over a serial line.\n");
2457}
2458\f
2459/* Stuff for dealing with the packets which are part of this protocol.
2460 See comment at top of file for details. */
2461
2462/* Read a single character from the remote end, masking it down to 7 bits. */
2463
2464static int
2465readchar (timeout)
2466 int timeout;
2467{
2468 int ch;
2469
2470 ch = SERIAL_READCHAR (remote_desc, timeout);
2471
2472 switch (ch)
2473 {
2474 case SERIAL_EOF:
2475 error ("Remote connection closed");
2476 case SERIAL_ERROR:
2477 perror_with_name ("Remote communication error");
2478 case SERIAL_TIMEOUT:
2479 return ch;
2480 default:
2481 return ch & 0x7f;
2482 }
2483}
2484
2485/* Send the command in BUF to the remote machine, and read the reply
2486 into BUF. Report an error if we get an error reply. */
2487
2488static void
2489remote_send (buf)
2490 char *buf;
2491{
2492 putpkt (buf);
2493 getpkt (buf, 0);
2494
2495 if (buf[0] == 'E')
2496 error ("Remote failure reply: %s", buf);
2497}
2498
2499/* Display a null-terminated packet on stdout, for debugging, using C
2500 string notation. */
2501
2502static void
2503print_packet (buf)
2504 char *buf;
2505{
2506 puts_filtered ("\"");
2507 while (*buf)
2508 gdb_printchar (*buf++, gdb_stdout, '"');
2509 puts_filtered ("\"");
2510}
2511
2512int
2513putpkt (buf)
2514 char *buf;
2515{
2516 return putpkt_binary (buf, strlen (buf));
2517}
2518
2519/* Send a packet to the remote machine, with error checking. The data
2520 of the packet is in BUF. The string in BUF can be at most PBUFSIZ - 5
2521 to account for the $, # and checksum, and for a possible /0 if we are
2522 debugging (remote_debug) and want to print the sent packet as a string */
2523
2524static int
2525putpkt_binary (buf, cnt)
2526 char *buf;
2527 int cnt;
2528{
2529 int i;
2530 unsigned char csum = 0;
2531 char buf2[PBUFSIZ];
2532 int ch;
2533 int tcount = 0;
2534 char *p;
2535
2536 /* Copy the packet into buffer BUF2, encapsulating it
2537 and giving it a checksum. */
2538
2539 if (cnt > (int) sizeof (buf2) - 5) /* Prosanity check */
2540 abort ();
2541
2542 p = buf2;
2543 *p++ = '$';
2544
2545 for (i = 0; i < cnt; i++)
2546 {
2547 csum += buf[i];
2548 *p++ = buf[i];
2549 }
2550 *p++ = '#';
2551 *p++ = tohex ((csum >> 4) & 0xf);
2552 *p++ = tohex (csum & 0xf);
2553
2554 /* Send it over and over until we get a positive ack. */
2555
2556 while (1)
2557 {
2558 int started_error_output = 0;
2559
2560 if (remote_debug)
2561 {
2562 *p = '\0';
2563 printf_unfiltered ("Sending packet: %s...", buf2);
2564 gdb_flush (gdb_stdout);
2565 }
2566 if (SERIAL_WRITE (remote_desc, buf2, p - buf2))
2567 perror_with_name ("putpkt: write failed");
2568
2569 /* read until either a timeout occurs (-2) or '+' is read */
2570 while (1)
2571 {
2572 ch = readchar (remote_timeout);
2573
2574 if (remote_debug)
2575 {
2576 switch (ch)
2577 {
2578 case '+':
2579 case SERIAL_TIMEOUT:
2580 case '$':
2581 if (started_error_output)
2582 {
2583 putchar_unfiltered ('\n');
2584 started_error_output = 0;
2585 }
2586 }
2587 }
2588
2589 switch (ch)
2590 {
2591 case '+':
2592 if (remote_debug)
2593 printf_unfiltered ("Ack\n");
2594 return 1;
2595 case SERIAL_TIMEOUT:
2596 tcount ++;
2597 if (tcount > 3)
2598 return 0;
2599 break; /* Retransmit buffer */
2600 case '$':
2601 {
2602 char junkbuf[PBUFSIZ];
2603
2604 /* It's probably an old response, and we're out of sync.
2605 Just gobble up the packet and ignore it. */
2606 getpkt (junkbuf, 0);
2607 continue; /* Now, go look for + */
2608 }
2609 default:
2610 if (remote_debug)
2611 {
2612 if (!started_error_output)
2613 {
2614 started_error_output = 1;
2615 printf_unfiltered ("putpkt: Junk: ");
2616 }
2617 putchar_unfiltered (ch & 0177);
2618 }
2619 continue;
2620 }
2621 break; /* Here to retransmit */
2622 }
2623
2624#if 0
2625 /* This is wrong. If doing a long backtrace, the user should be
2626 able to get out next time we call QUIT, without anything as
2627 violent as interrupt_query. If we want to provide a way out of
2628 here without getting to the next QUIT, it should be based on
2629 hitting ^C twice as in remote_wait. */
2630 if (quit_flag)
2631 {
2632 quit_flag = 0;
2633 interrupt_query ();
2634 }
2635#endif
2636 }
2637}
2638
2639/* Come here after finding the start of the frame. Collect the rest
2640 into BUF, verifying the checksum, length, and handling run-length
2641 compression. Returns 0 on any error, 1 on success. */
2642
2643static int
2644read_frame (buf)
2645 char *buf;
2646{
2647 unsigned char csum;
2648 char *bp;
2649 int c;
2650
2651 csum = 0;
2652 bp = buf;
2653
2654 while (1)
2655 {
2656 c = readchar (remote_timeout);
2657
2658 switch (c)
2659 {
2660 case SERIAL_TIMEOUT:
2661 if (remote_debug)
2662 puts_filtered ("Timeout in mid-packet, retrying\n");
2663 return 0;
2664 case '$':
2665 if (remote_debug)
2666 puts_filtered ("Saw new packet start in middle of old one\n");
2667 return 0; /* Start a new packet, count retries */
2668 case '#':
2669 {
2670 unsigned char pktcsum;
2671
2672 *bp = '\000';
2673
2674 pktcsum = fromhex (readchar (remote_timeout)) << 4;
2675 pktcsum |= fromhex (readchar (remote_timeout));
2676
2677 if (csum == pktcsum)
2678 return 1;
2679
2680 if (remote_debug)
2681 {
2682 printf_filtered ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=",
2683 pktcsum, csum);
2684 puts_filtered (buf);
2685 puts_filtered ("\n");
2686 }
2687 return 0;
2688 }
2689 case '*': /* Run length encoding */
2690 csum += c;
2691 c = readchar (remote_timeout);
2692 csum += c;
2693 c = c - ' ' + 3; /* Compute repeat count */
2694
2695
2696 if (c > 0 && c < 255 && bp + c - 1 < buf + PBUFSIZ - 1)
2697 {
2698 memset (bp, *(bp - 1), c);
2699 bp += c;
2700 continue;
2701 }
2702
2703 *bp = '\0';
2704 printf_filtered ("Repeat count %d too large for buffer: ", c);
2705 puts_filtered (buf);
2706 puts_filtered ("\n");
2707 return 0;
2708
2709 default:
2710 if (bp < buf + PBUFSIZ - 1)
2711 {
2712 *bp++ = c;
2713 csum += c;
2714 continue;
2715 }
2716
2717 *bp = '\0';
2718 puts_filtered ("Remote packet too long: ");
2719 puts_filtered (buf);
2720 puts_filtered ("\n");
2721
2722 return 0;
2723 }
2724 }
2725}
2726
2727/* Read a packet from the remote machine, with error checking, and
2728 store it in BUF. BUF is expected to be of size PBUFSIZ. If
2729 FOREVER, wait forever rather than timing out; this is used while
2730 the target is executing user code. */
2731
2732void
2733getpkt (buf, forever)
2734 char *buf;
2735 int forever;
2736{
2737 int c;
2738 int tries;
2739 int timeout;
2740 int val;
2741
2742 strcpy (buf,"timeout");
2743
2744 if (forever)
2745 {
c906108c 2746 timeout = watchdog > 0 ? watchdog : -1;
c906108c
SS
2747 }
2748
2749 else
2750 timeout = remote_timeout;
2751
2752#define MAX_TRIES 3
2753
2754 for (tries = 1; tries <= MAX_TRIES; tries++)
2755 {
2756 /* This can loop forever if the remote side sends us characters
2757 continuously, but if it pauses, we'll get a zero from readchar
2758 because of timeout. Then we'll count that as a retry. */
2759
2760 /* Note that we will only wait forever prior to the start of a packet.
2761 After that, we expect characters to arrive at a brisk pace. They
2762 should show up within remote_timeout intervals. */
2763
2764 do
2765 {
2766 c = readchar (timeout);
2767
2768 if (c == SERIAL_TIMEOUT)
2769 {
c906108c
SS
2770 if (forever) /* Watchdog went off. Kill the target. */
2771 {
2772 target_mourn_inferior ();
2773 error ("Watchdog has expired. Target detached.\n");
2774 }
c906108c
SS
2775 if (remote_debug)
2776 puts_filtered ("Timed out.\n");
2777 goto retry;
2778 }
2779 }
2780 while (c != '$');
2781
2782 /* We've found the start of a packet, now collect the data. */
2783
2784 val = read_frame (buf);
2785
2786 if (val == 1)
2787 {
2788 if (remote_debug)
2789 fprintf_unfiltered (gdb_stdout, "Packet received: %s\n", buf);
2790 SERIAL_WRITE (remote_desc, "+", 1);
2791 return;
2792 }
2793
2794 /* Try the whole thing again. */
2795 retry:
2796 SERIAL_WRITE (remote_desc, "-", 1);
2797 }
2798
2799 /* We have tried hard enough, and just can't receive the packet. Give up. */
2800
2801 printf_unfiltered ("Ignoring packet error, continuing...\n");
2802 SERIAL_WRITE (remote_desc, "+", 1);
2803}
2804\f
2805static void
2806remote_kill ()
2807{
2808 /* For some mysterious reason, wait_for_inferior calls kill instead of
2809 mourn after it gets TARGET_WAITKIND_SIGNALLED. Work around it. */
2810 if (kill_kludge)
2811 {
2812 kill_kludge = 0;
2813 target_mourn_inferior ();
2814 return;
2815 }
2816
2817 /* Use catch_errors so the user can quit from gdb even when we aren't on
2818 speaking terms with the remote system. */
7a292a7a 2819 catch_errors ((catch_errors_ftype*) putpkt, "k", "", RETURN_MASK_ERROR);
c906108c
SS
2820
2821 /* Don't wait for it to die. I'm not really sure it matters whether
2822 we do or not. For the existing stubs, kill is a noop. */
2823 target_mourn_inferior ();
2824}
2825
2826static void
2827remote_mourn ()
2828{
2829 remote_mourn_1 (&remote_ops);
2830}
2831
2832static void
2833extended_remote_mourn ()
2834{
2835 /* We do _not_ want to mourn the target like this; this will
2836 remove the extended remote target from the target stack,
2837 and the next time the user says "run" it'll fail.
2838
2839 FIXME: What is the right thing to do here? */
2840#if 0
2841 remote_mourn_1 (&extended_remote_ops);
2842#endif
2843}
2844
2845/* Worker function for remote_mourn. */
2846static void
2847remote_mourn_1 (target)
2848 struct target_ops *target;
2849{
2850 unpush_target (target);
2851 generic_mourn_inferior ();
2852}
2853
2854/* In the extended protocol we want to be able to do things like
2855 "run" and have them basically work as expected. So we need
2856 a special create_inferior function.
2857
2858 FIXME: One day add support for changing the exec file
2859 we're debugging, arguments and an environment. */
2860
2861static void
2862extended_remote_create_inferior (exec_file, args, env)
2863 char *exec_file;
2864 char *args;
2865 char **env;
2866{
2867 /* Rip out the breakpoints; we'll reinsert them after restarting
2868 the remote server. */
2869 remove_breakpoints ();
2870
2871 /* Now restart the remote server. */
2872 extended_remote_restart ();
2873
2874 /* Now put the breakpoints back in. This way we're safe if the
2875 restart function works via a unix fork on the remote side. */
2876 insert_breakpoints ();
2877
2878 /* Clean up from the last time we were running. */
2879 clear_proceed_status ();
2880
2881 /* Let the remote process run. */
2882 proceed (-1, TARGET_SIGNAL_0, 0);
2883}
2884
2885\f
2886/* On some machines, e.g. 68k, we may use a different breakpoint instruction
2887 than other targets; in those use REMOTE_BREAKPOINT instead of just
2888 BREAKPOINT. Also, bi-endian targets may define LITTLE_REMOTE_BREAKPOINT
2889 and BIG_REMOTE_BREAKPOINT. If none of these are defined, we just call
2890 the standard routines that are in mem-break.c. */
2891
2892/* FIXME, these ought to be done in a more dynamic fashion. For instance,
2893 the choice of breakpoint instruction affects target program design and
2894 vice versa, and by making it user-tweakable, the special code here
2895 goes away and we need fewer special GDB configurations. */
2896
2897#if defined (LITTLE_REMOTE_BREAKPOINT) && defined (BIG_REMOTE_BREAKPOINT) && !defined(REMOTE_BREAKPOINT)
2898#define REMOTE_BREAKPOINT
2899#endif
2900
2901#ifdef REMOTE_BREAKPOINT
2902
2903/* If the target isn't bi-endian, just pretend it is. */
2904#if !defined (LITTLE_REMOTE_BREAKPOINT) && !defined (BIG_REMOTE_BREAKPOINT)
2905#define LITTLE_REMOTE_BREAKPOINT REMOTE_BREAKPOINT
2906#define BIG_REMOTE_BREAKPOINT REMOTE_BREAKPOINT
2907#endif
2908
2909static unsigned char big_break_insn[] = BIG_REMOTE_BREAKPOINT;
2910static unsigned char little_break_insn[] = LITTLE_REMOTE_BREAKPOINT;
2911
2912#endif /* REMOTE_BREAKPOINT */
2913
2914/* Insert a breakpoint on targets that don't have any better breakpoint
2915 support. We read the contents of the target location and stash it,
2916 then overwrite it with a breakpoint instruction. ADDR is the target
2917 location in the target machine. CONTENTS_CACHE is a pointer to
2918 memory allocated for saving the target contents. It is guaranteed
2919 by the caller to be long enough to save sizeof BREAKPOINT bytes (this
2920 is accomplished via BREAKPOINT_MAX). */
2921
2922static int
2923remote_insert_breakpoint (addr, contents_cache)
2924 CORE_ADDR addr;
2925 char *contents_cache;
2926{
2927#ifdef REMOTE_BREAKPOINT
2928 int val;
2929
2930 val = target_read_memory (addr, contents_cache, sizeof big_break_insn);
2931
2932 if (val == 0)
2933 {
2934 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
2935 val = target_write_memory (addr, (char *) big_break_insn,
2936 sizeof big_break_insn);
2937 else
2938 val = target_write_memory (addr, (char *) little_break_insn,
2939 sizeof little_break_insn);
2940 }
2941
2942 return val;
2943#else
2944 return memory_insert_breakpoint (addr, contents_cache);
2945#endif /* REMOTE_BREAKPOINT */
2946}
2947
2948static int
2949remote_remove_breakpoint (addr, contents_cache)
2950 CORE_ADDR addr;
2951 char *contents_cache;
2952{
2953#ifdef REMOTE_BREAKPOINT
2954 return target_write_memory (addr, contents_cache, sizeof big_break_insn);
2955#else
2956 return memory_remove_breakpoint (addr, contents_cache);
2957#endif /* REMOTE_BREAKPOINT */
2958}
2959
2960/* Some targets are only capable of doing downloads, and afterwards
2961 they switch to the remote serial protocol. This function provides
2962 a clean way to get from the download target to the remote target.
2963 It's basically just a wrapper so that we don't have to expose any
2964 of the internal workings of remote.c.
2965
2966 Prior to calling this routine, you should shutdown the current
2967 target code, else you will get the "A program is being debugged
2968 already..." message. Usually a call to pop_target() suffices. */
2969
2970void
2971push_remote_target (name, from_tty)
2972 char *name;
2973 int from_tty;
2974{
2975 printf_filtered ("Switching to remote protocol\n");
2976 remote_open (name, from_tty);
2977}
2978
2979/* Other targets want to use the entire remote serial module but with
2980 certain remote_ops overridden. */
2981
2982void
2983open_remote_target (name, from_tty, target, extended_p)
2984 char *name;
2985 int from_tty;
2986 struct target_ops *target;
2987 int extended_p;
2988{
2989 printf_filtered ("Selecting the %sremote protocol\n",
2990 (extended_p ? "extended-" : ""));
2991 remote_open_1 (name, from_tty, target, extended_p);
2992}
2993
2994/* Table used by the crc32 function to calcuate the checksum. */
2995
2996static unsigned long crc32_table[256] = {0, 0};
2997
2998static unsigned long
2999crc32 (buf, len, crc)
3000 unsigned char *buf;
3001 int len;
3002 unsigned int crc;
3003{
3004 if (! crc32_table[1])
3005 {
3006 /* Initialize the CRC table and the decoding table. */
3007 int i, j;
3008 unsigned int c;
3009
3010 for (i = 0; i < 256; i++)
3011 {
3012 for (c = i << 24, j = 8; j > 0; --j)
3013 c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
3014 crc32_table[i] = c;
3015 }
3016 }
3017
3018 while (len--)
3019 {
3020 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
3021 buf++;
3022 }
3023 return crc;
3024}
3025
3026/* compare-sections command
3027
3028 With no arguments, compares each loadable section in the exec bfd
3029 with the same memory range on the target, and reports mismatches.
3030 Useful for verifying the image on the target against the exec file.
3031 Depends on the target understanding the new "qCRC:" request. */
3032
3033static void
3034compare_sections_command (args, from_tty)
3035 char *args;
3036 int from_tty;
3037{
3038 asection *s;
3039 unsigned long host_crc, target_crc;
3040 extern bfd *exec_bfd;
3041 struct cleanup *old_chain;
3042 char *tmp, *sectdata, *sectname, buf[PBUFSIZ];
3043 bfd_size_type size;
3044 bfd_vma lma;
3045 int matched = 0;
3046 int mismatched = 0;
3047
3048 if (!exec_bfd)
3049 error ("command cannot be used without an exec file");
3050 if (!current_target.to_shortname ||
3051 strcmp (current_target.to_shortname, "remote") != 0)
3052 error ("command can only be used with remote target");
3053
3054 for (s = exec_bfd->sections; s; s = s->next)
3055 {
3056 if (!(s->flags & SEC_LOAD))
3057 continue; /* skip non-loadable section */
3058
3059 size = bfd_get_section_size_before_reloc (s);
3060 if (size == 0)
3061 continue; /* skip zero-length section */
3062
3063 sectname = (char *) bfd_get_section_name (exec_bfd, s);
3064 if (args && strcmp (args, sectname) != 0)
3065 continue; /* not the section selected by user */
3066
3067 matched = 1; /* do this section */
3068 lma = s->lma;
3069 /* FIXME: assumes lma can fit into long */
3070 sprintf (buf, "qCRC:%lx,%lx", (long) lma, (long) size);
3071 putpkt (buf);
3072
3073 /* be clever; compute the host_crc before waiting for target reply */
3074 sectdata = xmalloc (size);
3075 old_chain = make_cleanup (free, sectdata);
3076 bfd_get_section_contents (exec_bfd, s, sectdata, 0, size);
3077 host_crc = crc32 ((unsigned char *) sectdata, size, 0xffffffff);
3078
3079 getpkt (buf, 0);
3080 if (buf[0] == 'E')
3081 error ("target memory fault, section %s, range 0x%08x -- 0x%08x",
3082 sectname, lma, lma + size);
3083 if (buf[0] != 'C')
3084 error ("remote target does not support this operation");
3085
3086 for (target_crc = 0, tmp = &buf[1]; *tmp; tmp++)
3087 target_crc = target_crc * 16 + fromhex (*tmp);
3088
3089 printf_filtered ("Section %s, range 0x%08x -- 0x%08x: ",
3090 sectname, lma, lma + size);
3091 if (host_crc == target_crc)
3092 printf_filtered ("matched.\n");
3093 else
3094 {
3095 printf_filtered ("MIS-MATCHED!\n");
3096 mismatched++;
3097 }
3098
3099 do_cleanups (old_chain);
3100 }
3101 if (mismatched > 0)
3102 warning ("One or more sections of the remote executable does not match\n\
3103the loaded file\n");
3104 if (args && !matched)
3105 printf_filtered ("No loaded section named '%s'.\n", args);
3106}
3107
3108static int
3109remote_query (query_type, buf, outbuf, bufsiz)
3110 int query_type;
3111 char *buf;
3112 char *outbuf;
3113 int *bufsiz;
3114{
3115 int i;
3116 char buf2[PBUFSIZ];
3117 char *p2 = &buf2[0];
3118 char *p = buf;
3119
3120 if (! bufsiz)
3121 error ("null pointer to remote bufer size specified");
3122
3123 /* minimum outbuf size is PBUFSIZE - if bufsiz is not large enough let
3124 the caller know and return what the minimum size is */
3125 /* Note: a zero bufsiz can be used to query the minimum buffer size */
3126 if ( *bufsiz < PBUFSIZ )
3127 {
3128 *bufsiz = PBUFSIZ;
3129 return -1;
3130 }
3131
3132 /* except for querying the minimum buffer size, target must be open */
3133 if (! remote_desc)
3134 error ("remote query is only available after target open");
3135
3136 /* we only take uppercase letters as query types, at least for now */
3137 if ( (query_type < 'A') || (query_type > 'Z') )
3138 error ("invalid remote query type");
3139
3140 if (! buf)
3141 error ("null remote query specified");
3142
3143 if (! outbuf)
3144 error ("remote query requires a buffer to receive data");
3145
3146 outbuf[0] = '\0';
3147
3148 *p2++ = 'q';
3149 *p2++ = query_type;
3150
3151 /* we used one buffer char for the remote protocol q command and another
3152 for the query type. As the remote protocol encapsulation uses 4 chars
3153 plus one extra in case we are debugging (remote_debug),
3154 we have PBUFZIZ - 7 left to pack the query string */
3155 i = 0;
3156 while ( buf[i] && (i < (PBUFSIZ - 8)) )
3157 {
3158 /* bad caller may have sent forbidden characters */
3159 if ( (!isprint(buf[i])) || (buf[i] == '$') || (buf[i] == '#') )
3160 error ("illegal characters in query string");
3161
3162 *p2++ = buf[i];
3163 i++;
3164 }
3165 *p2 = buf[i];
3166
3167 if ( buf[i] )
3168 error ("query larger than available buffer");
3169
3170 i = putpkt (buf2);
3171 if ( i < 0 ) return i;
3172
3173 getpkt (outbuf, 0);
3174
3175 return 0;
3176}
3177
3178static void
3179packet_command (args, from_tty)
3180 char *args;
3181 int from_tty;
3182{
3183 char buf[PBUFSIZ];
3184
3185 if (! remote_desc)
3186 error ("command can only be used with remote target");
3187
3188 if (! args)
3189 error ("remote-packet command requires packet text as argument");
3190
3191 puts_filtered ("sending: ");
3192 print_packet (args);
3193 puts_filtered ("\n");
3194 putpkt (args);
3195
3196 getpkt (buf, 0);
3197 puts_filtered ("received: ");
3198 print_packet (buf);
3199 puts_filtered ("\n");
3200}
3201
3202#if 0
3203/* --------- UNIT_TEST for THREAD oriented PACKETS ------------------------- */
3204
3205static void display_thread_info PARAMS ((struct gdb_ext_thread_info *info));
3206
3207static void threadset_test_cmd PARAMS ((char *cmd, int tty));
3208
3209static void threadalive_test PARAMS ((char *cmd, int tty));
3210
3211static void threadlist_test_cmd PARAMS ((char *cmd, int tty));
3212
3213int get_and_display_threadinfo PARAMS ((threadref *ref));
3214
3215static void threadinfo_test_cmd PARAMS ((char *cmd, int tty));
3216
3217static int thread_display_step PARAMS ((threadref *ref, void *context));
3218
3219static void threadlist_update_test_cmd PARAMS ((char *cmd, int tty));
3220
3221static void init_remote_threadtests PARAMS ((void));
3222
3223#define SAMPLE_THREAD 0x05060708 /* Truncated 64 bit threadid */
3224
3225static void
3226threadset_test_cmd (cmd, tty)
3227 char *cmd;
3228 int tty;
3229{
3230 int sample_thread = SAMPLE_THREAD;
3231
3232 printf_filtered ("Remote threadset test\n");
3233 set_thread (sample_thread, 1);
3234}
3235
3236
3237static void
3238threadalive_test (cmd, tty)
3239 char *cmd;
3240 int tty;
3241{
3242 int sample_thread = SAMPLE_THREAD;
3243
3244 if (remote_thread_alive (sample_thread))
3245 printf_filtered ("PASS: Thread alive test\n");
3246 else
3247 printf_filtered ("FAIL: Thread alive test\n");
3248}
3249
3250void output_threadid PARAMS ((char *title, threadref * ref));
3251
3252void
3253output_threadid (title, ref)
3254 char *title;
3255 threadref *ref;
3256{
3257 char hexid[20];
3258
3259 pack_threadid (&hexid[0], ref); /* Convert threead id into hex */
3260 hexid[16] = 0;
3261 printf_filtered ("%s %s\n", title, (&hexid[0]));
3262}
3263
3264static void
3265threadlist_test_cmd (cmd, tty)
3266 char *cmd;
3267 int tty;
3268{
3269 int startflag = 1;
3270 threadref nextthread;
3271 int done, result_count;
3272 threadref threadlist[3];
3273
3274 printf_filtered ("Remote Threadlist test\n");
3275 if (!remote_get_threadlist (startflag, &nextthread, 3, &done,
3276 &result_count, &threadlist[0]))
3277 printf_filtered ("FAIL: threadlist test\n");
3278 else
3279 {
3280 threadref *scan = threadlist;
3281 threadref *limit = scan + result_count;
3282
3283 while (scan < limit)
3284 output_threadid (" thread ", scan++);
3285 }
3286}
3287
3288void
3289display_thread_info (info)
3290 struct gdb_ext_thread_info *info;
3291{
3292 output_threadid ("Threadid: ", &info->threadid);
3293 printf_filtered ("Name: %s\n ", info->shortname);
3294 printf_filtered ("State: %s\n", info->display);
3295 printf_filtered ("other: %s\n\n", info->more_display);
3296}
3297
3298int
3299get_and_display_threadinfo (ref)
3300 threadref *ref;
3301{
3302 int result;
3303 int set;
3304 struct gdb_ext_thread_info threadinfo;
3305
3306 set = TAG_THREADID | TAG_EXISTS | TAG_THREADNAME
3307 | TAG_MOREDISPLAY | TAG_DISPLAY;
3308 if (0 != (result = remote_get_threadinfo (ref, set, &threadinfo)))
3309 display_thread_info (&threadinfo);
3310 return result;
3311}
3312
3313static void
3314threadinfo_test_cmd (cmd, tty)
3315 char *cmd;
3316 int tty;
3317{
3318 int athread = SAMPLE_THREAD;
3319 threadref thread;
3320 int set;
3321
3322 int_to_threadref (&thread, athread);
3323 printf_filtered ("Remote Threadinfo test\n");
3324 if (!get_and_display_threadinfo (&thread))
3325 printf_filtered ("FAIL cannot get thread info\n");
3326}
3327
3328static int
3329thread_display_step (ref, context)
3330 threadref *ref;
3331 void *context;
3332{
3333 /* output_threadid(" threadstep ",ref); *//* simple test */
3334 return get_and_display_threadinfo (ref);
3335}
3336
3337static void
3338threadlist_update_test_cmd (cmd, tty)
3339 char *cmd;
3340 int tty;
3341{
3342 printf_filtered ("Remote Threadlist update test\n");
3343 remote_threadlist_iterator (thread_display_step, 0, CRAZY_MAX_THREADS);
3344}
3345
3346static void
3347init_remote_threadtests (void)
3348{
3349 add_com ("tlist", class_obscure, threadlist_test_cmd,
3350 "Fetch and print the remote list of thread identifiers, one pkt only");
3351 add_com ("tinfo", class_obscure, threadinfo_test_cmd,
3352 "Fetch and display info about one thread");
3353 add_com ("tset", class_obscure, threadset_test_cmd,
3354 "Test setting to a different thread");
3355 add_com ("tupd", class_obscure, threadlist_update_test_cmd,
3356 "Iterate through updating all remote thread info");
3357 add_com ("talive", class_obscure, threadalive_test,
3358 " Remote thread alive test ");
3359}
3360
3361#endif /* 0 */
3362
3363static void
3364init_remote_ops ()
3365{
3366 remote_ops.to_shortname = "remote";
3367 remote_ops.to_longname = "Remote serial target in gdb-specific protocol";
3368 remote_ops.to_doc =
3369 "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
3370Specify the serial device it is connected to (e.g. /dev/ttya).";
3371 remote_ops.to_open = remote_open;
3372 remote_ops.to_close = remote_close;
3373 remote_ops.to_detach = remote_detach;
3374 remote_ops.to_resume = remote_resume;
3375 remote_ops.to_wait = remote_wait;
3376 remote_ops.to_fetch_registers = remote_fetch_registers;
3377 remote_ops.to_store_registers = remote_store_registers;
3378 remote_ops.to_prepare_to_store = remote_prepare_to_store;
3379 remote_ops.to_xfer_memory = remote_xfer_memory;
3380 remote_ops.to_files_info = remote_files_info;
3381 remote_ops.to_insert_breakpoint = remote_insert_breakpoint;
3382 remote_ops.to_remove_breakpoint = remote_remove_breakpoint;
3383 remote_ops.to_kill = remote_kill;
3384 remote_ops.to_load = generic_load;
3385 remote_ops.to_mourn_inferior = remote_mourn;
3386 remote_ops.to_thread_alive = remote_thread_alive;
b83266a0 3387 remote_ops.to_find_new_threads = remote_find_new_threads;
c906108c
SS
3388 remote_ops.to_stop = remote_stop;
3389 remote_ops.to_query = remote_query;
3390 remote_ops.to_stratum = process_stratum;
3391 remote_ops.to_has_all_memory = 1;
3392 remote_ops.to_has_memory = 1;
3393 remote_ops.to_has_stack = 1;
3394 remote_ops.to_has_registers = 1;
3395 remote_ops.to_has_execution = 1;
3396 remote_ops.to_has_thread_control = tc_schedlock; /* can lock scheduler */
3397 remote_ops.to_magic = OPS_MAGIC;
3398}
3399
3400/* Set up the extended remote vector by making a copy of the standard
3401 remote vector and adding to it. */
3402
3403static void
3404init_extended_remote_ops ()
3405{
3406 extended_remote_ops = remote_ops;
3407
3408 extended_remote_ops.to_shortname = "extended-remote";
3409 extended_remote_ops.to_longname =
3410 "Extended remote serial target in gdb-specific protocol";
3411 extended_remote_ops.to_doc =
3412 "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
3413Specify the serial device it is connected to (e.g. /dev/ttya).",
3414 extended_remote_ops.to_open = extended_remote_open;
3415 extended_remote_ops.to_create_inferior = extended_remote_create_inferior;
3416 extended_remote_ops.to_mourn_inferior = extended_remote_mourn;
3417}
3418
3419void
3420_initialize_remote ()
3421{
3422 init_remote_ops ();
3423 add_target (&remote_ops);
3424
3425 init_extended_remote_ops ();
3426 add_target (&extended_remote_ops);
3427 init_remote_threads ();
3428#if 0
3429 init_remote_threadtests ();
3430#endif
3431
3432 add_cmd ("compare-sections", class_obscure, compare_sections_command,
3433 "Compare section data on target to the exec file.\n\
3434Argument is a single section name (default: all loaded sections).",
3435 &cmdlist);
3436
3437 add_cmd ("packet", class_maintenance, packet_command,
3438 "Send an arbitrary packet to a remote target.\n\
3439 maintenance packet TEXT\n\
3440If GDB is talking to an inferior via the GDB serial protocol, then\n\
3441this command sends the string TEXT to the inferior, and displays the\n\
3442response packet. GDB supplies the initial `$' character, and the\n\
3443terminating `#' character and checksum.",
3444 &maintenancelist);
3445
3446 add_show_from_set
3447 (add_set_cmd ("remotetimeout", no_class,
3448 var_integer, (char *)&remote_timeout,
3449 "Set timeout value for remote read.\n",
3450 &setlist),
3451 &showlist);
3452
3453 add_show_from_set
3454 (add_set_cmd ("remotebreak", no_class,
3455 var_integer, (char *)&remote_break,
3456 "Set whether to send break if interrupted.\n",
3457 &setlist),
3458 &showlist);
3459
3460 add_show_from_set
3461 (add_set_cmd ("remotewritesize", no_class,
3462 var_integer, (char *)&remote_write_size,
3463 "Set the maximum number of bytes per memory write packet.\n",
3464 &setlist),
3465 &showlist);
3466
3467 remote_address_size = TARGET_PTR_BIT;
3468 add_show_from_set
3469 (add_set_cmd ("remoteaddresssize", class_obscure,
3470 var_integer, (char *)&remote_address_size,
3471 "Set the maximum size of the address (in bits) \
3472in a memory packet.\n",
3473 &setlist),
3474 &showlist);
3475
b83266a0
SS
3476 add_show_from_set
3477 (add_set_cmd ("remotebinarydownload", no_class,
3478 var_boolean, (char *) &remote_binary_download,
3479 "Set binary downloads.\n", &setlist),
3480 &showlist);
c906108c 3481}
This page took 0.24885 seconds and 4 git commands to generate.