* remote-mips.c (mips_initialize): Updated to talk to VR4300 RISQ
[deliverable/binutils-gdb.git] / gdb / remote-mips.c
1 /* Remote debugging interface for MIPS remote debugging protocol.
2 Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
3 Contributed by Cygnus Support. Written by Ian Lance Taylor
4 <ian@cygnus.com>.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 #include "defs.h"
23 #include "inferior.h"
24 #include "bfd.h"
25 #include "symfile.h"
26 #include "wait.h"
27 #include "gdbcmd.h"
28 #include "gdbcore.h"
29 #include "serial.h"
30 #include "target.h"
31 #include "remote-utils.h"
32
33 #include <signal.h>
34 #ifdef ANSI_PROTOTYPES
35 #include <stdarg.h>
36 #else
37 #include <varargs.h>
38 #endif
39
40 extern char *mips_read_processor_type PARAMS ((void));
41
42 extern void mips_set_processor_type_command PARAMS ((char *, int));
43
44 \f
45 /* Prototypes for local functions. */
46
47 static int mips_readchar PARAMS ((int timeout));
48
49 static int mips_receive_header PARAMS ((unsigned char *hdr, int *pgarbage,
50 int ch, int timeout));
51
52 static int mips_receive_trailer PARAMS ((unsigned char *trlr, int *pgarbage,
53 int *pch, int timeout));
54
55 static int mips_cksum PARAMS ((const unsigned char *hdr,
56 const unsigned char *data,
57 int len));
58
59 static void mips_send_packet PARAMS ((const char *s, int get_ack));
60
61 static int mips_receive_packet PARAMS ((char *buff, int throw_error,
62 int timeout));
63
64 static int mips_request PARAMS ((int cmd, unsigned int addr,
65 unsigned int data, int *perr, int timeout,
66 char *buff));
67
68 static void mips_initialize PARAMS ((void));
69
70 static void mips_open PARAMS ((char *name, int from_tty));
71
72 static void mips_close PARAMS ((int quitting));
73
74 static void mips_detach PARAMS ((char *args, int from_tty));
75
76 static void mips_resume PARAMS ((int pid, int step,
77 enum target_signal siggnal));
78
79 static int mips_wait PARAMS ((int pid, struct target_waitstatus *status));
80
81 static int mips_map_regno PARAMS ((int regno));
82
83 static void mips_fetch_registers PARAMS ((int regno));
84
85 static void mips_prepare_to_store PARAMS ((void));
86
87 static void mips_store_registers PARAMS ((int regno));
88
89 static int mips_fetch_word PARAMS ((CORE_ADDR addr));
90
91 static int mips_store_word PARAMS ((CORE_ADDR addr, int value,
92 char *old_contents));
93
94 static int mips_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len,
95 int write, struct target_ops *ignore));
96
97 static void mips_files_info PARAMS ((struct target_ops *ignore));
98
99 static void mips_create_inferior PARAMS ((char *execfile, char *args,
100 char **env));
101
102 static void mips_mourn_inferior PARAMS ((void));
103
104 static void mips_load PARAMS ((char *file, int from_tty));
105
106 static int mips_make_srec PARAMS ((char *buffer, int type, CORE_ADDR memaddr,
107 unsigned char *myaddr, int len));
108
109 static int common_breakpoint PARAMS ((int cmd, CORE_ADDR addr, CORE_ADDR mask,
110 char *flags));
111 /* A forward declaration. */
112 extern struct target_ops mips_ops;
113 \f
114 /* The MIPS remote debugging interface is built on top of a simple
115 packet protocol. Each packet is organized as follows:
116
117 SYN The first character is always a SYN (ASCII 026, or ^V). SYN
118 may not appear anywhere else in the packet. Any time a SYN is
119 seen, a new packet should be assumed to have begun.
120
121 TYPE_LEN
122 This byte contains the upper five bits of the logical length
123 of the data section, plus a single bit indicating whether this
124 is a data packet or an acknowledgement. The documentation
125 indicates that this bit is 1 for a data packet, but the actual
126 board uses 1 for an acknowledgement. The value of the byte is
127 0x40 + (ack ? 0x20 : 0) + (len >> 6)
128 (we always have 0 <= len < 1024). Acknowledgement packets do
129 not carry data, and must have a data length of 0.
130
131 LEN1 This byte contains the lower six bits of the logical length of
132 the data section. The value is
133 0x40 + (len & 0x3f)
134
135 SEQ This byte contains the six bit sequence number of the packet.
136 The value is
137 0x40 + seq
138 An acknowlegment packet contains the sequence number of the
139 packet being acknowledged plus 1 modulo 64. Data packets are
140 transmitted in sequence. There may only be one outstanding
141 unacknowledged data packet at a time. The sequence numbers
142 are independent in each direction. If an acknowledgement for
143 the previous packet is received (i.e., an acknowledgement with
144 the sequence number of the packet just sent) the packet just
145 sent should be retransmitted. If no acknowledgement is
146 received within a timeout period, the packet should be
147 retransmitted. This has an unfortunate failure condition on a
148 high-latency line, as a delayed acknowledgement may lead to an
149 endless series of duplicate packets.
150
151 DATA The actual data bytes follow. The following characters are
152 escaped inline with DLE (ASCII 020, or ^P):
153 SYN (026) DLE S
154 DLE (020) DLE D
155 ^C (003) DLE C
156 ^S (023) DLE s
157 ^Q (021) DLE q
158 The additional DLE characters are not counted in the logical
159 length stored in the TYPE_LEN and LEN1 bytes.
160
161 CSUM1
162 CSUM2
163 CSUM3
164 These bytes contain an 18 bit checksum of the complete
165 contents of the packet excluding the SEQ byte and the
166 CSUM[123] bytes. The checksum is simply the twos complement
167 addition of all the bytes treated as unsigned characters. The
168 values of the checksum bytes are:
169 CSUM1: 0x40 + ((cksum >> 12) & 0x3f)
170 CSUM2: 0x40 + ((cksum >> 6) & 0x3f)
171 CSUM3: 0x40 + (cksum & 0x3f)
172
173 It happens that the MIPS remote debugging protocol always
174 communicates with ASCII strings. Because of this, this
175 implementation doesn't bother to handle the DLE quoting mechanism,
176 since it will never be required. */
177
178 /* The SYN character which starts each packet. */
179 #define SYN '\026'
180
181 /* The 0x40 used to offset each packet (this value ensures that all of
182 the header and trailer bytes, other than SYN, are printable ASCII
183 characters). */
184 #define HDR_OFFSET 0x40
185
186 /* The indices of the bytes in the packet header. */
187 #define HDR_INDX_SYN 0
188 #define HDR_INDX_TYPE_LEN 1
189 #define HDR_INDX_LEN1 2
190 #define HDR_INDX_SEQ 3
191 #define HDR_LENGTH 4
192
193 /* The data/ack bit in the TYPE_LEN header byte. */
194 #define TYPE_LEN_DA_BIT 0x20
195 #define TYPE_LEN_DATA 0
196 #define TYPE_LEN_ACK TYPE_LEN_DA_BIT
197
198 /* How to compute the header bytes. */
199 #define HDR_SET_SYN(data, len, seq) (SYN)
200 #define HDR_SET_TYPE_LEN(data, len, seq) \
201 (HDR_OFFSET \
202 + ((data) ? TYPE_LEN_DATA : TYPE_LEN_ACK) \
203 + (((len) >> 6) & 0x1f))
204 #define HDR_SET_LEN1(data, len, seq) (HDR_OFFSET + ((len) & 0x3f))
205 #define HDR_SET_SEQ(data, len, seq) (HDR_OFFSET + (seq))
206
207 /* Check that a header byte is reasonable. */
208 #define HDR_CHECK(ch) (((ch) & HDR_OFFSET) == HDR_OFFSET)
209
210 /* Get data from the header. These macros evaluate their argument
211 multiple times. */
212 #define HDR_IS_DATA(hdr) \
213 (((hdr)[HDR_INDX_TYPE_LEN] & TYPE_LEN_DA_BIT) == TYPE_LEN_DATA)
214 #define HDR_GET_LEN(hdr) \
215 ((((hdr)[HDR_INDX_TYPE_LEN] & 0x1f) << 6) + (((hdr)[HDR_INDX_LEN1] & 0x3f)))
216 #define HDR_GET_SEQ(hdr) ((hdr)[HDR_INDX_SEQ] & 0x3f)
217
218 /* The maximum data length. */
219 #define DATA_MAXLEN 1023
220
221 /* The trailer offset. */
222 #define TRLR_OFFSET HDR_OFFSET
223
224 /* The indices of the bytes in the packet trailer. */
225 #define TRLR_INDX_CSUM1 0
226 #define TRLR_INDX_CSUM2 1
227 #define TRLR_INDX_CSUM3 2
228 #define TRLR_LENGTH 3
229
230 /* How to compute the trailer bytes. */
231 #define TRLR_SET_CSUM1(cksum) (TRLR_OFFSET + (((cksum) >> 12) & 0x3f))
232 #define TRLR_SET_CSUM2(cksum) (TRLR_OFFSET + (((cksum) >> 6) & 0x3f))
233 #define TRLR_SET_CSUM3(cksum) (TRLR_OFFSET + (((cksum) ) & 0x3f))
234
235 /* Check that a trailer byte is reasonable. */
236 #define TRLR_CHECK(ch) (((ch) & TRLR_OFFSET) == TRLR_OFFSET)
237
238 /* Get data from the trailer. This evaluates its argument multiple
239 times. */
240 #define TRLR_GET_CKSUM(trlr) \
241 ((((trlr)[TRLR_INDX_CSUM1] & 0x3f) << 12) \
242 + (((trlr)[TRLR_INDX_CSUM2] & 0x3f) << 6) \
243 + ((trlr)[TRLR_INDX_CSUM3] & 0x3f))
244
245 /* The sequence number modulos. */
246 #define SEQ_MODULOS (64)
247
248 /* Set to 1 if the target is open. */
249 static int mips_is_open;
250
251 /* Set to 1 while the connection is being initialized. */
252 static int mips_initializing;
253
254 /* The next sequence number to send. */
255 static int mips_send_seq;
256
257 /* The next sequence number we expect to receive. */
258 static int mips_receive_seq;
259
260 /* The time to wait before retransmitting a packet, in seconds. */
261 static int mips_retransmit_wait = 3;
262
263 /* The number of times to try retransmitting a packet before giving up. */
264 static int mips_send_retries = 10;
265
266 /* The number of garbage characters to accept when looking for an
267 SYN for the next packet. */
268 static int mips_syn_garbage = 1050;
269
270 /* The time to wait for a packet, in seconds. */
271 static int mips_receive_wait = 5;
272
273 /* Set if we have sent a packet to the board but have not yet received
274 a reply. */
275 static int mips_need_reply = 0;
276
277 /* Handle used to access serial I/O stream. */
278 static serial_t mips_desc;
279
280 /* Counts the number of times the user tried to interrupt the target (usually
281 via ^C. */
282 static int interrupt_count;
283
284 /* If non-zero, means that the target is running. */
285 static int mips_wait_flag = 0;
286
287 /* If non-zero, monitor supports breakpoint commands. */
288 static monitor_supports_breakpoints = 0;
289
290 /* Data cache header. */
291
292 static DCACHE *mips_dcache;
293
294 /* Non-zero means that we've just hit a read or write watchpoint */
295 static int hit_watchpoint;
296
297 /* Handle low-level error that we can't recover from. Note that just
298 error()ing out from target_wait or some such low-level place will cause
299 all hell to break loose--the rest of GDB will tend to get left in an
300 inconsistent state. */
301
302 static NORETURN void
303 #ifdef ANSI_PROTOTYPES
304 mips_error (char *string, ...)
305 #else
306 mips_error (va_alist)
307 va_dcl
308 #endif
309 {
310 va_list args;
311
312 #ifdef ANSI_PROTOTYPES
313 va_start (args, string);
314 #else
315 char *string;
316 va_start (args);
317 string = va_arg (args, char *);
318 #endif
319
320 target_terminal_ours ();
321 wrap_here(""); /* Force out any buffered output */
322 gdb_flush (gdb_stdout);
323 if (error_pre_print)
324 fprintf_filtered (gdb_stderr, error_pre_print);
325 vfprintf_filtered (gdb_stderr, string, args);
326 fprintf_filtered (gdb_stderr, "\n");
327 va_end (args);
328 gdb_flush (gdb_stderr);
329
330 /* Clean up in such a way that mips_close won't try to talk to the
331 board (it almost surely won't work since we weren't able to talk to
332 it). */
333 mips_is_open = 0;
334 SERIAL_CLOSE (mips_desc);
335
336 printf_unfiltered ("Ending remote MIPS debugging.\n");
337 target_mourn_inferior ();
338
339 return_to_top_level (RETURN_ERROR);
340 }
341
342 /* Wait until STRING shows up in mips_desc. Returns 1 if successful, else 0 if
343 timed out. */
344
345 int
346 mips_expect (string)
347 char *string;
348 {
349 char *p = string;
350 int c;
351
352 immediate_quit = 1;
353 while (1)
354 {
355
356 /* Must use SERIAL_READCHAR here cuz mips_readchar would get confused if we
357 were waiting for the TARGET_MONITOR_PROMPT... */
358
359 c = SERIAL_READCHAR (mips_desc, 2);
360
361 if (c == SERIAL_TIMEOUT)
362 return 0;
363
364 if (c == *p++)
365 {
366 if (*p == '\0')
367 {
368 immediate_quit = 0;
369
370 return 1;
371 }
372 }
373 else
374 {
375 p = string;
376 if (c == *p)
377 p++;
378 }
379 }
380 }
381
382 /* Read a character from the remote, aborting on error. Returns
383 SERIAL_TIMEOUT on timeout (since that's what SERIAL_READCHAR
384 returns). FIXME: If we see the string TARGET_MONITOR_PROMPT from
385 the board, then we are debugging on the main console port, and we
386 have somehow dropped out of remote debugging mode. In this case,
387 we automatically go back in to remote debugging mode. This is a
388 hack, put in because I can't find any way for a program running on
389 the remote board to terminate without also ending remote debugging
390 mode. I assume users won't have any trouble with this; for one
391 thing, the IDT documentation generally assumes that the remote
392 debugging port is not the console port. This is, however, very
393 convenient for DejaGnu when you only have one connected serial
394 port. */
395
396 static int
397 mips_readchar (timeout)
398 int timeout;
399 {
400 int ch;
401 static int state = 0;
402 static char nextstate[] = TARGET_MONITOR_PROMPT;
403 #ifdef MAINTENANCE_CMDS
404 int i;
405
406 i = timeout;
407 if (i == -1 && watchdog > 0)
408 i = watchdog;
409 #endif
410
411 if (state == (sizeof(nextstate) / sizeof(char)))
412 timeout = 1;
413 ch = SERIAL_READCHAR (mips_desc, timeout);
414 #ifdef MAINTENANCE_CMDS
415 if (ch == SERIAL_TIMEOUT && timeout == -1) /* Watchdog went off */
416 {
417 target_mourn_inferior ();
418 error ("Watchdog has expired. Target detached.\n");
419 }
420 #endif
421 if (ch == SERIAL_EOF)
422 mips_error ("End of file from remote");
423 if (ch == SERIAL_ERROR)
424 mips_error ("Error reading from remote: %s", safe_strerror (errno));
425 if (remote_debug > 1)
426 {
427 /* Don't use _filtered; we can't deal with a QUIT out of
428 target_wait, and I think this might be called from there. */
429 if (ch != SERIAL_TIMEOUT)
430 printf_unfiltered ("Read '%c' %d 0x%x\n", ch, ch, ch);
431 else
432 printf_unfiltered ("Timed out in read\n");
433 }
434
435 /* If we have seen TARGET_MONITOR_PROMPT and we either time out, or
436 we see a @ (which was echoed from a packet we sent), reset the
437 board as described above. The first character in a packet after
438 the SYN (which is not echoed) is always an @ unless the packet is
439 more than 64 characters long, which ours never are. */
440 if ((ch == SERIAL_TIMEOUT || ch == '@')
441 && state == (sizeof(nextstate) / sizeof(char))
442 && ! mips_initializing)
443 {
444 if (remote_debug > 0)
445 /* Don't use _filtered; we can't deal with a QUIT out of
446 target_wait, and I think this might be called from there. */
447 printf_unfiltered ("Reinitializing MIPS debugging mode\n");
448
449 mips_need_reply = 0;
450 mips_initialize ();
451
452 state = 0;
453
454 /* At this point, about the only thing we can do is abort the command
455 in progress and get back to command level as quickly as possible. */
456
457 error ("Remote board reset, debug protocol re-initialized.");
458 }
459
460 if (ch == nextstate[state])
461 ++state;
462 else
463 state = 0;
464
465 return ch;
466 }
467
468 /* Get a packet header, putting the data in the supplied buffer.
469 PGARBAGE is a pointer to the number of garbage characters received
470 so far. CH is the last character received. Returns 0 for success,
471 or -1 for timeout. */
472
473 static int
474 mips_receive_header (hdr, pgarbage, ch, timeout)
475 unsigned char *hdr;
476 int *pgarbage;
477 int ch;
478 int timeout;
479 {
480 int i;
481
482 while (1)
483 {
484 /* Wait for a SYN. mips_syn_garbage is intended to prevent
485 sitting here indefinitely if the board sends us one garbage
486 character per second. ch may already have a value from the
487 last time through the loop. */
488 while (ch != SYN)
489 {
490 ch = mips_readchar (timeout);
491 if (ch == SERIAL_TIMEOUT)
492 return -1;
493 if (ch != SYN)
494 {
495 /* Printing the character here lets the user of gdb see
496 what the program is outputting, if the debugging is
497 being done on the console port. Don't use _filtered;
498 we can't deal with a QUIT out of target_wait. */
499 if (! mips_initializing || remote_debug > 0)
500 {
501 if (ch < 0x20 && ch != '\n')
502 {
503 putchar_unfiltered ('^');
504 putchar_unfiltered (ch + 0x40);
505 }
506 else
507 putchar_unfiltered (ch);
508 gdb_flush (gdb_stdout);
509 }
510
511 ++*pgarbage;
512 if (*pgarbage > mips_syn_garbage)
513 mips_error ("Debug protocol failure: more than %d characters before a sync.",
514 mips_syn_garbage);
515 }
516 }
517
518 /* Get the packet header following the SYN. */
519 for (i = 1; i < HDR_LENGTH; i++)
520 {
521 ch = mips_readchar (timeout);
522 if (ch == SERIAL_TIMEOUT)
523 return -1;
524
525 /* Make sure this is a header byte. */
526 if (ch == SYN || ! HDR_CHECK (ch))
527 break;
528
529 hdr[i] = ch;
530 }
531
532 /* If we got the complete header, we can return. Otherwise we
533 loop around and keep looking for SYN. */
534 if (i >= HDR_LENGTH)
535 return 0;
536 }
537 }
538
539 /* Get a packet header, putting the data in the supplied buffer.
540 PGARBAGE is a pointer to the number of garbage characters received
541 so far. The last character read is returned in *PCH. Returns 0
542 for success, -1 for timeout, -2 for error. */
543
544 static int
545 mips_receive_trailer (trlr, pgarbage, pch, timeout)
546 unsigned char *trlr;
547 int *pgarbage;
548 int *pch;
549 int timeout;
550 {
551 int i;
552 int ch;
553
554 for (i = 0; i < TRLR_LENGTH; i++)
555 {
556 ch = mips_readchar (timeout);
557 *pch = ch;
558 if (ch == SERIAL_TIMEOUT)
559 return -1;
560 if (! TRLR_CHECK (ch))
561 return -2;
562 trlr[i] = ch;
563 }
564 return 0;
565 }
566
567 /* Get the checksum of a packet. HDR points to the packet header.
568 DATA points to the packet data. LEN is the length of DATA. */
569
570 static int
571 mips_cksum (hdr, data, len)
572 const unsigned char *hdr;
573 const unsigned char *data;
574 int len;
575 {
576 register const unsigned char *p;
577 register int c;
578 register int cksum;
579
580 cksum = 0;
581
582 /* The initial SYN is not included in the checksum. */
583 c = HDR_LENGTH - 1;
584 p = hdr + 1;
585 while (c-- != 0)
586 cksum += *p++;
587
588 c = len;
589 p = data;
590 while (c-- != 0)
591 cksum += *p++;
592
593 return cksum;
594 }
595
596 /* Send a packet containing the given ASCII string. */
597
598 static void
599 mips_send_packet (s, get_ack)
600 const char *s;
601 int get_ack;
602 {
603 unsigned int len;
604 unsigned char *packet;
605 register int cksum;
606 int try;
607
608 len = strlen (s);
609 if (len > DATA_MAXLEN)
610 mips_error ("MIPS protocol data packet too long: %s", s);
611
612 packet = (unsigned char *) alloca (HDR_LENGTH + len + TRLR_LENGTH + 1);
613
614 packet[HDR_INDX_SYN] = HDR_SET_SYN (1, len, mips_send_seq);
615 packet[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (1, len, mips_send_seq);
616 packet[HDR_INDX_LEN1] = HDR_SET_LEN1 (1, len, mips_send_seq);
617 packet[HDR_INDX_SEQ] = HDR_SET_SEQ (1, len, mips_send_seq);
618
619 memcpy (packet + HDR_LENGTH, s, len);
620
621 cksum = mips_cksum (packet, packet + HDR_LENGTH, len);
622 packet[HDR_LENGTH + len + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
623 packet[HDR_LENGTH + len + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
624 packet[HDR_LENGTH + len + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
625
626 /* Increment the sequence number. This will set mips_send_seq to
627 the sequence number we expect in the acknowledgement. */
628 mips_send_seq = (mips_send_seq + 1) % SEQ_MODULOS;
629
630 /* We can only have one outstanding data packet, so we just wait for
631 the acknowledgement here. Keep retransmitting the packet until
632 we get one, or until we've tried too many times. */
633 for (try = 0; try < mips_send_retries; try++)
634 {
635 int garbage;
636 int ch;
637
638 if (remote_debug > 0)
639 {
640 /* Don't use _filtered; we can't deal with a QUIT out of
641 target_wait, and I think this might be called from there. */
642 packet[HDR_LENGTH + len + TRLR_LENGTH] = '\0';
643 printf_unfiltered ("Writing \"%s\"\n", packet + 1);
644 }
645
646 if (SERIAL_WRITE (mips_desc, packet,
647 HDR_LENGTH + len + TRLR_LENGTH) != 0)
648 mips_error ("write to target failed: %s", safe_strerror (errno));
649
650 if (! get_ack)
651 return;
652
653 garbage = 0;
654 ch = 0;
655 while (1)
656 {
657 unsigned char hdr[HDR_LENGTH + 1];
658 unsigned char trlr[TRLR_LENGTH + 1];
659 int err;
660 int seq;
661
662 /* Get the packet header. If we time out, resend the data
663 packet. */
664 err = mips_receive_header (hdr, &garbage, ch, mips_retransmit_wait);
665 if (err != 0)
666 break;
667
668 ch = 0;
669
670 /* If we get a data packet, assume it is a duplicate and
671 ignore it. FIXME: If the acknowledgement is lost, this
672 data packet may be the packet the remote sends after the
673 acknowledgement. */
674 if (HDR_IS_DATA (hdr))
675 continue;
676
677 /* If the length is not 0, this is a garbled packet. */
678 if (HDR_GET_LEN (hdr) != 0)
679 continue;
680
681 /* Get the packet trailer. */
682 err = mips_receive_trailer (trlr, &garbage, &ch,
683 mips_retransmit_wait);
684
685 /* If we timed out, resend the data packet. */
686 if (err == -1)
687 break;
688
689 /* If we got a bad character, reread the header. */
690 if (err != 0)
691 continue;
692
693 /* If the checksum does not match the trailer checksum, this
694 is a bad packet; ignore it. */
695 if (mips_cksum (hdr, (unsigned char *) NULL, 0)
696 != TRLR_GET_CKSUM (trlr))
697 continue;
698
699 if (remote_debug > 0)
700 {
701 hdr[HDR_LENGTH] = '\0';
702 trlr[TRLR_LENGTH] = '\0';
703 /* Don't use _filtered; we can't deal with a QUIT out of
704 target_wait, and I think this might be called from there. */
705 printf_unfiltered ("Got ack %d \"%s%s\"\n",
706 HDR_GET_SEQ (hdr), hdr + 1, trlr);
707 }
708
709 /* If this ack is for the current packet, we're done. */
710 seq = HDR_GET_SEQ (hdr);
711 if (seq == mips_send_seq)
712 return;
713
714 /* If this ack is for the last packet, resend the current
715 packet. */
716 if ((seq + 1) % SEQ_MODULOS == mips_send_seq)
717 break;
718
719 /* Otherwise this is a bad ack; ignore it. Increment the
720 garbage count to ensure that we do not stay in this loop
721 forever. */
722 ++garbage;
723 }
724 }
725
726 mips_error ("Remote did not acknowledge packet");
727 }
728
729 /* Receive and acknowledge a packet, returning the data in BUFF (which
730 should be DATA_MAXLEN + 1 bytes). The protocol documentation
731 implies that only the sender retransmits packets, so this code just
732 waits silently for a packet. It returns the length of the received
733 packet. If THROW_ERROR is nonzero, call error() on errors. If not,
734 don't print an error message and return -1. */
735
736 static int
737 mips_receive_packet (buff, throw_error, timeout)
738 char *buff;
739 int throw_error;
740 int timeout;
741 {
742 int ch;
743 int garbage;
744 int len;
745 unsigned char ack[HDR_LENGTH + TRLR_LENGTH + 1];
746 int cksum;
747
748 ch = 0;
749 garbage = 0;
750 while (1)
751 {
752 unsigned char hdr[HDR_LENGTH];
753 unsigned char trlr[TRLR_LENGTH];
754 int i;
755 int err;
756
757 if (mips_receive_header (hdr, &garbage, ch, timeout) != 0)
758 {
759 if (throw_error)
760 mips_error ("Timed out waiting for remote packet");
761 else
762 return -1;
763 }
764
765 ch = 0;
766
767 /* An acknowledgement is probably a duplicate; ignore it. */
768 if (! HDR_IS_DATA (hdr))
769 {
770 /* Don't use _filtered; we can't deal with a QUIT out of
771 target_wait, and I think this might be called from there. */
772 if (remote_debug > 0)
773 printf_unfiltered ("Ignoring unexpected ACK\n");
774 continue;
775 }
776
777 /* If this is the wrong sequence number, ignore it. */
778 if (HDR_GET_SEQ (hdr) != mips_receive_seq)
779 {
780 /* Don't use _filtered; we can't deal with a QUIT out of
781 target_wait, and I think this might be called from there. */
782 if (remote_debug > 0)
783 printf_unfiltered ("Ignoring sequence number %d (want %d)\n",
784 HDR_GET_SEQ (hdr), mips_receive_seq);
785 continue;
786 }
787
788 len = HDR_GET_LEN (hdr);
789
790 for (i = 0; i < len; i++)
791 {
792 int rch;
793
794 rch = mips_readchar (timeout);
795 if (rch == SYN)
796 {
797 ch = SYN;
798 break;
799 }
800 if (rch == SERIAL_TIMEOUT)
801 {
802 if (throw_error)
803 mips_error ("Timed out waiting for remote packet");
804 else
805 return -1;
806 }
807 buff[i] = rch;
808 }
809
810 if (i < len)
811 {
812 /* Don't use _filtered; we can't deal with a QUIT out of
813 target_wait, and I think this might be called from there. */
814 if (remote_debug > 0)
815 printf_unfiltered ("Got new SYN after %d chars (wanted %d)\n",
816 i, len);
817 continue;
818 }
819
820 err = mips_receive_trailer (trlr, &garbage, &ch, timeout);
821 if (err == -1)
822 {
823 if (throw_error)
824 mips_error ("Timed out waiting for packet");
825 else
826 return -1;
827 }
828 if (err == -2)
829 {
830 /* Don't use _filtered; we can't deal with a QUIT out of
831 target_wait, and I think this might be called from there. */
832 if (remote_debug > 0)
833 printf_unfiltered ("Got SYN when wanted trailer\n");
834 continue;
835 }
836
837 if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr))
838 break;
839
840 if (remote_debug > 0)
841 /* Don't use _filtered; we can't deal with a QUIT out of
842 target_wait, and I think this might be called from there. */
843 printf_unfiltered ("Bad checksum; data %d, trailer %d\n",
844 mips_cksum (hdr, buff, len),
845 TRLR_GET_CKSUM (trlr));
846
847 /* The checksum failed. Send an acknowledgement for the
848 previous packet to tell the remote to resend the packet. */
849 ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
850 ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
851 ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
852 ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
853
854 cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
855
856 ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
857 ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
858 ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
859
860 if (remote_debug > 0)
861 {
862 ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
863 /* Don't use _filtered; we can't deal with a QUIT out of
864 target_wait, and I think this might be called from there. */
865 printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
866 ack + 1);
867 }
868
869 if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
870 {
871 if (throw_error)
872 mips_error ("write to target failed: %s", safe_strerror (errno));
873 else
874 return -1;
875 }
876 }
877
878 if (remote_debug > 0)
879 {
880 buff[len] = '\0';
881 /* Don't use _filtered; we can't deal with a QUIT out of
882 target_wait, and I think this might be called from there. */
883 printf_unfiltered ("Got packet \"%s\"\n", buff);
884 }
885
886 /* We got the packet. Send an acknowledgement. */
887 mips_receive_seq = (mips_receive_seq + 1) % SEQ_MODULOS;
888
889 ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
890 ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
891 ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
892 ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
893
894 cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
895
896 ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
897 ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
898 ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
899
900 if (remote_debug > 0)
901 {
902 ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
903 /* Don't use _filtered; we can't deal with a QUIT out of
904 target_wait, and I think this might be called from there. */
905 printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
906 ack + 1);
907 }
908
909 if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
910 {
911 if (throw_error)
912 mips_error ("write to target failed: %s", safe_strerror (errno));
913 else
914 return -1;
915 }
916
917 return len;
918 }
919 \f
920 /* Optionally send a request to the remote system and optionally wait
921 for the reply. This implements the remote debugging protocol,
922 which is built on top of the packet protocol defined above. Each
923 request has an ADDR argument and a DATA argument. The following
924 requests are defined:
925
926 \0 don't send a request; just wait for a reply
927 i read word from instruction space at ADDR
928 d read word from data space at ADDR
929 I write DATA to instruction space at ADDR
930 D write DATA to data space at ADDR
931 r read register number ADDR
932 R set register number ADDR to value DATA
933 c continue execution (if ADDR != 1, set pc to ADDR)
934 s single step (if ADDR != 1, set pc to ADDR)
935
936 The read requests return the value requested. The write requests
937 return the previous value in the changed location. The execution
938 requests return a UNIX wait value (the approximate signal which
939 caused execution to stop is in the upper eight bits).
940
941 If PERR is not NULL, this function waits for a reply. If an error
942 occurs, it sets *PERR to 1 and sets errno according to what the
943 target board reports. */
944
945 static int
946 mips_request (cmd, addr, data, perr, timeout, buff)
947 int cmd;
948 unsigned int addr;
949 unsigned int data;
950 int *perr;
951 int timeout;
952 char *buff;
953 {
954 char myBuff[DATA_MAXLEN + 1];
955 int len;
956 int rpid;
957 char rcmd;
958 int rerrflg;
959 int rresponse;
960
961 if (buff == (char *) NULL)
962 buff = myBuff;
963
964 if (cmd != '\0')
965 {
966 if (mips_need_reply)
967 fatal ("mips_request: Trying to send command before reply");
968 sprintf (buff, "0x0 %c 0x%x 0x%x", cmd, addr, data);
969 mips_send_packet (buff, 1);
970 mips_need_reply = 1;
971 }
972
973 if (perr == (int *) NULL)
974 return 0;
975
976 if (! mips_need_reply)
977 fatal ("mips_request: Trying to get reply before command");
978
979 mips_need_reply = 0;
980
981 len = mips_receive_packet (buff, 1, timeout);
982 buff[len] = '\0';
983
984 if (sscanf (buff, "0x%x %c 0x%x 0x%x",
985 &rpid, &rcmd, &rerrflg, &rresponse) != 4
986 || (cmd != '\0' && rcmd != cmd))
987 mips_error ("Bad response from remote board");
988
989 if (rerrflg != 0)
990 {
991 *perr = 1;
992
993 /* FIXME: This will returns MIPS errno numbers, which may or may
994 not be the same as errno values used on other systems. If
995 they stick to common errno values, they will be the same, but
996 if they don't, they must be translated. */
997 errno = rresponse;
998
999 return 0;
1000 }
1001
1002 *perr = 0;
1003 return rresponse;
1004 }
1005
1006 static void
1007 mips_initialize_cleanups (arg)
1008 PTR arg;
1009 {
1010 mips_initializing = 0;
1011 }
1012
1013 /* Initialize a new connection to the MIPS board, and make sure we are
1014 really connected. */
1015
1016 static void
1017 mips_initialize ()
1018 {
1019 char buff[DATA_MAXLEN + 1];
1020 int err;
1021 struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL);
1022 int j;
1023
1024 /* What is this code doing here? I don't see any way it can happen, and
1025 it might mean mips_initializing didn't get cleared properly.
1026 So I'll make it a warning. */
1027
1028 if (mips_initializing)
1029 {
1030 warning ("internal error: mips_initialize called twice");
1031 return;
1032 }
1033
1034 mips_wait_flag = 0;
1035 mips_initializing = 1;
1036
1037 mips_send_seq = 0;
1038 mips_receive_seq = 0;
1039
1040 /* At this point, the packit protocol isn't responding. We'll try getting
1041 into the monitor, and restarting the protocol. */
1042
1043 /* Force the system into the IDT monitor. After this we *should* be at the
1044 <IDT> prompt. */
1045
1046 for (j = 1; j <= 4; j++)
1047 {
1048 switch (j)
1049 {
1050 case 1: /* First, try sending a break */
1051 SERIAL_SEND_BREAK (mips_desc);
1052 break;
1053 case 2: /* Then, try a ^C */
1054 SERIAL_WRITE (mips_desc, "\003", 1);
1055 break;
1056 case 3: /* Then, try escaping from download */
1057 {
1058 int i;
1059 char srec[10];
1060
1061 /* We are possibly in binary download mode, having aborted in the
1062 middle of an S-record. ^C won't work because of binary mode.
1063 The only reliable way out is to send enough termination packets
1064 (8 bytes) to fill up and then overflow the largest size S-record
1065 (255 bytes in this case). This amounts to 256/8 + 1 packets.
1066 */
1067
1068 mips_make_srec (srec, '7', 0, NULL, 0);
1069
1070 for (i = 1; i <= 33; i++)
1071 {
1072 SERIAL_WRITE (mips_desc, srec, 8);
1073
1074 if (SERIAL_READCHAR (mips_desc, 0) >= 0)
1075 break; /* Break immediatly if we get something from
1076 the board. */
1077 }
1078 break;
1079 }
1080 case 4:
1081 mips_error ("Failed to initialize.");
1082 }
1083
1084 if (mips_expect (TARGET_MONITOR_PROMPT))
1085 break;
1086 }
1087 SERIAL_WRITE (mips_desc, "db tty0\015", sizeof "db tty0\015" - 1);
1088 mips_expect ("db tty0\015\012"); /* Eat the echo */
1089
1090 SERIAL_WRITE (mips_desc, "\015", sizeof "\015" - 1);
1091
1092 if (mips_receive_packet (buff, 1, 3) < 0)
1093 mips_error ("Failed to initialize (didn't receive packet).");
1094
1095 if (common_breakpoint ('b', -1, 0, NULL)) /* Clear all breakpoints */
1096 monitor_supports_breakpoints = 0; /* Failed, don't use it anymore */
1097 else
1098 monitor_supports_breakpoints = 1;
1099
1100 do_cleanups (old_cleanups);
1101
1102 /* If this doesn't call error, we have connected; we don't care if
1103 the request itself succeeds or fails. */
1104
1105 mips_request ('r', (unsigned int) 0, (unsigned int) 0, &err,
1106 mips_receive_wait, NULL);
1107 set_current_frame (create_new_frame (read_fp (), read_pc ()));
1108 select_frame (get_current_frame (), 0);
1109 }
1110
1111 /* Open a connection to the remote board. */
1112
1113 static void
1114 mips_open (name, from_tty)
1115 char *name;
1116 int from_tty;
1117 {
1118 char *ptype;
1119
1120 if (name == 0)
1121 error (
1122 "To open a MIPS remote debugging connection, you need to specify what serial\n\
1123 device is attached to the target board (e.g., /dev/ttya).");
1124
1125 target_preopen (from_tty);
1126
1127 if (mips_is_open)
1128 unpush_target (&mips_ops);
1129
1130 mips_desc = SERIAL_OPEN (name);
1131 if (mips_desc == (serial_t) NULL)
1132 perror_with_name (name);
1133
1134 if (baud_rate != -1)
1135 {
1136 if (SERIAL_SETBAUDRATE (mips_desc, baud_rate))
1137 {
1138 SERIAL_CLOSE (mips_desc);
1139 perror_with_name (name);
1140 }
1141 }
1142
1143 SERIAL_RAW (mips_desc);
1144
1145 mips_is_open = 1;
1146
1147 mips_initialize ();
1148
1149 if (from_tty)
1150 printf_unfiltered ("Remote MIPS debugging using %s\n", name);
1151
1152 /* Switch to using remote target now. */
1153 push_target (&mips_ops);
1154
1155 /* FIXME: Should we call start_remote here? */
1156
1157 /* Try to figure out the processor model if possible. */
1158 ptype = mips_read_processor_type ();
1159 if (ptype)
1160 mips_set_processor_type_command (strsave (ptype), 0);
1161
1162 /* This is really the job of start_remote however, that makes an assumption
1163 that the target is about to print out a status message of some sort. That
1164 doesn't happen here (in fact, it may not be possible to get the monitor to
1165 send the appropriate packet). */
1166
1167 flush_cached_frames ();
1168 registers_changed ();
1169 stop_pc = read_pc ();
1170 set_current_frame (create_new_frame (read_fp (), stop_pc));
1171 select_frame (get_current_frame (), 0);
1172 print_stack_frame (selected_frame, -1, 1);
1173 }
1174
1175 /* Close a connection to the remote board. */
1176
1177 static void
1178 mips_close (quitting)
1179 int quitting;
1180 {
1181 if (mips_is_open)
1182 {
1183 int err;
1184
1185 mips_is_open = 0;
1186
1187 /* Get the board out of remote debugging mode. */
1188 mips_request ('x', (unsigned int) 0, (unsigned int) 0, &err,
1189 mips_receive_wait, NULL);
1190
1191 SERIAL_CLOSE (mips_desc);
1192 }
1193 }
1194
1195 /* Detach from the remote board. */
1196
1197 static void
1198 mips_detach (args, from_tty)
1199 char *args;
1200 int from_tty;
1201 {
1202 if (args)
1203 error ("Argument given to \"detach\" when remotely debugging.");
1204
1205 pop_target ();
1206
1207 mips_close (1);
1208
1209 if (from_tty)
1210 printf_unfiltered ("Ending remote MIPS debugging.\n");
1211 }
1212
1213 /* Tell the target board to resume. This does not wait for a reply
1214 from the board. */
1215
1216 static void
1217 mips_resume (pid, step, siggnal)
1218 int pid, step;
1219 enum target_signal siggnal;
1220 {
1221
1222 /* start-sanitize-gm */
1223 #ifndef GENERAL_MAGIC
1224 if (siggnal != TARGET_SIGNAL_0)
1225 warning
1226 ("Can't send signals to a remote system. Try `handle %s ignore'.",
1227 target_signal_to_name (siggnal));
1228 #endif /* GENERAL_MAGIC */
1229 /* end-sanitize-gm */
1230
1231 mips_request (step ? 's' : 'c',
1232 (unsigned int) 1,
1233 (unsigned int) siggnal,
1234 (int *) NULL,
1235 mips_receive_wait, NULL);
1236 }
1237
1238 /* Return the signal corresponding to SIG, where SIG is the number which
1239 the MIPS protocol uses for the signal. */
1240 enum target_signal
1241 mips_signal_from_protocol (sig)
1242 int sig;
1243 {
1244 /* We allow a few more signals than the IDT board actually returns, on
1245 the theory that there is at least *some* hope that perhaps the numbering
1246 for these signals is widely agreed upon. */
1247 if (sig <= 0
1248 || sig > 31)
1249 return TARGET_SIGNAL_UNKNOWN;
1250
1251 /* Don't want to use target_signal_from_host because we are converting
1252 from MIPS signal numbers, not host ones. Our internal numbers
1253 match the MIPS numbers for the signals the board can return, which
1254 are: SIGINT, SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP. */
1255 return (enum target_signal) sig;
1256 }
1257
1258 /* Wait until the remote stops, and return a wait status. */
1259
1260 static int
1261 mips_wait (pid, status)
1262 int pid;
1263 struct target_waitstatus *status;
1264 {
1265 int rstatus;
1266 int err;
1267 char buff[DATA_MAXLEN];
1268 int rpc, rfp, rsp;
1269 char flags[20];
1270 int nfields;
1271
1272 interrupt_count = 0;
1273 hit_watchpoint = 0;
1274
1275 /* If we have not sent a single step or continue command, then the
1276 board is waiting for us to do something. Return a status
1277 indicating that it is stopped. */
1278 if (! mips_need_reply)
1279 {
1280 status->kind = TARGET_WAITKIND_STOPPED;
1281 status->value.sig = TARGET_SIGNAL_TRAP;
1282 return 0;
1283 }
1284
1285 /* No timeout; we sit here as long as the program continues to execute. */
1286 mips_wait_flag = 1;
1287 rstatus = mips_request ('\000', (unsigned int) 0, (unsigned int) 0, &err, -1,
1288 buff);
1289 mips_wait_flag = 0;
1290 if (err)
1291 mips_error ("Remote failure: %s", safe_strerror (errno));
1292
1293 nfields = sscanf (buff, "0x%*x %*c 0x%*x 0x%*x 0x%x 0x%x 0x%x 0x%*x %s",
1294 &rpc, &rfp, &rsp, flags);
1295
1296 /* See if we got back extended status. If so, pick out the pc, fp, sp, etc... */
1297
1298 if (nfields == 7 || nfields == 9)
1299 {
1300 char buf[MAX_REGISTER_RAW_SIZE];
1301
1302 store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rpc);
1303 supply_register (PC_REGNUM, buf);
1304
1305 store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rfp);
1306 supply_register (30, buf); /* This register they are avoiding and so it is unnamed */
1307
1308 store_unsigned_integer (buf, REGISTER_RAW_SIZE (SP_REGNUM), rsp);
1309 supply_register (SP_REGNUM, buf);
1310
1311 store_unsigned_integer (buf, REGISTER_RAW_SIZE (FP_REGNUM), 0);
1312 supply_register (FP_REGNUM, buf);
1313
1314 if (nfields == 9)
1315 {
1316 int i;
1317
1318 for (i = 0; i <= 2; i++)
1319 if (flags[i] == 'r' || flags[i] == 'w')
1320 hit_watchpoint = 1;
1321 else if (flags[i] == '\000')
1322 break;
1323 }
1324 }
1325
1326 /* Translate a MIPS waitstatus. We use constants here rather than WTERMSIG
1327 and so on, because the constants we want here are determined by the
1328 MIPS protocol and have nothing to do with what host we are running on. */
1329 if ((rstatus & 0377) == 0)
1330 {
1331 status->kind = TARGET_WAITKIND_EXITED;
1332 status->value.integer = (((rstatus) >> 8) & 0377);
1333 }
1334 else if ((rstatus & 0377) == 0177)
1335 {
1336 status->kind = TARGET_WAITKIND_STOPPED;
1337 status->value.sig = mips_signal_from_protocol (((rstatus) >> 8) & 0377);
1338 }
1339 else
1340 {
1341 status->kind = TARGET_WAITKIND_SIGNALLED;
1342 status->value.sig = mips_signal_from_protocol (rstatus & 0177);
1343 }
1344
1345 return 0;
1346 }
1347
1348 /* We have to map between the register numbers used by gdb and the
1349 register numbers used by the debugging protocol. This function
1350 assumes that we are using tm-mips.h. */
1351
1352 #define REGNO_OFFSET 96
1353
1354 static int
1355 mips_map_regno (regno)
1356 int regno;
1357 {
1358 if (regno < 32)
1359 return regno;
1360 if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32)
1361 return regno - FP0_REGNUM + 32;
1362 switch (regno)
1363 {
1364 case PC_REGNUM:
1365 return REGNO_OFFSET + 0;
1366 case CAUSE_REGNUM:
1367 return REGNO_OFFSET + 1;
1368 case HI_REGNUM:
1369 return REGNO_OFFSET + 2;
1370 case LO_REGNUM:
1371 return REGNO_OFFSET + 3;
1372 case FCRCS_REGNUM:
1373 return REGNO_OFFSET + 4;
1374 case FCRIR_REGNUM:
1375 return REGNO_OFFSET + 5;
1376 default:
1377 /* FIXME: Is there a way to get the status register? */
1378 return 0;
1379 }
1380 }
1381
1382 /* Fetch the remote registers. */
1383
1384 static void
1385 mips_fetch_registers (regno)
1386 int regno;
1387 {
1388 unsigned LONGEST val;
1389 int err;
1390
1391 if (regno == -1)
1392 {
1393 for (regno = 0; regno < NUM_REGS; regno++)
1394 mips_fetch_registers (regno);
1395 return;
1396 }
1397
1398 if (regno == FP_REGNUM || regno == ZERO_REGNUM)
1399 /* FP_REGNUM on the mips is a hack which is just supposed to read
1400 zero (see also mips-nat.c). */
1401 val = 0;
1402 else
1403 {
1404 val = mips_request ('r', (unsigned int) mips_map_regno (regno),
1405 (unsigned int) 0, &err, mips_receive_wait, NULL);
1406 if (err)
1407 mips_error ("Can't read register %d: %s", regno,
1408 safe_strerror (errno));
1409 }
1410
1411 {
1412 char buf[MAX_REGISTER_RAW_SIZE];
1413
1414 /* We got the number the register holds, but gdb expects to see a
1415 value in the target byte ordering. */
1416 store_unsigned_integer (buf, REGISTER_RAW_SIZE (regno), val);
1417 supply_register (regno, buf);
1418 }
1419 }
1420
1421 /* Prepare to store registers. The MIPS protocol can store individual
1422 registers, so this function doesn't have to do anything. */
1423
1424 static void
1425 mips_prepare_to_store ()
1426 {
1427 }
1428
1429 /* Store remote register(s). */
1430
1431 static void
1432 mips_store_registers (regno)
1433 int regno;
1434 {
1435 int err;
1436
1437 if (regno == -1)
1438 {
1439 for (regno = 0; regno < NUM_REGS; regno++)
1440 mips_store_registers (regno);
1441 return;
1442 }
1443
1444 mips_request ('R', (unsigned int) mips_map_regno (regno),
1445 (unsigned int) read_register (regno),
1446 &err, mips_receive_wait, NULL);
1447 if (err)
1448 mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
1449 }
1450
1451 /* Fetch a word from the target board. */
1452
1453 static int
1454 mips_fetch_word (addr)
1455 CORE_ADDR addr;
1456 {
1457 int val;
1458 int err;
1459
1460 val = mips_request ('d', (unsigned int) addr, (unsigned int) 0, &err,
1461 mips_receive_wait, NULL);
1462 if (err)
1463 {
1464 /* Data space failed; try instruction space. */
1465 val = mips_request ('i', (unsigned int) addr, (unsigned int) 0, &err,
1466 mips_receive_wait, NULL);
1467 if (err)
1468 mips_error ("Can't read address 0x%x: %s", addr, safe_strerror (errno));
1469 }
1470 return val;
1471 }
1472
1473 /* Store a word to the target board. Returns errno code or zero for
1474 success. If OLD_CONTENTS is non-NULL, put the old contents of that
1475 memory location there. */
1476
1477 static int
1478 mips_store_word (addr, val, old_contents)
1479 CORE_ADDR addr;
1480 int val;
1481 char *old_contents;
1482 {
1483 int err;
1484 unsigned int oldcontents;
1485
1486 oldcontents = mips_request ('D', (unsigned int) addr, (unsigned int) val,
1487 &err,
1488 mips_receive_wait, NULL);
1489 if (err)
1490 {
1491 /* Data space failed; try instruction space. */
1492 oldcontents = mips_request ('I', (unsigned int) addr,
1493 (unsigned int) val, &err,
1494 mips_receive_wait, NULL);
1495 if (err)
1496 return errno;
1497 }
1498 if (old_contents != NULL)
1499 store_unsigned_integer (old_contents, 4, oldcontents);
1500 return 0;
1501 }
1502
1503 /* Read or write LEN bytes from inferior memory at MEMADDR,
1504 transferring to or from debugger address MYADDR. Write to inferior
1505 if SHOULD_WRITE is nonzero. Returns length of data written or
1506 read; 0 for error. Note that protocol gives us the correct value
1507 for a longword, since it transfers values in ASCII. We want the
1508 byte values, so we have to swap the longword values. */
1509
1510 static int
1511 mips_xfer_memory (memaddr, myaddr, len, write, ignore)
1512 CORE_ADDR memaddr;
1513 char *myaddr;
1514 int len;
1515 int write;
1516 struct target_ops *ignore;
1517 {
1518 register int i;
1519 /* Round starting address down to longword boundary. */
1520 register CORE_ADDR addr = memaddr &~ 3;
1521 /* Round ending address up; get number of longwords that makes. */
1522 register int count = (((memaddr + len) - addr) + 3) / 4;
1523 /* Allocate buffer of that many longwords. */
1524 register char *buffer = alloca (count * 4);
1525
1526 int status;
1527
1528 if (write)
1529 {
1530 /* Fill start and end extra bytes of buffer with existing data. */
1531 if (addr != memaddr || len < 4)
1532 {
1533 /* Need part of initial word -- fetch it. */
1534 store_unsigned_integer (&buffer[0], 4, mips_fetch_word (addr));
1535 }
1536
1537 if (count > 1)
1538 {
1539 /* Need part of last word -- fetch it. FIXME: we do this even
1540 if we don't need it. */
1541 store_unsigned_integer (&buffer[(count - 1) * 4], 4,
1542 mips_fetch_word (addr + (count - 1) * 4));
1543 }
1544
1545 /* Copy data to be written over corresponding part of buffer */
1546
1547 memcpy ((char *) buffer + (memaddr & 3), myaddr, len);
1548
1549 /* Write the entire buffer. */
1550
1551 for (i = 0; i < count; i++, addr += 4)
1552 {
1553 status = mips_store_word (addr,
1554 extract_unsigned_integer (&buffer[i*4], 4),
1555 NULL);
1556 /* Report each kilobyte (we download 32-bit words at a time) */
1557 if (i % 256 == 255)
1558 {
1559 printf_unfiltered ("*");
1560 fflush (stdout);
1561 }
1562 if (status)
1563 {
1564 errno = status;
1565 return 0;
1566 }
1567 /* FIXME: Do we want a QUIT here? */
1568 }
1569 if (count >= 256)
1570 printf_unfiltered ("\n");
1571 }
1572 else
1573 {
1574 /* Read all the longwords */
1575 for (i = 0; i < count; i++, addr += 4)
1576 {
1577 store_unsigned_integer (&buffer[i*4], 4, mips_fetch_word (addr));
1578 QUIT;
1579 }
1580
1581 /* Copy appropriate bytes out of the buffer. */
1582 memcpy (myaddr, buffer + (memaddr & 3), len);
1583 }
1584 return len;
1585 }
1586
1587 /* Print info on this target. */
1588
1589 static void
1590 mips_files_info (ignore)
1591 struct target_ops *ignore;
1592 {
1593 printf_unfiltered ("Debugging a MIPS board over a serial line.\n");
1594 }
1595
1596 /* Kill the process running on the board. This will actually only
1597 work if we are doing remote debugging over the console input. I
1598 think that if IDT/sim had the remote debug interrupt enabled on the
1599 right port, we could interrupt the process with a break signal. */
1600
1601 static void
1602 mips_kill ()
1603 {
1604 if (!mips_wait_flag)
1605 return;
1606
1607 interrupt_count++;
1608
1609 if (interrupt_count >= 2)
1610 {
1611 interrupt_count = 0;
1612
1613 target_terminal_ours ();
1614
1615 if (query ("Interrupted while waiting for the program.\n\
1616 Give up (and stop debugging it)? "))
1617 {
1618 /* Clean up in such a way that mips_close won't try to talk to the
1619 board (it almost surely won't work since we weren't able to talk to
1620 it). */
1621 mips_wait_flag = 0;
1622 mips_is_open = 0;
1623 SERIAL_CLOSE (mips_desc);
1624
1625 printf_unfiltered ("Ending remote MIPS debugging.\n");
1626 target_mourn_inferior ();
1627
1628 return_to_top_level (RETURN_QUIT);
1629 }
1630
1631 target_terminal_inferior ();
1632 }
1633
1634 if (remote_debug > 0)
1635 printf_unfiltered ("Sending break\n");
1636
1637 SERIAL_SEND_BREAK (mips_desc);
1638
1639 #if 0
1640 if (mips_is_open)
1641 {
1642 char cc;
1643
1644 /* Send a ^C. */
1645 cc = '\003';
1646 SERIAL_WRITE (mips_desc, &cc, 1);
1647 sleep (1);
1648 target_mourn_inferior ();
1649 }
1650 #endif
1651 }
1652
1653 /* Start running on the target board. */
1654
1655 static void
1656 mips_create_inferior (execfile, args, env)
1657 char *execfile;
1658 char *args;
1659 char **env;
1660 {
1661 CORE_ADDR entry_pt;
1662
1663 if (args && *args)
1664 {
1665 warning ("\
1666 Can't pass arguments to remote MIPS board; arguments ignored.");
1667 /* And don't try to use them on the next "run" command. */
1668 execute_command ("set args", 0);
1669 }
1670
1671 if (execfile == 0 || exec_bfd == 0)
1672 error ("No executable file specified");
1673
1674 entry_pt = (CORE_ADDR) bfd_get_start_address (exec_bfd);
1675
1676 init_wait_for_inferior ();
1677
1678 /* FIXME: Should we set inferior_pid here? */
1679
1680 /* start-sanitize-gm */
1681 #ifdef GENERAL_MAGIC
1682 magic_create_inferior_hook ();
1683 proceed (entry_pt, TARGET_SIGNAL_PWR, 0);
1684 #else
1685 /* end-sanitize-gm */
1686 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
1687 /* start-sanitize-gm */
1688 #endif /* GENERAL_MAGIC */
1689 /* end-sanitize-gm */
1690 }
1691
1692 /* Clean up after a process. Actually nothing to do. */
1693
1694 static void
1695 mips_mourn_inferior ()
1696 {
1697 unpush_target (&mips_ops);
1698 generic_mourn_inferior ();
1699 }
1700 \f
1701 /* We can write a breakpoint and read the shadow contents in one
1702 operation. */
1703
1704 /* The IDT board uses an unusual breakpoint value, and sometimes gets
1705 confused when it sees the usual MIPS breakpoint instruction. */
1706
1707 #define BREAK_INSN (0x00000a0d)
1708 #define BREAK_INSN_SIZE (4)
1709
1710 /* Insert a breakpoint on targets that don't have any better breakpoint
1711 support. We read the contents of the target location and stash it,
1712 then overwrite it with a breakpoint instruction. ADDR is the target
1713 location in the target machine. CONTENTS_CACHE is a pointer to
1714 memory allocated for saving the target contents. It is guaranteed
1715 by the caller to be long enough to save sizeof BREAKPOINT bytes (this
1716 is accomplished via BREAKPOINT_MAX). */
1717
1718 static int
1719 mips_insert_breakpoint (addr, contents_cache)
1720 CORE_ADDR addr;
1721 char *contents_cache;
1722 {
1723 int status;
1724
1725 if (monitor_supports_breakpoints)
1726 return common_breakpoint ('B', addr, 0x3, "f");
1727
1728 return mips_store_word (addr, BREAK_INSN, contents_cache);
1729 }
1730
1731 static int
1732 mips_remove_breakpoint (addr, contents_cache)
1733 CORE_ADDR addr;
1734 char *contents_cache;
1735 {
1736 if (monitor_supports_breakpoints)
1737 return common_breakpoint ('b', addr, 0, NULL);
1738
1739 return target_write_memory (addr, contents_cache, BREAK_INSN_SIZE);
1740 }
1741
1742 /* Compute a don't care mask for the region bounding ADDR and ADDR + LEN - 1.
1743 This is used for memory ref breakpoints. */
1744
1745 static unsigned long
1746 calculate_mask (addr, len)
1747 CORE_ADDR addr;
1748 int len;
1749 {
1750 unsigned long mask;
1751 int i;
1752
1753 mask = addr ^ (addr + len - 1);
1754
1755 for (i = 32; i >= 0; i--)
1756 if (mask == 0)
1757 break;
1758 else
1759 mask >>= 1;
1760
1761 mask = (unsigned long) 0xffffffff >> i;
1762
1763 return mask;
1764 }
1765
1766 /* Set a data watchpoint. ADDR and LEN should be obvious. TYPE is either 1
1767 for a read watchpoint, or 2 for a read/write watchpoint. */
1768
1769 int
1770 remote_mips_set_watchpoint (addr, len, type)
1771 CORE_ADDR addr;
1772 int len;
1773 int type;
1774 {
1775 CORE_ADDR first_addr;
1776 unsigned long mask;
1777 char *flags;
1778
1779 mask = calculate_mask (addr, len);
1780
1781 first_addr = addr & ~mask;
1782
1783 switch (type)
1784 {
1785 case 0: /* write */
1786 flags = "w";
1787 break;
1788 case 1: /* read */
1789 flags = "r";
1790 break;
1791 case 2: /* read/write */
1792 flags = "rw";
1793 break;
1794 default:
1795 abort ();
1796 }
1797
1798 if (common_breakpoint ('B', first_addr, mask, flags))
1799 return -1;
1800
1801 return 0;
1802 }
1803
1804 int
1805 remote_mips_remove_watchpoint (addr, len, type)
1806 CORE_ADDR addr;
1807 int len;
1808 int type;
1809 {
1810 CORE_ADDR first_addr;
1811 unsigned long mask;
1812
1813 mask = calculate_mask (addr, len);
1814
1815 first_addr = addr & ~mask;
1816
1817 if (common_breakpoint ('b', first_addr, 0, NULL))
1818 return -1;
1819
1820 return 0;
1821 }
1822
1823 int
1824 remote_mips_stopped_by_watchpoint ()
1825 {
1826 return hit_watchpoint;
1827 }
1828
1829 /* This routine generates the a breakpoint command of the form:
1830
1831 0x0 <CMD> <ADDR> <MASK> <FLAGS>
1832
1833 Where <CMD> is one of: `B' to set, or `b' to clear a breakpoint. <ADDR> is
1834 the address of the breakpoint. <MASK> is a don't care mask for addresses.
1835 <FLAGS> is any combination of `r', `w', or `f' for read/write/or fetch. */
1836
1837 static int
1838 common_breakpoint (cmd, addr, mask, flags)
1839 int cmd;
1840 CORE_ADDR addr;
1841 CORE_ADDR mask;
1842 char *flags;
1843 {
1844 int len;
1845 char buf[DATA_MAXLEN + 1];
1846 char rcmd;
1847 int rpid, rerrflg, rresponse;
1848 int nfields;
1849
1850 if (flags)
1851 sprintf (buf, "0x0 %c 0x%x 0x%x %s", cmd, addr, mask, flags);
1852 else
1853 sprintf (buf, "0x0 %c 0x%x", cmd, addr);
1854
1855 mips_send_packet (buf, 1);
1856
1857 len = mips_receive_packet (buf, 1, mips_receive_wait);
1858
1859 nfields = sscanf (buf, "0x%x %c 0x%x 0x%x", &rpid, &rcmd, &rerrflg, &rresponse);
1860
1861 if (nfields != 4
1862 || rcmd != cmd)
1863 mips_error ("common_breakpoint: Bad response from remote board: %s", buf);
1864
1865 if (rerrflg != 0)
1866 {
1867 if (rresponse != EINVAL)
1868 fprintf_unfiltered (stderr, "common_breakpoint (0x%x): Got error: 0x%x\n",
1869 addr, rresponse);
1870 return 1;
1871 }
1872
1873 return 0;
1874 }
1875 \f
1876 static void
1877 send_srec (srec, len, addr)
1878 char *srec;
1879 int len;
1880 CORE_ADDR addr;
1881 {
1882 while (1)
1883 {
1884 int ch;
1885
1886 SERIAL_WRITE (mips_desc, srec, len);
1887
1888 ch = mips_readchar (2);
1889
1890 switch (ch)
1891 {
1892 case SERIAL_TIMEOUT:
1893 error ("Timeout during download.");
1894 break;
1895 case 0x6: /* ACK */
1896 return;
1897 case 0x15: /* NACK */
1898 fprintf_unfiltered (gdb_stderr, "Download got a NACK at byte %d! Retrying.\n", addr);
1899 continue;
1900 default:
1901 error ("Download got unexpected ack char: 0x%x, retrying.\n", ch);
1902 }
1903 }
1904 }
1905
1906 /* Download a binary file by converting it to S records. */
1907
1908 static void
1909 mips_load_srec (args)
1910 char *args;
1911 {
1912 bfd *abfd;
1913 asection *s;
1914 char *buffer, srec[1024];
1915 int i;
1916 int srec_frame = 200;
1917 int reclen;
1918 static int hashmark = 1;
1919
1920 buffer = alloca (srec_frame * 2 + 256);
1921
1922 abfd = bfd_openr (args, 0);
1923 if (!abfd)
1924 {
1925 printf_filtered ("Unable to open file %s\n", args);
1926 return;
1927 }
1928
1929 if (bfd_check_format (abfd, bfd_object) == 0)
1930 {
1931 printf_filtered ("File is not an object file\n");
1932 return;
1933 }
1934
1935 #define LOAD_CMD "load -b -s tty0\015"
1936
1937 SERIAL_WRITE (mips_desc, LOAD_CMD, sizeof LOAD_CMD - 1);
1938
1939 mips_expect (LOAD_CMD);
1940 mips_expect ("\012");
1941
1942 for (s = abfd->sections; s; s = s->next)
1943 {
1944 if (s->flags & SEC_LOAD)
1945 {
1946 int numbytes;
1947
1948 printf_filtered ("%s\t: 0x%4x .. 0x%4x ", s->name, s->vma,
1949 s->vma + s->_raw_size);
1950 gdb_flush (gdb_stdout);
1951
1952 for (i = 0; i < s->_raw_size; i += numbytes)
1953 {
1954 numbytes = min (srec_frame, s->_raw_size - i);
1955
1956 bfd_get_section_contents (abfd, s, buffer, i, numbytes);
1957
1958 reclen = mips_make_srec (srec, '3', s->vma + i, buffer, numbytes);
1959 send_srec (srec, reclen, s->vma + i);
1960
1961 if (hashmark)
1962 {
1963 putchar_unfiltered ('#');
1964 gdb_flush (gdb_stdout);
1965 }
1966
1967 } /* Per-packet (or S-record) loop */
1968
1969 putchar_unfiltered ('\n');
1970 } /* Loadable sections */
1971 }
1972 if (hashmark)
1973 putchar_unfiltered ('\n');
1974
1975 /* Write a type 7 terminator record. no data for a type 7, and there
1976 is no data, so len is 0. */
1977
1978 reclen = mips_make_srec (srec, '7', abfd->start_address, NULL, 0);
1979
1980 send_srec (srec, reclen, abfd->start_address);
1981
1982 SERIAL_FLUSH_INPUT (mips_desc);
1983 }
1984
1985 /*
1986 * mips_make_srec -- make an srecord. This writes each line, one at a
1987 * time, each with it's own header and trailer line.
1988 * An srecord looks like this:
1989 *
1990 * byte count-+ address
1991 * start ---+ | | data +- checksum
1992 * | | | |
1993 * S01000006F6B692D746573742E73726563E4
1994 * S315000448600000000000000000FC00005900000000E9
1995 * S31A0004000023C1400037DE00F023604000377B009020825000348D
1996 * S30B0004485A0000000000004E
1997 * S70500040000F6
1998 *
1999 * S<type><length><address><data><checksum>
2000 *
2001 * Where
2002 * - length
2003 * is the number of bytes following upto the checksum. Note that
2004 * this is not the number of chars following, since it takes two
2005 * chars to represent a byte.
2006 * - type
2007 * is one of:
2008 * 0) header record
2009 * 1) two byte address data record
2010 * 2) three byte address data record
2011 * 3) four byte address data record
2012 * 7) four byte address termination record
2013 * 8) three byte address termination record
2014 * 9) two byte address termination record
2015 *
2016 * - address
2017 * is the start address of the data following, or in the case of
2018 * a termination record, the start address of the image
2019 * - data
2020 * is the data.
2021 * - checksum
2022 * is the sum of all the raw byte data in the record, from the length
2023 * upwards, modulo 256 and subtracted from 255.
2024 *
2025 * This routine returns the length of the S-record.
2026 *
2027 */
2028
2029 static int
2030 mips_make_srec (buf, type, memaddr, myaddr, len)
2031 char *buf;
2032 int type;
2033 CORE_ADDR memaddr;
2034 unsigned char *myaddr;
2035 int len;
2036 {
2037 unsigned char checksum;
2038 int i;
2039
2040 /* Create the header for the srec. addr_size is the number of bytes in the address,
2041 and 1 is the number of bytes in the count. */
2042
2043 buf[0] = 'S';
2044 buf[1] = type;
2045 buf[2] = len + 4 + 1; /* len + 4 byte address + 1 byte checksum */
2046 buf[3] = memaddr >> 24;
2047 buf[4] = memaddr >> 16;
2048 buf[5] = memaddr >> 8;
2049 buf[6] = memaddr;
2050 memcpy (&buf[7], myaddr, len);
2051
2052 /* Note that the checksum is calculated on the raw data, not the hexified
2053 data. It includes the length, address and the data portions of the
2054 packet. */
2055
2056 checksum = 0;
2057 buf += 2; /* Point at length byte */
2058 for (i = 0; i < len + 4 + 1; i++)
2059 checksum += *buf++;
2060
2061 *buf = ~checksum;
2062
2063 return len + 8;
2064 }
2065
2066 /* mips_load -- download a file. */
2067
2068 static void
2069 mips_load (file, from_tty)
2070 char *file;
2071 int from_tty;
2072 {
2073 int err;
2074
2075 /* Get the board out of remote debugging mode. */
2076
2077 mips_request ('x', (unsigned int) 0, (unsigned int) 0, &err,
2078 mips_receive_wait, NULL);
2079
2080 if (!mips_expect ("\015\012") || !mips_expect (TARGET_MONITOR_PROMPT))
2081 error ("mips_load: Couldn't get into monitor mode.");
2082
2083 mips_load_srec (file);
2084
2085 mips_initialize ();
2086
2087 /* Finally, make the PC point at the start address */
2088
2089 if (exec_bfd)
2090 write_pc (bfd_get_start_address (exec_bfd));
2091
2092 inferior_pid = 0; /* No process now */
2093
2094 /* This is necessary because many things were based on the PC at the time that
2095 we attached to the monitor, which is no longer valid now that we have loaded
2096 new code (and just changed the PC). Another way to do this might be to call
2097 normal_stop, except that the stack may not be valid, and things would get
2098 horribly confused... */
2099
2100 clear_symtab_users ();
2101 }
2102 \f
2103 /* The target vector. */
2104
2105 struct target_ops mips_ops =
2106 {
2107 "mips", /* to_shortname */
2108 "Remote MIPS debugging over serial line", /* to_longname */
2109 "\
2110 Debug a board using the MIPS remote debugging protocol over a serial line.\n\
2111 The argument is the device it is connected to or, if it contains a colon,\n\
2112 HOST:PORT to access a board over a network", /* to_doc */
2113 mips_open, /* to_open */
2114 mips_close, /* to_close */
2115 NULL, /* to_attach */
2116 mips_detach, /* to_detach */
2117 mips_resume, /* to_resume */
2118 mips_wait, /* to_wait */
2119 mips_fetch_registers, /* to_fetch_registers */
2120 mips_store_registers, /* to_store_registers */
2121 mips_prepare_to_store, /* to_prepare_to_store */
2122 mips_xfer_memory, /* to_xfer_memory */
2123 mips_files_info, /* to_files_info */
2124 mips_insert_breakpoint, /* to_insert_breakpoint */
2125 mips_remove_breakpoint, /* to_remove_breakpoint */
2126 NULL, /* to_terminal_init */
2127 NULL, /* to_terminal_inferior */
2128 NULL, /* to_terminal_ours_for_output */
2129 NULL, /* to_terminal_ours */
2130 NULL, /* to_terminal_info */
2131 mips_kill, /* to_kill */
2132 mips_load, /* to_load */
2133 NULL, /* to_lookup_symbol */
2134 mips_create_inferior, /* to_create_inferior */
2135 mips_mourn_inferior, /* to_mourn_inferior */
2136 NULL, /* to_can_run */
2137 NULL, /* to_notice_signals */
2138 0, /* to_thread_alive */
2139 0, /* to_stop */
2140 process_stratum, /* to_stratum */
2141 NULL, /* to_next */
2142 1, /* to_has_all_memory */
2143 1, /* to_has_memory */
2144 1, /* to_has_stack */
2145 1, /* to_has_registers */
2146 1, /* to_has_execution */
2147 NULL, /* sections */
2148 NULL, /* sections_end */
2149 OPS_MAGIC /* to_magic */
2150 };
2151 \f
2152 void
2153 _initialize_remote_mips ()
2154 {
2155 add_target (&mips_ops);
2156
2157 add_show_from_set (
2158 add_set_cmd ("timeout", no_class, var_zinteger,
2159 (char *) &mips_receive_wait,
2160 "Set timeout in seconds for remote MIPS serial I/O.",
2161 &setlist),
2162 &showlist);
2163
2164 add_show_from_set (
2165 add_set_cmd ("retransmit-timeout", no_class, var_zinteger,
2166 (char *) &mips_retransmit_wait,
2167 "Set retransmit timeout in seconds for remote MIPS serial I/O.\n\
2168 This is the number of seconds to wait for an acknowledgement to a packet\n\
2169 before resending the packet.", &setlist),
2170 &showlist);
2171 }
This page took 0.104155 seconds and 4 git commands to generate.