* som.h (R_HPPA_COMPLEX): Fix dumb typo.
[deliverable/binutils-gdb.git] / gdb / remote-mips.c
CommitLineData
33742334 1/* Remote debugging interface for MIPS remote debugging protocol.
5efb3899 2 Copyright 1993, 1994 Free Software Foundation, Inc.
33742334
ILT
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"
77641260 25#include "symfile.h"
33742334
ILT
26#include "wait.h"
27#include "gdbcmd.h"
28#include "gdbcore.h"
29#include "serial.h"
30#include "target.h"
66a48870 31#include "remote-utils.h"
33742334
ILT
32
33#include <signal.h>
96e5f161 34#include <varargs.h>
33742334
ILT
35\f
36/* Prototypes for local functions. */
37
38static int
39mips_readchar PARAMS ((int timeout));
40
41static int
42mips_receive_header PARAMS ((unsigned char *hdr, int *pgarbage, int ch,
43 int timeout));
44
45static int
46mips_receive_trailer PARAMS ((unsigned char *trlr, int *pgarbage, int *pch,
47 int timeout));
48
49static int mips_cksum PARAMS ((const unsigned char *hdr,
50 const unsigned char *data,
51 int len));
52
53static void
c2a0f1cb 54mips_send_packet PARAMS ((const char *s, int get_ack));
33742334 55
4c6071f7
JK
56static int mips_receive_packet PARAMS ((char *buff, int throw_error,
57 int timeout));
33742334
ILT
58
59static int
60mips_request PARAMS ((char cmd, unsigned int addr, unsigned int data,
aeb145f8 61 int *perr, int timeout));
33742334 62
c2a0f1cb
ILT
63static void
64mips_initialize PARAMS ((void));
65
33742334
ILT
66static void
67mips_open PARAMS ((char *name, int from_tty));
68
69static void
70mips_close PARAMS ((int quitting));
71
72static void
73mips_detach PARAMS ((char *args, int from_tty));
74
67ac9759
JK
75static void mips_resume PARAMS ((int pid, int step,
76 enum target_signal siggnal));
33742334
ILT
77
78static int
aeb145f8 79mips_wait PARAMS ((int pid, struct target_waitstatus *status));
33742334
ILT
80
81static int
82mips_map_regno PARAMS ((int regno));
83
84static void
85mips_fetch_registers PARAMS ((int regno));
86
87static void
88mips_prepare_to_store PARAMS ((void));
89
90static void
91mips_store_registers PARAMS ((int regno));
92
93static int
94mips_fetch_word PARAMS ((CORE_ADDR addr));
95
aa56c716
JK
96static int
97mips_store_word PARAMS ((CORE_ADDR addr, int value, char *old_contents));
33742334
ILT
98
99static int
100mips_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len,
101 int write, struct target_ops *ignore));
102
103static void
104mips_files_info PARAMS ((struct target_ops *ignore));
105
106static void
107mips_load PARAMS ((char *args, int from_tty));
108
109static void
110mips_create_inferior PARAMS ((char *execfile, char *args, char **env));
111
112static void
113mips_mourn_inferior PARAMS ((void));
114
115/* A forward declaration. */
116extern 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. */
253static int mips_is_open;
254
c2a0f1cb
ILT
255/* Set to 1 while the connection is being initialized. */
256static int mips_initializing;
257
33742334
ILT
258/* The next sequence number to send. */
259static int mips_send_seq;
260
261/* The next sequence number we expect to receive. */
262static int mips_receive_seq;
263
264/* The time to wait before retransmitting a packet, in seconds. */
265static int mips_retransmit_wait = 3;
266
267/* The number of times to try retransmitting a packet before giving up. */
268static int mips_send_retries = 10;
269
270/* The number of garbage characters to accept when looking for an
271 SYN for the next packet. */
272static int mips_syn_garbage = 1050;
273
274/* The time to wait for a packet, in seconds. */
c2a0f1cb 275static int mips_receive_wait = 5;
33742334
ILT
276
277/* Set if we have sent a packet to the board but have not yet received
278 a reply. */
279static int mips_need_reply = 0;
280
1724c671
SG
281/* Handle used to access serial I/O stream. */
282static serial_t mips_desc;
283
4fb192be
JK
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
289static void NORETURN
290mips_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
96e5f161
JK
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");
4fb192be
JK
314 target_mourn_inferior ();
315
316 return_to_top_level (RETURN_ERROR);
317}
318
9a9a88c1
ILT
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. */
33742334
ILT
332
333static int
334mips_readchar (timeout)
335 int timeout;
336{
337 int ch;
c2a0f1cb
ILT
338 static int state = 0;
339 static char nextstate[5] = { '<', 'I', 'D', 'T', '>' };
33742334 340
1724c671
SG
341 ch = SERIAL_READCHAR (mips_desc, timeout);
342 if (ch == SERIAL_EOF)
4fb192be 343 mips_error ("End of file from remote");
1724c671 344 if (ch == SERIAL_ERROR)
4fb192be 345 mips_error ("Error reading from remote: %s", safe_strerror (errno));
66a48870 346 if (sr_get_debug () > 1)
33742334 347 {
47d52968
JK
348 /* Don't use _filtered; we can't deal with a QUIT out of
349 target_wait, and I think this might be called from there. */
1724c671 350 if (ch != SERIAL_TIMEOUT)
47d52968 351 printf_unfiltered ("Read '%c' %d 0x%x\n", ch, ch, ch);
33742334 352 else
47d52968 353 printf_unfiltered ("Timed out in read\n");
33742334 354 }
c2a0f1cb
ILT
355
356 /* If we have seen <IDT> and we either time out, or we see a @
357 (which was echoed from a packet we sent), reset the board as
358 described above. The first character in a packet after the SYN
359 (which is not echoed) is always an @ unless the packet is more
360 than 64 characters long, which ours never are. */
1724c671 361 if ((ch == SERIAL_TIMEOUT || ch == '@')
c2a0f1cb
ILT
362 && state == 5
363 && ! mips_initializing)
364 {
66a48870 365 if (sr_get_debug () > 0)
47d52968
JK
366 /* Don't use _filtered; we can't deal with a QUIT out of
367 target_wait, and I think this might be called from there. */
368 printf_unfiltered ("Reinitializing MIPS debugging mode\n");
7d13174e 369 SERIAL_WRITE (mips_desc, "\015db tty0\015", sizeof "\015db tty0\015" - 1);
c2a0f1cb
ILT
370 sleep (1);
371
372 mips_need_reply = 0;
373 mips_initialize ();
374
375 state = 0;
376
4fb192be 377 mips_error ("Remote board reset");
c2a0f1cb
ILT
378 }
379
380 if (ch == nextstate[state])
381 ++state;
382 else
383 state = 0;
384
33742334
ILT
385 return ch;
386}
387
388/* Get a packet header, putting the data in the supplied buffer.
389 PGARBAGE is a pointer to the number of garbage characters received
390 so far. CH is the last character received. Returns 0 for success,
391 or -1 for timeout. */
392
393static int
394mips_receive_header (hdr, pgarbage, ch, timeout)
395 unsigned char *hdr;
396 int *pgarbage;
397 int ch;
398 int timeout;
399{
400 int i;
401
402 while (1)
403 {
404 /* Wait for a SYN. mips_syn_garbage is intended to prevent
405 sitting here indefinitely if the board sends us one garbage
406 character per second. ch may already have a value from the
407 last time through the loop. */
408 while (ch != SYN)
409 {
410 ch = mips_readchar (timeout);
9a9a88c1 411 if (ch == SERIAL_TIMEOUT)
33742334
ILT
412 return -1;
413 if (ch != SYN)
414 {
415 /* Printing the character here lets the user of gdb see
416 what the program is outputting, if the debugging is
47d52968
JK
417 being done on the console port. Don't use _filtered;
418 we can't deal with a QUIT out of target_wait. */
66a48870 419 if (! mips_initializing || sr_get_debug () > 0)
c2a0f1cb 420 {
7d13174e
SS
421 if (ch < 0x20 && ch != '\n')
422 {
423 putchar_unfiltered ('^');
424 putchar_unfiltered (ch + 0x40);
425 }
426 else
427 putchar_unfiltered (ch);
199b2450 428 gdb_flush (gdb_stdout);
c2a0f1cb 429 }
33742334
ILT
430
431 ++*pgarbage;
432 if (*pgarbage > mips_syn_garbage)
4fb192be 433 mips_error ("Remote debugging protocol failure");
33742334
ILT
434 }
435 }
436
437 /* Get the packet header following the SYN. */
438 for (i = 1; i < HDR_LENGTH; i++)
439 {
440 ch = mips_readchar (timeout);
9a9a88c1 441 if (ch == SERIAL_TIMEOUT)
33742334
ILT
442 return -1;
443
444 /* Make sure this is a header byte. */
445 if (ch == SYN || ! HDR_CHECK (ch))
446 break;
447
448 hdr[i] = ch;
449 }
450
451 /* If we got the complete header, we can return. Otherwise we
452 loop around and keep looking for SYN. */
453 if (i >= HDR_LENGTH)
454 return 0;
455 }
456}
457
458/* Get a packet header, putting the data in the supplied buffer.
459 PGARBAGE is a pointer to the number of garbage characters received
460 so far. The last character read is returned in *PCH. Returns 0
461 for success, -1 for timeout, -2 for error. */
462
463static int
464mips_receive_trailer (trlr, pgarbage, pch, timeout)
465 unsigned char *trlr;
466 int *pgarbage;
467 int *pch;
468 int timeout;
469{
470 int i;
471 int ch;
472
473 for (i = 0; i < TRLR_LENGTH; i++)
474 {
475 ch = mips_readchar (timeout);
476 *pch = ch;
9a9a88c1 477 if (ch == SERIAL_TIMEOUT)
33742334
ILT
478 return -1;
479 if (! TRLR_CHECK (ch))
480 return -2;
481 trlr[i] = ch;
482 }
483 return 0;
484}
485
486/* Get the checksum of a packet. HDR points to the packet header.
487 DATA points to the packet data. LEN is the length of DATA. */
488
489static int
490mips_cksum (hdr, data, len)
491 const unsigned char *hdr;
492 const unsigned char *data;
493 int len;
494{
495 register const unsigned char *p;
496 register int c;
497 register int cksum;
498
499 cksum = 0;
500
501 /* The initial SYN is not included in the checksum. */
502 c = HDR_LENGTH - 1;
503 p = hdr + 1;
504 while (c-- != 0)
505 cksum += *p++;
506
507 c = len;
508 p = data;
509 while (c-- != 0)
510 cksum += *p++;
511
512 return cksum;
513}
514
515/* Send a packet containing the given ASCII string. */
516
517static void
c2a0f1cb 518mips_send_packet (s, get_ack)
33742334 519 const char *s;
c2a0f1cb 520 int get_ack;
33742334
ILT
521{
522 unsigned int len;
523 unsigned char *packet;
524 register int cksum;
525 int try;
526
527 len = strlen (s);
528 if (len > DATA_MAXLEN)
4fb192be 529 mips_error ("MIPS protocol data packet too long: %s", s);
33742334
ILT
530
531 packet = (unsigned char *) alloca (HDR_LENGTH + len + TRLR_LENGTH + 1);
532
533 packet[HDR_INDX_SYN] = HDR_SET_SYN (1, len, mips_send_seq);
534 packet[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (1, len, mips_send_seq);
535 packet[HDR_INDX_LEN1] = HDR_SET_LEN1 (1, len, mips_send_seq);
536 packet[HDR_INDX_SEQ] = HDR_SET_SEQ (1, len, mips_send_seq);
537
538 memcpy (packet + HDR_LENGTH, s, len);
539
540 cksum = mips_cksum (packet, packet + HDR_LENGTH, len);
541 packet[HDR_LENGTH + len + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
542 packet[HDR_LENGTH + len + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
543 packet[HDR_LENGTH + len + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
544
545 /* Increment the sequence number. This will set mips_send_seq to
546 the sequence number we expect in the acknowledgement. */
547 mips_send_seq = (mips_send_seq + 1) % SEQ_MODULOS;
548
c2a0f1cb
ILT
549 if (! get_ack)
550 return;
551
33742334
ILT
552 /* We can only have one outstanding data packet, so we just wait for
553 the acknowledgement here. Keep retransmitting the packet until
554 we get one, or until we've tried too many times. */
555 for (try = 0; try < mips_send_retries; try++)
556 {
557 int garbage;
558 int ch;
559
66a48870 560 if (sr_get_debug () > 0)
33742334 561 {
47d52968
JK
562 /* Don't use _filtered; we can't deal with a QUIT out of
563 target_wait, and I think this might be called from there. */
33742334 564 packet[HDR_LENGTH + len + TRLR_LENGTH] = '\0';
47d52968 565 printf_unfiltered ("Writing \"%s\"\n", packet + 1);
33742334
ILT
566 }
567
9a9a88c1
ILT
568 if (SERIAL_WRITE (mips_desc, packet,
569 HDR_LENGTH + len + TRLR_LENGTH) != 0)
4fb192be 570 mips_error ("write to target failed: %s", safe_strerror (errno));
33742334
ILT
571
572 garbage = 0;
573 ch = 0;
574 while (1)
575 {
576 unsigned char hdr[HDR_LENGTH + 1];
577 unsigned char trlr[TRLR_LENGTH + 1];
578 int err;
579 int seq;
580
581 /* Get the packet header. If we time out, resend the data
582 packet. */
583 err = mips_receive_header (hdr, &garbage, ch, mips_retransmit_wait);
584 if (err != 0)
585 break;
586
587 ch = 0;
588
589 /* If we get a data packet, assume it is a duplicate and
590 ignore it. FIXME: If the acknowledgement is lost, this
591 data packet may be the packet the remote sends after the
592 acknowledgement. */
593 if (HDR_IS_DATA (hdr))
594 continue;
595
596 /* If the length is not 0, this is a garbled packet. */
597 if (HDR_GET_LEN (hdr) != 0)
598 continue;
599
600 /* Get the packet trailer. */
601 err = mips_receive_trailer (trlr, &garbage, &ch,
602 mips_retransmit_wait);
603
604 /* If we timed out, resend the data packet. */
605 if (err == -1)
606 break;
607
608 /* If we got a bad character, reread the header. */
609 if (err != 0)
610 continue;
611
612 /* If the checksum does not match the trailer checksum, this
613 is a bad packet; ignore it. */
614 if (mips_cksum (hdr, (unsigned char *) NULL, 0)
615 != TRLR_GET_CKSUM (trlr))
616 continue;
617
66a48870 618 if (sr_get_debug () > 0)
33742334
ILT
619 {
620 hdr[HDR_LENGTH] = '\0';
621 trlr[TRLR_LENGTH] = '\0';
47d52968
JK
622 /* Don't use _filtered; we can't deal with a QUIT out of
623 target_wait, and I think this might be called from there. */
624 printf_unfiltered ("Got ack %d \"%s%s\"\n",
f63f30e2 625 HDR_GET_SEQ (hdr), hdr + 1, trlr);
33742334
ILT
626 }
627
628 /* If this ack is for the current packet, we're done. */
629 seq = HDR_GET_SEQ (hdr);
630 if (seq == mips_send_seq)
631 return;
632
633 /* If this ack is for the last packet, resend the current
634 packet. */
635 if ((seq + 1) % SEQ_MODULOS == mips_send_seq)
636 break;
637
638 /* Otherwise this is a bad ack; ignore it. Increment the
639 garbage count to ensure that we do not stay in this loop
640 forever. */
641 ++garbage;
642 }
643 }
644
4fb192be 645 mips_error ("Remote did not acknowledge packet");
33742334
ILT
646}
647
648/* Receive and acknowledge a packet, returning the data in BUFF (which
649 should be DATA_MAXLEN + 1 bytes). The protocol documentation
650 implies that only the sender retransmits packets, so this code just
651 waits silently for a packet. It returns the length of the received
96e5f161
JK
652 packet. If THROW_ERROR is nonzero, call error() on errors. If not,
653 don't print an error message and return -1. */
33742334
ILT
654
655static int
4c6071f7 656mips_receive_packet (buff, throw_error, timeout)
33742334 657 char *buff;
96e5f161 658 int throw_error;
4c6071f7 659 int timeout;
33742334
ILT
660{
661 int ch;
662 int garbage;
663 int len;
664 unsigned char ack[HDR_LENGTH + TRLR_LENGTH + 1];
665 int cksum;
666
667 ch = 0;
668 garbage = 0;
669 while (1)
670 {
671 unsigned char hdr[HDR_LENGTH];
672 unsigned char trlr[TRLR_LENGTH];
673 int i;
674 int err;
675
4c6071f7 676 if (mips_receive_header (hdr, &garbage, ch, timeout) != 0)
96e5f161
JK
677 {
678 if (throw_error)
679 mips_error ("Timed out waiting for remote packet");
680 else
681 return -1;
682 }
33742334
ILT
683
684 ch = 0;
685
686 /* An acknowledgement is probably a duplicate; ignore it. */
687 if (! HDR_IS_DATA (hdr))
688 {
47d52968
JK
689 /* Don't use _filtered; we can't deal with a QUIT out of
690 target_wait, and I think this might be called from there. */
66a48870 691 if (sr_get_debug () > 0)
47d52968 692 printf_unfiltered ("Ignoring unexpected ACK\n");
33742334
ILT
693 continue;
694 }
695
696 /* If this is the wrong sequence number, ignore it. */
697 if (HDR_GET_SEQ (hdr) != mips_receive_seq)
698 {
47d52968
JK
699 /* Don't use _filtered; we can't deal with a QUIT out of
700 target_wait, and I think this might be called from there. */
66a48870 701 if (sr_get_debug () > 0)
47d52968 702 printf_unfiltered ("Ignoring sequence number %d (want %d)\n",
33742334
ILT
703 HDR_GET_SEQ (hdr), mips_receive_seq);
704 continue;
705 }
706
707 len = HDR_GET_LEN (hdr);
708
709 for (i = 0; i < len; i++)
710 {
711 int rch;
712
4c6071f7 713 rch = mips_readchar (timeout);
33742334
ILT
714 if (rch == SYN)
715 {
716 ch = SYN;
717 break;
718 }
9a9a88c1 719 if (rch == SERIAL_TIMEOUT)
96e5f161
JK
720 {
721 if (throw_error)
722 mips_error ("Timed out waiting for remote packet");
723 else
724 return -1;
725 }
33742334
ILT
726 buff[i] = rch;
727 }
728
729 if (i < len)
730 {
47d52968
JK
731 /* Don't use _filtered; we can't deal with a QUIT out of
732 target_wait, and I think this might be called from there. */
66a48870 733 if (sr_get_debug () > 0)
47d52968 734 printf_unfiltered ("Got new SYN after %d chars (wanted %d)\n",
33742334
ILT
735 i, len);
736 continue;
737 }
738
4c6071f7 739 err = mips_receive_trailer (trlr, &garbage, &ch, timeout);
33742334 740 if (err == -1)
96e5f161
JK
741 {
742 if (throw_error)
743 mips_error ("Timed out waiting for packet");
744 else
745 return -1;
746 }
33742334
ILT
747 if (err == -2)
748 {
47d52968
JK
749 /* Don't use _filtered; we can't deal with a QUIT out of
750 target_wait, and I think this might be called from there. */
66a48870 751 if (sr_get_debug () > 0)
47d52968 752 printf_unfiltered ("Got SYN when wanted trailer\n");
33742334
ILT
753 continue;
754 }
755
756 if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr))
757 break;
758
66a48870 759 if (sr_get_debug () > 0)
47d52968
JK
760 /* Don't use _filtered; we can't deal with a QUIT out of
761 target_wait, and I think this might be called from there. */
762 printf_unfiltered ("Bad checksum; data %d, trailer %d\n",
33742334
ILT
763 mips_cksum (hdr, buff, len),
764 TRLR_GET_CKSUM (trlr));
765
766 /* The checksum failed. Send an acknowledgement for the
767 previous packet to tell the remote to resend the packet. */
768 ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
769 ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
770 ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
771 ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
772
773 cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
774
775 ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
776 ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
777 ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
778
66a48870 779 if (sr_get_debug () > 0)
33742334
ILT
780 {
781 ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
47d52968
JK
782 /* Don't use _filtered; we can't deal with a QUIT out of
783 target_wait, and I think this might be called from there. */
784 printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
33742334
ILT
785 ack + 1);
786 }
787
9a9a88c1 788 if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
96e5f161
JK
789 {
790 if (throw_error)
791 mips_error ("write to target failed: %s", safe_strerror (errno));
792 else
793 return -1;
794 }
33742334
ILT
795 }
796
66a48870 797 if (sr_get_debug () > 0)
33742334
ILT
798 {
799 buff[len] = '\0';
47d52968
JK
800 /* Don't use _filtered; we can't deal with a QUIT out of
801 target_wait, and I think this might be called from there. */
802 printf_unfiltered ("Got packet \"%s\"\n", buff);
33742334
ILT
803 }
804
805 /* We got the packet. Send an acknowledgement. */
806 mips_receive_seq = (mips_receive_seq + 1) % SEQ_MODULOS;
807
808 ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
809 ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
810 ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
811 ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
812
813 cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
814
815 ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
816 ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
817 ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
818
66a48870 819 if (sr_get_debug () > 0)
33742334
ILT
820 {
821 ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
47d52968
JK
822 /* Don't use _filtered; we can't deal with a QUIT out of
823 target_wait, and I think this might be called from there. */
824 printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
33742334
ILT
825 ack + 1);
826 }
827
9a9a88c1 828 if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
96e5f161
JK
829 {
830 if (throw_error)
831 mips_error ("write to target failed: %s", safe_strerror (errno));
832 else
833 return -1;
834 }
33742334
ILT
835
836 return len;
837}
838\f
839/* Optionally send a request to the remote system and optionally wait
840 for the reply. This implements the remote debugging protocol,
841 which is built on top of the packet protocol defined above. Each
842 request has an ADDR argument and a DATA argument. The following
843 requests are defined:
844
845 \0 don't send a request; just wait for a reply
846 i read word from instruction space at ADDR
847 d read word from data space at ADDR
848 I write DATA to instruction space at ADDR
849 D write DATA to data space at ADDR
850 r read register number ADDR
851 R set register number ADDR to value DATA
852 c continue execution (if ADDR != 1, set pc to ADDR)
853 s single step (if ADDR != 1, set pc to ADDR)
854
855 The read requests return the value requested. The write requests
856 return the previous value in the changed location. The execution
857 requests return a UNIX wait value (the approximate signal which
858 caused execution to stop is in the upper eight bits).
859
860 If PERR is not NULL, this function waits for a reply. If an error
861 occurs, it sets *PERR to 1 and sets errno according to what the
862 target board reports. */
863
864static int
4c6071f7 865mips_request (cmd, addr, data, perr, timeout)
33742334
ILT
866 char cmd;
867 unsigned int addr;
868 unsigned int data;
869 int *perr;
4c6071f7 870 int timeout;
33742334
ILT
871{
872 char buff[DATA_MAXLEN + 1];
873 int len;
874 int rpid;
875 char rcmd;
876 int rerrflg;
877 int rresponse;
878
879 if (cmd != '\0')
880 {
881 if (mips_need_reply)
882 fatal ("mips_request: Trying to send command before reply");
883 sprintf (buff, "0x0 %c 0x%x 0x%x", cmd, addr, data);
c2a0f1cb 884 mips_send_packet (buff, 1);
33742334
ILT
885 mips_need_reply = 1;
886 }
887
888 if (perr == (int *) NULL)
889 return 0;
890
891 if (! mips_need_reply)
892 fatal ("mips_request: Trying to get reply before command");
893
894 mips_need_reply = 0;
895
4c6071f7 896 len = mips_receive_packet (buff, 1, timeout);
33742334
ILT
897 buff[len] = '\0';
898
899 if (sscanf (buff, "0x%x %c 0x%x 0x%x",
900 &rpid, &rcmd, &rerrflg, &rresponse) != 4
33742334 901 || (cmd != '\0' && rcmd != cmd))
4fb192be 902 mips_error ("Bad response from remote board");
33742334
ILT
903
904 if (rerrflg != 0)
905 {
906 *perr = 1;
907
908 /* FIXME: This will returns MIPS errno numbers, which may or may
909 not be the same as errno values used on other systems. If
910 they stick to common errno values, they will be the same, but
911 if they don't, they must be translated. */
912 errno = rresponse;
913
914 return 0;
915 }
916
917 *perr = 0;
918 return rresponse;
919}
920
864df7e6
JK
921static void
922mips_initialize_cleanups (arg)
923 PTR arg;
924{
925 mips_initializing = 0;
926}
927
c2a0f1cb
ILT
928/* Initialize a new connection to the MIPS board, and make sure we are
929 really connected. */
930
931static void
932mips_initialize ()
933{
934 char cr;
c2a0f1cb
ILT
935 char buff[DATA_MAXLEN + 1];
936 int err;
864df7e6 937 struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL);
c2a0f1cb 938
864df7e6
JK
939 /* What is this code doing here? I don't see any way it can happen, and
940 it might mean mips_initializing didn't get cleared properly.
941 So I'll make it a warning. */
c2a0f1cb 942 if (mips_initializing)
864df7e6
JK
943 {
944 warning ("internal error: mips_initialize called twice");
945 return;
946 }
c2a0f1cb
ILT
947
948 mips_initializing = 1;
949
950 mips_send_seq = 0;
951 mips_receive_seq = 0;
952
953 /* The board seems to want to send us a packet. I don't know what
954 it means. The packet seems to be triggered by a carriage return
955 character, although perhaps any character would do. */
7d13174e
SS
956 cr = '\015';
957 /* FIXME check the result from this */
9a9a88c1 958 SERIAL_WRITE (mips_desc, &cr, 1);
c2a0f1cb 959
4c6071f7 960 if (mips_receive_packet (buff, 0, 3) < 0)
c2a0f1cb
ILT
961 {
962 char cc;
963
c2a0f1cb
ILT
964 /* We did not receive the packet we expected; try resetting the
965 board and trying again. */
966 printf_filtered ("Failed to initialize; trying to reset board\n");
967 cc = '\003';
1724c671 968 SERIAL_WRITE (mips_desc, &cc, 1);
c2a0f1cb 969 sleep (2);
7d13174e 970 SERIAL_WRITE (mips_desc, "\015db tty0\015", sizeof "\015db tty0\015" - 1);
c2a0f1cb 971 sleep (1);
7d13174e 972 cr = '\015';
1724c671 973 SERIAL_WRITE (mips_desc, &cr, 1);
c2a0f1cb 974 }
4c6071f7 975 mips_receive_packet (buff, 1, 3);
c2a0f1cb 976
864df7e6 977 do_cleanups (old_cleanups);
c2a0f1cb
ILT
978
979 /* If this doesn't call error, we have connected; we don't care if
980 the request itself succeeds or fails. */
4c6071f7
JK
981 mips_request ('r', (unsigned int) 0, (unsigned int) 0, &err,
982 mips_receive_wait);
c2a0f1cb
ILT
983}
984
33742334
ILT
985/* Open a connection to the remote board. */
986
987static void
988mips_open (name, from_tty)
989 char *name;
990 int from_tty;
991{
33742334
ILT
992 if (name == 0)
993 error (
994"To open a MIPS remote debugging connection, you need to specify what serial\n\
995device is attached to the target board (e.g., /dev/ttya).");
996
997 target_preopen (from_tty);
998
999 if (mips_is_open)
c2a0f1cb 1000 unpush_target (&mips_ops);
33742334 1001
1724c671 1002 mips_desc = SERIAL_OPEN (name);
9a9a88c1 1003 if (mips_desc == (serial_t) NULL)
33742334
ILT
1004 perror_with_name (name);
1005
1724c671
SG
1006 SERIAL_RAW (mips_desc);
1007
33742334
ILT
1008 mips_is_open = 1;
1009
c2a0f1cb 1010 mips_initialize ();
33742334
ILT
1011
1012 if (from_tty)
199b2450 1013 printf_unfiltered ("Remote MIPS debugging using %s\n", name);
33742334
ILT
1014 push_target (&mips_ops); /* Switch to using remote target now */
1015
c2a0f1cb 1016 /* FIXME: Should we call start_remote here? */
33742334
ILT
1017}
1018
1019/* Close a connection to the remote board. */
1020
1021static void
1022mips_close (quitting)
1023 int quitting;
1024{
1025 if (mips_is_open)
1026 {
c2a0f1cb
ILT
1027 int err;
1028
1029 mips_is_open = 0;
1030
33742334 1031 /* Get the board out of remote debugging mode. */
4c6071f7
JK
1032 mips_request ('x', (unsigned int) 0, (unsigned int) 0, &err,
1033 mips_receive_wait);
c2a0f1cb 1034
1724c671 1035 SERIAL_CLOSE (mips_desc);
33742334
ILT
1036 }
1037}
1038
1039/* Detach from the remote board. */
1040
1041static void
1042mips_detach (args, from_tty)
1043 char *args;
1044 int from_tty;
1045{
1046 if (args)
1047 error ("Argument given to \"detach\" when remotely debugging.");
1048
1049 pop_target ();
1050 if (from_tty)
199b2450 1051 printf_unfiltered ("Ending remote MIPS debugging.\n");
33742334
ILT
1052}
1053
1054/* Tell the target board to resume. This does not wait for a reply
1055 from the board. */
1056
1057static void
25286543 1058mips_resume (pid, step, siggnal)
67ac9759
JK
1059 int pid, step;
1060 enum target_signal siggnal;
33742334 1061{
67ac9759
JK
1062 if (siggnal != TARGET_SIGNAL_0)
1063 warning
1064 ("Can't send signals to a remote system. Try `handle %s ignore'.",
1065 target_signal_to_name (siggnal));
33742334
ILT
1066
1067 mips_request (step ? 's' : 'c',
c2a0f1cb 1068 (unsigned int) 1,
33742334 1069 (unsigned int) 0,
4c6071f7
JK
1070 (int *) NULL,
1071 mips_receive_wait);
33742334
ILT
1072}
1073
f3fe8934
JK
1074/* Return the signal corresponding to SIG, where SIG is the number which
1075 the MIPS protocol uses for the signal. */
1076enum target_signal
1077mips_signal_from_protocol (sig)
1078 int sig;
1079{
1080 /* We allow a few more signals than the IDT board actually returns, on
1081 the theory that there is at least *some* hope that perhaps the numbering
1082 for these signals is widely agreed upon. */
1083 if (sig <= 0
1084 || sig > 31)
1085 return TARGET_SIGNAL_UNKNOWN;
1086
1087 /* Don't want to use target_signal_from_host because we are converting
1088 from MIPS signal numbers, not host ones. Our internal numbers
1089 match the MIPS numbers for the signals the board can return, which
1090 are: SIGINT, SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP. */
1091 return (enum target_signal) sig;
1092}
1093
33742334
ILT
1094/* Wait until the remote stops, and return a wait status. */
1095
1096static int
f7fa951f
DZ
1097mips_wait (pid, status)
1098 int pid;
67ac9759 1099 struct target_waitstatus *status;
33742334
ILT
1100{
1101 int rstatus;
1102 int err;
1103
1104 /* If we have not sent a single step or continue command, then the
1105 board is waiting for us to do something. Return a status
1106 indicating that it is stopped. */
1107 if (! mips_need_reply)
1108 {
67ac9759
JK
1109 status->kind = TARGET_WAITKIND_STOPPED;
1110 status->value.sig = TARGET_SIGNAL_TRAP;
33742334
ILT
1111 return 0;
1112 }
1113
4c6071f7
JK
1114 /* No timeout; we sit here as long as the program continues to execute. */
1115 rstatus = mips_request ('\0', (unsigned int) 0, (unsigned int) 0, &err, -1);
33742334 1116 if (err)
4fb192be 1117 mips_error ("Remote failure: %s", safe_strerror (errno));
33742334 1118
67ac9759
JK
1119 /* Translate a MIPS waitstatus. We use constants here rather than WTERMSIG
1120 and so on, because the constants we want here are determined by the
1121 MIPS protocol and have nothing to do with what host we are running on. */
6397809b 1122 if ((rstatus & 0377) == 0)
67ac9759
JK
1123 {
1124 status->kind = TARGET_WAITKIND_EXITED;
1125 status->value.integer = (((rstatus) >> 8) & 0377);
1126 }
6397809b 1127 else if ((rstatus & 0377) == 0177)
67ac9759 1128 {
5efb3899 1129 status->kind = TARGET_WAITKIND_STOPPED;
f3fe8934 1130 status->value.sig = mips_signal_from_protocol (((rstatus) >> 8) & 0377);
67ac9759
JK
1131 }
1132 else
1133 {
1134 status->kind = TARGET_WAITKIND_SIGNALLED;
f3fe8934 1135 status->value.sig = mips_signal_from_protocol (rstatus & 0177);
67ac9759 1136 }
33742334
ILT
1137
1138 return 0;
1139}
1140
1141/* We have to map between the register numbers used by gdb and the
1142 register numbers used by the debugging protocol. This function
1143 assumes that we are using tm-mips.h. */
1144
1145#define REGNO_OFFSET 96
1146
1147static int
1148mips_map_regno (regno)
1149 int regno;
1150{
1151 if (regno < 32)
1152 return regno;
1153 if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32)
1154 return regno - FP0_REGNUM + 32;
1155 switch (regno)
1156 {
1157 case PC_REGNUM:
1158 return REGNO_OFFSET + 0;
1159 case CAUSE_REGNUM:
1160 return REGNO_OFFSET + 1;
1161 case HI_REGNUM:
1162 return REGNO_OFFSET + 2;
1163 case LO_REGNUM:
1164 return REGNO_OFFSET + 3;
1165 case FCRCS_REGNUM:
1166 return REGNO_OFFSET + 4;
1167 case FCRIR_REGNUM:
1168 return REGNO_OFFSET + 5;
1169 default:
1170 /* FIXME: Is there a way to get the status register? */
1171 return 0;
1172 }
1173}
1174
1175/* Fetch the remote registers. */
1176
1177static void
1178mips_fetch_registers (regno)
1179 int regno;
1180{
f4f0d174 1181 unsigned LONGEST val;
33742334
ILT
1182 int err;
1183
1184 if (regno == -1)
1185 {
1186 for (regno = 0; regno < NUM_REGS; regno++)
1187 mips_fetch_registers (regno);
1188 return;
1189 }
1190
021b10e3
JK
1191 if (regno == FP_REGNUM || regno == ZERO_REGNUM)
1192 /* FP_REGNUM on the mips is a hack which is just supposed to read
1193 zero (see also mips-nat.c). */
1194 val = 0;
1195 else
1196 {
1197 val = mips_request ('r', (unsigned int) mips_map_regno (regno),
1198 (unsigned int) 0, &err, mips_receive_wait);
1199 if (err)
1200 mips_error ("Can't read register %d: %s", regno,
1201 safe_strerror (errno));
1202 }
33742334 1203
34df79fc
JK
1204 {
1205 char buf[MAX_REGISTER_RAW_SIZE];
1206
1207 /* We got the number the register holds, but gdb expects to see a
1208 value in the target byte ordering. */
1209 store_unsigned_integer (buf, REGISTER_RAW_SIZE (regno), val);
1210 supply_register (regno, buf);
1211 }
33742334
ILT
1212}
1213
1214/* Prepare to store registers. The MIPS protocol can store individual
1215 registers, so this function doesn't have to do anything. */
1216
1217static void
1218mips_prepare_to_store ()
1219{
1220}
1221
1222/* Store remote register(s). */
1223
1224static void
1225mips_store_registers (regno)
1226 int regno;
1227{
1228 int err;
1229
1230 if (regno == -1)
1231 {
1232 for (regno = 0; regno < NUM_REGS; regno++)
1233 mips_store_registers (regno);
1234 return;
1235 }
1236
1237 mips_request ('R', (unsigned int) mips_map_regno (regno),
1238 (unsigned int) read_register (regno),
4c6071f7 1239 &err, mips_receive_wait);
33742334 1240 if (err)
4fb192be 1241 mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
33742334
ILT
1242}
1243
1244/* Fetch a word from the target board. */
1245
1246static int
1247mips_fetch_word (addr)
1248 CORE_ADDR addr;
1249{
1250 int val;
1251 int err;
1252
4c6071f7
JK
1253 val = mips_request ('d', (unsigned int) addr, (unsigned int) 0, &err,
1254 mips_receive_wait);
33742334
ILT
1255 if (err)
1256 {
1257 /* Data space failed; try instruction space. */
4c6071f7
JK
1258 val = mips_request ('i', (unsigned int) addr, (unsigned int) 0, &err,
1259 mips_receive_wait);
33742334 1260 if (err)
4fb192be 1261 mips_error ("Can't read address 0x%x: %s", addr, safe_strerror (errno));
33742334
ILT
1262 }
1263 return val;
1264}
1265
aa56c716
JK
1266/* Store a word to the target board. Returns errno code or zero for
1267 success. If OLD_CONTENTS is non-NULL, put the old contents of that
1268 memory location there. */
33742334 1269
aa56c716
JK
1270static int
1271mips_store_word (addr, val, old_contents)
33742334
ILT
1272 CORE_ADDR addr;
1273 int val;
aa56c716 1274 char *old_contents;
33742334
ILT
1275{
1276 int err;
aa56c716 1277 unsigned int oldcontents;
33742334 1278
aa56c716
JK
1279 oldcontents = mips_request ('D', (unsigned int) addr, (unsigned int) val,
1280 &err,
1281 mips_receive_wait);
33742334
ILT
1282 if (err)
1283 {
1284 /* Data space failed; try instruction space. */
aa56c716
JK
1285 oldcontents = mips_request ('I', (unsigned int) addr,
1286 (unsigned int) val, &err,
1287 mips_receive_wait);
33742334 1288 if (err)
aa56c716 1289 return errno;
33742334 1290 }
aa56c716
JK
1291 if (old_contents != NULL)
1292 store_unsigned_integer (old_contents, 4, oldcontents);
1293 return 0;
33742334
ILT
1294}
1295
1296/* Read or write LEN bytes from inferior memory at MEMADDR,
1297 transferring to or from debugger address MYADDR. Write to inferior
1298 if SHOULD_WRITE is nonzero. Returns length of data written or
1299 read; 0 for error. Note that protocol gives us the correct value
1300 for a longword, since it transfers values in ASCII. We want the
1301 byte values, so we have to swap the longword values. */
1302
1303static int
1304mips_xfer_memory (memaddr, myaddr, len, write, ignore)
1305 CORE_ADDR memaddr;
1306 char *myaddr;
1307 int len;
1308 int write;
1309 struct target_ops *ignore;
1310{
1311 register int i;
1312 /* Round starting address down to longword boundary. */
1313 register CORE_ADDR addr = memaddr &~ 3;
1314 /* Round ending address up; get number of longwords that makes. */
1315 register int count = (((memaddr + len) - addr) + 3) / 4;
1316 /* Allocate buffer of that many longwords. */
34df79fc 1317 register char *buffer = alloca (count * 4);
33742334 1318
aa56c716
JK
1319 int status;
1320
33742334
ILT
1321 if (write)
1322 {
1323 /* Fill start and end extra bytes of buffer with existing data. */
1324 if (addr != memaddr || len < 4)
1325 {
1326 /* Need part of initial word -- fetch it. */
34df79fc 1327 store_unsigned_integer (&buffer[0], 4, mips_fetch_word (addr));
33742334
ILT
1328 }
1329
34df79fc 1330 if (count > 1)
33742334 1331 {
34df79fc
JK
1332 /* Need part of last word -- fetch it. FIXME: we do this even
1333 if we don't need it. */
1334 store_unsigned_integer (&buffer[(count - 1) * 4], 4,
1335 mips_fetch_word (addr + (count - 1) * 4));
33742334
ILT
1336 }
1337
1338 /* Copy data to be written over corresponding part of buffer */
1339
1340 memcpy ((char *) buffer + (memaddr & 3), myaddr, len);
1341
1342 /* Write the entire buffer. */
1343
1344 for (i = 0; i < count; i++, addr += 4)
1345 {
aa56c716
JK
1346 status = mips_store_word (addr,
1347 extract_unsigned_integer (&buffer[i*4], 4),
1348 NULL);
7d13174e
SS
1349 /* Report each kilobyte (we download 32-bit words at a time) */
1350 if (i % 256 == 255)
1351 {
1352 printf_unfiltered ("*");
1353 fflush (stdout);
1354 }
aa56c716
JK
1355 if (status)
1356 {
1357 errno = status;
1358 return 0;
1359 }
34df79fc 1360 /* FIXME: Do we want a QUIT here? */
33742334 1361 }
7d13174e
SS
1362 if (count >= 256)
1363 printf_unfiltered ("\n");
33742334
ILT
1364 }
1365 else
1366 {
1367 /* Read all the longwords */
1368 for (i = 0; i < count; i++, addr += 4)
1369 {
34df79fc 1370 store_unsigned_integer (&buffer[i*4], 4, mips_fetch_word (addr));
33742334
ILT
1371 QUIT;
1372 }
1373
1374 /* Copy appropriate bytes out of the buffer. */
34df79fc 1375 memcpy (myaddr, buffer + (memaddr & 3), len);
33742334
ILT
1376 }
1377 return len;
1378}
1379
1380/* Print info on this target. */
1381
1382static void
1383mips_files_info (ignore)
1384 struct target_ops *ignore;
1385{
199b2450 1386 printf_unfiltered ("Debugging a MIPS board over a serial line.\n");
33742334
ILT
1387}
1388
c2a0f1cb
ILT
1389/* Kill the process running on the board. This will actually only
1390 work if we are doing remote debugging over the console input. I
1391 think that if IDT/sim had the remote debug interrupt enabled on the
1392 right port, we could interrupt the process with a break signal. */
1393
1394static void
1395mips_kill ()
1396{
1397#if 0
1398 if (mips_is_open)
1399 {
1400 char cc;
1401
1402 /* Send a ^C. */
1403 cc = '\003';
1724c671 1404 SERIAL_WRITE (mips_desc, &cc, 1);
c2a0f1cb
ILT
1405 sleep (1);
1406 target_mourn_inferior ();
1407 }
1408#endif
1409}
1410
33742334
ILT
1411/* Start running on the target board. */
1412
1413static void
1414mips_create_inferior (execfile, args, env)
1415 char *execfile;
1416 char *args;
1417 char **env;
1418{
1419 CORE_ADDR entry_pt;
1420
33742334 1421 if (args && *args)
aa56c716
JK
1422 {
1423 warning ("\
1424Can't pass arguments to remote MIPS board; arguments ignored.");
1425 /* And don't try to use them on the next "run" command. */
1426 execute_command ("set args", 0);
1427 }
33742334
ILT
1428
1429 if (execfile == 0 || exec_bfd == 0)
aa56c716 1430 error ("No executable file specified");
33742334
ILT
1431
1432 entry_pt = (CORE_ADDR) bfd_get_start_address (exec_bfd);
1433
1434 init_wait_for_inferior ();
1435
c2a0f1cb
ILT
1436 /* FIXME: Should we set inferior_pid here? */
1437
45dc9be3 1438 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
33742334
ILT
1439}
1440
1441/* Clean up after a process. Actually nothing to do. */
1442
1443static void
1444mips_mourn_inferior ()
1445{
71607f9d 1446 unpush_target (&mips_ops);
33742334
ILT
1447 generic_mourn_inferior ();
1448}
1449\f
aa56c716
JK
1450/* We can write a breakpoint and read the shadow contents in one
1451 operation. */
1452
1453/* The IDT board uses an unusual breakpoint value, and sometimes gets
1454 confused when it sees the usual MIPS breakpoint instruction. */
1455
1456#if TARGET_BYTE_ORDER == BIG_ENDIAN
1457static unsigned char break_insn[] = {0, 0, 0x0a, 0x0d};
1458#else
1459static unsigned char break_insn[] = {0x0d, 0x0a, 0, 0};
1460#endif
1461
1462/* Insert a breakpoint on targets that don't have any better breakpoint
1463 support. We read the contents of the target location and stash it,
1464 then overwrite it with a breakpoint instruction. ADDR is the target
1465 location in the target machine. CONTENTS_CACHE is a pointer to
1466 memory allocated for saving the target contents. It is guaranteed
1467 by the caller to be long enough to save sizeof BREAKPOINT bytes (this
1468 is accomplished via BREAKPOINT_MAX). */
1469
1470static int
1471mips_insert_breakpoint (addr, contents_cache)
1472 CORE_ADDR addr;
1473 char *contents_cache;
1474{
1475 int status;
1476
1477 return
1478 mips_store_word (addr,
1479 extract_unsigned_integer (break_insn, sizeof break_insn),
1480 contents_cache);
1481}
1482
1483static int
1484mips_remove_breakpoint (addr, contents_cache)
1485 CORE_ADDR addr;
1486 char *contents_cache;
1487{
1488 return target_write_memory (addr, contents_cache, sizeof break_insn);
1489}
1490\f
33742334
ILT
1491/* The target vector. */
1492
1493struct target_ops mips_ops =
1494{
1495 "mips", /* to_shortname */
1496 "Remote MIPS debugging over serial line", /* to_longname */
796d1fd3
JK
1497 "\
1498Debug a board using the MIPS remote debugging protocol over a serial line.\n\
1499The argument is the device it is connected to or, if it contains a colon,\n\
1500HOST:PORT to access a board over a network", /* to_doc */
33742334
ILT
1501 mips_open, /* to_open */
1502 mips_close, /* to_close */
1503 NULL, /* to_attach */
1504 mips_detach, /* to_detach */
1505 mips_resume, /* to_resume */
1506 mips_wait, /* to_wait */
1507 mips_fetch_registers, /* to_fetch_registers */
1508 mips_store_registers, /* to_store_registers */
1509 mips_prepare_to_store, /* to_prepare_to_store */
1510 mips_xfer_memory, /* to_xfer_memory */
1511 mips_files_info, /* to_files_info */
aa56c716
JK
1512 mips_insert_breakpoint, /* to_insert_breakpoint */
1513 mips_remove_breakpoint, /* to_remove_breakpoint */
33742334
ILT
1514 NULL, /* to_terminal_init */
1515 NULL, /* to_terminal_inferior */
1516 NULL, /* to_terminal_ours_for_output */
1517 NULL, /* to_terminal_ours */
1518 NULL, /* to_terminal_info */
c2a0f1cb 1519 mips_kill, /* to_kill */
6b27ebe8 1520 generic_load, /* to_load */
33742334
ILT
1521 NULL, /* to_lookup_symbol */
1522 mips_create_inferior, /* to_create_inferior */
1523 mips_mourn_inferior, /* to_mourn_inferior */
1524 NULL, /* to_can_run */
1525 NULL, /* to_notice_signals */
1526 process_stratum, /* to_stratum */
1527 NULL, /* to_next */
1528 1, /* to_has_all_memory */
1529 1, /* to_has_memory */
1530 1, /* to_has_stack */
1531 1, /* to_has_registers */
1532 1, /* to_has_execution */
1533 NULL, /* sections */
1534 NULL, /* sections_end */
1535 OPS_MAGIC /* to_magic */
1536};
1537\f
1538void
1539_initialize_remote_mips ()
1540{
1541 add_target (&mips_ops);
1542
0907dc09
ILT
1543 add_show_from_set (
1544 add_set_cmd ("timeout", no_class, var_zinteger,
1545 (char *) &mips_receive_wait,
1546 "Set timeout in seconds for remote MIPS serial I/O.",
1547 &setlist),
1548 &showlist);
1549
1550 add_show_from_set (
1551 add_set_cmd ("retransmit-timeout", no_class, var_zinteger,
1552 (char *) &mips_retransmit_wait,
1553 "Set retransmit timeout in seconds for remote MIPS serial I/O.\n\
1554This is the number of seconds to wait for an acknowledgement to a packet\n\
1555before resending the packet.", &setlist),
1556 &showlist);
33742334 1557}
This page took 0.18113 seconds and 4 git commands to generate.