* serial.h (SERIAL_SET_TTY_STATE): Comment return value.
[deliverable/binutils-gdb.git] / gdb / remote-mips.c
1 /* Remote debugging interface for MIPS remote debugging protocol.
2 Copyright 1993, 1994 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., 675 Mass Ave, Cambridge, MA 02139, 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 #include <varargs.h>
35 \f
36 /* Prototypes for local functions. */
37
38 static int
39 mips_readchar PARAMS ((int timeout));
40
41 static int
42 mips_receive_header PARAMS ((unsigned char *hdr, int *pgarbage, int ch,
43 int timeout));
44
45 static int
46 mips_receive_trailer PARAMS ((unsigned char *trlr, int *pgarbage, int *pch,
47 int timeout));
48
49 static int mips_cksum PARAMS ((const unsigned char *hdr,
50 const unsigned char *data,
51 int len));
52
53 static void
54 mips_send_packet PARAMS ((const char *s, int get_ack));
55
56 static int mips_receive_packet PARAMS ((char *buff, int throw_error,
57 int timeout));
58
59 static int
60 mips_request PARAMS ((char cmd, unsigned int addr, unsigned int data,
61 int *perr, int timeout));
62
63 static void
64 mips_initialize PARAMS ((void));
65
66 static void
67 mips_open PARAMS ((char *name, int from_tty));
68
69 static void
70 mips_close PARAMS ((int quitting));
71
72 static void
73 mips_detach PARAMS ((char *args, int from_tty));
74
75 static void mips_resume PARAMS ((int pid, int step,
76 enum target_signal siggnal));
77
78 static int
79 mips_wait PARAMS ((int pid, struct target_waitstatus *status));
80
81 static int
82 mips_map_regno PARAMS ((int regno));
83
84 static void
85 mips_fetch_registers PARAMS ((int regno));
86
87 static void
88 mips_prepare_to_store PARAMS ((void));
89
90 static void
91 mips_store_registers PARAMS ((int regno));
92
93 static int
94 mips_fetch_word PARAMS ((CORE_ADDR addr));
95
96 static void
97 mips_store_word PARAMS ((CORE_ADDR addr, int value));
98
99 static int
100 mips_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len,
101 int write, struct target_ops *ignore));
102
103 static void
104 mips_files_info PARAMS ((struct target_ops *ignore));
105
106 static void
107 mips_load PARAMS ((char *args, int from_tty));
108
109 static void
110 mips_create_inferior PARAMS ((char *execfile, char *args, char **env));
111
112 static void
113 mips_mourn_inferior PARAMS ((void));
114
115 /* A forward declaration. */
116 extern struct target_ops mips_ops;
117 \f
118 /* The MIPS remote debugging interface is built on top of a simple
119 packet protocol. Each packet is organized as follows:
120
121 SYN The first character is always a SYN (ASCII 026, or ^V). SYN
122 may not appear anywhere else in the packet. Any time a SYN is
123 seen, a new packet should be assumed to have begun.
124
125 TYPE_LEN
126 This byte contains the upper five bits of the logical length
127 of the data section, plus a single bit indicating whether this
128 is a data packet or an acknowledgement. The documentation
129 indicates that this bit is 1 for a data packet, but the actual
130 board uses 1 for an acknowledgement. The value of the byte is
131 0x40 + (ack ? 0x20 : 0) + (len >> 6)
132 (we always have 0 <= len < 1024). Acknowledgement packets do
133 not carry data, and must have a data length of 0.
134
135 LEN1 This byte contains the lower six bits of the logical length of
136 the data section. The value is
137 0x40 + (len & 0x3f)
138
139 SEQ This byte contains the six bit sequence number of the packet.
140 The value is
141 0x40 + seq
142 An acknowlegment packet contains the sequence number of the
143 packet being acknowledged plus 1 module 64. Data packets are
144 transmitted in sequence. There may only be one outstanding
145 unacknowledged data packet at a time. The sequence numbers
146 are independent in each direction. If an acknowledgement for
147 the previous packet is received (i.e., an acknowledgement with
148 the sequence number of the packet just sent) the packet just
149 sent should be retransmitted. If no acknowledgement is
150 received within a timeout period, the packet should be
151 retransmitted. This has an unfortunate failure condition on a
152 high-latency line, as a delayed acknowledgement may lead to an
153 endless series of duplicate packets.
154
155 DATA The actual data bytes follow. The following characters are
156 escaped inline with DLE (ASCII 020, or ^P):
157 SYN (026) DLE S
158 DLE (020) DLE D
159 ^C (003) DLE C
160 ^S (023) DLE s
161 ^Q (021) DLE q
162 The additional DLE characters are not counted in the logical
163 length stored in the TYPE_LEN and LEN1 bytes.
164
165 CSUM1
166 CSUM2
167 CSUM3
168 These bytes contain an 18 bit checksum of the complete
169 contents of the packet excluding the SEQ byte and the
170 CSUM[123] bytes. The checksum is simply the twos complement
171 addition of all the bytes treated as unsigned characters. The
172 values of the checksum bytes are:
173 CSUM1: 0x40 + ((cksum >> 12) & 0x3f)
174 CSUM2: 0x40 + ((cksum >> 6) & 0x3f)
175 CSUM3: 0x40 + (cksum & 0x3f)
176
177 It happens that the MIPS remote debugging protocol always
178 communicates with ASCII strings. Because of this, this
179 implementation doesn't bother to handle the DLE quoting mechanism,
180 since it will never be required. */
181
182 /* The SYN character which starts each packet. */
183 #define SYN '\026'
184
185 /* The 0x40 used to offset each packet (this value ensures that all of
186 the header and trailer bytes, other than SYN, are printable ASCII
187 characters). */
188 #define HDR_OFFSET 0x40
189
190 /* The indices of the bytes in the packet header. */
191 #define HDR_INDX_SYN 0
192 #define HDR_INDX_TYPE_LEN 1
193 #define HDR_INDX_LEN1 2
194 #define HDR_INDX_SEQ 3
195 #define HDR_LENGTH 4
196
197 /* The data/ack bit in the TYPE_LEN header byte. */
198 #define TYPE_LEN_DA_BIT 0x20
199 #define TYPE_LEN_DATA 0
200 #define TYPE_LEN_ACK TYPE_LEN_DA_BIT
201
202 /* How to compute the header bytes. */
203 #define HDR_SET_SYN(data, len, seq) (SYN)
204 #define HDR_SET_TYPE_LEN(data, len, seq) \
205 (HDR_OFFSET \
206 + ((data) ? TYPE_LEN_DATA : TYPE_LEN_ACK) \
207 + (((len) >> 6) & 0x1f))
208 #define HDR_SET_LEN1(data, len, seq) (HDR_OFFSET + ((len) & 0x3f))
209 #define HDR_SET_SEQ(data, len, seq) (HDR_OFFSET + (seq))
210
211 /* Check that a header byte is reasonable. */
212 #define HDR_CHECK(ch) (((ch) & HDR_OFFSET) == HDR_OFFSET)
213
214 /* Get data from the header. These macros evaluate their argument
215 multiple times. */
216 #define HDR_IS_DATA(hdr) \
217 (((hdr)[HDR_INDX_TYPE_LEN] & TYPE_LEN_DA_BIT) == TYPE_LEN_DATA)
218 #define HDR_GET_LEN(hdr) \
219 ((((hdr)[HDR_INDX_TYPE_LEN] & 0x1f) << 6) + (((hdr)[HDR_INDX_LEN1] & 0x3f)))
220 #define HDR_GET_SEQ(hdr) ((hdr)[HDR_INDX_SEQ] & 0x3f)
221
222 /* The maximum data length. */
223 #define DATA_MAXLEN 1023
224
225 /* The trailer offset. */
226 #define TRLR_OFFSET HDR_OFFSET
227
228 /* The indices of the bytes in the packet trailer. */
229 #define TRLR_INDX_CSUM1 0
230 #define TRLR_INDX_CSUM2 1
231 #define TRLR_INDX_CSUM3 2
232 #define TRLR_LENGTH 3
233
234 /* How to compute the trailer bytes. */
235 #define TRLR_SET_CSUM1(cksum) (TRLR_OFFSET + (((cksum) >> 12) & 0x3f))
236 #define TRLR_SET_CSUM2(cksum) (TRLR_OFFSET + (((cksum) >> 6) & 0x3f))
237 #define TRLR_SET_CSUM3(cksum) (TRLR_OFFSET + (((cksum) ) & 0x3f))
238
239 /* Check that a trailer byte is reasonable. */
240 #define TRLR_CHECK(ch) (((ch) & TRLR_OFFSET) == TRLR_OFFSET)
241
242 /* Get data from the trailer. This evaluates its argument multiple
243 times. */
244 #define TRLR_GET_CKSUM(trlr) \
245 ((((trlr)[TRLR_INDX_CSUM1] & 0x3f) << 12) \
246 + (((trlr)[TRLR_INDX_CSUM2] & 0x3f) << 6) \
247 + ((trlr)[TRLR_INDX_CSUM3] & 0x3f))
248
249 /* The sequence number modulos. */
250 #define SEQ_MODULOS (64)
251
252 /* Set to 1 if the target is open. */
253 static int mips_is_open;
254
255 /* Set to 1 while the connection is being initialized. */
256 static int mips_initializing;
257
258 /* The next sequence number to send. */
259 static int mips_send_seq;
260
261 /* The next sequence number we expect to receive. */
262 static int mips_receive_seq;
263
264 /* The time to wait before retransmitting a packet, in seconds. */
265 static int mips_retransmit_wait = 3;
266
267 /* The number of times to try retransmitting a packet before giving up. */
268 static int mips_send_retries = 10;
269
270 /* The number of garbage characters to accept when looking for an
271 SYN for the next packet. */
272 static int mips_syn_garbage = 1050;
273
274 /* The time to wait for a packet, in seconds. */
275 static int mips_receive_wait = 5;
276
277 /* Set if we have sent a packet to the board but have not yet received
278 a reply. */
279 static int mips_need_reply = 0;
280
281 /* Handle used to access serial I/O stream. */
282 static serial_t mips_desc;
283
284 /* Handle low-level error that we can't recover from. Note that just
285 error()ing out from target_wait or some such low-level place will cause
286 all hell to break loose--the rest of GDB will tend to get left in an
287 inconsistent state. */
288
289 static void NORETURN
290 mips_error (va_alist)
291 va_dcl
292 {
293 va_list args;
294 char *string;
295
296 va_start (args);
297 target_terminal_ours ();
298 wrap_here(""); /* Force out any buffered output */
299 gdb_flush (gdb_stdout);
300 if (error_pre_print)
301 fprintf_filtered (gdb_stderr, error_pre_print);
302 string = va_arg (args, char *);
303 vfprintf_filtered (gdb_stderr, string, args);
304 fprintf_filtered (gdb_stderr, "\n");
305 va_end (args);
306
307 /* Clean up in such a way that mips_close won't try to talk to the
308 board (it almost surely won't work since we weren't able to talk to
309 it). */
310 mips_is_open = 0;
311 SERIAL_CLOSE (mips_desc);
312
313 printf_unfiltered ("Ending remote MIPS debugging.\n");
314 target_mourn_inferior ();
315
316 return_to_top_level (RETURN_ERROR);
317 }
318
319 /* Read a character from the remote, aborting on error. Returns
320 SERIAL_TIMEOUT on timeout (since that's what SERIAL_READCHAR
321 returns). FIXME: If we see the string "<IDT>" from the board, then
322 we are debugging on the main console port, and we have somehow
323 dropped out of remote debugging mode. In this case, we
324 automatically go back in to remote debugging mode. This is a hack,
325 put in because I can't find any way for a program running on the
326 remote board to terminate without also ending remote debugging
327 mode. I assume users won't have any trouble with this; for one
328 thing, the IDT documentation generally assumes that the remote
329 debugging port is not the console port. This is, however, very
330 convenient for DejaGnu when you only have one connected serial
331 port. */
332
333 static int
334 mips_readchar (timeout)
335 int timeout;
336 {
337 int ch;
338 static int state = 0;
339 static char nextstate[5] = { '<', 'I', 'D', 'T', '>' };
340
341 ch = SERIAL_READCHAR (mips_desc, timeout);
342 if (ch == SERIAL_EOF)
343 mips_error ("End of file from remote");
344 if (ch == SERIAL_ERROR)
345 mips_error ("Error reading from remote: %s", safe_strerror (errno));
346 if (sr_get_debug () > 1)
347 {
348 if (ch != SERIAL_TIMEOUT)
349 printf_filtered ("Read '%c' %d 0x%x\n", ch, ch, ch);
350 else
351 printf_filtered ("Timed out in read\n");
352 }
353
354 /* If we have seen <IDT> and we either time out, or we see a @
355 (which was echoed from a packet we sent), reset the board as
356 described above. The first character in a packet after the SYN
357 (which is not echoed) is always an @ unless the packet is more
358 than 64 characters long, which ours never are. */
359 if ((ch == SERIAL_TIMEOUT || ch == '@')
360 && state == 5
361 && ! mips_initializing)
362 {
363 if (sr_get_debug () > 0)
364 printf_filtered ("Reinitializing MIPS debugging mode\n");
365 SERIAL_WRITE (mips_desc, "\rdb tty0\r", sizeof "\rdb tty0\r" - 1);
366 sleep (1);
367
368 mips_need_reply = 0;
369 mips_initialize ();
370
371 state = 0;
372
373 mips_error ("Remote board reset");
374 }
375
376 if (ch == nextstate[state])
377 ++state;
378 else
379 state = 0;
380
381 return ch;
382 }
383
384 /* Get a packet header, putting the data in the supplied buffer.
385 PGARBAGE is a pointer to the number of garbage characters received
386 so far. CH is the last character received. Returns 0 for success,
387 or -1 for timeout. */
388
389 static int
390 mips_receive_header (hdr, pgarbage, ch, timeout)
391 unsigned char *hdr;
392 int *pgarbage;
393 int ch;
394 int timeout;
395 {
396 int i;
397
398 while (1)
399 {
400 /* Wait for a SYN. mips_syn_garbage is intended to prevent
401 sitting here indefinitely if the board sends us one garbage
402 character per second. ch may already have a value from the
403 last time through the loop. */
404 while (ch != SYN)
405 {
406 ch = mips_readchar (timeout);
407 if (ch == SERIAL_TIMEOUT)
408 return -1;
409 if (ch != SYN)
410 {
411 /* Printing the character here lets the user of gdb see
412 what the program is outputting, if the debugging is
413 being done on the console port. FIXME: Perhaps this
414 should be filtered? */
415 if (! mips_initializing || sr_get_debug () > 0)
416 {
417 putchar_unfiltered (ch);
418 gdb_flush (gdb_stdout);
419 }
420
421 ++*pgarbage;
422 if (*pgarbage > mips_syn_garbage)
423 mips_error ("Remote debugging protocol failure");
424 }
425 }
426
427 /* Get the packet header following the SYN. */
428 for (i = 1; i < HDR_LENGTH; i++)
429 {
430 ch = mips_readchar (timeout);
431 if (ch == SERIAL_TIMEOUT)
432 return -1;
433
434 /* Make sure this is a header byte. */
435 if (ch == SYN || ! HDR_CHECK (ch))
436 break;
437
438 hdr[i] = ch;
439 }
440
441 /* If we got the complete header, we can return. Otherwise we
442 loop around and keep looking for SYN. */
443 if (i >= HDR_LENGTH)
444 return 0;
445 }
446 }
447
448 /* Get a packet header, putting the data in the supplied buffer.
449 PGARBAGE is a pointer to the number of garbage characters received
450 so far. The last character read is returned in *PCH. Returns 0
451 for success, -1 for timeout, -2 for error. */
452
453 static int
454 mips_receive_trailer (trlr, pgarbage, pch, timeout)
455 unsigned char *trlr;
456 int *pgarbage;
457 int *pch;
458 int timeout;
459 {
460 int i;
461 int ch;
462
463 for (i = 0; i < TRLR_LENGTH; i++)
464 {
465 ch = mips_readchar (timeout);
466 *pch = ch;
467 if (ch == SERIAL_TIMEOUT)
468 return -1;
469 if (! TRLR_CHECK (ch))
470 return -2;
471 trlr[i] = ch;
472 }
473 return 0;
474 }
475
476 /* Get the checksum of a packet. HDR points to the packet header.
477 DATA points to the packet data. LEN is the length of DATA. */
478
479 static int
480 mips_cksum (hdr, data, len)
481 const unsigned char *hdr;
482 const unsigned char *data;
483 int len;
484 {
485 register const unsigned char *p;
486 register int c;
487 register int cksum;
488
489 cksum = 0;
490
491 /* The initial SYN is not included in the checksum. */
492 c = HDR_LENGTH - 1;
493 p = hdr + 1;
494 while (c-- != 0)
495 cksum += *p++;
496
497 c = len;
498 p = data;
499 while (c-- != 0)
500 cksum += *p++;
501
502 return cksum;
503 }
504
505 /* Send a packet containing the given ASCII string. */
506
507 static void
508 mips_send_packet (s, get_ack)
509 const char *s;
510 int get_ack;
511 {
512 unsigned int len;
513 unsigned char *packet;
514 register int cksum;
515 int try;
516
517 len = strlen (s);
518 if (len > DATA_MAXLEN)
519 mips_error ("MIPS protocol data packet too long: %s", s);
520
521 packet = (unsigned char *) alloca (HDR_LENGTH + len + TRLR_LENGTH + 1);
522
523 packet[HDR_INDX_SYN] = HDR_SET_SYN (1, len, mips_send_seq);
524 packet[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (1, len, mips_send_seq);
525 packet[HDR_INDX_LEN1] = HDR_SET_LEN1 (1, len, mips_send_seq);
526 packet[HDR_INDX_SEQ] = HDR_SET_SEQ (1, len, mips_send_seq);
527
528 memcpy (packet + HDR_LENGTH, s, len);
529
530 cksum = mips_cksum (packet, packet + HDR_LENGTH, len);
531 packet[HDR_LENGTH + len + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
532 packet[HDR_LENGTH + len + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
533 packet[HDR_LENGTH + len + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
534
535 /* Increment the sequence number. This will set mips_send_seq to
536 the sequence number we expect in the acknowledgement. */
537 mips_send_seq = (mips_send_seq + 1) % SEQ_MODULOS;
538
539 if (! get_ack)
540 return;
541
542 /* We can only have one outstanding data packet, so we just wait for
543 the acknowledgement here. Keep retransmitting the packet until
544 we get one, or until we've tried too many times. */
545 for (try = 0; try < mips_send_retries; try++)
546 {
547 int garbage;
548 int ch;
549
550 if (sr_get_debug () > 0)
551 {
552 packet[HDR_LENGTH + len + TRLR_LENGTH] = '\0';
553 printf_filtered ("Writing \"%s\"\n", packet + 1);
554 }
555
556 if (SERIAL_WRITE (mips_desc, packet,
557 HDR_LENGTH + len + TRLR_LENGTH) != 0)
558 mips_error ("write to target failed: %s", safe_strerror (errno));
559
560 garbage = 0;
561 ch = 0;
562 while (1)
563 {
564 unsigned char hdr[HDR_LENGTH + 1];
565 unsigned char trlr[TRLR_LENGTH + 1];
566 int err;
567 int seq;
568
569 /* Get the packet header. If we time out, resend the data
570 packet. */
571 err = mips_receive_header (hdr, &garbage, ch, mips_retransmit_wait);
572 if (err != 0)
573 break;
574
575 ch = 0;
576
577 /* If we get a data packet, assume it is a duplicate and
578 ignore it. FIXME: If the acknowledgement is lost, this
579 data packet may be the packet the remote sends after the
580 acknowledgement. */
581 if (HDR_IS_DATA (hdr))
582 continue;
583
584 /* If the length is not 0, this is a garbled packet. */
585 if (HDR_GET_LEN (hdr) != 0)
586 continue;
587
588 /* Get the packet trailer. */
589 err = mips_receive_trailer (trlr, &garbage, &ch,
590 mips_retransmit_wait);
591
592 /* If we timed out, resend the data packet. */
593 if (err == -1)
594 break;
595
596 /* If we got a bad character, reread the header. */
597 if (err != 0)
598 continue;
599
600 /* If the checksum does not match the trailer checksum, this
601 is a bad packet; ignore it. */
602 if (mips_cksum (hdr, (unsigned char *) NULL, 0)
603 != TRLR_GET_CKSUM (trlr))
604 continue;
605
606 if (sr_get_debug () > 0)
607 {
608 hdr[HDR_LENGTH] = '\0';
609 trlr[TRLR_LENGTH] = '\0';
610 printf_filtered ("Got ack %d \"%s%s\"\n",
611 HDR_GET_SEQ (hdr), hdr + 1, trlr);
612 }
613
614 /* If this ack is for the current packet, we're done. */
615 seq = HDR_GET_SEQ (hdr);
616 if (seq == mips_send_seq)
617 return;
618
619 /* If this ack is for the last packet, resend the current
620 packet. */
621 if ((seq + 1) % SEQ_MODULOS == mips_send_seq)
622 break;
623
624 /* Otherwise this is a bad ack; ignore it. Increment the
625 garbage count to ensure that we do not stay in this loop
626 forever. */
627 ++garbage;
628 }
629 }
630
631 mips_error ("Remote did not acknowledge packet");
632 }
633
634 /* Receive and acknowledge a packet, returning the data in BUFF (which
635 should be DATA_MAXLEN + 1 bytes). The protocol documentation
636 implies that only the sender retransmits packets, so this code just
637 waits silently for a packet. It returns the length of the received
638 packet. If THROW_ERROR is nonzero, call error() on errors. If not,
639 don't print an error message and return -1. */
640
641 static int
642 mips_receive_packet (buff, throw_error, timeout)
643 char *buff;
644 int throw_error;
645 int timeout;
646 {
647 int ch;
648 int garbage;
649 int len;
650 unsigned char ack[HDR_LENGTH + TRLR_LENGTH + 1];
651 int cksum;
652
653 ch = 0;
654 garbage = 0;
655 while (1)
656 {
657 unsigned char hdr[HDR_LENGTH];
658 unsigned char trlr[TRLR_LENGTH];
659 int i;
660 int err;
661
662 if (mips_receive_header (hdr, &garbage, ch, timeout) != 0)
663 {
664 if (throw_error)
665 mips_error ("Timed out waiting for remote packet");
666 else
667 return -1;
668 }
669
670 ch = 0;
671
672 /* An acknowledgement is probably a duplicate; ignore it. */
673 if (! HDR_IS_DATA (hdr))
674 {
675 if (sr_get_debug () > 0)
676 printf_filtered ("Ignoring unexpected ACK\n");
677 continue;
678 }
679
680 /* If this is the wrong sequence number, ignore it. */
681 if (HDR_GET_SEQ (hdr) != mips_receive_seq)
682 {
683 if (sr_get_debug () > 0)
684 printf_filtered ("Ignoring sequence number %d (want %d)\n",
685 HDR_GET_SEQ (hdr), mips_receive_seq);
686 continue;
687 }
688
689 len = HDR_GET_LEN (hdr);
690
691 for (i = 0; i < len; i++)
692 {
693 int rch;
694
695 rch = mips_readchar (timeout);
696 if (rch == SYN)
697 {
698 ch = SYN;
699 break;
700 }
701 if (rch == SERIAL_TIMEOUT)
702 {
703 if (throw_error)
704 mips_error ("Timed out waiting for remote packet");
705 else
706 return -1;
707 }
708 buff[i] = rch;
709 }
710
711 if (i < len)
712 {
713 if (sr_get_debug () > 0)
714 printf_filtered ("Got new SYN after %d chars (wanted %d)\n",
715 i, len);
716 continue;
717 }
718
719 err = mips_receive_trailer (trlr, &garbage, &ch, timeout);
720 if (err == -1)
721 {
722 if (throw_error)
723 mips_error ("Timed out waiting for packet");
724 else
725 return -1;
726 }
727 if (err == -2)
728 {
729 if (sr_get_debug () > 0)
730 printf_filtered ("Got SYN when wanted trailer\n");
731 continue;
732 }
733
734 if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr))
735 break;
736
737 if (sr_get_debug () > 0)
738 printf_filtered ("Bad checksum; data %d, trailer %d\n",
739 mips_cksum (hdr, buff, len),
740 TRLR_GET_CKSUM (trlr));
741
742 /* The checksum failed. Send an acknowledgement for the
743 previous packet to tell the remote to resend the packet. */
744 ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
745 ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
746 ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
747 ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
748
749 cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
750
751 ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
752 ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
753 ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
754
755 if (sr_get_debug () > 0)
756 {
757 ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
758 printf_filtered ("Writing ack %d \"%s\"\n", mips_receive_seq,
759 ack + 1);
760 }
761
762 if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
763 {
764 if (throw_error)
765 mips_error ("write to target failed: %s", safe_strerror (errno));
766 else
767 return -1;
768 }
769 }
770
771 if (sr_get_debug () > 0)
772 {
773 buff[len] = '\0';
774 printf_filtered ("Got packet \"%s\"\n", buff);
775 }
776
777 /* We got the packet. Send an acknowledgement. */
778 mips_receive_seq = (mips_receive_seq + 1) % SEQ_MODULOS;
779
780 ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
781 ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
782 ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
783 ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
784
785 cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
786
787 ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
788 ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
789 ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
790
791 if (sr_get_debug () > 0)
792 {
793 ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
794 printf_filtered ("Writing ack %d \"%s\"\n", mips_receive_seq,
795 ack + 1);
796 }
797
798 if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
799 {
800 if (throw_error)
801 mips_error ("write to target failed: %s", safe_strerror (errno));
802 else
803 return -1;
804 }
805
806 return len;
807 }
808 \f
809 /* Optionally send a request to the remote system and optionally wait
810 for the reply. This implements the remote debugging protocol,
811 which is built on top of the packet protocol defined above. Each
812 request has an ADDR argument and a DATA argument. The following
813 requests are defined:
814
815 \0 don't send a request; just wait for a reply
816 i read word from instruction space at ADDR
817 d read word from data space at ADDR
818 I write DATA to instruction space at ADDR
819 D write DATA to data space at ADDR
820 r read register number ADDR
821 R set register number ADDR to value DATA
822 c continue execution (if ADDR != 1, set pc to ADDR)
823 s single step (if ADDR != 1, set pc to ADDR)
824
825 The read requests return the value requested. The write requests
826 return the previous value in the changed location. The execution
827 requests return a UNIX wait value (the approximate signal which
828 caused execution to stop is in the upper eight bits).
829
830 If PERR is not NULL, this function waits for a reply. If an error
831 occurs, it sets *PERR to 1 and sets errno according to what the
832 target board reports. */
833
834 static int
835 mips_request (cmd, addr, data, perr, timeout)
836 char cmd;
837 unsigned int addr;
838 unsigned int data;
839 int *perr;
840 int timeout;
841 {
842 char buff[DATA_MAXLEN + 1];
843 int len;
844 int rpid;
845 char rcmd;
846 int rerrflg;
847 int rresponse;
848
849 if (cmd != '\0')
850 {
851 if (mips_need_reply)
852 fatal ("mips_request: Trying to send command before reply");
853 sprintf (buff, "0x0 %c 0x%x 0x%x", cmd, addr, data);
854 mips_send_packet (buff, 1);
855 mips_need_reply = 1;
856 }
857
858 if (perr == (int *) NULL)
859 return 0;
860
861 if (! mips_need_reply)
862 fatal ("mips_request: Trying to get reply before command");
863
864 mips_need_reply = 0;
865
866 len = mips_receive_packet (buff, 1, timeout);
867 buff[len] = '\0';
868
869 if (sscanf (buff, "0x%x %c 0x%x 0x%x",
870 &rpid, &rcmd, &rerrflg, &rresponse) != 4
871 || (cmd != '\0' && rcmd != cmd))
872 mips_error ("Bad response from remote board");
873
874 if (rerrflg != 0)
875 {
876 *perr = 1;
877
878 /* FIXME: This will returns MIPS errno numbers, which may or may
879 not be the same as errno values used on other systems. If
880 they stick to common errno values, they will be the same, but
881 if they don't, they must be translated. */
882 errno = rresponse;
883
884 return 0;
885 }
886
887 *perr = 0;
888 return rresponse;
889 }
890
891 static void
892 mips_initialize_cleanups (arg)
893 PTR arg;
894 {
895 mips_initializing = 0;
896 }
897
898 /* Initialize a new connection to the MIPS board, and make sure we are
899 really connected. */
900
901 static void
902 mips_initialize ()
903 {
904 char cr;
905 char buff[DATA_MAXLEN + 1];
906 int err;
907 struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL);
908
909 /* What is this code doing here? I don't see any way it can happen, and
910 it might mean mips_initializing didn't get cleared properly.
911 So I'll make it a warning. */
912 if (mips_initializing)
913 {
914 warning ("internal error: mips_initialize called twice");
915 return;
916 }
917
918 mips_initializing = 1;
919
920 mips_send_seq = 0;
921 mips_receive_seq = 0;
922
923 /* The board seems to want to send us a packet. I don't know what
924 it means. The packet seems to be triggered by a carriage return
925 character, although perhaps any character would do. */
926 cr = '\r';
927 SERIAL_WRITE (mips_desc, &cr, 1);
928
929 if (mips_receive_packet (buff, 0, 3) < 0)
930 {
931 char cc;
932
933 /* We did not receive the packet we expected; try resetting the
934 board and trying again. */
935 printf_filtered ("Failed to initialize; trying to reset board\n");
936 cc = '\003';
937 SERIAL_WRITE (mips_desc, &cc, 1);
938 sleep (2);
939 SERIAL_WRITE (mips_desc, "\rdb tty0\r", sizeof "\rdb tty0\r" - 1);
940 sleep (1);
941 cr = '\r';
942 SERIAL_WRITE (mips_desc, &cr, 1);
943 }
944 mips_receive_packet (buff, 1, 3);
945
946 do_cleanups (old_cleanups);
947
948 /* If this doesn't call error, we have connected; we don't care if
949 the request itself succeeds or fails. */
950 mips_request ('r', (unsigned int) 0, (unsigned int) 0, &err,
951 mips_receive_wait);
952 }
953
954 /* Open a connection to the remote board. */
955
956 static void
957 mips_open (name, from_tty)
958 char *name;
959 int from_tty;
960 {
961 if (name == 0)
962 error (
963 "To open a MIPS remote debugging connection, you need to specify what serial\n\
964 device is attached to the target board (e.g., /dev/ttya).");
965
966 target_preopen (from_tty);
967
968 if (mips_is_open)
969 unpush_target (&mips_ops);
970
971 mips_desc = SERIAL_OPEN (name);
972 if (mips_desc == (serial_t) NULL)
973 perror_with_name (name);
974
975 SERIAL_RAW (mips_desc);
976
977 mips_is_open = 1;
978
979 mips_initialize ();
980
981 if (from_tty)
982 printf_unfiltered ("Remote MIPS debugging using %s\n", name);
983 push_target (&mips_ops); /* Switch to using remote target now */
984
985 /* FIXME: Should we call start_remote here? */
986 }
987
988 /* Close a connection to the remote board. */
989
990 static void
991 mips_close (quitting)
992 int quitting;
993 {
994 if (mips_is_open)
995 {
996 int err;
997
998 mips_is_open = 0;
999
1000 /* Get the board out of remote debugging mode. */
1001 mips_request ('x', (unsigned int) 0, (unsigned int) 0, &err,
1002 mips_receive_wait);
1003
1004 SERIAL_CLOSE (mips_desc);
1005 }
1006 }
1007
1008 /* Detach from the remote board. */
1009
1010 static void
1011 mips_detach (args, from_tty)
1012 char *args;
1013 int from_tty;
1014 {
1015 if (args)
1016 error ("Argument given to \"detach\" when remotely debugging.");
1017
1018 pop_target ();
1019 if (from_tty)
1020 printf_unfiltered ("Ending remote MIPS debugging.\n");
1021 }
1022
1023 /* Tell the target board to resume. This does not wait for a reply
1024 from the board. */
1025
1026 static void
1027 mips_resume (pid, step, siggnal)
1028 int pid, step;
1029 enum target_signal siggnal;
1030 {
1031 if (siggnal != TARGET_SIGNAL_0)
1032 warning
1033 ("Can't send signals to a remote system. Try `handle %s ignore'.",
1034 target_signal_to_name (siggnal));
1035
1036 mips_request (step ? 's' : 'c',
1037 (unsigned int) 1,
1038 (unsigned int) 0,
1039 (int *) NULL,
1040 mips_receive_wait);
1041 }
1042
1043 /* Return the signal corresponding to SIG, where SIG is the number which
1044 the MIPS protocol uses for the signal. */
1045 enum target_signal
1046 mips_signal_from_protocol (sig)
1047 int sig;
1048 {
1049 /* We allow a few more signals than the IDT board actually returns, on
1050 the theory that there is at least *some* hope that perhaps the numbering
1051 for these signals is widely agreed upon. */
1052 if (sig <= 0
1053 || sig > 31)
1054 return TARGET_SIGNAL_UNKNOWN;
1055
1056 /* Don't want to use target_signal_from_host because we are converting
1057 from MIPS signal numbers, not host ones. Our internal numbers
1058 match the MIPS numbers for the signals the board can return, which
1059 are: SIGINT, SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP. */
1060 return (enum target_signal) sig;
1061 }
1062
1063 /* Wait until the remote stops, and return a wait status. */
1064
1065 static int
1066 mips_wait (pid, status)
1067 int pid;
1068 struct target_waitstatus *status;
1069 {
1070 int rstatus;
1071 int err;
1072
1073 /* If we have not sent a single step or continue command, then the
1074 board is waiting for us to do something. Return a status
1075 indicating that it is stopped. */
1076 if (! mips_need_reply)
1077 {
1078 status->kind = TARGET_WAITKIND_STOPPED;
1079 status->value.sig = TARGET_SIGNAL_TRAP;
1080 return 0;
1081 }
1082
1083 /* No timeout; we sit here as long as the program continues to execute. */
1084 rstatus = mips_request ('\0', (unsigned int) 0, (unsigned int) 0, &err, -1);
1085 if (err)
1086 mips_error ("Remote failure: %s", safe_strerror (errno));
1087
1088 /* Translate a MIPS waitstatus. We use constants here rather than WTERMSIG
1089 and so on, because the constants we want here are determined by the
1090 MIPS protocol and have nothing to do with what host we are running on. */
1091 if ((rstatus & 0377) == 0)
1092 {
1093 status->kind = TARGET_WAITKIND_EXITED;
1094 status->value.integer = (((rstatus) >> 8) & 0377);
1095 }
1096 else if ((rstatus & 0377) == 0177)
1097 {
1098 status->kind = TARGET_WAITKIND_STOPPED;
1099 status->value.sig = mips_signal_from_protocol (((rstatus) >> 8) & 0377);
1100 }
1101 else
1102 {
1103 status->kind = TARGET_WAITKIND_SIGNALLED;
1104 status->value.sig = mips_signal_from_protocol (rstatus & 0177);
1105 }
1106
1107 return 0;
1108 }
1109
1110 /* We have to map between the register numbers used by gdb and the
1111 register numbers used by the debugging protocol. This function
1112 assumes that we are using tm-mips.h. */
1113
1114 #define REGNO_OFFSET 96
1115
1116 static int
1117 mips_map_regno (regno)
1118 int regno;
1119 {
1120 if (regno < 32)
1121 return regno;
1122 if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32)
1123 return regno - FP0_REGNUM + 32;
1124 switch (regno)
1125 {
1126 case PC_REGNUM:
1127 return REGNO_OFFSET + 0;
1128 case CAUSE_REGNUM:
1129 return REGNO_OFFSET + 1;
1130 case HI_REGNUM:
1131 return REGNO_OFFSET + 2;
1132 case LO_REGNUM:
1133 return REGNO_OFFSET + 3;
1134 case FCRCS_REGNUM:
1135 return REGNO_OFFSET + 4;
1136 case FCRIR_REGNUM:
1137 return REGNO_OFFSET + 5;
1138 default:
1139 /* FIXME: Is there a way to get the status register? */
1140 return 0;
1141 }
1142 }
1143
1144 /* Fetch the remote registers. */
1145
1146 static void
1147 mips_fetch_registers (regno)
1148 int regno;
1149 {
1150 unsigned LONGEST val;
1151 int err;
1152
1153 if (regno == -1)
1154 {
1155 for (regno = 0; regno < NUM_REGS; regno++)
1156 mips_fetch_registers (regno);
1157 return;
1158 }
1159
1160 val = mips_request ('r', (unsigned int) mips_map_regno (regno),
1161 (unsigned int) 0, &err, mips_receive_wait);
1162 if (err)
1163 mips_error ("Can't read register %d: %s", regno, safe_strerror (errno));
1164
1165 {
1166 char buf[MAX_REGISTER_RAW_SIZE];
1167
1168 /* We got the number the register holds, but gdb expects to see a
1169 value in the target byte ordering. */
1170 store_unsigned_integer (buf, REGISTER_RAW_SIZE (regno), val);
1171 supply_register (regno, buf);
1172 }
1173 }
1174
1175 /* Prepare to store registers. The MIPS protocol can store individual
1176 registers, so this function doesn't have to do anything. */
1177
1178 static void
1179 mips_prepare_to_store ()
1180 {
1181 }
1182
1183 /* Store remote register(s). */
1184
1185 static void
1186 mips_store_registers (regno)
1187 int regno;
1188 {
1189 int err;
1190
1191 if (regno == -1)
1192 {
1193 for (regno = 0; regno < NUM_REGS; regno++)
1194 mips_store_registers (regno);
1195 return;
1196 }
1197
1198 mips_request ('R', (unsigned int) mips_map_regno (regno),
1199 (unsigned int) read_register (regno),
1200 &err, mips_receive_wait);
1201 if (err)
1202 mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
1203 }
1204
1205 /* Fetch a word from the target board. */
1206
1207 static int
1208 mips_fetch_word (addr)
1209 CORE_ADDR addr;
1210 {
1211 int val;
1212 int err;
1213
1214 val = mips_request ('d', (unsigned int) addr, (unsigned int) 0, &err,
1215 mips_receive_wait);
1216 if (err)
1217 {
1218 /* Data space failed; try instruction space. */
1219 val = mips_request ('i', (unsigned int) addr, (unsigned int) 0, &err,
1220 mips_receive_wait);
1221 if (err)
1222 mips_error ("Can't read address 0x%x: %s", addr, safe_strerror (errno));
1223 }
1224 return val;
1225 }
1226
1227 /* Store a word to the target board. */
1228
1229 static void
1230 mips_store_word (addr, val)
1231 CORE_ADDR addr;
1232 int val;
1233 {
1234 int err;
1235
1236 mips_request ('D', (unsigned int) addr, (unsigned int) val, &err,
1237 mips_receive_wait);
1238 if (err)
1239 {
1240 /* Data space failed; try instruction space. */
1241 mips_request ('I', (unsigned int) addr, (unsigned int) val, &err,
1242 mips_receive_wait);
1243 if (err)
1244 mips_error ("Can't write address 0x%x: %s", addr, safe_strerror (errno));
1245 }
1246 }
1247
1248 /* Read or write LEN bytes from inferior memory at MEMADDR,
1249 transferring to or from debugger address MYADDR. Write to inferior
1250 if SHOULD_WRITE is nonzero. Returns length of data written or
1251 read; 0 for error. Note that protocol gives us the correct value
1252 for a longword, since it transfers values in ASCII. We want the
1253 byte values, so we have to swap the longword values. */
1254
1255 static int
1256 mips_xfer_memory (memaddr, myaddr, len, write, ignore)
1257 CORE_ADDR memaddr;
1258 char *myaddr;
1259 int len;
1260 int write;
1261 struct target_ops *ignore;
1262 {
1263 register int i;
1264 /* Round starting address down to longword boundary. */
1265 register CORE_ADDR addr = memaddr &~ 3;
1266 /* Round ending address up; get number of longwords that makes. */
1267 register int count = (((memaddr + len) - addr) + 3) / 4;
1268 /* Allocate buffer of that many longwords. */
1269 register char *buffer = alloca (count * 4);
1270
1271 if (write)
1272 {
1273 /* Fill start and end extra bytes of buffer with existing data. */
1274 if (addr != memaddr || len < 4)
1275 {
1276 /* Need part of initial word -- fetch it. */
1277 store_unsigned_integer (&buffer[0], 4, mips_fetch_word (addr));
1278 }
1279
1280 if (count > 1)
1281 {
1282 /* Need part of last word -- fetch it. FIXME: we do this even
1283 if we don't need it. */
1284 store_unsigned_integer (&buffer[(count - 1) * 4], 4,
1285 mips_fetch_word (addr + (count - 1) * 4));
1286 }
1287
1288 /* Copy data to be written over corresponding part of buffer */
1289
1290 memcpy ((char *) buffer + (memaddr & 3), myaddr, len);
1291
1292 /* Write the entire buffer. */
1293
1294 for (i = 0; i < count; i++, addr += 4)
1295 {
1296 mips_store_word (addr, extract_unsigned_integer (&buffer[i*4], 4));
1297 /* FIXME: Do we want a QUIT here? */
1298 }
1299 }
1300 else
1301 {
1302 /* Read all the longwords */
1303 for (i = 0; i < count; i++, addr += 4)
1304 {
1305 store_unsigned_integer (&buffer[i*4], 4, mips_fetch_word (addr));
1306 QUIT;
1307 }
1308
1309 /* Copy appropriate bytes out of the buffer. */
1310 memcpy (myaddr, buffer + (memaddr & 3), len);
1311 }
1312 return len;
1313 }
1314
1315 /* Print info on this target. */
1316
1317 static void
1318 mips_files_info (ignore)
1319 struct target_ops *ignore;
1320 {
1321 printf_unfiltered ("Debugging a MIPS board over a serial line.\n");
1322 }
1323
1324 /* Kill the process running on the board. This will actually only
1325 work if we are doing remote debugging over the console input. I
1326 think that if IDT/sim had the remote debug interrupt enabled on the
1327 right port, we could interrupt the process with a break signal. */
1328
1329 static void
1330 mips_kill ()
1331 {
1332 #if 0
1333 if (mips_is_open)
1334 {
1335 char cc;
1336
1337 /* Send a ^C. */
1338 cc = '\003';
1339 SERIAL_WRITE (mips_desc, &cc, 1);
1340 sleep (1);
1341 target_mourn_inferior ();
1342 }
1343 #endif
1344 }
1345
1346 /* Start running on the target board. */
1347
1348 static void
1349 mips_create_inferior (execfile, args, env)
1350 char *execfile;
1351 char *args;
1352 char **env;
1353 {
1354 CORE_ADDR entry_pt;
1355
1356 if (args && *args)
1357 mips_error ("Can't pass arguments to remote MIPS board.");
1358
1359 if (execfile == 0 || exec_bfd == 0)
1360 mips_error ("No exec file specified");
1361
1362 entry_pt = (CORE_ADDR) bfd_get_start_address (exec_bfd);
1363
1364 init_wait_for_inferior ();
1365
1366 /* FIXME: Should we set inferior_pid here? */
1367
1368 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
1369 }
1370
1371 /* Clean up after a process. Actually nothing to do. */
1372
1373 static void
1374 mips_mourn_inferior ()
1375 {
1376 unpush_target (&mips_ops);
1377 generic_mourn_inferior ();
1378 }
1379 \f
1380 /* The target vector. */
1381
1382 struct target_ops mips_ops =
1383 {
1384 "mips", /* to_shortname */
1385 "Remote MIPS debugging over serial line", /* to_longname */
1386 "\
1387 Debug a board using the MIPS remote debugging protocol over a serial line.\n\
1388 The argument is the device it is connected to or, if it contains a colon,\n\
1389 HOST:PORT to access a board over a network", /* to_doc */
1390 mips_open, /* to_open */
1391 mips_close, /* to_close */
1392 NULL, /* to_attach */
1393 mips_detach, /* to_detach */
1394 mips_resume, /* to_resume */
1395 mips_wait, /* to_wait */
1396 mips_fetch_registers, /* to_fetch_registers */
1397 mips_store_registers, /* to_store_registers */
1398 mips_prepare_to_store, /* to_prepare_to_store */
1399 mips_xfer_memory, /* to_xfer_memory */
1400 mips_files_info, /* to_files_info */
1401 NULL, /* to_insert_breakpoint */
1402 NULL, /* to_remove_breakpoint */
1403 NULL, /* to_terminal_init */
1404 NULL, /* to_terminal_inferior */
1405 NULL, /* to_terminal_ours_for_output */
1406 NULL, /* to_terminal_ours */
1407 NULL, /* to_terminal_info */
1408 mips_kill, /* to_kill */
1409 generic_load, /* to_load */
1410 NULL, /* to_lookup_symbol */
1411 mips_create_inferior, /* to_create_inferior */
1412 mips_mourn_inferior, /* to_mourn_inferior */
1413 NULL, /* to_can_run */
1414 NULL, /* to_notice_signals */
1415 process_stratum, /* to_stratum */
1416 NULL, /* to_next */
1417 1, /* to_has_all_memory */
1418 1, /* to_has_memory */
1419 1, /* to_has_stack */
1420 1, /* to_has_registers */
1421 1, /* to_has_execution */
1422 NULL, /* sections */
1423 NULL, /* sections_end */
1424 OPS_MAGIC /* to_magic */
1425 };
1426 \f
1427 void
1428 _initialize_remote_mips ()
1429 {
1430 add_target (&mips_ops);
1431
1432 add_show_from_set (
1433 add_set_cmd ("timeout", no_class, var_zinteger,
1434 (char *) &mips_receive_wait,
1435 "Set timeout in seconds for remote MIPS serial I/O.",
1436 &setlist),
1437 &showlist);
1438
1439 add_show_from_set (
1440 add_set_cmd ("retransmit-timeout", no_class, var_zinteger,
1441 (char *) &mips_retransmit_wait,
1442 "Set retransmit timeout in seconds for remote MIPS serial I/O.\n\
1443 This is the number of seconds to wait for an acknowledgement to a packet\n\
1444 before resending the packet.", &setlist),
1445 &showlist);
1446 }
This page took 0.08724 seconds and 4 git commands to generate.