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