* remote-mips.c: Clean up comment and extraneous semicolon
[platform/upstream/binutils.git] / gdb / remote-mips.c
1 /* Remote debugging interface for MIPS remote debugging protocol.
2    Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
3    Contributed by Cygnus Support.  Written by Ian Lance Taylor
4    <ian@cygnus.com>.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22 #include "defs.h"
23 #include "inferior.h"
24 #include "bfd.h"
25 #include "symfile.h"
26 #include "wait.h"
27 #include "gdbcmd.h"
28 #include "gdbcore.h"
29 #include "serial.h"
30 #include "target.h"
31 #include "remote-utils.h"
32 #include "gdb_string.h"
33
34 #include <signal.h>
35 #include <sys/types.h>
36 #include <sys/stat.h>
37 #ifdef ANSI_PROTOTYPES
38 #include <stdarg.h>
39 #else
40 #include <varargs.h>
41 #endif
42
43 /* Microsoft C's stat.h doesn't define all the POSIX file modes.  */
44 #ifndef S_IROTH
45 #define S_IROTH S_IREAD
46 #endif
47
48 extern void mips_set_processor_type_command PARAMS ((char *, int));
49
50 \f
51 /* Prototypes for local functions.  */
52
53 static int mips_readchar PARAMS ((int timeout));
54
55 static int mips_receive_header PARAMS ((unsigned char *hdr, int *pgarbage,
56                                         int ch, int timeout));
57
58 static int mips_receive_trailer PARAMS ((unsigned char *trlr, int *pgarbage,
59                                          int *pch, int timeout));
60
61 static int mips_cksum PARAMS ((const unsigned char *hdr,
62                                const unsigned char *data,
63                                int len));
64
65 static void mips_send_packet PARAMS ((const char *s, int get_ack));
66
67 static void mips_send_command PARAMS ((const char *cmd, int prompt));
68
69 static int mips_receive_packet PARAMS ((char *buff, int throw_error,
70                                         int timeout));
71
72 static CORE_ADDR mips_request PARAMS ((int cmd, CORE_ADDR addr,
73                                  CORE_ADDR data, int *perr, int timeout,
74                                  char *buff));
75
76 static void mips_initialize PARAMS ((void));
77
78 static void mips_open PARAMS ((char *name, int from_tty));
79
80 static void pmon_open PARAMS ((char *name, int from_tty));
81
82 static void ddb_open PARAMS ((char *name, int from_tty));
83
84 static void lsi_open PARAMS ((char *name, int from_tty));
85
86 static void mips_close PARAMS ((int quitting));
87
88 static void mips_detach PARAMS ((char *args, int from_tty));
89
90 static void mips_resume PARAMS ((int pid, int step,
91                                  enum target_signal siggnal));
92
93 static int mips_wait PARAMS ((int pid, struct target_waitstatus *status));
94
95 static int pmon_wait PARAMS ((int pid, struct target_waitstatus *status));
96
97 static int mips_map_regno PARAMS ((int regno));
98
99 static void mips_fetch_registers PARAMS ((int regno));
100
101 static void mips_prepare_to_store PARAMS ((void));
102
103 static void mips_store_registers PARAMS ((int regno));
104
105 static unsigned int mips_fetch_word PARAMS ((CORE_ADDR addr));
106
107 static int mips_store_word PARAMS ((CORE_ADDR addr, unsigned int value,
108                                     char *old_contents));
109
110 static int mips_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len,
111                                      int write, struct target_ops *ignore));
112
113 static void mips_files_info PARAMS ((struct target_ops *ignore));
114
115 static void mips_create_inferior PARAMS ((char *execfile, char *args,
116                                           char **env));
117
118 static void mips_mourn_inferior PARAMS ((void));
119
120 static int pmon_makeb64 PARAMS ((unsigned long v, char *p, int n, int *chksum));
121
122 static int pmon_zeroset PARAMS ((int recsize, char **buff, int *amount,
123                                  unsigned int *chksum));
124
125 static int pmon_checkset PARAMS ((int recsize, char **buff, int *value));
126
127 static void pmon_make_fastrec PARAMS ((char **outbuf, unsigned char *inbuf,
128                                        int *inptr, int inamount, int *recsize,
129                                        unsigned int *csum, unsigned int *zerofill));
130
131 static int pmon_check_ack PARAMS ((char *mesg));
132
133 static void pmon_start_download PARAMS ((void));
134
135 static void pmon_end_download PARAMS ((int final, int bintotal));
136
137 static void pmon_download PARAMS ((char *buffer, int length));
138
139 static void pmon_load_fast PARAMS ((char *file));
140
141 static void mips_load PARAMS ((char *file, int from_tty));
142
143 static int mips_make_srec PARAMS ((char *buffer, int type, CORE_ADDR memaddr,
144                                    unsigned char *myaddr, int len));
145
146 static int common_breakpoint PARAMS ((int cmd, CORE_ADDR addr, CORE_ADDR mask,
147                                       char *flags));
148
149 /* Forward declarations.  */
150 extern struct target_ops mips_ops;
151 extern struct target_ops pmon_ops;
152 extern struct target_ops ddb_ops;
153 \f
154 /* The MIPS remote debugging interface is built on top of a simple
155    packet protocol.  Each packet is organized as follows:
156
157    SYN  The first character is always a SYN (ASCII 026, or ^V).  SYN
158         may not appear anywhere else in the packet.  Any time a SYN is
159         seen, a new packet should be assumed to have begun.
160
161    TYPE_LEN
162         This byte contains the upper five bits of the logical length
163         of the data section, plus a single bit indicating whether this
164         is a data packet or an acknowledgement.  The documentation
165         indicates that this bit is 1 for a data packet, but the actual
166         board uses 1 for an acknowledgement.  The value of the byte is
167                 0x40 + (ack ? 0x20 : 0) + (len >> 6)
168         (we always have 0 <= len < 1024).  Acknowledgement packets do
169         not carry data, and must have a data length of 0.
170
171    LEN1 This byte contains the lower six bits of the logical length of
172         the data section.  The value is
173                 0x40 + (len & 0x3f)
174
175    SEQ  This byte contains the six bit sequence number of the packet.
176         The value is
177                 0x40 + seq
178         An acknowlegment packet contains the sequence number of the
179         packet being acknowledged plus 1 modulo 64.  Data packets are
180         transmitted in sequence.  There may only be one outstanding
181         unacknowledged data packet at a time.  The sequence numbers
182         are independent in each direction.  If an acknowledgement for
183         the previous packet is received (i.e., an acknowledgement with
184         the sequence number of the packet just sent) the packet just
185         sent should be retransmitted.  If no acknowledgement is
186         received within a timeout period, the packet should be
187         retransmitted.  This has an unfortunate failure condition on a
188         high-latency line, as a delayed acknowledgement may lead to an
189         endless series of duplicate packets.
190
191    DATA The actual data bytes follow.  The following characters are
192         escaped inline with DLE (ASCII 020, or ^P):
193                 SYN (026)       DLE S
194                 DLE (020)       DLE D
195                 ^C  (003)       DLE C
196                 ^S  (023)       DLE s
197                 ^Q  (021)       DLE q
198         The additional DLE characters are not counted in the logical
199         length stored in the TYPE_LEN and LEN1 bytes.
200
201    CSUM1
202    CSUM2
203    CSUM3
204         These bytes contain an 18 bit checksum of the complete
205         contents of the packet excluding the SEQ byte and the
206         CSUM[123] bytes.  The checksum is simply the twos complement
207         addition of all the bytes treated as unsigned characters.  The
208         values of the checksum bytes are:
209                 CSUM1: 0x40 + ((cksum >> 12) & 0x3f)
210                 CSUM2: 0x40 + ((cksum >> 6) & 0x3f)
211                 CSUM3: 0x40 + (cksum & 0x3f)
212
213    It happens that the MIPS remote debugging protocol always
214    communicates with ASCII strings.  Because of this, this
215    implementation doesn't bother to handle the DLE quoting mechanism,
216    since it will never be required.  */
217
218 /* The SYN character which starts each packet.  */
219 #define SYN '\026'
220
221 /* The 0x40 used to offset each packet (this value ensures that all of
222    the header and trailer bytes, other than SYN, are printable ASCII
223    characters).  */
224 #define HDR_OFFSET 0x40
225
226 /* The indices of the bytes in the packet header.  */
227 #define HDR_INDX_SYN 0
228 #define HDR_INDX_TYPE_LEN 1
229 #define HDR_INDX_LEN1 2
230 #define HDR_INDX_SEQ 3
231 #define HDR_LENGTH 4
232
233 /* The data/ack bit in the TYPE_LEN header byte.  */
234 #define TYPE_LEN_DA_BIT 0x20
235 #define TYPE_LEN_DATA 0
236 #define TYPE_LEN_ACK TYPE_LEN_DA_BIT
237
238 /* How to compute the header bytes.  */
239 #define HDR_SET_SYN(data, len, seq) (SYN)
240 #define HDR_SET_TYPE_LEN(data, len, seq) \
241   (HDR_OFFSET \
242    + ((data) ? TYPE_LEN_DATA : TYPE_LEN_ACK) \
243    + (((len) >> 6) & 0x1f))
244 #define HDR_SET_LEN1(data, len, seq) (HDR_OFFSET + ((len) & 0x3f))
245 #define HDR_SET_SEQ(data, len, seq) (HDR_OFFSET + (seq))
246
247 /* Check that a header byte is reasonable.  */
248 #define HDR_CHECK(ch) (((ch) & HDR_OFFSET) == HDR_OFFSET)
249
250 /* Get data from the header.  These macros evaluate their argument
251    multiple times.  */
252 #define HDR_IS_DATA(hdr) \
253   (((hdr)[HDR_INDX_TYPE_LEN] & TYPE_LEN_DA_BIT) == TYPE_LEN_DATA)
254 #define HDR_GET_LEN(hdr) \
255   ((((hdr)[HDR_INDX_TYPE_LEN] & 0x1f) << 6) + (((hdr)[HDR_INDX_LEN1] & 0x3f)))
256 #define HDR_GET_SEQ(hdr) ((unsigned int)(hdr)[HDR_INDX_SEQ] & 0x3f)
257
258 /* The maximum data length.  */
259 #define DATA_MAXLEN 1023
260
261 /* The trailer offset.  */
262 #define TRLR_OFFSET HDR_OFFSET
263
264 /* The indices of the bytes in the packet trailer.  */
265 #define TRLR_INDX_CSUM1 0
266 #define TRLR_INDX_CSUM2 1
267 #define TRLR_INDX_CSUM3 2
268 #define TRLR_LENGTH 3
269
270 /* How to compute the trailer bytes.  */
271 #define TRLR_SET_CSUM1(cksum) (TRLR_OFFSET + (((cksum) >> 12) & 0x3f))
272 #define TRLR_SET_CSUM2(cksum) (TRLR_OFFSET + (((cksum) >>  6) & 0x3f))
273 #define TRLR_SET_CSUM3(cksum) (TRLR_OFFSET + (((cksum)      ) & 0x3f))
274
275 /* Check that a trailer byte is reasonable.  */
276 #define TRLR_CHECK(ch) (((ch) & TRLR_OFFSET) == TRLR_OFFSET)
277
278 /* Get data from the trailer.  This evaluates its argument multiple
279    times.  */
280 #define TRLR_GET_CKSUM(trlr) \
281   ((((trlr)[TRLR_INDX_CSUM1] & 0x3f) << 12) \
282    + (((trlr)[TRLR_INDX_CSUM2] & 0x3f) <<  6) \
283    + ((trlr)[TRLR_INDX_CSUM3] & 0x3f))
284
285 /* The sequence number modulos.  */
286 #define SEQ_MODULOS (64)
287
288 /* PMON commands to load from the serial port or UDP socket.  */
289 #define LOAD_CMD        "load -b -s tty0\r"
290 #define LOAD_CMD_UDP    "load -b -s udp\r"
291
292 enum mips_monitor_type {
293   /* IDT/SIM monitor being used: */
294   MON_IDT,
295   /* PMON monitor being used: */
296   MON_PMON, /* 3.0.83 [COGENT,EB,FP,NET] Algorithmics Ltd. Nov  9 1995 17:19:50 */
297   MON_DDB,  /* 2.7.473 [DDBVR4300,EL,FP,NET] Risq Modular Systems,  Thu Jun 6 09:28:40 PDT 1996 */
298   MON_LSI,  /* 4.3.12 [EB,FP], LSI LOGIC Corp. Tue Feb 25 13:22:14 1997 */
299   /* Last and unused value, for sizing vectors, etc. */
300   MON_LAST
301 };
302 static enum mips_monitor_type mips_monitor = MON_LAST;
303
304 /* The monitor prompt text.  If the user sets the PMON prompt
305    to some new value, the GDB `set monitor-prompt' command must also
306    be used to inform GDB about the expected prompt.  Otherwise, GDB
307    will not be able to connect to PMON in mips_initialize().
308    If the `set monitor-prompt' command is not used, the expected
309    default prompt will be set according the target:
310         target          prompt
311         -----           -----
312         pmon            PMON> 
313         ddb             NEC010>
314         lsi             PMON>
315 */
316 static char *mips_monitor_prompt;
317
318 /* Set to 1 if the target is open.  */
319 static int mips_is_open;
320
321 /* Currently active target description (if mips_is_open == 1) */
322 static struct target_ops *current_ops;
323
324 /* Set to 1 while the connection is being initialized.  */
325 static int mips_initializing;
326
327 /* Set to 1 while the connection is being brought down.  */
328 static int mips_exiting;
329
330 /* The next sequence number to send.  */
331 static unsigned int mips_send_seq;
332
333 /* The next sequence number we expect to receive.  */
334 static unsigned int mips_receive_seq;
335
336 /* The time to wait before retransmitting a packet, in seconds.  */
337 static int mips_retransmit_wait = 3;
338
339 /* The number of times to try retransmitting a packet before giving up.  */
340 static int mips_send_retries = 10;
341
342 /* The number of garbage characters to accept when looking for an
343    SYN for the next packet.  */
344 static int mips_syn_garbage = 1050;
345
346 /* The time to wait for a packet, in seconds.  */
347 static int mips_receive_wait = 5;
348
349 /* Set if we have sent a packet to the board but have not yet received
350    a reply.  */
351 static int mips_need_reply = 0;
352
353 /* Handle used to access serial I/O stream.  */
354 static serial_t mips_desc;
355
356 /* UDP handle used to download files to target.  */
357 static serial_t udp_desc;
358 static int udp_in_use;
359
360 /* TFTP filename used to download files to DDB board, in the form
361    host:filename.  */
362 static char *tftp_name;         /* host:filename */
363 static char *tftp_localname;    /* filename portion of above */
364 static int tftp_in_use;
365 static FILE *tftp_file;
366
367 /* Counts the number of times the user tried to interrupt the target (usually
368    via ^C.  */
369 static int interrupt_count;
370
371 /* If non-zero, means that the target is running. */
372 static int mips_wait_flag = 0;
373
374 /* If non-zero, monitor supports breakpoint commands. */
375 static monitor_supports_breakpoints = 0;
376
377 /* Data cache header.  */
378
379 #if 0   /* not used (yet?) */
380 static DCACHE *mips_dcache;
381 #endif
382
383 /* Non-zero means that we've just hit a read or write watchpoint */
384 static int hit_watchpoint;
385
386 static void
387 close_ports()
388 {
389   mips_is_open = 0;
390   SERIAL_CLOSE (mips_desc);
391
392   if (udp_in_use)
393     {
394       SERIAL_CLOSE (udp_desc);
395       udp_in_use = 0;
396     }
397   tftp_in_use = 0;
398 }
399     
400 /* Handle low-level error that we can't recover from.  Note that just
401    error()ing out from target_wait or some such low-level place will cause
402    all hell to break loose--the rest of GDB will tend to get left in an
403    inconsistent state.  */
404
405 static NORETURN void
406 #ifdef ANSI_PROTOTYPES
407 mips_error (char *string, ...)
408 #else
409 mips_error (va_alist)
410      va_dcl
411 #endif
412 {
413   va_list args;
414
415 #ifdef ANSI_PROTOTYPES
416   va_start (args, string);
417 #else
418   char *string;
419   va_start (args);
420   string = va_arg (args, char *);
421 #endif
422  
423   target_terminal_ours ();
424   wrap_here("");                        /* Force out any buffered output */
425   gdb_flush (gdb_stdout);
426   if (error_pre_print)
427     fprintf_filtered (gdb_stderr, error_pre_print);
428   vfprintf_filtered (gdb_stderr, string, args);
429   fprintf_filtered (gdb_stderr, "\n");
430   va_end (args);
431   gdb_flush (gdb_stderr);
432
433   /* Clean up in such a way that mips_close won't try to talk to the
434      board (it almost surely won't work since we weren't able to talk to
435      it).  */
436   close_ports ();
437
438   printf_unfiltered ("Ending remote MIPS debugging.\n");
439   target_mourn_inferior ();
440
441   return_to_top_level (RETURN_ERROR);
442 }
443
444 /* putc_readable - print a character, displaying non-printable chars in
445    ^x notation or in hex.  */
446
447 static void
448 putc_readable (ch)
449      int ch;
450 {
451   if (ch == '\n')
452     putchar_unfiltered ('\n');
453   else if (ch == '\r')
454     printf_unfiltered ("\\r");
455   else if (ch < 0x20)   /* ASCII control character */
456     printf_unfiltered ("^%c", ch + '@');
457   else if (ch >= 0x7f)  /* non-ASCII characters (rubout or greater) */
458     printf_unfiltered ("[%02x]", ch & 0xff);
459   else
460     putchar_unfiltered (ch);
461 }
462
463
464 /* puts_readable - print a string, displaying non-printable chars in
465    ^x notation or in hex.  */
466
467 static void
468 puts_readable (string)
469      char *string;
470 {
471   int c;
472
473   while ((c = *string++) != '\0')
474     putc_readable (c);
475 }
476
477
478 /* Wait until STRING shows up in mips_desc.  Returns 1 if successful, else 0 if
479    timed out.  TIMEOUT specifies timeout value in seconds.
480 */
481
482 int
483 mips_expect_timeout (string, timeout)
484      char *string;
485      int timeout;
486 {
487   char *p = string;
488
489   if (remote_debug)
490     {
491       printf_unfiltered ("Expected \"");
492       puts_readable (string);
493       printf_unfiltered ("\", got \"");
494     }
495
496   immediate_quit = 1;
497   while (1)
498     {
499       int c;
500
501 /* Must use SERIAL_READCHAR here cuz mips_readchar would get confused if we
502    were waiting for the mips_monitor_prompt... */
503
504       c = SERIAL_READCHAR (mips_desc, timeout);
505
506       if (c == SERIAL_TIMEOUT)
507         {
508           if (remote_debug)
509             printf_unfiltered ("\": FAIL\n");
510           return 0;
511         }
512
513       if (remote_debug)
514         putc_readable (c);
515
516       if (c == *p++)
517         {       
518           if (*p == '\0')
519             {
520               immediate_quit = 0;
521               if (remote_debug)
522               printf_unfiltered ("\": OK\n");
523               return 1;
524             }
525         }
526       else
527         {
528           p = string;
529           if (c == *p)
530             p++;
531         }
532     }
533 }
534
535 /* Wait until STRING shows up in mips_desc.  Returns 1 if successful, else 0 if
536    timed out.  The timeout value is hard-coded to 2 seconds.  Use
537    mips_expect_timeout if a different timeout value is needed.
538 */
539
540 int
541 mips_expect (string)
542      char *string;
543 {
544     return mips_expect_timeout (string, 2);
545 }
546
547 /* Read the required number of characters into the given buffer (which
548    is assumed to be large enough). The only failure is a timeout. */
549 int
550 mips_getstring (string, n)
551      char *string;
552      int n;
553 {
554   char *p = string;
555   int c;
556
557   immediate_quit = 1;
558   while (n > 0)
559     {
560       c = SERIAL_READCHAR (mips_desc, 2);
561
562       if (c == SERIAL_TIMEOUT) {
563         fprintf_unfiltered (stderr, "Failed to read %d characters from target (TIMEOUT)\n", n);
564         return 0;
565       }
566
567       *p++ = c;
568       n--;
569     }
570
571   return 1;
572 }
573
574 /* Read a character from the remote, aborting on error.  Returns
575    SERIAL_TIMEOUT on timeout (since that's what SERIAL_READCHAR
576    returns).  FIXME: If we see the string mips_monitor_prompt from
577    the board, then we are debugging on the main console port, and we
578    have somehow dropped out of remote debugging mode.  In this case,
579    we automatically go back in to remote debugging mode.  This is a
580    hack, put in because I can't find any way for a program running on
581    the remote board to terminate without also ending remote debugging
582    mode.  I assume users won't have any trouble with this; for one
583    thing, the IDT documentation generally assumes that the remote
584    debugging port is not the console port.  This is, however, very
585    convenient for DejaGnu when you only have one connected serial
586    port.  */
587
588 static int
589 mips_readchar (timeout)
590      int timeout;
591 {
592   int ch;
593   static int state = 0;
594   int mips_monitor_prompt_len = strlen (mips_monitor_prompt);
595
596 #ifdef MAINTENANCE_CMDS
597   {
598     int i;
599
600     i = timeout;
601     if (i == -1 && watchdog > 0)
602      i = watchdog;
603   }
604 #endif
605
606   if (state == mips_monitor_prompt_len)
607     timeout = 1;
608   ch = SERIAL_READCHAR (mips_desc, timeout);
609 #ifdef MAINTENANCE_CMDS
610   if (ch == SERIAL_TIMEOUT && timeout == -1) /* Watchdog went off */
611     {
612       target_mourn_inferior ();
613       error ("Watchdog has expired.  Target detached.\n");
614     }
615 #endif
616   if (ch == SERIAL_EOF)
617     mips_error ("End of file from remote");
618   if (ch == SERIAL_ERROR)
619     mips_error ("Error reading from remote: %s", safe_strerror (errno));
620   if (remote_debug > 1)
621     {
622       /* Don't use _filtered; we can't deal with a QUIT out of
623          target_wait, and I think this might be called from there.  */
624       if (ch != SERIAL_TIMEOUT)
625         printf_unfiltered ("Read '%c' %d 0x%x\n", ch, ch, ch);
626       else
627         printf_unfiltered ("Timed out in read\n");
628     }
629
630   /* If we have seen mips_monitor_prompt and we either time out, or
631      we see a @ (which was echoed from a packet we sent), reset the
632      board as described above.  The first character in a packet after
633      the SYN (which is not echoed) is always an @ unless the packet is
634      more than 64 characters long, which ours never are.  */
635   if ((ch == SERIAL_TIMEOUT || ch == '@')
636       && state == mips_monitor_prompt_len
637       && ! mips_initializing
638       && ! mips_exiting)
639     {
640       if (remote_debug > 0)
641         /* Don't use _filtered; we can't deal with a QUIT out of
642            target_wait, and I think this might be called from there.  */
643         printf_unfiltered ("Reinitializing MIPS debugging mode\n");
644
645       mips_need_reply = 0;
646       mips_initialize ();
647
648       state = 0;
649
650       /* At this point, about the only thing we can do is abort the command
651          in progress and get back to command level as quickly as possible. */
652
653       error ("Remote board reset, debug protocol re-initialized.");
654     }
655
656   if (ch == mips_monitor_prompt[state])
657     ++state;
658   else
659     state = 0;
660
661   return ch;
662 }
663
664 /* Get a packet header, putting the data in the supplied buffer.
665    PGARBAGE is a pointer to the number of garbage characters received
666    so far.  CH is the last character received.  Returns 0 for success,
667    or -1 for timeout.  */
668
669 static int
670 mips_receive_header (hdr, pgarbage, ch, timeout)
671      unsigned char *hdr;
672      int *pgarbage;
673      int ch;
674      int timeout;
675 {
676   int i;
677
678   while (1)
679     {
680       /* Wait for a SYN.  mips_syn_garbage is intended to prevent
681          sitting here indefinitely if the board sends us one garbage
682          character per second.  ch may already have a value from the
683          last time through the loop.  */
684       while (ch != SYN)
685         {
686           ch = mips_readchar (timeout);
687           if (ch == SERIAL_TIMEOUT)
688            return -1;
689           if (ch != SYN)
690             {
691               /* Printing the character here lets the user of gdb see
692                  what the program is outputting, if the debugging is
693                  being done on the console port.  Don't use _filtered;
694                  we can't deal with a QUIT out of target_wait.  */
695               if (! mips_initializing || remote_debug > 0)
696                 {
697                   putc_readable (ch);
698                   gdb_flush (gdb_stdout);
699                 }
700
701               ++*pgarbage;
702               if (mips_syn_garbage > 0
703                   && *pgarbage > mips_syn_garbage)
704                 mips_error ("Debug protocol failure:  more than %d characters before a sync.", 
705                             mips_syn_garbage);
706             }
707         }
708
709       /* Get the packet header following the SYN.  */
710       for (i = 1; i < HDR_LENGTH; i++)
711         {
712           ch = mips_readchar (timeout);
713           if (ch == SERIAL_TIMEOUT)
714             return -1;
715           /* Make sure this is a header byte.  */
716           if (ch == SYN || ! HDR_CHECK (ch))
717             break;
718
719           hdr[i] = ch;
720         }
721
722       /* If we got the complete header, we can return.  Otherwise we
723          loop around and keep looking for SYN.  */
724       if (i >= HDR_LENGTH)
725         return 0;
726     }
727 }
728
729 /* Get a packet header, putting the data in the supplied buffer.
730    PGARBAGE is a pointer to the number of garbage characters received
731    so far.  The last character read is returned in *PCH.  Returns 0
732    for success, -1 for timeout, -2 for error.  */
733
734 static int
735 mips_receive_trailer (trlr, pgarbage, pch, timeout)
736      unsigned char *trlr;
737      int *pgarbage;
738      int *pch;
739      int timeout;
740 {
741   int i;
742   int ch;
743
744   for (i = 0; i < TRLR_LENGTH; i++)
745     {
746       ch = mips_readchar (timeout);
747       *pch = ch;
748       if (ch == SERIAL_TIMEOUT)
749         return -1;
750       if (! TRLR_CHECK (ch))
751         return -2;
752       trlr[i] = ch;
753     }
754   return 0;
755 }
756
757 /* Get the checksum of a packet.  HDR points to the packet header.
758    DATA points to the packet data.  LEN is the length of DATA.  */
759
760 static int
761 mips_cksum (hdr, data, len)
762      const unsigned char *hdr;
763      const unsigned char *data;
764      int len;
765 {
766   register const unsigned char *p;
767   register int c;
768   register int cksum;
769
770   cksum = 0;
771
772   /* The initial SYN is not included in the checksum.  */
773   c = HDR_LENGTH - 1;
774   p = hdr + 1;
775   while (c-- != 0)
776     cksum += *p++;
777   
778   c = len;
779   p = data;
780   while (c-- != 0)
781     cksum += *p++;
782
783   return cksum;
784 }
785
786 /* Send a packet containing the given ASCII string.  */
787
788 static void
789 mips_send_packet (s, get_ack)
790      const char *s;
791      int get_ack;
792 {
793   /* unsigned */ int len;
794   unsigned char *packet;
795   register int cksum;
796   int try;
797
798   len = strlen (s);
799   if (len > DATA_MAXLEN)
800     mips_error ("MIPS protocol data packet too long: %s", s);
801
802   packet = (unsigned char *) alloca (HDR_LENGTH + len + TRLR_LENGTH + 1);
803
804   packet[HDR_INDX_SYN] = HDR_SET_SYN (1, len, mips_send_seq);
805   packet[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (1, len, mips_send_seq);
806   packet[HDR_INDX_LEN1] = HDR_SET_LEN1 (1, len, mips_send_seq);
807   packet[HDR_INDX_SEQ] = HDR_SET_SEQ (1, len, mips_send_seq);
808
809   memcpy (packet + HDR_LENGTH, s, len);
810
811   cksum = mips_cksum (packet, packet + HDR_LENGTH, len);
812   packet[HDR_LENGTH + len + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
813   packet[HDR_LENGTH + len + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
814   packet[HDR_LENGTH + len + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
815
816   /* Increment the sequence number.  This will set mips_send_seq to
817      the sequence number we expect in the acknowledgement.  */
818   mips_send_seq = (mips_send_seq + 1) % SEQ_MODULOS;
819
820   /* We can only have one outstanding data packet, so we just wait for
821      the acknowledgement here.  Keep retransmitting the packet until
822      we get one, or until we've tried too many times.  */
823   for (try = 0; try < mips_send_retries; try++)
824     {
825       int garbage;
826       int ch;
827
828       if (remote_debug > 0)
829         {
830           /* Don't use _filtered; we can't deal with a QUIT out of
831              target_wait, and I think this might be called from there.  */
832           packet[HDR_LENGTH + len + TRLR_LENGTH] = '\0';
833           printf_unfiltered ("Writing \"%s\"\n", packet + 1);
834         }
835
836       if (SERIAL_WRITE (mips_desc, packet,
837                         HDR_LENGTH + len + TRLR_LENGTH) != 0)
838         mips_error ("write to target failed: %s", safe_strerror (errno));
839
840       if (! get_ack)
841         return;
842
843       garbage = 0;
844       ch = 0;
845       while (1)
846         {
847           unsigned char hdr[HDR_LENGTH + 1];
848           unsigned char trlr[TRLR_LENGTH + 1];
849           int err;
850           unsigned int seq;
851
852           /* Get the packet header.  If we time out, resend the data
853              packet.  */
854           err = mips_receive_header (hdr, &garbage, ch, mips_retransmit_wait);
855           if (err != 0)
856             break;
857
858           ch = 0;
859
860           /* If we get a data packet, assume it is a duplicate and
861              ignore it.  FIXME: If the acknowledgement is lost, this
862              data packet may be the packet the remote sends after the
863              acknowledgement.  */
864           if (HDR_IS_DATA (hdr)) {
865             int i;
866
867             /* Ignore any errors raised whilst attempting to ignore
868                packet. */
869
870             len = HDR_GET_LEN (hdr);
871
872             for (i = 0; i < len; i++)
873               {
874                 int rch;
875
876                 rch = mips_readchar (2);
877                 if (rch == SYN)
878                   {
879                     ch = SYN;
880                     break;
881                   }
882                 if (rch == SERIAL_TIMEOUT)
883                   break;
884                 /* ignore the character */
885               }
886
887             if (i == len)
888               (void) mips_receive_trailer (trlr, &garbage, &ch, 2);
889
890             /* We don't bother checking the checksum, or providing an
891                ACK to the packet. */
892             continue;
893           }
894
895           /* If the length is not 0, this is a garbled packet.  */
896           if (HDR_GET_LEN (hdr) != 0)
897             continue;
898
899           /* Get the packet trailer.  */
900           err = mips_receive_trailer (trlr, &garbage, &ch,
901                                       mips_retransmit_wait);
902
903           /* If we timed out, resend the data packet.  */
904           if (err == -1)
905             break;
906
907           /* If we got a bad character, reread the header.  */
908           if (err != 0)
909             continue;
910
911           /* If the checksum does not match the trailer checksum, this
912              is a bad packet; ignore it.  */
913           if (mips_cksum (hdr, (unsigned char *) NULL, 0)
914               != TRLR_GET_CKSUM (trlr))
915             continue;
916
917           if (remote_debug > 0)
918             {
919               hdr[HDR_LENGTH] = '\0';
920               trlr[TRLR_LENGTH] = '\0';
921               /* Don't use _filtered; we can't deal with a QUIT out of
922                  target_wait, and I think this might be called from there.  */
923               printf_unfiltered ("Got ack %d \"%s%s\"\n",
924                                HDR_GET_SEQ (hdr), hdr + 1, trlr);
925             }
926
927           /* If this ack is for the current packet, we're done.  */
928           seq = HDR_GET_SEQ (hdr);
929           if (seq == mips_send_seq)
930             return;
931
932           /* If this ack is for the last packet, resend the current
933              packet.  */
934           if ((seq + 1) % SEQ_MODULOS == mips_send_seq)
935             break;
936
937           /* Otherwise this is a bad ack; ignore it.  Increment the
938              garbage count to ensure that we do not stay in this loop
939              forever.  */
940           ++garbage;
941         }
942     }
943
944   mips_error ("Remote did not acknowledge packet");
945 }
946
947 /* Receive and acknowledge a packet, returning the data in BUFF (which
948    should be DATA_MAXLEN + 1 bytes).  The protocol documentation
949    implies that only the sender retransmits packets, so this code just
950    waits silently for a packet.  It returns the length of the received
951    packet.  If THROW_ERROR is nonzero, call error() on errors.  If not,
952    don't print an error message and return -1.  */
953
954 static int
955 mips_receive_packet (buff, throw_error, timeout)
956      char *buff;
957      int throw_error;
958      int timeout;
959 {
960   int ch;
961   int garbage;
962   int len;
963   unsigned char ack[HDR_LENGTH + TRLR_LENGTH + 1];
964   int cksum;
965
966   ch = 0;
967   garbage = 0;
968   while (1)
969     {
970       unsigned char hdr[HDR_LENGTH];
971       unsigned char trlr[TRLR_LENGTH];
972       int i;
973       int err;
974
975       if (mips_receive_header (hdr, &garbage, ch, timeout) != 0)
976         {
977           if (throw_error)
978             mips_error ("Timed out waiting for remote packet");
979           else
980             return -1;
981         }
982
983       ch = 0;
984
985       /* An acknowledgement is probably a duplicate; ignore it.  */
986       if (! HDR_IS_DATA (hdr))
987         {
988           len = HDR_GET_LEN (hdr);
989           /* Check if the length is valid for an ACK, we may aswell
990              try and read the remainder of the packet: */
991           if (len == 0)
992             {
993               /* Ignore the error condition, since we are going to
994                  ignore the packet anyway. */
995               (void) mips_receive_trailer (trlr, &garbage, &ch, timeout);
996             }
997           /* Don't use _filtered; we can't deal with a QUIT out of
998              target_wait, and I think this might be called from there.  */
999           if (remote_debug > 0)
1000             printf_unfiltered ("Ignoring unexpected ACK\n");
1001           continue;
1002         }
1003
1004       len = HDR_GET_LEN (hdr);
1005       for (i = 0; i < len; i++)
1006         {
1007           int rch;
1008
1009           rch = mips_readchar (timeout);
1010           if (rch == SYN)
1011             {
1012               ch = SYN;
1013               break;
1014             }
1015           if (rch == SERIAL_TIMEOUT)
1016             {
1017               if (throw_error)
1018                 mips_error ("Timed out waiting for remote packet");
1019               else
1020                 return -1;
1021             }
1022           buff[i] = rch;
1023         }
1024
1025       if (i < len)
1026         {
1027           /* Don't use _filtered; we can't deal with a QUIT out of
1028              target_wait, and I think this might be called from there.  */
1029           if (remote_debug > 0)
1030             printf_unfiltered ("Got new SYN after %d chars (wanted %d)\n",
1031                              i, len);
1032           continue;
1033         }
1034
1035       err = mips_receive_trailer (trlr, &garbage, &ch, timeout);
1036       if (err == -1)
1037         {
1038           if (throw_error)
1039             mips_error ("Timed out waiting for packet");
1040           else
1041             return -1;
1042         }
1043       if (err == -2)
1044         {
1045           /* Don't use _filtered; we can't deal with a QUIT out of
1046              target_wait, and I think this might be called from there.  */
1047           if (remote_debug > 0)
1048             printf_unfiltered ("Got SYN when wanted trailer\n");
1049           continue;
1050         }
1051
1052       /* If this is the wrong sequence number, ignore it.  */
1053       if (HDR_GET_SEQ (hdr) != mips_receive_seq)
1054         {
1055           /* Don't use _filtered; we can't deal with a QUIT out of
1056              target_wait, and I think this might be called from there.  */
1057           if (remote_debug > 0)
1058             printf_unfiltered ("Ignoring sequence number %d (want %d)\n",
1059                              HDR_GET_SEQ (hdr), mips_receive_seq);
1060           continue;
1061         }
1062
1063       if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr))
1064         break;
1065
1066       if (remote_debug > 0)
1067         /* Don't use _filtered; we can't deal with a QUIT out of
1068            target_wait, and I think this might be called from there.  */
1069         printf_unfiltered ("Bad checksum; data %d, trailer %d\n",
1070                          mips_cksum (hdr, buff, len),
1071                          TRLR_GET_CKSUM (trlr));
1072
1073       /* The checksum failed.  Send an acknowledgement for the
1074          previous packet to tell the remote to resend the packet.  */
1075       ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
1076       ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
1077       ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
1078       ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
1079
1080       cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
1081
1082       ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
1083       ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
1084       ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
1085
1086       if (remote_debug > 0)
1087         {
1088           ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
1089           /* Don't use _filtered; we can't deal with a QUIT out of
1090              target_wait, and I think this might be called from there.  */
1091           printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
1092                            ack + 1);
1093         }
1094
1095       if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
1096         {
1097           if (throw_error)
1098             mips_error ("write to target failed: %s", safe_strerror (errno));
1099           else
1100             return -1;
1101         }
1102     }
1103
1104   if (remote_debug > 0)
1105     {
1106       buff[len] = '\0';
1107       /* Don't use _filtered; we can't deal with a QUIT out of
1108          target_wait, and I think this might be called from there.  */
1109       printf_unfiltered ("Got packet \"%s\"\n", buff);
1110     }
1111
1112   /* We got the packet.  Send an acknowledgement.  */
1113   mips_receive_seq = (mips_receive_seq + 1) % SEQ_MODULOS;
1114
1115   ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
1116   ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
1117   ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
1118   ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
1119
1120   cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
1121
1122   ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
1123   ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
1124   ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
1125
1126   if (remote_debug > 0)
1127     {
1128       ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
1129       /* Don't use _filtered; we can't deal with a QUIT out of
1130          target_wait, and I think this might be called from there.  */
1131       printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
1132                        ack + 1);
1133     }
1134
1135   if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
1136     {
1137       if (throw_error)
1138         mips_error ("write to target failed: %s", safe_strerror (errno));
1139       else
1140         return -1;
1141     }
1142
1143   return len;
1144 }
1145 \f
1146 /* Optionally send a request to the remote system and optionally wait
1147    for the reply.  This implements the remote debugging protocol,
1148    which is built on top of the packet protocol defined above.  Each
1149    request has an ADDR argument and a DATA argument.  The following
1150    requests are defined:
1151
1152    \0   don't send a request; just wait for a reply
1153    i    read word from instruction space at ADDR
1154    d    read word from data space at ADDR
1155    I    write DATA to instruction space at ADDR
1156    D    write DATA to data space at ADDR
1157    r    read register number ADDR
1158    R    set register number ADDR to value DATA
1159    c    continue execution (if ADDR != 1, set pc to ADDR)
1160    s    single step (if ADDR != 1, set pc to ADDR)
1161
1162    The read requests return the value requested.  The write requests
1163    return the previous value in the changed location.  The execution
1164    requests return a UNIX wait value (the approximate signal which
1165    caused execution to stop is in the upper eight bits).
1166
1167    If PERR is not NULL, this function waits for a reply.  If an error
1168    occurs, it sets *PERR to 1 and sets errno according to what the
1169    target board reports.  */
1170
1171 static CORE_ADDR 
1172 mips_request (cmd, addr, data, perr, timeout, buff)
1173      int cmd;
1174      CORE_ADDR addr;
1175      CORE_ADDR data;
1176      int *perr;
1177      int timeout;
1178      char *buff;
1179 {
1180   char myBuff[DATA_MAXLEN + 1];
1181   int len;
1182   int rpid;
1183   char rcmd;
1184   int rerrflg;
1185   int rresponse;
1186
1187   if (buff == (char *) NULL)
1188     buff = myBuff;
1189
1190   if (cmd != '\0')
1191     {
1192       if (mips_need_reply)
1193         fatal ("mips_request: Trying to send command before reply");
1194       sprintf (buff, "0x0 %c 0x%s 0x%s", cmd, paddr_nz (addr), paddr_nz (data));
1195       mips_send_packet (buff, 1);
1196       mips_need_reply = 1;
1197     }
1198
1199   if (perr == (int *) NULL)
1200     return 0;
1201
1202   if (! mips_need_reply)
1203     fatal ("mips_request: Trying to get reply before command");
1204
1205   mips_need_reply = 0;
1206
1207   len = mips_receive_packet (buff, 1, timeout);
1208   buff[len] = '\0';
1209
1210   if (sscanf (buff, "0x%x %c 0x%x 0x%x",
1211               &rpid, &rcmd, &rerrflg, &rresponse) != 4
1212       || (cmd != '\0' && rcmd != cmd))
1213     mips_error ("Bad response from remote board");
1214
1215   if (rerrflg != 0)
1216     {
1217       *perr = 1;
1218
1219       /* FIXME: This will returns MIPS errno numbers, which may or may
1220          not be the same as errno values used on other systems.  If
1221          they stick to common errno values, they will be the same, but
1222          if they don't, they must be translated.  */
1223       errno = rresponse;
1224
1225       return 0;
1226     }
1227
1228   *perr = 0;
1229   return rresponse;
1230 }
1231
1232 static void
1233 mips_initialize_cleanups (arg)
1234      PTR arg;
1235 {
1236   mips_initializing = 0;
1237 }
1238
1239 static void
1240 mips_exit_cleanups (arg)
1241      PTR arg;
1242 {
1243   mips_exiting = 0;
1244 }
1245
1246 static void
1247 mips_send_command (cmd, prompt)
1248      const char *cmd;
1249      int prompt;
1250 {
1251   SERIAL_WRITE (mips_desc, cmd, strlen(cmd));
1252   mips_expect (cmd);
1253   mips_expect ("\n");
1254   if (prompt)
1255     mips_expect (mips_monitor_prompt);
1256 }
1257
1258 /* Enter remote (dbx) debug mode: */
1259 static void
1260 mips_enter_debug ()
1261 {
1262   /* Reset the sequence numbers, ready for the new debug sequence: */
1263   mips_send_seq = 0;
1264   mips_receive_seq = 0;
1265
1266   if (mips_monitor != MON_IDT)
1267     mips_send_command ("debug\r", 0);
1268   else /* assume IDT monitor by default */
1269     mips_send_command ("db tty0\r", 0);
1270
1271   SERIAL_WRITE (mips_desc, "\r", sizeof "\r" - 1);
1272
1273   /* We don't need to absorb any spurious characters here, since the
1274      mips_receive_header will eat up a reasonable number of characters
1275      whilst looking for the SYN, however this avoids the "garbage"
1276      being displayed to the user. */
1277   if (mips_monitor != MON_IDT)
1278     mips_expect ("\r");
1279   
1280   {
1281     char buff[DATA_MAXLEN + 1];
1282     if (mips_receive_packet (buff, 1, 3) < 0)
1283       mips_error ("Failed to initialize (didn't receive packet).");
1284   }
1285 }
1286
1287 /* Exit remote (dbx) debug mode, returning to the monitor prompt: */
1288 static int
1289 mips_exit_debug ()
1290 {
1291   int err;
1292   struct cleanup *old_cleanups = make_cleanup (mips_exit_cleanups, NULL);
1293
1294   mips_exiting = 1;
1295
1296   if (mips_monitor != MON_IDT)
1297     {
1298       /* The DDB (NEC) and MiniRISC (LSI) versions of PMON exit immediately,
1299          so we do not get a reply to this command: */
1300       mips_request ('x', (unsigned int) 0, (unsigned int) 0, NULL,
1301                 mips_receive_wait, NULL);
1302       mips_need_reply = 0;
1303       if (!mips_expect (" break!"))
1304         return -1;
1305     }
1306   else
1307     mips_request ('x', (unsigned int) 0, (unsigned int) 0, &err,
1308                   mips_receive_wait, NULL);
1309
1310   if (mips_monitor == MON_IDT && !mips_expect ("Exiting remote debug"))
1311     return -1;
1312     
1313   if (mips_monitor == MON_DDB)
1314     {
1315       if (!mips_expect ("\n"))
1316         return -1;
1317     }
1318   else
1319     if (!mips_expect ("\r\n"))
1320       return -1;
1321
1322   if (!mips_expect (mips_monitor_prompt))
1323     return -1;
1324
1325   do_cleanups (old_cleanups);
1326
1327   return 0;
1328 }
1329
1330 /* Initialize a new connection to the MIPS board, and make sure we are
1331    really connected.  */
1332
1333 static void
1334 mips_initialize ()
1335 {
1336   int err;
1337   struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL);
1338   int j;
1339
1340   /* What is this code doing here?  I don't see any way it can happen, and
1341      it might mean mips_initializing didn't get cleared properly.
1342      So I'll make it a warning.  */
1343
1344   if (mips_initializing)
1345     {
1346       warning ("internal error: mips_initialize called twice");
1347       return;
1348     }
1349
1350   mips_wait_flag = 0;
1351   mips_initializing = 1;
1352
1353   /* At this point, the packit protocol isn't responding.  We'll try getting
1354      into the monitor, and restarting the protocol.  */
1355
1356   /* Force the system into the monitor.  After this we *should* be at
1357      the mips_monitor_prompt.  */
1358   if (mips_monitor != MON_IDT)
1359     j = 0; /* start by checking if we are already at the prompt */
1360   else
1361     j = 1; /* start by sending a break */
1362   for (; j <= 4; j++)
1363     {
1364       switch (j)
1365         {
1366         case 0:                 /* First, try sending a CR */
1367           SERIAL_FLUSH_INPUT (mips_desc);
1368           SERIAL_WRITE (mips_desc, "\r", 1);
1369           break;
1370         case 1:                 /* First, try sending a break */
1371           SERIAL_SEND_BREAK (mips_desc);
1372           break;
1373         case 2:                 /* Then, try a ^C */
1374           SERIAL_WRITE (mips_desc, "\003", 1);
1375           break;
1376         case 3:                 /* Then, try escaping from download */
1377           {
1378             if (mips_monitor != MON_IDT)
1379               {
1380                 char tbuff[7];
1381
1382                 /* We shouldn't need to send multiple termination
1383                    sequences, since the target performs line (or
1384                    block) reads, and then processes those
1385                    packets. In-case we were downloading a large packet
1386                    we flush the output buffer before inserting a
1387                    termination sequence. */
1388                 SERIAL_FLUSH_OUTPUT (mips_desc);
1389                 sprintf (tbuff, "\r/E/E\r");
1390                 SERIAL_WRITE (mips_desc, tbuff, 6);
1391               }
1392             else
1393               {
1394                 char srec[10];
1395                 int i;
1396
1397                 /* We are possibly in binary download mode, having
1398                    aborted in the middle of an S-record.  ^C won't
1399                    work because of binary mode.  The only reliable way
1400                    out is to send enough termination packets (8 bytes)
1401                    to fill up and then overflow the largest size
1402                    S-record (255 bytes in this case).  This amounts to
1403                    256/8 + 1 packets.
1404                    */
1405
1406                 mips_make_srec (srec, '7', 0, NULL, 0);
1407
1408                 for (i = 1; i <= 33; i++)
1409                   {
1410                     SERIAL_WRITE (mips_desc, srec, 8);
1411
1412                     if (SERIAL_READCHAR (mips_desc, 0) >= 0)
1413                       break;    /* Break immediatly if we get something from
1414                                    the board. */
1415                   }
1416               }
1417           }
1418           break;
1419         case 4:
1420           mips_error ("Failed to initialize.");
1421         }
1422
1423       if (mips_expect (mips_monitor_prompt))
1424         break;
1425     }
1426
1427   if (mips_monitor != MON_IDT)
1428     {
1429       /* Ensure the correct target state: */
1430       if (mips_monitor != MON_LSI)
1431         mips_send_command ("set regsize 64\r", -1);
1432       mips_send_command ("set hostport tty0\r", -1);
1433       mips_send_command ("set brkcmd \"\"\r", -1);
1434       /* Delete all the current breakpoints: */
1435       mips_send_command ("db *\r", -1);
1436       /* NOTE: PMON does not have breakpoint support through the
1437          "debug" mode, only at the monitor command-line. */
1438     }
1439
1440   mips_enter_debug ();
1441
1442   /* Clear all breakpoints: */
1443   if (mips_monitor == MON_IDT && common_breakpoint ('b', -1, 0, NULL) == 0)
1444     monitor_supports_breakpoints = 1;
1445   else
1446     monitor_supports_breakpoints = 0;
1447
1448   do_cleanups (old_cleanups);
1449
1450   /* If this doesn't call error, we have connected; we don't care if
1451      the request itself succeeds or fails.  */
1452
1453   mips_request ('r', (unsigned int) 0, (unsigned int) 0, &err,
1454                 mips_receive_wait, NULL);
1455   set_current_frame (create_new_frame (read_fp (), read_pc ()));
1456   select_frame (get_current_frame (), 0);
1457 }
1458
1459 /* Open a connection to the remote board.  */
1460 static void
1461 common_open (ops, name, from_tty, new_monitor, new_monitor_prompt)
1462      struct target_ops *ops;
1463      char *name;
1464      int from_tty;
1465      enum mips_monitor_type new_monitor;
1466      char *new_monitor_prompt;
1467 {
1468   char *ptype;
1469   char *serial_port_name;
1470   char *remote_name = 0;
1471   char *local_name = 0;
1472   char **argv;
1473
1474   if (name == 0)
1475     error (
1476 "To open a MIPS remote debugging connection, you need to specify what serial\n\
1477 device is attached to the target board (e.g., /dev/ttya).\n"
1478 "If you want to use TFTP to download to the board, specify the name of a\n"
1479 "temporary file to be used by GDB for downloads as the second argument.\n"
1480 "This filename must be in the form host:filename, where host is the name\n"
1481 "of the host running the TFTP server, and the file must be readable by the\n"
1482 "world.  If the local name of the temporary file differs from the name as\n"
1483 "seen from the board via TFTP, specify that name as the third parameter.\n");
1484
1485   /* Parse the serial port name, the optional TFTP name, and the
1486      optional local TFTP name.  */
1487   if ((argv = buildargv (name)) == NULL)
1488     nomem(0);
1489   make_cleanup (freeargv, (char *) argv);
1490
1491   serial_port_name = strsave (argv[0]);
1492   if (argv[1])                          /* remote TFTP name specified? */
1493     {
1494       remote_name = argv[1];
1495       if (argv[2])                      /* local TFTP filename specified? */
1496         local_name = argv[2];
1497     }
1498
1499   target_preopen (from_tty);
1500
1501   if (mips_is_open)
1502     unpush_target (current_ops);
1503
1504   /* Open and initialize the serial port.  */
1505   mips_desc = SERIAL_OPEN (serial_port_name);
1506   if (mips_desc == (serial_t) NULL)
1507     perror_with_name (serial_port_name);
1508
1509   if (baud_rate != -1)
1510     {
1511       if (SERIAL_SETBAUDRATE (mips_desc, baud_rate))
1512         {
1513           SERIAL_CLOSE (mips_desc);
1514           perror_with_name (serial_port_name);
1515         }
1516     }
1517
1518   SERIAL_RAW (mips_desc);
1519
1520   /* Open and initialize the optional download port.  If it is in the form
1521      hostname#portnumber, it's a UDP socket.  If it is in the form
1522      hostname:filename, assume it's the TFTP filename that must be
1523      passed to the DDB board to tell it where to get the load file.  */
1524   if (remote_name)
1525     {
1526       if (strchr (remote_name, '#'))
1527         {
1528           udp_desc = SERIAL_OPEN (remote_name);
1529           if (!udp_desc)
1530             perror_with_name ("Unable to open UDP port");
1531           udp_in_use = 1;
1532         }
1533       else
1534         {
1535           /* Save the remote and local names of the TFTP temp file.  If
1536              the user didn't specify a local name, assume it's the same
1537              as the part of the remote name after the "host:".  */
1538           if (tftp_name)
1539             free (tftp_name);
1540           if (tftp_localname)
1541             free (tftp_localname);
1542           if (local_name == NULL)
1543               if ((local_name = strchr (remote_name, ':')) != NULL)
1544                 local_name++;           /* skip over the colon */
1545           if (local_name == NULL)
1546             local_name = remote_name;   /* local name same as remote name */
1547           tftp_name = strsave (remote_name);
1548           tftp_localname = strsave (local_name);
1549           tftp_in_use = 1;
1550         }
1551     }
1552
1553   current_ops = ops;
1554   mips_is_open = 1;
1555
1556   /* Reset the expected monitor prompt if it's never been set before.  */
1557   if (mips_monitor_prompt == NULL)
1558     mips_monitor_prompt = strsave (new_monitor_prompt);
1559   mips_monitor = new_monitor;
1560
1561   mips_initialize ();
1562
1563   if (from_tty)
1564     printf_unfiltered ("Remote MIPS debugging using %s\n", serial_port_name);
1565
1566   /* Switch to using remote target now.  */
1567   push_target (ops);
1568
1569   /* FIXME: Should we call start_remote here?  */
1570
1571   /* Try to figure out the processor model if possible.  */
1572   ptype = mips_read_processor_type ();
1573   if (ptype)
1574     mips_set_processor_type_command (strsave (ptype), 0);
1575
1576 /* This is really the job of start_remote however, that makes an assumption
1577    that the target is about to print out a status message of some sort.  That
1578    doesn't happen here (in fact, it may not be possible to get the monitor to
1579    send the appropriate packet).  */
1580
1581   flush_cached_frames ();
1582   registers_changed ();
1583   stop_pc = read_pc ();
1584   set_current_frame (create_new_frame (read_fp (), stop_pc));
1585   select_frame (get_current_frame (), 0);
1586   print_stack_frame (selected_frame, -1, 1);
1587   free (serial_port_name);
1588 }
1589
1590 static void
1591 mips_open (name, from_tty)
1592      char *name;
1593      int from_tty;
1594 {
1595   common_open (&mips_ops, name, from_tty, MON_IDT, TARGET_MONITOR_PROMPT);
1596 }
1597
1598 static void
1599 pmon_open (name, from_tty)
1600      char *name;
1601      int from_tty;
1602 {
1603   common_open (&pmon_ops, name, from_tty, MON_PMON, "PMON> ");
1604 }
1605
1606 static void
1607 ddb_open (name, from_tty)
1608      char *name;
1609      int from_tty;
1610 {
1611   common_open (&ddb_ops, name, from_tty, MON_DDB, "NEC010>");
1612 }
1613
1614 static void
1615 lsi_open (name, from_tty)
1616      char *name;
1617      int from_tty;
1618 {
1619   common_open (&ddb_ops, name, from_tty, MON_LSI, "PMON> ");
1620 }
1621
1622 /* Close a connection to the remote board.  */
1623
1624 static void
1625 mips_close (quitting)
1626      int quitting;
1627 {
1628   if (mips_is_open)
1629     {
1630       /* Get the board out of remote debugging mode.  */
1631       (void) mips_exit_debug ();
1632
1633       close_ports ();
1634     }
1635 }
1636
1637 /* Detach from the remote board.  */
1638
1639 static void
1640 mips_detach (args, from_tty)
1641      char *args;
1642      int from_tty;
1643 {
1644   if (args)
1645     error ("Argument given to \"detach\" when remotely debugging.");
1646
1647   pop_target ();
1648
1649   mips_close (1);
1650
1651   if (from_tty)
1652     printf_unfiltered ("Ending remote MIPS debugging.\n");
1653 }
1654
1655 /* Tell the target board to resume.  This does not wait for a reply
1656    from the board.  */
1657
1658 static void
1659 mips_resume (pid, step, siggnal)
1660      int pid, step;
1661      enum target_signal siggnal;
1662 {
1663   int err;
1664
1665 /* start-sanitize-gm */
1666 #ifndef GENERAL_MAGIC
1667   if (siggnal != TARGET_SIGNAL_0)
1668     warning
1669       ("Can't send signals to a remote system.  Try `handle %s ignore'.",
1670        target_signal_to_name (siggnal));
1671 #endif /* GENERAL_MAGIC */
1672 /* end-sanitize-gm */
1673
1674   /* LSI PMON requires returns a reply packet "0x1 s 0x0 0x57f" after
1675      a single step, so we wait for that.  */
1676   mips_request (step ? 's' : 'c',
1677                 (unsigned int) 1,
1678                 (unsigned int) siggnal,
1679                 mips_monitor == MON_LSI && step ? &err : (int *) NULL,
1680                 mips_receive_wait, NULL);
1681 }
1682
1683 /* Return the signal corresponding to SIG, where SIG is the number which
1684    the MIPS protocol uses for the signal.  */
1685 enum target_signal
1686 mips_signal_from_protocol (sig)
1687      int sig;
1688 {
1689   /* We allow a few more signals than the IDT board actually returns, on
1690      the theory that there is at least *some* hope that perhaps the numbering
1691      for these signals is widely agreed upon.  */
1692   if (sig <= 0
1693       || sig > 31)
1694     return TARGET_SIGNAL_UNKNOWN;
1695
1696   /* Don't want to use target_signal_from_host because we are converting
1697      from MIPS signal numbers, not host ones.  Our internal numbers
1698      match the MIPS numbers for the signals the board can return, which
1699      are: SIGINT, SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP.  */
1700   return (enum target_signal) sig;
1701 }
1702
1703 /* Wait until the remote stops, and return a wait status.  */
1704
1705 static int
1706 mips_wait (pid, status)
1707      int pid;
1708      struct target_waitstatus *status;
1709 {
1710   int rstatus;
1711   int err;
1712   char buff[DATA_MAXLEN];
1713   int rpc, rfp, rsp;
1714   char flags[20];
1715   int nfields;
1716
1717   interrupt_count = 0;
1718   hit_watchpoint = 0;
1719
1720   /* If we have not sent a single step or continue command, then the
1721      board is waiting for us to do something.  Return a status
1722      indicating that it is stopped.  */
1723   if (! mips_need_reply)
1724     {
1725       status->kind = TARGET_WAITKIND_STOPPED;
1726       status->value.sig = TARGET_SIGNAL_TRAP;
1727       return 0;
1728     }
1729
1730   /* No timeout; we sit here as long as the program continues to execute.  */
1731   mips_wait_flag = 1;
1732   rstatus = mips_request ('\000', (unsigned int) 0, (unsigned int) 0, &err, -1,
1733                           buff);
1734   mips_wait_flag = 0;
1735   if (err)
1736     mips_error ("Remote failure: %s", safe_strerror (errno));
1737
1738   nfields = sscanf (buff, "0x%*x %*c 0x%*x 0x%*x 0x%x 0x%x 0x%x 0x%*x %s",
1739                     &rpc, &rfp, &rsp, flags);
1740
1741   /* See if we got back extended status.  If so, pick out the pc, fp, sp, etc... */
1742
1743   if (nfields == 7 || nfields == 9) 
1744     {
1745       char buf[MAX_REGISTER_RAW_SIZE];
1746
1747       store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rpc);
1748       supply_register (PC_REGNUM, buf);
1749
1750       store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rfp);
1751       supply_register (30, buf); /* This register they are avoiding and so it is unnamed */
1752
1753       store_unsigned_integer (buf, REGISTER_RAW_SIZE (SP_REGNUM), rsp);
1754       supply_register (SP_REGNUM, buf);
1755
1756       store_unsigned_integer (buf, REGISTER_RAW_SIZE (FP_REGNUM), 0);
1757       supply_register (FP_REGNUM, buf);
1758
1759       if (nfields == 9)
1760         {
1761           int i;
1762
1763           for (i = 0; i <= 2; i++)
1764             if (flags[i] == 'r' || flags[i] == 'w')
1765               hit_watchpoint = 1;
1766             else if (flags[i] == '\000')
1767               break;
1768         }
1769     }
1770
1771   /* Translate a MIPS waitstatus.  We use constants here rather than WTERMSIG
1772      and so on, because the constants we want here are determined by the
1773      MIPS protocol and have nothing to do with what host we are running on.  */
1774   if ((rstatus & 0377) == 0)
1775     {
1776       status->kind = TARGET_WAITKIND_EXITED;
1777       status->value.integer = (((rstatus) >> 8) & 0377);
1778     }
1779   else if ((rstatus & 0377) == 0177)
1780     {
1781       status->kind = TARGET_WAITKIND_STOPPED;
1782       status->value.sig = mips_signal_from_protocol (((rstatus) >> 8) & 0377);
1783     }
1784   else
1785     {
1786       status->kind = TARGET_WAITKIND_SIGNALLED;
1787       status->value.sig = mips_signal_from_protocol (rstatus & 0177);
1788     }
1789
1790   return 0;
1791 }
1792
1793 static int
1794 pmon_wait (pid, status)
1795      int pid;
1796      struct target_waitstatus *status;
1797 {
1798   int rstatus;
1799   int err;
1800   char buff[DATA_MAXLEN];
1801
1802   interrupt_count = 0;
1803   hit_watchpoint = 0;
1804
1805   /* If we have not sent a single step or continue command, then the
1806      board is waiting for us to do something.  Return a status
1807      indicating that it is stopped.  */
1808   if (! mips_need_reply)
1809     {
1810       status->kind = TARGET_WAITKIND_STOPPED;
1811       status->value.sig = TARGET_SIGNAL_TRAP;
1812       return 0;
1813     }
1814
1815   /* Sit, polling the serial until the target decides to talk to
1816      us. NOTE: the timeout value we use is used not just for the
1817      first character, but for all the characters. */
1818   mips_wait_flag = 1;
1819   rstatus = mips_request ('\000', (unsigned int) 0, (unsigned int) 0, &err, -1,
1820                           buff);
1821   mips_wait_flag = 0;
1822   if (err)
1823     mips_error ("Remote failure: %s", safe_strerror (errno));
1824
1825   /* NOTE: The following (sig) numbers are defined by PMON:
1826         SPP_SIGTRAP     5       breakpoint
1827         SPP_SIGINT      2
1828         SPP_SIGSEGV     11
1829         SPP_SIGBUS      10
1830         SPP_SIGILL      4
1831         SPP_SIGFPE      8
1832         SPP_SIGTERM     15 */
1833
1834   /* On returning from a continue, the PMON monitor seems to start
1835      echoing back the messages we send prior to sending back the
1836      ACK. The code can cope with this, but to try and avoid the
1837      unnecessary serial traffic, and "spurious" characters displayed
1838      to the user, we cheat and reset the debug protocol. The problems
1839      seems to be caused by a check on the number of arguments, and the
1840      command length, within the monitor causing it to echo the command
1841      as a bad packet. */
1842   if (mips_monitor != MON_DDB && mips_monitor != MON_LSI)
1843     {
1844       mips_exit_debug ();
1845       mips_enter_debug ();
1846     }
1847
1848   /* Translate a MIPS waitstatus.  We use constants here rather than WTERMSIG
1849      and so on, because the constants we want here are determined by the
1850      MIPS protocol and have nothing to do with what host we are running on.  */
1851   if ((rstatus & 0377) == 0)
1852     {
1853       status->kind = TARGET_WAITKIND_EXITED;
1854       status->value.integer = (((rstatus) >> 8) & 0377);
1855     }
1856   else if ((rstatus & 0377) == 0177)
1857     {
1858       status->kind = TARGET_WAITKIND_STOPPED;
1859       status->value.sig = mips_signal_from_protocol (((rstatus) >> 8) & 0377);
1860     }
1861   else
1862     {
1863       status->kind = TARGET_WAITKIND_SIGNALLED;
1864       status->value.sig = mips_signal_from_protocol (rstatus & 0177);
1865     }
1866
1867   return 0;
1868 }
1869
1870 /* We have to map between the register numbers used by gdb and the
1871    register numbers used by the debugging protocol.  This function
1872    assumes that we are using tm-mips.h.  */
1873
1874 #define REGNO_OFFSET 96
1875
1876 static int
1877 mips_map_regno (regno)
1878      int regno;
1879 {
1880   if (regno < 32)
1881     return regno;
1882   if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32)
1883     return regno - FP0_REGNUM + 32;
1884   switch (regno)
1885     {
1886     case PC_REGNUM:
1887       return REGNO_OFFSET + 0;
1888     case CAUSE_REGNUM:
1889       return REGNO_OFFSET + 1;
1890     case HI_REGNUM:
1891       return REGNO_OFFSET + 2;
1892     case LO_REGNUM:
1893       return REGNO_OFFSET + 3;
1894     case FCRCS_REGNUM:
1895       return REGNO_OFFSET + 4;
1896     case FCRIR_REGNUM:
1897       return REGNO_OFFSET + 5;
1898     default:
1899       /* FIXME: Is there a way to get the status register?  */
1900       return 0;
1901     }
1902 }
1903
1904 /* Fetch the remote registers.  */
1905
1906 static void
1907 mips_fetch_registers (regno)
1908      int regno;
1909 {
1910   unsigned LONGEST val;
1911   int err;
1912
1913   if (regno == -1)
1914     {
1915       for (regno = 0; regno < NUM_REGS; regno++)
1916         mips_fetch_registers (regno);
1917       return;
1918     }
1919
1920   if (regno == FP_REGNUM || regno == ZERO_REGNUM)
1921     /* FP_REGNUM on the mips is a hack which is just supposed to read
1922        zero (see also mips-nat.c).  */
1923     val = 0;
1924   else
1925     {
1926       /* If PMON doesn't support this register, don't waste serial
1927          bandwidth trying to read it.  */
1928       int pmon_reg = mips_map_regno (regno);
1929       if (regno != 0 && pmon_reg == 0)
1930         val = 0;
1931       else
1932         {
1933           /* Unfortunately the PMON version in the Vr4300 board has been
1934              compiled without the 64bit register access commands. This
1935              means we cannot get hold of the full register width. */
1936           if (mips_monitor == MON_DDB)
1937             val = (unsigned)mips_request ('t', (unsigned int) pmon_reg,
1938                                 (unsigned int) 0, &err, mips_receive_wait, NULL);
1939           else
1940             val = mips_request ('r', (unsigned int) pmon_reg,
1941                                 (unsigned int) 0, &err, mips_receive_wait, NULL);
1942           if (err)
1943             mips_error ("Can't read register %d: %s", regno,
1944                         safe_strerror (errno));
1945         }
1946     }
1947
1948   {
1949     char buf[MAX_REGISTER_RAW_SIZE];
1950
1951     /* We got the number the register holds, but gdb expects to see a
1952        value in the target byte ordering.  */
1953     store_unsigned_integer (buf, REGISTER_RAW_SIZE (regno), val);
1954     supply_register (regno, buf);
1955   }
1956 }
1957
1958 /* Prepare to store registers.  The MIPS protocol can store individual
1959    registers, so this function doesn't have to do anything.  */
1960
1961 static void
1962 mips_prepare_to_store ()
1963 {
1964 }
1965
1966 /* Store remote register(s).  */
1967
1968 static void
1969 mips_store_registers (regno)
1970      int regno;
1971 {
1972   int err;
1973
1974   if (regno == -1)
1975     {
1976       for (regno = 0; regno < NUM_REGS; regno++)
1977         mips_store_registers (regno);
1978       return;
1979     }
1980
1981   mips_request ('R', (unsigned int) mips_map_regno (regno),
1982                 read_register (regno),
1983                 &err, mips_receive_wait, NULL);
1984   if (err)
1985     mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
1986 }
1987
1988 /* Fetch a word from the target board.  */
1989
1990 static unsigned int 
1991 mips_fetch_word (addr)
1992      CORE_ADDR addr;
1993 {
1994   unsigned int val;
1995   int err;
1996
1997   /* FIXME! addr was cast to uint! */
1998   val = mips_request ('d', addr, (unsigned int) 0, &err,
1999                       mips_receive_wait, NULL);
2000   if (err)
2001     {
2002       /* Data space failed; try instruction space.  */
2003       /* FIXME! addr was cast to uint! */
2004       val = mips_request ('i', addr, (unsigned int) 0, &err,
2005                           mips_receive_wait, NULL);
2006       if (err)
2007         mips_error ("Can't read address 0x%s: %s",
2008               paddr_nz (addr), safe_strerror (errno));
2009     }
2010   return val;
2011 }
2012
2013 /* Store a word to the target board.  Returns errno code or zero for
2014    success.  If OLD_CONTENTS is non-NULL, put the old contents of that
2015    memory location there.  */
2016
2017 /* FIXME! make sure only 32-bit quantities get stored! */
2018 static int
2019 mips_store_word (addr, val, old_contents)
2020      CORE_ADDR addr;
2021      unsigned int val;
2022      char *old_contents;
2023 {
2024   int err;
2025   unsigned int oldcontents;
2026
2027   oldcontents = mips_request ('D', addr, (unsigned int) val,
2028                               &err,
2029                               mips_receive_wait, NULL);
2030   if (err)
2031     {
2032       /* Data space failed; try instruction space.  */
2033       oldcontents = mips_request ('I', addr,
2034                                   (unsigned int) val, &err,
2035                                   mips_receive_wait, NULL);
2036       if (err)
2037         return errno;
2038     }
2039   if (old_contents != NULL)
2040     store_unsigned_integer (old_contents, 4, oldcontents);
2041   return 0;
2042 }
2043
2044 /* Read or write LEN bytes from inferior memory at MEMADDR,
2045    transferring to or from debugger address MYADDR.  Write to inferior
2046    if SHOULD_WRITE is nonzero.  Returns length of data written or
2047    read; 0 for error.  Note that protocol gives us the correct value
2048    for a longword, since it transfers values in ASCII.  We want the
2049    byte values, so we have to swap the longword values.  */
2050
2051 static int
2052 mips_xfer_memory (memaddr, myaddr, len, write, ignore)
2053      CORE_ADDR memaddr;
2054      char *myaddr;
2055      int len;
2056      int write;
2057      struct target_ops *ignore;
2058 {
2059   register int i;
2060   /* Round starting address down to longword boundary.  */
2061   register CORE_ADDR addr = memaddr &~ 3;
2062   /* Round ending address up; get number of longwords that makes.  */
2063   register int count = (((memaddr + len) - addr) + 3) / 4;
2064   /* Allocate buffer of that many longwords.  */
2065   register char *buffer = alloca (count * 4);
2066
2067   int status;
2068
2069   if (write)
2070     {
2071       /* Fill start and end extra bytes of buffer with existing data.  */
2072       if (addr != memaddr || len < 4)
2073         {
2074           /* Need part of initial word -- fetch it.  */
2075           store_unsigned_integer (&buffer[0], 4, mips_fetch_word (addr));
2076         }
2077
2078       if (count > 1)
2079         {
2080           /* Need part of last word -- fetch it.  FIXME: we do this even
2081              if we don't need it.  */
2082           store_unsigned_integer (&buffer[(count - 1) * 4], 4,
2083                                   mips_fetch_word (addr + (count - 1) * 4));
2084         }
2085
2086       /* Copy data to be written over corresponding part of buffer */
2087
2088       memcpy ((char *) buffer + (memaddr & 3), myaddr, len);
2089
2090       /* Write the entire buffer.  */
2091
2092       for (i = 0; i < count; i++, addr += 4)
2093         {
2094           status = mips_store_word (addr,
2095                                     extract_unsigned_integer (&buffer[i*4], 4),
2096                                     NULL);
2097           /* Report each kilobyte (we download 32-bit words at a time) */
2098           if (i % 256 == 255) 
2099             {
2100               printf_unfiltered ("*");
2101               fflush (stdout);
2102             }
2103           if (status)
2104             {
2105               errno = status;
2106               return 0;
2107             }
2108           /* FIXME: Do we want a QUIT here?  */
2109         }
2110       if (count >= 256)
2111         printf_unfiltered ("\n");
2112     }
2113   else
2114     {
2115       /* Read all the longwords */
2116       for (i = 0; i < count; i++, addr += 4)
2117         {
2118           store_unsigned_integer (&buffer[i*4], 4, mips_fetch_word (addr));
2119           QUIT;
2120         }
2121
2122       /* Copy appropriate bytes out of the buffer.  */
2123       memcpy (myaddr, buffer + (memaddr & 3), len);
2124     }
2125   return len;
2126 }
2127
2128 /* Print info on this target.  */
2129
2130 static void
2131 mips_files_info (ignore)
2132      struct target_ops *ignore;
2133 {
2134   printf_unfiltered ("Debugging a MIPS board over a serial line.\n");
2135 }
2136
2137 /* Kill the process running on the board.  This will actually only
2138    work if we are doing remote debugging over the console input.  I
2139    think that if IDT/sim had the remote debug interrupt enabled on the
2140    right port, we could interrupt the process with a break signal.  */
2141
2142 static void
2143 mips_kill ()
2144 {
2145   if (!mips_wait_flag)
2146     return;
2147
2148   interrupt_count++;
2149
2150   if (interrupt_count >= 2)
2151     {
2152       interrupt_count = 0;
2153
2154       target_terminal_ours ();
2155
2156       if (query ("Interrupted while waiting for the program.\n\
2157 Give up (and stop debugging it)? "))
2158         {
2159           /* Clean up in such a way that mips_close won't try to talk to the
2160              board (it almost surely won't work since we weren't able to talk to
2161              it).  */
2162           mips_wait_flag = 0;
2163           close_ports();
2164
2165           printf_unfiltered ("Ending remote MIPS debugging.\n");
2166           target_mourn_inferior ();
2167
2168           return_to_top_level (RETURN_QUIT);
2169         }
2170
2171       target_terminal_inferior ();
2172     }
2173
2174   if (remote_debug > 0)
2175     printf_unfiltered ("Sending break\n");
2176
2177   SERIAL_SEND_BREAK (mips_desc);
2178
2179 #if 0
2180   if (mips_is_open)
2181     {
2182       char cc;
2183
2184       /* Send a ^C.  */
2185       cc = '\003';
2186       SERIAL_WRITE (mips_desc, &cc, 1);
2187       sleep (1);
2188       target_mourn_inferior ();
2189     }
2190 #endif
2191 }
2192
2193 /* Start running on the target board.  */
2194
2195 static void
2196 mips_create_inferior (execfile, args, env)
2197      char *execfile;
2198      char *args;
2199      char **env;
2200 {
2201   CORE_ADDR entry_pt;
2202
2203   if (args && *args)
2204     {
2205       warning ("\
2206 Can't pass arguments to remote MIPS board; arguments ignored.");
2207       /* And don't try to use them on the next "run" command.  */
2208       execute_command ("set args", 0);
2209     }
2210
2211   if (execfile == 0 || exec_bfd == 0)
2212     error ("No executable file specified");
2213
2214   entry_pt = (CORE_ADDR) bfd_get_start_address (exec_bfd);
2215
2216   init_wait_for_inferior ();
2217
2218   /* FIXME: Should we set inferior_pid here?  */
2219
2220 /* start-sanitize-gm */
2221 #ifdef GENERAL_MAGIC
2222   magic_create_inferior_hook ();
2223   proceed (entry_pt, TARGET_SIGNAL_PWR, 0);
2224 #else
2225 /* end-sanitize-gm */
2226   proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
2227 /* start-sanitize-gm */
2228 #endif /* GENERAL_MAGIC */
2229 /* end-sanitize-gm */
2230 }
2231
2232 /* Clean up after a process.  Actually nothing to do.  */
2233
2234 static void
2235 mips_mourn_inferior ()
2236 {
2237   if (current_ops != NULL)
2238     unpush_target (current_ops);
2239   generic_mourn_inferior ();
2240 }
2241 \f
2242 /* We can write a breakpoint and read the shadow contents in one
2243    operation.  */
2244
2245 /* The IDT board uses an unusual breakpoint value, and sometimes gets
2246    confused when it sees the usual MIPS breakpoint instruction.  */
2247
2248 #define BREAK_INSN (0x00000a0d)
2249 #define BREAK_INSN_SIZE (4)
2250
2251 /* Insert a breakpoint on targets that don't have any better breakpoint
2252    support.  We read the contents of the target location and stash it,
2253    then overwrite it with a breakpoint instruction.  ADDR is the target
2254    location in the target machine.  CONTENTS_CACHE is a pointer to 
2255    memory allocated for saving the target contents.  It is guaranteed
2256    by the caller to be long enough to save sizeof BREAKPOINT bytes (this
2257    is accomplished via BREAKPOINT_MAX).  */
2258
2259 static int
2260 mips_insert_breakpoint (addr, contents_cache)
2261      CORE_ADDR addr;
2262      char *contents_cache;
2263 {
2264   if (monitor_supports_breakpoints)
2265     return common_breakpoint ('B', addr, 0x3, "f");
2266
2267   return mips_store_word (addr, BREAK_INSN, contents_cache);
2268 }
2269
2270 static int
2271 mips_remove_breakpoint (addr, contents_cache)
2272      CORE_ADDR addr;
2273      char *contents_cache;
2274 {
2275   if (monitor_supports_breakpoints)
2276     return common_breakpoint ('b', addr, 0, NULL);
2277
2278   return target_write_memory (addr, contents_cache, BREAK_INSN_SIZE);
2279 }
2280
2281 #if 0 /* currently not used */
2282 /* PMON does not currently provide support for the debug mode 'b'
2283    commands to manipulate breakpoints. However, if we wanted to use
2284    the monitor breakpoints (rather than the GDB BREAK_INSN version)
2285    then this code performs the work needed to leave debug mode,
2286    set/clear the breakpoint, and then return to debug mode. */
2287
2288 #define PMON_MAX_BP (33) /* 32 SW, 1 HW */
2289 static CORE_ADDR mips_pmon_bp_info[PMON_MAX_BP];
2290 /* NOTE: The code relies on this vector being zero-initialised by the system */
2291
2292 static int
2293 pmon_insert_breakpoint (addr, contents_cache)
2294      CORE_ADDR addr;
2295      char *contents_cache;
2296 {
2297   int status;
2298
2299   if (monitor_supports_breakpoints)
2300     {
2301       char tbuff[12]; /* space for breakpoint command */
2302       int bpnum;
2303       CORE_ADDR bpaddr;
2304
2305       /* PMON does not support debug level breakpoint set/remove: */
2306       if (mips_exit_debug ())
2307         mips_error ("Failed to exit debug mode");
2308
2309       sprintf (tbuff, "b %08x\r", addr);
2310       mips_send_command (tbuff, 0);
2311
2312       mips_expect ("Bpt ");
2313
2314       if (!mips_getstring (tbuff, 2))
2315         return 1;
2316       tbuff[2] = '\0'; /* terminate the string */
2317       if (sscanf (tbuff, "%d", &bpnum) != 1)
2318         {
2319           fprintf_unfiltered (stderr, "Invalid decimal breakpoint number from target: %s\n", tbuff);
2320           return 1;
2321         }
2322
2323       mips_expect (" = ");
2324
2325       /* Lead in the hex number we are expecting: */
2326       tbuff[0] = '0';
2327       tbuff[1] = 'x';
2328
2329       /* FIXME!! only 8 bytes!  need to expand for Bfd64; 
2330          which targets return 64-bit addresses?  PMON returns only 32! */
2331       if (!mips_getstring (&tbuff[2], 8))
2332         return 1;
2333       tbuff[10] = '\0'; /* terminate the string */
2334
2335       if (sscanf (tbuff, "0x%08x", &bpaddr) != 1)
2336         {
2337           fprintf_unfiltered (stderr, "Invalid hex address from target: %s\n", tbuff);
2338           return 1;
2339         }
2340
2341       if (bpnum >= PMON_MAX_BP)
2342         {
2343           fprintf_unfiltered (stderr, "Error: Returned breakpoint number %d outside acceptable range (0..%d)\n",
2344                               bpnum, PMON_MAX_BP - 1);
2345           return 1;
2346         }
2347
2348       if (bpaddr != addr)
2349         fprintf_unfiltered (stderr, "Warning: Breakpoint addresses do not match: 0x%x != 0x%x\n", addr, bpaddr);
2350
2351       mips_pmon_bp_info[bpnum] = bpaddr;
2352
2353       mips_expect ("\r\n");
2354       mips_expect (mips_monitor_prompt);
2355
2356       mips_enter_debug ();
2357
2358       return 0;
2359     }
2360
2361   return mips_store_word (addr, BREAK_INSN, contents_cache);
2362 }
2363
2364 static int
2365 pmon_remove_breakpoint (addr, contents_cache)
2366      CORE_ADDR addr;
2367      char *contents_cache;
2368 {
2369   if (monitor_supports_breakpoints)
2370     {
2371       int bpnum;
2372       char tbuff[7]; /* enough for delete breakpoint command */
2373
2374       for (bpnum = 0; bpnum < PMON_MAX_BP; bpnum++)
2375         if (mips_pmon_bp_info[bpnum] == addr)
2376           break;
2377
2378       if (bpnum >= PMON_MAX_BP)
2379         {
2380           fprintf_unfiltered (stderr,
2381             "pmon_remove_breakpoint: Failed to find breakpoint at address 0x%s\n",
2382             paddr_nz (addr));
2383           return 1;
2384         }
2385
2386       if (mips_exit_debug ())
2387         mips_error ("Failed to exit debug mode");
2388
2389       sprintf (tbuff, "db %02d\r", bpnum);
2390
2391       mips_send_command (tbuff, -1);
2392       /* NOTE: If the breakpoint does not exist then a "Bpt <dd> not
2393          set" message will be returned. */
2394
2395       mips_enter_debug ();
2396
2397       return 0;
2398     }
2399
2400   return target_write_memory (addr, contents_cache, BREAK_INSN_SIZE);
2401 }
2402 #endif
2403
2404 /* Compute a don't care mask for the region bounding ADDR and ADDR + LEN - 1.
2405    This is used for memory ref breakpoints.  */
2406
2407 static unsigned long
2408 calculate_mask (addr, len)
2409      CORE_ADDR addr;
2410      int len;
2411 {
2412   unsigned long mask;
2413   int i;
2414
2415   mask = addr ^ (addr + len - 1);
2416
2417   for (i = 32; i >= 0; i--)
2418     if (mask == 0)
2419       break;
2420     else
2421       mask >>= 1;
2422
2423   mask = (unsigned long) 0xffffffff >> i;
2424
2425   return mask;
2426 }
2427
2428 /* Set a data watchpoint.  ADDR and LEN should be obvious.  TYPE is either 1
2429    for a read watchpoint, or 2 for a read/write watchpoint. */
2430
2431 int
2432 remote_mips_set_watchpoint (addr, len, type)
2433      CORE_ADDR addr;
2434      int len;
2435      int type;
2436 {
2437   CORE_ADDR first_addr;
2438   unsigned long mask;
2439   char *flags;
2440
2441   mask = calculate_mask (addr, len);
2442
2443   first_addr = addr & ~mask;
2444
2445   switch (type)
2446     {
2447     case 0:                     /* write */
2448       flags = "w";
2449       break;
2450     case 1:                     /* read */
2451       flags = "r";
2452       break;
2453     case 2:                     /* read/write */
2454       flags = "rw";
2455       break;
2456     default:
2457       abort ();
2458     }
2459
2460   if (common_breakpoint ('B', first_addr, mask, flags))
2461     return -1;
2462
2463   return 0;
2464 }
2465
2466 int
2467 remote_mips_remove_watchpoint (addr, len, type)
2468      CORE_ADDR addr;
2469      int len;
2470      int type;
2471 {
2472   CORE_ADDR first_addr;
2473   unsigned long mask;
2474
2475   mask = calculate_mask (addr, len);
2476
2477   first_addr = addr & ~mask;
2478
2479   if (common_breakpoint ('b', first_addr, 0, NULL))
2480     return -1;
2481
2482   return 0;
2483 }
2484
2485 int
2486 remote_mips_stopped_by_watchpoint ()
2487 {
2488   return hit_watchpoint;
2489 }
2490
2491 /* This routine generates the a breakpoint command of the form:
2492
2493    0x0 <CMD> <ADDR> <MASK> <FLAGS>
2494
2495    Where <CMD> is one of: `B' to set, or `b' to clear a breakpoint.  <ADDR> is
2496    the address of the breakpoint.  <MASK> is a don't care mask for addresses.
2497    <FLAGS> is any combination of `r', `w', or `f' for read/write/or fetch.
2498
2499    Return 0 if successful; otherwise 1.  */
2500
2501 static int
2502 common_breakpoint (cmd, addr, mask, flags)
2503      int cmd;
2504      CORE_ADDR addr;
2505      CORE_ADDR mask;
2506      char *flags;
2507 {
2508   int len;
2509   char buf[DATA_MAXLEN + 1];
2510   char rcmd;
2511   int rpid, rerrflg, rresponse;
2512   int nfields;
2513
2514   addr = ADDR_BITS_REMOVE (addr);
2515   if (flags)
2516     sprintf (buf, "0x0 %c 0x%s 0x%s %s", cmd, paddr_nz (addr), paddr_nz (mask),
2517              flags);
2518   else
2519     sprintf (buf, "0x0 %c 0x%s", cmd, paddr_nz (addr));
2520
2521   mips_send_packet (buf, 1);
2522
2523   len = mips_receive_packet (buf, 1, mips_receive_wait);
2524   buf[len] = '\0';
2525
2526   nfields = sscanf (buf, "0x%x %c 0x%x 0x%x", &rpid, &rcmd, &rerrflg, &rresponse);
2527
2528   if (nfields != 4
2529       || rcmd != cmd)
2530     mips_error ("common_breakpoint: Bad response from remote board: %s", buf);
2531
2532   if (rerrflg != 0)
2533     {
2534       /* Ddb returns "0x0 b 0x16 0x0\000", whereas
2535          Cogent returns "0x0 b 0xffffffff 0x16\000": */
2536       if (mips_monitor == MON_DDB)
2537         rresponse = rerrflg;
2538       if (rresponse != 22) /* invalid argument */
2539         fprintf_unfiltered (stderr, "common_breakpoint (0x%s):  Got error: 0x%x\n",
2540                             paddr_nz (addr), rresponse);
2541       return 1;
2542     }
2543
2544   return 0;
2545 }
2546 \f
2547 static void
2548 send_srec (srec, len, addr)
2549      char *srec;
2550      int len;
2551      CORE_ADDR addr;
2552 {
2553   while (1)
2554     {
2555       int ch;
2556
2557       SERIAL_WRITE (mips_desc, srec, len);
2558
2559       ch = mips_readchar (2);
2560
2561       switch (ch)
2562         {
2563         case SERIAL_TIMEOUT:
2564           error ("Timeout during download.");
2565           break;
2566         case 0x6:               /* ACK */
2567           return;
2568         case 0x15:              /* NACK */
2569           fprintf_unfiltered (gdb_stderr, "Download got a NACK at byte %d!  Retrying.\n", addr);
2570           continue;
2571         default:
2572           error ("Download got unexpected ack char: 0x%x, retrying.\n", ch);
2573         }
2574     }
2575 }
2576
2577 /*  Download a binary file by converting it to S records. */
2578
2579 static void
2580 mips_load_srec (args)
2581      char *args;
2582 {
2583   bfd *abfd;
2584   asection *s;
2585   char *buffer, srec[1024];
2586   unsigned int i;
2587   unsigned int srec_frame = 200;
2588   int reclen;
2589   static int hashmark = 1;
2590
2591   buffer = alloca (srec_frame * 2 + 256);
2592
2593   abfd = bfd_openr (args, 0);
2594   if (!abfd)
2595     {
2596       printf_filtered ("Unable to open file %s\n", args);
2597       return;
2598     }
2599
2600   if (bfd_check_format (abfd, bfd_object) == 0)
2601     {
2602       printf_filtered ("File is not an object file\n");
2603       return;
2604     }
2605
2606 /* This actually causes a download in the IDT binary format: */
2607   mips_send_command (LOAD_CMD, 0);
2608
2609   for (s = abfd->sections; s; s = s->next)
2610     {
2611       if (s->flags & SEC_LOAD)
2612         {
2613           unsigned int numbytes;
2614
2615           /* FIXME!  vma too small?? */
2616           printf_filtered ("%s\t: 0x%4x .. 0x%4x  ", s->name, s->vma,
2617                            s->vma + s->_raw_size);
2618           gdb_flush (gdb_stdout);
2619
2620           for (i = 0; i < s->_raw_size; i += numbytes)
2621             {
2622               numbytes = min (srec_frame, s->_raw_size - i);
2623
2624               bfd_get_section_contents (abfd, s, buffer, i, numbytes);
2625
2626               reclen = mips_make_srec (srec, '3', s->vma + i, buffer, numbytes);
2627               send_srec (srec, reclen, s->vma + i);
2628
2629               if (hashmark)
2630                 {
2631                   putchar_unfiltered ('#');
2632                   gdb_flush (gdb_stdout);
2633                 }
2634
2635             } /* Per-packet (or S-record) loop */
2636           
2637           putchar_unfiltered ('\n');
2638         } /* Loadable sections */
2639     }
2640   if (hashmark) 
2641     putchar_unfiltered ('\n');
2642   
2643   /* Write a type 7 terminator record. no data for a type 7, and there
2644      is no data, so len is 0.  */
2645
2646   reclen = mips_make_srec (srec, '7', abfd->start_address, NULL, 0);
2647
2648   send_srec (srec, reclen, abfd->start_address);
2649
2650   SERIAL_FLUSH_INPUT (mips_desc);
2651 }
2652
2653 /*
2654  * mips_make_srec -- make an srecord. This writes each line, one at a
2655  *      time, each with it's own header and trailer line.
2656  *      An srecord looks like this:
2657  *
2658  * byte count-+     address
2659  * start ---+ |        |       data        +- checksum
2660  *          | |        |                   |
2661  *        S01000006F6B692D746573742E73726563E4
2662  *        S315000448600000000000000000FC00005900000000E9
2663  *        S31A0004000023C1400037DE00F023604000377B009020825000348D
2664  *        S30B0004485A0000000000004E
2665  *        S70500040000F6
2666  *
2667  *      S<type><length><address><data><checksum>
2668  *
2669  *      Where
2670  *      - length
2671  *        is the number of bytes following upto the checksum. Note that
2672  *        this is not the number of chars following, since it takes two
2673  *        chars to represent a byte.
2674  *      - type
2675  *        is one of:
2676  *        0) header record
2677  *        1) two byte address data record
2678  *        2) three byte address data record
2679  *        3) four byte address data record
2680  *        7) four byte address termination record
2681  *        8) three byte address termination record
2682  *        9) two byte address termination record
2683  *       
2684  *      - address
2685  *        is the start address of the data following, or in the case of
2686  *        a termination record, the start address of the image
2687  *      - data
2688  *        is the data.
2689  *      - checksum
2690  *        is the sum of all the raw byte data in the record, from the length
2691  *        upwards, modulo 256 and subtracted from 255.
2692  *
2693  * This routine returns the length of the S-record.
2694  *
2695  */
2696
2697 static int
2698 mips_make_srec (buf, type, memaddr, myaddr, len)
2699      char *buf;
2700      int type;
2701      CORE_ADDR memaddr;
2702      unsigned char *myaddr;
2703      int len;
2704 {
2705   unsigned char checksum;
2706   int i;
2707
2708   /* Create the header for the srec. addr_size is the number of bytes in the address,
2709      and 1 is the number of bytes in the count.  */
2710
2711   /* FIXME!! bigger buf required for 64-bit! */
2712   buf[0] = 'S';
2713   buf[1] = type;
2714   buf[2] = len + 4 + 1;         /* len + 4 byte address + 1 byte checksum */
2715   /* This assumes S3 style downloads (4byte addresses). There should
2716      probably be a check, or the code changed to make it more
2717      explicit. */
2718   buf[3] = memaddr >> 24;
2719   buf[4] = memaddr >> 16;
2720   buf[5] = memaddr >> 8;
2721   buf[6] = memaddr;
2722   memcpy (&buf[7], myaddr, len);
2723
2724   /* Note that the checksum is calculated on the raw data, not the
2725      hexified data.  It includes the length, address and the data
2726      portions of the packet.  */
2727   checksum = 0;
2728   buf += 2;                     /* Point at length byte */
2729   for (i = 0; i < len + 4 + 1; i++)
2730     checksum += *buf++;
2731
2732   *buf = ~checksum;
2733
2734   return len + 8;
2735 }
2736
2737 /* The following manifest controls whether we enable the simple flow
2738    control support provided by the monitor. If enabled the code will
2739    wait for an affirmative ACK between transmitting packets. */
2740 #define DOETXACK (1)
2741
2742 /* The PMON fast-download uses an encoded packet format constructed of
2743    3byte data packets (encoded as 4 printable ASCII characters), and
2744    escape sequences (preceded by a '/'):
2745
2746         'K'     clear checksum
2747         'C'     compare checksum (12bit value, not included in checksum calculation)
2748         'S'     define symbol name (for addr) terminated with "," and padded to 4char boundary
2749         'Z'     zero fill multiple of 3bytes
2750         'B'     byte (12bit encoded value, of 8bit data)
2751         'A'     address (36bit encoded value)
2752         'E'     define entry as original address, and exit load
2753
2754    The packets are processed in 4 character chunks, so the escape
2755    sequences that do not have any data (or variable length data)
2756    should be padded to a 4 character boundary.  The decoder will give
2757    an error if the complete message block size is not a multiple of
2758    4bytes (size of record).
2759
2760    The encoding of numbers is done in 6bit fields.  The 6bit value is
2761    used to index into this string to get the specific character
2762    encoding for the value: */
2763 static char encoding[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,.";
2764
2765 /* Convert the number of bits required into an encoded number, 6bits
2766    at a time (range 0..63).  Keep a checksum if required (passed
2767    pointer non-NULL). The function returns the number of encoded
2768    characters written into the buffer. */
2769 static int
2770 pmon_makeb64 (v, p, n, chksum)
2771      unsigned long v;
2772      char *p;
2773      int n;
2774      int *chksum;
2775 {
2776   int count = (n / 6);
2777
2778   if ((n % 12) != 0) {
2779     fprintf_unfiltered(stderr,"Fast encoding bitcount must be a multiple of 12bits: %dbit%s\n",n,(n == 1)?"":"s");
2780     return(0);
2781   }
2782   if (n > 36) {
2783     fprintf_unfiltered(stderr,"Fast encoding cannot process more than 36bits at the moment: %dbits\n",n);
2784     return(0);
2785   }
2786
2787   /* Deal with the checksum: */
2788   if (chksum != NULL) {
2789     switch (n) {
2790      case 36: *chksum += ((v >> 24) & 0xFFF);
2791      case 24: *chksum += ((v >> 12) & 0xFFF);
2792      case 12: *chksum += ((v >>  0) & 0xFFF);
2793     }
2794   }
2795
2796   do {
2797     n -= 6;
2798     *p++ = encoding[(v >> n) & 0x3F];
2799   } while (n > 0);
2800
2801   return(count);
2802 }
2803
2804 /* Shorthand function (that could be in-lined) to output the zero-fill
2805    escape sequence into the data stream. */
2806 static int
2807 pmon_zeroset (recsize, buff, amount, chksum)
2808      int recsize;
2809      char **buff;
2810      int *amount;
2811      unsigned int *chksum;
2812 {
2813   int count;
2814
2815   sprintf(*buff,"/Z");
2816   count = pmon_makeb64 (*amount, (*buff + 2), 12, chksum);
2817   *buff += (count + 2);
2818   *amount = 0;
2819   return(recsize + count + 2);
2820 }
2821
2822 static int
2823 pmon_checkset (recsize, buff, value)
2824      int recsize;
2825      char **buff;
2826      int *value;
2827 {
2828   int count;
2829
2830   /* Add the checksum (without updating the value): */
2831   sprintf (*buff, "/C");
2832   count = pmon_makeb64 (*value, (*buff + 2), 12, NULL);
2833   *buff += (count + 2);
2834   sprintf (*buff, "\n");
2835   *buff += 2; /* include zero terminator */
2836   /* Forcing a checksum validation clears the sum: */
2837   *value = 0;
2838   return(recsize + count + 3);
2839 }
2840
2841 /* Amount of padding we leave after at the end of the output buffer,
2842    for the checksum and line termination characters: */
2843 #define CHECKSIZE (4 + 4 + 4 + 2)
2844 /* zero-fill, checksum, transfer end and line termination space. */
2845
2846 /* The amount of binary data loaded from the object file in a single
2847    operation: */
2848 #define BINCHUNK (1024)
2849
2850 /* Maximum line of data accepted by the monitor: */
2851 #define MAXRECSIZE (550)
2852 /* NOTE: This constant depends on the monitor being used. This value
2853    is for PMON 5.x on the Cogent Vr4300 board. */
2854
2855 static void
2856 pmon_make_fastrec (outbuf, inbuf, inptr, inamount, recsize, csum, zerofill)
2857      char **outbuf;
2858      unsigned char *inbuf;
2859      int *inptr;
2860      int inamount;
2861      int *recsize;
2862      unsigned int *csum;
2863      unsigned int *zerofill;
2864 {
2865   int count = 0;
2866   char *p = *outbuf;
2867
2868   /* This is a simple check to ensure that our data will fit within
2869      the maximum allowable record size. Each record output is 4bytes
2870      in length. We must allow space for a pending zero fill command,
2871      the record, and a checksum record. */
2872   while ((*recsize < (MAXRECSIZE - CHECKSIZE)) && ((inamount - *inptr) > 0)) {
2873     /* Process the binary data: */
2874     if ((inamount - *inptr) < 3) {
2875       if (*zerofill != 0)
2876        *recsize = pmon_zeroset (*recsize, &p, zerofill, csum);
2877       sprintf (p, "/B");
2878       count = pmon_makeb64 (inbuf[*inptr], &p[2], 12, csum);
2879       p += (2 + count);
2880       *recsize += (2 + count);
2881       (*inptr)++;
2882     } else {
2883       unsigned int value = ((inbuf[*inptr + 0] << 16) | (inbuf[*inptr + 1] << 8) | inbuf[*inptr + 2]);
2884       /* Simple check for zero data. TODO: A better check would be
2885          to check the last, and then the middle byte for being zero
2886          (if the first byte is not). We could then check for
2887          following runs of zeros, and if above a certain size it is
2888          worth the 4 or 8 character hit of the byte insertions used
2889          to pad to the start of the zeroes. NOTE: This also depends
2890          on the alignment at the end of the zero run. */
2891       if (value == 0x00000000) {
2892         (*zerofill)++;
2893         if (*zerofill == 0xFFF) /* 12bit counter */
2894          *recsize = pmon_zeroset (*recsize, &p, zerofill, csum);
2895       }else {
2896         if (*zerofill != 0)
2897          *recsize = pmon_zeroset (*recsize, &p, zerofill, csum);
2898         count = pmon_makeb64 (value, p, 24, csum);
2899         p += count;
2900         *recsize += count;
2901       }
2902       *inptr += 3;
2903     }
2904   }
2905
2906   *outbuf = p;
2907   return;
2908 }
2909
2910 static int
2911 pmon_check_ack(mesg)
2912      char *mesg;
2913 {
2914 #if defined(DOETXACK)
2915   int c;
2916
2917   if (!tftp_in_use)
2918     {
2919       c = SERIAL_READCHAR (udp_in_use ? udp_desc : mips_desc, 2);
2920       if ((c == SERIAL_TIMEOUT) || (c != 0x06))
2921         {
2922           fprintf_unfiltered (gdb_stderr,
2923                               "Failed to receive valid ACK for %s\n", mesg);
2924           return(-1); /* terminate the download */
2925         }
2926     }
2927 #endif /* DOETXACK */
2928   return(0);
2929 }
2930
2931 /* pmon_download - Send a sequence of characters to the PMON download port,
2932    which is either a serial port or a UDP socket.  */
2933
2934 static void
2935 pmon_start_download ()
2936 {
2937   if (tftp_in_use)
2938     {
2939       /* Create the temporary download file.  */
2940       if ((tftp_file = fopen (tftp_localname, "w")) == NULL)
2941         perror_with_name (tftp_localname);
2942     }
2943   else
2944     {
2945       mips_send_command (udp_in_use ? LOAD_CMD_UDP : LOAD_CMD, 0);
2946       mips_expect ("Downloading from ");
2947       mips_expect (udp_in_use ? "udp" : "tty0");
2948       mips_expect (", ^C to abort\r\n");
2949     }
2950 }
2951
2952 static int
2953 mips_expect_download (char *string)
2954 {
2955   if (!mips_expect (string))
2956     {
2957       fprintf_unfiltered (gdb_stderr, "Load did not complete successfully.\n");
2958       if (tftp_in_use)
2959         remove (tftp_localname);        /* Remove temporary file */
2960       return 0;
2961     }
2962   else
2963     return 1;
2964 }
2965
2966 static void
2967 pmon_end_download (final, bintotal)
2968      int final;
2969      int bintotal;
2970 {
2971   char hexnumber[9]; /* includes '\0' space */
2972
2973   if (tftp_in_use)
2974     {
2975       static char *load_cmd_prefix = "load -b -s ";
2976       char *cmd;
2977       struct stat stbuf;
2978
2979       /* Close off the temporary file containing the load data.  */
2980       fclose (tftp_file);
2981       tftp_file = NULL;
2982
2983       /* Make the temporary file readable by the world.  */
2984       if (stat (tftp_localname, &stbuf) == 0)
2985         chmod (tftp_localname, stbuf.st_mode | S_IROTH);
2986
2987       /* Must reinitialize the board to prevent PMON from crashing.  */
2988       mips_send_command ("initEther\r", -1);
2989
2990       /* Send the load command.  */
2991       cmd = xmalloc (strlen (load_cmd_prefix) + strlen (tftp_name) + 2);
2992       strcpy (cmd, load_cmd_prefix);
2993       strcat (cmd, tftp_name);
2994       strcat (cmd, "\r");
2995       mips_send_command (cmd, 0);
2996       free (cmd);
2997       if (!mips_expect_download ("Downloading from "))
2998         return;
2999       if (!mips_expect_download (tftp_name))
3000         return;
3001       if (!mips_expect_download (", ^C to abort\r\n"))
3002         return;
3003     }
3004
3005   /* Wait for the stuff that PMON prints after the load has completed.
3006      The timeout value for use in the tftp case (15 seconds) was picked
3007      arbitrarily but might be too small for really large downloads. FIXME. */
3008   if (mips_monitor == MON_LSI)
3009     {
3010       pmon_check_ack ("termination");
3011       mips_expect_timeout ("Entry address is ", tftp_in_use ? 15 : 2);
3012     }
3013   else
3014     mips_expect_timeout ("Entry Address  = ", tftp_in_use ? 15 : 2);
3015
3016   sprintf (hexnumber,"%x",final);
3017   mips_expect (hexnumber);
3018   mips_expect ("\r\n");
3019   if (mips_monitor != MON_LSI)
3020     pmon_check_ack ("termination");
3021   mips_expect ("\r\ntotal = 0x");
3022   sprintf (hexnumber,"%x",bintotal);
3023   mips_expect (hexnumber);
3024   if (!mips_expect_download (" bytes\r\n"))
3025     return;
3026
3027   if (tftp_in_use)
3028     remove (tftp_localname);    /* Remove temporary file */
3029 }
3030
3031 static void
3032 pmon_download (buffer, length)
3033      char *buffer;
3034      int length;
3035 {
3036   if (tftp_in_use)
3037     fwrite (buffer, 1, length, tftp_file);
3038   else
3039     SERIAL_WRITE (udp_in_use ? udp_desc : mips_desc, buffer, length);
3040 }
3041
3042 static void
3043 pmon_load_fast (file)
3044      char *file;
3045 {
3046   bfd *abfd;
3047   asection *s;
3048   unsigned char *binbuf;
3049   char *buffer;
3050   int reclen;
3051   unsigned int csum = 0;
3052   int hashmark = !tftp_in_use;
3053   int bintotal = 0;
3054   int final = 0;
3055   int finished = 0;
3056
3057   buffer = (char *)xmalloc(MAXRECSIZE + 1);
3058   binbuf = (unsigned char *)xmalloc(BINCHUNK);
3059
3060   abfd = bfd_openr(file,0);
3061   if (!abfd)
3062    {
3063      printf_filtered ("Unable to open file %s\n",file);
3064      return;
3065    }
3066
3067   if (bfd_check_format(abfd,bfd_object) == 0)
3068    {
3069      printf_filtered("File is not an object file\n");
3070      return;
3071    }
3072
3073   /* Setup the required download state: */
3074   mips_send_command ("set dlproto etxack\r", -1);
3075   mips_send_command ("set dlecho off\r", -1);
3076   /* NOTE: We get a "cannot set variable" message if the variable is
3077      already defined to have the argument we give. The code doesn't
3078      care, since it just scans to the next prompt anyway. */
3079   /* Start the download: */
3080   pmon_start_download();
3081   
3082   /* Zero the checksum */
3083   sprintf(buffer,"/Kxx\n");
3084   reclen = strlen(buffer);
3085   pmon_download (buffer, reclen);
3086   finished = pmon_check_ack("/Kxx");
3087
3088   for (s = abfd->sections; s && !finished; s = s->next)
3089    if (s->flags & SEC_LOAD) /* only deal with loadable sections */
3090     {
3091       bintotal += s->_raw_size;
3092       final = (s->vma + s->_raw_size);
3093
3094       printf_filtered ("%s\t: 0x%4x .. 0x%4x  ", s->name, (unsigned int)s->vma,
3095                        (unsigned int)(s->vma + s->_raw_size));
3096       gdb_flush (gdb_stdout);
3097
3098       /* Output the starting address */
3099       sprintf(buffer,"/A");
3100       reclen = pmon_makeb64(s->vma,&buffer[2],36,&csum);
3101       buffer[2 + reclen] = '\n';
3102       buffer[3 + reclen] = '\0';
3103       reclen += 3; /* for the initial escape code and carriage return */
3104       pmon_download (buffer, reclen);
3105       finished = pmon_check_ack("/A");
3106
3107       if (!finished)
3108        {
3109          unsigned int binamount;
3110          unsigned int zerofill = 0;
3111          char *bp = buffer;
3112          unsigned int i;
3113
3114          reclen = 0;
3115
3116          for (i = 0; ((i < s->_raw_size) && !finished); i += binamount) {
3117            int binptr = 0;
3118
3119            binamount = min (BINCHUNK, s->_raw_size - i);
3120
3121            bfd_get_section_contents (abfd, s, binbuf, i, binamount);
3122
3123            /* This keeps a rolling checksum, until we decide to output
3124               the line: */
3125            for (; ((binamount - binptr) > 0);) {
3126              pmon_make_fastrec (&bp, binbuf, &binptr, binamount, &reclen, &csum, &zerofill);
3127              if (reclen >= (MAXRECSIZE - CHECKSIZE)) {
3128                reclen = pmon_checkset (reclen, &bp, &csum);
3129                pmon_download (buffer, reclen);
3130                finished = pmon_check_ack("data record");
3131                if (finished) {
3132                  zerofill = 0; /* do not transmit pending zerofills */
3133                  break;
3134                }
3135
3136                if (hashmark) {
3137                  putchar_unfiltered ('#');
3138                  gdb_flush (gdb_stdout);
3139                }
3140
3141                bp = buffer;
3142                reclen = 0; /* buffer processed */
3143              }
3144            }
3145          }
3146
3147          /* Ensure no out-standing zerofill requests: */
3148          if (zerofill != 0)
3149           reclen = pmon_zeroset (reclen, &bp, &zerofill, &csum);
3150
3151          /* and then flush the line: */
3152          if (reclen > 0) {
3153            reclen = pmon_checkset (reclen, &bp, &csum);
3154            /* Currently pmon_checkset outputs the line terminator by
3155               default, so we write out the buffer so far: */
3156            pmon_download (buffer, reclen);
3157            finished = pmon_check_ack("record remnant");
3158          }
3159        }
3160
3161       putchar_unfiltered ('\n');
3162     }
3163
3164   /* Terminate the transfer. We know that we have an empty output
3165      buffer at this point. */
3166   sprintf (buffer, "/E/E\n"); /* include dummy padding characters */
3167   reclen = strlen (buffer);
3168   pmon_download (buffer, reclen);
3169
3170   if (finished) { /* Ignore the termination message: */
3171     SERIAL_FLUSH_INPUT (udp_in_use ? udp_desc : mips_desc);
3172   } else { /* Deal with termination message: */
3173     pmon_end_download (final, bintotal);
3174   }
3175
3176   return;
3177 }
3178
3179 /* mips_load -- download a file. */
3180
3181 static void
3182 mips_load (file, from_tty)
3183     char *file;
3184     int  from_tty;
3185 {
3186   /* Get the board out of remote debugging mode.  */
3187   if (mips_exit_debug ())
3188     error ("mips_load:  Couldn't get into monitor mode.");
3189
3190   if (mips_monitor != MON_IDT)
3191    pmon_load_fast (file);
3192   else
3193    mips_load_srec (file);
3194
3195   mips_initialize ();
3196
3197   /* Finally, make the PC point at the start address */
3198   if (mips_monitor == MON_DDB)
3199     {
3200       /* Work around problem where DDB monitor does not update the
3201          PC after a load. The following ensures that the write_pc()
3202          WILL update the PC value: */
3203       register_valid[PC_REGNUM] = 0;
3204     }
3205   if (exec_bfd)
3206     write_pc (bfd_get_start_address (exec_bfd));
3207
3208   inferior_pid = 0;             /* No process now */
3209
3210 /* This is necessary because many things were based on the PC at the time that
3211    we attached to the monitor, which is no longer valid now that we have loaded
3212    new code (and just changed the PC).  Another way to do this might be to call
3213    normal_stop, except that the stack may not be valid, and things would get
3214    horribly confused... */
3215
3216   clear_symtab_users ();
3217 }
3218 \f
3219 /* The target vector.  */
3220
3221 struct target_ops mips_ops =
3222 {
3223   "mips",                       /* to_shortname */
3224   "Remote MIPS debugging over serial line",     /* to_longname */
3225   "\
3226 Debug a board using the MIPS remote debugging protocol over a serial line.\n\
3227 The argument is the device it is connected to or, if it contains a colon,\n\
3228 HOST:PORT to access a board over a network",  /* to_doc */
3229   mips_open,                    /* to_open */
3230   mips_close,                   /* to_close */
3231   NULL,                         /* to_attach */
3232   mips_detach,                  /* to_detach */
3233   mips_resume,                  /* to_resume */
3234   mips_wait,                    /* to_wait */
3235   mips_fetch_registers,         /* to_fetch_registers */
3236   mips_store_registers,         /* to_store_registers */
3237   mips_prepare_to_store,        /* to_prepare_to_store */
3238   mips_xfer_memory,             /* to_xfer_memory */
3239   mips_files_info,              /* to_files_info */
3240   mips_insert_breakpoint,       /* to_insert_breakpoint */
3241   mips_remove_breakpoint,       /* to_remove_breakpoint */
3242   NULL,                         /* to_terminal_init */
3243   NULL,                         /* to_terminal_inferior */
3244   NULL,                         /* to_terminal_ours_for_output */
3245   NULL,                         /* to_terminal_ours */
3246   NULL,                         /* to_terminal_info */
3247   mips_kill,                    /* to_kill */
3248   mips_load,                    /* to_load */
3249   NULL,                         /* to_lookup_symbol */
3250   mips_create_inferior,         /* to_create_inferior */
3251   mips_mourn_inferior,          /* to_mourn_inferior */
3252   NULL,                         /* to_can_run */
3253   NULL,                         /* to_notice_signals */
3254   0,                            /* to_thread_alive */
3255   0,                            /* to_stop */
3256   process_stratum,              /* to_stratum */
3257   NULL,                         /* to_next */
3258   1,                            /* to_has_all_memory */
3259   1,                            /* to_has_memory */
3260   1,                            /* to_has_stack */
3261   1,                            /* to_has_registers */
3262   1,                            /* to_has_execution */
3263   NULL,                         /* sections */
3264   NULL,                         /* sections_end */
3265   OPS_MAGIC                     /* to_magic */
3266 };
3267 \f
3268 /* An alternative target vector: */
3269 struct target_ops pmon_ops =
3270 {
3271   "pmon",                       /* to_shortname */
3272   "Remote MIPS debugging over serial line",     /* to_longname */
3273   "\
3274 Debug a board using the PMON MIPS remote debugging protocol over a serial\n\
3275 line. The argument is the device it is connected to or, if it contains a\n\
3276 colon, HOST:PORT to access a board over a network",  /* to_doc */
3277   pmon_open,                    /* to_open */
3278   mips_close,                   /* to_close */
3279   NULL,                         /* to_attach */
3280   mips_detach,                  /* to_detach */
3281   mips_resume,                  /* to_resume */
3282   pmon_wait,                    /* to_wait */
3283   mips_fetch_registers,         /* to_fetch_registers */
3284   mips_store_registers,         /* to_store_registers */
3285   mips_prepare_to_store,        /* to_prepare_to_store */
3286   mips_xfer_memory,             /* to_xfer_memory */
3287   mips_files_info,              /* to_files_info */
3288   mips_insert_breakpoint,       /* to_insert_breakpoint */
3289   mips_remove_breakpoint,       /* to_remove_breakpoint */
3290   NULL,                         /* to_terminal_init */
3291   NULL,                         /* to_terminal_inferior */
3292   NULL,                         /* to_terminal_ours_for_output */
3293   NULL,                         /* to_terminal_ours */
3294   NULL,                         /* to_terminal_info */
3295   mips_kill,                    /* to_kill */
3296   mips_load,                    /* to_load */
3297   NULL,                         /* to_lookup_symbol */
3298   mips_create_inferior,         /* to_create_inferior */
3299   mips_mourn_inferior,          /* to_mourn_inferior */
3300   NULL,                         /* to_can_run */
3301   NULL,                         /* to_notice_signals */
3302   0,                            /* to_thread_alive */
3303   0,                            /* to_stop */
3304   process_stratum,              /* to_stratum */
3305   NULL,                         /* to_next */
3306   1,                            /* to_has_all_memory */
3307   1,                            /* to_has_memory */
3308   1,                            /* to_has_stack */
3309   1,                            /* to_has_registers */
3310   1,                            /* to_has_execution */
3311   NULL,                         /* sections */
3312   NULL,                         /* sections_end */
3313   OPS_MAGIC                     /* to_magic */
3314 };
3315 \f
3316 /* Another alternative target vector. This is a PMON system, but with
3317    a different monitor prompt, aswell as some other operational
3318    differences: */
3319 struct target_ops ddb_ops =
3320 {
3321   "ddb",                        /* to_shortname */
3322   "Remote MIPS debugging over serial line",     /* to_longname */
3323   "\
3324 Debug a board using the PMON MIPS remote debugging protocol over a serial\n\
3325 line. The first argument is the device it is connected to or, if it contains\n\
3326 a colon, HOST:PORT to access a board over a network.  The optional second\n\
3327 parameter is the temporary file in the form HOST:FILENAME to be used for\n\
3328 TFTP downloads to the board.  The optional third parameter is the local\n\
3329 of the TFTP temporary file, if it differs from the filename seen by the board",
3330                                 /* to_doc */
3331   ddb_open,                     /* to_open */
3332   mips_close,                   /* to_close */
3333   NULL,                         /* to_attach */
3334   mips_detach,                  /* to_detach */
3335   mips_resume,                  /* to_resume */
3336   pmon_wait,                    /* to_wait */
3337   mips_fetch_registers,         /* to_fetch_registers */
3338   mips_store_registers,         /* to_store_registers */
3339   mips_prepare_to_store,        /* to_prepare_to_store */
3340   mips_xfer_memory,             /* to_xfer_memory */
3341   mips_files_info,              /* to_files_info */
3342   mips_insert_breakpoint,       /* to_insert_breakpoint */
3343   mips_remove_breakpoint,       /* to_remove_breakpoint */
3344   NULL,                         /* to_terminal_init */
3345   NULL,                         /* to_terminal_inferior */
3346   NULL,                         /* to_terminal_ours_for_output */
3347   NULL,                         /* to_terminal_ours */
3348   NULL,                         /* to_terminal_info */
3349   mips_kill,                    /* to_kill */
3350   mips_load,                    /* to_load */
3351   NULL,                         /* to_lookup_symbol */
3352   mips_create_inferior,         /* to_create_inferior */
3353   mips_mourn_inferior,          /* to_mourn_inferior */
3354   NULL,                         /* to_can_run */
3355   NULL,                         /* to_notice_signals */
3356   0,                            /* to_thread_alive */
3357   0,                            /* to_stop */
3358   process_stratum,              /* to_stratum */
3359   NULL,                         /* to_next */
3360   1,                            /* to_has_all_memory */
3361   1,                            /* to_has_memory */
3362   1,                            /* to_has_stack */
3363   1,                            /* to_has_registers */
3364   1,                            /* to_has_execution */
3365   NULL,                         /* sections */
3366   NULL,                         /* sections_end */
3367   OPS_MAGIC                     /* to_magic */
3368 };
3369 \f
3370 /* Another alternative target vector for LSI Logic MiniRISC boards.
3371    This is a PMON system, but with some other operational differences.  */
3372 struct target_ops lsi_ops =
3373 {
3374   "lsi",                        /* to_shortname */
3375   "Remote MIPS debugging over serial line",     /* to_longname */
3376   "\
3377 Debug a board using the PMON MIPS remote debugging protocol over a serial\n\
3378 line. The first argument is the device it is connected to or, if it contains\n\
3379 a colon, HOST:PORT to access a board over a network.  The optional second\n\
3380 parameter is the temporary file in the form HOST:FILENAME to be used for\n\
3381 TFTP downloads to the board.  The optional third parameter is the local\n\
3382 of the TFTP temporary file, if it differs from the filename seen by the board",
3383                                 /* to_doc */
3384   lsi_open,                     /* to_open */
3385   mips_close,                   /* to_close */
3386   NULL,                         /* to_attach */
3387   mips_detach,                  /* to_detach */
3388   mips_resume,                  /* to_resume */
3389   pmon_wait,                    /* to_wait */
3390   mips_fetch_registers,         /* to_fetch_registers */
3391   mips_store_registers,         /* to_store_registers */
3392   mips_prepare_to_store,        /* to_prepare_to_store */
3393   mips_xfer_memory,             /* to_xfer_memory */
3394   mips_files_info,              /* to_files_info */
3395   mips_insert_breakpoint,       /* to_insert_breakpoint */
3396   mips_remove_breakpoint,       /* to_remove_breakpoint */
3397   NULL,                         /* to_terminal_init */
3398   NULL,                         /* to_terminal_inferior */
3399   NULL,                         /* to_terminal_ours_for_output */
3400   NULL,                         /* to_terminal_ours */
3401   NULL,                         /* to_terminal_info */
3402   mips_kill,                    /* to_kill */
3403   mips_load,                    /* to_load */
3404   NULL,                         /* to_lookup_symbol */
3405   mips_create_inferior,         /* to_create_inferior */
3406   mips_mourn_inferior,          /* to_mourn_inferior */
3407   NULL,                         /* to_can_run */
3408   NULL,                         /* to_notice_signals */
3409   0,                            /* to_thread_alive */
3410   0,                            /* to_stop */
3411   process_stratum,              /* to_stratum */
3412   NULL,                         /* to_next */
3413   1,                            /* to_has_all_memory */
3414   1,                            /* to_has_memory */
3415   1,                            /* to_has_stack */
3416   1,                            /* to_has_registers */
3417   1,                            /* to_has_execution */
3418   NULL,                         /* sections */
3419   NULL,                         /* sections_end */
3420   OPS_MAGIC                     /* to_magic */
3421 };
3422 \f
3423 void
3424 _initialize_remote_mips ()
3425 {
3426   add_target (&mips_ops);
3427   add_target (&pmon_ops);
3428   add_target (&ddb_ops);
3429   add_target (&lsi_ops);
3430
3431   add_show_from_set (
3432     add_set_cmd ("timeout", no_class, var_zinteger,
3433                  (char *) &mips_receive_wait,
3434                  "Set timeout in seconds for remote MIPS serial I/O.",
3435                  &setlist),
3436         &showlist);
3437
3438   add_show_from_set (
3439     add_set_cmd ("retransmit-timeout", no_class, var_zinteger,
3440                  (char *) &mips_retransmit_wait,
3441          "Set retransmit timeout in seconds for remote MIPS serial I/O.\n\
3442 This is the number of seconds to wait for an acknowledgement to a packet\n\
3443 before resending the packet.", &setlist),
3444         &showlist);
3445
3446   add_show_from_set (
3447     add_set_cmd ("syn-garbage-limit", no_class, var_zinteger,
3448                  (char *) &mips_syn_garbage,
3449 "Set the maximum number of characters to ignore when scanning for a SYN.\n\
3450 This is the maximum number of characters GDB will ignore when trying to\n\
3451 synchronize with the remote system.  A value of -1 means that there is no limit\n\
3452 (Note that these characters are printed out even though they are ignored.)",
3453                  &setlist),
3454                      &showlist);
3455
3456   add_show_from_set
3457     (add_set_cmd ("monitor-prompt", class_obscure, var_string,
3458                   (char *) &mips_monitor_prompt,
3459                   "Set the prompt that GDB expects from the monitor.",
3460                   &setlist),
3461      &showlist);
3462 }