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