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