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