Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/gdb/remote-mips.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (hide annotations) (download) (as text)
Mon Jul 27 20:34:36 2009 UTC (14 years, 10 months ago) by monamour
File MIME type: text/x-csrc
File size: 101335 byte(s)
Update to HEAD.
1 monabuilder 7 /* Remote debugging interface for MIPS remote debugging protocol.
2    
3     Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
4 monamour 21 2003, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
5 monabuilder 7
6     Contributed by Cygnus Support. Written by Ian Lance Taylor
7     <ian@cygnus.com>.
8    
9     This file is part of GDB.
10    
11     This program is free software; you can redistribute it and/or modify
12     it under the terms of the GNU General Public License as published by
13     the Free Software Foundation; either version 3 of the License, or
14     (at your option) any later version.
15    
16     This program is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19     GNU General Public License for more details.
20    
21     You should have received a copy of the GNU General Public License
22     along with this program. If not, see <http://www.gnu.org/licenses/>. */
23    
24     #include "defs.h"
25     #include "inferior.h"
26     #include "bfd.h"
27     #include "symfile.h"
28     #include "gdbcmd.h"
29     #include "gdbcore.h"
30     #include "serial.h"
31     #include "target.h"
32     #include "exceptions.h"
33     #include "gdb_string.h"
34     #include "gdb_stat.h"
35     #include "regcache.h"
36     #include <ctype.h>
37     #include "mips-tdep.h"
38    
39    
40     /* Breakpoint types. Values 0, 1, and 2 must agree with the watch
41     types passed by breakpoint.c to target_insert_watchpoint.
42     Value 3 is our own invention, and is used for ordinary instruction
43     breakpoints. Value 4 is used to mark an unused watchpoint in tables. */
44     enum break_type
45     {
46     BREAK_WRITE, /* 0 */
47     BREAK_READ, /* 1 */
48     BREAK_ACCESS, /* 2 */
49     BREAK_FETCH, /* 3 */
50     BREAK_UNUSED /* 4 */
51     };
52    
53     /* Prototypes for local functions. */
54    
55     static int mips_readchar (int timeout);
56    
57     static int mips_receive_header (unsigned char *hdr, int *pgarbage,
58     int ch, int timeout);
59    
60     static int mips_receive_trailer (unsigned char *trlr, int *pgarbage,
61     int *pch, int timeout);
62    
63     static int mips_cksum (const unsigned char *hdr,
64     const unsigned char *data, int len);
65    
66     static void mips_send_packet (const char *s, int get_ack);
67    
68     static void mips_send_command (const char *cmd, int prompt);
69    
70     static int mips_receive_packet (char *buff, int throw_error, int timeout);
71    
72     static ULONGEST mips_request (int cmd, ULONGEST addr, ULONGEST data,
73     int *perr, int timeout, char *buff);
74    
75     static void mips_initialize (void);
76    
77     static void mips_open (char *name, int from_tty);
78    
79     static void pmon_open (char *name, int from_tty);
80    
81     static void ddb_open (char *name, int from_tty);
82    
83     static void lsi_open (char *name, int from_tty);
84    
85     static void mips_close (int quitting);
86    
87     static void mips_detach (struct target_ops *ops, char *args, int from_tty);
88    
89     static int mips_map_regno (struct gdbarch *, int);
90    
91     static void mips_prepare_to_store (struct regcache *regcache);
92    
93     static unsigned int mips_fetch_word (CORE_ADDR addr);
94    
95     static int mips_store_word (CORE_ADDR addr, unsigned int value,
96 monamour 21 int *old_contents);
97 monabuilder 7
98     static int mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
99     int write,
100     struct mem_attrib *attrib,
101     struct target_ops *target);
102    
103     static void mips_files_info (struct target_ops *ignore);
104    
105 monamour 21 static void mips_mourn_inferior (struct target_ops *ops);
106 monabuilder 7
107     static int pmon_makeb64 (unsigned long v, char *p, int n, int *chksum);
108    
109     static int pmon_zeroset (int recsize, char **buff, int *amount,
110     unsigned int *chksum);
111    
112     static int pmon_checkset (int recsize, char **buff, int *value);
113    
114     static void pmon_make_fastrec (char **outbuf, unsigned char *inbuf,
115     int *inptr, int inamount, int *recsize,
116     unsigned int *csum, unsigned int *zerofill);
117    
118     static int pmon_check_ack (char *mesg);
119    
120     static void pmon_start_download (void);
121    
122     static void pmon_end_download (int final, int bintotal);
123    
124     static void pmon_download (char *buffer, int length);
125    
126     static void pmon_load_fast (char *file);
127    
128     static void mips_load (char *file, int from_tty);
129    
130     static int mips_make_srec (char *buffer, int type, CORE_ADDR memaddr,
131     unsigned char *myaddr, int len);
132    
133     static int mips_set_breakpoint (CORE_ADDR addr, int len, enum break_type type);
134    
135     static int mips_clear_breakpoint (CORE_ADDR addr, int len,
136     enum break_type type);
137    
138     static int mips_common_breakpoint (int set, CORE_ADDR addr, int len,
139     enum break_type type);
140    
141     /* Forward declarations. */
142     extern struct target_ops mips_ops;
143     extern struct target_ops pmon_ops;
144     extern struct target_ops ddb_ops;
145     /* *INDENT-OFF* */
146     /* The MIPS remote debugging interface is built on top of a simple
147     packet protocol. Each packet is organized as follows:
148    
149     SYN The first character is always a SYN (ASCII 026, or ^V). SYN
150     may not appear anywhere else in the packet. Any time a SYN is
151     seen, a new packet should be assumed to have begun.
152    
153     TYPE_LEN
154     This byte contains the upper five bits of the logical length
155     of the data section, plus a single bit indicating whether this
156     is a data packet or an acknowledgement. The documentation
157     indicates that this bit is 1 for a data packet, but the actual
158     board uses 1 for an acknowledgement. The value of the byte is
159     0x40 + (ack ? 0x20 : 0) + (len >> 6)
160     (we always have 0 <= len < 1024). Acknowledgement packets do
161     not carry data, and must have a data length of 0.
162    
163     LEN1 This byte contains the lower six bits of the logical length of
164     the data section. The value is
165     0x40 + (len & 0x3f)
166    
167     SEQ This byte contains the six bit sequence number of the packet.
168     The value is
169     0x40 + seq
170     An acknowlegment packet contains the sequence number of the
171     packet being acknowledged plus 1 modulo 64. Data packets are
172     transmitted in sequence. There may only be one outstanding
173     unacknowledged data packet at a time. The sequence numbers
174     are independent in each direction. If an acknowledgement for
175     the previous packet is received (i.e., an acknowledgement with
176     the sequence number of the packet just sent) the packet just
177     sent should be retransmitted. If no acknowledgement is
178     received within a timeout period, the packet should be
179     retransmitted. This has an unfortunate failure condition on a
180     high-latency line, as a delayed acknowledgement may lead to an
181     endless series of duplicate packets.
182    
183     DATA The actual data bytes follow. The following characters are
184     escaped inline with DLE (ASCII 020, or ^P):
185     SYN (026) DLE S
186     DLE (020) DLE D
187     ^C (003) DLE C
188     ^S (023) DLE s
189     ^Q (021) DLE q
190     The additional DLE characters are not counted in the logical
191     length stored in the TYPE_LEN and LEN1 bytes.
192    
193     CSUM1
194     CSUM2
195     CSUM3
196     These bytes contain an 18 bit checksum of the complete
197     contents of the packet excluding the SEQ byte and the
198     CSUM[123] bytes. The checksum is simply the twos complement
199     addition of all the bytes treated as unsigned characters. The
200     values of the checksum bytes are:
201     CSUM1: 0x40 + ((cksum >> 12) & 0x3f)
202     CSUM2: 0x40 + ((cksum >> 6) & 0x3f)
203     CSUM3: 0x40 + (cksum & 0x3f)
204    
205     It happens that the MIPS remote debugging protocol always
206     communicates with ASCII strings. Because of this, this
207     implementation doesn't bother to handle the DLE quoting mechanism,
208     since it will never be required. */
209     /* *INDENT-ON* */
210    
211    
212     /* The SYN character which starts each packet. */
213     #define SYN '\026'
214    
215     /* The 0x40 used to offset each packet (this value ensures that all of
216     the header and trailer bytes, other than SYN, are printable ASCII
217     characters). */
218     #define HDR_OFFSET 0x40
219    
220     /* The indices of the bytes in the packet header. */
221     #define HDR_INDX_SYN 0
222     #define HDR_INDX_TYPE_LEN 1
223     #define HDR_INDX_LEN1 2
224     #define HDR_INDX_SEQ 3
225     #define HDR_LENGTH 4
226    
227     /* The data/ack bit in the TYPE_LEN header byte. */
228     #define TYPE_LEN_DA_BIT 0x20
229     #define TYPE_LEN_DATA 0
230     #define TYPE_LEN_ACK TYPE_LEN_DA_BIT
231    
232     /* How to compute the header bytes. */
233     #define HDR_SET_SYN(data, len, seq) (SYN)
234     #define HDR_SET_TYPE_LEN(data, len, seq) \
235     (HDR_OFFSET \
236     + ((data) ? TYPE_LEN_DATA : TYPE_LEN_ACK) \
237     + (((len) >> 6) & 0x1f))
238     #define HDR_SET_LEN1(data, len, seq) (HDR_OFFSET + ((len) & 0x3f))
239     #define HDR_SET_SEQ(data, len, seq) (HDR_OFFSET + (seq))
240    
241     /* Check that a header byte is reasonable. */
242     #define HDR_CHECK(ch) (((ch) & HDR_OFFSET) == HDR_OFFSET)
243    
244     /* Get data from the header. These macros evaluate their argument
245     multiple times. */
246     #define HDR_IS_DATA(hdr) \
247     (((hdr)[HDR_INDX_TYPE_LEN] & TYPE_LEN_DA_BIT) == TYPE_LEN_DATA)
248     #define HDR_GET_LEN(hdr) \
249     ((((hdr)[HDR_INDX_TYPE_LEN] & 0x1f) << 6) + (((hdr)[HDR_INDX_LEN1] & 0x3f)))
250     #define HDR_GET_SEQ(hdr) ((unsigned int)(hdr)[HDR_INDX_SEQ] & 0x3f)
251    
252     /* The maximum data length. */
253     #define DATA_MAXLEN 1023
254    
255     /* The trailer offset. */
256     #define TRLR_OFFSET HDR_OFFSET
257    
258     /* The indices of the bytes in the packet trailer. */
259     #define TRLR_INDX_CSUM1 0
260     #define TRLR_INDX_CSUM2 1
261     #define TRLR_INDX_CSUM3 2
262     #define TRLR_LENGTH 3
263    
264     /* How to compute the trailer bytes. */
265     #define TRLR_SET_CSUM1(cksum) (TRLR_OFFSET + (((cksum) >> 12) & 0x3f))
266     #define TRLR_SET_CSUM2(cksum) (TRLR_OFFSET + (((cksum) >> 6) & 0x3f))
267     #define TRLR_SET_CSUM3(cksum) (TRLR_OFFSET + (((cksum) ) & 0x3f))
268    
269     /* Check that a trailer byte is reasonable. */
270     #define TRLR_CHECK(ch) (((ch) & TRLR_OFFSET) == TRLR_OFFSET)
271    
272     /* Get data from the trailer. This evaluates its argument multiple
273     times. */
274     #define TRLR_GET_CKSUM(trlr) \
275     ((((trlr)[TRLR_INDX_CSUM1] & 0x3f) << 12) \
276     + (((trlr)[TRLR_INDX_CSUM2] & 0x3f) << 6) \
277     + ((trlr)[TRLR_INDX_CSUM3] & 0x3f))
278    
279     /* The sequence number modulos. */
280     #define SEQ_MODULOS (64)
281    
282     /* PMON commands to load from the serial port or UDP socket. */
283     #define LOAD_CMD "load -b -s tty0\r"
284     #define LOAD_CMD_UDP "load -b -s udp\r"
285    
286     /* The target vectors for the four different remote MIPS targets.
287     These are initialized with code in _initialize_remote_mips instead
288     of static initializers, to make it easier to extend the target_ops
289     vector later. */
290     struct target_ops mips_ops, pmon_ops, ddb_ops, lsi_ops;
291    
292     enum mips_monitor_type
293     {
294     /* IDT/SIM monitor being used: */
295     MON_IDT,
296     /* PMON monitor being used: */
297     MON_PMON, /* 3.0.83 [COGENT,EB,FP,NET] Algorithmics Ltd. Nov 9 1995 17:19:50 */
298     MON_DDB, /* 2.7.473 [DDBVR4300,EL,FP,NET] Risq Modular Systems, Thu Jun 6 09:28:40 PDT 1996 */
299     MON_LSI, /* 4.3.12 [EB,FP], LSI LOGIC Corp. Tue Feb 25 13:22:14 1997 */
300     /* Last and unused value, for sizing vectors, etc. */
301     MON_LAST
302     };
303     static enum mips_monitor_type mips_monitor = MON_LAST;
304    
305     /* The monitor prompt text. If the user sets the PMON prompt
306     to some new value, the GDB `set monitor-prompt' command must also
307     be used to inform GDB about the expected prompt. Otherwise, GDB
308     will not be able to connect to PMON in mips_initialize().
309     If the `set monitor-prompt' command is not used, the expected
310     default prompt will be set according the target:
311     target prompt
312     ----- -----
313     pmon PMON>
314     ddb NEC010>
315     lsi PMON>
316     */
317     static char *mips_monitor_prompt;
318    
319     /* Set to 1 if the target is open. */
320     static int mips_is_open;
321    
322     /* Currently active target description (if mips_is_open == 1) */
323     static struct target_ops *current_ops;
324    
325     /* Set to 1 while the connection is being initialized. */
326     static int mips_initializing;
327    
328     /* Set to 1 while the connection is being brought down. */
329     static int mips_exiting;
330    
331     /* The next sequence number to send. */
332     static unsigned int mips_send_seq;
333    
334     /* The next sequence number we expect to receive. */
335     static unsigned int mips_receive_seq;
336    
337     /* The time to wait before retransmitting a packet, in seconds. */
338     static int mips_retransmit_wait = 3;
339    
340     /* The number of times to try retransmitting a packet before giving up. */
341     static int mips_send_retries = 10;
342    
343     /* The number of garbage characters to accept when looking for an
344     SYN for the next packet. */
345     static int mips_syn_garbage = 10;
346    
347     /* The time to wait for a packet, in seconds. */
348     static int mips_receive_wait = 5;
349    
350     /* Set if we have sent a packet to the board but have not yet received
351     a reply. */
352     static int mips_need_reply = 0;
353    
354     /* Handle used to access serial I/O stream. */
355     static struct serial *mips_desc;
356    
357     /* UDP handle used to download files to target. */
358     static struct serial *udp_desc;
359     static int udp_in_use;
360    
361     /* TFTP filename used to download files to DDB board, in the form
362     host:filename. */
363     static char *tftp_name; /* host:filename */
364     static char *tftp_localname; /* filename portion of above */
365     static int tftp_in_use;
366     static FILE *tftp_file;
367    
368     /* Counts the number of times the user tried to interrupt the target (usually
369     via ^C. */
370     static int interrupt_count;
371    
372     /* If non-zero, means that the target is running. */
373     static int mips_wait_flag = 0;
374    
375     /* If non-zero, monitor supports breakpoint commands. */
376     static int monitor_supports_breakpoints = 0;
377    
378     /* Data cache header. */
379    
380     #if 0 /* not used (yet?) */
381     static DCACHE *mips_dcache;
382     #endif
383    
384     /* Non-zero means that we've just hit a read or write watchpoint */
385     static int hit_watchpoint;
386    
387     /* Table of breakpoints/watchpoints (used only on LSI PMON target).
388     The table is indexed by a breakpoint number, which is an integer
389     from 0 to 255 returned by the LSI PMON when a breakpoint is set.
390     */
391     #define MAX_LSI_BREAKPOINTS 256
392     struct lsi_breakpoint_info
393     {
394     enum break_type type; /* type of breakpoint */
395     CORE_ADDR addr; /* address of breakpoint */
396     int len; /* length of region being watched */
397     unsigned long value; /* value to watch */
398     }
399     lsi_breakpoints[MAX_LSI_BREAKPOINTS];
400    
401     /* Error/warning codes returned by LSI PMON for breakpoint commands.
402     Warning values may be ORed together; error values may not. */
403     #define W_WARN 0x100 /* This bit is set if the error code is a warning */
404     #define W_MSK 0x101 /* warning: Range feature is supported via mask */
405     #define W_VAL 0x102 /* warning: Value check is not supported in hardware */
406     #define W_QAL 0x104 /* warning: Requested qualifiers are not supported in hardware */
407    
408     #define E_ERR 0x200 /* This bit is set if the error code is an error */
409     #define E_BPT 0x200 /* error: No such breakpoint number */
410     #define E_RGE 0x201 /* error: Range is not supported */
411     #define E_QAL 0x202 /* error: The requested qualifiers can not be used */
412     #define E_OUT 0x203 /* error: Out of hardware resources */
413     #define E_NON 0x204 /* error: Hardware breakpoint not supported */
414    
415     struct lsi_error
416     {
417     int code; /* error code */
418     char *string; /* string associated with this code */
419     };
420    
421     struct lsi_error lsi_warning_table[] =
422     {
423     {W_MSK, "Range feature is supported via mask"},
424     {W_VAL, "Value check is not supported in hardware"},
425     {W_QAL, "Requested qualifiers are not supported in hardware"},
426     {0, NULL}
427     };
428    
429     struct lsi_error lsi_error_table[] =
430     {
431     {E_BPT, "No such breakpoint number"},
432     {E_RGE, "Range is not supported"},
433     {E_QAL, "The requested qualifiers can not be used"},
434     {E_OUT, "Out of hardware resources"},
435     {E_NON, "Hardware breakpoint not supported"},
436     {0, NULL}
437     };
438    
439     /* Set to 1 with the 'set monitor-warnings' command to enable printing
440     of warnings returned by PMON when hardware breakpoints are used. */
441     static int monitor_warnings;
442    
443    
444     static void
445     close_ports (void)
446     {
447     mips_is_open = 0;
448     serial_close (mips_desc);
449    
450     if (udp_in_use)
451     {
452     serial_close (udp_desc);
453     udp_in_use = 0;
454     }
455     tftp_in_use = 0;
456     }
457    
458     /* Handle low-level error that we can't recover from. Note that just
459     error()ing out from target_wait or some such low-level place will cause
460     all hell to break loose--the rest of GDB will tend to get left in an
461     inconsistent state. */
462    
463     static NORETURN void
464     mips_error (char *string,...)
465     {
466     va_list args;
467    
468     va_start (args, string);
469    
470     target_terminal_ours ();
471     wrap_here (""); /* Force out any buffered output */
472     gdb_flush (gdb_stdout);
473     if (error_pre_print)
474     fputs_filtered (error_pre_print, gdb_stderr);
475     vfprintf_filtered (gdb_stderr, string, args);
476     fprintf_filtered (gdb_stderr, "\n");
477     va_end (args);
478     gdb_flush (gdb_stderr);
479    
480     /* Clean up in such a way that mips_close won't try to talk to the
481     board (it almost surely won't work since we weren't able to talk to
482     it). */
483     close_ports ();
484    
485     printf_unfiltered ("Ending remote MIPS debugging.\n");
486     target_mourn_inferior ();
487    
488     deprecated_throw_reason (RETURN_ERROR);
489     }
490    
491     /* putc_readable - print a character, displaying non-printable chars in
492     ^x notation or in hex. */
493    
494     static void
495     fputc_readable (int ch, struct ui_file *file)
496     {
497     if (ch == '\n')
498     fputc_unfiltered ('\n', file);
499     else if (ch == '\r')
500     fprintf_unfiltered (file, "\\r");
501     else if (ch < 0x20) /* ASCII control character */
502     fprintf_unfiltered (file, "^%c", ch + '@');
503     else if (ch >= 0x7f) /* non-ASCII characters (rubout or greater) */
504     fprintf_unfiltered (file, "[%02x]", ch & 0xff);
505     else
506     fputc_unfiltered (ch, file);
507     }
508    
509    
510     /* puts_readable - print a string, displaying non-printable chars in
511     ^x notation or in hex. */
512    
513     static void
514     fputs_readable (const char *string, struct ui_file *file)
515     {
516     int c;
517    
518     while ((c = *string++) != '\0')
519     fputc_readable (c, file);
520     }
521    
522    
523     /* Wait until STRING shows up in mips_desc. Returns 1 if successful, else 0 if
524     timed out. TIMEOUT specifies timeout value in seconds.
525     */
526    
527     static int
528     mips_expect_timeout (const char *string, int timeout)
529     {
530     const char *p = string;
531    
532     if (remote_debug)
533     {
534     fprintf_unfiltered (gdb_stdlog, "Expected \"");
535     fputs_readable (string, gdb_stdlog);
536     fprintf_unfiltered (gdb_stdlog, "\", got \"");
537     }
538    
539     immediate_quit++;
540     while (1)
541     {
542     int c;
543    
544     /* Must use serial_readchar() here cuz mips_readchar would get
545     confused if we were waiting for the mips_monitor_prompt... */
546    
547     c = serial_readchar (mips_desc, timeout);
548    
549     if (c == SERIAL_TIMEOUT)
550     {
551     if (remote_debug)
552     fprintf_unfiltered (gdb_stdlog, "\": FAIL\n");
553     return 0;
554     }
555    
556     if (remote_debug)
557     fputc_readable (c, gdb_stdlog);
558    
559     if (c == *p++)
560     {
561     if (*p == '\0')
562     {
563     immediate_quit--;
564     if (remote_debug)
565     fprintf_unfiltered (gdb_stdlog, "\": OK\n");
566     return 1;
567     }
568     }
569     else
570     {
571     p = string;
572     if (c == *p)
573     p++;
574     }
575     }
576     }
577    
578     /* Wait until STRING shows up in mips_desc. Returns 1 if successful, else 0 if
579     timed out. The timeout value is hard-coded to 2 seconds. Use
580     mips_expect_timeout if a different timeout value is needed.
581     */
582    
583     static int
584     mips_expect (const char *string)
585     {
586     return mips_expect_timeout (string, remote_timeout);
587     }
588    
589     /* Read a character from the remote, aborting on error. Returns
590     SERIAL_TIMEOUT on timeout (since that's what serial_readchar()
591     returns). FIXME: If we see the string mips_monitor_prompt from the
592     board, then we are debugging on the main console port, and we have
593     somehow dropped out of remote debugging mode. In this case, we
594     automatically go back in to remote debugging mode. This is a hack,
595     put in because I can't find any way for a program running on the
596     remote board to terminate without also ending remote debugging
597     mode. I assume users won't have any trouble with this; for one
598     thing, the IDT documentation generally assumes that the remote
599     debugging port is not the console port. This is, however, very
600     convenient for DejaGnu when you only have one connected serial
601     port. */
602    
603     static int
604     mips_readchar (int timeout)
605     {
606     int ch;
607     static int state = 0;
608     int mips_monitor_prompt_len = strlen (mips_monitor_prompt);
609    
610     {
611     int i;
612    
613     i = timeout;
614     if (i == -1 && watchdog > 0)
615     i = watchdog;
616     }
617    
618     if (state == mips_monitor_prompt_len)
619     timeout = 1;
620     ch = serial_readchar (mips_desc, timeout);
621    
622     if (ch == SERIAL_TIMEOUT && timeout == -1) /* Watchdog went off */
623     {
624     target_mourn_inferior ();
625     error ("Watchdog has expired. Target detached.\n");
626     }
627    
628     if (ch == SERIAL_EOF)
629     mips_error ("End of file from remote");
630     if (ch == SERIAL_ERROR)
631     mips_error ("Error reading from remote: %s", safe_strerror (errno));
632     if (remote_debug > 1)
633     {
634     /* Don't use _filtered; we can't deal with a QUIT out of
635     target_wait, and I think this might be called from there. */
636     if (ch != SERIAL_TIMEOUT)
637     fprintf_unfiltered (gdb_stdlog, "Read '%c' %d 0x%x\n", ch, ch, ch);
638     else
639     fprintf_unfiltered (gdb_stdlog, "Timed out in read\n");
640     }
641    
642     /* If we have seen mips_monitor_prompt and we either time out, or
643     we see a @ (which was echoed from a packet we sent), reset the
644     board as described above. The first character in a packet after
645     the SYN (which is not echoed) is always an @ unless the packet is
646     more than 64 characters long, which ours never are. */
647     if ((ch == SERIAL_TIMEOUT || ch == '@')
648     && state == mips_monitor_prompt_len
649     && !mips_initializing
650     && !mips_exiting)
651     {
652     if (remote_debug > 0)
653     /* Don't use _filtered; we can't deal with a QUIT out of
654     target_wait, and I think this might be called from there. */
655     fprintf_unfiltered (gdb_stdlog, "Reinitializing MIPS debugging mode\n");
656    
657     mips_need_reply = 0;
658     mips_initialize ();
659    
660     state = 0;
661    
662     /* At this point, about the only thing we can do is abort the command
663     in progress and get back to command level as quickly as possible. */
664    
665     error ("Remote board reset, debug protocol re-initialized.");
666     }
667    
668     if (ch == mips_monitor_prompt[state])
669     ++state;
670     else
671     state = 0;
672    
673     return ch;
674     }
675    
676     /* Get a packet header, putting the data in the supplied buffer.
677     PGARBAGE is a pointer to the number of garbage characters received
678     so far. CH is the last character received. Returns 0 for success,
679     or -1 for timeout. */
680    
681     static int
682     mips_receive_header (unsigned char *hdr, int *pgarbage, int ch, int timeout)
683     {
684     int i;
685    
686     while (1)
687     {
688     /* Wait for a SYN. mips_syn_garbage is intended to prevent
689     sitting here indefinitely if the board sends us one garbage
690     character per second. ch may already have a value from the
691     last time through the loop. */
692     while (ch != SYN)
693     {
694     ch = mips_readchar (timeout);
695     if (ch == SERIAL_TIMEOUT)
696     return -1;
697     if (ch != SYN)
698     {
699     /* Printing the character here lets the user of gdb see
700     what the program is outputting, if the debugging is
701     being done on the console port. Don't use _filtered:
702     we can't deal with a QUIT out of target_wait and
703     buffered target output confuses the user. */
704     if (!mips_initializing || remote_debug > 0)
705     {
706     if (isprint (ch) || isspace (ch))
707     {
708     fputc_unfiltered (ch, gdb_stdtarg);
709     }
710     else
711     {
712     fputc_readable (ch, gdb_stdtarg);
713     }
714     gdb_flush (gdb_stdtarg);
715     }
716    
717     /* Only count unprintable characters. */
718     if (! (isprint (ch) || isspace (ch)))
719     (*pgarbage) += 1;
720    
721     if (mips_syn_garbage > 0
722     && *pgarbage > mips_syn_garbage)
723     mips_error ("Debug protocol failure: more than %d characters before a sync.",
724     mips_syn_garbage);
725     }
726     }
727    
728     /* Get the packet header following the SYN. */
729     for (i = 1; i < HDR_LENGTH; i++)
730     {
731     ch = mips_readchar (timeout);
732     if (ch == SERIAL_TIMEOUT)
733     return -1;
734     /* Make sure this is a header byte. */
735     if (ch == SYN || !HDR_CHECK (ch))
736     break;
737    
738     hdr[i] = ch;
739     }
740    
741     /* If we got the complete header, we can return. Otherwise we
742     loop around and keep looking for SYN. */
743     if (i >= HDR_LENGTH)
744     return 0;
745     }
746     }
747    
748     /* Get a packet header, putting the data in the supplied buffer.
749     PGARBAGE is a pointer to the number of garbage characters received
750     so far. The last character read is returned in *PCH. Returns 0
751     for success, -1 for timeout, -2 for error. */
752    
753     static int
754     mips_receive_trailer (unsigned char *trlr, int *pgarbage, int *pch, int timeout)
755     {
756     int i;
757     int ch;
758    
759     for (i = 0; i < TRLR_LENGTH; i++)
760     {
761     ch = mips_readchar (timeout);
762     *pch = ch;
763     if (ch == SERIAL_TIMEOUT)
764     return -1;
765     if (!TRLR_CHECK (ch))
766     return -2;
767     trlr[i] = ch;
768     }
769     return 0;
770     }
771    
772     /* Get the checksum of a packet. HDR points to the packet header.
773     DATA points to the packet data. LEN is the length of DATA. */
774    
775     static int
776     mips_cksum (const unsigned char *hdr, const unsigned char *data, int len)
777     {
778     const unsigned char *p;
779     int c;
780     int cksum;
781    
782     cksum = 0;
783    
784     /* The initial SYN is not included in the checksum. */
785     c = HDR_LENGTH - 1;
786     p = hdr + 1;
787     while (c-- != 0)
788     cksum += *p++;
789    
790     c = len;
791     p = data;
792     while (c-- != 0)
793     cksum += *p++;
794    
795     return cksum;
796     }
797    
798     /* Send a packet containing the given ASCII string. */
799    
800     static void
801     mips_send_packet (const char *s, int get_ack)
802     {
803     /* unsigned */ int len;
804     unsigned char *packet;
805     int cksum;
806     int try;
807    
808     len = strlen (s);
809     if (len > DATA_MAXLEN)
810     mips_error ("MIPS protocol data packet too long: %s", s);
811    
812     packet = (unsigned char *) alloca (HDR_LENGTH + len + TRLR_LENGTH + 1);
813    
814     packet[HDR_INDX_SYN] = HDR_SET_SYN (1, len, mips_send_seq);
815     packet[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (1, len, mips_send_seq);
816     packet[HDR_INDX_LEN1] = HDR_SET_LEN1 (1, len, mips_send_seq);
817     packet[HDR_INDX_SEQ] = HDR_SET_SEQ (1, len, mips_send_seq);
818    
819     memcpy (packet + HDR_LENGTH, s, len);
820    
821     cksum = mips_cksum (packet, packet + HDR_LENGTH, len);
822     packet[HDR_LENGTH + len + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
823     packet[HDR_LENGTH + len + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
824     packet[HDR_LENGTH + len + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
825    
826     /* Increment the sequence number. This will set mips_send_seq to
827     the sequence number we expect in the acknowledgement. */
828     mips_send_seq = (mips_send_seq + 1) % SEQ_MODULOS;
829    
830     /* We can only have one outstanding data packet, so we just wait for
831     the acknowledgement here. Keep retransmitting the packet until
832     we get one, or until we've tried too many times. */
833     for (try = 0; try < mips_send_retries; try++)
834     {
835     int garbage;
836     int ch;
837    
838     if (remote_debug > 0)
839     {
840     /* Don't use _filtered; we can't deal with a QUIT out of
841     target_wait, and I think this might be called from there. */
842     packet[HDR_LENGTH + len + TRLR_LENGTH] = '\0';
843     fprintf_unfiltered (gdb_stdlog, "Writing \"%s\"\n", packet + 1);
844     }
845    
846     if (serial_write (mips_desc, packet,
847     HDR_LENGTH + len + TRLR_LENGTH) != 0)
848     mips_error ("write to target failed: %s", safe_strerror (errno));
849    
850     if (!get_ack)
851     return;
852    
853     garbage = 0;
854     ch = 0;
855     while (1)
856     {
857     unsigned char hdr[HDR_LENGTH + 1];
858     unsigned char trlr[TRLR_LENGTH + 1];
859     int err;
860     unsigned int seq;
861    
862     /* Get the packet header. If we time out, resend the data
863     packet. */
864     err = mips_receive_header (hdr, &garbage, ch, mips_retransmit_wait);
865     if (err != 0)
866     break;
867    
868     ch = 0;
869    
870     /* If we get a data packet, assume it is a duplicate and
871     ignore it. FIXME: If the acknowledgement is lost, this
872     data packet may be the packet the remote sends after the
873     acknowledgement. */
874     if (HDR_IS_DATA (hdr))
875     {
876     int i;
877    
878     /* Ignore any errors raised whilst attempting to ignore
879     packet. */
880    
881     len = HDR_GET_LEN (hdr);
882    
883     for (i = 0; i < len; i++)
884     {
885     int rch;
886    
887     rch = mips_readchar (remote_timeout);
888     if (rch == SYN)
889     {
890     ch = SYN;
891     break;
892     }
893     if (rch == SERIAL_TIMEOUT)
894     break;
895     /* ignore the character */
896     }
897    
898     if (i == len)
899     (void) mips_receive_trailer (trlr, &garbage, &ch,
900     remote_timeout);
901    
902     /* We don't bother checking the checksum, or providing an
903     ACK to the packet. */
904     continue;
905     }
906    
907     /* If the length is not 0, this is a garbled packet. */
908     if (HDR_GET_LEN (hdr) != 0)
909     continue;
910    
911     /* Get the packet trailer. */
912     err = mips_receive_trailer (trlr, &garbage, &ch,
913     mips_retransmit_wait);
914    
915     /* If we timed out, resend the data packet. */
916     if (err == -1)
917     break;
918    
919     /* If we got a bad character, reread the header. */
920     if (err != 0)
921     continue;
922    
923     /* If the checksum does not match the trailer checksum, this
924     is a bad packet; ignore it. */
925     if (mips_cksum (hdr, (unsigned char *) NULL, 0)
926     != TRLR_GET_CKSUM (trlr))
927     continue;
928    
929     if (remote_debug > 0)
930     {
931     hdr[HDR_LENGTH] = '\0';
932     trlr[TRLR_LENGTH] = '\0';
933     /* Don't use _filtered; we can't deal with a QUIT out of
934     target_wait, and I think this might be called from there. */
935     fprintf_unfiltered (gdb_stdlog, "Got ack %d \"%s%s\"\n",
936     HDR_GET_SEQ (hdr), hdr + 1, trlr);
937     }
938    
939     /* If this ack is for the current packet, we're done. */
940     seq = HDR_GET_SEQ (hdr);
941     if (seq == mips_send_seq)
942     return;
943    
944     /* If this ack is for the last packet, resend the current
945     packet. */
946     if ((seq + 1) % SEQ_MODULOS == mips_send_seq)
947     break;
948    
949     /* Otherwise this is a bad ack; ignore it. Increment the
950     garbage count to ensure that we do not stay in this loop
951     forever. */
952     ++garbage;
953     }
954     }
955    
956     mips_error ("Remote did not acknowledge packet");
957     }
958    
959     /* Receive and acknowledge a packet, returning the data in BUFF (which
960     should be DATA_MAXLEN + 1 bytes). The protocol documentation
961     implies that only the sender retransmits packets, so this code just
962     waits silently for a packet. It returns the length of the received
963     packet. If THROW_ERROR is nonzero, call error() on errors. If not,
964     don't print an error message and return -1. */
965    
966     static int
967     mips_receive_packet (char *buff, int throw_error, int timeout)
968     {
969     int ch;
970     int garbage;
971     int len;
972     unsigned char ack[HDR_LENGTH + TRLR_LENGTH + 1];
973     int cksum;
974    
975     ch = 0;
976     garbage = 0;
977     while (1)
978     {
979     unsigned char hdr[HDR_LENGTH];
980     unsigned char trlr[TRLR_LENGTH];
981     int i;
982     int err;
983    
984     if (mips_receive_header (hdr, &garbage, ch, timeout) != 0)
985     {
986     if (throw_error)
987     mips_error ("Timed out waiting for remote packet");
988     else
989     return -1;
990     }
991    
992     ch = 0;
993    
994     /* An acknowledgement is probably a duplicate; ignore it. */
995     if (!HDR_IS_DATA (hdr))
996     {
997     len = HDR_GET_LEN (hdr);
998     /* Check if the length is valid for an ACK, we may aswell
999     try and read the remainder of the packet: */
1000     if (len == 0)
1001     {
1002     /* Ignore the error condition, since we are going to
1003     ignore the packet anyway. */
1004     (void) mips_receive_trailer (trlr, &garbage, &ch, timeout);
1005     }
1006     /* Don't use _filtered; we can't deal with a QUIT out of
1007     target_wait, and I think this might be called from there. */
1008     if (remote_debug > 0)
1009     fprintf_unfiltered (gdb_stdlog, "Ignoring unexpected ACK\n");
1010     continue;
1011     }
1012    
1013     len = HDR_GET_LEN (hdr);
1014     for (i = 0; i < len; i++)
1015     {
1016     int rch;
1017    
1018     rch = mips_readchar (timeout);
1019     if (rch == SYN)
1020     {
1021     ch = SYN;
1022     break;
1023     }
1024     if (rch == SERIAL_TIMEOUT)
1025     {
1026     if (throw_error)
1027     mips_error ("Timed out waiting for remote packet");
1028     else
1029     return -1;
1030     }
1031     buff[i] = rch;
1032     }
1033    
1034     if (i < len)
1035     {
1036     /* Don't use _filtered; we can't deal with a QUIT out of
1037     target_wait, and I think this might be called from there. */
1038     if (remote_debug > 0)
1039     fprintf_unfiltered (gdb_stdlog,
1040     "Got new SYN after %d chars (wanted %d)\n",
1041     i, len);
1042     continue;
1043     }
1044    
1045     err = mips_receive_trailer (trlr, &garbage, &ch, timeout);
1046     if (err == -1)
1047     {
1048     if (throw_error)
1049     mips_error ("Timed out waiting for packet");
1050     else
1051     return -1;
1052     }
1053     if (err == -2)
1054     {
1055     /* Don't use _filtered; we can't deal with a QUIT out of
1056     target_wait, and I think this might be called from there. */
1057     if (remote_debug > 0)
1058     fprintf_unfiltered (gdb_stdlog, "Got SYN when wanted trailer\n");
1059     continue;
1060     }
1061    
1062     /* If this is the wrong sequence number, ignore it. */
1063     if (HDR_GET_SEQ (hdr) != mips_receive_seq)
1064     {
1065     /* Don't use _filtered; we can't deal with a QUIT out of
1066     target_wait, and I think this might be called from there. */
1067     if (remote_debug > 0)
1068     fprintf_unfiltered (gdb_stdlog,
1069     "Ignoring sequence number %d (want %d)\n",
1070     HDR_GET_SEQ (hdr), mips_receive_seq);
1071     continue;
1072     }
1073    
1074     if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr))
1075     break;
1076    
1077     if (remote_debug > 0)
1078     /* Don't use _filtered; we can't deal with a QUIT out of
1079     target_wait, and I think this might be called from there. */
1080     printf_unfiltered ("Bad checksum; data %d, trailer %d\n",
1081     mips_cksum (hdr, buff, len),
1082     TRLR_GET_CKSUM (trlr));
1083    
1084     /* The checksum failed. Send an acknowledgement for the
1085     previous packet to tell the remote to resend the packet. */
1086     ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
1087     ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
1088     ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
1089     ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
1090    
1091     cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
1092    
1093     ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
1094     ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
1095     ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
1096    
1097     if (remote_debug > 0)
1098     {
1099     ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
1100     /* Don't use _filtered; we can't deal with a QUIT out of
1101     target_wait, and I think this might be called from there. */
1102     printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
1103     ack + 1);
1104     }
1105    
1106     if (serial_write (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
1107     {
1108     if (throw_error)
1109     mips_error ("write to target failed: %s", safe_strerror (errno));
1110     else
1111     return -1;
1112     }
1113     }
1114    
1115     if (remote_debug > 0)
1116     {
1117     buff[len] = '\0';
1118     /* Don't use _filtered; we can't deal with a QUIT out of
1119     target_wait, and I think this might be called from there. */
1120     printf_unfiltered ("Got packet \"%s\"\n", buff);
1121     }
1122    
1123     /* We got the packet. Send an acknowledgement. */
1124     mips_receive_seq = (mips_receive_seq + 1) % SEQ_MODULOS;
1125    
1126     ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
1127     ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
1128     ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
1129     ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
1130    
1131     cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
1132    
1133     ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
1134     ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
1135     ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
1136    
1137     if (remote_debug > 0)
1138     {
1139     ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
1140     /* Don't use _filtered; we can't deal with a QUIT out of
1141     target_wait, and I think this might be called from there. */
1142     printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
1143     ack + 1);
1144     }
1145    
1146     if (serial_write (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
1147     {
1148     if (throw_error)
1149     mips_error ("write to target failed: %s", safe_strerror (errno));
1150     else
1151     return -1;
1152     }
1153    
1154     return len;
1155     }
1156    
1157     /* Optionally send a request to the remote system and optionally wait
1158     for the reply. This implements the remote debugging protocol,
1159     which is built on top of the packet protocol defined above. Each
1160     request has an ADDR argument and a DATA argument. The following
1161     requests are defined:
1162    
1163     \0 don't send a request; just wait for a reply
1164     i read word from instruction space at ADDR
1165     d read word from data space at ADDR
1166     I write DATA to instruction space at ADDR
1167     D write DATA to data space at ADDR
1168     r read register number ADDR
1169     R set register number ADDR to value DATA
1170     c continue execution (if ADDR != 1, set pc to ADDR)
1171     s single step (if ADDR != 1, set pc to ADDR)
1172    
1173     The read requests return the value requested. The write requests
1174     return the previous value in the changed location. The execution
1175     requests return a UNIX wait value (the approximate signal which
1176     caused execution to stop is in the upper eight bits).
1177    
1178     If PERR is not NULL, this function waits for a reply. If an error
1179     occurs, it sets *PERR to 1 and sets errno according to what the
1180     target board reports. */
1181    
1182     static ULONGEST
1183     mips_request (int cmd,
1184     ULONGEST addr,
1185     ULONGEST data,
1186     int *perr,
1187     int timeout,
1188     char *buff)
1189     {
1190 monamour 21 int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
1191 monabuilder 7 char myBuff[DATA_MAXLEN + 1];
1192     int len;
1193     int rpid;
1194     char rcmd;
1195     int rerrflg;
1196     unsigned long rresponse;
1197    
1198     if (buff == (char *) NULL)
1199     buff = myBuff;
1200    
1201     if (cmd != '\0')
1202     {
1203     if (mips_need_reply)
1204     internal_error (__FILE__, __LINE__,
1205     _("mips_request: Trying to send command before reply"));
1206 monamour 21 sprintf (buff, "0x0 %c 0x%s 0x%s", cmd,
1207     phex_nz (addr, addr_size), phex_nz (data, addr_size));
1208 monabuilder 7 mips_send_packet (buff, 1);
1209     mips_need_reply = 1;
1210     }
1211    
1212     if (perr == (int *) NULL)
1213     return 0;
1214    
1215     if (!mips_need_reply)
1216     internal_error (__FILE__, __LINE__,
1217     _("mips_request: Trying to get reply before command"));
1218    
1219     mips_need_reply = 0;
1220    
1221     len = mips_receive_packet (buff, 1, timeout);
1222     buff[len] = '\0';
1223    
1224     if (sscanf (buff, "0x%x %c 0x%x 0x%lx",
1225     &rpid, &rcmd, &rerrflg, &rresponse) != 4
1226     || (cmd != '\0' && rcmd != cmd))
1227     mips_error ("Bad response from remote board");
1228    
1229     if (rerrflg != 0)
1230     {
1231     *perr = 1;
1232    
1233     /* FIXME: This will returns MIPS errno numbers, which may or may
1234     not be the same as errno values used on other systems. If
1235     they stick to common errno values, they will be the same, but
1236     if they don't, they must be translated. */
1237     errno = rresponse;
1238    
1239     return 0;
1240     }
1241    
1242     *perr = 0;
1243     return rresponse;
1244     }
1245    
1246     static void
1247     mips_initialize_cleanups (void *arg)
1248     {
1249     mips_initializing = 0;
1250     }
1251    
1252     static void
1253     mips_exit_cleanups (void *arg)
1254     {
1255     mips_exiting = 0;
1256     }
1257    
1258     static void
1259     mips_send_command (const char *cmd, int prompt)
1260     {
1261     serial_write (mips_desc, cmd, strlen (cmd));
1262     mips_expect (cmd);
1263     mips_expect ("\n");
1264     if (prompt)
1265     mips_expect (mips_monitor_prompt);
1266     }
1267    
1268     /* Enter remote (dbx) debug mode: */
1269     static void
1270     mips_enter_debug (void)
1271     {
1272     /* Reset the sequence numbers, ready for the new debug sequence: */
1273     mips_send_seq = 0;
1274     mips_receive_seq = 0;
1275    
1276     if (mips_monitor != MON_IDT)
1277     mips_send_command ("debug\r", 0);
1278     else /* assume IDT monitor by default */
1279     mips_send_command ("db tty0\r", 0);
1280    
1281     sleep (1);
1282     serial_write (mips_desc, "\r", sizeof "\r" - 1);
1283    
1284     /* We don't need to absorb any spurious characters here, since the
1285     mips_receive_header will eat up a reasonable number of characters
1286     whilst looking for the SYN, however this avoids the "garbage"
1287     being displayed to the user. */
1288     if (mips_monitor != MON_IDT)
1289     mips_expect ("\r");
1290    
1291     {
1292     char buff[DATA_MAXLEN + 1];
1293     if (mips_receive_packet (buff, 1, 3) < 0)
1294     mips_error ("Failed to initialize (didn't receive packet).");
1295     }
1296     }
1297    
1298     /* Exit remote (dbx) debug mode, returning to the monitor prompt: */
1299     static int
1300     mips_exit_debug (void)
1301     {
1302     int err;
1303     struct cleanup *old_cleanups = make_cleanup (mips_exit_cleanups, NULL);
1304    
1305     mips_exiting = 1;
1306    
1307     if (mips_monitor != MON_IDT)
1308     {
1309     /* The DDB (NEC) and MiniRISC (LSI) versions of PMON exit immediately,
1310     so we do not get a reply to this command: */
1311     mips_request ('x', 0, 0, NULL, mips_receive_wait, NULL);
1312     mips_need_reply = 0;
1313     if (!mips_expect (" break!"))
1314     return -1;
1315     }
1316     else
1317     mips_request ('x', 0, 0, &err, mips_receive_wait, NULL);
1318    
1319     if (!mips_expect (mips_monitor_prompt))
1320     return -1;
1321    
1322     do_cleanups (old_cleanups);
1323    
1324     return 0;
1325     }
1326    
1327     /* Initialize a new connection to the MIPS board, and make sure we are
1328     really connected. */
1329    
1330     static void
1331     mips_initialize (void)
1332     {
1333     int err;
1334     struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL);
1335     int j;
1336    
1337     /* What is this code doing here? I don't see any way it can happen, and
1338     it might mean mips_initializing didn't get cleared properly.
1339     So I'll make it a warning. */
1340    
1341     if (mips_initializing)
1342     {
1343     warning ("internal error: mips_initialize called twice");
1344     return;
1345     }
1346    
1347     mips_wait_flag = 0;
1348     mips_initializing = 1;
1349    
1350     /* At this point, the packit protocol isn't responding. We'll try getting
1351     into the monitor, and restarting the protocol. */
1352    
1353     /* Force the system into the monitor. After this we *should* be at
1354     the mips_monitor_prompt. */
1355     if (mips_monitor != MON_IDT)
1356     j = 0; /* start by checking if we are already at the prompt */
1357     else
1358     j = 1; /* start by sending a break */
1359     for (; j <= 4; j++)
1360     {
1361     switch (j)
1362     {
1363     case 0: /* First, try sending a CR */
1364     serial_flush_input (mips_desc);
1365     serial_write (mips_desc, "\r", 1);
1366     break;
1367     case 1: /* First, try sending a break */
1368     serial_send_break (mips_desc);
1369     break;
1370     case 2: /* Then, try a ^C */
1371     serial_write (mips_desc, "\003", 1);
1372     break;
1373     case 3: /* Then, try escaping from download */
1374     {
1375     if (mips_monitor != MON_IDT)
1376     {
1377     char tbuff[7];
1378    
1379     /* We shouldn't need to send multiple termination
1380     sequences, since the target performs line (or
1381     block) reads, and then processes those
1382     packets. In-case we were downloading a large packet
1383     we flush the output buffer before inserting a
1384     termination sequence. */
1385     serial_flush_output (mips_desc);
1386     sprintf (tbuff, "\r/E/E\r");
1387     serial_write (mips_desc, tbuff, 6);
1388     }
1389     else
1390     {
1391     char srec[10];
1392     int i;
1393    
1394     /* We are possibly in binary download mode, having
1395     aborted in the middle of an S-record. ^C won't
1396     work because of binary mode. The only reliable way
1397     out is to send enough termination packets (8 bytes)
1398     to fill up and then overflow the largest size
1399     S-record (255 bytes in this case). This amounts to
1400     256/8 + 1 packets.
1401     */
1402    
1403     mips_make_srec (srec, '7', 0, NULL, 0);
1404    
1405     for (i = 1; i <= 33; i++)
1406     {
1407     serial_write (mips_desc, srec, 8);
1408    
1409     if (serial_readchar (mips_desc, 0) >= 0)
1410     break; /* Break immediatly if we get something from
1411     the board. */
1412     }
1413     }
1414     }
1415     break;
1416     case 4:
1417     mips_error ("Failed to initialize.");
1418     }
1419    
1420     if (mips_expect (mips_monitor_prompt))
1421     break;
1422     }
1423    
1424     if (mips_monitor != MON_IDT)
1425     {
1426     /* Sometimes PMON ignores the first few characters in the first
1427     command sent after a load. Sending a blank command gets
1428     around that. */
1429     mips_send_command ("\r", -1);
1430    
1431     /* Ensure the correct target state: */
1432     if (mips_monitor != MON_LSI)
1433     mips_send_command ("set regsize 64\r", -1);
1434     mips_send_command ("set hostport tty0\r", -1);
1435     mips_send_command ("set brkcmd \"\"\r", -1);
1436     /* Delete all the current breakpoints: */
1437     mips_send_command ("db *\r", -1);
1438     /* NOTE: PMON does not have breakpoint support through the
1439     "debug" mode, only at the monitor command-line. */
1440     }
1441    
1442     mips_enter_debug ();
1443    
1444     /* Clear all breakpoints: */
1445     if ((mips_monitor == MON_IDT
1446     && mips_clear_breakpoint (-1, 0, BREAK_UNUSED) == 0)
1447     || mips_monitor == MON_LSI)
1448     monitor_supports_breakpoints = 1;
1449     else
1450     monitor_supports_breakpoints = 0;
1451    
1452     do_cleanups (old_cleanups);
1453    
1454     /* If this doesn't call error, we have connected; we don't care if
1455     the request itself succeeds or fails. */
1456    
1457     mips_request ('r', 0, 0, &err, mips_receive_wait, NULL);
1458     }
1459    
1460     /* Open a connection to the remote board. */
1461     static void
1462     common_open (struct target_ops *ops, char *name, int from_tty,
1463     enum mips_monitor_type new_monitor,
1464     const char *new_monitor_prompt)
1465     {
1466     char *ptype;
1467     char *serial_port_name;
1468     char *remote_name = 0;
1469     char *local_name = 0;
1470     char **argv;
1471    
1472     if (name == 0)
1473     error (
1474     "To open a MIPS remote debugging connection, you need to specify what serial\n\
1475     device is attached to the target board (e.g., /dev/ttya).\n"
1476     "If you want to use TFTP to download to the board, specify the name of a\n"
1477     "temporary file to be used by GDB for downloads as the second argument.\n"
1478     "This filename must be in the form host:filename, where host is the name\n"
1479     "of the host running the TFTP server, and the file must be readable by the\n"
1480     "world. If the local name of the temporary file differs from the name as\n"
1481     "seen from the board via TFTP, specify that name as the third parameter.\n");
1482    
1483     /* Parse the serial port name, the optional TFTP name, and the
1484     optional local TFTP name. */
1485     argv = gdb_buildargv (name);
1486     make_cleanup_freeargv (argv);
1487    
1488     serial_port_name = xstrdup (argv[0]);
1489     if (argv[1]) /* remote TFTP name specified? */
1490     {
1491     remote_name = argv[1];
1492     if (argv[2]) /* local TFTP filename specified? */
1493     local_name = argv[2];
1494     }
1495    
1496     target_preopen (from_tty);
1497    
1498     if (mips_is_open)
1499     unpush_target (current_ops);
1500    
1501     /* Open and initialize the serial port. */
1502     mips_desc = serial_open (serial_port_name);
1503     if (mips_desc == NULL)
1504     perror_with_name (serial_port_name);
1505    
1506     if (baud_rate != -1)
1507     {
1508     if (serial_setbaudrate (mips_desc, baud_rate))
1509     {
1510     serial_close (mips_desc);
1511     perror_with_name (serial_port_name);
1512     }
1513     }
1514    
1515     serial_raw (mips_desc);
1516    
1517     /* Open and initialize the optional download port. If it is in the form
1518     hostname#portnumber, it's a UDP socket. If it is in the form
1519     hostname:filename, assume it's the TFTP filename that must be
1520     passed to the DDB board to tell it where to get the load file. */
1521     if (remote_name)
1522     {
1523     if (strchr (remote_name, '#'))
1524     {
1525     udp_desc = serial_open (remote_name);
1526     if (!udp_desc)
1527     perror_with_name ("Unable to open UDP port");
1528     udp_in_use = 1;
1529     }
1530     else
1531     {
1532     /* Save the remote and local names of the TFTP temp file. If
1533     the user didn't specify a local name, assume it's the same
1534     as the part of the remote name after the "host:". */
1535     if (tftp_name)
1536     xfree (tftp_name);
1537     if (tftp_localname)
1538     xfree (tftp_localname);
1539     if (local_name == NULL)
1540     if ((local_name = strchr (remote_name, ':')) != NULL)
1541     local_name++; /* skip over the colon */
1542     if (local_name == NULL)
1543     local_name = remote_name; /* local name same as remote name */
1544     tftp_name = xstrdup (remote_name);
1545     tftp_localname = xstrdup (local_name);
1546     tftp_in_use = 1;
1547     }
1548     }
1549    
1550     current_ops = ops;
1551     mips_is_open = 1;
1552    
1553     /* Reset the expected monitor prompt if it's never been set before. */
1554     if (mips_monitor_prompt == NULL)
1555     mips_monitor_prompt = xstrdup (new_monitor_prompt);
1556     mips_monitor = new_monitor;
1557    
1558     mips_initialize ();
1559    
1560     if (from_tty)
1561     printf_unfiltered ("Remote MIPS debugging using %s\n", serial_port_name);
1562    
1563     /* Switch to using remote target now. */
1564     push_target (ops);
1565    
1566     /* FIXME: Should we call start_remote here? */
1567    
1568     /* Try to figure out the processor model if possible. */
1569     deprecated_mips_set_processor_regs_hack ();
1570    
1571     /* This is really the job of start_remote however, that makes an
1572     assumption that the target is about to print out a status message
1573     of some sort. That doesn't happen here (in fact, it may not be
1574     possible to get the monitor to send the appropriate packet). */
1575    
1576     reinit_frame_cache ();
1577     registers_changed ();
1578 monamour 21 stop_pc = regcache_read_pc (get_current_regcache ());
1579 monabuilder 7 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
1580     xfree (serial_port_name);
1581     }
1582    
1583     static void
1584     mips_open (char *name, int from_tty)
1585     {
1586     const char *monitor_prompt = NULL;
1587     if (gdbarch_bfd_arch_info (target_gdbarch) != NULL
1588     && gdbarch_bfd_arch_info (target_gdbarch)->arch == bfd_arch_mips)
1589     {
1590     switch (gdbarch_bfd_arch_info (target_gdbarch)->mach)
1591     {
1592     case bfd_mach_mips4100:
1593     case bfd_mach_mips4300:
1594     case bfd_mach_mips4600:
1595     case bfd_mach_mips4650:
1596     case bfd_mach_mips5000:
1597     monitor_prompt = "<RISQ> ";
1598     break;
1599     }
1600     }
1601     if (monitor_prompt == NULL)
1602     monitor_prompt = "<IDT>";
1603     common_open (&mips_ops, name, from_tty, MON_IDT, monitor_prompt);
1604     }
1605    
1606     static void
1607     pmon_open (char *name, int from_tty)
1608     {
1609     common_open (&pmon_ops, name, from_tty, MON_PMON, "PMON> ");
1610     }
1611    
1612     static void
1613     ddb_open (char *name, int from_tty)
1614     {
1615     common_open (&ddb_ops, name, from_tty, MON_DDB, "NEC010>");
1616     }
1617    
1618     static void
1619     lsi_open (char *name, int from_tty)
1620     {
1621     int i;
1622    
1623     /* Clear the LSI breakpoint table. */
1624     for (i = 0; i < MAX_LSI_BREAKPOINTS; i++)
1625     lsi_breakpoints[i].type = BREAK_UNUSED;
1626    
1627     common_open (&lsi_ops, name, from_tty, MON_LSI, "PMON> ");
1628     }
1629    
1630     /* Close a connection to the remote board. */
1631    
1632     static void
1633     mips_close (int quitting)
1634     {
1635     if (mips_is_open)
1636     {
1637     /* Get the board out of remote debugging mode. */
1638     (void) mips_exit_debug ();
1639    
1640     close_ports ();
1641     }
1642     }
1643    
1644     /* Detach from the remote board. */
1645    
1646     static void
1647     mips_detach (struct target_ops *ops, char *args, int from_tty)
1648     {
1649     if (args)
1650     error ("Argument given to \"detach\" when remotely debugging.");
1651    
1652     pop_target ();
1653    
1654     mips_close (1);
1655    
1656     if (from_tty)
1657     printf_unfiltered ("Ending remote MIPS debugging.\n");
1658     }
1659    
1660     /* Tell the target board to resume. This does not wait for a reply
1661     from the board, except in the case of single-stepping on LSI boards,
1662     where PMON does return a reply. */
1663    
1664     static void
1665 monamour 21 mips_resume (struct target_ops *ops,
1666     ptid_t ptid, int step, enum target_signal siggnal)
1667 monabuilder 7 {
1668     int err;
1669    
1670     /* LSI PMON requires returns a reply packet "0x1 s 0x0 0x57f" after
1671     a single step, so we wait for that. */
1672     mips_request (step ? 's' : 'c', 1, siggnal,
1673     mips_monitor == MON_LSI && step ? &err : (int *) NULL,
1674     mips_receive_wait, NULL);
1675     }
1676    
1677     /* Return the signal corresponding to SIG, where SIG is the number which
1678     the MIPS protocol uses for the signal. */
1679     static enum target_signal
1680     mips_signal_from_protocol (int sig)
1681     {
1682     /* We allow a few more signals than the IDT board actually returns, on
1683     the theory that there is at least *some* hope that perhaps the numbering
1684     for these signals is widely agreed upon. */
1685     if (sig <= 0
1686     || sig > 31)
1687     return TARGET_SIGNAL_UNKNOWN;
1688    
1689     /* Don't want to use target_signal_from_host because we are converting
1690     from MIPS signal numbers, not host ones. Our internal numbers
1691     match the MIPS numbers for the signals the board can return, which
1692     are: SIGINT, SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP. */
1693     return (enum target_signal) sig;
1694     }
1695    
1696     /* Wait until the remote stops, and return a wait status. */
1697    
1698     static ptid_t
1699 monamour 21 mips_wait (struct target_ops *ops,
1700     ptid_t ptid, struct target_waitstatus *status, int options)
1701 monabuilder 7 {
1702     int rstatus;
1703     int err;
1704     char buff[DATA_MAXLEN];
1705     int rpc, rfp, rsp;
1706     char flags[20];
1707     int nfields;
1708     int i;
1709    
1710     interrupt_count = 0;
1711     hit_watchpoint = 0;
1712    
1713     /* If we have not sent a single step or continue command, then the
1714     board is waiting for us to do something. Return a status
1715     indicating that it is stopped. */
1716     if (!mips_need_reply)
1717     {
1718     status->kind = TARGET_WAITKIND_STOPPED;
1719     status->value.sig = TARGET_SIGNAL_TRAP;
1720     return inferior_ptid;
1721     }
1722    
1723     /* No timeout; we sit here as long as the program continues to execute. */
1724     mips_wait_flag = 1;
1725     rstatus = mips_request ('\000', 0, 0, &err, -1, buff);
1726     mips_wait_flag = 0;
1727     if (err)
1728     mips_error ("Remote failure: %s", safe_strerror (errno));
1729    
1730     /* On returning from a continue, the PMON monitor seems to start
1731     echoing back the messages we send prior to sending back the
1732     ACK. The code can cope with this, but to try and avoid the
1733     unnecessary serial traffic, and "spurious" characters displayed
1734     to the user, we cheat and reset the debug protocol. The problems
1735     seems to be caused by a check on the number of arguments, and the
1736     command length, within the monitor causing it to echo the command
1737     as a bad packet. */
1738     if (mips_monitor == MON_PMON)
1739     {
1740     mips_exit_debug ();
1741     mips_enter_debug ();
1742     }
1743    
1744     /* See if we got back extended status. If so, pick out the pc, fp, sp, etc... */
1745    
1746     nfields = sscanf (buff, "0x%*x %*c 0x%*x 0x%*x 0x%x 0x%x 0x%x 0x%*x %s",
1747     &rpc, &rfp, &rsp, flags);
1748     if (nfields >= 3)
1749     {
1750     struct regcache *regcache = get_current_regcache ();
1751     struct gdbarch *gdbarch = get_regcache_arch (regcache);
1752 monamour 21 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1753 monabuilder 7 char buf[MAX_REGISTER_SIZE];
1754    
1755 monamour 21 store_unsigned_integer
1756     (buf, register_size (gdbarch, gdbarch_pc_regnum (gdbarch)),
1757     byte_order, rpc);
1758 monabuilder 7 regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch), buf);
1759    
1760     store_unsigned_integer
1761 monamour 21 (buf, register_size (gdbarch, gdbarch_pc_regnum (gdbarch)),
1762     byte_order, rfp);
1763 monabuilder 7 regcache_raw_supply (regcache, 30, buf); /* This register they are avoiding and so it is unnamed */
1764    
1765 monamour 21 store_unsigned_integer
1766     (buf, register_size (gdbarch, gdbarch_sp_regnum (gdbarch)),
1767     byte_order, rsp);
1768 monabuilder 7 regcache_raw_supply (regcache, gdbarch_sp_regnum (gdbarch), buf);
1769    
1770 monamour 21 store_unsigned_integer
1771     (buf, register_size (gdbarch, gdbarch_deprecated_fp_regnum (gdbarch)),
1772     byte_order, 0);
1773 monabuilder 7 regcache_raw_supply (regcache,
1774     gdbarch_deprecated_fp_regnum (gdbarch), buf);
1775    
1776     if (nfields == 9)
1777     {
1778     int i;
1779    
1780     for (i = 0; i <= 2; i++)
1781     if (flags[i] == 'r' || flags[i] == 'w')
1782     hit_watchpoint = 1;
1783     else if (flags[i] == '\000')
1784     break;
1785     }
1786     }
1787    
1788     if (strcmp (target_shortname, "lsi") == 0)
1789     {
1790     #if 0
1791     /* If this is an LSI PMON target, see if we just hit a hardrdware watchpoint.
1792     Right now, PMON doesn't give us enough information to determine which
1793     breakpoint we hit. So we have to look up the PC in our own table
1794     of breakpoints, and if found, assume it's just a normal instruction
1795     fetch breakpoint, not a data watchpoint. FIXME when PMON
1796     provides some way to tell us what type of breakpoint it is. */
1797     int i;
1798 monamour 21 CORE_ADDR pc = regcache_read_pc (get_current_regcache ());
1799 monabuilder 7
1800     hit_watchpoint = 1;
1801     for (i = 0; i < MAX_LSI_BREAKPOINTS; i++)
1802     {
1803     if (lsi_breakpoints[i].addr == pc
1804     && lsi_breakpoints[i].type == BREAK_FETCH)
1805     {
1806     hit_watchpoint = 0;
1807     break;
1808     }
1809     }
1810     #else
1811     /* If a data breakpoint was hit, PMON returns the following packet:
1812     0x1 c 0x0 0x57f 0x1
1813     The return packet from an ordinary breakpoint doesn't have the
1814     extra 0x01 field tacked onto the end. */
1815     if (nfields == 1 && rpc == 1)
1816     hit_watchpoint = 1;
1817     #endif
1818     }
1819    
1820     /* NOTE: The following (sig) numbers are defined by PMON:
1821     SPP_SIGTRAP 5 breakpoint
1822     SPP_SIGINT 2
1823     SPP_SIGSEGV 11
1824     SPP_SIGBUS 10
1825     SPP_SIGILL 4
1826     SPP_SIGFPE 8
1827     SPP_SIGTERM 15 */
1828    
1829     /* Translate a MIPS waitstatus. We use constants here rather than WTERMSIG
1830     and so on, because the constants we want here are determined by the
1831     MIPS protocol and have nothing to do with what host we are running on. */
1832     if ((rstatus & 0xff) == 0)
1833     {
1834     status->kind = TARGET_WAITKIND_EXITED;
1835     status->value.integer = (((rstatus) >> 8) & 0xff);
1836     }
1837     else if ((rstatus & 0xff) == 0x7f)
1838     {
1839     status->kind = TARGET_WAITKIND_STOPPED;
1840     status->value.sig = mips_signal_from_protocol (((rstatus) >> 8) & 0xff);
1841    
1842     /* If the stop PC is in the _exit function, assume
1843     we hit the 'break 0x3ff' instruction in _exit, so this
1844     is not a normal breakpoint. */
1845     if (strcmp (target_shortname, "lsi") == 0)
1846     {
1847     char *func_name;
1848     CORE_ADDR func_start;
1849 monamour 21 CORE_ADDR pc = regcache_read_pc (get_current_regcache ());
1850 monabuilder 7
1851     find_pc_partial_function (pc, &func_name, &func_start, NULL);
1852     if (func_name != NULL && strcmp (func_name, "_exit") == 0
1853     && func_start == pc)
1854     status->kind = TARGET_WAITKIND_EXITED;
1855     }
1856     }
1857     else
1858     {
1859     status->kind = TARGET_WAITKIND_SIGNALLED;
1860     status->value.sig = mips_signal_from_protocol (rstatus & 0x7f);
1861     }
1862    
1863     return inferior_ptid;
1864     }
1865    
1866     /* We have to map between the register numbers used by gdb and the
1867     register numbers used by the debugging protocol. */
1868    
1869     #define REGNO_OFFSET 96
1870    
1871     static int
1872     mips_map_regno (struct gdbarch *gdbarch, int regno)
1873     {
1874     if (regno < 32)
1875     return regno;
1876     if (regno >= mips_regnum (gdbarch)->fp0
1877     && regno < mips_regnum (gdbarch)->fp0 + 32)
1878     return regno - mips_regnum (gdbarch)->fp0 + 32;
1879     else if (regno == mips_regnum (gdbarch)->pc)
1880     return REGNO_OFFSET + 0;
1881     else if (regno == mips_regnum (gdbarch)->cause)
1882     return REGNO_OFFSET + 1;
1883     else if (regno == mips_regnum (gdbarch)->hi)
1884     return REGNO_OFFSET + 2;
1885     else if (regno == mips_regnum (gdbarch)->lo)
1886     return REGNO_OFFSET + 3;
1887     else if (regno == mips_regnum (gdbarch)->fp_control_status)
1888     return REGNO_OFFSET + 4;
1889     else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
1890     return REGNO_OFFSET + 5;
1891     else
1892     /* FIXME: Is there a way to get the status register? */
1893     return 0;
1894     }
1895    
1896     /* Fetch the remote registers. */
1897    
1898     static void
1899 monamour 21 mips_fetch_registers (struct target_ops *ops,
1900     struct regcache *regcache, int regno)
1901 monabuilder 7 {
1902     struct gdbarch *gdbarch = get_regcache_arch (regcache);
1903 monamour 21 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1904 monabuilder 7 unsigned LONGEST val;
1905     int err;
1906    
1907     if (regno == -1)
1908     {
1909     for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
1910 monamour 21 mips_fetch_registers (ops, regcache, regno);
1911 monabuilder 7 return;
1912     }
1913    
1914     if (regno == gdbarch_deprecated_fp_regnum (gdbarch)
1915     || regno == MIPS_ZERO_REGNUM)
1916     /* gdbarch_deprecated_fp_regnum on the mips is a hack which is just
1917     supposed to read zero (see also mips-nat.c). */
1918     val = 0;
1919     else
1920     {
1921     /* If PMON doesn't support this register, don't waste serial
1922     bandwidth trying to read it. */
1923     int pmon_reg = mips_map_regno (gdbarch, regno);
1924     if (regno != 0 && pmon_reg == 0)
1925     val = 0;
1926     else
1927     {
1928     /* Unfortunately the PMON version in the Vr4300 board has been
1929     compiled without the 64bit register access commands. This
1930     means we cannot get hold of the full register width. */
1931     if (mips_monitor == MON_DDB)
1932     val = (unsigned) mips_request ('t', pmon_reg, 0,
1933     &err, mips_receive_wait, NULL);
1934     else
1935     val = mips_request ('r', pmon_reg, 0,
1936     &err, mips_receive_wait, NULL);
1937     if (err)
1938     mips_error ("Can't read register %d: %s", regno,
1939     safe_strerror (errno));
1940     }
1941     }
1942    
1943     {
1944     char buf[MAX_REGISTER_SIZE];
1945    
1946     /* We got the number the register holds, but gdb expects to see a
1947     value in the target byte ordering. */
1948 monamour 21 store_unsigned_integer (buf, register_size (gdbarch, regno),
1949     byte_order, val);
1950 monabuilder 7 regcache_raw_supply (regcache, regno, buf);
1951     }
1952     }
1953    
1954     /* Prepare to store registers. The MIPS protocol can store individual
1955     registers, so this function doesn't have to do anything. */
1956    
1957     static void
1958     mips_prepare_to_store (struct regcache *regcache)
1959     {
1960     }
1961    
1962     /* Store remote register(s). */
1963    
1964     static void
1965 monamour 21 mips_store_registers (struct target_ops *ops,
1966     struct regcache *regcache, int regno)
1967 monabuilder 7 {
1968     struct gdbarch *gdbarch = get_regcache_arch (regcache);
1969     ULONGEST val;
1970     int err;
1971    
1972     if (regno == -1)
1973     {
1974     for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
1975 monamour 21 mips_store_registers (ops, regcache, regno);
1976 monabuilder 7 return;
1977     }
1978    
1979     regcache_cooked_read_unsigned (regcache, regno, &val);
1980     mips_request ('R', mips_map_regno (gdbarch, regno), val,
1981     &err, mips_receive_wait, NULL);
1982     if (err)
1983     mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
1984     }
1985    
1986     /* Fetch a word from the target board. */
1987    
1988     static unsigned int
1989     mips_fetch_word (CORE_ADDR addr)
1990     {
1991     unsigned int val;
1992     int err;
1993    
1994     val = mips_request ('d', addr, 0, &err, mips_receive_wait, NULL);
1995     if (err)
1996     {
1997     /* Data space failed; try instruction space. */
1998     val = mips_request ('i', addr, 0, &err,
1999     mips_receive_wait, NULL);
2000     if (err)
2001 monamour 21 mips_error ("Can't read address %s: %s",
2002     paddress (target_gdbarch, addr), safe_strerror (errno));
2003 monabuilder 7 }
2004     return val;
2005     }
2006    
2007     /* Store a word to the target board. Returns errno code or zero for
2008     success. If OLD_CONTENTS is non-NULL, put the old contents of that
2009     memory location there. */
2010    
2011     /* FIXME! make sure only 32-bit quantities get stored! */
2012     static int
2013 monamour 21 mips_store_word (CORE_ADDR addr, unsigned int val, int *old_contents)
2014 monabuilder 7 {
2015     int err;
2016     unsigned int oldcontents;
2017    
2018     oldcontents = mips_request ('D', addr, val, &err,
2019     mips_receive_wait, NULL);
2020     if (err)
2021     {
2022     /* Data space failed; try instruction space. */
2023     oldcontents = mips_request ('I', addr, val, &err,
2024     mips_receive_wait, NULL);
2025     if (err)
2026     return errno;
2027     }
2028     if (old_contents != NULL)
2029 monamour 21 *old_contents = oldcontents;
2030 monabuilder 7 return 0;
2031     }
2032    
2033     /* Read or write LEN bytes from inferior memory at MEMADDR,
2034     transferring to or from debugger address MYADDR. Write to inferior
2035     if SHOULD_WRITE is nonzero. Returns length of data written or
2036     read; 0 for error. Note that protocol gives us the correct value
2037     for a longword, since it transfers values in ASCII. We want the
2038     byte values, so we have to swap the longword values. */
2039    
2040     static int mask_address_p = 1;
2041    
2042     static int
2043     mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
2044     struct mem_attrib *attrib, struct target_ops *target)
2045     {
2046 monamour 21 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
2047 monabuilder 7 int i;
2048     CORE_ADDR addr;
2049     int count;
2050     char *buffer;
2051     int status;
2052    
2053     /* PMON targets do not cope well with 64 bit addresses. Mask the
2054     value down to 32 bits. */
2055     if (mask_address_p)
2056     memaddr &= (CORE_ADDR) 0xffffffff;
2057    
2058     /* Round starting address down to longword boundary. */
2059     addr = memaddr & ~3;
2060     /* Round ending address up; get number of longwords that makes. */
2061     count = (((memaddr + len) - addr) + 3) / 4;
2062     /* Allocate buffer of that many longwords. */
2063     buffer = alloca (count * 4);
2064    
2065     if (write)
2066     {
2067     /* Fill start and end extra bytes of buffer with existing data. */
2068     if (addr != memaddr || len < 4)
2069     {
2070     /* Need part of initial word -- fetch it. */
2071 monamour 21 store_unsigned_integer (&buffer[0], 4, byte_order,
2072     mips_fetch_word (addr));
2073 monabuilder 7 }
2074    
2075     if (count > 1)
2076     {
2077     /* Need part of last word -- fetch it. FIXME: we do this even
2078     if we don't need it. */
2079 monamour 21 store_unsigned_integer (&buffer[(count - 1) * 4], 4, byte_order,
2080 monabuilder 7 mips_fetch_word (addr + (count - 1) * 4));
2081     }
2082    
2083     /* Copy data to be written over corresponding part of buffer */
2084    
2085     memcpy ((char *) buffer + (memaddr & 3), myaddr, len);
2086    
2087     /* Write the entire buffer. */
2088    
2089     for (i = 0; i < count; i++, addr += 4)
2090     {
2091 monamour 21 int word;
2092     word = extract_unsigned_integer (&buffer[i * 4], 4, byte_order);
2093     status = mips_store_word (addr, word, NULL);
2094 monabuilder 7 /* Report each kilobyte (we download 32-bit words at a time) */
2095     if (i % 256 == 255)
2096     {
2097     printf_unfiltered ("*");
2098     gdb_flush (gdb_stdout);
2099     }
2100     if (status)
2101     {
2102     errno = status;
2103     return 0;
2104     }
2105     /* FIXME: Do we want a QUIT here? */
2106     }
2107     if (count >= 256)
2108     printf_unfiltered ("\n");
2109     }
2110     else
2111     {
2112     /* Read all the longwords */
2113     for (i = 0; i < count; i++, addr += 4)
2114     {
2115 monamour 21 store_unsigned_integer (&buffer[i * 4], 4, byte_order,
2116     mips_fetch_word (addr));
2117 monabuilder 7 QUIT;
2118     }
2119    
2120     /* Copy appropriate bytes out of the buffer. */
2121     memcpy (myaddr, buffer + (memaddr & 3), len);
2122     }
2123     return len;
2124     }
2125    
2126     /* Print info on this target. */
2127    
2128     static void
2129     mips_files_info (struct target_ops *ignore)
2130     {
2131     printf_unfiltered ("Debugging a MIPS board over a serial line.\n");
2132     }
2133    
2134     /* Kill the process running on the board. This will actually only
2135     work if we are doing remote debugging over the console input. I
2136     think that if IDT/sim had the remote debug interrupt enabled on the
2137     right port, we could interrupt the process with a break signal. */
2138    
2139     static void
2140 monamour 21 mips_kill (struct target_ops *ops)
2141 monabuilder 7 {
2142     if (!mips_wait_flag)
2143     return;
2144    
2145     interrupt_count++;
2146    
2147     if (interrupt_count >= 2)
2148     {
2149     interrupt_count = 0;
2150    
2151     target_terminal_ours ();
2152    
2153 monamour 21 if (query (_("Interrupted while waiting for the program.\n\
2154     Give up (and stop debugging it)? ")))
2155 monabuilder 7 {
2156     /* Clean up in such a way that mips_close won't try to talk to the
2157     board (it almost surely won't work since we weren't able to talk to
2158     it). */
2159     mips_wait_flag = 0;
2160     close_ports ();
2161    
2162     printf_unfiltered ("Ending remote MIPS debugging.\n");
2163     target_mourn_inferior ();
2164    
2165     deprecated_throw_reason (RETURN_QUIT);
2166     }
2167    
2168     target_terminal_inferior ();
2169     }
2170    
2171     if (remote_debug > 0)
2172     printf_unfiltered ("Sending break\n");
2173    
2174     serial_send_break (mips_desc);
2175    
2176     #if 0
2177     if (mips_is_open)
2178     {
2179     char cc;
2180    
2181     /* Send a ^C. */
2182     cc = '\003';
2183     serial_write (mips_desc, &cc, 1);
2184     sleep (1);
2185     target_mourn_inferior ();
2186     }
2187     #endif
2188     }
2189    
2190     /* Start running on the target board. */
2191    
2192     static void
2193 monamour 21 mips_create_inferior (struct target_ops *ops, char *execfile,
2194     char *args, char **env, int from_tty)
2195 monabuilder 7 {
2196     CORE_ADDR entry_pt;
2197    
2198     if (args && *args)
2199     {
2200     warning ("\
2201     Can't pass arguments to remote MIPS board; arguments ignored.");
2202     /* And don't try to use them on the next "run" command. */
2203     execute_command ("set args", 0);
2204     }
2205    
2206     if (execfile == 0 || exec_bfd == 0)
2207     error ("No executable file specified");
2208    
2209     entry_pt = (CORE_ADDR) bfd_get_start_address (exec_bfd);
2210    
2211     init_wait_for_inferior ();
2212    
2213     /* FIXME: Should we set inferior_ptid here? */
2214    
2215 monamour 21 regcache_write_pc (get_current_regcache (), entry_pt);
2216 monabuilder 7 }
2217    
2218     /* Clean up after a process. Actually nothing to do. */
2219    
2220     static void
2221 monamour 21 mips_mourn_inferior (struct target_ops *ops)
2222 monabuilder 7 {
2223     if (current_ops != NULL)
2224     unpush_target (current_ops);
2225     generic_mourn_inferior ();
2226     }
2227    
2228     /* We can write a breakpoint and read the shadow contents in one
2229     operation. */
2230    
2231     /* Insert a breakpoint. On targets that don't have built-in
2232     breakpoint support, we read the contents of the target location and
2233     stash it, then overwrite it with a breakpoint instruction. ADDR is
2234     the target location in the target machine. BPT is the breakpoint
2235     being inserted or removed, which contains memory for saving the
2236     target contents. */
2237    
2238     static int
2239 monamour 21 mips_insert_breakpoint (struct gdbarch *gdbarch,
2240     struct bp_target_info *bp_tgt)
2241 monabuilder 7 {
2242     if (monitor_supports_breakpoints)
2243     return mips_set_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE,
2244     BREAK_FETCH);
2245     else
2246 monamour 21 return memory_insert_breakpoint (gdbarch, bp_tgt);
2247 monabuilder 7 }
2248    
2249     static int
2250 monamour 21 mips_remove_breakpoint (struct gdbarch *gdbarch,
2251     struct bp_target_info *bp_tgt)
2252 monabuilder 7 {
2253     if (monitor_supports_breakpoints)
2254     return mips_clear_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE,
2255     BREAK_FETCH);
2256     else
2257 monamour 21 return memory_remove_breakpoint (gdbarch, bp_tgt);
2258 monabuilder 7 }
2259    
2260     /* Tell whether this target can support a hardware breakpoint. CNT
2261     is the number of hardware breakpoints already installed. This
2262 monamour 21 implements the target_can_use_hardware_watchpoint macro. */
2263 monabuilder 7
2264     int
2265     mips_can_use_watchpoint (int type, int cnt, int othertype)
2266     {
2267     return cnt < MAX_LSI_BREAKPOINTS && strcmp (target_shortname, "lsi") == 0;
2268     }
2269    
2270    
2271     /* Compute a don't care mask for the region bounding ADDR and ADDR + LEN - 1.
2272     This is used for memory ref breakpoints. */
2273    
2274     static unsigned long
2275     calculate_mask (CORE_ADDR addr, int len)
2276     {
2277     unsigned long mask;
2278     int i;
2279    
2280     mask = addr ^ (addr + len - 1);
2281    
2282     for (i = 32; i >= 0; i--)
2283     if (mask == 0)
2284     break;
2285     else
2286     mask >>= 1;
2287    
2288     mask = (unsigned long) 0xffffffff >> i;
2289    
2290     return mask;
2291     }
2292    
2293    
2294     /* Set a data watchpoint. ADDR and LEN should be obvious. TYPE is 0
2295     for a write watchpoint, 1 for a read watchpoint, or 2 for a read/write
2296     watchpoint. */
2297    
2298     int
2299     mips_insert_watchpoint (CORE_ADDR addr, int len, int type)
2300     {
2301     if (mips_set_breakpoint (addr, len, type))
2302     return -1;
2303    
2304     return 0;
2305     }
2306    
2307     int
2308     mips_remove_watchpoint (CORE_ADDR addr, int len, int type)
2309     {
2310     if (mips_clear_breakpoint (addr, len, type))
2311     return -1;
2312    
2313     return 0;
2314     }
2315    
2316     int
2317     mips_stopped_by_watchpoint (void)
2318     {
2319     return hit_watchpoint;
2320     }
2321    
2322    
2323     /* Insert a breakpoint. */
2324    
2325     static int
2326     mips_set_breakpoint (CORE_ADDR addr, int len, enum break_type type)
2327     {
2328     return mips_common_breakpoint (1, addr, len, type);
2329     }
2330    
2331    
2332     /* Clear a breakpoint. */
2333    
2334     static int
2335     mips_clear_breakpoint (CORE_ADDR addr, int len, enum break_type type)
2336     {
2337     return mips_common_breakpoint (0, addr, len, type);
2338     }
2339    
2340    
2341     /* Check the error code from the return packet for an LSI breakpoint
2342     command. If there's no error, just return 0. If it's a warning,
2343     print the warning text and return 0. If it's an error, print
2344     the error text and return 1. <ADDR> is the address of the breakpoint
2345     that was being set. <RERRFLG> is the error code returned by PMON.
2346     This is a helper function for mips_common_breakpoint. */
2347    
2348     static int
2349     mips_check_lsi_error (CORE_ADDR addr, int rerrflg)
2350     {
2351     struct lsi_error *err;
2352 monamour 21 char *saddr = paddress (target_gdbarch, addr);
2353 monabuilder 7
2354     if (rerrflg == 0) /* no error */
2355     return 0;
2356    
2357     /* Warnings can be ORed together, so check them all. */
2358     if (rerrflg & W_WARN)
2359     {
2360     if (monitor_warnings)
2361     {
2362     int found = 0;
2363     for (err = lsi_warning_table; err->code != 0; err++)
2364     {
2365     if ((err->code & rerrflg) == err->code)
2366     {
2367     found = 1;
2368     fprintf_unfiltered (gdb_stderr, "\
2369 monamour 21 mips_common_breakpoint (%s): Warning: %s\n",
2370 monabuilder 7 saddr,
2371     err->string);
2372     }
2373     }
2374     if (!found)
2375     fprintf_unfiltered (gdb_stderr, "\
2376 monamour 21 mips_common_breakpoint (%s): Unknown warning: 0x%x\n",
2377 monabuilder 7 saddr,
2378     rerrflg);
2379     }
2380     return 0;
2381     }
2382    
2383     /* Errors are unique, i.e. can't be ORed together. */
2384     for (err = lsi_error_table; err->code != 0; err++)
2385     {
2386     if ((err->code & rerrflg) == err->code)
2387     {
2388     fprintf_unfiltered (gdb_stderr, "\
2389 monamour 21 mips_common_breakpoint (%s): Error: %s\n",
2390 monabuilder 7 saddr,
2391     err->string);
2392     return 1;
2393     }
2394     }
2395     fprintf_unfiltered (gdb_stderr, "\
2396 monamour 21 mips_common_breakpoint (%s): Unknown error: 0x%x\n",
2397 monabuilder 7 saddr,
2398     rerrflg);
2399     return 1;
2400     }
2401    
2402    
2403     /* This routine sends a breakpoint command to the remote target.
2404    
2405     <SET> is 1 if setting a breakpoint, or 0 if clearing a breakpoint.
2406     <ADDR> is the address of the breakpoint.
2407     <LEN> the length of the region to break on.
2408     <TYPE> is the type of breakpoint:
2409     0 = write (BREAK_WRITE)
2410     1 = read (BREAK_READ)
2411     2 = read/write (BREAK_ACCESS)
2412     3 = instruction fetch (BREAK_FETCH)
2413    
2414     Return 0 if successful; otherwise 1. */
2415    
2416     static int
2417     mips_common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type)
2418     {
2419 monamour 21 int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
2420 monabuilder 7 char buf[DATA_MAXLEN + 1];
2421     char cmd, rcmd;
2422     int rpid, rerrflg, rresponse, rlen;
2423     int nfields;
2424    
2425     addr = gdbarch_addr_bits_remove (target_gdbarch, addr);
2426    
2427     if (mips_monitor == MON_LSI)
2428     {
2429     if (set == 0) /* clear breakpoint */
2430     {
2431     /* The LSI PMON "clear breakpoint" has this form:
2432     <pid> 'b' <bptn> 0x0
2433     reply:
2434     <pid> 'b' 0x0 <code>
2435    
2436     <bptn> is a breakpoint number returned by an earlier 'B' command.
2437     Possible return codes: OK, E_BPT. */
2438    
2439     int i;
2440    
2441     /* Search for the breakpoint in the table. */
2442     for (i = 0; i < MAX_LSI_BREAKPOINTS; i++)
2443     if (lsi_breakpoints[i].type == type
2444     && lsi_breakpoints[i].addr == addr
2445     && lsi_breakpoints[i].len == len)
2446     break;
2447    
2448     /* Clear the table entry and tell PMON to clear the breakpoint. */
2449     if (i == MAX_LSI_BREAKPOINTS)
2450     {
2451     warning ("\
2452     mips_common_breakpoint: Attempt to clear bogus breakpoint at %s\n",
2453 monamour 21 paddress (target_gdbarch, addr));
2454 monabuilder 7 return 1;
2455     }
2456    
2457     lsi_breakpoints[i].type = BREAK_UNUSED;
2458     sprintf (buf, "0x0 b 0x%x 0x0", i);
2459     mips_send_packet (buf, 1);
2460    
2461     rlen = mips_receive_packet (buf, 1, mips_receive_wait);
2462     buf[rlen] = '\0';
2463    
2464     nfields = sscanf (buf, "0x%x b 0x0 0x%x", &rpid, &rerrflg);
2465     if (nfields != 2)
2466     mips_error ("\
2467     mips_common_breakpoint: Bad response from remote board: %s",
2468     buf);
2469    
2470     return (mips_check_lsi_error (addr, rerrflg));
2471     }
2472     else
2473     /* set a breakpoint */
2474     {
2475     /* The LSI PMON "set breakpoint" command has this form:
2476     <pid> 'B' <addr> 0x0
2477     reply:
2478     <pid> 'B' <bptn> <code>
2479    
2480     The "set data breakpoint" command has this form:
2481    
2482     <pid> 'A' <addr1> <type> [<addr2> [<value>]]
2483    
2484     where: type= "0x1" = read
2485     "0x2" = write
2486     "0x3" = access (read or write)
2487    
2488     The reply returns two values:
2489     bptn - a breakpoint number, which is a small integer with
2490     possible values of zero through 255.
2491     code - an error return code, a value of zero indicates a
2492     succesful completion, other values indicate various
2493     errors and warnings.
2494    
2495     Possible return codes: OK, W_QAL, E_QAL, E_OUT, E_NON.
2496    
2497     */
2498    
2499     if (type == BREAK_FETCH) /* instruction breakpoint */
2500     {
2501     cmd = 'B';
2502 monamour 21 sprintf (buf, "0x0 B 0x%s 0x0", phex_nz (addr, addr_size));
2503 monabuilder 7 }
2504     else
2505     /* watchpoint */
2506     {
2507     cmd = 'A';
2508 monamour 21 sprintf (buf, "0x0 A 0x%s 0x%x 0x%s",
2509     phex_nz (addr, addr_size),
2510     type == BREAK_READ ? 1 : (type == BREAK_WRITE ? 2 : 3),
2511     phex_nz (addr + len - 1, addr_size));
2512 monabuilder 7 }
2513     mips_send_packet (buf, 1);
2514    
2515     rlen = mips_receive_packet (buf, 1, mips_receive_wait);
2516     buf[rlen] = '\0';
2517    
2518     nfields = sscanf (buf, "0x%x %c 0x%x 0x%x",
2519     &rpid, &rcmd, &rresponse, &rerrflg);
2520     if (nfields != 4 || rcmd != cmd || rresponse > 255)
2521     mips_error ("\
2522     mips_common_breakpoint: Bad response from remote board: %s",
2523     buf);
2524    
2525     if (rerrflg != 0)
2526     if (mips_check_lsi_error (addr, rerrflg))
2527     return 1;
2528    
2529     /* rresponse contains PMON's breakpoint number. Record the
2530     information for this breakpoint so we can clear it later. */
2531     lsi_breakpoints[rresponse].type = type;
2532     lsi_breakpoints[rresponse].addr = addr;
2533     lsi_breakpoints[rresponse].len = len;
2534    
2535     return 0;
2536     }
2537     }
2538     else
2539     {
2540     /* On non-LSI targets, the breakpoint command has this form:
2541     0x0 <CMD> <ADDR> <MASK> <FLAGS>
2542     <MASK> is a don't care mask for addresses.
2543     <FLAGS> is any combination of `r', `w', or `f' for read/write/fetch.
2544     */
2545     unsigned long mask;
2546    
2547     mask = calculate_mask (addr, len);
2548     addr &= ~mask;
2549    
2550     if (set) /* set a breakpoint */
2551     {
2552     char *flags;
2553     switch (type)
2554     {
2555     case BREAK_WRITE: /* write */
2556     flags = "w";
2557     break;
2558     case BREAK_READ: /* read */
2559     flags = "r";
2560     break;
2561     case BREAK_ACCESS: /* read/write */
2562     flags = "rw";
2563     break;
2564     case BREAK_FETCH: /* fetch */
2565     flags = "f";
2566     break;
2567     default:
2568     internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
2569     }
2570    
2571     cmd = 'B';
2572 monamour 21 sprintf (buf, "0x0 B 0x%s 0x%s %s", phex_nz (addr, addr_size),
2573     phex_nz (mask, addr_size), flags);
2574 monabuilder 7 }
2575     else
2576     {
2577     cmd = 'b';
2578 monamour 21 sprintf (buf, "0x0 b 0x%s", phex_nz (addr, addr_size));
2579 monabuilder 7 }
2580    
2581     mips_send_packet (buf, 1);
2582    
2583     rlen = mips_receive_packet (buf, 1, mips_receive_wait);
2584     buf[rlen] = '\0';
2585    
2586     nfields = sscanf (buf, "0x%x %c 0x%x 0x%x",
2587     &rpid, &rcmd, &rerrflg, &rresponse);
2588    
2589     if (nfields != 4 || rcmd != cmd)
2590     mips_error ("\
2591     mips_common_breakpoint: Bad response from remote board: %s",
2592     buf);
2593    
2594     if (rerrflg != 0)
2595     {
2596     /* Ddb returns "0x0 b 0x16 0x0\000", whereas
2597     Cogent returns "0x0 b 0xffffffff 0x16\000": */
2598     if (mips_monitor == MON_DDB)
2599     rresponse = rerrflg;
2600     if (rresponse != 22) /* invalid argument */
2601     fprintf_unfiltered (gdb_stderr, "\
2602 monamour 21 mips_common_breakpoint (%s): Got error: 0x%x\n",
2603     paddress (target_gdbarch, addr), rresponse);
2604 monabuilder 7 return 1;
2605     }
2606     }
2607     return 0;
2608     }
2609    
2610     static void
2611     send_srec (char *srec, int len, CORE_ADDR addr)
2612     {
2613     while (1)
2614     {
2615     int ch;
2616    
2617     serial_write (mips_desc, srec, len);
2618    
2619     ch = mips_readchar (remote_timeout);
2620    
2621     switch (ch)
2622     {
2623     case SERIAL_TIMEOUT:
2624     error ("Timeout during download.");
2625     break;
2626     case 0x6: /* ACK */
2627     return;
2628     case 0x15: /* NACK */
2629 monamour 21 fprintf_unfiltered (gdb_stderr, "Download got a NACK at byte %s! Retrying.\n",
2630     paddress (target_gdbarch, addr));
2631 monabuilder 7 continue;
2632     default:
2633     error ("Download got unexpected ack char: 0x%x, retrying.\n", ch);
2634     }
2635     }
2636     }
2637    
2638     /* Download a binary file by converting it to S records. */
2639    
2640     static void
2641     mips_load_srec (char *args)
2642     {
2643     bfd *abfd;
2644     asection *s;
2645     char *buffer, srec[1024];
2646     unsigned int i;
2647     unsigned int srec_frame = 200;
2648     int reclen;
2649     static int hashmark = 1;
2650    
2651     buffer = alloca (srec_frame * 2 + 256);
2652    
2653     abfd = bfd_openr (args, 0);
2654     if (!abfd)
2655     {
2656     printf_filtered ("Unable to open file %s\n", args);
2657     return;
2658     }
2659    
2660     if (bfd_check_format (abfd, bfd_object) == 0)
2661     {
2662     printf_filtered ("File is not an object file\n");
2663     return;
2664     }
2665    
2666     /* This actually causes a download in the IDT binary format: */
2667     mips_send_command (LOAD_CMD, 0);
2668    
2669     for (s = abfd->sections; s; s = s->next)
2670     {
2671     if (s->flags & SEC_LOAD)
2672     {
2673     unsigned int numbytes;
2674    
2675     /* FIXME! vma too small????? */
2676     printf_filtered ("%s\t: 0x%4lx .. 0x%4lx ", s->name,
2677     (long) s->vma,
2678     (long) (s->vma + bfd_get_section_size (s)));
2679     gdb_flush (gdb_stdout);
2680    
2681     for (i = 0; i < bfd_get_section_size (s); i += numbytes)
2682     {
2683     numbytes = min (srec_frame, bfd_get_section_size (s) - i);
2684    
2685     bfd_get_section_contents (abfd, s, buffer, i, numbytes);
2686    
2687     reclen = mips_make_srec (srec, '3', s->vma + i,
2688     buffer, numbytes);
2689     send_srec (srec, reclen, s->vma + i);
2690    
2691     if (deprecated_ui_load_progress_hook)
2692     deprecated_ui_load_progress_hook (s->name, i);
2693    
2694     if (hashmark)
2695     {
2696     putchar_unfiltered ('#');
2697     gdb_flush (gdb_stdout);
2698     }
2699    
2700     } /* Per-packet (or S-record) loop */
2701    
2702     putchar_unfiltered ('\n');
2703     } /* Loadable sections */
2704     }
2705     if (hashmark)
2706     putchar_unfiltered ('\n');
2707    
2708     /* Write a type 7 terminator record. no data for a type 7, and there
2709     is no data, so len is 0. */
2710    
2711     reclen = mips_make_srec (srec, '7', abfd->start_address, NULL, 0);
2712    
2713     send_srec (srec, reclen, abfd->start_address);
2714    
2715     serial_flush_input (mips_desc);
2716     }
2717    
2718     /*
2719     * mips_make_srec -- make an srecord. This writes each line, one at a
2720     * time, each with it's own header and trailer line.
2721     * An srecord looks like this:
2722     *
2723     * byte count-+ address
2724     * start ---+ | | data +- checksum
2725     * | | | |
2726     * S01000006F6B692D746573742E73726563E4
2727     * S315000448600000000000000000FC00005900000000E9
2728     * S31A0004000023C1400037DE00F023604000377B009020825000348D
2729     * S30B0004485A0000000000004E
2730     * S70500040000F6
2731     *
2732     * S<type><length><address><data><checksum>
2733     *
2734     * Where
2735     * - length
2736     * is the number of bytes following upto the checksum. Note that
2737     * this is not the number of chars following, since it takes two
2738     * chars to represent a byte.
2739     * - type
2740     * is one of:
2741     * 0) header record
2742     * 1) two byte address data record
2743     * 2) three byte address data record
2744     * 3) four byte address data record
2745     * 7) four byte address termination record
2746     * 8) three byte address termination record
2747     * 9) two byte address termination record
2748     *
2749     * - address
2750     * is the start address of the data following, or in the case of
2751     * a termination record, the start address of the image
2752     * - data
2753     * is the data.
2754     * - checksum
2755     * is the sum of all the raw byte data in the record, from the length
2756     * upwards, modulo 256 and subtracted from 255.
2757     *
2758     * This routine returns the length of the S-record.
2759     *
2760     */
2761    
2762     static int
2763     mips_make_srec (char *buf, int type, CORE_ADDR memaddr, unsigned char *myaddr,
2764     int len)
2765     {
2766     unsigned char checksum;
2767     int i;
2768    
2769     /* Create the header for the srec. addr_size is the number of bytes in the address,
2770     and 1 is the number of bytes in the count. */
2771    
2772     /* FIXME!! bigger buf required for 64-bit! */
2773     buf[0] = 'S';
2774     buf[1] = type;
2775     buf[2] = len + 4 + 1; /* len + 4 byte address + 1 byte checksum */
2776     /* This assumes S3 style downloads (4byte addresses). There should
2777     probably be a check, or the code changed to make it more
2778     explicit. */
2779     buf[3] = memaddr >> 24;
2780     buf[4] = memaddr >> 16;
2781     buf[5] = memaddr >> 8;
2782     buf[6] = memaddr;
2783     memcpy (&buf[7], myaddr, len);
2784    
2785     /* Note that the checksum is calculated on the raw data, not the
2786     hexified data. It includes the length, address and the data
2787     portions of the packet. */
2788     checksum = 0;
2789     buf += 2; /* Point at length byte */
2790     for (i = 0; i < len + 4 + 1; i++)
2791     checksum += *buf++;
2792    
2793     *buf = ~checksum;
2794    
2795     return len + 8;
2796     }
2797    
2798     /* The following manifest controls whether we enable the simple flow
2799     control support provided by the monitor. If enabled the code will
2800     wait for an affirmative ACK between transmitting packets. */
2801     #define DOETXACK (1)
2802    
2803     /* The PMON fast-download uses an encoded packet format constructed of
2804     3byte data packets (encoded as 4 printable ASCII characters), and
2805     escape sequences (preceded by a '/'):
2806    
2807     'K' clear checksum
2808     'C' compare checksum (12bit value, not included in checksum calculation)
2809     'S' define symbol name (for addr) terminated with "," and padded to 4char boundary
2810     'Z' zero fill multiple of 3bytes
2811     'B' byte (12bit encoded value, of 8bit data)
2812     'A' address (36bit encoded value)
2813     'E' define entry as original address, and exit load
2814    
2815     The packets are processed in 4 character chunks, so the escape
2816     sequences that do not have any data (or variable length data)
2817     should be padded to a 4 character boundary. The decoder will give
2818     an error if the complete message block size is not a multiple of
2819     4bytes (size of record).
2820    
2821     The encoding of numbers is done in 6bit fields. The 6bit value is
2822     used to index into this string to get the specific character
2823     encoding for the value: */
2824     static char encoding[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,.";
2825    
2826     /* Convert the number of bits required into an encoded number, 6bits
2827     at a time (range 0..63). Keep a checksum if required (passed
2828     pointer non-NULL). The function returns the number of encoded
2829     characters written into the buffer. */
2830     static int
2831     pmon_makeb64 (unsigned long v, char *p, int n, int *chksum)
2832     {
2833     int count = (n / 6);
2834    
2835     if ((n % 12) != 0)
2836     {
2837     fprintf_unfiltered (gdb_stderr,
2838     "Fast encoding bitcount must be a multiple of 12bits: %dbit%s\n", n, (n == 1) ? "" : "s");
2839     return (0);
2840     }
2841     if (n > 36)
2842     {
2843     fprintf_unfiltered (gdb_stderr,
2844     "Fast encoding cannot process more than 36bits at the moment: %dbits\n", n);
2845     return (0);
2846     }
2847    
2848     /* Deal with the checksum: */
2849     if (chksum != NULL)
2850     {
2851