import gdb-1999-10-11 snapshot
[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, 98, 1999 
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,
20    Boston, MA 02111-1307, USA.  */
21
22 /* See the GDB User Guide for details of the GDB remote protocol. */
23
24 #include "defs.h"
25 #include "gdb_string.h"
26 #include <ctype.h>
27 #include <fcntl.h>
28 #include "frame.h"
29 #include "inferior.h"
30 #include "bfd.h"
31 #include "symfile.h"
32 #include "target.h"
33 #include "wait.h"
34 /*#include "terminal.h" */
35 #include "gdbcmd.h"
36 #include "objfiles.h"
37 #include "gdb-stabs.h"
38 #include "gdbthread.h"
39 #include "remote.h"
40
41 #include "dcache.h"
42
43 #include <ctype.h>
44 #include <sys/time.h>
45 #ifdef USG
46 #include <sys/types.h>
47 #endif
48
49 #include "event-loop.h"
50 #include "event-top.h"
51 #include "inf-loop.h"
52
53 #include <signal.h>
54 #include "serial.h"
55
56 /* Prototypes for local functions */
57 static void cleanup_sigint_signal_handler (void *dummy);
58 static void initialize_sigint_signal_handler (void);
59
60 static void handle_remote_sigint PARAMS ((int));
61 static void handle_remote_sigint_twice PARAMS ((int));
62 static void async_remote_interrupt PARAMS ((gdb_client_data));
63 void async_remote_interrupt_twice PARAMS ((gdb_client_data));
64
65 static void build_remote_gdbarch_data PARAMS ((void));
66
67 static int remote_write_bytes PARAMS ((CORE_ADDR memaddr,
68                                        char *myaddr, int len));
69
70 static int remote_read_bytes PARAMS ((CORE_ADDR memaddr,
71                                       char *myaddr, int len));
72
73 static void remote_files_info PARAMS ((struct target_ops * ignore));
74
75 static int remote_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
76                                        int len, int should_write,
77                                        struct target_ops * target));
78
79 static void remote_prepare_to_store PARAMS ((void));
80
81 static void remote_fetch_registers PARAMS ((int regno));
82
83 static void remote_resume PARAMS ((int pid, int step,
84                                    enum target_signal siggnal));
85 static void remote_async_resume PARAMS ((int pid, int step,
86                                          enum target_signal siggnal));
87 static int remote_start_remote PARAMS ((PTR));
88
89 static void remote_open PARAMS ((char *name, int from_tty));
90 static void remote_async_open PARAMS ((char *name, int from_tty));
91
92 static void extended_remote_open PARAMS ((char *name, int from_tty));
93 static void extended_remote_async_open PARAMS ((char *name, int from_tty));
94
95 static void remote_open_1 PARAMS ((char *, int, struct target_ops *,
96                                    int extended_p));
97 static void remote_async_open_1 PARAMS ((char *, int, struct target_ops *,
98                                          int extended_p));
99
100 static void remote_close PARAMS ((int quitting));
101
102 static void remote_store_registers PARAMS ((int regno));
103
104 static void remote_mourn PARAMS ((void));
105 static void remote_async_mourn PARAMS ((void));
106
107 static void extended_remote_restart PARAMS ((void));
108
109 static void extended_remote_mourn PARAMS ((void));
110
111 static void extended_remote_create_inferior PARAMS ((char *, char *, char **));
112 static void extended_remote_async_create_inferior PARAMS ((char *, char *, char **));
113
114 static void remote_mourn_1 PARAMS ((struct target_ops *));
115
116 static void remote_send PARAMS ((char *buf));
117
118 static int readchar PARAMS ((int timeout));
119
120 static int remote_wait PARAMS ((int pid, struct target_waitstatus * status));
121 static int remote_async_wait PARAMS ((int pid, struct target_waitstatus * status));
122
123 static void remote_kill PARAMS ((void));
124 static void remote_async_kill PARAMS ((void));
125
126 static int tohex PARAMS ((int nib));
127
128 static void remote_detach PARAMS ((char *args, int from_tty));
129 static void remote_async_detach PARAMS ((char *args, int from_tty));
130
131 static void remote_interrupt PARAMS ((int signo));
132
133 static void remote_interrupt_twice PARAMS ((int signo));
134
135 static void interrupt_query PARAMS ((void));
136
137 static void set_thread PARAMS ((int, int));
138
139 static int remote_thread_alive PARAMS ((int));
140
141 static void get_offsets PARAMS ((void));
142
143 static int read_frame PARAMS ((char *));
144
145 static int remote_insert_breakpoint PARAMS ((CORE_ADDR, char *));
146
147 static int remote_remove_breakpoint PARAMS ((CORE_ADDR, char *));
148
149 static int hexnumlen PARAMS ((ULONGEST num));
150
151 static void init_remote_ops PARAMS ((void));
152
153 static void init_extended_remote_ops PARAMS ((void));
154
155 static void init_remote_cisco_ops PARAMS ((void));
156
157 static struct target_ops remote_cisco_ops;
158
159 static void remote_stop PARAMS ((void));
160
161 static int ishex PARAMS ((int ch, int *val));
162
163 static int stubhex PARAMS ((int ch));
164
165 static int remote_query PARAMS ((int /*char */ , char *, char *, int *));
166
167 static int hexnumstr PARAMS ((char *, ULONGEST));
168
169 static int hexnumnstr PARAMS ((char *, ULONGEST, int));
170
171 static CORE_ADDR remote_address_masked PARAMS ((CORE_ADDR));
172
173 static void print_packet PARAMS ((char *));
174
175 static unsigned long crc32 PARAMS ((unsigned char *, int, unsigned int));
176
177 static void compare_sections_command PARAMS ((char *, int));
178
179 static void packet_command PARAMS ((char *, int));
180
181 static int stub_unpack_int PARAMS ((char *buff, int fieldlength));
182
183 static int remote_current_thread PARAMS ((int oldpid));
184
185 static void remote_find_new_threads PARAMS ((void));
186
187 static void record_currthread PARAMS ((int currthread));
188
189 /* exported functions */
190
191 extern int fromhex PARAMS ((int a));
192
193 static int putpkt_binary PARAMS ((char *buf, int cnt));
194
195 static void check_binary_download PARAMS ((CORE_ADDR addr));
196
197 struct packet_config;
198
199 static void show_packet_config_cmd PARAMS ((struct packet_config * config));
200
201 static void set_packet_config_cmd PARAMS ((struct packet_config * config,
202                                               struct cmd_list_element * c));
203
204 static void add_packet_config_cmd PARAMS ((struct packet_config * config,
205                                            char *name,
206                                            char *title,
207    void (*set_func) (char *args, int from_tty, struct cmd_list_element * c),
208                                void (*show_func) (char *name, int from_tty),
209                                            struct cmd_list_element **setlist,
210                                            struct cmd_list_element **showlist));
211
212 static void init_packet_config PARAMS ((struct packet_config * config));
213
214 static void set_remote_protocol_P_packet_cmd PARAMS ((char *args,
215                                                       int from_tty,
216                                               struct cmd_list_element * c));
217
218 static void show_remote_protocol_P_packet_cmd PARAMS ((char *args,
219                                                        int from_tty));
220
221 static void set_remote_protocol_Z_packet_cmd PARAMS ((char *args,
222                                                       int from_tty,
223                                               struct cmd_list_element * c));
224
225 static void show_remote_protocol_Z_packet_cmd PARAMS ((char *args,
226                                                        int from_tty));
227
228
229
230
231 /* Define the target subroutine names */
232
233 void open_remote_target PARAMS ((char *, int, struct target_ops *, int));
234
235 void _initialize_remote PARAMS ((void));
236
237 /* */
238
239 static struct target_ops remote_ops;
240
241 static struct target_ops extended_remote_ops;
242
243 /* Temporary target ops. Just like the remote_ops and
244    extended_remote_ops, but with asynchronous support. */
245 static struct target_ops remote_async_ops;
246
247 static struct target_ops extended_async_remote_ops;
248
249 /* This was 5 seconds, which is a long time to sit and wait.
250    Unless this is going though some terminal server or multiplexer or
251    other form of hairy serial connection, I would think 2 seconds would
252    be plenty.  */
253
254 /* Changed to allow option to set timeout value.
255    was static int remote_timeout = 2; */
256 extern int remote_timeout;
257
258 /* FIXME: cagney/1999-09-23: Even though getpkt was called with
259    ``forever'' still use the normal timeout mechanism.  This is
260    currently used by the ASYNC code to guarentee that target reads
261    during the initial connect always time-out.  Once getpkt has been
262    modified to return a timeout indication and, in turn
263    remote_wait()/wait_for_inferior() have gained a timeout parameter
264    this can go away. */
265 static int wait_forever_enabled_p = 1;
266
267
268 /* This variable chooses whether to send a ^C or a break when the user
269    requests program interruption.  Although ^C is usually what remote
270    systems expect, and that is the default here, sometimes a break is
271    preferable instead.  */
272
273 static int remote_break;
274
275 /* Descriptor for I/O to remote machine.  Initialize it to NULL so that
276    remote_open knows that we don't have a file open when the program
277    starts.  */
278 static serial_t remote_desc = NULL;
279
280 /* This is set by the target (thru the 'S' message)
281    to denote that the target is in kernel mode.  */
282 static int cisco_kernel_mode = 0;
283
284 /* Maximum number of bytes to read/write at once.  The value here
285    is chosen to fill up a packet (the headers account for the 32).  */
286 #define MAXBUFBYTES(N) (((N)-32)/2)
287
288 /* Having this larger than 400 causes us to be incompatible with m68k-stub.c
289    and i386-stub.c.  Normally, no one would notice because it only matters
290    for writing large chunks of memory (e.g. in downloads).  Also, this needs
291    to be more than 400 if required to hold the registers (see below, where
292    we round it up based on REGISTER_BYTES).  */
293 /* Round up PBUFSIZ to hold all the registers, at least.  */
294 #define PBUFSIZ ((REGISTER_BYTES > MAXBUFBYTES (400)) \
295                  ? (REGISTER_BYTES * 2 + 32) \
296                  : 400)
297
298
299 /* This variable sets the number of bytes to be written to the target
300    in a single packet.  Normally PBUFSIZ is satisfactory, but some
301    targets need smaller values (perhaps because the receiving end
302    is slow).  */
303
304 static int remote_write_size;
305
306 /* This variable sets the number of bits in an address that are to be
307    sent in a memory ("M" or "m") packet.  Normally, after stripping
308    leading zeros, the entire address would be sent. This variable
309    restricts the address to REMOTE_ADDRESS_SIZE bits.  HISTORY: The
310    initial implementation of remote.c restricted the address sent in
311    memory packets to ``host::sizeof long'' bytes - (typically 32
312    bits).  Consequently, for 64 bit targets, the upper 32 bits of an
313    address was never sent.  Since fixing this bug may cause a break in
314    some remote targets this variable is principly provided to
315    facilitate backward compatibility. */
316
317 static int remote_address_size;
318
319 /* This is the size (in chars) of the first response to the `g' command.  This
320    is used to limit the size of the memory read and write commands to prevent
321    stub buffers from overflowing.  The size does not include headers and
322    trailers, it is only the payload size. */
323
324 static int remote_register_buf_size = 0;
325
326 /* Tempoary to track who currently owns the terminal.  See
327    target_async_terminal_* for more details.  */
328
329 static int remote_async_terminal_ours_p;
330
331 /* Generic configuration support for packets the stub optionally
332    supports. Allows the user to specify the use of the packet as well
333    as allowing GDB to auto-detect support in the remote stub. */
334
335 enum packet_support
336   {
337     PACKET_SUPPORT_UNKNOWN = 0,
338     PACKET_ENABLE,
339     PACKET_DISABLE
340   };
341
342 enum packet_detect
343   {
344     PACKET_AUTO_DETECT = 0,
345     PACKET_MANUAL_DETECT
346   };
347
348 struct packet_config
349   {
350     char *state;
351     char *name;
352     char *title;
353     enum packet_detect detect;
354     enum packet_support support;
355   };
356
357 static char packet_support_auto[] = "auto";
358 static char packet_enable[] = "enable";
359 static char packet_disable[] = "disable";
360 static char *packet_support_enums[] =
361 {
362   packet_support_auto,
363   packet_enable,
364   packet_disable,
365   0,
366 };
367
368 static void
369 set_packet_config_cmd (config, c)
370      struct packet_config *config;
371      struct cmd_list_element *c;
372 {
373   if (config->state == packet_enable)
374     {
375       config->detect = PACKET_MANUAL_DETECT;
376       config->support = PACKET_ENABLE;
377     }
378   else if (config->state == packet_disable)
379     {
380       config->detect = PACKET_MANUAL_DETECT;
381       config->support = PACKET_DISABLE;
382     }
383   else if (config->state == packet_support_auto)
384     {
385       config->detect = PACKET_AUTO_DETECT;
386       config->support = PACKET_SUPPORT_UNKNOWN;
387     }
388   else
389     internal_error ("Bad enum value");
390 }
391
392 static void
393 show_packet_config_cmd (config)
394      struct packet_config *config;
395 {
396   char *support = "internal-error";
397   switch (config->support)
398     {
399     case PACKET_ENABLE:
400       support = "enabled";
401       break;
402     case PACKET_DISABLE:
403       support = "disabled";
404       break;
405     case PACKET_SUPPORT_UNKNOWN:
406       support = "unknown";
407       break;
408     }
409   switch (config->detect)
410     {
411     case PACKET_AUTO_DETECT:
412       printf_filtered ("Support for remote protocol `%s' (%s) packet is auto-detected, currently %s.\n",
413                        config->name, config->title, support);
414       break;
415     case PACKET_MANUAL_DETECT:
416       printf_filtered ("Support for remote protocol `%s' (%s) is currently %s.\n",
417                        config->name, config->title, support);
418     }
419 }
420
421 static void
422 add_packet_config_cmd (config, name, title, set_func, show_func,
423                        setlist, showlist)
424      struct packet_config *config;
425      char *name;
426      char *title;
427      void (*set_func) PARAMS ((char *args, int from_tty,
428                                struct cmd_list_element * c));
429      void (*show_func) PARAMS ((char *name, int from_tty));
430      struct cmd_list_element **setlist;
431      struct cmd_list_element **showlist;
432 {
433   struct cmd_list_element *c;
434   char *set_doc;
435   char *show_doc;
436   char *full_name;
437   config->name = name;
438   config->title = title;
439   asprintf (&set_doc, "Set use of remote protocol `%s' (%s) packet",
440             name, title);
441   asprintf (&show_doc, "Show current use of remote protocol `%s' (%s) packet",
442             name, title);
443   asprintf (&full_name, "%s-packet", name);
444   c = add_set_enum_cmd (full_name,
445                         class_obscure, packet_support_enums,
446                         (char *) &config->state,
447                         set_doc, setlist);
448   c->function.sfunc = set_func;
449   add_cmd (full_name, class_obscure, show_func, show_doc, showlist);
450 }
451
452 static void
453 init_packet_config (config)
454      struct packet_config *config;
455 {
456   switch (config->detect)
457     {
458     case PACKET_AUTO_DETECT:
459       config->support = PACKET_SUPPORT_UNKNOWN;
460       break;
461     case PACKET_MANUAL_DETECT:
462       /* let the user beware */
463       break;
464     }
465 }
466
467 /* Should we try the 'P' (set register) request?  */
468
469 static struct packet_config remote_protocol_P;
470
471 static void
472 set_remote_protocol_P_packet_cmd (args, from_tty, c)
473      char *args;
474      int from_tty;
475      struct cmd_list_element *c;
476 {
477   set_packet_config_cmd (&remote_protocol_P, c);
478 }
479
480 static void
481 show_remote_protocol_P_packet_cmd (args, from_tty)
482      char *args;
483      int from_tty;
484 {
485   show_packet_config_cmd (&remote_protocol_P);
486 }
487
488 /* Should we try the 'Z' (set breakpoint) request?  */
489
490 static struct packet_config remote_protocol_Z;
491
492 static void
493 set_remote_protocol_Z_packet_cmd (args, from_tty, c)
494      char *args;
495      int from_tty;
496      struct cmd_list_element *c;
497 {
498   set_packet_config_cmd (&remote_protocol_Z, c);
499 }
500
501 static void
502 show_remote_protocol_Z_packet_cmd (args, from_tty)
503      char *args;
504      int from_tty;
505 {
506   show_packet_config_cmd (&remote_protocol_Z);
507 }
508
509 /* Should we try the 'X' (remote binary download) packet?
510
511    This variable (available to the user via "set remote X-packet")
512    dictates whether downloads are sent in binary (via the 'X' packet).
513    We assume that the stub can, and attempt to do it. This will be
514    cleared if the stub does not understand it. This switch is still
515    needed, though in cases when the packet is supported in the stub,
516    but the connection does not allow it (i.e., 7-bit serial connection
517    only). */
518
519 static struct packet_config remote_protocol_binary_download;
520
521 static void
522 set_remote_protocol_binary_download_cmd (char *args,
523                                          int from_tty,
524                                          struct cmd_list_element *c)
525 {
526   set_packet_config_cmd (&remote_protocol_binary_download, c);
527 }
528
529 static void
530 show_remote_protocol_binary_download_cmd (char *args,
531                                           int from_tty)
532 {
533   show_packet_config_cmd (&remote_protocol_binary_download);
534 }
535
536
537 /* Tokens for use by the asynchronous signal handlers for SIGINT */
538 PTR sigint_remote_twice_token;
539 PTR sigint_remote_token;
540
541 /* These are pointers to hook functions that may be set in order to
542    modify resume/wait behavior for a particular architecture.  */
543
544 void (*target_resume_hook) PARAMS ((void));
545 void (*target_wait_loop_hook) PARAMS ((void));
546 \f
547
548
549 /* These are the threads which we last sent to the remote system.
550    -1 for all or -2 for not sent yet.  */
551 static int general_thread;
552 static int continue_thread;
553
554 /* Call this function as a result of
555    1) A halt indication (T packet) containing a thread id
556    2) A direct query of currthread
557    3) Successful execution of set thread
558  */
559
560 static void
561 record_currthread (currthread)
562      int currthread;
563 {
564   general_thread = currthread;
565
566   /* If this is a new thread, add it to GDB's thread list.
567      If we leave it up to WFI to do this, bad things will happen.  */
568   if (!in_thread_list (currthread))
569     {
570       add_thread (currthread);
571       printf_filtered ("[New %s]\n", target_pid_to_str (currthread));
572     }
573 }
574
575 #define MAGIC_NULL_PID 42000
576
577 static void
578 set_thread (th, gen)
579      int th;
580      int gen;
581 {
582   char *buf = alloca (PBUFSIZ);
583   int state = gen ? general_thread : continue_thread;
584
585   if (state == th)
586     return;
587
588   buf[0] = 'H';
589   buf[1] = gen ? 'g' : 'c';
590   if (th == MAGIC_NULL_PID)
591     {
592       buf[2] = '0';
593       buf[3] = '\0';
594     }
595   else if (th < 0)
596     sprintf (&buf[2], "-%x", -th);
597   else
598     sprintf (&buf[2], "%x", th);
599   putpkt (buf);
600   getpkt (buf, 0);
601   if (gen)
602     general_thread = th;
603   else
604     continue_thread = th;
605 }
606 \f
607 /*  Return nonzero if the thread TH is still alive on the remote system.  */
608
609 static int
610 remote_thread_alive (tid)
611      int tid;
612 {
613   char buf[16];
614
615   if (tid < 0)
616     sprintf (buf, "T-%08x", -tid);
617   else
618     sprintf (buf, "T%08x", tid);
619   putpkt (buf);
620   getpkt (buf, 0);
621   return (buf[0] == 'O' && buf[1] == 'K');
622 }
623
624 /* About these extended threadlist and threadinfo packets.  They are
625    variable length packets but, the fields within them are often fixed
626    length.  They are redundent enough to send over UDP as is the
627    remote protocol in general.  There is a matching unit test module
628    in libstub.  */
629
630 #define OPAQUETHREADBYTES 8
631
632 /* a 64 bit opaque identifier */
633 typedef unsigned char threadref[OPAQUETHREADBYTES];
634
635 /* WARNING: This threadref data structure comes from the remote O.S., libstub
636    protocol encoding, and remote.c. it is not particularly changable */
637
638 /* Right now, the internal structure is int. We want it to be bigger.
639    Plan to fix this.
640  */
641
642 typedef int gdb_threadref;      /* internal GDB thread reference */
643
644 /*  gdb_ext_thread_info is an internal GDB data structure which is
645    equivalint to the reply of the remote threadinfo packet */
646
647 struct gdb_ext_thread_info
648   {
649     threadref threadid;         /* External form of thread reference */
650     int active;                 /* Has state interesting to GDB? , regs, stack */
651     char display[256];          /* Brief state display, name, blocked/syspended */
652     char shortname[32];         /* To be used to name threads */
653     char more_display[256];     /* Long info, statistics, queue depth, whatever */
654   };
655
656 /* The volume of remote transfers can be limited by submitting
657    a mask containing bits specifying the desired information.
658    Use a union of these values as the 'selection' parameter to
659    get_thread_info. FIXME: Make these TAG names more thread specific.
660  */
661
662 #define TAG_THREADID 1
663 #define TAG_EXISTS 2
664 #define TAG_DISPLAY 4
665 #define TAG_THREADNAME 8
666 #define TAG_MOREDISPLAY 16
667
668 #define BUF_THREAD_ID_SIZE (OPAQUETHREADBYTES*2)
669
670 char *unpack_varlen_hex PARAMS ((char *buff, int *result));
671
672 static char *unpack_nibble PARAMS ((char *buf, int *val));
673
674 static char *pack_nibble PARAMS ((char *buf, int nibble));
675
676 static char *pack_hex_byte PARAMS ((char *pkt, int /*unsigned char */ byte));
677
678 static char *unpack_byte PARAMS ((char *buf, int *value));
679
680 static char *pack_int PARAMS ((char *buf, int value));
681
682 static char *unpack_int PARAMS ((char *buf, int *value));
683
684 static char *unpack_string PARAMS ((char *src, char *dest, int length));
685
686 static char *pack_threadid PARAMS ((char *pkt, threadref * id));
687
688 static char *unpack_threadid PARAMS ((char *inbuf, threadref * id));
689
690 void int_to_threadref PARAMS ((threadref * id, int value));
691
692 static int threadref_to_int PARAMS ((threadref * ref));
693
694 static void copy_threadref PARAMS ((threadref * dest, threadref * src));
695
696 static int threadmatch PARAMS ((threadref * dest, threadref * src));
697
698 static char *pack_threadinfo_request PARAMS ((char *pkt, int mode,
699                                               threadref * id));
700
701 static int remote_unpack_thread_info_response PARAMS ((char *pkt,
702                                                     threadref * expectedref,
703                                         struct gdb_ext_thread_info * info));
704
705
706 static int remote_get_threadinfo PARAMS ((threadref * threadid,
707                                           int fieldset,         /*TAG mask */
708                                         struct gdb_ext_thread_info * info));
709
710 static int adapt_remote_get_threadinfo PARAMS ((gdb_threadref * ref,
711                                                 int selection,
712                                         struct gdb_ext_thread_info * info));
713
714 static char *pack_threadlist_request PARAMS ((char *pkt, int startflag,
715                                               int threadcount,
716                                               threadref * nextthread));
717
718 static int parse_threadlist_response PARAMS ((char *pkt,
719                                               int result_limit,
720                                               threadref * original_echo,
721                                               threadref * resultlist,
722                                               int *doneflag));
723
724 static int remote_get_threadlist PARAMS ((int startflag,
725                                           threadref * nextthread,
726                                           int result_limit,
727                                           int *done,
728                                           int *result_count,
729                                           threadref * threadlist));
730
731 typedef int (*rmt_thread_action) (threadref * ref, void *context);
732
733 static int remote_threadlist_iterator PARAMS ((rmt_thread_action stepfunction,
734                                              void *context, int looplimit));
735
736 static int remote_newthread_step PARAMS ((threadref * ref, void *context));
737
738 /* encode 64 bits in 16 chars of hex */
739
740 static const char hexchars[] = "0123456789abcdef";
741
742 static int
743 ishex (ch, val)
744      int ch;
745      int *val;
746 {
747   if ((ch >= 'a') && (ch <= 'f'))
748     {
749       *val = ch - 'a' + 10;
750       return 1;
751     }
752   if ((ch >= 'A') && (ch <= 'F'))
753     {
754       *val = ch - 'A' + 10;
755       return 1;
756     }
757   if ((ch >= '0') && (ch <= '9'))
758     {
759       *val = ch - '0';
760       return 1;
761     }
762   return 0;
763 }
764
765 static int
766 stubhex (ch)
767      int ch;
768 {
769   if (ch >= 'a' && ch <= 'f')
770     return ch - 'a' + 10;
771   if (ch >= '0' && ch <= '9')
772     return ch - '0';
773   if (ch >= 'A' && ch <= 'F')
774     return ch - 'A' + 10;
775   return -1;
776 }
777
778 static int
779 stub_unpack_int (buff, fieldlength)
780      char *buff;
781      int fieldlength;
782 {
783   int nibble;
784   int retval = 0;
785
786   while (fieldlength)
787     {
788       nibble = stubhex (*buff++);
789       retval |= nibble;
790       fieldlength--;
791       if (fieldlength)
792         retval = retval << 4;
793     }
794   return retval;
795 }
796
797 char *
798 unpack_varlen_hex (buff, result)
799      char *buff;                /* packet to parse */
800      int *result;
801 {
802   int nibble;
803   int retval = 0;
804
805   while (ishex (*buff, &nibble))
806     {
807       buff++;
808       retval = retval << 4;
809       retval |= nibble & 0x0f;
810     }
811   *result = retval;
812   return buff;
813 }
814
815 static char *
816 unpack_nibble (buf, val)
817      char *buf;
818      int *val;
819 {
820   ishex (*buf++, val);
821   return buf;
822 }
823
824 static char *
825 pack_nibble (buf, nibble)
826      char *buf;
827      int nibble;
828 {
829   *buf++ = hexchars[(nibble & 0x0f)];
830   return buf;
831 }
832
833 static char *
834 pack_hex_byte (pkt, byte)
835      char *pkt;
836      int byte;
837 {
838   *pkt++ = hexchars[(byte >> 4) & 0xf];
839   *pkt++ = hexchars[(byte & 0xf)];
840   return pkt;
841 }
842
843 static char *
844 unpack_byte (buf, value)
845      char *buf;
846      int *value;
847 {
848   *value = stub_unpack_int (buf, 2);
849   return buf + 2;
850 }
851
852 static char *
853 pack_int (buf, value)
854      char *buf;
855      int value;
856 {
857   buf = pack_hex_byte (buf, (value >> 24) & 0xff);
858   buf = pack_hex_byte (buf, (value >> 16) & 0xff);
859   buf = pack_hex_byte (buf, (value >> 8) & 0x0ff);
860   buf = pack_hex_byte (buf, (value & 0xff));
861   return buf;
862 }
863
864 static char *
865 unpack_int (buf, value)
866      char *buf;
867      int *value;
868 {
869   *value = stub_unpack_int (buf, 8);
870   return buf + 8;
871 }
872
873 #if 0                           /* currently unused, uncomment when needed */
874 static char *pack_string PARAMS ((char *pkt, char *string));
875
876 static char *
877 pack_string (pkt, string)
878      char *pkt;
879      char *string;
880 {
881   char ch;
882   int len;
883
884   len = strlen (string);
885   if (len > 200)
886     len = 200;                  /* Bigger than most GDB packets, junk??? */
887   pkt = pack_hex_byte (pkt, len);
888   while (len-- > 0)
889     {
890       ch = *string++;
891       if ((ch == '\0') || (ch == '#'))
892         ch = '*';               /* Protect encapsulation */
893       *pkt++ = ch;
894     }
895   return pkt;
896 }
897 #endif /* 0 (unused) */
898
899 static char *
900 unpack_string (src, dest, length)
901      char *src;
902      char *dest;
903      int length;
904 {
905   while (length--)
906     *dest++ = *src++;
907   *dest = '\0';
908   return src;
909 }
910
911 static char *
912 pack_threadid (pkt, id)
913      char *pkt;
914      threadref *id;
915 {
916   char *limit;
917   unsigned char *altid;
918
919   altid = (unsigned char *) id;
920   limit = pkt + BUF_THREAD_ID_SIZE;
921   while (pkt < limit)
922     pkt = pack_hex_byte (pkt, *altid++);
923   return pkt;
924 }
925
926
927 static char *
928 unpack_threadid (inbuf, id)
929      char *inbuf;
930      threadref *id;
931 {
932   char *altref;
933   char *limit = inbuf + BUF_THREAD_ID_SIZE;
934   int x, y;
935
936   altref = (char *) id;
937
938   while (inbuf < limit)
939     {
940       x = stubhex (*inbuf++);
941       y = stubhex (*inbuf++);
942       *altref++ = (x << 4) | y;
943     }
944   return inbuf;
945 }
946
947 /* Externally, threadrefs are 64 bits but internally, they are still
948    ints. This is due to a mismatch of specifications.  We would like
949    to use 64bit thread references internally.  This is an adapter
950    function.  */
951
952 void
953 int_to_threadref (id, value)
954      threadref *id;
955      int value;
956 {
957   unsigned char *scan;
958
959   scan = (unsigned char *) id;
960   {
961     int i = 4;
962     while (i--)
963       *scan++ = 0;
964   }
965   *scan++ = (value >> 24) & 0xff;
966   *scan++ = (value >> 16) & 0xff;
967   *scan++ = (value >> 8) & 0xff;
968   *scan++ = (value & 0xff);
969 }
970
971 static int
972 threadref_to_int (ref)
973      threadref *ref;
974 {
975   int i, value = 0;
976   unsigned char *scan;
977
978   scan = (char *) ref;
979   scan += 4;
980   i = 4;
981   while (i-- > 0)
982     value = (value << 8) | ((*scan++) & 0xff);
983   return value;
984 }
985
986 static void
987 copy_threadref (dest, src)
988      threadref *dest;
989      threadref *src;
990 {
991   int i;
992   unsigned char *csrc, *cdest;
993
994   csrc = (unsigned char *) src;
995   cdest = (unsigned char *) dest;
996   i = 8;
997   while (i--)
998     *cdest++ = *csrc++;
999 }
1000
1001 static int
1002 threadmatch (dest, src)
1003      threadref *dest;
1004      threadref *src;
1005 {
1006   /* things are broken right now, so just assume we got a match */
1007 #if 0
1008   unsigned char *srcp, *destp;
1009   int i, result;
1010   srcp = (char *) src;
1011   destp = (char *) dest;
1012
1013   result = 1;
1014   while (i-- > 0)
1015     result &= (*srcp++ == *destp++) ? 1 : 0;
1016   return result;
1017 #endif
1018   return 1;
1019 }
1020
1021 /*
1022    threadid:1,        # always request threadid
1023    context_exists:2,
1024    display:4,
1025    unique_name:8,
1026    more_display:16
1027  */
1028
1029 /* Encoding:  'Q':8,'P':8,mask:32,threadid:64 */
1030
1031 static char *
1032 pack_threadinfo_request (pkt, mode, id)
1033      char *pkt;
1034      int mode;
1035      threadref *id;
1036 {
1037   *pkt++ = 'q';                 /* Info Query */
1038   *pkt++ = 'P';                 /* process or thread info */
1039   pkt = pack_int (pkt, mode);   /* mode */
1040   pkt = pack_threadid (pkt, id);        /* threadid */
1041   *pkt = '\0';                  /* terminate */
1042   return pkt;
1043 }
1044
1045 /* These values tag the fields in a thread info response packet */
1046 /* Tagging the fields allows us to request specific fields and to
1047    add more fields as time goes by */
1048
1049 #define TAG_THREADID 1          /* Echo the thread identifier */
1050 #define TAG_EXISTS 2            /* Is this process defined enough to
1051                                    fetch registers and its stack */
1052 #define TAG_DISPLAY 4           /* A short thing maybe to put on a window */
1053 #define TAG_THREADNAME 8        /* string, maps 1-to-1 with a thread is */
1054 #define TAG_MOREDISPLAY 16      /* Whatever the kernel wants to say about 
1055                                    the process */
1056
1057 static int
1058 remote_unpack_thread_info_response (pkt, expectedref, info)
1059      char *pkt;
1060      threadref *expectedref;
1061      struct gdb_ext_thread_info *info;
1062 {
1063   int mask, length;
1064   unsigned int tag;
1065   threadref ref;
1066   char *limit = pkt + PBUFSIZ;  /* plausable parsing limit */
1067   int retval = 1;
1068
1069   /* info->threadid = 0; FIXME: implement zero_threadref */
1070   info->active = 0;
1071   info->display[0] = '\0';
1072   info->shortname[0] = '\0';
1073   info->more_display[0] = '\0';
1074
1075   /* Assume the characters indicating the packet type have been stripped */
1076   pkt = unpack_int (pkt, &mask);        /* arg mask */
1077   pkt = unpack_threadid (pkt, &ref);
1078
1079   if (mask == 0)
1080     warning ("Incomplete response to threadinfo request\n");
1081   if (!threadmatch (&ref, expectedref))
1082     {                           /* This is an answer to a different request */
1083       warning ("ERROR RMT Thread info mismatch\n");
1084       return 0;
1085     }
1086   copy_threadref (&info->threadid, &ref);
1087
1088   /* Loop on tagged fields , try to bail if somthing goes wrong */
1089
1090   while ((pkt < limit) && mask && *pkt)         /* packets are terminated with nulls */
1091     {
1092       pkt = unpack_int (pkt, &tag);     /* tag */
1093       pkt = unpack_byte (pkt, &length);         /* length */
1094       if (!(tag & mask))        /* tags out of synch with mask */
1095         {
1096           warning ("ERROR RMT: threadinfo tag mismatch\n");
1097           retval = 0;
1098           break;
1099         }
1100       if (tag == TAG_THREADID)
1101         {
1102           if (length != 16)
1103             {
1104               warning ("ERROR RMT: length of threadid is not 16\n");
1105               retval = 0;
1106               break;
1107             }
1108           pkt = unpack_threadid (pkt, &ref);
1109           mask = mask & ~TAG_THREADID;
1110           continue;
1111         }
1112       if (tag == TAG_EXISTS)
1113         {
1114           info->active = stub_unpack_int (pkt, length);
1115           pkt += length;
1116           mask = mask & ~(TAG_EXISTS);
1117           if (length > 8)
1118             {
1119               warning ("ERROR RMT: 'exists' length too long\n");
1120               retval = 0;
1121               break;
1122             }
1123           continue;
1124         }
1125       if (tag == TAG_THREADNAME)
1126         {
1127           pkt = unpack_string (pkt, &info->shortname[0], length);
1128           mask = mask & ~TAG_THREADNAME;
1129           continue;
1130         }
1131       if (tag == TAG_DISPLAY)
1132         {
1133           pkt = unpack_string (pkt, &info->display[0], length);
1134           mask = mask & ~TAG_DISPLAY;
1135           continue;
1136         }
1137       if (tag == TAG_MOREDISPLAY)
1138         {
1139           pkt = unpack_string (pkt, &info->more_display[0], length);
1140           mask = mask & ~TAG_MOREDISPLAY;
1141           continue;
1142         }
1143       warning ("ERROR RMT: unknown thread info tag\n");
1144       break;                    /* Not a tag we know about */
1145     }
1146   return retval;
1147 }
1148
1149 static int
1150 remote_get_threadinfo (threadid, fieldset, info)
1151      threadref *threadid;
1152      int fieldset;              /* TAG mask */
1153      struct gdb_ext_thread_info *info;
1154 {
1155   int result;
1156   char *threadinfo_pkt = alloca (PBUFSIZ);
1157
1158   pack_threadinfo_request (threadinfo_pkt, fieldset, threadid);
1159   putpkt (threadinfo_pkt);
1160   getpkt (threadinfo_pkt, 0);
1161   result = remote_unpack_thread_info_response (threadinfo_pkt + 2, threadid,
1162                                                info);
1163   return result;
1164 }
1165
1166 /* Unfortunately, 61 bit thread-ids are bigger than the internal
1167    representation of a threadid.  */
1168
1169 static int
1170 adapt_remote_get_threadinfo (ref, selection, info)
1171      gdb_threadref *ref;
1172      int selection;
1173      struct gdb_ext_thread_info *info;
1174 {
1175   threadref lclref;
1176
1177   int_to_threadref (&lclref, *ref);
1178   return remote_get_threadinfo (&lclref, selection, info);
1179 }
1180
1181 /*    Format: i'Q':8,i"L":8,initflag:8,batchsize:16,lastthreadid:32   */
1182
1183 static char *
1184 pack_threadlist_request (pkt, startflag, threadcount, nextthread)
1185      char *pkt;
1186      int startflag;
1187      int threadcount;
1188      threadref *nextthread;
1189 {
1190   *pkt++ = 'q';                 /* info query packet */
1191   *pkt++ = 'L';                 /* Process LIST or threadLIST request */
1192   pkt = pack_nibble (pkt, startflag);   /* initflag 1 bytes */
1193   pkt = pack_hex_byte (pkt, threadcount);       /* threadcount 2 bytes */
1194   pkt = pack_threadid (pkt, nextthread);        /* 64 bit thread identifier */
1195   *pkt = '\0';
1196   return pkt;
1197 }
1198
1199 /* Encoding:   'q':8,'M':8,count:16,done:8,argthreadid:64,(threadid:64)* */
1200
1201 static int
1202 parse_threadlist_response (pkt, result_limit, original_echo, resultlist,
1203                            doneflag)
1204      char *pkt;
1205      int result_limit;
1206      threadref *original_echo;
1207      threadref *resultlist;
1208      int *doneflag;
1209 {
1210   char *limit;
1211   int count, resultcount, done;
1212
1213   resultcount = 0;
1214   /* Assume the 'q' and 'M chars have been stripped.  */
1215   limit = pkt + (PBUFSIZ - BUF_THREAD_ID_SIZE);         /* done parse past here */
1216   pkt = unpack_byte (pkt, &count);      /* count field */
1217   pkt = unpack_nibble (pkt, &done);
1218   /* The first threadid is the argument threadid.  */
1219   pkt = unpack_threadid (pkt, original_echo);   /* should match query packet */
1220   while ((count-- > 0) && (pkt < limit))
1221     {
1222       pkt = unpack_threadid (pkt, resultlist++);
1223       if (resultcount++ >= result_limit)
1224         break;
1225     }
1226   if (doneflag)
1227     *doneflag = done;
1228   return resultcount;
1229 }
1230
1231 static int
1232 remote_get_threadlist (startflag, nextthread, result_limit,
1233                        done, result_count, threadlist)
1234      int startflag;
1235      threadref *nextthread;
1236      int result_limit;
1237      int *done;
1238      int *result_count;
1239      threadref *threadlist;
1240
1241 {
1242   static threadref echo_nextthread;
1243   char *threadlist_packet = alloca (PBUFSIZ);
1244   char *t_response = alloca (PBUFSIZ);
1245   int result = 1;
1246
1247   /* Trancate result limit to be smaller than the packet size */
1248   if ((((result_limit + 1) * BUF_THREAD_ID_SIZE) + 10) >= PBUFSIZ)
1249     result_limit = (PBUFSIZ / BUF_THREAD_ID_SIZE) - 2;
1250
1251   pack_threadlist_request (threadlist_packet,
1252                            startflag, result_limit, nextthread);
1253   putpkt (threadlist_packet);
1254   getpkt (t_response, 0);
1255
1256   *result_count =
1257     parse_threadlist_response (t_response + 2, result_limit, &echo_nextthread,
1258                                threadlist, done);
1259
1260   if (!threadmatch (&echo_nextthread, nextthread))
1261     {
1262       /* FIXME: This is a good reason to drop the packet */
1263       /* Possably, there is a duplicate response */
1264       /* Possabilities :
1265          retransmit immediatly - race conditions
1266          retransmit after timeout - yes
1267          exit
1268          wait for packet, then exit
1269        */
1270       warning ("HMM: threadlist did not echo arg thread, dropping it\n");
1271       return 0;                 /* I choose simply exiting */
1272     }
1273   if (*result_count <= 0)
1274     {
1275       if (*done != 1)
1276         {
1277           warning ("RMT ERROR : failed to get remote thread list\n");
1278           result = 0;
1279         }
1280       return result;            /* break; */
1281     }
1282   if (*result_count > result_limit)
1283     {
1284       *result_count = 0;
1285       warning ("RMT ERROR: threadlist response longer than requested\n");
1286       return 0;
1287     }
1288   return result;
1289 }
1290
1291 /* This is the interface between remote and threads, remotes upper interface */
1292
1293 /* remote_find_new_threads retrieves the thread list and for each
1294    thread in the list, looks up the thread in GDB's internal list,
1295    ading the thread if it does not already exist.  This involves
1296    getting partial thread lists from the remote target so, polling the
1297    quit_flag is required.  */
1298
1299
1300 /* About this many threadisds fit in a packet. */
1301
1302 #define MAXTHREADLISTRESULTS 32
1303
1304 static int
1305 remote_threadlist_iterator (stepfunction, context, looplimit)
1306      rmt_thread_action stepfunction;
1307      void *context;
1308      int looplimit;
1309 {
1310   int done, i, result_count;
1311   int startflag = 1;
1312   int result = 1;
1313   int loopcount = 0;
1314   static threadref nextthread;
1315   static threadref resultthreadlist[MAXTHREADLISTRESULTS];
1316
1317   done = 0;
1318   while (!done)
1319     {
1320       if (loopcount++ > looplimit)
1321         {
1322           result = 0;
1323           warning ("Remote fetch threadlist -infinite loop-\n");
1324           break;
1325         }
1326       if (!remote_get_threadlist (startflag, &nextthread, MAXTHREADLISTRESULTS,
1327                                   &done, &result_count, resultthreadlist))
1328         {
1329           result = 0;
1330           break;
1331         }
1332       /* clear for later iterations */
1333       startflag = 0;
1334       /* Setup to resume next batch of thread references, set nextthread.  */
1335       if (result_count >= 1)
1336         copy_threadref (&nextthread, &resultthreadlist[result_count - 1]);
1337       i = 0;
1338       while (result_count--)
1339         if (!(result = (*stepfunction) (&resultthreadlist[i++], context)))
1340           break;
1341     }
1342   return result;
1343 }
1344
1345 static int
1346 remote_newthread_step (ref, context)
1347      threadref *ref;
1348      void *context;
1349 {
1350   int pid;
1351
1352   pid = threadref_to_int (ref);
1353   if (!in_thread_list (pid))
1354     add_thread (pid);
1355   return 1;                     /* continue iterator */
1356 }
1357
1358 #define CRAZY_MAX_THREADS 1000
1359
1360 static int
1361 remote_current_thread (oldpid)
1362      int oldpid;
1363 {
1364   char *buf = alloca (PBUFSIZ);
1365
1366   putpkt ("qC");
1367   getpkt (buf, 0);
1368   if (buf[0] == 'Q' && buf[1] == 'C')
1369     return strtol (&buf[2], NULL, 16);
1370   else
1371     return oldpid;
1372 }
1373
1374 /* Find new threads for info threads command.  */
1375
1376 static void
1377 remote_find_new_threads ()
1378 {
1379   remote_threadlist_iterator (remote_newthread_step, 0,
1380                               CRAZY_MAX_THREADS);
1381   if (inferior_pid == MAGIC_NULL_PID)   /* ack ack ack */
1382     inferior_pid = remote_current_thread (inferior_pid);
1383 }
1384
1385 static void
1386 remote_threads_info (void)
1387 {
1388   char *buf = alloca (PBUFSIZ);
1389   char *bufp;
1390   int tid;
1391
1392   if (remote_desc == 0)         /* paranoia */
1393     error ("Command can only be used when connected to the remote target.");
1394
1395   putpkt ("qfThreadInfo");
1396   getpkt (bufp = buf, 0);
1397   if (bufp[0] == '\0')          /* q packet not recognized! */
1398     {                           /* try old jmetzler method  */
1399       remote_find_new_threads ();
1400       return;
1401     }
1402   else                          /* try new 'q' method */
1403     while (*bufp++ == 'm')      /* reply contains one or more TID */
1404       {
1405         do
1406           {
1407             tid = strtol (bufp, &bufp, 16);
1408             if (tid != 0 && !in_thread_list (tid))
1409               add_thread (tid);
1410           }
1411         while (*bufp++ == ','); /* comma-separated list */
1412         putpkt ("qsThreadInfo");
1413         getpkt (bufp = buf, 0);
1414       }
1415 }
1416 \f
1417
1418 /*  Restart the remote side; this is an extended protocol operation.  */
1419
1420 static void
1421 extended_remote_restart ()
1422 {
1423   char *buf = alloca (PBUFSIZ);
1424
1425   /* Send the restart command; for reasons I don't understand the
1426      remote side really expects a number after the "R".  */
1427   buf[0] = 'R';
1428   sprintf (&buf[1], "%x", 0);
1429   putpkt (buf);
1430
1431   /* Now query for status so this looks just like we restarted
1432      gdbserver from scratch.  */
1433   putpkt ("?");
1434   getpkt (buf, 0);
1435 }
1436 \f
1437 /* Clean up connection to a remote debugger.  */
1438
1439 /* ARGSUSED */
1440 static void
1441 remote_close (quitting)
1442      int quitting;
1443 {
1444   if (remote_desc)
1445     SERIAL_CLOSE (remote_desc);
1446   remote_desc = NULL;
1447 }
1448
1449 /* Query the remote side for the text, data and bss offsets. */
1450
1451 static void
1452 get_offsets ()
1453 {
1454   char *buf = alloca (PBUFSIZ);
1455   char *ptr;
1456   int lose;
1457   CORE_ADDR text_addr, data_addr, bss_addr;
1458   struct section_offsets *offs;
1459
1460   putpkt ("qOffsets");
1461
1462   getpkt (buf, 0);
1463
1464   if (buf[0] == '\000')
1465     return;                     /* Return silently.  Stub doesn't support
1466                                    this command. */
1467   if (buf[0] == 'E')
1468     {
1469       warning ("Remote failure reply: %s", buf);
1470       return;
1471     }
1472
1473   /* Pick up each field in turn.  This used to be done with scanf, but
1474      scanf will make trouble if CORE_ADDR size doesn't match
1475      conversion directives correctly.  The following code will work
1476      with any size of CORE_ADDR.  */
1477   text_addr = data_addr = bss_addr = 0;
1478   ptr = buf;
1479   lose = 0;
1480
1481   if (strncmp (ptr, "Text=", 5) == 0)
1482     {
1483       ptr += 5;
1484       /* Don't use strtol, could lose on big values.  */
1485       while (*ptr && *ptr != ';')
1486         text_addr = (text_addr << 4) + fromhex (*ptr++);
1487     }
1488   else
1489     lose = 1;
1490
1491   if (!lose && strncmp (ptr, ";Data=", 6) == 0)
1492     {
1493       ptr += 6;
1494       while (*ptr && *ptr != ';')
1495         data_addr = (data_addr << 4) + fromhex (*ptr++);
1496     }
1497   else
1498     lose = 1;
1499
1500   if (!lose && strncmp (ptr, ";Bss=", 5) == 0)
1501     {
1502       ptr += 5;
1503       while (*ptr && *ptr != ';')
1504         bss_addr = (bss_addr << 4) + fromhex (*ptr++);
1505     }
1506   else
1507     lose = 1;
1508
1509   if (lose)
1510     error ("Malformed response to offset query, %s", buf);
1511
1512   if (symfile_objfile == NULL)
1513     return;
1514
1515   offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
1516   memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
1517
1518   ANOFFSET (offs, SECT_OFF_TEXT) = text_addr;
1519
1520   /* This is a temporary kludge to force data and bss to use the same offsets
1521      because that's what nlmconv does now.  The real solution requires changes
1522      to the stub and remote.c that I don't have time to do right now.  */
1523
1524   ANOFFSET (offs, SECT_OFF_DATA) = data_addr;
1525   ANOFFSET (offs, SECT_OFF_BSS) = data_addr;
1526
1527   objfile_relocate (symfile_objfile, offs);
1528 }
1529
1530 /*
1531  * Cisco version of section offsets:
1532  *
1533  * Instead of having GDB query the target for the section offsets,
1534  * Cisco lets the target volunteer the information!  It's also in
1535  * a different format, so here are the functions that will decode
1536  * a section offset packet from a Cisco target.
1537  */
1538
1539 /* 
1540  * Function: remote_cisco_section_offsets
1541  *
1542  * Returns:  zero for success, non-zero for failure 
1543  */
1544
1545 static int
1546 remote_cisco_section_offsets (text_addr, data_addr, bss_addr,
1547                               text_offs, data_offs, bss_offs)
1548      bfd_vma text_addr;
1549      bfd_vma data_addr;
1550      bfd_vma bss_addr;
1551      bfd_signed_vma *text_offs;
1552      bfd_signed_vma *data_offs;
1553      bfd_signed_vma *bss_offs;
1554 {
1555   bfd_vma text_base, data_base, bss_base;
1556   struct minimal_symbol *start;
1557   asection *sect;
1558   bfd *abfd;
1559   int len;
1560   char *p;
1561
1562   if (symfile_objfile == NULL)
1563     return -1;                  /* no can do nothin' */
1564
1565   start = lookup_minimal_symbol ("_start", NULL, NULL);
1566   if (start == NULL)
1567     return -1;                  /* Can't find "_start" symbol */
1568
1569   data_base = bss_base = 0;
1570   text_base = SYMBOL_VALUE_ADDRESS (start);
1571
1572   abfd = symfile_objfile->obfd;
1573   for (sect = abfd->sections;
1574        sect != 0;
1575        sect = sect->next)
1576     {
1577       p = (unsigned char *) bfd_get_section_name (abfd, sect);
1578       len = strlen (p);
1579       if (strcmp (p + len - 4, "data") == 0)    /* ends in "data" */
1580         if (data_base == 0 ||
1581             data_base > bfd_get_section_vma (abfd, sect))
1582           data_base = bfd_get_section_vma (abfd, sect);
1583       if (strcmp (p + len - 3, "bss") == 0)     /* ends in "bss" */
1584         if (bss_base == 0 ||
1585             bss_base > bfd_get_section_vma (abfd, sect))
1586           bss_base = bfd_get_section_vma (abfd, sect);
1587     }
1588   *text_offs = text_addr - text_base;
1589   *data_offs = data_addr - data_base;
1590   *bss_offs = bss_addr - bss_base;
1591   if (remote_debug)
1592     {
1593       char tmp[128];
1594
1595       sprintf (tmp, "VMA:          text = 0x");
1596       sprintf_vma (tmp + strlen (tmp), text_addr);
1597       sprintf (tmp + strlen (tmp), " data = 0x");
1598       sprintf_vma (tmp + strlen (tmp), data_addr);
1599       sprintf (tmp + strlen (tmp), " bss = 0x");
1600       sprintf_vma (tmp + strlen (tmp), bss_addr);
1601       fprintf_filtered (gdb_stdlog, tmp);
1602       fprintf_filtered (gdb_stdlog,
1603                         "Reloc offset: text = 0x%s data = 0x%s bss = 0x%s\n",
1604                         paddr_nz (*text_offs),
1605                         paddr_nz (*data_offs),
1606                         paddr_nz (*bss_offs));
1607     }
1608
1609   return 0;
1610 }
1611
1612 /*
1613  * Function: remote_cisco_objfile_relocate
1614  *
1615  * Relocate the symbol file for a remote target. 
1616  */
1617
1618 void
1619 remote_cisco_objfile_relocate (text_off, data_off, bss_off)
1620      bfd_signed_vma text_off;
1621      bfd_signed_vma data_off;
1622      bfd_signed_vma bss_off;
1623 {
1624   struct section_offsets *offs;
1625
1626   if (text_off != 0 || data_off != 0 || bss_off != 0)
1627     {
1628       /* FIXME: This code assumes gdb-stabs.h is being used; it's
1629          broken for xcoff, dwarf, sdb-coff, etc.  But there is no
1630          simple canonical representation for this stuff.  */
1631
1632       offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
1633       memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
1634
1635       ANOFFSET (offs, SECT_OFF_TEXT) = text_off;
1636       ANOFFSET (offs, SECT_OFF_DATA) = data_off;
1637       ANOFFSET (offs, SECT_OFF_BSS) = bss_off;
1638
1639       /* First call the standard objfile_relocate.  */
1640       objfile_relocate (symfile_objfile, offs);
1641
1642       /* Now we need to fix up the section entries already attached to
1643          the exec target.  These entries will control memory transfers
1644          from the exec file.  */
1645
1646       exec_set_section_offsets (text_off, data_off, bss_off);
1647     }
1648 }
1649
1650 /* Stub for catch_errors.  */
1651
1652 static int
1653 remote_start_remote_dummy (dummy)
1654      char *dummy;
1655 {
1656   start_remote ();              /* Initialize gdb process mechanisms */
1657   return 1;
1658 }
1659
1660 static int
1661 remote_start_remote (dummy)
1662      PTR dummy;
1663 {
1664   immediate_quit = 1;           /* Allow user to interrupt it */
1665
1666   /* Ack any packet which the remote side has already sent.  */
1667   SERIAL_WRITE (remote_desc, "+", 1);
1668
1669   /* Let the stub know that we want it to return the thread.  */
1670   set_thread (-1, 0);
1671
1672   inferior_pid = remote_current_thread (inferior_pid);
1673
1674   get_offsets ();               /* Get text, data & bss offsets */
1675
1676   putpkt ("?");                 /* initiate a query from remote machine */
1677   immediate_quit = 0;
1678
1679   return remote_start_remote_dummy (dummy);
1680 }
1681
1682 /* Open a connection to a remote debugger.
1683    NAME is the filename used for communication.  */
1684
1685 static void
1686 remote_open (name, from_tty)
1687      char *name;
1688      int from_tty;
1689 {
1690   remote_open_1 (name, from_tty, &remote_ops, 0);
1691 }
1692
1693 /* Just like remote_open, but with asynchronous support. */
1694 static void
1695 remote_async_open (name, from_tty)
1696      char *name;
1697      int from_tty;
1698 {
1699   remote_async_open_1 (name, from_tty, &remote_async_ops, 0);
1700 }
1701
1702 /* Open a connection to a remote debugger using the extended
1703    remote gdb protocol.  NAME is the filename used for communication.  */
1704
1705 static void
1706 extended_remote_open (name, from_tty)
1707      char *name;
1708      int from_tty;
1709 {
1710   remote_open_1 (name, from_tty, &extended_remote_ops, 1 /*extended_p */ );
1711 }
1712
1713 /* Just like extended_remote_open, but with asynchronous support. */
1714 static void
1715 extended_remote_async_open (name, from_tty)
1716      char *name;
1717      int from_tty;
1718 {
1719   remote_async_open_1 (name, from_tty, &extended_async_remote_ops, 1 /*extended_p */ );
1720 }
1721
1722 /* Generic code for opening a connection to a remote target.  */
1723
1724 static DCACHE *remote_dcache;
1725
1726 static void
1727 remote_open_1 (name, from_tty, target, extended_p)
1728      char *name;
1729      int from_tty;
1730      struct target_ops *target;
1731      int extended_p;
1732 {
1733   if (name == 0)
1734     error ("To open a remote debug connection, you need to specify what\n\
1735 serial device is attached to the remote system (e.g. /dev/ttya).");
1736
1737   /* See FIXME above */
1738   wait_forever_enabled_p = 1;
1739
1740   target_preopen (from_tty);
1741
1742   unpush_target (target);
1743
1744   remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
1745
1746   remote_desc = SERIAL_OPEN (name);
1747   if (!remote_desc)
1748     perror_with_name (name);
1749
1750   if (baud_rate != -1)
1751     {
1752       if (SERIAL_SETBAUDRATE (remote_desc, baud_rate))
1753         {
1754           SERIAL_CLOSE (remote_desc);
1755           perror_with_name (name);
1756         }
1757     }
1758
1759   SERIAL_RAW (remote_desc);
1760
1761   /* If there is something sitting in the buffer we might take it as a
1762      response to a command, which would be bad.  */
1763   SERIAL_FLUSH_INPUT (remote_desc);
1764
1765   if (from_tty)
1766     {
1767       puts_filtered ("Remote debugging using ");
1768       puts_filtered (name);
1769       puts_filtered ("\n");
1770     }
1771   push_target (target);         /* Switch to using remote target now */
1772
1773   init_packet_config (&remote_protocol_P);
1774   init_packet_config (&remote_protocol_Z);
1775   
1776   general_thread = -2;
1777   continue_thread = -2;
1778
1779   /* Force remote_write_bytes to check whether target supports
1780      binary downloading. */
1781   init_packet_config (&remote_protocol_binary_download);
1782
1783   /* Without this, some commands which require an active target (such
1784      as kill) won't work.  This variable serves (at least) double duty
1785      as both the pid of the target process (if it has such), and as a
1786      flag indicating that a target is active.  These functions should
1787      be split out into seperate variables, especially since GDB will
1788      someday have a notion of debugging several processes.  */
1789
1790   inferior_pid = MAGIC_NULL_PID;
1791   /* Start the remote connection; if error (0), discard this target.
1792      In particular, if the user quits, be sure to discard it
1793      (we'd be in an inconsistent state otherwise).  */
1794   if (!catch_errors (remote_start_remote, NULL,
1795                      "Couldn't establish connection to remote target\n",
1796                      RETURN_MASK_ALL))
1797     {
1798       pop_target ();
1799       return;
1800     }
1801
1802   if (extended_p)
1803     {
1804       /* tell the remote that we're using the extended protocol.  */
1805       char *buf = alloca (PBUFSIZ);
1806       putpkt ("!");
1807       getpkt (buf, 0);
1808     }
1809 }
1810
1811 /* Just like remote_open but with asynchronous support. */
1812 static void
1813 remote_async_open_1 (name, from_tty, target, extended_p)
1814      char *name;
1815      int from_tty;
1816      struct target_ops *target;
1817      int extended_p;
1818 {
1819   if (name == 0)
1820     error ("To open a remote debug connection, you need to specify what\n\
1821 serial device is attached to the remote system (e.g. /dev/ttya).");
1822
1823   target_preopen (from_tty);
1824
1825   unpush_target (target);
1826
1827   remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
1828
1829   remote_desc = SERIAL_OPEN (name);
1830   if (!remote_desc)
1831     perror_with_name (name);
1832
1833   if (baud_rate != -1)
1834     {
1835       if (SERIAL_SETBAUDRATE (remote_desc, baud_rate))
1836         {
1837           SERIAL_CLOSE (remote_desc);
1838           perror_with_name (name);
1839         }
1840     }
1841
1842   SERIAL_RAW (remote_desc);
1843
1844   /* If there is something sitting in the buffer we might take it as a
1845      response to a command, which would be bad.  */
1846   SERIAL_FLUSH_INPUT (remote_desc);
1847
1848   if (from_tty)
1849     {
1850       puts_filtered ("Remote debugging using ");
1851       puts_filtered (name);
1852       puts_filtered ("\n");
1853     }
1854
1855   push_target (target);         /* Switch to using remote target now */
1856
1857   init_packet_config (&remote_protocol_P);
1858   init_packet_config (&remote_protocol_Z);
1859
1860   general_thread = -2;
1861   continue_thread = -2;
1862
1863   /* Force remote_write_bytes to check whether target supports
1864      binary downloading. */
1865   init_packet_config (&remote_protocol_binary_download);
1866
1867   /* Without this, some commands which require an active target (such
1868      as kill) won't work.  This variable serves (at least) double duty
1869      as both the pid of the target process (if it has such), and as a
1870      flag indicating that a target is active.  These functions should
1871      be split out into seperate variables, especially since GDB will
1872      someday have a notion of debugging several processes.  */
1873   inferior_pid = MAGIC_NULL_PID;
1874
1875   /* With this target we start out by owning the terminal. */
1876   remote_async_terminal_ours_p = 1;
1877
1878   /* FIXME: cagney/1999-09-23: During the initial connection it is
1879      assumed that the target is already ready and able to respond to
1880      requests. Unfortunatly remote_start_remote() eventually calls
1881      wait_for_inferior() with no timeout.  wait_forever_enabled_p gets
1882      around this. Eventually a mechanism that allows
1883      wait_for_inferior() to expect/get timeouts will be
1884      implemented. */
1885   wait_forever_enabled_p = 0;
1886
1887   /* Start the remote connection; if error (0), discard this target.
1888      In particular, if the user quits, be sure to discard it
1889      (we'd be in an inconsistent state otherwise).  */
1890   if (!catch_errors (remote_start_remote, NULL,
1891                      "Couldn't establish connection to remote target\n",
1892                      RETURN_MASK_ALL))
1893     {
1894       pop_target ();
1895       wait_forever_enabled_p = 1;
1896       return;
1897     }
1898
1899   wait_forever_enabled_p = 1;
1900
1901   if (extended_p)
1902     {
1903       /* tell the remote that we're using the extended protocol.  */
1904       char *buf = alloca (PBUFSIZ);
1905       putpkt ("!");
1906       getpkt (buf, 0);
1907     }
1908 }
1909
1910 /* This takes a program previously attached to and detaches it.  After
1911    this is done, GDB can be used to debug some other program.  We
1912    better not have left any breakpoints in the target program or it'll
1913    die when it hits one.  */
1914
1915 static void
1916 remote_detach (args, from_tty)
1917      char *args;
1918      int from_tty;
1919 {
1920   char *buf = alloca (PBUFSIZ);
1921
1922   if (args)
1923     error ("Argument given to \"detach\" when remotely debugging.");
1924
1925   /* Tell the remote target to detach.  */
1926   strcpy (buf, "D");
1927   remote_send (buf);
1928
1929   pop_target ();
1930   if (from_tty)
1931     puts_filtered ("Ending remote debugging.\n");
1932
1933 }
1934
1935 /* Same as remote_detach, but with async support. */
1936 static void
1937 remote_async_detach (args, from_tty)
1938      char *args;
1939      int from_tty;
1940 {
1941   char *buf = alloca (PBUFSIZ);
1942
1943   if (args)
1944     error ("Argument given to \"detach\" when remotely debugging.");
1945
1946   /* Tell the remote target to detach.  */
1947   strcpy (buf, "D");
1948   remote_send (buf);
1949
1950   /* Unregister the file descriptor from the event loop. */
1951   if (SERIAL_IS_ASYNC_P (remote_desc))
1952     SERIAL_ASYNC (remote_desc, NULL, 0);
1953
1954   pop_target ();
1955   if (from_tty)
1956     puts_filtered ("Ending remote debugging.\n");
1957 }
1958
1959 /* Convert hex digit A to a number.  */
1960
1961 int
1962 fromhex (a)
1963      int a;
1964 {
1965   if (a >= '0' && a <= '9')
1966     return a - '0';
1967   else if (a >= 'a' && a <= 'f')
1968     return a - 'a' + 10;
1969   else if (a >= 'A' && a <= 'F')
1970     return a - 'A' + 10;
1971   else
1972     error ("Reply contains invalid hex digit %d", a);
1973 }
1974
1975 /* Convert number NIB to a hex digit.  */
1976
1977 static int
1978 tohex (nib)
1979      int nib;
1980 {
1981   if (nib < 10)
1982     return '0' + nib;
1983   else
1984     return 'a' + nib - 10;
1985 }
1986 \f
1987 /* Tell the remote machine to resume.  */
1988
1989 static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
1990
1991 static int last_sent_step;
1992
1993 static void
1994 remote_resume (pid, step, siggnal)
1995      int pid, step;
1996      enum target_signal siggnal;
1997 {
1998   char *buf = alloca (PBUFSIZ);
1999
2000   if (pid == -1)
2001     set_thread (0, 0);          /* run any thread */
2002   else
2003     set_thread (pid, 0);        /* run this thread */
2004
2005   dcache_flush (remote_dcache);
2006
2007   last_sent_signal = siggnal;
2008   last_sent_step = step;
2009
2010   /* A hook for when we need to do something at the last moment before
2011      resumption.  */
2012   if (target_resume_hook)
2013     (*target_resume_hook) ();
2014
2015   if (siggnal != TARGET_SIGNAL_0)
2016     {
2017       buf[0] = step ? 'S' : 'C';
2018       buf[1] = tohex (((int) siggnal >> 4) & 0xf);
2019       buf[2] = tohex ((int) siggnal & 0xf);
2020       buf[3] = '\0';
2021     }
2022   else
2023     strcpy (buf, step ? "s" : "c");
2024
2025   putpkt (buf);
2026 }
2027
2028 /* Same as remote_resume, but with async support. */
2029 static void
2030 remote_async_resume (pid, step, siggnal)
2031      int pid, step;
2032      enum target_signal siggnal;
2033 {
2034   char *buf = alloca (PBUFSIZ);
2035
2036   if (pid == -1)
2037     set_thread (0, 0);          /* run any thread */
2038   else
2039     set_thread (pid, 0);        /* run this thread */
2040
2041   dcache_flush (remote_dcache);
2042
2043   last_sent_signal = siggnal;
2044   last_sent_step = step;
2045
2046   /* A hook for when we need to do something at the last moment before
2047      resumption.  */
2048   if (target_resume_hook)
2049     (*target_resume_hook) ();
2050
2051   if (siggnal != TARGET_SIGNAL_0)
2052     {
2053       buf[0] = step ? 'S' : 'C';
2054       buf[1] = tohex (((int) siggnal >> 4) & 0xf);
2055       buf[2] = tohex ((int) siggnal & 0xf);
2056       buf[3] = '\0';
2057     }
2058   else
2059     strcpy (buf, step ? "s" : "c");
2060
2061   /* We are about to start executing the inferior, let's register it
2062      with the event loop. NOTE: this is the one place where all the
2063      execution commands end up. We could alternatively do this in each
2064      of the execution commands in infcmd.c.*/
2065   /* FIXME: ezannoni 1999-09-28: We may need to move this out of here
2066      into infcmd.c in order to allow inferior function calls to work
2067      NOT asynchronously. */
2068   if (event_loop_p && SERIAL_CAN_ASYNC_P (remote_desc))
2069     target_async (inferior_event_handler, 0);
2070   /* Tell the world that the target is now executing. */
2071   /* FIXME: cagney/1999-09-23: Is it the targets responsibility to set
2072      this?  Instead, should the client of target just assume (for
2073      async targets) that the target is going to start executing?  Is
2074      this information already found in the continuation block?  */
2075   if (SERIAL_IS_ASYNC_P (remote_desc))
2076     target_executing = 1;
2077   putpkt (buf);
2078 }
2079 \f
2080
2081 /* Set up the signal handler for SIGINT, while the target is
2082    executing, ovewriting the 'regular' SIGINT signal handler. */
2083 static void
2084 initialize_sigint_signal_handler ()
2085 {
2086   sigint_remote_token =
2087     create_async_signal_handler (async_remote_interrupt, NULL);
2088   signal (SIGINT, handle_remote_sigint);
2089 }
2090
2091 /* Signal handler for SIGINT, while the target is executing. */
2092 static void
2093 handle_remote_sigint (sig)
2094      int sig;
2095 {
2096   signal (sig, handle_remote_sigint_twice);
2097   sigint_remote_twice_token =
2098     create_async_signal_handler (async_remote_interrupt_twice, NULL);
2099   mark_async_signal_handler_wrapper (sigint_remote_token);
2100 }
2101
2102 /* Signal handler for SIGINT, installed after SIGINT has already been
2103    sent once.  It will take effect the second time that the user sends
2104    a ^C. */
2105 static void
2106 handle_remote_sigint_twice (sig)
2107      int sig;
2108 {
2109   signal (sig, handle_sigint);
2110   sigint_remote_twice_token =
2111     create_async_signal_handler (inferior_event_handler_wrapper, NULL);
2112   mark_async_signal_handler_wrapper (sigint_remote_twice_token);
2113 }
2114
2115 /* Perform the real interruption of the target execution, in response
2116    to a ^C. */
2117 static void
2118 async_remote_interrupt (arg)
2119      gdb_client_data arg;
2120 {
2121   if (remote_debug)
2122     fprintf_unfiltered (gdb_stdlog, "remote_interrupt called\n");
2123
2124   target_stop ();
2125 }
2126
2127 /* Perform interrupt, if the first attempt did not succeed. Just give
2128    up on the target alltogether. */
2129 void
2130 async_remote_interrupt_twice (arg)
2131      gdb_client_data arg;
2132 {
2133   if (remote_debug)
2134     fprintf_unfiltered (gdb_stdlog, "remote_interrupt_twice called\n");
2135   /* Do something only if the target was not killed by the previous
2136      cntl-C. */
2137   if (target_executing)
2138     {
2139       interrupt_query ();
2140       signal (SIGINT, handle_remote_sigint);
2141     }
2142 }
2143
2144 /* Reinstall the usual SIGINT handlers, after the target has
2145    stopped. */
2146 static void
2147 cleanup_sigint_signal_handler (void *dummy)
2148 {
2149   signal (SIGINT, handle_sigint);
2150   if (sigint_remote_twice_token)
2151     delete_async_signal_handler ((struct async_signal_handler **) & sigint_remote_twice_token);
2152   if (sigint_remote_token)
2153     delete_async_signal_handler ((struct async_signal_handler **) & sigint_remote_token);
2154 }
2155
2156 /* Send ^C to target to halt it.  Target will respond, and send us a
2157    packet.  */
2158 static void (*ofunc) PARAMS ((int));
2159
2160 /* The command line interface's stop routine. This function is installed
2161    as a signal handler for SIGINT. The first time a user requests a
2162    stop, we call remote_stop to send a break or ^C. If there is no
2163    response from the target (it didn't stop when the user requested it),
2164    we ask the user if he'd like to detach from the target. */
2165 static void
2166 remote_interrupt (signo)
2167      int signo;
2168 {
2169   /* If this doesn't work, try more severe steps. */
2170   signal (signo, remote_interrupt_twice);
2171
2172   if (remote_debug)
2173     fprintf_unfiltered (gdb_stdlog, "remote_interrupt called\n");
2174
2175   target_stop ();
2176 }
2177
2178 /* The user typed ^C twice.  */
2179
2180 static void
2181 remote_interrupt_twice (signo)
2182      int signo;
2183 {
2184   signal (signo, ofunc);
2185   interrupt_query ();
2186   signal (signo, remote_interrupt);
2187 }
2188
2189 /* This is the generic stop called via the target vector. When a target
2190    interrupt is requested, either by the command line or the GUI, we
2191    will eventually end up here. */
2192 static void
2193 remote_stop ()
2194 {
2195   /* Send a break or a ^C, depending on user preference.  */
2196   if (remote_debug)
2197     fprintf_unfiltered (gdb_stdlog, "remote_stop called\n");
2198
2199   if (remote_break)
2200     SERIAL_SEND_BREAK (remote_desc);
2201   else
2202     SERIAL_WRITE (remote_desc, "\003", 1);
2203 }
2204
2205 /* Ask the user what to do when an interrupt is received.  */
2206
2207 static void
2208 interrupt_query ()
2209 {
2210   target_terminal_ours ();
2211
2212   if (query ("Interrupted while waiting for the program.\n\
2213 Give up (and stop debugging it)? "))
2214     {
2215       target_mourn_inferior ();
2216       return_to_top_level (RETURN_QUIT);
2217     }
2218
2219   target_terminal_inferior ();
2220 }
2221
2222 /* Enable/disable target terminal ownership.  Most targets can use
2223    terminal groups to control terminal ownership.  Remote targets are
2224    different in that explicit transfer of ownership to/from GDB/target
2225    is required. */
2226
2227 static void
2228 remote_async_terminal_inferior (void)
2229 {
2230   /* FIXME: cagney/1999-09-27: Shouldn't need to test for
2231      sync_execution here.  This function should only be called when
2232      GDB is resuming the inferior in the forground.  A background
2233      resume (``run&'') should leave GDB in control of the terminal and
2234      consequently should not call this code. */
2235   if (!sync_execution)
2236     return;
2237   /* FIXME: cagney/1999-09-27: Closely related to the above.  Make
2238      calls target_terminal_*() idenpotent. The event-loop GDB talking
2239      to an asynchronous target with a synchronous command calls this
2240      function from both event-top.c and infrun.c/infcmd.c.  Once GDB
2241      stops trying to transfer the terminal to the target when it
2242      shouldn't this guard can go away.  */
2243   if (!remote_async_terminal_ours_p)
2244     return;
2245   delete_file_handler (input_fd);
2246   remote_async_terminal_ours_p = 0;
2247   initialize_sigint_signal_handler ();
2248   /* NOTE: At this point we could also register our selves as the
2249      recipient of all input.  Any characters typed could then be
2250      passed on down to the target. */
2251 }
2252
2253 static void
2254 remote_async_terminal_ours (void)
2255 {
2256   /* See FIXME in remote_async_terminal_inferior. */
2257   if (!sync_execution)
2258     return;
2259   /* See FIXME in remote_async_terminal_inferior. */
2260   if (remote_async_terminal_ours_p)
2261     return;
2262   cleanup_sigint_signal_handler (NULL);
2263   add_file_handler (input_fd, stdin_event_handler, 0);
2264   remote_async_terminal_ours_p = 1;
2265 }
2266
2267 /* If nonzero, ignore the next kill.  */
2268
2269 int kill_kludge;
2270
2271 void
2272 remote_console_output (msg)
2273      char *msg;
2274 {
2275   char *p;
2276
2277   for (p = msg; p[0] && p[1]; p += 2)
2278     {
2279       char tb[2];
2280       char c = fromhex (p[0]) * 16 + fromhex (p[1]);
2281       tb[0] = c;
2282       tb[1] = 0;
2283       fputs_unfiltered (tb, gdb_stdtarg);
2284     }
2285 }
2286
2287 /* Wait until the remote machine stops, then return,
2288    storing status in STATUS just as `wait' would.
2289    Returns "pid", which in the case of a multi-threaded 
2290    remote OS, is the thread-id.  */
2291
2292 static int
2293 remote_wait (pid, status)
2294      int pid;
2295      struct target_waitstatus *status;
2296 {
2297   unsigned char *buf = alloca (PBUFSIZ);
2298   int thread_num = -1;
2299
2300   status->kind = TARGET_WAITKIND_EXITED;
2301   status->value.integer = 0;
2302
2303   while (1)
2304     {
2305       unsigned char *p;
2306
2307       ofunc = signal (SIGINT, remote_interrupt);
2308       getpkt ((char *) buf, 1);
2309       signal (SIGINT, ofunc);
2310
2311       /* This is a hook for when we need to do something (perhaps the
2312          collection of trace data) every time the target stops.  */
2313       if (target_wait_loop_hook)
2314         (*target_wait_loop_hook) ();
2315
2316       switch (buf[0])
2317         {
2318         case 'E':               /* Error of some sort */
2319           warning ("Remote failure reply: %s", buf);
2320           continue;
2321         case 'T':               /* Status with PC, SP, FP, ... */
2322           {
2323             int i;
2324             long regno;
2325             char regs[MAX_REGISTER_RAW_SIZE];
2326
2327             /* Expedited reply, containing Signal, {regno, reg} repeat */
2328             /*  format is:  'Tssn...:r...;n...:r...;n...:r...;#cc', where
2329                ss = signal number
2330                n... = register number
2331                r... = register contents
2332              */
2333             p = &buf[3];        /* after Txx */
2334
2335             while (*p)
2336               {
2337                 unsigned char *p1;
2338                 char *p_temp;
2339
2340                 /* Read the register number */
2341                 regno = strtol ((const char *) p, &p_temp, 16);
2342                 p1 = (unsigned char *) p_temp;
2343
2344                 if (p1 == p)    /* No register number present here */
2345                   {
2346                     p1 = (unsigned char *) strchr ((const char *) p, ':');
2347                     if (p1 == NULL)
2348                       warning ("Malformed packet(a) (missing colon): %s\n\
2349 Packet: '%s'\n",
2350                                p, buf);
2351                     if (strncmp ((const char *) p, "thread", p1 - p) == 0)
2352                       {
2353                         p_temp = unpack_varlen_hex (++p1, &thread_num);
2354                         record_currthread (thread_num);
2355                         p = (unsigned char *) p_temp;
2356                       }
2357                   }
2358                 else
2359                   {
2360                     p = p1;
2361
2362                     if (*p++ != ':')
2363                       warning ("Malformed packet(b) (missing colon): %s\n\
2364 Packet: '%s'\n",
2365                                p, buf);
2366
2367                     if (regno >= NUM_REGS)
2368                       warning ("Remote sent bad register number %ld: %s\n\
2369 Packet: '%s'\n",
2370                                regno, p, buf);
2371
2372                     for (i = 0; i < REGISTER_RAW_SIZE (regno); i++)
2373                       {
2374                         if (p[0] == 0 || p[1] == 0)
2375                           warning ("Remote reply is too short: %s", buf);
2376                         regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
2377                         p += 2;
2378                       }
2379                     supply_register (regno, regs);
2380                   }
2381
2382                 if (*p++ != ';')
2383                   {
2384                     warning ("Remote register badly formatted: %s", buf);
2385                     warning ("            here: %s", p);
2386                   }
2387               }
2388           }
2389           /* fall through */
2390         case 'S':               /* Old style status, just signal only */
2391           status->kind = TARGET_WAITKIND_STOPPED;
2392           status->value.sig = (enum target_signal)
2393             (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
2394
2395           if (buf[3] == 'p')
2396             {
2397               /* Export Cisco kernel mode as a convenience variable
2398                  (so that it can be used in the GDB prompt if desired). */
2399
2400               if (cisco_kernel_mode == 1)
2401                 set_internalvar (lookup_internalvar ("cisco_kernel_mode"),
2402                                  value_from_string ("PDEBUG-"));
2403               cisco_kernel_mode = 0;
2404               thread_num = strtol ((const char *) &buf[4], NULL, 16);
2405               record_currthread (thread_num);
2406             }
2407           else if (buf[3] == 'k')
2408             {
2409               /* Export Cisco kernel mode as a convenience variable
2410                  (so that it can be used in the GDB prompt if desired). */
2411
2412               if (cisco_kernel_mode == 1)
2413                 set_internalvar (lookup_internalvar ("cisco_kernel_mode"),
2414                                  value_from_string ("KDEBUG-"));
2415               cisco_kernel_mode = 1;
2416             }
2417           goto got_status;
2418         case 'N':               /* Cisco special: status and offsets */
2419           {
2420             bfd_vma text_addr, data_addr, bss_addr;
2421             bfd_signed_vma text_off, data_off, bss_off;
2422             unsigned char *p1;
2423
2424             status->kind = TARGET_WAITKIND_STOPPED;
2425             status->value.sig = (enum target_signal)
2426               (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
2427
2428             if (symfile_objfile == NULL)
2429               {
2430                 warning ("Relocation packet received with no symbol file.  \
2431 Packet Dropped");
2432                 goto got_status;
2433               }
2434
2435             /* Relocate object file.  Buffer format is NAATT;DD;BB
2436              * where AA is the signal number, TT is the new text
2437              * address, DD * is the new data address, and BB is the
2438              * new bss address.  */
2439
2440             p = &buf[3];
2441             text_addr = strtoul (p, (char **) &p1, 16);
2442             if (p1 == p || *p1 != ';')
2443               warning ("Malformed relocation packet: Packet '%s'", buf);
2444             p = p1 + 1;
2445             data_addr = strtoul (p, (char **) &p1, 16);
2446             if (p1 == p || *p1 != ';')
2447               warning ("Malformed relocation packet: Packet '%s'", buf);
2448             p = p1 + 1;
2449             bss_addr = strtoul (p, (char **) &p1, 16);
2450             if (p1 == p)
2451               warning ("Malformed relocation packet: Packet '%s'", buf);
2452
2453             if (remote_cisco_section_offsets (text_addr, data_addr, bss_addr,
2454                                               &text_off, &data_off, &bss_off)
2455                 == 0)
2456               if (text_off != 0 || data_off != 0 || bss_off != 0)
2457                 remote_cisco_objfile_relocate (text_off, data_off, bss_off);
2458
2459             goto got_status;
2460           }
2461         case 'W':               /* Target exited */
2462           {
2463             /* The remote process exited.  */
2464             status->kind = TARGET_WAITKIND_EXITED;
2465             status->value.integer = (fromhex (buf[1]) << 4) + fromhex (buf[2]);
2466             goto got_status;
2467           }
2468         case 'X':
2469           status->kind = TARGET_WAITKIND_SIGNALLED;
2470           status->value.sig = (enum target_signal)
2471             (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
2472           kill_kludge = 1;
2473
2474           goto got_status;
2475         case 'O':               /* Console output */
2476           remote_console_output (buf + 1);
2477           continue;
2478         case '\0':
2479           if (last_sent_signal != TARGET_SIGNAL_0)
2480             {
2481               /* Zero length reply means that we tried 'S' or 'C' and
2482                  the remote system doesn't support it.  */
2483               target_terminal_ours_for_output ();
2484               printf_filtered
2485                 ("Can't send signals to this remote system.  %s not sent.\n",
2486                  target_signal_to_name (last_sent_signal));
2487               last_sent_signal = TARGET_SIGNAL_0;
2488               target_terminal_inferior ();
2489
2490               strcpy ((char *) buf, last_sent_step ? "s" : "c");
2491               putpkt ((char *) buf);
2492               continue;
2493             }
2494           /* else fallthrough */
2495         default:
2496           warning ("Invalid remote reply: %s", buf);
2497           continue;
2498         }
2499     }
2500 got_status:
2501   if (thread_num != -1)
2502     {
2503       return thread_num;
2504     }
2505   return inferior_pid;
2506 }
2507
2508 /* Async version of remote_wait. */
2509 static int
2510 remote_async_wait (pid, status)
2511      int pid;
2512      struct target_waitstatus *status;
2513 {
2514   unsigned char *buf = alloca (PBUFSIZ);
2515   int thread_num = -1;
2516
2517   status->kind = TARGET_WAITKIND_EXITED;
2518   status->value.integer = 0;
2519
2520   while (1)
2521     {
2522       unsigned char *p;
2523
2524       if (!SERIAL_IS_ASYNC_P (remote_desc))
2525         ofunc = signal (SIGINT, remote_interrupt);
2526       /* FIXME: cagney/1999-09-27: If we're in async mode we should
2527          _never_ wait for ever -> test on target_is_async_p().
2528          However, before we do that we need to ensure that the caller
2529          knows how to take the target into/out of async mode. */
2530       getpkt ((char *) buf, wait_forever_enabled_p);
2531       if (!SERIAL_IS_ASYNC_P (remote_desc))
2532         signal (SIGINT, ofunc);
2533
2534       /* This is a hook for when we need to do something (perhaps the
2535          collection of trace data) every time the target stops.  */
2536       if (target_wait_loop_hook)
2537         (*target_wait_loop_hook) ();
2538
2539       switch (buf[0])
2540         {
2541         case 'E':               /* Error of some sort */
2542           warning ("Remote failure reply: %s", buf);
2543           continue;
2544         case 'T':               /* Status with PC, SP, FP, ... */
2545           {
2546             int i;
2547             long regno;
2548             char regs[MAX_REGISTER_RAW_SIZE];
2549
2550             /* Expedited reply, containing Signal, {regno, reg} repeat */
2551             /*  format is:  'Tssn...:r...;n...:r...;n...:r...;#cc', where
2552                ss = signal number
2553                n... = register number
2554                r... = register contents
2555              */
2556             p = &buf[3];        /* after Txx */
2557
2558             while (*p)
2559               {
2560                 unsigned char *p1;
2561                 char *p_temp;
2562
2563                 /* Read the register number */
2564                 regno = strtol ((const char *) p, &p_temp, 16);
2565                 p1 = (unsigned char *) p_temp;
2566
2567                 if (p1 == p)    /* No register number present here */
2568                   {
2569                     p1 = (unsigned char *) strchr ((const char *) p, ':');
2570                     if (p1 == NULL)
2571                       warning ("Malformed packet(a) (missing colon): %s\n\
2572 Packet: '%s'\n",
2573                                p, buf);
2574                     if (strncmp ((const char *) p, "thread", p1 - p) == 0)
2575                       {
2576                         p_temp = unpack_varlen_hex (++p1, &thread_num);
2577                         record_currthread (thread_num);
2578                         p = (unsigned char *) p_temp;
2579                       }
2580                   }
2581                 else
2582                   {
2583                     p = p1;
2584
2585                     if (*p++ != ':')
2586                       warning ("Malformed packet(b) (missing colon): %s\n\
2587 Packet: '%s'\n",
2588                                p, buf);
2589
2590                     if (regno >= NUM_REGS)
2591                       warning ("Remote sent bad register number %ld: %s\n\
2592 Packet: '%s'\n",
2593                                regno, p, buf);
2594
2595                     for (i = 0; i < REGISTER_RAW_SIZE (regno); i++)
2596                       {
2597                         if (p[0] == 0 || p[1] == 0)
2598                           warning ("Remote reply is too short: %s", buf);
2599                         regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
2600                         p += 2;
2601                       }
2602                     supply_register (regno, regs);
2603                   }
2604
2605                 if (*p++ != ';')
2606                   {
2607                     warning ("Remote register badly formatted: %s", buf);
2608                     warning ("            here: %s", p);
2609                   }
2610               }
2611           }
2612           /* fall through */
2613         case 'S':               /* Old style status, just signal only */
2614           status->kind = TARGET_WAITKIND_STOPPED;
2615           status->value.sig = (enum target_signal)
2616             (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
2617
2618           if (buf[3] == 'p')
2619             {
2620               /* Export Cisco kernel mode as a convenience variable
2621                  (so that it can be used in the GDB prompt if desired). */
2622
2623               if (cisco_kernel_mode == 1)
2624                 set_internalvar (lookup_internalvar ("cisco_kernel_mode"),
2625                                  value_from_string ("PDEBUG-"));
2626               cisco_kernel_mode = 0;
2627               thread_num = strtol ((const char *) &buf[4], NULL, 16);
2628               record_currthread (thread_num);
2629             }
2630           else if (buf[3] == 'k')
2631             {
2632               /* Export Cisco kernel mode as a convenience variable
2633                  (so that it can be used in the GDB prompt if desired). */
2634
2635               if (cisco_kernel_mode == 1)
2636                 set_internalvar (lookup_internalvar ("cisco_kernel_mode"),
2637                                  value_from_string ("KDEBUG-"));
2638               cisco_kernel_mode = 1;
2639             }
2640           goto got_status;
2641         case 'N':               /* Cisco special: status and offsets */
2642           {
2643             bfd_vma text_addr, data_addr, bss_addr;
2644             bfd_signed_vma text_off, data_off, bss_off;
2645             unsigned char *p1;
2646
2647             status->kind = TARGET_WAITKIND_STOPPED;
2648             status->value.sig = (enum target_signal)
2649               (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
2650
2651             if (symfile_objfile == NULL)
2652               {
2653                 warning ("Relocation packet recieved with no symbol file.  \
2654 Packet Dropped");
2655                 goto got_status;
2656               }
2657
2658             /* Relocate object file.  Buffer format is NAATT;DD;BB
2659              * where AA is the signal number, TT is the new text
2660              * address, DD * is the new data address, and BB is the
2661              * new bss address.  */
2662
2663             p = &buf[3];
2664             text_addr = strtoul (p, (char **) &p1, 16);
2665             if (p1 == p || *p1 != ';')
2666               warning ("Malformed relocation packet: Packet '%s'", buf);
2667             p = p1 + 1;
2668             data_addr = strtoul (p, (char **) &p1, 16);
2669             if (p1 == p || *p1 != ';')
2670               warning ("Malformed relocation packet: Packet '%s'", buf);
2671             p = p1 + 1;
2672             bss_addr = strtoul (p, (char **) &p1, 16);
2673             if (p1 == p)
2674               warning ("Malformed relocation packet: Packet '%s'", buf);
2675
2676             if (remote_cisco_section_offsets (text_addr, data_addr, bss_addr,
2677                                               &text_off, &data_off, &bss_off)
2678                 == 0)
2679               if (text_off != 0 || data_off != 0 || bss_off != 0)
2680                 remote_cisco_objfile_relocate (text_off, data_off, bss_off);
2681
2682             goto got_status;
2683           }
2684         case 'W':               /* Target exited */
2685           {
2686             /* The remote process exited.  */
2687             status->kind = TARGET_WAITKIND_EXITED;
2688             status->value.integer = (fromhex (buf[1]) << 4) + fromhex (buf[2]);
2689             goto got_status;
2690           }
2691         case 'X':
2692           status->kind = TARGET_WAITKIND_SIGNALLED;
2693           status->value.sig = (enum target_signal)
2694             (((fromhex (buf[1])) << 4) + (fromhex (buf[2])));
2695           kill_kludge = 1;
2696
2697           goto got_status;
2698         case 'O':               /* Console output */
2699           remote_console_output (buf + 1);
2700           continue;
2701         case '\0':
2702           if (last_sent_signal != TARGET_SIGNAL_0)
2703             {
2704               /* Zero length reply means that we tried 'S' or 'C' and
2705                  the remote system doesn't support it.  */
2706               target_terminal_ours_for_output ();
2707               printf_filtered
2708                 ("Can't send signals to this remote system.  %s not sent.\n",
2709                  target_signal_to_name (last_sent_signal));
2710               last_sent_signal = TARGET_SIGNAL_0;
2711               target_terminal_inferior ();
2712
2713               strcpy ((char *) buf, last_sent_step ? "s" : "c");
2714               putpkt ((char *) buf);
2715               continue;
2716             }
2717           /* else fallthrough */
2718         default:
2719           warning ("Invalid remote reply: %s", buf);
2720           continue;
2721         }
2722     }
2723 got_status:
2724   if (thread_num != -1)
2725     {
2726       return thread_num;
2727     }
2728   return inferior_pid;
2729 }
2730
2731 /* Number of bytes of registers this stub implements.  */
2732
2733 static int register_bytes_found;
2734
2735 /* Read the remote registers into the block REGS.  */
2736 /* Currently we just read all the registers, so we don't use regno.  */
2737
2738 /* ARGSUSED */
2739 static void
2740 remote_fetch_registers (regno)
2741      int regno;
2742 {
2743   char *buf = alloca (PBUFSIZ);
2744   int i;
2745   char *p;
2746   char regs[REGISTER_BYTES];
2747
2748   set_thread (inferior_pid, 1);
2749
2750   sprintf (buf, "g");
2751   remote_send (buf);
2752
2753   if (remote_register_buf_size == 0)
2754     remote_register_buf_size = strlen (buf);
2755
2756   /* Unimplemented registers read as all bits zero.  */
2757   memset (regs, 0, REGISTER_BYTES);
2758
2759   /* We can get out of synch in various cases.  If the first character
2760      in the buffer is not a hex character, assume that has happened
2761      and try to fetch another packet to read.  */
2762   while ((buf[0] < '0' || buf[0] > '9')
2763          && (buf[0] < 'a' || buf[0] > 'f')
2764          && buf[0] != 'x')      /* New: unavailable register value */
2765     {
2766       if (remote_debug)
2767         fprintf_unfiltered (gdb_stdlog,
2768                             "Bad register packet; fetching a new packet\n");
2769       getpkt (buf, 0);
2770     }
2771
2772   /* Reply describes registers byte by byte, each byte encoded as two
2773      hex characters.  Suck them all up, then supply them to the
2774      register cacheing/storage mechanism.  */
2775
2776   p = buf;
2777   for (i = 0; i < REGISTER_BYTES; i++)
2778     {
2779       if (p[0] == 0)
2780         break;
2781       if (p[1] == 0)
2782         {
2783           warning ("Remote reply is of odd length: %s", buf);
2784           /* Don't change register_bytes_found in this case, and don't
2785              print a second warning.  */
2786           goto supply_them;
2787         }
2788       if (p[0] == 'x' && p[1] == 'x')
2789         regs[i] = 0;            /* 'x' */
2790       else
2791         regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
2792       p += 2;
2793     }
2794
2795   if (i != register_bytes_found)
2796     {
2797       register_bytes_found = i;
2798 #ifdef REGISTER_BYTES_OK
2799       if (!REGISTER_BYTES_OK (i))
2800         warning ("Remote reply is too short: %s", buf);
2801 #endif
2802     }
2803
2804 supply_them:
2805   for (i = 0; i < NUM_REGS; i++)
2806     {
2807       supply_register (i, &regs[REGISTER_BYTE (i)]);
2808       if (buf[REGISTER_BYTE (i) * 2] == 'x')
2809         register_valid[i] = -1; /* register value not available */
2810     }
2811 }
2812
2813 /* Prepare to store registers.  Since we may send them all (using a
2814    'G' request), we have to read out the ones we don't want to change
2815    first.  */
2816
2817 static void
2818 remote_prepare_to_store ()
2819 {
2820   /* Make sure the entire registers array is valid.  */
2821   switch (remote_protocol_P.support)
2822     {
2823     case PACKET_DISABLE:
2824     case PACKET_SUPPORT_UNKNOWN:
2825       read_register_bytes (0, (char *) NULL, REGISTER_BYTES);
2826       break;
2827     case PACKET_ENABLE:
2828       break;
2829     }
2830 }
2831
2832 /* Helper: Attempt to store REGNO using the P packet.  Return fail IFF
2833    packet was not recognized. */
2834
2835 static int
2836 store_register_using_P (regno)
2837      int regno;
2838 {
2839   /* Try storing a single register.  */
2840   char *buf = alloca (PBUFSIZ);
2841   char *regp;
2842   char *p;
2843   int i;
2844
2845   sprintf (buf, "P%x=", regno);
2846   p = buf + strlen (buf);
2847   regp = &registers[REGISTER_BYTE (regno)];
2848   for (i = 0; i < REGISTER_RAW_SIZE (regno); ++i)
2849     {
2850       *p++ = tohex ((regp[i] >> 4) & 0xf);
2851       *p++ = tohex (regp[i] & 0xf);
2852     }
2853   *p = '\0';
2854   remote_send (buf);
2855
2856   return buf[0] != '\0';
2857 }
2858
2859
2860 /* Store register REGNO, or all registers if REGNO == -1, from the contents
2861    of REGISTERS.  FIXME: ignores errors.  */
2862
2863 static void
2864 remote_store_registers (regno)
2865      int regno;
2866 {
2867   char *buf = alloca (PBUFSIZ);
2868   int i;
2869   char *p;
2870
2871   set_thread (inferior_pid, 1);
2872
2873   if (regno >= 0)
2874     {
2875       switch (remote_protocol_P.support)
2876         {
2877         case PACKET_DISABLE:
2878           break;
2879         case PACKET_ENABLE:
2880           if (store_register_using_P (regno))
2881             return;
2882           else
2883             error ("Protocol error: P packet not recognized by stub");
2884         case PACKET_SUPPORT_UNKNOWN:
2885           if (store_register_using_P (regno))
2886             {
2887               /* The stub recognized the 'P' packet.  Remember this.  */
2888               remote_protocol_P.support = PACKET_ENABLE;
2889               return;
2890             }
2891           else
2892             {
2893               /* The stub does not support the 'P' packet.  Use 'G'
2894                  instead, and don't try using 'P' in the future (it
2895                  will just waste our time).  */
2896               remote_protocol_P.support = PACKET_DISABLE;
2897               break;
2898             }
2899         }
2900     }
2901
2902   buf[0] = 'G';
2903
2904   /* Command describes registers byte by byte,
2905      each byte encoded as two hex characters.  */
2906
2907   p = buf + 1;
2908   /* remote_prepare_to_store insures that register_bytes_found gets set.  */
2909   for (i = 0; i < register_bytes_found; i++)
2910     {
2911       *p++ = tohex ((registers[i] >> 4) & 0xf);
2912       *p++ = tohex (registers[i] & 0xf);
2913     }
2914   *p = '\0';
2915
2916   remote_send (buf);
2917 }
2918
2919 /* Use of the data cache *used* to be disabled because it loses for looking
2920    at and changing hardware I/O ports and the like.  Accepting `volatile'
2921    would perhaps be one way to fix it.  Another idea would be to use the
2922    executable file for the text segment (for all SEC_CODE sections?
2923    For all SEC_READONLY sections?).  This has problems if you want to
2924    actually see what the memory contains (e.g. self-modifying code,
2925    clobbered memory, user downloaded the wrong thing).  
2926
2927    Because it speeds so much up, it's now enabled, if you're playing
2928    with registers you turn it of (set remotecache 0).  */
2929
2930 /* Read a word from remote address ADDR and return it.
2931    This goes through the data cache.  */
2932
2933 #if 0                           /* unused? */
2934 static int
2935 remote_fetch_word (addr)
2936      CORE_ADDR addr;
2937 {
2938   return dcache_fetch (remote_dcache, addr);
2939 }
2940
2941 /* Write a word WORD into remote address ADDR.
2942    This goes through the data cache.  */
2943
2944 static void
2945 remote_store_word (addr, word)
2946      CORE_ADDR addr;
2947      int word;
2948 {
2949   dcache_poke (remote_dcache, addr, word);
2950 }
2951 #endif /* 0 (unused?) */
2952 \f
2953
2954
2955 /* Return the number of hex digits in num.  */
2956
2957 static int
2958 hexnumlen (num)
2959      ULONGEST num;
2960 {
2961   int i;
2962
2963   for (i = 0; num != 0; i++)
2964     num >>= 4;
2965
2966   return max (i, 1);
2967 }
2968
2969 /* Set BUF to the minimum number of hex digits representing NUM.  */
2970
2971 static int
2972 hexnumstr (buf, num)
2973      char *buf;
2974      ULONGEST num;
2975 {
2976   int len = hexnumlen (num);
2977   return hexnumnstr (buf, num, len);
2978 }
2979
2980
2981 /* Set BUF to the hex digits representing NUM, padded to WIDTH characters.  */
2982
2983 static int
2984 hexnumnstr (buf, num, width)
2985      char *buf;
2986      ULONGEST num;
2987      int width;
2988 {
2989   int i;
2990
2991   buf[width] = '\0';
2992
2993   for (i = width - 1; i >= 0; i--)
2994     {
2995       buf[i] = "0123456789abcdef"[(num & 0xf)];
2996       num >>= 4;
2997     }
2998
2999   return width;
3000 }
3001
3002 /* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */
3003
3004 static CORE_ADDR
3005 remote_address_masked (addr)
3006      CORE_ADDR addr;
3007 {
3008   if (remote_address_size > 0
3009       && remote_address_size < (sizeof (ULONGEST) * 8))
3010     {
3011       /* Only create a mask when that mask can safely be constructed
3012          in a ULONGEST variable. */
3013       ULONGEST mask = 1;
3014       mask = (mask << remote_address_size) - 1;
3015       addr &= mask;
3016     }
3017   return addr;
3018 }
3019
3020 /* Determine whether the remote target supports binary downloading.
3021    This is accomplished by sending a no-op memory write of zero length
3022    to the target at the specified address. It does not suffice to send
3023    the whole packet, since many stubs strip the eighth bit and subsequently
3024    compute a wrong checksum, which causes real havoc with remote_write_bytes.
3025
3026    NOTE: This can still lose if the serial line is not eight-bit
3027    clean. In cases like this, the user should clear "remote
3028    X-packet". */
3029
3030 static void
3031 check_binary_download (addr)
3032      CORE_ADDR addr;
3033 {
3034   switch (remote_protocol_binary_download.support)
3035     {
3036     case PACKET_DISABLE:
3037       break;
3038     case PACKET_ENABLE:
3039       break;
3040     case PACKET_SUPPORT_UNKNOWN:
3041       {
3042         char *buf = alloca (PBUFSIZ);
3043         char *p;
3044         
3045         p = buf;
3046         *p++ = 'X';
3047         p += hexnumstr (p, (ULONGEST) addr);
3048         *p++ = ',';
3049         p += hexnumstr (p, (ULONGEST) 0);
3050         *p++ = ':';
3051         *p = '\0';
3052         
3053         putpkt_binary (buf, (int) (p - buf));
3054         getpkt (buf, 0);
3055
3056         if (buf[0] == '\0')
3057           {
3058             if (remote_debug)
3059               fprintf_unfiltered (gdb_stdlog,
3060                                   "binary downloading NOT suppported by target\n");
3061             remote_protocol_binary_download.support = PACKET_DISABLE;
3062           }
3063         else
3064           {
3065             if (remote_debug)
3066               fprintf_unfiltered (gdb_stdlog,
3067                                   "binary downloading suppported by target\n");
3068             remote_protocol_binary_download.support = PACKET_ENABLE;
3069           }
3070         break;
3071       }
3072     }
3073 }
3074
3075 /* Write memory data directly to the remote machine.
3076    This does not inform the data cache; the data cache uses this.
3077    MEMADDR is the address in the remote memory space.
3078    MYADDR is the address of the buffer in our space.
3079    LEN is the number of bytes.
3080
3081    Returns number of bytes transferred, or 0 for error.  */
3082
3083 static int
3084 remote_write_bytes (memaddr, myaddr, len)
3085      CORE_ADDR memaddr;
3086      char *myaddr;
3087      int len;
3088 {
3089   unsigned char *buf = alloca (PBUFSIZ);
3090   int max_buf_size;             /* Max size of packet output buffer */
3091   int origlen;
3092
3093   /* Verify that the target can support a binary download */
3094   check_binary_download (memaddr);
3095
3096   /* Chop the transfer down if necessary */
3097
3098   max_buf_size = min (remote_write_size, PBUFSIZ);
3099   if (remote_register_buf_size != 0)
3100     max_buf_size = min (max_buf_size, remote_register_buf_size);
3101
3102   /* Subtract header overhead from max payload size -  $M<memaddr>,<len>:#nn */
3103   max_buf_size -= 2 + hexnumlen (memaddr + len - 1) + 1 + hexnumlen (len) + 4;
3104
3105   origlen = len;
3106   while (len > 0)
3107     {
3108       unsigned char *p, *plen;
3109       int plenlen;
3110       int todo;
3111       int i;
3112
3113       /* construct "M"<memaddr>","<len>":" */
3114       /* sprintf (buf, "M%lx,%x:", (unsigned long) memaddr, todo); */
3115       memaddr = remote_address_masked (memaddr);
3116       p = buf;
3117       switch (remote_protocol_binary_download.support)
3118         {
3119         case PACKET_ENABLE:
3120           *p++ = 'X';
3121           todo = min (len, max_buf_size);
3122           break;
3123         case PACKET_DISABLE:
3124           *p++ = 'M';
3125           todo = min (len, max_buf_size / 2);   /* num bytes that will fit */
3126           break;
3127         case PACKET_SUPPORT_UNKNOWN:
3128           internal_error ("remote_write_bytes: bad switch");
3129         }
3130
3131       p += hexnumstr (p, (ULONGEST) memaddr);
3132       *p++ = ',';
3133
3134       plen = p;                 /* remember where len field goes */
3135       plenlen = hexnumstr (p, (ULONGEST) todo);
3136       p += plenlen;
3137       *p++ = ':';
3138       *p = '\0';
3139
3140       /* We send target system values byte by byte, in increasing byte
3141          addresses, each byte encoded as two hex characters (or one
3142          binary character).  */
3143       switch (remote_protocol_binary_download.support)
3144         {
3145         case PACKET_ENABLE:
3146           {
3147             int escaped = 0;
3148             for (i = 0;
3149                  (i < todo) && (i + escaped) < (max_buf_size - 2);
3150                  i++)
3151               {
3152                 switch (myaddr[i] & 0xff)
3153                   {
3154                   case '$':
3155                   case '#':
3156                   case 0x7d:
3157                     /* These must be escaped */
3158                     escaped++;
3159                     *p++ = 0x7d;
3160                     *p++ = (myaddr[i] & 0xff) ^ 0x20;
3161                     break;
3162                   default:
3163                     *p++ = myaddr[i] & 0xff;
3164                     break;
3165                   }
3166               }
3167             
3168             if (i < todo)
3169               {
3170                 /* Escape chars have filled up the buffer prematurely, 
3171                    and we have actually sent fewer bytes than planned.
3172                    Fix-up the length field of the packet.  Use the same
3173                    number of characters as before.  */
3174                 
3175                 plen += hexnumnstr (plen, (ULONGEST) i, plenlen);
3176                 *plen = ':';  /* overwrite \0 from hexnumnstr() */
3177               }
3178             break;
3179           }
3180         case PACKET_DISABLE:
3181           {
3182             for (i = 0; i < todo; i++)
3183               {
3184                 *p++ = tohex ((myaddr[i] >> 4) & 0xf);
3185                 *p++ = tohex (myaddr[i] & 0xf);
3186               }
3187             *p = '\0';
3188             break;
3189           }
3190         case PACKET_SUPPORT_UNKNOWN:
3191           internal_error ("remote_write_bytes: bad switch");
3192         }
3193
3194       putpkt_binary (buf, (int) (p - buf));
3195       getpkt (buf, 0);
3196
3197       if (buf[0] == 'E')
3198         {
3199           /* There is no correspondance between what the remote protocol uses
3200              for errors and errno codes.  We would like a cleaner way of
3201              representing errors (big enough to include errno codes, bfd_error
3202              codes, and others).  But for now just return EIO.  */
3203           errno = EIO;
3204           return 0;
3205         }
3206
3207       /* Increment by i, not by todo, in case escape chars 
3208          caused us to send fewer bytes than we'd planned.  */
3209       myaddr += i;
3210       memaddr += i;
3211       len -= i;
3212     }
3213   return origlen;
3214 }
3215
3216 /* Read memory data directly from the remote machine.
3217    This does not use the data cache; the data cache uses this.
3218    MEMADDR is the address in the remote memory space.
3219    MYADDR is the address of the buffer in our space.
3220    LEN is the number of bytes.
3221
3222    Returns number of bytes transferred, or 0 for error.  */
3223
3224 static int
3225 remote_read_bytes (memaddr, myaddr, len)
3226      CORE_ADDR memaddr;
3227      char *myaddr;
3228      int len;
3229 {
3230   char *buf = alloca (PBUFSIZ);
3231   int max_buf_size;             /* Max size of packet output buffer */
3232   int origlen;
3233
3234   /* Chop the transfer down if necessary */
3235
3236   max_buf_size = min (remote_write_size, PBUFSIZ);
3237   if (remote_register_buf_size != 0)
3238     max_buf_size = min (max_buf_size, remote_register_buf_size);
3239
3240   origlen = len;
3241   while (len > 0)
3242     {
3243       char *p;
3244       int todo;
3245       int i;
3246
3247       todo = min (len, max_buf_size / 2);       /* num bytes that will fit */
3248
3249       /* construct "m"<memaddr>","<len>" */
3250       /* sprintf (buf, "m%lx,%x", (unsigned long) memaddr, todo); */
3251       memaddr = remote_address_masked (memaddr);
3252       p = buf;
3253       *p++ = 'm';
3254       p += hexnumstr (p, (ULONGEST) memaddr);
3255       *p++ = ',';
3256       p += hexnumstr (p, (ULONGEST) todo);
3257       *p = '\0';
3258
3259       putpkt (buf);
3260       getpkt (buf, 0);
3261
3262       if (buf[0] == 'E')
3263         {
3264           /* There is no correspondance between what the remote protocol uses
3265              for errors and errno codes.  We would like a cleaner way of
3266              representing errors (big enough to include errno codes, bfd_error
3267              codes, and others).  But for now just return EIO.  */
3268           errno = EIO;
3269           return 0;
3270         }
3271
3272       /* Reply describes memory byte by byte,
3273          each byte encoded as two hex characters.  */
3274
3275       p = buf;
3276       for (i = 0; i < todo; i++)
3277         {
3278           if (p[0] == 0 || p[1] == 0)
3279             /* Reply is short.  This means that we were able to read
3280                only part of what we wanted to.  */
3281             return i + (origlen - len);
3282           myaddr[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
3283           p += 2;
3284         }
3285       myaddr += todo;
3286       memaddr += todo;
3287       len -= todo;
3288     }
3289   return origlen;
3290 }
3291 \f
3292 /* Read or write LEN bytes from inferior memory at MEMADDR,
3293    transferring to or from debugger address BUFFER.  Write to inferior if
3294    SHOULD_WRITE is nonzero.  Returns length of data written or read; 0
3295    for error.  */
3296
3297 #ifndef REMOTE_TRANSLATE_XFER_ADDRESS
3298 #define REMOTE_TRANSLATE_XFER_ADDRESS(MEM_ADDR, MEM_LEN, TARG_ADDR, TARG_LEN) \
3299    (*(TARG_ADDR) = (MEM_ADDR), *(TARG_LEN) = (MEM_LEN))
3300 #endif
3301
3302 /* ARGSUSED */
3303 static int
3304 remote_xfer_memory (mem_addr, buffer, mem_len, should_write, target)
3305      CORE_ADDR mem_addr;
3306      char *buffer;
3307      int mem_len;
3308      int should_write;
3309      struct target_ops *target; /* ignored */
3310 {
3311   CORE_ADDR targ_addr;
3312   int targ_len;
3313   REMOTE_TRANSLATE_XFER_ADDRESS (mem_addr, mem_len, &targ_addr, &targ_len);
3314   if (targ_len <= 0)
3315     return 0;
3316
3317   return dcache_xfer_memory (remote_dcache, targ_addr, buffer,
3318                              targ_len, should_write);
3319 }
3320
3321
3322 #if 0
3323 /* Enable after 4.12.  */
3324
3325 void
3326 remote_search (len, data, mask, startaddr, increment, lorange, hirange
3327                addr_found, data_found)
3328      int len;
3329      char *data;
3330      char *mask;
3331      CORE_ADDR startaddr;
3332      int increment;
3333      CORE_ADDR lorange;
3334      CORE_ADDR hirange;
3335      CORE_ADDR *addr_found;
3336      char *data_found;
3337 {
3338   if (increment == -4 && len == 4)
3339     {
3340       long mask_long, data_long;
3341       long data_found_long;
3342       CORE_ADDR addr_we_found;
3343       char *buf = alloca (PBUFSIZ);
3344       long returned_long[2];
3345       char *p;
3346
3347       mask_long = extract_unsigned_integer (mask, len);
3348       data_long = extract_unsigned_integer (data, len);
3349       sprintf (buf, "t%x:%x,%x", startaddr, data_long, mask_long);
3350       putpkt (buf);
3351       getpkt (buf, 0);
3352       if (buf[0] == '\0')
3353         {
3354           /* The stub doesn't support the 't' request.  We might want to
3355              remember this fact, but on the other hand the stub could be
3356              switched on us.  Maybe we should remember it only until
3357              the next "target remote".  */
3358           generic_search (len, data, mask, startaddr, increment, lorange,
3359                           hirange, addr_found, data_found);
3360           return;
3361         }
3362
3363       if (buf[0] == 'E')
3364         /* There is no correspondance between what the remote protocol uses
3365            for errors and errno codes.  We would like a cleaner way of
3366            representing errors (big enough to include errno codes, bfd_error
3367            codes, and others).  But for now just use EIO.  */
3368         memory_error (EIO, startaddr);
3369       p = buf;
3370       addr_we_found = 0;
3371       while (*p != '\0' && *p != ',')
3372         addr_we_found = (addr_we_found << 4) + fromhex (*p++);
3373       if (*p == '\0')
3374         error ("Protocol error: short return for search");
3375
3376       data_found_long = 0;
3377       while (*p != '\0' && *p != ',')
3378         data_found_long = (data_found_long << 4) + fromhex (*p++);
3379       /* Ignore anything after this comma, for future extensions.  */
3380
3381       if (addr_we_found < lorange || addr_we_found >= hirange)
3382         {
3383           *addr_found = 0;
3384           return;
3385         }
3386
3387       *addr_found = addr_we_found;
3388       *data_found = store_unsigned_integer (data_we_found, len);
3389       return;
3390     }
3391   generic_search (len, data, mask, startaddr, increment, lorange,
3392                   hirange, addr_found, data_found);
3393 }
3394 #endif /* 0 */
3395 \f
3396 static void
3397 remote_files_info (ignore)
3398      struct target_ops *ignore;
3399 {
3400   puts_filtered ("Debugging a target over a serial line.\n");
3401 }
3402 \f
3403 /* Stuff for dealing with the packets which are part of this protocol.
3404    See comment at top of file for details.  */
3405
3406 /* Read a single character from the remote end, masking it down to 7 bits. */
3407
3408 static int
3409 readchar (timeout)
3410      int timeout;
3411 {
3412   int ch;
3413
3414   ch = SERIAL_READCHAR (remote_desc, timeout);
3415
3416   if (ch >= 0)
3417     return (ch & 0x7f);
3418
3419   switch ((enum serial_rc) ch)
3420     {
3421     case SERIAL_EOF:
3422       target_mourn_inferior ();
3423       error ("Remote connection closed");
3424       /* no return */
3425     case SERIAL_ERROR:
3426       perror_with_name ("Remote communication error");
3427       /* no return */
3428     case SERIAL_TIMEOUT:
3429       break;
3430     }
3431   return ch;
3432 }
3433
3434 /* Send the command in BUF to the remote machine, and read the reply
3435    into BUF.  Report an error if we get an error reply.  */
3436
3437 static void
3438 remote_send (buf)
3439      char *buf;
3440 {
3441   putpkt (buf);
3442   getpkt (buf, 0);
3443
3444   if (buf[0] == 'E')
3445     error ("Remote failure reply: %s", buf);
3446 }
3447
3448 /* Display a null-terminated packet on stdout, for debugging, using C
3449    string notation.  */
3450
3451 static void
3452 print_packet (buf)
3453      char *buf;
3454 {
3455   puts_filtered ("\"");
3456   fputstr_filtered (buf, '"', gdb_stdout);
3457   puts_filtered ("\"");
3458 }
3459
3460 int
3461 putpkt (buf)
3462      char *buf;
3463 {
3464   return putpkt_binary (buf, strlen (buf));
3465 }
3466
3467 /* Send a packet to the remote machine, with error checking.  The data
3468    of the packet is in BUF.  The string in BUF can be at most  PBUFSIZ - 5
3469    to account for the $, # and checksum, and for a possible /0 if we are
3470    debugging (remote_debug) and want to print the sent packet as a string */
3471
3472 static int
3473 putpkt_binary (buf, cnt)
3474      char *buf;
3475      int cnt;
3476 {
3477   int i;
3478   unsigned char csum = 0;
3479   char *buf2 = alloca (PBUFSIZ);
3480   char *junkbuf = alloca (PBUFSIZ);
3481
3482   int ch;
3483   int tcount = 0;
3484   char *p;
3485
3486   /* Copy the packet into buffer BUF2, encapsulating it
3487      and giving it a checksum.  */
3488
3489   if (cnt > BUFSIZ - 5)         /* Prosanity check */
3490     abort ();
3491
3492   p = buf2;
3493   *p++ = '$';
3494
3495   for (i = 0; i < cnt; i++)
3496     {
3497       csum += buf[i];
3498       *p++ = buf[i];
3499     }
3500   *p++ = '#';
3501   *p++ = tohex ((csum >> 4) & 0xf);
3502   *p++ = tohex (csum & 0xf);
3503
3504   /* Send it over and over until we get a positive ack.  */
3505
3506   while (1)
3507     {
3508       int started_error_output = 0;
3509
3510       if (remote_debug)
3511         {
3512           *p = '\0';
3513           fprintf_unfiltered (gdb_stdlog, "Sending packet: ");
3514           fputstrn_unfiltered (buf2, p - buf2, 0, gdb_stdlog);
3515           fprintf_unfiltered (gdb_stdlog, "...");
3516           gdb_flush (gdb_stdlog);
3517         }
3518       if (SERIAL_WRITE (remote_desc, buf2, p - buf2))
3519         perror_with_name ("putpkt: write failed");
3520
3521       /* read until either a timeout occurs (-2) or '+' is read */
3522       while (1)
3523         {
3524           ch = readchar (remote_timeout);
3525
3526           if (remote_debug)
3527             {
3528               switch (ch)
3529                 {
3530                 case '+':
3531                 case SERIAL_TIMEOUT:
3532                 case '$':
3533                   if (started_error_output)
3534                     {
3535                       putchar_unfiltered ('\n');
3536                       started_error_output = 0;
3537                     }
3538                 }
3539             }
3540
3541           switch (ch)
3542             {
3543             case '+':
3544               if (remote_debug)
3545                 fprintf_unfiltered (gdb_stdlog, "Ack\n");
3546               return 1;
3547             case SERIAL_TIMEOUT:
3548               tcount++;
3549               if (tcount > 3)
3550                 return 0;
3551               break;            /* Retransmit buffer */
3552             case '$':
3553               {
3554                 /* It's probably an old response, and we're out of sync.
3555                    Just gobble up the packet and ignore it.  */
3556                 getpkt (junkbuf, 0);
3557                 continue;       /* Now, go look for + */
3558               }
3559             default:
3560               if (remote_debug)
3561                 {
3562                   if (!started_error_output)
3563                     {
3564                       started_error_output = 1;
3565                       fprintf_unfiltered (gdb_stdlog, "putpkt: Junk: ");
3566                     }
3567                   fputc_unfiltered (ch & 0177, gdb_stdlog);
3568                 }
3569               continue;
3570             }
3571           break;                /* Here to retransmit */
3572         }
3573
3574 #if 0
3575       /* This is wrong.  If doing a long backtrace, the user should be
3576          able to get out next time we call QUIT, without anything as
3577          violent as interrupt_query.  If we want to provide a way out of
3578          here without getting to the next QUIT, it should be based on
3579          hitting ^C twice as in remote_wait.  */
3580       if (quit_flag)
3581         {
3582           quit_flag = 0;
3583           interrupt_query ();
3584         }
3585 #endif
3586     }
3587 }
3588
3589 static int remote_cisco_mode;
3590
3591 /* Come here after finding the start of the frame.  Collect the rest
3592    into BUF, verifying the checksum, length, and handling run-length
3593    compression.  Returns 0 on any error, 1 on success.  */
3594
3595 static int
3596 read_frame (buf)
3597      char *buf;
3598 {
3599   unsigned char csum;
3600   char *bp;
3601   int c;
3602
3603   csum = 0;
3604   bp = buf;
3605
3606   while (1)
3607     {
3608       c = readchar (remote_timeout);
3609
3610       switch (c)
3611         {
3612         case SERIAL_TIMEOUT:
3613           if (remote_debug)
3614             fputs_filtered ("Timeout in mid-packet, retrying\n", gdb_stdlog);
3615           return 0;
3616         case '$':
3617           if (remote_debug)
3618             fputs_filtered ("Saw new packet start in middle of old one\n",
3619                             gdb_stdlog);
3620           return 0;             /* Start a new packet, count retries */
3621         case '#':
3622           {
3623             unsigned char pktcsum;
3624
3625             *bp = '\000';
3626
3627             pktcsum = fromhex (readchar (remote_timeout)) << 4;
3628             pktcsum |= fromhex (readchar (remote_timeout));
3629
3630             if (csum == pktcsum)
3631               return 1;
3632
3633             if (remote_debug)
3634               {
3635                 fprintf_filtered (gdb_stdlog,
3636                               "Bad checksum, sentsum=0x%x, csum=0x%x, buf=",
3637                                   pktcsum, csum);
3638                 fputs_filtered (buf, gdb_stdlog);
3639                 fputs_filtered ("\n", gdb_stdlog);
3640               }
3641             return 0;
3642           }
3643         case '*':               /* Run length encoding */
3644           {
3645             int repeat;
3646             csum += c;
3647
3648             if (remote_cisco_mode == 0)
3649               {
3650                 c = readchar (remote_timeout);
3651                 csum += c;
3652                 repeat = c - ' ' + 3;   /* Compute repeat count */
3653               }
3654             else 
3655               { 
3656                 /* Cisco's run-length encoding variant uses two 
3657                    hex chars to represent the repeat count. */
3658
3659                 c = readchar (remote_timeout);
3660                 csum += c;
3661                 repeat  = fromhex (c) << 4;
3662                 c = readchar (remote_timeout);
3663                 csum += c;
3664                 repeat += fromhex (c);
3665               }
3666
3667             if (repeat > 0 && repeat <= 255 
3668                 && bp + repeat - 1 < buf + PBUFSIZ - 1)
3669               {
3670                 memset (bp, *(bp - 1), repeat);
3671                 bp += c;
3672                 continue;
3673               }
3674
3675             *bp = '\0';
3676             printf_filtered ("Repeat count %d too large for buffer: ", repeat);
3677             puts_filtered (buf);
3678             puts_filtered ("\n");
3679             return 0;
3680           }
3681         default:
3682           if (bp < buf + PBUFSIZ - 1)
3683             {
3684               *bp++ = c;
3685               csum += c;
3686               continue;
3687             }
3688
3689           *bp = '\0';
3690           puts_filtered ("Remote packet too long: ");
3691           puts_filtered (buf);
3692           puts_filtered ("\n");
3693
3694           return 0;
3695         }
3696     }
3697 }
3698
3699 /* Read a packet from the remote machine, with error checking, and
3700    store it in BUF.  BUF is expected to be of size PBUFSIZ.  If
3701    FOREVER, wait forever rather than timing out; this is used while
3702    the target is executing user code.  */
3703
3704 void
3705 getpkt (buf, forever)
3706      char *buf;
3707      int forever;
3708 {
3709   int c;
3710   int tries;
3711   int timeout;
3712   int val;
3713
3714   strcpy (buf, "timeout");
3715
3716   if (forever)
3717     {
3718       timeout = watchdog > 0 ? watchdog : -1;
3719     }
3720
3721   else
3722     timeout = remote_timeout;
3723
3724 #define MAX_TRIES 3
3725
3726   for (tries = 1; tries <= MAX_TRIES; tries++)
3727     {
3728       /* This can loop forever if the remote side sends us characters
3729          continuously, but if it pauses, we'll get a zero from readchar
3730          because of timeout.  Then we'll count that as a retry.  */
3731
3732       /* Note that we will only wait forever prior to the start of a packet.
3733          After that, we expect characters to arrive at a brisk pace.  They
3734          should show up within remote_timeout intervals.  */
3735
3736       do
3737         {
3738           c = readchar (timeout);
3739
3740           if (c == SERIAL_TIMEOUT)
3741             {
3742               if (forever)      /* Watchdog went off?  Kill the target. */
3743                 {
3744                   QUIT;
3745                   target_mourn_inferior ();
3746                   error ("Watchdog has expired.  Target detached.\n");
3747                 }
3748               if (remote_debug)
3749                 fputs_filtered ("Timed out.\n", gdb_stdlog);
3750               goto retry;
3751             }
3752         }
3753       while (c != '$');
3754
3755       /* We've found the start of a packet, now collect the data.  */
3756
3757       val = read_frame (buf);
3758
3759       if (val == 1)
3760         {
3761           if (remote_debug)
3762             {
3763               fprintf_unfiltered (gdb_stdlog, "Packet received: ");
3764               fputstr_unfiltered (buf, 0, gdb_stdlog);
3765               fprintf_unfiltered (gdb_stdlog, "\n");
3766             }
3767           SERIAL_WRITE (remote_desc, "+", 1);
3768           return;
3769         }
3770
3771       /* Try the whole thing again.  */
3772     retry:
3773       SERIAL_WRITE (remote_desc, "-", 1);
3774     }
3775
3776   /* We have tried hard enough, and just can't receive the packet.  Give up. */
3777
3778   printf_unfiltered ("Ignoring packet error, continuing...\n");
3779   SERIAL_WRITE (remote_desc, "+", 1);
3780 }
3781 \f
3782 static void
3783 remote_kill ()
3784 {
3785   /* For some mysterious reason, wait_for_inferior calls kill instead of
3786      mourn after it gets TARGET_WAITKIND_SIGNALLED.  Work around it.  */
3787   if (kill_kludge)
3788     {
3789       kill_kludge = 0;
3790       target_mourn_inferior ();
3791       return;
3792     }
3793
3794   /* Use catch_errors so the user can quit from gdb even when we aren't on
3795      speaking terms with the remote system.  */
3796   catch_errors ((catch_errors_ftype *) putpkt, "k", "", RETURN_MASK_ERROR);
3797
3798   /* Don't wait for it to die.  I'm not really sure it matters whether
3799      we do or not.  For the existing stubs, kill is a noop.  */
3800   target_mourn_inferior ();
3801 }
3802
3803 /* Async version of remote_kill. */
3804 static void
3805 remote_async_kill ()
3806 {
3807   /* Unregister the file descriptor from the event loop. */
3808   if (SERIAL_IS_ASYNC_P (remote_desc))
3809     SERIAL_ASYNC (remote_desc, NULL, 0);
3810
3811   /* For some mysterious reason, wait_for_inferior calls kill instead of
3812      mourn after it gets TARGET_WAITKIND_SIGNALLED.  Work around it.  */
3813   if (kill_kludge)
3814     {
3815       kill_kludge = 0;
3816       target_mourn_inferior ();
3817       return;
3818     }
3819
3820   /* Use catch_errors so the user can quit from gdb even when we aren't on
3821      speaking terms with the remote system.  */
3822   catch_errors ((catch_errors_ftype *) putpkt, "k", "", RETURN_MASK_ERROR);
3823
3824   /* Don't wait for it to die.  I'm not really sure it matters whether
3825      we do or not.  For the existing stubs, kill is a noop.  */
3826   target_mourn_inferior ();
3827 }
3828
3829 static void
3830 remote_mourn ()
3831 {
3832   remote_mourn_1 (&remote_ops);
3833 }
3834
3835 static void
3836 remote_async_mourn ()
3837 {
3838   remote_mourn_1 (&remote_async_ops);
3839 }
3840
3841 static void
3842 extended_remote_mourn ()
3843 {
3844   /* We do _not_ want to mourn the target like this; this will
3845      remove the extended remote target  from the target stack,
3846      and the next time the user says "run" it'll fail. 
3847
3848      FIXME: What is the right thing to do here?  */
3849 #if 0
3850   remote_mourn_1 (&extended_remote_ops);
3851 #endif
3852 }
3853
3854 /* Worker function for remote_mourn.  */
3855 static void
3856 remote_mourn_1 (target)
3857      struct target_ops *target;
3858 {
3859   unpush_target (target);
3860   generic_mourn_inferior ();
3861 }
3862
3863 /* In the extended protocol we want to be able to do things like
3864    "run" and have them basically work as expected.  So we need
3865    a special create_inferior function. 
3866
3867    FIXME: One day add support for changing the exec file
3868    we're debugging, arguments and an environment.  */
3869
3870 static void
3871 extended_remote_create_inferior (exec_file, args, env)
3872      char *exec_file;
3873      char *args;
3874      char **env;
3875 {
3876   /* Rip out the breakpoints; we'll reinsert them after restarting
3877      the remote server.  */
3878   remove_breakpoints ();
3879
3880   /* Now restart the remote server.  */
3881   extended_remote_restart ();
3882
3883   /* Now put the breakpoints back in.  This way we're safe if the
3884      restart function works via a unix fork on the remote side.  */
3885   insert_breakpoints ();
3886
3887   /* Clean up from the last time we were running.  */
3888   clear_proceed_status ();
3889
3890   /* Let the remote process run.  */
3891   proceed (-1, TARGET_SIGNAL_0, 0);
3892 }
3893
3894 /* Async version of extended_remote_create_inferior. */
3895 static void
3896 extended_remote_async_create_inferior (exec_file, args, env)
3897      char *exec_file;
3898      char *args;
3899      char **env;
3900 {
3901   /* Rip out the breakpoints; we'll reinsert them after restarting
3902      the remote server.  */
3903   remove_breakpoints ();
3904
3905   /* If running asynchronously, register the target file descriptor
3906      with the event loop. */
3907   if (event_loop_p && target_can_async_p ())
3908     target_async (inferior_event_handler, 0);
3909
3910   /* Now restart the remote server.  */
3911   extended_remote_restart ();
3912
3913   /* Now put the breakpoints back in.  This way we're safe if the
3914      restart function works via a unix fork on the remote side.  */
3915   insert_breakpoints ();
3916
3917   /* Clean up from the last time we were running.  */
3918   clear_proceed_status ();
3919
3920   /* Let the remote process run.  */
3921   proceed (-1, TARGET_SIGNAL_0, 0);
3922 }
3923 \f
3924
3925 /* On some machines, e.g. 68k, we may use a different breakpoint instruction
3926    than other targets; in those use REMOTE_BREAKPOINT instead of just
3927    BREAKPOINT.  Also, bi-endian targets may define LITTLE_REMOTE_BREAKPOINT
3928    and BIG_REMOTE_BREAKPOINT.  If none of these are defined, we just call
3929    the standard routines that are in mem-break.c.  */
3930
3931 /* FIXME, these ought to be done in a more dynamic fashion.  For instance,
3932    the choice of breakpoint instruction affects target program design and
3933    vice versa, and by making it user-tweakable, the special code here
3934    goes away and we need fewer special GDB configurations.  */
3935
3936 #if defined (LITTLE_REMOTE_BREAKPOINT) && defined (BIG_REMOTE_BREAKPOINT) && !defined(REMOTE_BREAKPOINT)
3937 #define REMOTE_BREAKPOINT
3938 #endif
3939
3940 #ifdef REMOTE_BREAKPOINT
3941
3942 /* If the target isn't bi-endian, just pretend it is.  */
3943 #if !defined (LITTLE_REMOTE_BREAKPOINT) && !defined (BIG_REMOTE_BREAKPOINT)
3944 #define LITTLE_REMOTE_BREAKPOINT REMOTE_BREAKPOINT
3945 #define BIG_REMOTE_BREAKPOINT REMOTE_BREAKPOINT
3946 #endif
3947
3948 static unsigned char big_break_insn[] = BIG_REMOTE_BREAKPOINT;
3949 static unsigned char little_break_insn[] = LITTLE_REMOTE_BREAKPOINT;
3950
3951 #endif /* REMOTE_BREAKPOINT */
3952
3953 /* Insert a breakpoint on targets that don't have any better breakpoint
3954    support.  We read the contents of the target location and stash it,
3955    then overwrite it with a breakpoint instruction.  ADDR is the target
3956    location in the target machine.  CONTENTS_CACHE is a pointer to 
3957    memory allocated for saving the target contents.  It is guaranteed
3958    by the caller to be long enough to save sizeof BREAKPOINT bytes (this
3959    is accomplished via BREAKPOINT_MAX).  */
3960
3961 static int
3962 remote_insert_breakpoint (addr, contents_cache)
3963      CORE_ADDR addr;
3964      char *contents_cache;
3965 {
3966 #ifdef REMOTE_BREAKPOINT
3967   int val;
3968 #endif  
3969   int bp_size;
3970
3971   /* Try the "Z" packet if it is not already disabled.
3972      If it succeeds, then set the support to PACKET_ENABLE.
3973      If it fails, and the user has explicitly requested the Z support 
3974      then report an error, otherwise, mark it disabled and go on. */
3975   
3976   if ((remote_protocol_Z.support == PACKET_ENABLE)
3977       || (remote_protocol_Z.support == PACKET_SUPPORT_UNKNOWN)) 
3978     {
3979       char buf[PBUFSIZ], *p = buf;
3980       
3981       addr = remote_address_masked (addr);
3982       *(p++) = 'Z';
3983       *(p++) = '0';
3984       *(p++) = ',';
3985       p += hexnumstr (p, (ULONGEST) addr);
3986       BREAKPOINT_FROM_PC (&addr, &bp_size);
3987       sprintf (p, ",%d", bp_size);
3988       
3989       putpkt (buf);
3990       getpkt (buf, 0);
3991
3992       if (buf[0] != '\0')
3993         {
3994           remote_protocol_Z.support = PACKET_ENABLE;
3995           return (buf[0] == 'E');
3996         }
3997       
3998       /* The stub does not support the 'Z' request.  If the user has
3999          explicitly requested the Z support, or if the stub previously
4000          said it supported the packet, this is an error,
4001          otherwise, mark it disabled. */
4002       
4003       else if (remote_protocol_Z.support == PACKET_ENABLE)
4004         {
4005           error ("Protocol error: Z packet not recognized by stub");
4006         }
4007       else
4008         {
4009           remote_protocol_Z.support = PACKET_DISABLE;
4010         }
4011     }
4012
4013 #ifdef REMOTE_BREAKPOINT  
4014   val = target_read_memory (addr, contents_cache, sizeof big_break_insn);
4015
4016   if (val == 0)
4017     {
4018       if (TARGET_BYTE_ORDER == BIG_ENDIAN)
4019         val = target_write_memory (addr, (char *) big_break_insn,
4020                                    sizeof big_break_insn);
4021       else
4022         val = target_write_memory (addr, (char *) little_break_insn,
4023                                    sizeof little_break_insn);
4024     }
4025
4026   return val;
4027 #else
4028   return memory_insert_breakpoint (addr, contents_cache);
4029 #endif /* REMOTE_BREAKPOINT */
4030 }
4031
4032 static int
4033 remote_remove_breakpoint (addr, contents_cache)
4034      CORE_ADDR addr;
4035      char *contents_cache;
4036 {
4037   int bp_size;
4038
4039   if ((remote_protocol_Z.support == PACKET_ENABLE)
4040       || (remote_protocol_Z.support == PACKET_SUPPORT_UNKNOWN))
4041     {
4042       char buf[PBUFSIZ], *p = buf;
4043       
4044       *(p++) = 'z';
4045       *(p++) = '0';
4046       *(p++) = ',';
4047
4048       addr = remote_address_masked (addr);
4049       p += hexnumstr (p, (ULONGEST) addr);
4050       BREAKPOINT_FROM_PC (&addr, &bp_size);
4051       sprintf (p, ",%d", bp_size);
4052       
4053       putpkt (buf);
4054       getpkt (buf, 0);
4055
4056       return (buf[0] == 'E');
4057     }
4058
4059 #ifdef REMOTE_BREAKPOINT
4060   return target_write_memory (addr, contents_cache, sizeof big_break_insn);
4061 #else
4062   return memory_remove_breakpoint (addr, contents_cache);
4063 #endif /* REMOTE_BREAKPOINT */
4064 }
4065
4066 #ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
4067 int
4068 remote_insert_watchpoint (addr, len, type)
4069      CORE_ADDR addr;
4070      int len;
4071      int type;
4072 {
4073   char buf[PBUFSIZ], *p;
4074
4075   if (remote_protocol_Z.support == PACKET_DISABLE)
4076     error ("Can't set hardware watchpoints without the 'Z' packet\n");
4077   
4078   sprintf (buf, "Z%x,", type + 2 );
4079   p = strchr (buf, '\0');
4080   addr = remote_address_masked (addr);
4081   p += hexnumstr (p, (ULONGEST) addr);
4082   sprintf (p, ",%x", len);
4083   
4084   putpkt (buf);
4085   getpkt (buf, 0);
4086
4087   if (buf[0] == '\0' || buf [0] == 'E')
4088     return -1;
4089
4090   return 0;
4091 }
4092
4093 int
4094 remote_remove_watchpoint (addr, len, type)
4095      CORE_ADDR addr;
4096      int len;
4097      int type;
4098 {
4099   char buf[PBUFSIZ], *p;
4100   
4101   sprintf (buf, "z%x,", type + 2 );
4102   p = strchr (buf, '\0');
4103   addr = remote_address_masked (addr);
4104   p += hexnumstr (p, (ULONGEST) addr);
4105   sprintf (p, ",%x", len);
4106   putpkt (buf);
4107   getpkt (buf, 0);
4108
4109   if (buf[0] == '\0' || buf [0] == 'E')
4110     return -1;
4111
4112   return 0;
4113 }
4114
4115 int
4116 remote_insert_hw_breakpoint (addr, len)
4117      CORE_ADDR addr;
4118      int len;
4119 {
4120   char buf[PBUFSIZ], *p = buf;
4121       
4122   if (remote_protocol_Z.support == PACKET_DISABLE)
4123     error ("Can't set hardware breakpoints without the 'Z' packet\n");
4124
4125   *(p++) = 'Z';
4126   *(p++) = '1';
4127   *(p++) = ',';
4128   
4129   addr = remote_address_masked (addr);
4130   p += hexnumstr (p, (ULONGEST) addr);
4131   *p = '\0';
4132
4133   putpkt (buf);
4134   getpkt (buf, 0);
4135
4136   if (buf[0] == '\0' || buf [0] == 'E')
4137     return -1;
4138
4139   return 0;
4140 }
4141
4142 int 
4143 remote_remove_hw_breakpoint (addr, len)
4144      CORE_ADDR addr;
4145      int len;
4146 {
4147   char buf[PBUFSIZ], *p = buf;
4148   
4149   *(p++) = 'z';
4150   *(p++) = '1';
4151   *(p++) = ',';
4152   
4153   addr = remote_address_masked (addr);
4154   p += hexnumstr (p, (ULONGEST) addr);
4155   *p = '\0';
4156
4157   putpkt(buf);
4158   getpkt (buf, 0);
4159   
4160   if (buf[0] == '\0' || buf [0] == 'E')
4161     return -1;
4162
4163   return 0;
4164 }
4165 #endif
4166
4167 /* Some targets are only capable of doing downloads, and afterwards
4168    they switch to the remote serial protocol.  This function provides
4169    a clean way to get from the download target to the remote target.
4170    It's basically just a wrapper so that we don't have to expose any
4171    of the internal workings of remote.c.
4172
4173    Prior to calling this routine, you should shutdown the current
4174    target code, else you will get the "A program is being debugged
4175    already..." message.  Usually a call to pop_target() suffices.  */
4176
4177 void
4178 push_remote_target (name, from_tty)
4179      char *name;
4180      int from_tty;
4181 {
4182   printf_filtered ("Switching to remote protocol\n");
4183   remote_open (name, from_tty);
4184 }
4185
4186 /* Other targets want to use the entire remote serial module but with
4187    certain remote_ops overridden. */
4188
4189 void
4190 open_remote_target (name, from_tty, target, extended_p)
4191      char *name;
4192      int from_tty;
4193      struct target_ops *target;
4194      int extended_p;
4195 {
4196   printf_filtered ("Selecting the %sremote protocol\n",
4197                    (extended_p ? "extended-" : ""));
4198   remote_open_1 (name, from_tty, target, extended_p);
4199 }
4200
4201 /* Table used by the crc32 function to calcuate the checksum. */
4202
4203 static unsigned long crc32_table[256] =
4204 {0, 0};
4205
4206 static unsigned long
4207 crc32 (buf, len, crc)
4208      unsigned char *buf;
4209      int len;
4210      unsigned int crc;
4211 {
4212   if (!crc32_table[1])
4213     {
4214       /* Initialize the CRC table and the decoding table. */
4215       int i, j;
4216       unsigned int c;
4217
4218       for (i = 0; i < 256; i++)
4219         {
4220           for (c = i << 24, j = 8; j > 0; --j)
4221             c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
4222           crc32_table[i] = c;
4223         }
4224     }
4225
4226   while (len--)
4227     {
4228       crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
4229       buf++;
4230     }
4231   return crc;
4232 }
4233
4234 /* compare-sections command
4235
4236    With no arguments, compares each loadable section in the exec bfd
4237    with the same memory range on the target, and reports mismatches.
4238    Useful for verifying the image on the target against the exec file.
4239    Depends on the target understanding the new "qCRC:" request.  */
4240
4241 static void
4242 compare_sections_command (args, from_tty)
4243      char *args;
4244      int from_tty;
4245 {
4246   asection *s;
4247   unsigned long host_crc, target_crc;
4248   extern bfd *exec_bfd;
4249   struct cleanup *old_chain;
4250   char *tmp;
4251   char *sectdata;
4252   char *sectname;
4253   char *buf = alloca (PBUFSIZ);
4254   bfd_size_type size;
4255   bfd_vma lma;
4256   int matched = 0;
4257   int mismatched = 0;
4258
4259   if (!exec_bfd)
4260     error ("command cannot be used without an exec file");
4261   if (!current_target.to_shortname ||
4262       strcmp (current_target.to_shortname, "remote") != 0)
4263     error ("command can only be used with remote target");
4264
4265   for (s = exec_bfd->sections; s; s = s->next)
4266     {
4267       if (!(s->flags & SEC_LOAD))
4268         continue;               /* skip non-loadable section */
4269
4270       size = bfd_get_section_size_before_reloc (s);
4271       if (size == 0)
4272         continue;               /* skip zero-length section */
4273
4274       sectname = (char *) bfd_get_section_name (exec_bfd, s);
4275       if (args && strcmp (args, sectname) != 0)
4276         continue;               /* not the section selected by user */
4277
4278       matched = 1;              /* do this section */
4279       lma = s->lma;
4280       /* FIXME: assumes lma can fit into long */
4281       sprintf (buf, "qCRC:%lx,%lx", (long) lma, (long) size);
4282       putpkt (buf);
4283
4284       /* be clever; compute the host_crc before waiting for target reply */
4285       sectdata = xmalloc (size);
4286       old_chain = make_cleanup (free, sectdata);
4287       bfd_get_section_contents (exec_bfd, s, sectdata, 0, size);
4288       host_crc = crc32 ((unsigned char *) sectdata, size, 0xffffffff);
4289
4290       getpkt (buf, 0);
4291       if (buf[0] == 'E')
4292         error ("target memory fault, section %s, range 0x%08x -- 0x%08x",
4293                sectname, lma, lma + size);
4294       if (buf[0] != 'C')
4295         error ("remote target does not support this operation");
4296
4297       for (target_crc = 0, tmp = &buf[1]; *tmp; tmp++)
4298         target_crc = target_crc * 16 + fromhex (*tmp);
4299
4300       printf_filtered ("Section %s, range 0x%s -- 0x%s: ",
4301                        sectname, paddr (lma), paddr (lma + size));
4302       if (host_crc == target_crc)
4303         printf_filtered ("matched.\n");
4304       else
4305         {
4306           printf_filtered ("MIS-MATCHED!\n");
4307           mismatched++;
4308         }
4309
4310       do_cleanups (old_chain);
4311     }
4312   if (mismatched > 0)
4313     warning ("One or more sections of the remote executable does not match\n\
4314 the loaded file\n");
4315   if (args && !matched)
4316     printf_filtered ("No loaded section named '%s'.\n", args);
4317 }
4318
4319 static int
4320 remote_query (query_type, buf, outbuf, bufsiz)
4321      int query_type;
4322      char *buf;
4323      char *outbuf;
4324      int *bufsiz;
4325 {
4326   int i;
4327   char *buf2 = alloca (PBUFSIZ);
4328   char *p2 = &buf2[0];
4329
4330   if (!bufsiz)
4331     error ("null pointer to remote bufer size specified");
4332
4333   /* minimum outbuf size is PBUFSIZ - if bufsiz is not large enough let 
4334      the caller know and return what the minimum size is   */
4335   /* Note: a zero bufsiz can be used to query the minimum buffer size */
4336   if (*bufsiz < PBUFSIZ)
4337     {
4338       *bufsiz = PBUFSIZ;
4339       return -1;
4340     }
4341
4342   /* except for querying the minimum buffer size, target must be open */
4343   if (!remote_desc)
4344     error ("remote query is only available after target open");
4345
4346   /* we only take uppercase letters as query types, at least for now */
4347   if ((query_type < 'A') || (query_type > 'Z'))
4348     error ("invalid remote query type");
4349
4350   if (!buf)
4351     error ("null remote query specified");
4352
4353   if (!outbuf)
4354     error ("remote query requires a buffer to receive data");
4355
4356   outbuf[0] = '\0';
4357
4358   *p2++ = 'q';
4359   *p2++ = query_type;
4360
4361   /* we used one buffer char for the remote protocol q command and another
4362      for the query type.  As the remote protocol encapsulation uses 4 chars
4363      plus one extra in case we are debugging (remote_debug),
4364      we have PBUFZIZ - 7 left to pack the query string */
4365   i = 0;
4366   while (buf[i] && (i < (PBUFSIZ - 8)))
4367     {
4368       /* bad caller may have sent forbidden characters */
4369       if ((!isprint (buf[i])) || (buf[i] == '$') || (buf[i] == '#'))
4370         error ("illegal characters in query string");
4371
4372       *p2++ = buf[i];
4373       i++;
4374     }
4375   *p2 = buf[i];
4376
4377   if (buf[i])
4378     error ("query larger than available buffer");
4379
4380   i = putpkt (buf2);
4381   if (i < 0)
4382     return i;
4383
4384   getpkt (outbuf, 0);
4385
4386   return 0;
4387 }
4388
4389 static void
4390 remote_rcmd (char *command,
4391              struct gdb_file *outbuf)
4392 {
4393   int i;
4394   char *buf = alloca (PBUFSIZ);
4395   char *p = buf;
4396
4397   if (!remote_desc)
4398     error ("remote rcmd is only available after target open");
4399
4400   /* Send a NULL command across as an empty command */
4401   if (command == NULL)
4402     command = "";
4403
4404   /* The query prefix */
4405   strcpy (buf, "qRcmd,");
4406   p = strchr (buf, '\0');
4407
4408   if ((strlen (buf) + strlen (command) * 2 + 8/*misc*/) > PBUFSIZ)
4409     error ("\"monitor\" command ``%s'' is too long\n", command);
4410
4411   /* Encode the actual command */
4412   for (i = 0; command[i]; i++)
4413     {
4414       *p++ = tohex ((command[i] >> 4) & 0xf);
4415       *p++ = tohex (command[i] & 0xf);
4416     }
4417   *p = '\0';
4418
4419   if (putpkt (buf) < 0)
4420     error ("Communication problem with target\n");
4421
4422   /* get/display the response */
4423   while (1)
4424     {
4425       /* XXX - see also tracepoint.c:remote_get_noisy_reply() */
4426       buf[0] = '\0';
4427       getpkt (buf, 0);
4428       if (buf[0] == '\0')
4429         error ("Target does not support this command\n");
4430       if (buf[0] == 'O' && buf[1] != 'K')
4431         {
4432           remote_console_output (buf + 1); /* 'O' message from stub */
4433           continue;
4434         }
4435       if (strcmp (buf, "OK") == 0)
4436         break;
4437       if (strlen (buf) == 3 && buf[0] == 'E'
4438           && isdigit (buf[1]) && isdigit (buf[2]))
4439         {
4440           error ("Protocol error with Rcmd");
4441         }
4442       for (p = buf; p[0] != '\0' && p[1] != '\0'; p += 2)
4443         {
4444           char c = (fromhex (p[0]) << 4) + fromhex (p[1]);
4445           fputc_unfiltered (c, outbuf);
4446         }
4447       break;
4448     }
4449 }
4450
4451 static void
4452 packet_command (args, from_tty)
4453      char *args;
4454      int from_tty;
4455 {
4456   char *buf = alloca (PBUFSIZ);
4457
4458   if (!remote_desc)
4459     error ("command can only be used with remote target");
4460
4461   if (!args)
4462     error ("remote-packet command requires packet text as argument");
4463
4464   puts_filtered ("sending: ");
4465   print_packet (args);
4466   puts_filtered ("\n");
4467   putpkt (args);
4468
4469   getpkt (buf, 0);
4470   puts_filtered ("received: ");
4471   print_packet (buf);
4472   puts_filtered ("\n");
4473 }
4474
4475 #if 0
4476 /* --------- UNIT_TEST for THREAD oriented PACKETS ------------------------- */
4477
4478 static void display_thread_info PARAMS ((struct gdb_ext_thread_info * info));
4479
4480 static void threadset_test_cmd PARAMS ((char *cmd, int tty));
4481
4482 static void threadalive_test PARAMS ((char *cmd, int tty));
4483
4484 static void threadlist_test_cmd PARAMS ((char *cmd, int tty));
4485
4486 int get_and_display_threadinfo PARAMS ((threadref * ref));
4487
4488 static void threadinfo_test_cmd PARAMS ((char *cmd, int tty));
4489
4490 static int thread_display_step PARAMS ((threadref * ref, void *context));
4491
4492 static void threadlist_update_test_cmd PARAMS ((char *cmd, int tty));
4493
4494 static void init_remote_threadtests PARAMS ((void));
4495
4496 #define SAMPLE_THREAD  0x05060708       /* Truncated 64 bit threadid */
4497
4498 static void
4499 threadset_test_cmd (cmd, tty)
4500      char *cmd;
4501      int tty;
4502 {
4503   int sample_thread = SAMPLE_THREAD;
4504
4505   printf_filtered ("Remote threadset test\n");
4506   set_thread (sample_thread, 1);
4507 }
4508
4509
4510 static void
4511 threadalive_test (cmd, tty)
4512      char *cmd;
4513      int tty;
4514 {
4515   int sample_thread = SAMPLE_THREAD;
4516
4517   if (remote_thread_alive (sample_thread))
4518     printf_filtered ("PASS: Thread alive test\n");
4519   else
4520     printf_filtered ("FAIL: Thread alive test\n");
4521 }
4522
4523 void output_threadid PARAMS ((char *title, threadref * ref));
4524
4525 void
4526 output_threadid (title, ref)
4527      char *title;
4528      threadref *ref;
4529 {
4530   char hexid[20];
4531
4532   pack_threadid (&hexid[0], ref);       /* Convert threead id into hex */
4533   hexid[16] = 0;
4534   printf_filtered ("%s  %s\n", title, (&hexid[0]));
4535 }
4536
4537 static void
4538 threadlist_test_cmd (cmd, tty)
4539      char *cmd;
4540      int tty;
4541 {
4542   int startflag = 1;
4543   threadref nextthread;
4544   int done, result_count;
4545   threadref threadlist[3];
4546
4547   printf_filtered ("Remote Threadlist test\n");
4548   if (!remote_get_threadlist (startflag, &nextthread, 3, &done,
4549                               &result_count, &threadlist[0]))
4550     printf_filtered ("FAIL: threadlist test\n");
4551   else
4552     {
4553       threadref *scan = threadlist;
4554       threadref *limit = scan + result_count;
4555
4556       while (scan < limit)
4557         output_threadid (" thread ", scan++);
4558     }
4559 }
4560
4561 void
4562 display_thread_info (info)
4563      struct gdb_ext_thread_info *info;
4564 {
4565   output_threadid ("Threadid: ", &info->threadid);
4566   printf_filtered ("Name: %s\n ", info->shortname);
4567   printf_filtered ("State: %s\n", info->display);
4568   printf_filtered ("other: %s\n\n", info->more_display);
4569 }
4570
4571 int
4572 get_and_display_threadinfo (ref)
4573      threadref *ref;
4574 {
4575   int result;
4576   int set;
4577   struct gdb_ext_thread_info threadinfo;
4578
4579   set = TAG_THREADID | TAG_EXISTS | TAG_THREADNAME
4580     | TAG_MOREDISPLAY | TAG_DISPLAY;
4581   if (0 != (result = remote_get_threadinfo (ref, set, &threadinfo)))
4582     display_thread_info (&threadinfo);
4583   return result;
4584 }
4585
4586 static void
4587 threadinfo_test_cmd (cmd, tty)
4588      char *cmd;
4589      int tty;
4590 {
4591   int athread = SAMPLE_THREAD;
4592   threadref thread;
4593   int set;
4594
4595   int_to_threadref (&thread, athread);
4596   printf_filtered ("Remote Threadinfo test\n");
4597   if (!get_and_display_threadinfo (&thread))
4598     printf_filtered ("FAIL cannot get thread info\n");
4599 }
4600
4601 static int
4602 thread_display_step (ref, context)
4603      threadref *ref;
4604      void *context;
4605 {
4606   /* output_threadid(" threadstep ",ref); *//* simple test */
4607   return get_and_display_threadinfo (ref);
4608 }
4609
4610 static void
4611 threadlist_update_test_cmd (cmd, tty)
4612      char *cmd;
4613      int tty;
4614 {
4615   printf_filtered ("Remote Threadlist update test\n");
4616   remote_threadlist_iterator (thread_display_step, 0, CRAZY_MAX_THREADS);
4617 }
4618
4619 static void
4620 init_remote_threadtests (void)
4621 {
4622   add_com ("tlist", class_obscure, threadlist_test_cmd,
4623      "Fetch and print the remote list of thread identifiers, one pkt only");
4624   add_com ("tinfo", class_obscure, threadinfo_test_cmd,
4625            "Fetch and display info about one thread");
4626   add_com ("tset", class_obscure, threadset_test_cmd,
4627            "Test setting to a different thread");
4628   add_com ("tupd", class_obscure, threadlist_update_test_cmd,
4629            "Iterate through updating all remote thread info");
4630   add_com ("talive", class_obscure, threadalive_test,
4631            " Remote thread alive test ");
4632 }
4633
4634 #endif /* 0 */
4635
4636 static void
4637 init_remote_ops ()
4638 {
4639   remote_ops.to_shortname = "remote";
4640   remote_ops.to_longname = "Remote serial target in gdb-specific protocol";
4641   remote_ops.to_doc =
4642     "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
4643 Specify the serial device it is connected to (e.g. /dev/ttya).";
4644   remote_ops.to_open = remote_open;
4645   remote_ops.to_close = remote_close;
4646   remote_ops.to_detach = remote_detach;
4647   remote_ops.to_resume = remote_resume;
4648   remote_ops.to_wait = remote_wait;
4649   remote_ops.to_fetch_registers = remote_fetch_registers;
4650   remote_ops.to_store_registers = remote_store_registers;
4651   remote_ops.to_prepare_to_store = remote_prepare_to_store;
4652   remote_ops.to_xfer_memory = remote_xfer_memory;
4653   remote_ops.to_files_info = remote_files_info;
4654   remote_ops.to_insert_breakpoint = remote_insert_breakpoint;
4655   remote_ops.to_remove_breakpoint = remote_remove_breakpoint;
4656   remote_ops.to_kill = remote_kill;
4657   remote_ops.to_load = generic_load;
4658   remote_ops.to_mourn_inferior = remote_mourn;
4659   remote_ops.to_thread_alive = remote_thread_alive;
4660   remote_ops.to_find_new_threads = remote_threads_info;
4661   remote_ops.to_stop = remote_stop;
4662   remote_ops.to_query = remote_query;
4663   remote_ops.to_rcmd = remote_rcmd;
4664   remote_ops.to_stratum = process_stratum;
4665   remote_ops.to_has_all_memory = 1;
4666   remote_ops.to_has_memory = 1;
4667   remote_ops.to_has_stack = 1;
4668   remote_ops.to_has_registers = 1;
4669   remote_ops.to_has_execution = 1;
4670   remote_ops.to_has_thread_control = tc_schedlock;      /* can lock scheduler */
4671   remote_ops.to_magic = OPS_MAGIC;
4672 }
4673
4674 /* Set up the extended remote vector by making a copy of the standard
4675    remote vector and adding to it.  */
4676
4677 static void
4678 init_extended_remote_ops ()
4679 {
4680   extended_remote_ops = remote_ops;
4681
4682   extended_remote_ops.to_shortname = "extended-remote";
4683   extended_remote_ops.to_longname =
4684     "Extended remote serial target in gdb-specific protocol";
4685   extended_remote_ops.to_doc =
4686     "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
4687 Specify the serial device it is connected to (e.g. /dev/ttya).",
4688     extended_remote_ops.to_open = extended_remote_open;
4689   extended_remote_ops.to_create_inferior = extended_remote_create_inferior;
4690   extended_remote_ops.to_mourn_inferior = extended_remote_mourn;
4691 }
4692
4693 /*
4694  * Command: info remote-process
4695  *
4696  * This implements Cisco's version of the "info proc" command.
4697  *
4698  * This query allows the target stub to return an arbitrary string
4699  * (or strings) giving arbitrary information about the target process.
4700  * This is optional; the target stub isn't required to implement it.
4701  *
4702  * Syntax: qfProcessInfo        request first string
4703  *         qsProcessInfo        request subsequent string
4704  * reply:  'O'<hex-encoded-string>
4705  *         'l'                  last reply (empty)
4706  */
4707
4708 static void
4709 remote_info_process (args, from_tty)
4710      char *args;
4711      int from_tty;
4712 {
4713   char *buf = alloca (PBUFSIZ);
4714
4715   if (remote_desc == 0)
4716     error ("Command can only be used when connected to the remote target.");
4717
4718   putpkt ("qfProcessInfo");
4719   getpkt (buf, 0);
4720   if (buf[0] == 0)
4721     return;                     /* Silently: target does not support this feature. */
4722
4723   if (buf[0] == 'E')
4724     error ("info proc: target error.");
4725
4726   while (buf[0] == 'O')         /* Capitol-O packet */
4727     {
4728       remote_console_output (&buf[1]);
4729       putpkt ("qsProcessInfo");
4730       getpkt (buf, 0);
4731     }
4732 }
4733
4734 /*
4735  * Target Cisco 
4736  */
4737
4738 static void
4739 remote_cisco_open (name, from_tty)
4740      char *name;
4741      int from_tty;
4742 {
4743   if (name == 0)
4744     error (
4745             "To open a remote debug connection, you need to specify what \n\
4746 device is attached to the remote system (e.g. host:port).");
4747
4748   /* See FIXME above */
4749   wait_forever_enabled_p = 1;
4750
4751   target_preopen (from_tty);
4752
4753   unpush_target (&remote_cisco_ops);
4754
4755   remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes);
4756
4757   remote_desc = SERIAL_OPEN (name);
4758   if (!remote_desc)
4759     perror_with_name (name);
4760
4761   /*
4762    * If a baud rate was specified on the gdb  command line it will
4763    * be greater than the initial value of -1.  If it is, use it otherwise
4764    * default to 9600
4765    */
4766
4767   baud_rate = (baud_rate > 0) ? baud_rate : 9600;
4768   if (SERIAL_SETBAUDRATE (remote_desc, baud_rate))
4769     {
4770       SERIAL_CLOSE (remote_desc);
4771       perror_with_name (name);
4772     }
4773
4774   SERIAL_RAW (remote_desc);
4775
4776   /* If there is something sitting in the buffer we might take it as a
4777      response to a command, which would be bad.  */
4778   SERIAL_FLUSH_INPUT (remote_desc);
4779
4780   if (from_tty)
4781     {
4782       puts_filtered ("Remote debugging using ");
4783       puts_filtered (name);
4784       puts_filtered ("\n");
4785     }
4786
4787   remote_cisco_mode = 1;
4788
4789   push_target (&remote_cisco_ops);      /* Switch to using cisco target now */
4790
4791   init_packet_config (&remote_protocol_P);
4792   init_packet_config (&remote_protocol_Z);
4793
4794   general_thread = -2;
4795   continue_thread = -2;
4796
4797   /* Force remote_write_bytes to check whether target supports
4798      binary downloading. */
4799   init_packet_config (&remote_protocol_binary_download);
4800
4801   /* Without this, some commands which require an active target (such
4802      as kill) won't work.  This variable serves (at least) double duty
4803      as both the pid of the target process (if it has such), and as a
4804      flag indicating that a target is active.  These functions should
4805      be split out into seperate variables, especially since GDB will
4806      someday have a notion of debugging several processes.  */
4807   inferior_pid = MAGIC_NULL_PID;
4808
4809   /* Start the remote connection; if error (0), discard this target. */
4810
4811   if (!catch_errors (remote_start_remote_dummy, (char *) 0,
4812                      "Couldn't establish connection to remote target\n",
4813                      RETURN_MASK_ALL))
4814     {
4815       pop_target ();
4816       return;
4817     }
4818 }
4819
4820 static void
4821 remote_cisco_close (quitting)
4822      int quitting;
4823 {
4824   remote_cisco_mode = 0;
4825   remote_close (quitting);
4826 }
4827
4828 static void
4829   remote_cisco_mourn
4830 PARAMS ((void))
4831 {
4832   remote_mourn_1 (&remote_cisco_ops);
4833 }
4834
4835 enum
4836 {
4837   READ_MORE,
4838   FATAL_ERROR,
4839   ENTER_DEBUG,
4840   DISCONNECT_TELNET
4841 }
4842 minitelnet_return;
4843
4844 /* shared between readsocket() and readtty()  */
4845 static char *tty_input;
4846
4847 static int escape_count;
4848 static int echo_check;
4849 extern int quit_flag;
4850
4851 static int
4852 readsocket ()
4853 {
4854   int data;
4855
4856   /* Loop until the socket doesn't have any more data */
4857
4858   while ((data = readchar (0)) >= 0)
4859     {
4860       /* Check for the escape sequence */
4861       if (data == '|')
4862         {
4863           /* If this is the fourth escape, get out */
4864           if (++escape_count == 4)
4865             {
4866               return ENTER_DEBUG;
4867             }
4868           else
4869             {                   /* This is a '|', but not the fourth in a row. 
4870                                    Continue without echoing it.  If it isn't actually 
4871                                    one of four in a row, it'll be echoed later.  */
4872               continue;
4873             }
4874         }
4875       else
4876         /* Not a '|' */
4877         {
4878           /* Ensure any pending '|'s are flushed.  */
4879
4880           for (; escape_count > 0; escape_count--)
4881             putchar ('|');
4882         }
4883
4884       if (data == '\r')         /* If this is a return character, */
4885         continue;               /*  - just supress it. */
4886
4887       if (echo_check != -1)     /* Check for echo of user input.  */
4888         {
4889           if (tty_input[echo_check] == data)
4890             {
4891               echo_check++;     /* Character matched user input: */
4892               continue;         /* Continue without echoing it.  */
4893             }
4894           else if ((data == '\n') && (tty_input[echo_check] == '\r'))
4895             {                   /* End of the line (and of echo checking).  */
4896               echo_check = -1;  /* No more echo supression */
4897               continue;         /* Continue without echoing.  */
4898             }
4899           else
4900             {                   /* Failed check for echo of user input.
4901                                    We now have some suppressed output to flush!  */
4902               int j;
4903
4904               for (j = 0; j < echo_check; j++)
4905                 putchar (tty_input[j]);
4906               echo_check = -1;
4907             }
4908         }
4909       putchar (data);           /* Default case: output the char.  */
4910     }
4911
4912   if (data == SERIAL_TIMEOUT)   /* Timeout returned from readchar.  */
4913     return READ_MORE;           /* Try to read some more */
4914   else
4915     return FATAL_ERROR;         /* Trouble, bail out */
4916 }
4917
4918 static int
4919 readtty ()
4920 {
4921   int tty_bytecount;
4922
4923   /* First, read a buffer full from the terminal */
4924   tty_bytecount = read (fileno (stdin), tty_input, sizeof (tty_input) - 1);
4925   if (tty_bytecount == -1)
4926     {
4927       perror ("readtty: read failed");
4928       return FATAL_ERROR;
4929     }
4930
4931   /* Remove a quoted newline.  */
4932   if (tty_input[tty_bytecount - 1] == '\n' &&
4933       tty_input[tty_bytecount - 2] == '\\')     /* line ending in backslash */
4934     {
4935       tty_input[--tty_bytecount] = 0;   /* remove newline */
4936       tty_input[--tty_bytecount] = 0;   /* remove backslash */
4937     }
4938
4939   /* Turn trailing newlines into returns */
4940   if (tty_input[tty_bytecount - 1] == '\n')
4941     tty_input[tty_bytecount - 1] = '\r';
4942
4943   /* If the line consists of a ~, enter debugging mode.  */
4944   if ((tty_input[0] == '~') && (tty_bytecount == 2))
4945     return ENTER_DEBUG;
4946
4947   /* Make this a zero terminated string and write it out */
4948   tty_input[tty_bytecount] = 0;
4949   if (SERIAL_WRITE (remote_desc, tty_input, tty_bytecount))
4950     {
4951       perror_with_name ("readtty: write failed");
4952       return FATAL_ERROR;
4953     }
4954
4955   return READ_MORE;
4956 }
4957
4958 static int
4959 minitelnet ()
4960 {
4961   fd_set input;                 /* file descriptors for select */
4962   int tablesize;                /* max number of FDs for select */
4963   int status;
4964   int quit_count = 0;
4965
4966   extern int escape_count;      /* global shared by readsocket */
4967   extern int echo_check;        /* ditto */
4968
4969   escape_count = 0;
4970   echo_check = -1;
4971
4972   tablesize = 8 * sizeof (input);
4973
4974   for (;;)
4975     {
4976       /* Check for anything from our socket - doesn't block. Note that
4977          this must be done *before* the select as there may be
4978          buffered I/O waiting to be processed.  */
4979
4980       if ((status = readsocket ()) == FATAL_ERROR)
4981         {
4982           error ("Debugging terminated by communications error");
4983         }
4984       else if (status != READ_MORE)
4985         {
4986           return (status);
4987         }
4988
4989       fflush (stdout);          /* Flush output before blocking */
4990
4991       /* Now block on more socket input or TTY input */
4992
4993       FD_ZERO (&input);
4994       FD_SET (fileno (stdin), &input);
4995       FD_SET (DEPRECATED_SERIAL_FD (remote_desc), &input);
4996
4997       status = select (tablesize, &input, 0, 0, 0);
4998       if ((status == -1) && (errno != EINTR))
4999         {
5000           error ("Communications error on select %d", errno);
5001         }
5002
5003       /* Handle Control-C typed */
5004
5005       if (quit_flag)
5006         {
5007           if ((++quit_count) == 2)
5008             {
5009               if (query ("Interrupt GDB? "))
5010                 {
5011                   printf_filtered ("Interrupted by user.\n");
5012                   return_to_top_level (RETURN_QUIT);
5013                 }
5014               quit_count = 0;
5015             }
5016           quit_flag = 0;
5017
5018           if (remote_break)
5019             SERIAL_SEND_BREAK (remote_desc);
5020           else
5021             SERIAL_WRITE (remote_desc, "\003", 1);
5022
5023           continue;
5024         }
5025
5026       /* Handle console input */
5027
5028       if (FD_ISSET (fileno (stdin), &input))
5029         {
5030           quit_count = 0;
5031           echo_check = 0;
5032           status = readtty ();
5033           if (status == READ_MORE)
5034             continue;
5035
5036           return status;        /* telnet session ended */
5037         }
5038     }
5039 }
5040
5041 static int
5042 remote_cisco_wait (pid, status)
5043      int pid;
5044      struct target_waitstatus *status;
5045 {
5046   if (minitelnet () != ENTER_DEBUG)
5047     {
5048       error ("Debugging session terminated by protocol error");
5049     }
5050   putpkt ("?");
5051   return remote_wait (pid, status);
5052 }
5053
5054 static void
5055 init_remote_cisco_ops ()
5056 {
5057   remote_cisco_ops.to_shortname = "cisco";
5058   remote_cisco_ops.to_longname = "Remote serial target in cisco-specific protocol";
5059   remote_cisco_ops.to_doc =
5060     "Use a remote machine via TCP, using a cisco-specific protocol.\n\
5061 Specify the serial device it is connected to (e.g. host:2020).";
5062   remote_cisco_ops.to_open = remote_cisco_open;
5063   remote_cisco_ops.to_close = remote_cisco_close;
5064   remote_cisco_ops.to_detach = remote_detach;
5065   remote_cisco_ops.to_resume = remote_resume;
5066   remote_cisco_ops.to_wait = remote_cisco_wait;
5067   remote_cisco_ops.to_fetch_registers = remote_fetch_registers;
5068   remote_cisco_ops.to_store_registers = remote_store_registers;
5069   remote_cisco_ops.to_prepare_to_store = remote_prepare_to_store;
5070   remote_cisco_ops.to_xfer_memory = remote_xfer_memory;
5071   remote_cisco_ops.to_files_info = remote_files_info;
5072   remote_cisco_ops.to_insert_breakpoint = remote_insert_breakpoint;
5073   remote_cisco_ops.to_remove_breakpoint = remote_remove_breakpoint;
5074   remote_cisco_ops.to_kill = remote_kill;
5075   remote_cisco_ops.to_load = generic_load;
5076   remote_cisco_ops.to_mourn_inferior = remote_cisco_mourn;
5077   remote_cisco_ops.to_thread_alive = remote_thread_alive;
5078   remote_cisco_ops.to_find_new_threads = remote_threads_info;
5079   remote_cisco_ops.to_stratum = process_stratum;
5080   remote_cisco_ops.to_has_all_memory = 1;
5081   remote_cisco_ops.to_has_memory = 1;
5082   remote_cisco_ops.to_has_stack = 1;
5083   remote_cisco_ops.to_has_registers = 1;
5084   remote_cisco_ops.to_has_execution = 1;
5085   remote_cisco_ops.to_magic = OPS_MAGIC;
5086 }
5087
5088 static int
5089 remote_can_async_p (void)
5090 {
5091   /* We're async whenever the serial device is. */
5092   return SERIAL_CAN_ASYNC_P (remote_desc);
5093 }
5094
5095 static int
5096 remote_is_async_p (void)
5097 {
5098   /* We're async whenever the serial device is. */
5099   return SERIAL_IS_ASYNC_P (remote_desc);
5100 }
5101
5102 /* Pass the SERIAL event on and up to the client.  One day this code
5103    will be able to delay notifying the client of an event until the
5104    point where an entire packet has been received. */
5105
5106 static void (*async_client_callback) (enum inferior_event_type event_type, void *context);
5107 static void *async_client_context;
5108 static serial_event_ftype remote_async_serial_handler;
5109
5110 static void
5111 remote_async_serial_handler (serial_t scb, void *context)
5112 {
5113   /* Don't propogate error information up to the client.  Instead let
5114      the client find out about the error by querying the target.  */
5115   async_client_callback (INF_REG_EVENT, async_client_context);
5116 }
5117
5118 static void
5119 remote_async (void (*callback) (enum inferior_event_type event_type, void *context), void *context)
5120 {
5121   if (callback != NULL)
5122     {
5123       SERIAL_ASYNC (remote_desc, remote_async_serial_handler, NULL);
5124       async_client_callback = callback;
5125       async_client_context = context;
5126     }
5127   else
5128     SERIAL_ASYNC (remote_desc, NULL, NULL);
5129 }
5130
5131 /* Target async and target extended-async.
5132
5133    This are temporary targets, until it is all tested.  Eventually
5134    async support will be incorporated int the usual 'remote'
5135    target. */
5136
5137 static void
5138 init_remote_async_ops ()
5139 {
5140   remote_async_ops.to_shortname = "async";
5141   remote_async_ops.to_longname = "Remote serial target in async version of the gdb-specific protocol";
5142   remote_async_ops.to_doc =
5143     "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
5144 Specify the serial device it is connected to (e.g. /dev/ttya).";
5145   remote_async_ops.to_open = remote_async_open;
5146   remote_async_ops.to_close = remote_close;
5147   remote_async_ops.to_detach = remote_async_detach;
5148   remote_async_ops.to_resume = remote_async_resume;
5149   remote_async_ops.to_wait = remote_async_wait;
5150   remote_async_ops.to_fetch_registers = remote_fetch_registers;
5151   remote_async_ops.to_store_registers = remote_store_registers;
5152   remote_async_ops.to_prepare_to_store = remote_prepare_to_store;
5153   remote_async_ops.to_xfer_memory = remote_xfer_memory;
5154   remote_async_ops.to_files_info = remote_files_info;
5155   remote_async_ops.to_insert_breakpoint = remote_insert_breakpoint;
5156   remote_async_ops.to_remove_breakpoint = remote_remove_breakpoint;
5157   remote_async_ops.to_terminal_inferior = remote_async_terminal_inferior;
5158   remote_async_ops.to_terminal_ours = remote_async_terminal_ours;
5159   remote_async_ops.to_kill = remote_async_kill;
5160   remote_async_ops.to_load = generic_load;
5161   remote_async_ops.to_mourn_inferior = remote_async_mourn;
5162   remote_async_ops.to_thread_alive = remote_thread_alive;
5163   remote_async_ops.to_find_new_threads = remote_threads_info;
5164   remote_async_ops.to_stop = remote_stop;
5165   remote_async_ops.to_query = remote_query;
5166   remote_async_ops.to_rcmd = remote_rcmd;
5167   remote_async_ops.to_stratum = process_stratum;
5168   remote_async_ops.to_has_all_memory = 1;
5169   remote_async_ops.to_has_memory = 1;
5170   remote_async_ops.to_has_stack = 1;
5171   remote_async_ops.to_has_registers = 1;
5172   remote_async_ops.to_has_execution = 1;
5173   remote_async_ops.to_has_thread_control = tc_schedlock;        /* can lock scheduler */
5174   remote_async_ops.to_can_async_p = remote_can_async_p;
5175   remote_async_ops.to_is_async_p = remote_is_async_p;
5176   remote_async_ops.to_async = remote_async;
5177   remote_async_ops.to_magic = OPS_MAGIC;
5178 }
5179
5180 /* Set up the async extended remote vector by making a copy of the standard
5181    remote vector and adding to it.  */
5182
5183 static void
5184 init_extended_async_remote_ops ()
5185 {
5186   extended_async_remote_ops = remote_async_ops;
5187
5188   extended_async_remote_ops.to_shortname = "extended-async";
5189   extended_async_remote_ops.to_longname =
5190     "Extended remote serial target in async gdb-specific protocol";
5191   extended_async_remote_ops.to_doc =
5192     "Use a remote computer via a serial line, using an async gdb-specific protocol.\n\
5193 Specify the serial device it is connected to (e.g. /dev/ttya).",
5194     extended_async_remote_ops.to_open = extended_remote_async_open;
5195   extended_async_remote_ops.to_create_inferior = extended_remote_async_create_inferior;
5196   extended_async_remote_ops.to_mourn_inferior = extended_remote_mourn;
5197 }
5198
5199 static void
5200 set_remote_cmd (args, from_tty)
5201      char *args;
5202      int from_tty;
5203 {
5204   
5205 }
5206
5207
5208 static void
5209 build_remote_gdbarch_data ()
5210 {
5211   tty_input = xmalloc (PBUFSIZ);
5212 }
5213
5214 void
5215 _initialize_remote ()
5216 {
5217   static struct cmd_list_element *remote_set_cmdlist;
5218   static struct cmd_list_element *remote_show_cmdlist;
5219
5220   /* architecture specific data */
5221   build_remote_gdbarch_data ();
5222   register_gdbarch_swap (&tty_input, sizeof (&tty_input), NULL);
5223   register_gdbarch_swap (NULL, 0, build_remote_gdbarch_data);
5224
5225   /* runtime constants - we retain the value of remote_write_size
5226      across architecture swaps. */
5227   remote_write_size = PBUFSIZ;
5228
5229   init_remote_ops ();
5230   add_target (&remote_ops);
5231
5232   init_extended_remote_ops ();
5233   add_target (&extended_remote_ops);
5234
5235   init_remote_async_ops ();
5236   add_target (&remote_async_ops);
5237
5238   init_extended_async_remote_ops ();
5239   add_target (&extended_async_remote_ops);
5240
5241   init_remote_cisco_ops ();
5242   add_target (&remote_cisco_ops);
5243
5244 #if 0
5245   init_remote_threadtests ();
5246 #endif
5247
5248   add_prefix_cmd ("remote", class_maintenance, set_remote_cmd, "\
5249 Remote protocol specific variables\n\
5250 Configure various remote-protocol specific variables such as\n\
5251 the packets being used",
5252                   &remote_set_cmdlist, "set remote ",
5253                   0/*allow-unknown*/, &setlist);
5254   add_prefix_cmd ("remote", class_maintenance, set_remote_cmd, "\
5255 Remote protocol specific variables\n\
5256 Configure various remote-protocol specific variables such as\n\
5257 the packets being used",
5258                   &remote_show_cmdlist, "show remote ",
5259                   0/*allow-unknown*/, &showlist);
5260
5261   add_cmd ("compare-sections", class_obscure, compare_sections_command,
5262            "Compare section data on target to the exec file.\n\
5263 Argument is a single section name (default: all loaded sections).",
5264            &cmdlist);
5265
5266   add_cmd ("packet", class_maintenance, packet_command,
5267            "Send an arbitrary packet to a remote target.\n\
5268    maintenance packet TEXT\n\
5269 If GDB is talking to an inferior via the GDB serial protocol, then\n\
5270 this command sends the string TEXT to the inferior, and displays the\n\
5271 response packet.  GDB supplies the initial `$' character, and the\n\
5272 terminating `#' character and checksum.",
5273            &maintenancelist);
5274
5275   add_show_from_set
5276     (add_set_cmd ("remotetimeout", no_class,
5277                   var_integer, (char *) &remote_timeout,
5278                   "Set timeout value for remote read.\n",
5279                   &setlist),
5280      &showlist);
5281
5282   add_show_from_set
5283     (add_set_cmd ("remotebreak", no_class,
5284                   var_boolean, (char *) &remote_break,
5285                   "Set whether to send break if interrupted.\n",
5286                   &setlist),
5287      &showlist);
5288
5289   add_show_from_set
5290     (add_set_cmd ("remotewritesize", no_class,
5291                   var_integer, (char *) &remote_write_size,
5292                "Set the maximum number of bytes per memory write packet.\n",
5293                   &setlist),
5294      &showlist);
5295
5296   remote_address_size = TARGET_PTR_BIT;
5297   add_show_from_set
5298     (add_set_cmd ("remoteaddresssize", class_obscure,
5299                   var_integer, (char *) &remote_address_size,
5300                   "Set the maximum size of the address (in bits) \
5301 in a memory packet.\n",
5302                   &setlist),
5303      &showlist);
5304
5305   add_packet_config_cmd (&remote_protocol_binary_download,
5306                          "X", "binary-download",
5307                          set_remote_protocol_binary_download_cmd,
5308                          show_remote_protocol_binary_download_cmd,
5309                          &remote_set_cmdlist, &remote_show_cmdlist);
5310 #if 0
5311   /* XXXX - should ``set remotebinarydownload'' be retained for
5312      compatibility. */
5313   add_show_from_set
5314     (add_set_cmd ("remotebinarydownload", no_class,
5315                   var_boolean, (char *) &remote_binary_download,
5316                   "Set binary downloads.\n", &setlist),
5317      &showlist);
5318 #endif
5319
5320   add_info ("remote-process", remote_info_process,
5321             "Query the remote system for process info.");
5322
5323   add_packet_config_cmd (&remote_protocol_P, "P", "set-register",
5324                          set_remote_protocol_P_packet_cmd,
5325                          show_remote_protocol_P_packet_cmd,
5326                          &remote_set_cmdlist, &remote_show_cmdlist);
5327
5328   add_packet_config_cmd (&remote_protocol_Z, "Z", "breakpoint",
5329                          set_remote_protocol_Z_packet_cmd,
5330                          show_remote_protocol_Z_packet_cmd,
5331                          &remote_set_cmdlist, &remote_show_cmdlist);
5332 }