OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [remote-mips.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* Remote debugging interface for MIPS remote debugging protocol.
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3
   Free Software Foundation, Inc.
4
   Contributed by Cygnus Support.  Written by Ian Lance Taylor
5
   <ian@cygnus.com>.
6
 
7
   This file is part of GDB.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 2 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program; if not, write to the Free Software
21
   Foundation, Inc., 59 Temple Place - Suite 330,
22
   Boston, MA 02111-1307, USA.  */
23
 
24
#include "defs.h"
25
#include "inferior.h"
26
#include "bfd.h"
27
#include "symfile.h"
28
#include "gdbcmd.h"
29
#include "gdbcore.h"
30
#include "serial.h"
31
#include "target.h"
32
#include "remote-utils.h"
33
#include "gdb_string.h"
34
#include "gdb_stat.h"
35
#include "regcache.h"
36
#include <ctype.h>
37
 
38
 
39
/* Breakpoint types.  Values 0, 1, and 2 must agree with the watch
40
   types passed by breakpoint.c to target_insert_watchpoint.
41
   Value 3 is our own invention, and is used for ordinary instruction
42
   breakpoints.  Value 4 is used to mark an unused watchpoint in tables.  */
43
enum break_type
44
  {
45
    BREAK_WRITE,                /* 0 */
46
    BREAK_READ,                 /* 1 */
47
    BREAK_ACCESS,               /* 2 */
48
    BREAK_FETCH,                /* 3 */
49
    BREAK_UNUSED                /* 4 */
50
  };
51
 
52
/* Prototypes for local functions.  */
53
 
54
static int mips_readchar (int timeout);
55
 
56
static int mips_receive_header (unsigned char *hdr, int *pgarbage,
57
                                int ch, int timeout);
58
 
59
static int mips_receive_trailer (unsigned char *trlr, int *pgarbage,
60
                                 int *pch, int timeout);
61
 
62
static int mips_cksum (const unsigned char *hdr,
63
                       const unsigned char *data, int len);
64
 
65
static void mips_send_packet (const char *s, int get_ack);
66
 
67
static void mips_send_command (const char *cmd, int prompt);
68
 
69
static int mips_receive_packet (char *buff, int throw_error, int timeout);
70
 
71
static ULONGEST mips_request (int cmd, ULONGEST addr, ULONGEST data,
72
                              int *perr, int timeout, char *buff);
73
 
74
static void mips_initialize (void);
75
 
76
static void mips_open (char *name, int from_tty);
77
 
78
static void pmon_open (char *name, int from_tty);
79
 
80
static void ddb_open (char *name, int from_tty);
81
 
82
static void lsi_open (char *name, int from_tty);
83
 
84
static void mips_close (int quitting);
85
 
86
static void mips_detach (char *args, int from_tty);
87
 
88
static void mips_resume (ptid_t ptid, int step,
89
                         enum target_signal siggnal);
90
 
91
static ptid_t mips_wait (ptid_t ptid,
92
                               struct target_waitstatus *status);
93
 
94
static int mips_map_regno (int regno);
95
 
96
static void mips_fetch_registers (int regno);
97
 
98
static void mips_prepare_to_store (void);
99
 
100
static void mips_store_registers (int regno);
101
 
102
static unsigned int mips_fetch_word (CORE_ADDR addr);
103
 
104
static int mips_store_word (CORE_ADDR addr, unsigned int value,
105
                            char *old_contents);
106
 
107
static int mips_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
108
                             int write,
109
                             struct mem_attrib *attrib,
110
                             struct target_ops *target);
111
 
112
static void mips_files_info (struct target_ops *ignore);
113
 
114
static void mips_create_inferior (char *execfile, char *args, char **env);
115
 
116
static void mips_mourn_inferior (void);
117
 
118
static int pmon_makeb64 (unsigned long v, char *p, int n, int *chksum);
119
 
120
static int pmon_zeroset (int recsize, char **buff, int *amount,
121
                         unsigned int *chksum);
122
 
123
static int pmon_checkset (int recsize, char **buff, int *value);
124
 
125
static void pmon_make_fastrec (char **outbuf, unsigned char *inbuf,
126
                               int *inptr, int inamount, int *recsize,
127
                               unsigned int *csum, unsigned int *zerofill);
128
 
129
static int pmon_check_ack (char *mesg);
130
 
131
static void pmon_start_download (void);
132
 
133
static void pmon_end_download (int final, int bintotal);
134
 
135
static void pmon_download (char *buffer, int length);
136
 
137
static void pmon_load_fast (char *file);
138
 
139
static void mips_load (char *file, int from_tty);
140
 
141
static int mips_make_srec (char *buffer, int type, CORE_ADDR memaddr,
142
                           unsigned char *myaddr, int len);
143
 
144
static int set_breakpoint (CORE_ADDR addr, int len, enum break_type type);
145
 
146
static int clear_breakpoint (CORE_ADDR addr, int len, enum break_type type);
147
 
148
static int common_breakpoint (int set, CORE_ADDR addr, int len,
149
                              enum break_type type);
150
 
151
/* Forward declarations.  */
152
extern struct target_ops mips_ops;
153
extern struct target_ops pmon_ops;
154
extern struct target_ops ddb_ops;
155
/* *INDENT-OFF* */
156
/* The MIPS remote debugging interface is built on top of a simple
157
   packet protocol.  Each packet is organized as follows:
158
 
159
   SYN  The first character is always a SYN (ASCII 026, or ^V).  SYN
160
   may not appear anywhere else in the packet.  Any time a SYN is
161
   seen, a new packet should be assumed to have begun.
162
 
163
   TYPE_LEN
164
   This byte contains the upper five bits of the logical length
165
   of the data section, plus a single bit indicating whether this
166
   is a data packet or an acknowledgement.  The documentation
167
   indicates that this bit is 1 for a data packet, but the actual
168
   board uses 1 for an acknowledgement.  The value of the byte is
169
   0x40 + (ack ? 0x20 : 0) + (len >> 6)
170
   (we always have 0 <= len < 1024).  Acknowledgement packets do
171
   not carry data, and must have a data length of 0.
172
 
173
   LEN1 This byte contains the lower six bits of the logical length of
174
   the data section.  The value is
175
   0x40 + (len & 0x3f)
176
 
177
   SEQ  This byte contains the six bit sequence number of the packet.
178
   The value is
179
   0x40 + seq
180
   An acknowlegment packet contains the sequence number of the
181
   packet being acknowledged plus 1 modulo 64.  Data packets are
182
   transmitted in sequence.  There may only be one outstanding
183
   unacknowledged data packet at a time.  The sequence numbers
184
   are independent in each direction.  If an acknowledgement for
185
   the previous packet is received (i.e., an acknowledgement with
186
   the sequence number of the packet just sent) the packet just
187
   sent should be retransmitted.  If no acknowledgement is
188
   received within a timeout period, the packet should be
189
   retransmitted.  This has an unfortunate failure condition on a
190
   high-latency line, as a delayed acknowledgement may lead to an
191
   endless series of duplicate packets.
192
 
193
   DATA The actual data bytes follow.  The following characters are
194
   escaped inline with DLE (ASCII 020, or ^P):
195
   SYN (026)    DLE S
196
   DLE (020)    DLE D
197
   ^C  (003)    DLE C
198
   ^S  (023)    DLE s
199
   ^Q  (021)    DLE q
200
   The additional DLE characters are not counted in the logical
201
   length stored in the TYPE_LEN and LEN1 bytes.
202
 
203
   CSUM1
204
   CSUM2
205
   CSUM3
206
   These bytes contain an 18 bit checksum of the complete
207
   contents of the packet excluding the SEQ byte and the
208
   CSUM[123] bytes.  The checksum is simply the twos complement
209
   addition of all the bytes treated as unsigned characters.  The
210
   values of the checksum bytes are:
211
   CSUM1: 0x40 + ((cksum >> 12) & 0x3f)
212
   CSUM2: 0x40 + ((cksum >> 6) & 0x3f)
213
   CSUM3: 0x40 + (cksum & 0x3f)
214
 
215
   It happens that the MIPS remote debugging protocol always
216
   communicates with ASCII strings.  Because of this, this
217
   implementation doesn't bother to handle the DLE quoting mechanism,
218
   since it will never be required.  */
219
/* *INDENT-ON* */
220
 
221
 
222
/* The SYN character which starts each packet.  */
223
#define SYN '\026'
224
 
225
/* The 0x40 used to offset each packet (this value ensures that all of
226
   the header and trailer bytes, other than SYN, are printable ASCII
227
   characters).  */
228
#define HDR_OFFSET 0x40
229
 
230
/* The indices of the bytes in the packet header.  */
231
#define HDR_INDX_SYN 0
232
#define HDR_INDX_TYPE_LEN 1
233
#define HDR_INDX_LEN1 2
234
#define HDR_INDX_SEQ 3
235
#define HDR_LENGTH 4
236
 
237
/* The data/ack bit in the TYPE_LEN header byte.  */
238
#define TYPE_LEN_DA_BIT 0x20
239
#define TYPE_LEN_DATA 0
240
#define TYPE_LEN_ACK TYPE_LEN_DA_BIT
241
 
242
/* How to compute the header bytes.  */
243
#define HDR_SET_SYN(data, len, seq) (SYN)
244
#define HDR_SET_TYPE_LEN(data, len, seq) \
245
  (HDR_OFFSET \
246
   + ((data) ? TYPE_LEN_DATA : TYPE_LEN_ACK) \
247
   + (((len) >> 6) & 0x1f))
248
#define HDR_SET_LEN1(data, len, seq) (HDR_OFFSET + ((len) & 0x3f))
249
#define HDR_SET_SEQ(data, len, seq) (HDR_OFFSET + (seq))
250
 
251
/* Check that a header byte is reasonable.  */
252
#define HDR_CHECK(ch) (((ch) & HDR_OFFSET) == HDR_OFFSET)
253
 
254
/* Get data from the header.  These macros evaluate their argument
255
   multiple times.  */
256
#define HDR_IS_DATA(hdr) \
257
  (((hdr)[HDR_INDX_TYPE_LEN] & TYPE_LEN_DA_BIT) == TYPE_LEN_DATA)
258
#define HDR_GET_LEN(hdr) \
259
  ((((hdr)[HDR_INDX_TYPE_LEN] & 0x1f) << 6) + (((hdr)[HDR_INDX_LEN1] & 0x3f)))
260
#define HDR_GET_SEQ(hdr) ((unsigned int)(hdr)[HDR_INDX_SEQ] & 0x3f)
261
 
262
/* The maximum data length.  */
263
#define DATA_MAXLEN 1023
264
 
265
/* The trailer offset.  */
266
#define TRLR_OFFSET HDR_OFFSET
267
 
268
/* The indices of the bytes in the packet trailer.  */
269
#define TRLR_INDX_CSUM1 0
270
#define TRLR_INDX_CSUM2 1
271
#define TRLR_INDX_CSUM3 2
272
#define TRLR_LENGTH 3
273
 
274
/* How to compute the trailer bytes.  */
275
#define TRLR_SET_CSUM1(cksum) (TRLR_OFFSET + (((cksum) >> 12) & 0x3f))
276
#define TRLR_SET_CSUM2(cksum) (TRLR_OFFSET + (((cksum) >>  6) & 0x3f))
277
#define TRLR_SET_CSUM3(cksum) (TRLR_OFFSET + (((cksum)      ) & 0x3f))
278
 
279
/* Check that a trailer byte is reasonable.  */
280
#define TRLR_CHECK(ch) (((ch) & TRLR_OFFSET) == TRLR_OFFSET)
281
 
282
/* Get data from the trailer.  This evaluates its argument multiple
283
   times.  */
284
#define TRLR_GET_CKSUM(trlr) \
285
  ((((trlr)[TRLR_INDX_CSUM1] & 0x3f) << 12) \
286
   + (((trlr)[TRLR_INDX_CSUM2] & 0x3f) <<  6) \
287
   + ((trlr)[TRLR_INDX_CSUM3] & 0x3f))
288
 
289
/* The sequence number modulos.  */
290
#define SEQ_MODULOS (64)
291
 
292
/* PMON commands to load from the serial port or UDP socket.  */
293
#define LOAD_CMD        "load -b -s tty0\r"
294
#define LOAD_CMD_UDP    "load -b -s udp\r"
295
 
296
/* The target vectors for the four different remote MIPS targets.
297
   These are initialized with code in _initialize_remote_mips instead
298
   of static initializers, to make it easier to extend the target_ops
299
   vector later.  */
300
struct target_ops mips_ops, pmon_ops, ddb_ops, lsi_ops;
301
 
302
enum mips_monitor_type
303
  {
304
    /* IDT/SIM monitor being used: */
305
    MON_IDT,
306
    /* PMON monitor being used: */
307
    MON_PMON,                   /* 3.0.83 [COGENT,EB,FP,NET] Algorithmics Ltd. Nov  9 1995 17:19:50 */
308
    MON_DDB,                    /* 2.7.473 [DDBVR4300,EL,FP,NET] Risq Modular Systems,  Thu Jun 6 09:28:40 PDT 1996 */
309
    MON_LSI,                    /* 4.3.12 [EB,FP], LSI LOGIC Corp. Tue Feb 25 13:22:14 1997 */
310
    /* Last and unused value, for sizing vectors, etc. */
311
    MON_LAST
312
  };
313
static enum mips_monitor_type mips_monitor = MON_LAST;
314
 
315
/* The monitor prompt text.  If the user sets the PMON prompt
316
   to some new value, the GDB `set monitor-prompt' command must also
317
   be used to inform GDB about the expected prompt.  Otherwise, GDB
318
   will not be able to connect to PMON in mips_initialize().
319
   If the `set monitor-prompt' command is not used, the expected
320
   default prompt will be set according the target:
321
   target               prompt
322
   -----                -----
323
   pmon         PMON>
324
   ddb          NEC010>
325
   lsi          PMON>
326
 */
327
static char *mips_monitor_prompt;
328
 
329
/* Set to 1 if the target is open.  */
330
static int mips_is_open;
331
 
332
/* Currently active target description (if mips_is_open == 1) */
333
static struct target_ops *current_ops;
334
 
335
/* Set to 1 while the connection is being initialized.  */
336
static int mips_initializing;
337
 
338
/* Set to 1 while the connection is being brought down.  */
339
static int mips_exiting;
340
 
341
/* The next sequence number to send.  */
342
static unsigned int mips_send_seq;
343
 
344
/* The next sequence number we expect to receive.  */
345
static unsigned int mips_receive_seq;
346
 
347
/* The time to wait before retransmitting a packet, in seconds.  */
348
static int mips_retransmit_wait = 3;
349
 
350
/* The number of times to try retransmitting a packet before giving up.  */
351
static int mips_send_retries = 10;
352
 
353
/* The number of garbage characters to accept when looking for an
354
   SYN for the next packet.  */
355
static int mips_syn_garbage = 10;
356
 
357
/* The time to wait for a packet, in seconds.  */
358
static int mips_receive_wait = 5;
359
 
360
/* Set if we have sent a packet to the board but have not yet received
361
   a reply.  */
362
static int mips_need_reply = 0;
363
 
364
/* Handle used to access serial I/O stream.  */
365
static serial_t mips_desc;
366
 
367
/* UDP handle used to download files to target.  */
368
static serial_t udp_desc;
369
static int udp_in_use;
370
 
371
/* TFTP filename used to download files to DDB board, in the form
372
   host:filename.  */
373
static char *tftp_name;         /* host:filename */
374
static char *tftp_localname;    /* filename portion of above */
375
static int tftp_in_use;
376
static FILE *tftp_file;
377
 
378
/* Counts the number of times the user tried to interrupt the target (usually
379
   via ^C.  */
380
static int interrupt_count;
381
 
382
/* If non-zero, means that the target is running. */
383
static int mips_wait_flag = 0;
384
 
385
/* If non-zero, monitor supports breakpoint commands. */
386
static int monitor_supports_breakpoints = 0;
387
 
388
/* Data cache header.  */
389
 
390
#if 0                           /* not used (yet?) */
391
static DCACHE *mips_dcache;
392
#endif
393
 
394
/* Non-zero means that we've just hit a read or write watchpoint */
395
static int hit_watchpoint;
396
 
397
/* Table of breakpoints/watchpoints (used only on LSI PMON target).
398
   The table is indexed by a breakpoint number, which is an integer
399
   from 0 to 255 returned by the LSI PMON when a breakpoint is set.
400
 */
401
#define MAX_LSI_BREAKPOINTS 256
402
struct lsi_breakpoint_info
403
  {
404
    enum break_type type;       /* type of breakpoint */
405
    CORE_ADDR addr;             /* address of breakpoint */
406
    int len;                    /* length of region being watched */
407
    unsigned long value;        /* value to watch */
408
  }
409
lsi_breakpoints[MAX_LSI_BREAKPOINTS];
410
 
411
/* Error/warning codes returned by LSI PMON for breakpoint commands.
412
   Warning values may be ORed together; error values may not.  */
413
#define W_WARN  0x100           /* This bit is set if the error code is a warning */
414
#define W_MSK   0x101           /* warning: Range feature is supported via mask */
415
#define W_VAL   0x102           /* warning: Value check is not supported in hardware */
416
#define W_QAL   0x104           /* warning: Requested qualifiers are not supported in hardware */
417
 
418
#define E_ERR   0x200           /* This bit is set if the error code is an error */
419
#define E_BPT   0x200           /* error: No such breakpoint number */
420
#define E_RGE   0x201           /* error: Range is not supported */
421
#define E_QAL   0x202           /* error: The requested qualifiers can not be used */
422
#define E_OUT   0x203           /* error: Out of hardware resources */
423
#define E_NON   0x204           /* error: Hardware breakpoint not supported */
424
 
425
struct lsi_error
426
  {
427
    int code;                   /* error code */
428
    char *string;               /* string associated with this code */
429
  };
430
 
431
struct lsi_error lsi_warning_table[] =
432
{
433
  {W_MSK, "Range feature is supported via mask"},
434
  {W_VAL, "Value check is not supported in hardware"},
435
  {W_QAL, "Requested qualifiers are not supported in hardware"},
436
  {0, NULL}
437
};
438
 
439
struct lsi_error lsi_error_table[] =
440
{
441
  {E_BPT, "No such breakpoint number"},
442
  {E_RGE, "Range is not supported"},
443
  {E_QAL, "The requested qualifiers can not be used"},
444
  {E_OUT, "Out of hardware resources"},
445
  {E_NON, "Hardware breakpoint not supported"},
446
  {0, NULL}
447
};
448
 
449
/* Set to 1 with the 'set monitor-warnings' command to enable printing
450
   of warnings returned by PMON when hardware breakpoints are used.  */
451
static int monitor_warnings;
452
 
453
 
454
static void
455
close_ports (void)
456
{
457
  mips_is_open = 0;
458
  SERIAL_CLOSE (mips_desc);
459
 
460
  if (udp_in_use)
461
    {
462
      SERIAL_CLOSE (udp_desc);
463
      udp_in_use = 0;
464
    }
465
  tftp_in_use = 0;
466
}
467
 
468
/* Handle low-level error that we can't recover from.  Note that just
469
   error()ing out from target_wait or some such low-level place will cause
470
   all hell to break loose--the rest of GDB will tend to get left in an
471
   inconsistent state.  */
472
 
473
static NORETURN void
474
mips_error (char *string,...)
475
{
476
  va_list args;
477
 
478
  va_start (args, string);
479
 
480
  target_terminal_ours ();
481
  wrap_here ("");               /* Force out any buffered output */
482
  gdb_flush (gdb_stdout);
483
  if (error_pre_print)
484
    fprintf_filtered (gdb_stderr, error_pre_print);
485
  vfprintf_filtered (gdb_stderr, string, args);
486
  fprintf_filtered (gdb_stderr, "\n");
487
  va_end (args);
488
  gdb_flush (gdb_stderr);
489
 
490
  /* Clean up in such a way that mips_close won't try to talk to the
491
     board (it almost surely won't work since we weren't able to talk to
492
     it).  */
493
  close_ports ();
494
 
495
  printf_unfiltered ("Ending remote MIPS debugging.\n");
496
  target_mourn_inferior ();
497
 
498
  return_to_top_level (RETURN_ERROR);
499
}
500
 
501
/* putc_readable - print a character, displaying non-printable chars in
502
   ^x notation or in hex.  */
503
 
504
static void
505
fputc_readable (int ch, struct ui_file *file)
506
{
507
  if (ch == '\n')
508
    fputc_unfiltered ('\n', file);
509
  else if (ch == '\r')
510
    fprintf_unfiltered (file, "\\r");
511
  else if (ch < 0x20)           /* ASCII control character */
512
    fprintf_unfiltered (file, "^%c", ch + '@');
513
  else if (ch >= 0x7f)          /* non-ASCII characters (rubout or greater) */
514
    fprintf_unfiltered (file, "[%02x]", ch & 0xff);
515
  else
516
    fputc_unfiltered (ch, file);
517
}
518
 
519
 
520
/* puts_readable - print a string, displaying non-printable chars in
521
   ^x notation or in hex.  */
522
 
523
static void
524
fputs_readable (const char *string, struct ui_file *file)
525
{
526
  int c;
527
 
528
  while ((c = *string++) != '\0')
529
    fputc_readable (c, file);
530
}
531
 
532
 
533
/* Wait until STRING shows up in mips_desc.  Returns 1 if successful, else 0 if
534
   timed out.  TIMEOUT specifies timeout value in seconds.
535
 */
536
 
537
int
538
mips_expect_timeout (const char *string, int timeout)
539
{
540
  const char *p = string;
541
 
542
  if (remote_debug)
543
    {
544
      fprintf_unfiltered (gdb_stdlog, "Expected \"");
545
      fputs_readable (string, gdb_stdlog);
546
      fprintf_unfiltered (gdb_stdlog, "\", got \"");
547
    }
548
 
549
  immediate_quit++;
550
  while (1)
551
    {
552
      int c;
553
 
554
/* Must use SERIAL_READCHAR here cuz mips_readchar would get confused if we
555
   were waiting for the mips_monitor_prompt... */
556
 
557
      c = SERIAL_READCHAR (mips_desc, timeout);
558
 
559
      if (c == SERIAL_TIMEOUT)
560
        {
561
          if (remote_debug)
562
            fprintf_unfiltered (gdb_stdlog, "\": FAIL\n");
563
          return 0;
564
        }
565
 
566
      if (remote_debug)
567
        fputc_readable (c, gdb_stdlog);
568
 
569
      if (c == *p++)
570
        {
571
          if (*p == '\0')
572
            {
573
              immediate_quit--;
574
              if (remote_debug)
575
                fprintf_unfiltered (gdb_stdlog, "\": OK\n");
576
              return 1;
577
            }
578
        }
579
      else
580
        {
581
          p = string;
582
          if (c == *p)
583
            p++;
584
        }
585
    }
586
}
587
 
588
/* Wait until STRING shows up in mips_desc.  Returns 1 if successful, else 0 if
589
   timed out.  The timeout value is hard-coded to 2 seconds.  Use
590
   mips_expect_timeout if a different timeout value is needed.
591
 */
592
 
593
int
594
mips_expect (const char *string)
595
{
596
  return mips_expect_timeout (string, remote_timeout);
597
}
598
 
599
/* Read the required number of characters into the given buffer (which
600
   is assumed to be large enough). The only failure is a timeout. */
601
int
602
mips_getstring (char *string, int n)
603
{
604
  char *p = string;
605
  int c;
606
 
607
  immediate_quit++;
608
  while (n > 0)
609
    {
610
      c = SERIAL_READCHAR (mips_desc, remote_timeout);
611
 
612
      if (c == SERIAL_TIMEOUT)
613
        {
614
          fprintf_unfiltered (gdb_stderr,
615
                 "Failed to read %d characters from target (TIMEOUT)\n", n);
616
          immediate_quit--;
617
          return 0;
618
        }
619
 
620
      *p++ = c;
621
      n--;
622
    }
623
 
624
  immediate_quit--;
625
  return 1;
626
}
627
 
628
/* Read a character from the remote, aborting on error.  Returns
629
   SERIAL_TIMEOUT on timeout (since that's what SERIAL_READCHAR
630
   returns).  FIXME: If we see the string mips_monitor_prompt from
631
   the board, then we are debugging on the main console port, and we
632
   have somehow dropped out of remote debugging mode.  In this case,
633
   we automatically go back in to remote debugging mode.  This is a
634
   hack, put in because I can't find any way for a program running on
635
   the remote board to terminate without also ending remote debugging
636
   mode.  I assume users won't have any trouble with this; for one
637
   thing, the IDT documentation generally assumes that the remote
638
   debugging port is not the console port.  This is, however, very
639
   convenient for DejaGnu when you only have one connected serial
640
   port.  */
641
 
642
static int
643
mips_readchar (int timeout)
644
{
645
  int ch;
646
  static int state = 0;
647
  int mips_monitor_prompt_len = strlen (mips_monitor_prompt);
648
 
649
  {
650
    int i;
651
 
652
    i = timeout;
653
    if (i == -1 && watchdog > 0)
654
      i = watchdog;
655
  }
656
 
657
  if (state == mips_monitor_prompt_len)
658
    timeout = 1;
659
  ch = SERIAL_READCHAR (mips_desc, timeout);
660
 
661
  if (ch == SERIAL_TIMEOUT && timeout == -1)    /* Watchdog went off */
662
    {
663
      target_mourn_inferior ();
664
      error ("Watchdog has expired.  Target detached.\n");
665
    }
666
 
667
  if (ch == SERIAL_EOF)
668
    mips_error ("End of file from remote");
669
  if (ch == SERIAL_ERROR)
670
    mips_error ("Error reading from remote: %s", safe_strerror (errno));
671
  if (remote_debug > 1)
672
    {
673
      /* Don't use _filtered; we can't deal with a QUIT out of
674
         target_wait, and I think this might be called from there.  */
675
      if (ch != SERIAL_TIMEOUT)
676
        fprintf_unfiltered (gdb_stdlog, "Read '%c' %d 0x%x\n", ch, ch, ch);
677
      else
678
        fprintf_unfiltered (gdb_stdlog, "Timed out in read\n");
679
    }
680
 
681
  /* If we have seen mips_monitor_prompt and we either time out, or
682
     we see a @ (which was echoed from a packet we sent), reset the
683
     board as described above.  The first character in a packet after
684
     the SYN (which is not echoed) is always an @ unless the packet is
685
     more than 64 characters long, which ours never are.  */
686
  if ((ch == SERIAL_TIMEOUT || ch == '@')
687
      && state == mips_monitor_prompt_len
688
      && !mips_initializing
689
      && !mips_exiting)
690
    {
691
      if (remote_debug > 0)
692
        /* Don't use _filtered; we can't deal with a QUIT out of
693
           target_wait, and I think this might be called from there.  */
694
        fprintf_unfiltered (gdb_stdlog, "Reinitializing MIPS debugging mode\n");
695
 
696
      mips_need_reply = 0;
697
      mips_initialize ();
698
 
699
      state = 0;
700
 
701
      /* At this point, about the only thing we can do is abort the command
702
         in progress and get back to command level as quickly as possible. */
703
 
704
      error ("Remote board reset, debug protocol re-initialized.");
705
    }
706
 
707
  if (ch == mips_monitor_prompt[state])
708
    ++state;
709
  else
710
    state = 0;
711
 
712
  return ch;
713
}
714
 
715
/* Get a packet header, putting the data in the supplied buffer.
716
   PGARBAGE is a pointer to the number of garbage characters received
717
   so far.  CH is the last character received.  Returns 0 for success,
718
   or -1 for timeout.  */
719
 
720
static int
721
mips_receive_header (unsigned char *hdr, int *pgarbage, int ch, int timeout)
722
{
723
  int i;
724
 
725
  while (1)
726
    {
727
      /* Wait for a SYN.  mips_syn_garbage is intended to prevent
728
         sitting here indefinitely if the board sends us one garbage
729
         character per second.  ch may already have a value from the
730
         last time through the loop.  */
731
      while (ch != SYN)
732
        {
733
          ch = mips_readchar (timeout);
734
          if (ch == SERIAL_TIMEOUT)
735
            return -1;
736
          if (ch != SYN)
737
            {
738
              /* Printing the character here lets the user of gdb see
739
                 what the program is outputting, if the debugging is
740
                 being done on the console port.  Don't use _filtered:
741
                 we can't deal with a QUIT out of target_wait and
742
                 buffered target output confuses the user. */
743
              if (!mips_initializing || remote_debug > 0)
744
                {
745
                  if (isprint (ch) || isspace (ch))
746
                    {
747
                      fputc_unfiltered (ch, gdb_stdtarg);
748
                    }
749
                  else
750
                    {
751
                      fputc_readable (ch, gdb_stdtarg);
752
                    }
753
                  gdb_flush (gdb_stdtarg);
754
                }
755
 
756
              /* Only count unprintable characters. */
757
              if (! (isprint (ch) || isspace (ch)))
758
                (*pgarbage) += 1;
759
 
760
              if (mips_syn_garbage > 0
761
                  && *pgarbage > mips_syn_garbage)
762
                mips_error ("Debug protocol failure:  more than %d characters before a sync.",
763
                            mips_syn_garbage);
764
            }
765
        }
766
 
767
      /* Get the packet header following the SYN.  */
768
      for (i = 1; i < HDR_LENGTH; i++)
769
        {
770
          ch = mips_readchar (timeout);
771
          if (ch == SERIAL_TIMEOUT)
772
            return -1;
773
          /* Make sure this is a header byte.  */
774
          if (ch == SYN || !HDR_CHECK (ch))
775
            break;
776
 
777
          hdr[i] = ch;
778
        }
779
 
780
      /* If we got the complete header, we can return.  Otherwise we
781
         loop around and keep looking for SYN.  */
782
      if (i >= HDR_LENGTH)
783
        return 0;
784
    }
785
}
786
 
787
/* Get a packet header, putting the data in the supplied buffer.
788
   PGARBAGE is a pointer to the number of garbage characters received
789
   so far.  The last character read is returned in *PCH.  Returns 0
790
   for success, -1 for timeout, -2 for error.  */
791
 
792
static int
793
mips_receive_trailer (unsigned char *trlr, int *pgarbage, int *pch, int timeout)
794
{
795
  int i;
796
  int ch;
797
 
798
  for (i = 0; i < TRLR_LENGTH; i++)
799
    {
800
      ch = mips_readchar (timeout);
801
      *pch = ch;
802
      if (ch == SERIAL_TIMEOUT)
803
        return -1;
804
      if (!TRLR_CHECK (ch))
805
        return -2;
806
      trlr[i] = ch;
807
    }
808
  return 0;
809
}
810
 
811
/* Get the checksum of a packet.  HDR points to the packet header.
812
   DATA points to the packet data.  LEN is the length of DATA.  */
813
 
814
static int
815
mips_cksum (const unsigned char *hdr, const unsigned char *data, int len)
816
{
817
  register const unsigned char *p;
818
  register int c;
819
  register int cksum;
820
 
821
  cksum = 0;
822
 
823
  /* The initial SYN is not included in the checksum.  */
824
  c = HDR_LENGTH - 1;
825
  p = hdr + 1;
826
  while (c-- != 0)
827
    cksum += *p++;
828
 
829
  c = len;
830
  p = data;
831
  while (c-- != 0)
832
    cksum += *p++;
833
 
834
  return cksum;
835
}
836
 
837
/* Send a packet containing the given ASCII string.  */
838
 
839
static void
840
mips_send_packet (const char *s, int get_ack)
841
{
842
  /* unsigned */ int len;
843
  unsigned char *packet;
844
  register int cksum;
845
  int try;
846
 
847
  len = strlen (s);
848
  if (len > DATA_MAXLEN)
849
    mips_error ("MIPS protocol data packet too long: %s", s);
850
 
851
  packet = (unsigned char *) alloca (HDR_LENGTH + len + TRLR_LENGTH + 1);
852
 
853
  packet[HDR_INDX_SYN] = HDR_SET_SYN (1, len, mips_send_seq);
854
  packet[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (1, len, mips_send_seq);
855
  packet[HDR_INDX_LEN1] = HDR_SET_LEN1 (1, len, mips_send_seq);
856
  packet[HDR_INDX_SEQ] = HDR_SET_SEQ (1, len, mips_send_seq);
857
 
858
  memcpy (packet + HDR_LENGTH, s, len);
859
 
860
  cksum = mips_cksum (packet, packet + HDR_LENGTH, len);
861
  packet[HDR_LENGTH + len + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
862
  packet[HDR_LENGTH + len + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
863
  packet[HDR_LENGTH + len + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
864
 
865
  /* Increment the sequence number.  This will set mips_send_seq to
866
     the sequence number we expect in the acknowledgement.  */
867
  mips_send_seq = (mips_send_seq + 1) % SEQ_MODULOS;
868
 
869
  /* We can only have one outstanding data packet, so we just wait for
870
     the acknowledgement here.  Keep retransmitting the packet until
871
     we get one, or until we've tried too many times.  */
872
  for (try = 0; try < mips_send_retries; try++)
873
    {
874
      int garbage;
875
      int ch;
876
 
877
      if (remote_debug > 0)
878
        {
879
          /* Don't use _filtered; we can't deal with a QUIT out of
880
             target_wait, and I think this might be called from there.  */
881
          packet[HDR_LENGTH + len + TRLR_LENGTH] = '\0';
882
          fprintf_unfiltered (gdb_stdlog, "Writing \"%s\"\n", packet + 1);
883
        }
884
 
885
      if (SERIAL_WRITE (mips_desc, packet,
886
                        HDR_LENGTH + len + TRLR_LENGTH) != 0)
887
        mips_error ("write to target failed: %s", safe_strerror (errno));
888
 
889
      if (!get_ack)
890
        return;
891
 
892
      garbage = 0;
893
      ch = 0;
894
      while (1)
895
        {
896
          unsigned char hdr[HDR_LENGTH + 1];
897
          unsigned char trlr[TRLR_LENGTH + 1];
898
          int err;
899
          unsigned int seq;
900
 
901
          /* Get the packet header.  If we time out, resend the data
902
             packet.  */
903
          err = mips_receive_header (hdr, &garbage, ch, mips_retransmit_wait);
904
          if (err != 0)
905
            break;
906
 
907
          ch = 0;
908
 
909
          /* If we get a data packet, assume it is a duplicate and
910
             ignore it.  FIXME: If the acknowledgement is lost, this
911
             data packet may be the packet the remote sends after the
912
             acknowledgement.  */
913
          if (HDR_IS_DATA (hdr))
914
            {
915
              int i;
916
 
917
              /* Ignore any errors raised whilst attempting to ignore
918
                 packet. */
919
 
920
              len = HDR_GET_LEN (hdr);
921
 
922
              for (i = 0; i < len; i++)
923
                {
924
                  int rch;
925
 
926
                  rch = mips_readchar (remote_timeout);
927
                  if (rch == SYN)
928
                    {
929
                      ch = SYN;
930
                      break;
931
                    }
932
                  if (rch == SERIAL_TIMEOUT)
933
                    break;
934
                  /* ignore the character */
935
                }
936
 
937
              if (i == len)
938
                (void) mips_receive_trailer (trlr, &garbage, &ch,
939
                                             remote_timeout);
940
 
941
              /* We don't bother checking the checksum, or providing an
942
                 ACK to the packet. */
943
              continue;
944
            }
945
 
946
          /* If the length is not 0, this is a garbled packet.  */
947
          if (HDR_GET_LEN (hdr) != 0)
948
            continue;
949
 
950
          /* Get the packet trailer.  */
951
          err = mips_receive_trailer (trlr, &garbage, &ch,
952
                                      mips_retransmit_wait);
953
 
954
          /* If we timed out, resend the data packet.  */
955
          if (err == -1)
956
            break;
957
 
958
          /* If we got a bad character, reread the header.  */
959
          if (err != 0)
960
            continue;
961
 
962
          /* If the checksum does not match the trailer checksum, this
963
             is a bad packet; ignore it.  */
964
          if (mips_cksum (hdr, (unsigned char *) NULL, 0)
965
              != TRLR_GET_CKSUM (trlr))
966
            continue;
967
 
968
          if (remote_debug > 0)
969
            {
970
              hdr[HDR_LENGTH] = '\0';
971
              trlr[TRLR_LENGTH] = '\0';
972
              /* Don't use _filtered; we can't deal with a QUIT out of
973
                 target_wait, and I think this might be called from there.  */
974
              fprintf_unfiltered (gdb_stdlog, "Got ack %d \"%s%s\"\n",
975
                                  HDR_GET_SEQ (hdr), hdr + 1, trlr);
976
            }
977
 
978
          /* If this ack is for the current packet, we're done.  */
979
          seq = HDR_GET_SEQ (hdr);
980
          if (seq == mips_send_seq)
981
            return;
982
 
983
          /* If this ack is for the last packet, resend the current
984
             packet.  */
985
          if ((seq + 1) % SEQ_MODULOS == mips_send_seq)
986
            break;
987
 
988
          /* Otherwise this is a bad ack; ignore it.  Increment the
989
             garbage count to ensure that we do not stay in this loop
990
             forever.  */
991
          ++garbage;
992
        }
993
    }
994
 
995
  mips_error ("Remote did not acknowledge packet");
996
}
997
 
998
/* Receive and acknowledge a packet, returning the data in BUFF (which
999
   should be DATA_MAXLEN + 1 bytes).  The protocol documentation
1000
   implies that only the sender retransmits packets, so this code just
1001
   waits silently for a packet.  It returns the length of the received
1002
   packet.  If THROW_ERROR is nonzero, call error() on errors.  If not,
1003
   don't print an error message and return -1.  */
1004
 
1005
static int
1006
mips_receive_packet (char *buff, int throw_error, int timeout)
1007
{
1008
  int ch;
1009
  int garbage;
1010
  int len;
1011
  unsigned char ack[HDR_LENGTH + TRLR_LENGTH + 1];
1012
  int cksum;
1013
 
1014
  ch = 0;
1015
  garbage = 0;
1016
  while (1)
1017
    {
1018
      unsigned char hdr[HDR_LENGTH];
1019
      unsigned char trlr[TRLR_LENGTH];
1020
      int i;
1021
      int err;
1022
 
1023
      if (mips_receive_header (hdr, &garbage, ch, timeout) != 0)
1024
        {
1025
          if (throw_error)
1026
            mips_error ("Timed out waiting for remote packet");
1027
          else
1028
            return -1;
1029
        }
1030
 
1031
      ch = 0;
1032
 
1033
      /* An acknowledgement is probably a duplicate; ignore it.  */
1034
      if (!HDR_IS_DATA (hdr))
1035
        {
1036
          len = HDR_GET_LEN (hdr);
1037
          /* Check if the length is valid for an ACK, we may aswell
1038
             try and read the remainder of the packet: */
1039
          if (len == 0)
1040
            {
1041
              /* Ignore the error condition, since we are going to
1042
                 ignore the packet anyway. */
1043
              (void) mips_receive_trailer (trlr, &garbage, &ch, timeout);
1044
            }
1045
          /* Don't use _filtered; we can't deal with a QUIT out of
1046
             target_wait, and I think this might be called from there.  */
1047
          if (remote_debug > 0)
1048
            fprintf_unfiltered (gdb_stdlog, "Ignoring unexpected ACK\n");
1049
          continue;
1050
        }
1051
 
1052
      len = HDR_GET_LEN (hdr);
1053
      for (i = 0; i < len; i++)
1054
        {
1055
          int rch;
1056
 
1057
          rch = mips_readchar (timeout);
1058
          if (rch == SYN)
1059
            {
1060
              ch = SYN;
1061
              break;
1062
            }
1063
          if (rch == SERIAL_TIMEOUT)
1064
            {
1065
              if (throw_error)
1066
                mips_error ("Timed out waiting for remote packet");
1067
              else
1068
                return -1;
1069
            }
1070
          buff[i] = rch;
1071
        }
1072
 
1073
      if (i < len)
1074
        {
1075
          /* Don't use _filtered; we can't deal with a QUIT out of
1076
             target_wait, and I think this might be called from there.  */
1077
          if (remote_debug > 0)
1078
            fprintf_unfiltered (gdb_stdlog,
1079
                                "Got new SYN after %d chars (wanted %d)\n",
1080
                                i, len);
1081
          continue;
1082
        }
1083
 
1084
      err = mips_receive_trailer (trlr, &garbage, &ch, timeout);
1085
      if (err == -1)
1086
        {
1087
          if (throw_error)
1088
            mips_error ("Timed out waiting for packet");
1089
          else
1090
            return -1;
1091
        }
1092
      if (err == -2)
1093
        {
1094
          /* Don't use _filtered; we can't deal with a QUIT out of
1095
             target_wait, and I think this might be called from there.  */
1096
          if (remote_debug > 0)
1097
            fprintf_unfiltered (gdb_stdlog, "Got SYN when wanted trailer\n");
1098
          continue;
1099
        }
1100
 
1101
      /* If this is the wrong sequence number, ignore it.  */
1102
      if (HDR_GET_SEQ (hdr) != mips_receive_seq)
1103
        {
1104
          /* Don't use _filtered; we can't deal with a QUIT out of
1105
             target_wait, and I think this might be called from there.  */
1106
          if (remote_debug > 0)
1107
            fprintf_unfiltered (gdb_stdlog,
1108
                                "Ignoring sequence number %d (want %d)\n",
1109
                                HDR_GET_SEQ (hdr), mips_receive_seq);
1110
          continue;
1111
        }
1112
 
1113
      if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr))
1114
        break;
1115
 
1116
      if (remote_debug > 0)
1117
        /* Don't use _filtered; we can't deal with a QUIT out of
1118
           target_wait, and I think this might be called from there.  */
1119
        printf_unfiltered ("Bad checksum; data %d, trailer %d\n",
1120
                           mips_cksum (hdr, buff, len),
1121
                           TRLR_GET_CKSUM (trlr));
1122
 
1123
      /* The checksum failed.  Send an acknowledgement for the
1124
         previous packet to tell the remote to resend the packet.  */
1125
      ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
1126
      ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
1127
      ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
1128
      ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
1129
 
1130
      cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
1131
 
1132
      ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
1133
      ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
1134
      ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
1135
 
1136
      if (remote_debug > 0)
1137
        {
1138
          ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
1139
          /* Don't use _filtered; we can't deal with a QUIT out of
1140
             target_wait, and I think this might be called from there.  */
1141
          printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
1142
                             ack + 1);
1143
        }
1144
 
1145
      if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
1146
        {
1147
          if (throw_error)
1148
            mips_error ("write to target failed: %s", safe_strerror (errno));
1149
          else
1150
            return -1;
1151
        }
1152
    }
1153
 
1154
  if (remote_debug > 0)
1155
    {
1156
      buff[len] = '\0';
1157
      /* Don't use _filtered; we can't deal with a QUIT out of
1158
         target_wait, and I think this might be called from there.  */
1159
      printf_unfiltered ("Got packet \"%s\"\n", buff);
1160
    }
1161
 
1162
  /* We got the packet.  Send an acknowledgement.  */
1163
  mips_receive_seq = (mips_receive_seq + 1) % SEQ_MODULOS;
1164
 
1165
  ack[HDR_INDX_SYN] = HDR_SET_SYN (0, 0, mips_receive_seq);
1166
  ack[HDR_INDX_TYPE_LEN] = HDR_SET_TYPE_LEN (0, 0, mips_receive_seq);
1167
  ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq);
1168
  ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq);
1169
 
1170
  cksum = mips_cksum (ack, (unsigned char *) NULL, 0);
1171
 
1172
  ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum);
1173
  ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
1174
  ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
1175
 
1176
  if (remote_debug > 0)
1177
    {
1178
      ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
1179
      /* Don't use _filtered; we can't deal with a QUIT out of
1180
         target_wait, and I think this might be called from there.  */
1181
      printf_unfiltered ("Writing ack %d \"%s\"\n", mips_receive_seq,
1182
                         ack + 1);
1183
    }
1184
 
1185
  if (SERIAL_WRITE (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
1186
    {
1187
      if (throw_error)
1188
        mips_error ("write to target failed: %s", safe_strerror (errno));
1189
      else
1190
        return -1;
1191
    }
1192
 
1193
  return len;
1194
}
1195
 
1196
/* Optionally send a request to the remote system and optionally wait
1197
   for the reply.  This implements the remote debugging protocol,
1198
   which is built on top of the packet protocol defined above.  Each
1199
   request has an ADDR argument and a DATA argument.  The following
1200
   requests are defined:
1201
 
1202
   \0   don't send a request; just wait for a reply
1203
   i    read word from instruction space at ADDR
1204
   d    read word from data space at ADDR
1205
   I    write DATA to instruction space at ADDR
1206
   D    write DATA to data space at ADDR
1207
   r    read register number ADDR
1208
   R    set register number ADDR to value DATA
1209
   c    continue execution (if ADDR != 1, set pc to ADDR)
1210
   s    single step (if ADDR != 1, set pc to ADDR)
1211
 
1212
   The read requests return the value requested.  The write requests
1213
   return the previous value in the changed location.  The execution
1214
   requests return a UNIX wait value (the approximate signal which
1215
   caused execution to stop is in the upper eight bits).
1216
 
1217
   If PERR is not NULL, this function waits for a reply.  If an error
1218
   occurs, it sets *PERR to 1 and sets errno according to what the
1219
   target board reports.  */
1220
 
1221
static ULONGEST
1222
mips_request (int cmd,
1223
              ULONGEST addr,
1224
              ULONGEST data,
1225
              int *perr,
1226
              int timeout,
1227
              char *buff)
1228
{
1229
  char myBuff[DATA_MAXLEN + 1];
1230
  int len;
1231
  int rpid;
1232
  char rcmd;
1233
  int rerrflg;
1234
  unsigned long rresponse;
1235
 
1236
  if (buff == (char *) NULL)
1237
    buff = myBuff;
1238
 
1239
  if (cmd != '\0')
1240
    {
1241
      if (mips_need_reply)
1242
        internal_error (__FILE__, __LINE__,
1243
                        "mips_request: Trying to send command before reply");
1244
      sprintf (buff, "0x0 %c 0x%s 0x%s", cmd, paddr_nz (addr), paddr_nz (data));
1245
      mips_send_packet (buff, 1);
1246
      mips_need_reply = 1;
1247
    }
1248
 
1249
  if (perr == (int *) NULL)
1250
    return 0;
1251
 
1252
  if (!mips_need_reply)
1253
    internal_error (__FILE__, __LINE__,
1254
                    "mips_request: Trying to get reply before command");
1255
 
1256
  mips_need_reply = 0;
1257
 
1258
  len = mips_receive_packet (buff, 1, timeout);
1259
  buff[len] = '\0';
1260
 
1261
  if (sscanf (buff, "0x%x %c 0x%x 0x%lx",
1262
              &rpid, &rcmd, &rerrflg, &rresponse) != 4
1263
      || (cmd != '\0' && rcmd != cmd))
1264
    mips_error ("Bad response from remote board");
1265
 
1266
  if (rerrflg != 0)
1267
    {
1268
      *perr = 1;
1269
 
1270
      /* FIXME: This will returns MIPS errno numbers, which may or may
1271
         not be the same as errno values used on other systems.  If
1272
         they stick to common errno values, they will be the same, but
1273
         if they don't, they must be translated.  */
1274
      errno = rresponse;
1275
 
1276
      return 0;
1277
    }
1278
 
1279
  *perr = 0;
1280
  return rresponse;
1281
}
1282
 
1283
static void
1284
mips_initialize_cleanups (PTR arg)
1285
{
1286
  mips_initializing = 0;
1287
}
1288
 
1289
static void
1290
mips_exit_cleanups (PTR arg)
1291
{
1292
  mips_exiting = 0;
1293
}
1294
 
1295
static void
1296
mips_send_command (const char *cmd, int prompt)
1297
{
1298
  SERIAL_WRITE (mips_desc, cmd, strlen (cmd));
1299
  mips_expect (cmd);
1300
  mips_expect ("\n");
1301
  if (prompt)
1302
    mips_expect (mips_monitor_prompt);
1303
}
1304
 
1305
/* Enter remote (dbx) debug mode: */
1306
static void
1307
mips_enter_debug (void)
1308
{
1309
  /* Reset the sequence numbers, ready for the new debug sequence: */
1310
  mips_send_seq = 0;
1311
  mips_receive_seq = 0;
1312
 
1313
  if (mips_monitor != MON_IDT)
1314
    mips_send_command ("debug\r", 0);
1315
  else                          /* assume IDT monitor by default */
1316
    mips_send_command ("db tty0\r", 0);
1317
 
1318
  sleep (1);
1319
  SERIAL_WRITE (mips_desc, "\r", sizeof "\r" - 1);
1320
 
1321
  /* We don't need to absorb any spurious characters here, since the
1322
     mips_receive_header will eat up a reasonable number of characters
1323
     whilst looking for the SYN, however this avoids the "garbage"
1324
     being displayed to the user. */
1325
  if (mips_monitor != MON_IDT)
1326
    mips_expect ("\r");
1327
 
1328
  {
1329
    char buff[DATA_MAXLEN + 1];
1330
    if (mips_receive_packet (buff, 1, 3) < 0)
1331
      mips_error ("Failed to initialize (didn't receive packet).");
1332
  }
1333
}
1334
 
1335
/* Exit remote (dbx) debug mode, returning to the monitor prompt: */
1336
static int
1337
mips_exit_debug (void)
1338
{
1339
  int err;
1340
  struct cleanup *old_cleanups = make_cleanup (mips_exit_cleanups, NULL);
1341
 
1342
  mips_exiting = 1;
1343
 
1344
  if (mips_monitor != MON_IDT)
1345
    {
1346
      /* The DDB (NEC) and MiniRISC (LSI) versions of PMON exit immediately,
1347
         so we do not get a reply to this command: */
1348
      mips_request ('x', 0, 0, NULL, mips_receive_wait, NULL);
1349
      mips_need_reply = 0;
1350
      if (!mips_expect (" break!"))
1351
        return -1;
1352
    }
1353
  else
1354
    mips_request ('x', 0, 0, &err, mips_receive_wait, NULL);
1355
 
1356
  if (!mips_expect (mips_monitor_prompt))
1357
    return -1;
1358
 
1359
  do_cleanups (old_cleanups);
1360
 
1361
  return 0;
1362
}
1363
 
1364
/* Initialize a new connection to the MIPS board, and make sure we are
1365
   really connected.  */
1366
 
1367
static void
1368
mips_initialize (void)
1369
{
1370
  int err;
1371
  struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL);
1372
  int j;
1373
 
1374
  /* What is this code doing here?  I don't see any way it can happen, and
1375
     it might mean mips_initializing didn't get cleared properly.
1376
     So I'll make it a warning.  */
1377
 
1378
  if (mips_initializing)
1379
    {
1380
      warning ("internal error: mips_initialize called twice");
1381
      return;
1382
    }
1383
 
1384
  mips_wait_flag = 0;
1385
  mips_initializing = 1;
1386
 
1387
  /* At this point, the packit protocol isn't responding.  We'll try getting
1388
     into the monitor, and restarting the protocol.  */
1389
 
1390
  /* Force the system into the monitor.  After this we *should* be at
1391
     the mips_monitor_prompt.  */
1392
  if (mips_monitor != MON_IDT)
1393
    j = 0;                       /* start by checking if we are already at the prompt */
1394
  else
1395
    j = 1;                      /* start by sending a break */
1396
  for (; j <= 4; j++)
1397
    {
1398
      switch (j)
1399
        {
1400
        case 0:          /* First, try sending a CR */
1401
          SERIAL_FLUSH_INPUT (mips_desc);
1402
          SERIAL_WRITE (mips_desc, "\r", 1);
1403
          break;
1404
        case 1:         /* First, try sending a break */
1405
          SERIAL_SEND_BREAK (mips_desc);
1406
          break;
1407
        case 2:         /* Then, try a ^C */
1408
          SERIAL_WRITE (mips_desc, "\003", 1);
1409
          break;
1410
        case 3:         /* Then, try escaping from download */
1411
          {
1412
            if (mips_monitor != MON_IDT)
1413
              {
1414
                char tbuff[7];
1415
 
1416
                /* We shouldn't need to send multiple termination
1417
                   sequences, since the target performs line (or
1418
                   block) reads, and then processes those
1419
                   packets. In-case we were downloading a large packet
1420
                   we flush the output buffer before inserting a
1421
                   termination sequence. */
1422
                SERIAL_FLUSH_OUTPUT (mips_desc);
1423
                sprintf (tbuff, "\r/E/E\r");
1424
                SERIAL_WRITE (mips_desc, tbuff, 6);
1425
              }
1426
            else
1427
              {
1428
                char srec[10];
1429
                int i;
1430
 
1431
                /* We are possibly in binary download mode, having
1432
                   aborted in the middle of an S-record.  ^C won't
1433
                   work because of binary mode.  The only reliable way
1434
                   out is to send enough termination packets (8 bytes)
1435
                   to fill up and then overflow the largest size
1436
                   S-record (255 bytes in this case).  This amounts to
1437
                   256/8 + 1 packets.
1438
                 */
1439
 
1440
                mips_make_srec (srec, '7', 0, NULL, 0);
1441
 
1442
                for (i = 1; i <= 33; i++)
1443
                  {
1444
                    SERIAL_WRITE (mips_desc, srec, 8);
1445
 
1446
                    if (SERIAL_READCHAR (mips_desc, 0) >= 0)
1447
                      break;    /* Break immediatly if we get something from
1448
                                   the board. */
1449
                  }
1450
              }
1451
          }
1452
          break;
1453
        case 4:
1454
          mips_error ("Failed to initialize.");
1455
        }
1456
 
1457
      if (mips_expect (mips_monitor_prompt))
1458
        break;
1459
    }
1460
 
1461
  if (mips_monitor != MON_IDT)
1462
    {
1463
      /* Sometimes PMON ignores the first few characters in the first
1464
         command sent after a load.  Sending a blank command gets
1465
         around that.  */
1466
      mips_send_command ("\r", -1);
1467
 
1468
      /* Ensure the correct target state: */
1469
      if (mips_monitor != MON_LSI)
1470
        mips_send_command ("set regsize 64\r", -1);
1471
      mips_send_command ("set hostport tty0\r", -1);
1472
      mips_send_command ("set brkcmd \"\"\r", -1);
1473
      /* Delete all the current breakpoints: */
1474
      mips_send_command ("db *\r", -1);
1475
      /* NOTE: PMON does not have breakpoint support through the
1476
         "debug" mode, only at the monitor command-line. */
1477
    }
1478
 
1479
  mips_enter_debug ();
1480
 
1481
  /* Clear all breakpoints: */
1482
  if ((mips_monitor == MON_IDT
1483
       && clear_breakpoint (-1, 0, BREAK_UNUSED) == 0)
1484
      || mips_monitor == MON_LSI)
1485
    monitor_supports_breakpoints = 1;
1486
  else
1487
    monitor_supports_breakpoints = 0;
1488
 
1489
  do_cleanups (old_cleanups);
1490
 
1491
  /* If this doesn't call error, we have connected; we don't care if
1492
     the request itself succeeds or fails.  */
1493
 
1494
  mips_request ('r', 0, 0, &err, mips_receive_wait, NULL);
1495
  set_current_frame (create_new_frame (read_fp (), read_pc ()));
1496
  select_frame (get_current_frame (), 0);
1497
}
1498
 
1499
/* Open a connection to the remote board.  */
1500
static void
1501
common_open (struct target_ops *ops, char *name, int from_tty,
1502
             enum mips_monitor_type new_monitor,
1503
             const char *new_monitor_prompt)
1504
{
1505
  char *ptype;
1506
  char *serial_port_name;
1507
  char *remote_name = 0;
1508
  char *local_name = 0;
1509
  char **argv;
1510
 
1511
  if (name == 0)
1512
    error (
1513
            "To open a MIPS remote debugging connection, you need to specify what serial\n\
1514
device is attached to the target board (e.g., /dev/ttya).\n"
1515
            "If you want to use TFTP to download to the board, specify the name of a\n"
1516
            "temporary file to be used by GDB for downloads as the second argument.\n"
1517
            "This filename must be in the form host:filename, where host is the name\n"
1518
            "of the host running the TFTP server, and the file must be readable by the\n"
1519
            "world.  If the local name of the temporary file differs from the name as\n"
1520
            "seen from the board via TFTP, specify that name as the third parameter.\n");
1521
 
1522
  /* Parse the serial port name, the optional TFTP name, and the
1523
     optional local TFTP name.  */
1524
  if ((argv = buildargv (name)) == NULL)
1525
    nomem (0);
1526
  make_cleanup_freeargv (argv);
1527
 
1528
  serial_port_name = xstrdup (argv[0]);
1529
  if (argv[1])                  /* remote TFTP name specified? */
1530
    {
1531
      remote_name = argv[1];
1532
      if (argv[2])              /* local TFTP filename specified? */
1533
        local_name = argv[2];
1534
    }
1535
 
1536
  target_preopen (from_tty);
1537
 
1538
  if (mips_is_open)
1539
    unpush_target (current_ops);
1540
 
1541
  /* Open and initialize the serial port.  */
1542
  mips_desc = SERIAL_OPEN (serial_port_name);
1543
  if (mips_desc == (serial_t) NULL)
1544
    perror_with_name (serial_port_name);
1545
 
1546
  if (baud_rate != -1)
1547
    {
1548
      if (SERIAL_SETBAUDRATE (mips_desc, baud_rate))
1549
        {
1550
          SERIAL_CLOSE (mips_desc);
1551
          perror_with_name (serial_port_name);
1552
        }
1553
    }
1554
 
1555
  SERIAL_RAW (mips_desc);
1556
 
1557
  /* Open and initialize the optional download port.  If it is in the form
1558
     hostname#portnumber, it's a UDP socket.  If it is in the form
1559
     hostname:filename, assume it's the TFTP filename that must be
1560
     passed to the DDB board to tell it where to get the load file.  */
1561
  if (remote_name)
1562
    {
1563
      if (strchr (remote_name, '#'))
1564
        {
1565
          udp_desc = SERIAL_OPEN (remote_name);
1566
          if (!udp_desc)
1567
            perror_with_name ("Unable to open UDP port");
1568
          udp_in_use = 1;
1569
        }
1570
      else
1571
        {
1572
          /* Save the remote and local names of the TFTP temp file.  If
1573
             the user didn't specify a local name, assume it's the same
1574
             as the part of the remote name after the "host:".  */
1575
          if (tftp_name)
1576
            xfree (tftp_name);
1577
          if (tftp_localname)
1578
            xfree (tftp_localname);
1579
          if (local_name == NULL)
1580
            if ((local_name = strchr (remote_name, ':')) != NULL)
1581
              local_name++;     /* skip over the colon */
1582
          if (local_name == NULL)
1583
            local_name = remote_name;   /* local name same as remote name */
1584
          tftp_name = xstrdup (remote_name);
1585
          tftp_localname = xstrdup (local_name);
1586
          tftp_in_use = 1;
1587
        }
1588
    }
1589
 
1590
  current_ops = ops;
1591
  mips_is_open = 1;
1592
 
1593
  /* Reset the expected monitor prompt if it's never been set before.  */
1594
  if (mips_monitor_prompt == NULL)
1595
    mips_monitor_prompt = xstrdup (new_monitor_prompt);
1596
  mips_monitor = new_monitor;
1597
 
1598
  mips_initialize ();
1599
 
1600
  if (from_tty)
1601
    printf_unfiltered ("Remote MIPS debugging using %s\n", serial_port_name);
1602
 
1603
  /* Switch to using remote target now.  */
1604
  push_target (ops);
1605
 
1606
  /* FIXME: Should we call start_remote here?  */
1607
 
1608
  /* Try to figure out the processor model if possible.  */
1609
  ptype = mips_read_processor_type ();
1610
  if (ptype)
1611
    mips_set_processor_type_command (xstrdup (ptype), 0);
1612
 
1613
/* This is really the job of start_remote however, that makes an assumption
1614
   that the target is about to print out a status message of some sort.  That
1615
   doesn't happen here (in fact, it may not be possible to get the monitor to
1616
   send the appropriate packet).  */
1617
 
1618
  flush_cached_frames ();
1619
  registers_changed ();
1620
  stop_pc = read_pc ();
1621
  set_current_frame (create_new_frame (read_fp (), stop_pc));
1622
  select_frame (get_current_frame (), 0);
1623
  print_stack_frame (selected_frame, -1, 1);
1624
  xfree (serial_port_name);
1625
}
1626
 
1627
static void
1628
mips_open (char *name, int from_tty)
1629
{
1630
  const char *monitor_prompt = NULL;
1631
  if (TARGET_ARCHITECTURE != NULL
1632
      && TARGET_ARCHITECTURE->arch == bfd_arch_mips)
1633
    {
1634
    switch (TARGET_ARCHITECTURE->mach)
1635
      {
1636
      case bfd_mach_mips4100:
1637
      case bfd_mach_mips4300:
1638
      case bfd_mach_mips4600:
1639
      case bfd_mach_mips4650:
1640
      case bfd_mach_mips5000:
1641
        monitor_prompt = "<RISQ> ";
1642
        break;
1643
      }
1644
    }
1645
  if (monitor_prompt == NULL)
1646
    monitor_prompt = "<IDT>";
1647
  common_open (&mips_ops, name, from_tty, MON_IDT, monitor_prompt);
1648
}
1649
 
1650
static void
1651
pmon_open (char *name, int from_tty)
1652
{
1653
  common_open (&pmon_ops, name, from_tty, MON_PMON, "PMON> ");
1654
}
1655
 
1656
static void
1657
ddb_open (char *name, int from_tty)
1658
{
1659
  common_open (&ddb_ops, name, from_tty, MON_DDB, "NEC010>");
1660
}
1661
 
1662
static void
1663
lsi_open (char *name, int from_tty)
1664
{
1665
  int i;
1666
 
1667
  /* Clear the LSI breakpoint table.  */
1668
  for (i = 0; i < MAX_LSI_BREAKPOINTS; i++)
1669
    lsi_breakpoints[i].type = BREAK_UNUSED;
1670
 
1671
  common_open (&lsi_ops, name, from_tty, MON_LSI, "PMON> ");
1672
}
1673
 
1674
/* Close a connection to the remote board.  */
1675
 
1676
static void
1677
mips_close (int quitting)
1678
{
1679
  if (mips_is_open)
1680
    {
1681
      /* Get the board out of remote debugging mode.  */
1682
      (void) mips_exit_debug ();
1683
 
1684
      close_ports ();
1685
    }
1686
}
1687
 
1688
/* Detach from the remote board.  */
1689
 
1690
static void
1691
mips_detach (char *args, int from_tty)
1692
{
1693
  if (args)
1694
    error ("Argument given to \"detach\" when remotely debugging.");
1695
 
1696
  pop_target ();
1697
 
1698
  mips_close (1);
1699
 
1700
  if (from_tty)
1701
    printf_unfiltered ("Ending remote MIPS debugging.\n");
1702
}
1703
 
1704
/* Tell the target board to resume.  This does not wait for a reply
1705
   from the board, except in the case of single-stepping on LSI boards,
1706
   where PMON does return a reply.  */
1707
 
1708
static void
1709
mips_resume (ptid_t ptid, int step, enum target_signal siggnal)
1710
{
1711
  int err;
1712
 
1713
  /* LSI PMON requires returns a reply packet "0x1 s 0x0 0x57f" after
1714
     a single step, so we wait for that.  */
1715
  mips_request (step ? 's' : 'c', 1, siggnal,
1716
                mips_monitor == MON_LSI && step ? &err : (int *) NULL,
1717
                mips_receive_wait, NULL);
1718
}
1719
 
1720
/* Return the signal corresponding to SIG, where SIG is the number which
1721
   the MIPS protocol uses for the signal.  */
1722
enum target_signal
1723
mips_signal_from_protocol (int sig)
1724
{
1725
  /* We allow a few more signals than the IDT board actually returns, on
1726
     the theory that there is at least *some* hope that perhaps the numbering
1727
     for these signals is widely agreed upon.  */
1728
  if (sig <= 0
1729
      || sig > 31)
1730
    return TARGET_SIGNAL_UNKNOWN;
1731
 
1732
  /* Don't want to use target_signal_from_host because we are converting
1733
     from MIPS signal numbers, not host ones.  Our internal numbers
1734
     match the MIPS numbers for the signals the board can return, which
1735
     are: SIGINT, SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP.  */
1736
  return (enum target_signal) sig;
1737
}
1738
 
1739
/* Wait until the remote stops, and return a wait status.  */
1740
 
1741
static ptid_t
1742
mips_wait (ptid_t ptid, struct target_waitstatus *status)
1743
{
1744
  int rstatus;
1745
  int err;
1746
  char buff[DATA_MAXLEN];
1747
  int rpc, rfp, rsp;
1748
  char flags[20];
1749
  int nfields;
1750
  int i;
1751
 
1752
  interrupt_count = 0;
1753
  hit_watchpoint = 0;
1754
 
1755
  /* If we have not sent a single step or continue command, then the
1756
     board is waiting for us to do something.  Return a status
1757
     indicating that it is stopped.  */
1758
  if (!mips_need_reply)
1759
    {
1760
      status->kind = TARGET_WAITKIND_STOPPED;
1761
      status->value.sig = TARGET_SIGNAL_TRAP;
1762
      return inferior_ptid;
1763
    }
1764
 
1765
  /* No timeout; we sit here as long as the program continues to execute.  */
1766
  mips_wait_flag = 1;
1767
  rstatus = mips_request ('\000', 0, 0, &err, -1, buff);
1768
  mips_wait_flag = 0;
1769
  if (err)
1770
    mips_error ("Remote failure: %s", safe_strerror (errno));
1771
 
1772
  /* On returning from a continue, the PMON monitor seems to start
1773
     echoing back the messages we send prior to sending back the
1774
     ACK. The code can cope with this, but to try and avoid the
1775
     unnecessary serial traffic, and "spurious" characters displayed
1776
     to the user, we cheat and reset the debug protocol. The problems
1777
     seems to be caused by a check on the number of arguments, and the
1778
     command length, within the monitor causing it to echo the command
1779
     as a bad packet. */
1780
  if (mips_monitor == MON_PMON)
1781
    {
1782
      mips_exit_debug ();
1783
      mips_enter_debug ();
1784
    }
1785
 
1786
  /* See if we got back extended status.  If so, pick out the pc, fp, sp, etc... */
1787
 
1788
  nfields = sscanf (buff, "0x%*x %*c 0x%*x 0x%*x 0x%x 0x%x 0x%x 0x%*x %s",
1789
                    &rpc, &rfp, &rsp, flags);
1790
  if (nfields >= 3)
1791
    {
1792
      char buf[MAX_REGISTER_RAW_SIZE];
1793
 
1794
      store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rpc);
1795
      supply_register (PC_REGNUM, buf);
1796
 
1797
      store_unsigned_integer (buf, REGISTER_RAW_SIZE (PC_REGNUM), rfp);
1798
      supply_register (30, buf);        /* This register they are avoiding and so it is unnamed */
1799
 
1800
      store_unsigned_integer (buf, REGISTER_RAW_SIZE (SP_REGNUM), rsp);
1801
      supply_register (SP_REGNUM, buf);
1802
 
1803
      store_unsigned_integer (buf, REGISTER_RAW_SIZE (FP_REGNUM), 0);
1804
      supply_register (FP_REGNUM, buf);
1805
 
1806
      if (nfields == 9)
1807
        {
1808
          int i;
1809
 
1810
          for (i = 0; i <= 2; i++)
1811
            if (flags[i] == 'r' || flags[i] == 'w')
1812
              hit_watchpoint = 1;
1813
            else if (flags[i] == '\000')
1814
              break;
1815
        }
1816
    }
1817
 
1818
  if (strcmp (target_shortname, "lsi") == 0)
1819
    {
1820
#if 0
1821
      /* If this is an LSI PMON target, see if we just hit a hardrdware watchpoint.
1822
         Right now, PMON doesn't give us enough information to determine which
1823
         breakpoint we hit.  So we have to look up the PC in our own table
1824
         of breakpoints, and if found, assume it's just a normal instruction
1825
         fetch breakpoint, not a data watchpoint.  FIXME when PMON
1826
         provides some way to tell us what type of breakpoint it is.  */
1827
      int i;
1828
      CORE_ADDR pc = read_pc ();
1829
 
1830
      hit_watchpoint = 1;
1831
      for (i = 0; i < MAX_LSI_BREAKPOINTS; i++)
1832
        {
1833
          if (lsi_breakpoints[i].addr == pc
1834
              && lsi_breakpoints[i].type == BREAK_FETCH)
1835
            {
1836
              hit_watchpoint = 0;
1837
              break;
1838
            }
1839
        }
1840
#else
1841
      /* If a data breakpoint was hit, PMON returns the following packet:
1842
         0x1 c 0x0 0x57f 0x1
1843
         The return packet from an ordinary breakpoint doesn't have the
1844
         extra 0x01 field tacked onto the end.  */
1845
      if (nfields == 1 && rpc == 1)
1846
        hit_watchpoint = 1;
1847
#endif
1848
    }
1849
 
1850
  /* NOTE: The following (sig) numbers are defined by PMON:
1851
     SPP_SIGTRAP     5       breakpoint
1852
     SPP_SIGINT      2
1853
     SPP_SIGSEGV     11
1854
     SPP_SIGBUS      10
1855
     SPP_SIGILL      4
1856
     SPP_SIGFPE      8
1857
     SPP_SIGTERM     15 */
1858
 
1859
  /* Translate a MIPS waitstatus.  We use constants here rather than WTERMSIG
1860
     and so on, because the constants we want here are determined by the
1861
     MIPS protocol and have nothing to do with what host we are running on.  */
1862
  if ((rstatus & 0xff) == 0)
1863
    {
1864
      status->kind = TARGET_WAITKIND_EXITED;
1865
      status->value.integer = (((rstatus) >> 8) & 0xff);
1866
    }
1867
  else if ((rstatus & 0xff) == 0x7f)
1868
    {
1869
      status->kind = TARGET_WAITKIND_STOPPED;
1870
      status->value.sig = mips_signal_from_protocol (((rstatus) >> 8) & 0xff);
1871
 
1872
      /* If the stop PC is in the _exit function, assume
1873
         we hit the 'break 0x3ff' instruction in _exit, so this
1874
         is not a normal breakpoint.  */
1875
      if (strcmp (target_shortname, "lsi") == 0)
1876
        {
1877
          char *func_name;
1878
          CORE_ADDR func_start;
1879
          CORE_ADDR pc = read_pc ();
1880
 
1881
          find_pc_partial_function (pc, &func_name, &func_start, NULL);
1882
          if (func_name != NULL && strcmp (func_name, "_exit") == 0
1883
              && func_start == pc)
1884
            status->kind = TARGET_WAITKIND_EXITED;
1885
        }
1886
    }
1887
  else
1888
    {
1889
      status->kind = TARGET_WAITKIND_SIGNALLED;
1890
      status->value.sig = mips_signal_from_protocol (rstatus & 0x7f);
1891
    }
1892
 
1893
  return inferior_ptid;
1894
}
1895
 
1896
/* We have to map between the register numbers used by gdb and the
1897
   register numbers used by the debugging protocol.  This function
1898
   assumes that we are using tm-mips.h.  */
1899
 
1900
#define REGNO_OFFSET 96
1901
 
1902
static int
1903
mips_map_regno (int regno)
1904
{
1905
  if (regno < 32)
1906
    return regno;
1907
  if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32)
1908
    return regno - FP0_REGNUM + 32;
1909
  switch (regno)
1910
    {
1911
    case PC_REGNUM:
1912
      return REGNO_OFFSET + 0;
1913
    case CAUSE_REGNUM:
1914
      return REGNO_OFFSET + 1;
1915
    case HI_REGNUM:
1916
      return REGNO_OFFSET + 2;
1917
    case LO_REGNUM:
1918
      return REGNO_OFFSET + 3;
1919
    case FCRCS_REGNUM:
1920
      return REGNO_OFFSET + 4;
1921
    case FCRIR_REGNUM:
1922
      return REGNO_OFFSET + 5;
1923
    default:
1924
      /* FIXME: Is there a way to get the status register?  */
1925
      return 0;
1926
    }
1927
}
1928
 
1929
/* Fetch the remote registers.  */
1930
 
1931
static void
1932
mips_fetch_registers (int regno)
1933
{
1934
  unsigned LONGEST val;
1935
  int err;
1936
 
1937
  if (regno == -1)
1938
    {
1939
      for (regno = 0; regno < NUM_REGS; regno++)
1940
        mips_fetch_registers (regno);
1941
      return;
1942
    }
1943
 
1944
  if (regno == FP_REGNUM || regno == ZERO_REGNUM)
1945
    /* FP_REGNUM on the mips is a hack which is just supposed to read
1946
       zero (see also mips-nat.c).  */
1947
    val = 0;
1948
  else
1949
    {
1950
      /* If PMON doesn't support this register, don't waste serial
1951
         bandwidth trying to read it.  */
1952
      int pmon_reg = mips_map_regno (regno);
1953
      if (regno != 0 && pmon_reg == 0)
1954
        val = 0;
1955
      else
1956
        {
1957
          /* Unfortunately the PMON version in the Vr4300 board has been
1958
             compiled without the 64bit register access commands. This
1959
             means we cannot get hold of the full register width. */
1960
          if (mips_monitor == MON_DDB)
1961
            val = (unsigned) mips_request ('t', pmon_reg, 0,
1962
                                           &err, mips_receive_wait, NULL);
1963
          else
1964
            val = mips_request ('r', pmon_reg, 0,
1965
                                &err, mips_receive_wait, NULL);
1966
          if (err)
1967
            mips_error ("Can't read register %d: %s", regno,
1968
                        safe_strerror (errno));
1969
        }
1970
    }
1971
 
1972
  {
1973
    char buf[MAX_REGISTER_RAW_SIZE];
1974
 
1975
    /* We got the number the register holds, but gdb expects to see a
1976
       value in the target byte ordering.  */
1977
    store_unsigned_integer (buf, REGISTER_RAW_SIZE (regno), val);
1978
    supply_register (regno, buf);
1979
  }
1980
}
1981
 
1982
/* Prepare to store registers.  The MIPS protocol can store individual
1983
   registers, so this function doesn't have to do anything.  */
1984
 
1985
static void
1986
mips_prepare_to_store (void)
1987
{
1988
}
1989
 
1990
/* Store remote register(s).  */
1991
 
1992
static void
1993
mips_store_registers (int regno)
1994
{
1995
  int err;
1996
 
1997
  if (regno == -1)
1998
    {
1999
      for (regno = 0; regno < NUM_REGS; regno++)
2000
        mips_store_registers (regno);
2001
      return;
2002
    }
2003
 
2004
  mips_request ('R', mips_map_regno (regno),
2005
                read_register (regno),
2006
                &err, mips_receive_wait, NULL);
2007
  if (err)
2008
    mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
2009
}
2010
 
2011
/* Fetch a word from the target board.  */
2012
 
2013
static unsigned int
2014
mips_fetch_word (CORE_ADDR addr)
2015
{
2016
  unsigned int val;
2017
  int err;
2018
 
2019
  val = mips_request ('d', addr, 0, &err, mips_receive_wait, NULL);
2020
  if (err)
2021
    {
2022
      /* Data space failed; try instruction space.  */
2023
      val = mips_request ('i', addr, 0, &err,
2024
                          mips_receive_wait, NULL);
2025
      if (err)
2026
        mips_error ("Can't read address 0x%s: %s",
2027
                    paddr_nz (addr), safe_strerror (errno));
2028
    }
2029
  return val;
2030
}
2031
 
2032
/* Store a word to the target board.  Returns errno code or zero for
2033
   success.  If OLD_CONTENTS is non-NULL, put the old contents of that
2034
   memory location there.  */
2035
 
2036
/* FIXME! make sure only 32-bit quantities get stored! */
2037
static int
2038
mips_store_word (CORE_ADDR addr, unsigned int val, char *old_contents)
2039
{
2040
  int err;
2041
  unsigned int oldcontents;
2042
 
2043
  oldcontents = mips_request ('D', addr, val, &err,
2044
                              mips_receive_wait, NULL);
2045
  if (err)
2046
    {
2047
      /* Data space failed; try instruction space.  */
2048
      oldcontents = mips_request ('I', addr, val, &err,
2049
                                  mips_receive_wait, NULL);
2050
      if (err)
2051
        return errno;
2052
    }
2053
  if (old_contents != NULL)
2054
    store_unsigned_integer (old_contents, 4, oldcontents);
2055
  return 0;
2056
}
2057
 
2058
/* Read or write LEN bytes from inferior memory at MEMADDR,
2059
   transferring to or from debugger address MYADDR.  Write to inferior
2060
   if SHOULD_WRITE is nonzero.  Returns length of data written or
2061
   read; 0 for error.  Note that protocol gives us the correct value
2062
   for a longword, since it transfers values in ASCII.  We want the
2063
   byte values, so we have to swap the longword values.  */
2064
 
2065
static int mask_address_p = 1;
2066
 
2067
static int
2068
mips_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
2069
                  struct mem_attrib *attrib ATTRIBUTE_UNUSED,
2070
                  struct target_ops *target ATTRIBUTE_UNUSED)
2071
{
2072
  int i;
2073
  CORE_ADDR addr;
2074
  int count;
2075
  char *buffer;
2076
  int status;
2077
 
2078
  /* PMON targets do not cope well with 64 bit addresses.  Mask the
2079
     value down to 32 bits. */
2080
  if (mask_address_p)
2081
    memaddr &= (CORE_ADDR) 0xffffffff;
2082
 
2083
  /* Round starting address down to longword boundary.  */
2084
  addr = memaddr & ~3;
2085
  /* Round ending address up; get number of longwords that makes.  */
2086
  count = (((memaddr + len) - addr) + 3) / 4;
2087
  /* Allocate buffer of that many longwords.  */
2088
  buffer = alloca (count * 4);
2089
 
2090
  if (write)
2091
    {
2092
      /* Fill start and end extra bytes of buffer with existing data.  */
2093
      if (addr != memaddr || len < 4)
2094
        {
2095
          /* Need part of initial word -- fetch it.  */
2096
          store_unsigned_integer (&buffer[0], 4, mips_fetch_word (addr));
2097
        }
2098
 
2099
      if (count > 1)
2100
        {
2101
          /* Need part of last word -- fetch it.  FIXME: we do this even
2102
             if we don't need it.  */
2103
          store_unsigned_integer (&buffer[(count - 1) * 4], 4,
2104
                                  mips_fetch_word (addr + (count - 1) * 4));
2105
        }
2106
 
2107
      /* Copy data to be written over corresponding part of buffer */
2108
 
2109
      memcpy ((char *) buffer + (memaddr & 3), myaddr, len);
2110
 
2111
      /* Write the entire buffer.  */
2112
 
2113
      for (i = 0; i < count; i++, addr += 4)
2114
        {
2115
          status = mips_store_word (addr,
2116
                               extract_unsigned_integer (&buffer[i * 4], 4),
2117
                                    NULL);
2118
          /* Report each kilobyte (we download 32-bit words at a time) */
2119
          if (i % 256 == 255)
2120
            {
2121
              printf_unfiltered ("*");
2122
              gdb_flush (gdb_stdout);
2123
            }
2124
          if (status)
2125
            {
2126
              errno = status;
2127
              return 0;
2128
            }
2129
          /* FIXME: Do we want a QUIT here?  */
2130
        }
2131
      if (count >= 256)
2132
        printf_unfiltered ("\n");
2133
    }
2134
  else
2135
    {
2136
      /* Read all the longwords */
2137
      for (i = 0; i < count; i++, addr += 4)
2138
        {
2139
          store_unsigned_integer (&buffer[i * 4], 4, mips_fetch_word (addr));
2140
          QUIT;
2141
        }
2142
 
2143
      /* Copy appropriate bytes out of the buffer.  */
2144
      memcpy (myaddr, buffer + (memaddr & 3), len);
2145
    }
2146
  return len;
2147
}
2148
 
2149
/* Print info on this target.  */
2150
 
2151
static void
2152
mips_files_info (struct target_ops *ignore)
2153
{
2154
  printf_unfiltered ("Debugging a MIPS board over a serial line.\n");
2155
}
2156
 
2157
/* Kill the process running on the board.  This will actually only
2158
   work if we are doing remote debugging over the console input.  I
2159
   think that if IDT/sim had the remote debug interrupt enabled on the
2160
   right port, we could interrupt the process with a break signal.  */
2161
 
2162
static void
2163
mips_kill (void)
2164
{
2165
  if (!mips_wait_flag)
2166
    return;
2167
 
2168
  interrupt_count++;
2169
 
2170
  if (interrupt_count >= 2)
2171
    {
2172
      interrupt_count = 0;
2173
 
2174
      target_terminal_ours ();
2175
 
2176
      if (query ("Interrupted while waiting for the program.\n\
2177
Give up (and stop debugging it)? "))
2178
        {
2179
          /* Clean up in such a way that mips_close won't try to talk to the
2180
             board (it almost surely won't work since we weren't able to talk to
2181
             it).  */
2182
          mips_wait_flag = 0;
2183
          close_ports ();
2184
 
2185
          printf_unfiltered ("Ending remote MIPS debugging.\n");
2186
          target_mourn_inferior ();
2187
 
2188
          return_to_top_level (RETURN_QUIT);
2189
        }
2190
 
2191
      target_terminal_inferior ();
2192
    }
2193
 
2194
  if (remote_debug > 0)
2195
    printf_unfiltered ("Sending break\n");
2196
 
2197
  SERIAL_SEND_BREAK (mips_desc);
2198
 
2199
#if 0
2200
  if (mips_is_open)
2201
    {
2202
      char cc;
2203
 
2204
      /* Send a ^C.  */
2205
      cc = '\003';
2206
      SERIAL_WRITE (mips_desc, &cc, 1);
2207
      sleep (1);
2208
      target_mourn_inferior ();
2209
    }
2210
#endif
2211
}
2212
 
2213
/* Start running on the target board.  */
2214
 
2215
static void
2216
mips_create_inferior (char *execfile, char *args, char **env)
2217
{
2218
  CORE_ADDR entry_pt;
2219
 
2220
  if (args && *args)
2221
    {
2222
      warning ("\
2223
Can't pass arguments to remote MIPS board; arguments ignored.");
2224
      /* And don't try to use them on the next "run" command.  */
2225
      execute_command ("set args", 0);
2226
    }
2227
 
2228
  if (execfile == 0 || exec_bfd == 0)
2229
    error ("No executable file specified");
2230
 
2231
  entry_pt = (CORE_ADDR) bfd_get_start_address (exec_bfd);
2232
 
2233
  init_wait_for_inferior ();
2234
 
2235
  /* FIXME: Should we set inferior_ptid here?  */
2236
 
2237
  proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
2238
}
2239
 
2240
/* Clean up after a process.  Actually nothing to do.  */
2241
 
2242
static void
2243
mips_mourn_inferior (void)
2244
{
2245
  if (current_ops != NULL)
2246
    unpush_target (current_ops);
2247
  generic_mourn_inferior ();
2248
}
2249
 
2250
/* We can write a breakpoint and read the shadow contents in one
2251
   operation.  */
2252
 
2253
/* Insert a breakpoint.  On targets that don't have built-in breakpoint
2254
   support, we read the contents of the target location and stash it,
2255
   then overwrite it with a breakpoint instruction.  ADDR is the target
2256
   location in the target machine.  CONTENTS_CACHE is a pointer to
2257
   memory allocated for saving the target contents.  It is guaranteed
2258
   by the caller to be long enough to save sizeof BREAKPOINT bytes (this
2259
   is accomplished via BREAKPOINT_MAX).  */
2260
 
2261
static int
2262
mips_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
2263
{
2264
  if (monitor_supports_breakpoints)
2265
    return set_breakpoint (addr, MIPS_INSTLEN, BREAK_FETCH);
2266
  else
2267
    return memory_insert_breakpoint (addr, contents_cache);
2268
}
2269
 
2270
static int
2271
mips_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
2272
{
2273
  if (monitor_supports_breakpoints)
2274
    return clear_breakpoint (addr, MIPS_INSTLEN, BREAK_FETCH);
2275
  else
2276
    return memory_remove_breakpoint (addr, contents_cache);
2277
}
2278
 
2279
#if 0                           /* currently not used */
2280
/* PMON does not currently provide support for the debug mode 'b'
2281
   commands to manipulate breakpoints. However, if we wanted to use
2282
   the monitor breakpoints (rather than the GDB BREAK_INSN version)
2283
   then this code performs the work needed to leave debug mode,
2284
   set/clear the breakpoint, and then return to debug mode. */
2285
 
2286
#define PMON_MAX_BP (33)        /* 32 SW, 1 HW */
2287
static CORE_ADDR mips_pmon_bp_info[PMON_MAX_BP];
2288
/* NOTE: The code relies on this vector being zero-initialised by the system */
2289
 
2290
static int
2291
pmon_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
2292
{
2293
  int status;
2294
 
2295
  if (monitor_supports_breakpoints)
2296
    {
2297
      char tbuff[12];           /* space for breakpoint command */
2298
      int bpnum;
2299
      CORE_ADDR bpaddr;
2300
 
2301
      /* PMON does not support debug level breakpoint set/remove: */
2302
      if (mips_exit_debug ())
2303
        mips_error ("Failed to exit debug mode");
2304
 
2305
      sprintf (tbuff, "b %08x\r", addr);
2306
      mips_send_command (tbuff, 0);
2307
 
2308
      mips_expect ("Bpt ");
2309
 
2310
      if (!mips_getstring (tbuff, remote_timeout))
2311
        return 1;
2312
      tbuff[2] = '\0';          /* terminate the string */
2313
      if (sscanf (tbuff, "%d", &bpnum) != 1)
2314
        {
2315
          fprintf_unfiltered (gdb_stderr,
2316
              "Invalid decimal breakpoint number from target: %s\n", tbuff);
2317
          return 1;
2318
        }
2319
 
2320
      mips_expect (" = ");
2321
 
2322
      /* Lead in the hex number we are expecting: */
2323
      tbuff[0] = '0';
2324
      tbuff[1] = 'x';
2325
 
2326
      /* FIXME!! only 8 bytes!  need to expand for Bfd64;
2327
         which targets return 64-bit addresses?  PMON returns only 32! */
2328
      if (!mips_getstring (&tbuff[2], 8))
2329
        return 1;
2330
      tbuff[10] = '\0';         /* terminate the string */
2331
 
2332
      if (sscanf (tbuff, "0x%08x", &bpaddr) != 1)
2333
        {
2334
          fprintf_unfiltered (gdb_stderr,
2335
                            "Invalid hex address from target: %s\n", tbuff);
2336
          return 1;
2337
        }
2338
 
2339
      if (bpnum >= PMON_MAX_BP)
2340
        {
2341
          fprintf_unfiltered (gdb_stderr,
2342
                              "Error: Returned breakpoint number %d outside acceptable range (0..%d)\n",
2343
                              bpnum, PMON_MAX_BP - 1);
2344
          return 1;
2345
        }
2346
 
2347
      if (bpaddr != addr)
2348
        fprintf_unfiltered (gdb_stderr, "Warning: Breakpoint addresses do not match: 0x%x != 0x%x\n", addr, bpaddr);
2349
 
2350
      mips_pmon_bp_info[bpnum] = bpaddr;
2351
 
2352
      mips_expect ("\r\n");
2353
      mips_expect (mips_monitor_prompt);
2354
 
2355
      mips_enter_debug ();
2356
 
2357
      return 0;
2358
    }
2359
 
2360
  return mips_store_word (addr, BREAK_INSN, contents_cache);
2361
}
2362
 
2363
static int
2364
pmon_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
2365
{
2366
  if (monitor_supports_breakpoints)
2367
    {
2368
      int bpnum;
2369
      char tbuff[7];            /* enough for delete breakpoint command */
2370
 
2371
      for (bpnum = 0; bpnum < PMON_MAX_BP; bpnum++)
2372
        if (mips_pmon_bp_info[bpnum] == addr)
2373
          break;
2374
 
2375
      if (bpnum >= PMON_MAX_BP)
2376
        {
2377
          fprintf_unfiltered (gdb_stderr,
2378
                              "pmon_remove_breakpoint: Failed to find breakpoint at address 0x%s\n",
2379
                              paddr_nz (addr));
2380
          return 1;
2381
        }
2382
 
2383
      if (mips_exit_debug ())
2384
        mips_error ("Failed to exit debug mode");
2385
 
2386
      sprintf (tbuff, "db %02d\r", bpnum);
2387
 
2388
      mips_send_command (tbuff, -1);
2389
      /* NOTE: If the breakpoint does not exist then a "Bpt <dd> not
2390
         set" message will be returned. */
2391
 
2392
      mips_enter_debug ();
2393
 
2394
      return 0;
2395
    }
2396
 
2397
  return target_write_memory (addr, contents_cache, BREAK_INSN_SIZE);
2398
}
2399
#endif
2400
 
2401
 
2402
/* Tell whether this target can support a hardware breakpoint.  CNT
2403
   is the number of hardware breakpoints already installed.  This
2404
   implements the TARGET_CAN_USE_HARDWARE_WATCHPOINT macro.  */
2405
 
2406
int
2407
remote_mips_can_use_hardware_watchpoint (int cnt)
2408
{
2409
  return cnt < MAX_LSI_BREAKPOINTS && strcmp (target_shortname, "lsi") == 0;
2410
}
2411
 
2412
 
2413
/* Compute a don't care mask for the region bounding ADDR and ADDR + LEN - 1.
2414
   This is used for memory ref breakpoints.  */
2415
 
2416
static unsigned long
2417
calculate_mask (CORE_ADDR addr, int len)
2418
{
2419
  unsigned long mask;
2420
  int i;
2421
 
2422
  mask = addr ^ (addr + len - 1);
2423
 
2424
  for (i = 32; i >= 0; i--)
2425
    if (mask == 0)
2426
      break;
2427
    else
2428
      mask >>= 1;
2429
 
2430
  mask = (unsigned long) 0xffffffff >> i;
2431
 
2432
  return mask;
2433
}
2434
 
2435
 
2436
/* Insert a hardware breakpoint.  This works only on LSI targets, which
2437
   implement ordinary breakpoints using hardware facilities.  */
2438
 
2439
int
2440
remote_mips_insert_hw_breakpoint (CORE_ADDR addr, char *contents_cache)
2441
{
2442
  if (strcmp (target_shortname, "lsi") == 0)
2443
    return mips_insert_breakpoint (addr, contents_cache);
2444
  else
2445
    return -1;
2446
}
2447
 
2448
 
2449
/* Remove a hardware breakpoint.  This works only on LSI targets, which
2450
   implement ordinary breakpoints using hardware facilities.  */
2451
 
2452
int
2453
remote_mips_remove_hw_breakpoint (CORE_ADDR addr, char *contents_cache)
2454
{
2455
  if (strcmp (target_shortname, "lsi") == 0)
2456
    return mips_remove_breakpoint (addr, contents_cache);
2457
  else
2458
    return -1;
2459
}
2460
 
2461
/* Set a data watchpoint.  ADDR and LEN should be obvious.  TYPE is 0
2462
   for a write watchpoint, 1 for a read watchpoint, or 2 for a read/write
2463
   watchpoint. */
2464
 
2465
int
2466
remote_mips_set_watchpoint (CORE_ADDR addr, int len, int type)
2467
{
2468
  if (set_breakpoint (addr, len, type))
2469
    return -1;
2470
 
2471
  return 0;
2472
}
2473
 
2474
int
2475
remote_mips_remove_watchpoint (CORE_ADDR addr, int len, int type)
2476
{
2477
  if (clear_breakpoint (addr, len, type))
2478
    return -1;
2479
 
2480
  return 0;
2481
}
2482
 
2483
int
2484
remote_mips_stopped_by_watchpoint (void)
2485
{
2486
  return hit_watchpoint;
2487
}
2488
 
2489
 
2490
/* Insert a breakpoint.  */
2491
 
2492
static int
2493
set_breakpoint (CORE_ADDR addr, int len, enum break_type type)
2494
{
2495
  return common_breakpoint (1, addr, len, type);
2496
}
2497
 
2498
 
2499
/* Clear a breakpoint.  */
2500
 
2501
static int
2502
clear_breakpoint (CORE_ADDR addr, int len, enum break_type type)
2503
{
2504
  return common_breakpoint (0, addr, len, type);
2505
}
2506
 
2507
 
2508
/* Check the error code from the return packet for an LSI breakpoint
2509
   command.  If there's no error, just return 0.  If it's a warning,
2510
   print the warning text and return 0.  If it's an error, print
2511
   the error text and return 1.  <ADDR> is the address of the breakpoint
2512
   that was being set.  <RERRFLG> is the error code returned by PMON.
2513
   This is a helper function for common_breakpoint.  */
2514
 
2515
static int
2516
check_lsi_error (CORE_ADDR addr, int rerrflg)
2517
{
2518
  struct lsi_error *err;
2519
  char *saddr = paddr_nz (addr);        /* printable address string */
2520
 
2521
  if (rerrflg == 0)              /* no error */
2522
    return 0;
2523
 
2524
  /* Warnings can be ORed together, so check them all.  */
2525
  if (rerrflg & W_WARN)
2526
    {
2527
      if (monitor_warnings)
2528
        {
2529
          int found = 0;
2530
          for (err = lsi_warning_table; err->code != 0; err++)
2531
            {
2532
              if ((err->code & rerrflg) == err->code)
2533
                {
2534
                  found = 1;
2535
                  fprintf_unfiltered (gdb_stderr,
2536
                                  "common_breakpoint (0x%s): Warning: %s\n",
2537
                                      saddr,
2538
                                      err->string);
2539
                }
2540
            }
2541
          if (!found)
2542
            fprintf_unfiltered (gdb_stderr,
2543
                        "common_breakpoint (0x%s): Unknown warning: 0x%x\n",
2544
                                saddr,
2545
                                rerrflg);
2546
        }
2547
      return 0;
2548
    }
2549
 
2550
  /* Errors are unique, i.e. can't be ORed together.  */
2551
  for (err = lsi_error_table; err->code != 0; err++)
2552
    {
2553
      if ((err->code & rerrflg) == err->code)
2554
        {
2555
          fprintf_unfiltered (gdb_stderr,
2556
                              "common_breakpoint (0x%s): Error: %s\n",
2557
                              saddr,
2558
                              err->string);
2559
          return 1;
2560
        }
2561
    }
2562
  fprintf_unfiltered (gdb_stderr,
2563
                      "common_breakpoint (0x%s): Unknown error: 0x%x\n",
2564
                      saddr,
2565
                      rerrflg);
2566
  return 1;
2567
}
2568
 
2569
 
2570
/* This routine sends a breakpoint command to the remote target.
2571
 
2572
   <SET> is 1 if setting a breakpoint, or 0 if clearing a breakpoint.
2573
   <ADDR> is the address of the breakpoint.
2574
   <LEN> the length of the region to break on.
2575
   <TYPE> is the type of breakpoint:
2576
 
2577
   1 = read                     (BREAK_READ)
2578
   2 = read/write               (BREAK_ACCESS)
2579
   3 = instruction fetch        (BREAK_FETCH)
2580
 
2581
   Return 0 if successful; otherwise 1.  */
2582
 
2583
static int
2584
common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type)
2585
{
2586
  char buf[DATA_MAXLEN + 1];
2587
  char cmd, rcmd;
2588
  int rpid, rerrflg, rresponse, rlen;
2589
  int nfields;
2590
 
2591
  addr = ADDR_BITS_REMOVE (addr);
2592
 
2593
  if (mips_monitor == MON_LSI)
2594
    {
2595
      if (set == 0)              /* clear breakpoint */
2596
        {
2597
          /* The LSI PMON "clear breakpoint" has this form:
2598
             <pid> 'b' <bptn> 0x0
2599
             reply:
2600
             <pid> 'b' 0x0 <code>
2601
 
2602
             <bptn> is a breakpoint number returned by an earlier 'B' command.
2603
             Possible return codes: OK, E_BPT.  */
2604
 
2605
          int i;
2606
 
2607
          /* Search for the breakpoint in the table.  */
2608
          for (i = 0; i < MAX_LSI_BREAKPOINTS; i++)
2609
            if (lsi_breakpoints[i].type == type
2610
                && lsi_breakpoints[i].addr == addr
2611
                && lsi_breakpoints[i].len == len)
2612
              break;
2613
 
2614
          /* Clear the table entry and tell PMON to clear the breakpoint.  */
2615
          if (i == MAX_LSI_BREAKPOINTS)
2616
            {
2617
              warning ("common_breakpoint: Attempt to clear bogus breakpoint at %s\n",
2618
                       paddr_nz (addr));
2619
              return 1;
2620
            }
2621
 
2622
          lsi_breakpoints[i].type = BREAK_UNUSED;
2623
          sprintf (buf, "0x0 b 0x%x 0x0", i);
2624
          mips_send_packet (buf, 1);
2625
 
2626
          rlen = mips_receive_packet (buf, 1, mips_receive_wait);
2627
          buf[rlen] = '\0';
2628
 
2629
          nfields = sscanf (buf, "0x%x b 0x0 0x%x", &rpid, &rerrflg);
2630
          if (nfields != 2)
2631
            mips_error ("common_breakpoint: Bad response from remote board: %s", buf);
2632
 
2633
          return (check_lsi_error (addr, rerrflg));
2634
        }
2635
      else
2636
        /* set a breakpoint */
2637
        {
2638
          /* The LSI PMON "set breakpoint" command has this form:
2639
             <pid> 'B' <addr> 0x0
2640
             reply:
2641
             <pid> 'B' <bptn> <code>
2642
 
2643
             The "set data breakpoint" command has this form:
2644
 
2645
             <pid> 'A' <addr1> <type> [<addr2>  [<value>]]
2646
 
2647
             where: type= "0x1" = read
2648
             "0x2" = write
2649
             "0x3" = access (read or write)
2650
 
2651
             The reply returns two values:
2652
             bptn - a breakpoint number, which is a small integer with
2653
             possible values of zero through 255.
2654
             code - an error return code, a value of zero indicates a
2655
             succesful completion, other values indicate various
2656
             errors and warnings.
2657
 
2658
             Possible return codes: OK, W_QAL, E_QAL, E_OUT, E_NON.
2659
 
2660
           */
2661
 
2662
          if (type == BREAK_FETCH)      /* instruction breakpoint */
2663
            {
2664
              cmd = 'B';
2665
              sprintf (buf, "0x0 B 0x%s 0x0", paddr_nz (addr));
2666
            }
2667
          else
2668
            /* watchpoint */
2669
            {
2670
              cmd = 'A';
2671
              sprintf (buf, "0x0 A 0x%s 0x%x 0x%s", paddr_nz (addr),
2672
                     type == BREAK_READ ? 1 : (type == BREAK_WRITE ? 2 : 3),
2673
                       paddr_nz (addr + len - 1));
2674
            }
2675
          mips_send_packet (buf, 1);
2676
 
2677
          rlen = mips_receive_packet (buf, 1, mips_receive_wait);
2678
          buf[rlen] = '\0';
2679
 
2680
          nfields = sscanf (buf, "0x%x %c 0x%x 0x%x",
2681
                            &rpid, &rcmd, &rresponse, &rerrflg);
2682
          if (nfields != 4 || rcmd != cmd || rresponse > 255)
2683
            mips_error ("common_breakpoint: Bad response from remote board: %s", buf);
2684
 
2685
          if (rerrflg != 0)
2686
            if (check_lsi_error (addr, rerrflg))
2687
              return 1;
2688
 
2689
          /* rresponse contains PMON's breakpoint number.  Record the
2690
             information for this breakpoint so we can clear it later.  */
2691
          lsi_breakpoints[rresponse].type = type;
2692
          lsi_breakpoints[rresponse].addr = addr;
2693
          lsi_breakpoints[rresponse].len = len;
2694
 
2695
          return 0;
2696
        }
2697
    }
2698
  else
2699
    {
2700
      /* On non-LSI targets, the breakpoint command has this form:
2701
         0x0 <CMD> <ADDR> <MASK> <FLAGS>
2702
         <MASK> is a don't care mask for addresses.
2703
         <FLAGS> is any combination of `r', `w', or `f' for read/write/fetch.
2704
       */
2705
      unsigned long mask;
2706
 
2707
      mask = calculate_mask (addr, len);
2708
      addr &= ~mask;
2709
 
2710
      if (set)                  /* set a breakpoint */
2711
        {
2712
          char *flags;
2713
          switch (type)
2714
            {
2715
            case BREAK_WRITE:   /* write */
2716
              flags = "w";
2717
              break;
2718
            case BREAK_READ:    /* read */
2719
              flags = "r";
2720
              break;
2721
            case BREAK_ACCESS:  /* read/write */
2722
              flags = "rw";
2723
              break;
2724
            case BREAK_FETCH:   /* fetch */
2725
              flags = "f";
2726
              break;
2727
            default:
2728
              internal_error (__FILE__, __LINE__, "failed internal consistency check");
2729
            }
2730
 
2731
          cmd = 'B';
2732
          sprintf (buf, "0x0 B 0x%s 0x%s %s", paddr_nz (addr),
2733
                   paddr_nz (mask), flags);
2734
        }
2735
      else
2736
        {
2737
          cmd = 'b';
2738
          sprintf (buf, "0x0 b 0x%s", paddr_nz (addr));
2739
        }
2740
 
2741
      mips_send_packet (buf, 1);
2742
 
2743
      rlen = mips_receive_packet (buf, 1, mips_receive_wait);
2744
      buf[rlen] = '\0';
2745
 
2746
      nfields = sscanf (buf, "0x%x %c 0x%x 0x%x",
2747
                        &rpid, &rcmd, &rerrflg, &rresponse);
2748
 
2749
      if (nfields != 4 || rcmd != cmd)
2750
        mips_error ("common_breakpoint: Bad response from remote board: %s",
2751
                    buf);
2752
 
2753
      if (rerrflg != 0)
2754
        {
2755
          /* Ddb returns "0x0 b 0x16 0x0\000", whereas
2756
             Cogent returns "0x0 b 0xffffffff 0x16\000": */
2757
          if (mips_monitor == MON_DDB)
2758
            rresponse = rerrflg;
2759
          if (rresponse != 22)  /* invalid argument */
2760
            fprintf_unfiltered (gdb_stderr,
2761
                             "common_breakpoint (0x%s):  Got error: 0x%x\n",
2762
                                paddr_nz (addr), rresponse);
2763
          return 1;
2764
        }
2765
    }
2766
  return 0;
2767
}
2768
 
2769
static void
2770
send_srec (char *srec, int len, CORE_ADDR addr)
2771
{
2772
  while (1)
2773
    {
2774
      int ch;
2775
 
2776
      SERIAL_WRITE (mips_desc, srec, len);
2777
 
2778
      ch = mips_readchar (remote_timeout);
2779
 
2780
      switch (ch)
2781
        {
2782
        case SERIAL_TIMEOUT:
2783
          error ("Timeout during download.");
2784
          break;
2785
        case 0x6:               /* ACK */
2786
          return;
2787
        case 0x15:              /* NACK */
2788
          fprintf_unfiltered (gdb_stderr, "Download got a NACK at byte %s!  Retrying.\n", paddr_u (addr));
2789
          continue;
2790
        default:
2791
          error ("Download got unexpected ack char: 0x%x, retrying.\n", ch);
2792
        }
2793
    }
2794
}
2795
 
2796
/*  Download a binary file by converting it to S records. */
2797
 
2798
static void
2799
mips_load_srec (char *args)
2800
{
2801
  bfd *abfd;
2802
  asection *s;
2803
  char *buffer, srec[1024];
2804
  unsigned int i;
2805
  unsigned int srec_frame = 200;
2806
  int reclen;
2807
  static int hashmark = 1;
2808
 
2809
  buffer = alloca (srec_frame * 2 + 256);
2810
 
2811
  abfd = bfd_openr (args, 0);
2812
  if (!abfd)
2813
    {
2814
      printf_filtered ("Unable to open file %s\n", args);
2815
      return;
2816
    }
2817
 
2818
  if (bfd_check_format (abfd, bfd_object) == 0)
2819
    {
2820
      printf_filtered ("File is not an object file\n");
2821
      return;
2822
    }
2823
 
2824
/* This actually causes a download in the IDT binary format: */
2825
  mips_send_command (LOAD_CMD, 0);
2826
 
2827
  for (s = abfd->sections; s; s = s->next)
2828
    {
2829
      if (s->flags & SEC_LOAD)
2830
        {
2831
          unsigned int numbytes;
2832
 
2833
          /* FIXME!  vma too small????? */
2834
          printf_filtered ("%s\t: 0x%4lx .. 0x%4lx  ", s->name,
2835
                           (long) s->vma,
2836
                           (long) (s->vma + s->_raw_size));
2837
          gdb_flush (gdb_stdout);
2838
 
2839
          for (i = 0; i < s->_raw_size; i += numbytes)
2840
            {
2841
              numbytes = min (srec_frame, s->_raw_size - i);
2842
 
2843
              bfd_get_section_contents (abfd, s, buffer, i, numbytes);
2844
 
2845
              reclen = mips_make_srec (srec, '3', s->vma + i, buffer, numbytes);
2846
              send_srec (srec, reclen, s->vma + i);
2847
 
2848
              if (hashmark)
2849
                {
2850
                  putchar_unfiltered ('#');
2851
                  gdb_flush (gdb_stdout);
2852
                }
2853
 
2854
            }                   /* Per-packet (or S-record) loop */
2855
 
2856
          putchar_unfiltered ('\n');
2857
        }                       /* Loadable sections */
2858
    }
2859
  if (hashmark)
2860
    putchar_unfiltered ('\n');
2861
 
2862
  /* Write a type 7 terminator record. no data for a type 7, and there
2863
     is no data, so len is 0.  */
2864
 
2865
  reclen = mips_make_srec (srec, '7', abfd->start_address, NULL, 0);
2866
 
2867
  send_srec (srec, reclen, abfd->start_address);
2868
 
2869
  SERIAL_FLUSH_INPUT (mips_desc);
2870
}
2871
 
2872
/*
2873
 * mips_make_srec -- make an srecord. This writes each line, one at a
2874
 *      time, each with it's own header and trailer line.
2875
 *      An srecord looks like this:
2876
 *
2877
 * byte count-+     address
2878
 * start ---+ |        |       data        +- checksum
2879
 *          | |        |                   |
2880
 *        S01000006F6B692D746573742E73726563E4
2881
 *        S315000448600000000000000000FC00005900000000E9
2882
 *        S31A0004000023C1400037DE00F023604000377B009020825000348D
2883
 *        S30B0004485A0000000000004E
2884
 *        S70500040000F6
2885
 *
2886
 *      S<type><length><address><data><checksum>
2887
 *
2888
 *      Where
2889
 *      - length
2890
 *        is the number of bytes following upto the checksum. Note that
2891
 *        this is not the number of chars following, since it takes two
2892
 *        chars to represent a byte.
2893
 *      - type
2894
 *        is one of:
2895
 *        0) header record
2896
 *        1) two byte address data record
2897
 *        2) three byte address data record
2898
 *        3) four byte address data record
2899
 *        7) four byte address termination record
2900
 *        8) three byte address termination record
2901
 *        9) two byte address termination record
2902
 *
2903
 *      - address
2904
 *        is the start address of the data following, or in the case of
2905
 *        a termination record, the start address of the image
2906
 *      - data
2907
 *        is the data.
2908
 *      - checksum
2909
 *        is the sum of all the raw byte data in the record, from the length
2910
 *        upwards, modulo 256 and subtracted from 255.
2911
 *
2912
 * This routine returns the length of the S-record.
2913
 *
2914
 */
2915
 
2916
static int
2917
mips_make_srec (char *buf, int type, CORE_ADDR memaddr, unsigned char *myaddr,
2918
                int len)
2919
{
2920
  unsigned char checksum;
2921
  int i;
2922
 
2923
  /* Create the header for the srec. addr_size is the number of bytes in the address,
2924
     and 1 is the number of bytes in the count.  */
2925
 
2926
  /* FIXME!! bigger buf required for 64-bit! */
2927
  buf[0] = 'S';
2928
  buf[1] = type;
2929
  buf[2] = len + 4 + 1;         /* len + 4 byte address + 1 byte checksum */
2930
  /* This assumes S3 style downloads (4byte addresses). There should
2931
     probably be a check, or the code changed to make it more
2932
     explicit. */
2933
  buf[3] = memaddr >> 24;
2934
  buf[4] = memaddr >> 16;
2935
  buf[5] = memaddr >> 8;
2936
  buf[6] = memaddr;
2937
  memcpy (&buf[7], myaddr, len);
2938
 
2939
  /* Note that the checksum is calculated on the raw data, not the
2940
     hexified data.  It includes the length, address and the data
2941
     portions of the packet.  */
2942
  checksum = 0;
2943
  buf += 2;                     /* Point at length byte */
2944
  for (i = 0; i < len + 4 + 1; i++)
2945
    checksum += *buf++;
2946
 
2947
  *buf = ~checksum;
2948
 
2949
  return len + 8;
2950
}
2951
 
2952
/* The following manifest controls whether we enable the simple flow
2953
   control support provided by the monitor. If enabled the code will
2954
   wait for an affirmative ACK between transmitting packets. */
2955
#define DOETXACK (1)
2956
 
2957
/* The PMON fast-download uses an encoded packet format constructed of
2958
   3byte data packets (encoded as 4 printable ASCII characters), and
2959
   escape sequences (preceded by a '/'):
2960
 
2961
   'K'     clear checksum
2962
   'C'     compare checksum (12bit value, not included in checksum calculation)
2963
   'S'     define symbol name (for addr) terminated with "," and padded to 4char boundary
2964
   'Z'     zero fill multiple of 3bytes
2965
   'B'     byte (12bit encoded value, of 8bit data)
2966
   'A'     address (36bit encoded value)
2967
   'E'     define entry as original address, and exit load
2968
 
2969
   The packets are processed in 4 character chunks, so the escape
2970
   sequences that do not have any data (or variable length data)
2971
   should be padded to a 4 character boundary.  The decoder will give
2972
   an error if the complete message block size is not a multiple of
2973
   4bytes (size of record).
2974
 
2975
   The encoding of numbers is done in 6bit fields.  The 6bit value is
2976
   used to index into this string to get the specific character
2977
   encoding for the value: */
2978
static char encoding[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,.";
2979
 
2980
/* Convert the number of bits required into an encoded number, 6bits
2981
   at a time (range 0..63).  Keep a checksum if required (passed
2982
   pointer non-NULL). The function returns the number of encoded
2983
   characters written into the buffer. */
2984
static int
2985
pmon_makeb64 (unsigned long v, char *p, int n, int *chksum)
2986
{
2987
  int count = (n / 6);
2988
 
2989
  if ((n % 12) != 0)
2990
    {
2991
      fprintf_unfiltered (gdb_stderr,
2992
                          "Fast encoding bitcount must be a multiple of 12bits: %dbit%s\n", n, (n == 1) ? "" : "s");
2993
      return (0);
2994
    }
2995
  if (n > 36)
2996
    {
2997
      fprintf_unfiltered (gdb_stderr,
2998
                          "Fast encoding cannot process more than 36bits at the moment: %dbits\n", n);
2999
      return (0);
3000
    }
3001
 
3002
  /* Deal with the checksum: */
3003
  if (chksum != NULL)
3004
    {
3005
      switch (n)
3006
        {
3007
        case 36:
3008
          *chksum += ((v >> 24) & 0xFFF);
3009
        case 24:
3010
          *chksum += ((v >> 12) & 0xFFF);
3011
        case 12:
3012
          *chksum += ((v >> 0) & 0xFFF);
3013
        }
3014
    }
3015
 
3016
  do
3017
    {
3018
      n -= 6;
3019
      *p++ = encoding[(v >> n) & 0x3F];
3020
    }
3021
  while (n > 0);
3022
 
3023
  return (count);
3024
}
3025
 
3026
/* Shorthand function (that could be in-lined) to output the zero-fill
3027
   escape sequence into the data stream. */
3028
static int
3029
pmon_zeroset (int recsize, char **buff, int *amount, unsigned int *chksum)
3030
{
3031
  int count;
3032
 
3033
  sprintf (*buff, "/Z");
3034
  count = pmon_makeb64 (*amount, (*buff + 2), 12, chksum);
3035
  *buff += (count + 2);
3036
  *amount = 0;
3037
  return (recsize + count + 2);
3038
}
3039
 
3040
static int
3041
pmon_checkset (int recsize, char **buff, int *value)
3042
{
3043
  int count;
3044
 
3045
  /* Add the checksum (without updating the value): */
3046
  sprintf (*buff, "/C");
3047
  count = pmon_makeb64 (*value, (*buff + 2), 12, NULL);
3048
  *buff += (count + 2);
3049
  sprintf (*buff, "\n");
3050
  *buff += 2;                   /* include zero terminator */
3051
  /* Forcing a checksum validation clears the sum: */
3052
  *value = 0;
3053
  return (recsize + count + 3);
3054
}
3055
 
3056
/* Amount of padding we leave after at the end of the output buffer,
3057
   for the checksum and line termination characters: */
3058
#define CHECKSIZE (4 + 4 + 4 + 2)
3059
/* zero-fill, checksum, transfer end and line termination space. */
3060
 
3061
/* The amount of binary data loaded from the object file in a single
3062
   operation: */
3063
#define BINCHUNK (1024)
3064
 
3065
/* Maximum line of data accepted by the monitor: */
3066
#define MAXRECSIZE (550)
3067
/* NOTE: This constant depends on the monitor being used. This value
3068
   is for PMON 5.x on the Cogent Vr4300 board. */
3069
 
3070
static void
3071
pmon_make_fastrec (char **outbuf, unsigned char *inbuf, int *inptr,
3072
                   int inamount, int *recsize, unsigned int *csum,
3073
                   unsigned int *zerofill)
3074
{
3075
  int count = 0;
3076
  char *p = *outbuf;
3077
 
3078
  /* This is a simple check to ensure that our data will fit within
3079
     the maximum allowable record size. Each record output is 4bytes
3080
     in length. We must allow space for a pending zero fill command,
3081
     the record, and a checksum record. */
3082
  while ((*recsize < (MAXRECSIZE - CHECKSIZE)) && ((inamount - *inptr) > 0))
3083
    {
3084
      /* Process the binary data: */
3085
      if ((inamount - *inptr) < 3)
3086
        {
3087
          if (*zerofill != 0)
3088
            *recsize = pmon_zeroset (*recsize, &p, zerofill, csum);
3089
          sprintf (p, "/B");
3090
          count = pmon_makeb64 (inbuf[*inptr], &p[2], 12, csum);
3091
          p += (2 + count);
3092
          *recsize += (2 + count);
3093
          (*inptr)++;
3094
        }
3095
      else
3096
        {
3097
          unsigned int value = ((inbuf[*inptr + 0] << 16) | (inbuf[*inptr + 1] << 8) | inbuf[*inptr + 2]);
3098
          /* Simple check for zero data. TODO: A better check would be
3099
             to check the last, and then the middle byte for being zero
3100
             (if the first byte is not). We could then check for
3101
             following runs of zeros, and if above a certain size it is
3102
             worth the 4 or 8 character hit of the byte insertions used
3103
             to pad to the start of the zeroes. NOTE: This also depends
3104
             on the alignment at the end of the zero run. */
3105
          if (value == 0x00000000)
3106
            {
3107
              (*zerofill)++;
3108
              if (*zerofill == 0xFFF)   /* 12bit counter */
3109
                *recsize = pmon_zeroset (*recsize, &p, zerofill, csum);
3110
            }
3111
          else
3112
            {
3113
              if (*zerofill != 0)
3114
                *recsize = pmon_zeroset (*recsize, &p, zerofill, csum);
3115
              count = pmon_makeb64 (value, p, 24, csum);
3116
              p += count;
3117
              *recsize += count;
3118
            }
3119
          *inptr += 3;
3120
        }
3121
    }
3122
 
3123
  *outbuf = p;
3124
  return;
3125
}
3126
 
3127
static int
3128
pmon_check_ack (char *mesg)
3129
{
3130
#if defined(DOETXACK)
3131
  int c;
3132
 
3133
  if (!tftp_in_use)
3134
    {
3135
      c = SERIAL_READCHAR (udp_in_use ? udp_desc : mips_desc,
3136
                           remote_timeout);
3137
      if ((c == SERIAL_TIMEOUT) || (c != 0x06))
3138
        {
3139
          fprintf_unfiltered (gdb_stderr,
3140
                              "Failed to receive valid ACK for %s\n", mesg);
3141
          return (-1);          /* terminate the download */
3142
        }
3143
    }
3144
#endif /* DOETXACK */
3145
  return (0);
3146
}
3147
 
3148
/* pmon_download - Send a sequence of characters to the PMON download port,
3149
   which is either a serial port or a UDP socket.  */
3150
 
3151
static void
3152
pmon_start_download (void)
3153
{
3154
  if (tftp_in_use)
3155
    {
3156
      /* Create the temporary download file.  */
3157
      if ((tftp_file = fopen (tftp_localname, "w")) == NULL)
3158
        perror_with_name (tftp_localname);
3159
    }
3160
  else
3161
    {
3162
      mips_send_command (udp_in_use ? LOAD_CMD_UDP : LOAD_CMD, 0);
3163
      mips_expect ("Downloading from ");
3164
      mips_expect (udp_in_use ? "udp" : "tty0");
3165
      mips_expect (", ^C to abort\r\n");
3166
    }
3167
}
3168
 
3169
static int
3170
mips_expect_download (char *string)
3171
{
3172
  if (!mips_expect (string))
3173
    {
3174
      fprintf_unfiltered (gdb_stderr, "Load did not complete successfully.\n");
3175
      if (tftp_in_use)
3176
        remove (tftp_localname);        /* Remove temporary file */
3177
      return 0;
3178
    }
3179
  else
3180
    return 1;
3181
}
3182
 
3183
static void
3184
pmon_check_entry_address (char *entry_address, int final)
3185
{
3186
  char hexnumber[9];            /* includes '\0' space */
3187
  mips_expect_timeout (entry_address, tftp_in_use ? 15 : remote_timeout);
3188
  sprintf (hexnumber, "%x", final);
3189
  mips_expect (hexnumber);
3190
  mips_expect ("\r\n");
3191
}
3192
 
3193
static int
3194
pmon_check_total (int bintotal)
3195
{
3196
  char hexnumber[9];            /* includes '\0' space */
3197
  mips_expect ("\r\ntotal = 0x");
3198
  sprintf (hexnumber, "%x", bintotal);
3199
  mips_expect (hexnumber);
3200
  return mips_expect_download (" bytes\r\n");
3201
}
3202
 
3203
static void
3204
pmon_end_download (int final, int bintotal)
3205
{
3206
  char hexnumber[9];            /* includes '\0' space */
3207
 
3208
  if (tftp_in_use)
3209
    {
3210
      static char *load_cmd_prefix = "load -b -s ";
3211
      char *cmd;
3212
      struct stat stbuf;
3213
 
3214
      /* Close off the temporary file containing the load data.  */
3215
      fclose (tftp_file);
3216
      tftp_file = NULL;
3217
 
3218
      /* Make the temporary file readable by the world.  */
3219
      if (stat (tftp_localname, &stbuf) == 0)
3220
        chmod (tftp_localname, stbuf.st_mode | S_IROTH);
3221
 
3222
      /* Must reinitialize the board to prevent PMON from crashing.  */
3223
      mips_send_command ("initEther\r", -1);
3224
 
3225
      /* Send the load command.  */
3226
      cmd = xmalloc (strlen (load_cmd_prefix) + strlen (tftp_name) + 2);
3227
      strcpy (cmd, load_cmd_prefix);
3228
      strcat (cmd, tftp_name);
3229
      strcat (cmd, "\r");
3230
      mips_send_command (cmd, 0);
3231
      xfree (cmd);
3232
      if (!mips_expect_download ("Downloading from "))
3233
        return;
3234
      if (!mips_expect_download (tftp_name))
3235
        return;
3236
      if (!mips_expect_download (", ^C to abort\r\n"))
3237
        return;
3238
    }
3239
 
3240
  /* Wait for the stuff that PMON prints after the load has completed.
3241
     The timeout value for use in the tftp case (15 seconds) was picked
3242
     arbitrarily but might be too small for really large downloads. FIXME. */
3243
  switch (mips_monitor)
3244
    {
3245
    case MON_LSI:
3246
      pmon_check_ack ("termination");
3247
      pmon_check_entry_address ("Entry address is ", final);
3248
      if (!pmon_check_total (bintotal))
3249
        return;
3250
      break;
3251
    default:
3252
      pmon_check_entry_address ("Entry Address  = ", final);
3253
      pmon_check_ack ("termination");
3254
      if (!pmon_check_total (bintotal))
3255
        return;
3256
      break;
3257
    }
3258
 
3259
  if (tftp_in_use)
3260
    remove (tftp_localname);    /* Remove temporary file */
3261
}
3262
 
3263
static void
3264
pmon_download (char *buffer, int length)
3265
{
3266
  if (tftp_in_use)
3267
    fwrite (buffer, 1, length, tftp_file);
3268
  else
3269
    SERIAL_WRITE (udp_in_use ? udp_desc : mips_desc, buffer, length);
3270
}
3271
 
3272
static void
3273
pmon_load_fast (char *file)
3274
{
3275
  bfd *abfd;
3276
  asection *s;
3277
  unsigned char *binbuf;
3278
  char *buffer;
3279
  int reclen;
3280
  unsigned int csum = 0;
3281
  int hashmark = !tftp_in_use;
3282
  int bintotal = 0;
3283
  int final = 0;
3284
  int finished = 0;
3285
 
3286
  buffer = (char *) xmalloc (MAXRECSIZE + 1);
3287
  binbuf = (unsigned char *) xmalloc (BINCHUNK);
3288
 
3289
  abfd = bfd_openr (file, 0);
3290
  if (!abfd)
3291
    {
3292
      printf_filtered ("Unable to open file %s\n", file);
3293
      return;
3294
    }
3295
 
3296
  if (bfd_check_format (abfd, bfd_object) == 0)
3297
    {
3298
      printf_filtered ("File is not an object file\n");
3299
      return;
3300
    }
3301
 
3302
  /* Setup the required download state: */
3303
  mips_send_command ("set dlproto etxack\r", -1);
3304
  mips_send_command ("set dlecho off\r", -1);
3305
  /* NOTE: We get a "cannot set variable" message if the variable is
3306
     already defined to have the argument we give. The code doesn't
3307
     care, since it just scans to the next prompt anyway. */
3308
  /* Start the download: */
3309
  pmon_start_download ();
3310
 
3311
  /* Zero the checksum */
3312
  sprintf (buffer, "/Kxx\n");
3313
  reclen = strlen (buffer);
3314
  pmon_download (buffer, reclen);
3315
  finished = pmon_check_ack ("/Kxx");
3316
 
3317
  for (s = abfd->sections; s && !finished; s = s->next)
3318
    if (s->flags & SEC_LOAD)    /* only deal with loadable sections */
3319
      {
3320
        bintotal += s->_raw_size;
3321
        final = (s->vma + s->_raw_size);
3322
 
3323
        printf_filtered ("%s\t: 0x%4x .. 0x%4x  ", s->name, (unsigned int) s->vma,
3324
                         (unsigned int) (s->vma + s->_raw_size));
3325
        gdb_flush (gdb_stdout);
3326
 
3327
        /* Output the starting address */
3328
        sprintf (buffer, "/A");
3329
        reclen = pmon_makeb64 (s->vma, &buffer[2], 36, &csum);
3330
        buffer[2 + reclen] = '\n';
3331
        buffer[3 + reclen] = '\0';
3332
        reclen += 3;            /* for the initial escape code and carriage return */
3333
        pmon_download (buffer, reclen);
3334
        finished = pmon_check_ack ("/A");
3335
 
3336
        if (!finished)
3337
          {
3338
            unsigned int binamount;
3339
            unsigned int zerofill = 0;
3340
            char *bp = buffer;
3341
            unsigned int i;
3342
 
3343
            reclen = 0;
3344
 
3345
            for (i = 0; ((i < s->_raw_size) && !finished); i += binamount)
3346
              {
3347
                int binptr = 0;
3348
 
3349
                binamount = min (BINCHUNK, s->_raw_size - i);
3350
 
3351
                bfd_get_section_contents (abfd, s, binbuf, i, binamount);
3352
 
3353
                /* This keeps a rolling checksum, until we decide to output
3354
                   the line: */
3355
                for (; ((binamount - binptr) > 0);)
3356
                  {
3357
                    pmon_make_fastrec (&bp, binbuf, &binptr, binamount, &reclen, &csum, &zerofill);
3358
                    if (reclen >= (MAXRECSIZE - CHECKSIZE))
3359
                      {
3360
                        reclen = pmon_checkset (reclen, &bp, &csum);
3361
                        pmon_download (buffer, reclen);
3362
                        finished = pmon_check_ack ("data record");
3363
                        if (finished)
3364
                          {
3365
                            zerofill = 0;        /* do not transmit pending zerofills */
3366
                            break;
3367
                          }
3368
 
3369
                        if (hashmark)
3370
                          {
3371
                            putchar_unfiltered ('#');
3372
                            gdb_flush (gdb_stdout);
3373
                          }
3374
 
3375
                        bp = buffer;
3376
                        reclen = 0;      /* buffer processed */
3377
                      }
3378
                  }
3379
              }
3380
 
3381
            /* Ensure no out-standing zerofill requests: */
3382
            if (zerofill != 0)
3383
              reclen = pmon_zeroset (reclen, &bp, &zerofill, &csum);
3384
 
3385
            /* and then flush the line: */
3386
            if (reclen > 0)
3387
              {
3388
                reclen = pmon_checkset (reclen, &bp, &csum);
3389
                /* Currently pmon_checkset outputs the line terminator by
3390
                   default, so we write out the buffer so far: */
3391
                pmon_download (buffer, reclen);
3392
                finished = pmon_check_ack ("record remnant");
3393
              }
3394
          }
3395
 
3396
        putchar_unfiltered ('\n');
3397
      }
3398
 
3399
  /* Terminate the transfer. We know that we have an empty output
3400
     buffer at this point. */
3401
  sprintf (buffer, "/E/E\n");   /* include dummy padding characters */
3402
  reclen = strlen (buffer);
3403
  pmon_download (buffer, reclen);
3404
 
3405
  if (finished)
3406
    {                           /* Ignore the termination message: */
3407
      SERIAL_FLUSH_INPUT (udp_in_use ? udp_desc : mips_desc);
3408
    }
3409
  else
3410
    {                           /* Deal with termination message: */
3411
      pmon_end_download (final, bintotal);
3412
    }
3413
 
3414
  return;
3415
}
3416
 
3417
/* mips_load -- download a file. */
3418
 
3419
static void
3420
mips_load (char *file, int from_tty)
3421
{
3422
  /* Get the board out of remote debugging mode.  */
3423
  if (mips_exit_debug ())
3424
    error ("mips_load:  Couldn't get into monitor mode.");
3425
 
3426
  if (mips_monitor != MON_IDT)
3427
    pmon_load_fast (file);
3428
  else
3429
    mips_load_srec (file);
3430
 
3431
  mips_initialize ();
3432
 
3433
  /* Finally, make the PC point at the start address */
3434
  if (mips_monitor != MON_IDT)
3435
    {
3436
      /* Work around problem where PMON monitor updates the PC after a load
3437
         to a different value than GDB thinks it has. The following ensures
3438
         that the write_pc() WILL update the PC value: */
3439
      register_valid[PC_REGNUM] = 0;
3440
    }
3441
  if (exec_bfd)
3442
    write_pc (bfd_get_start_address (exec_bfd));
3443
 
3444
  inferior_ptid = null_ptid;    /* No process now */
3445
 
3446
/* This is necessary because many things were based on the PC at the time that
3447
   we attached to the monitor, which is no longer valid now that we have loaded
3448
   new code (and just changed the PC).  Another way to do this might be to call
3449
   normal_stop, except that the stack may not be valid, and things would get
3450
   horribly confused... */
3451
 
3452
  clear_symtab_users ();
3453
}
3454
 
3455
 
3456
/* Pass the command argument as a packet to PMON verbatim.  */
3457
 
3458
static void
3459
pmon_command (char *args, int from_tty)
3460
{
3461
  char buf[DATA_MAXLEN + 1];
3462
  int rlen;
3463
 
3464
  sprintf (buf, "0x0 %s", args);
3465
  mips_send_packet (buf, 1);
3466
  printf_filtered ("Send packet: %s\n", buf);
3467
 
3468
  rlen = mips_receive_packet (buf, 1, mips_receive_wait);
3469
  buf[rlen] = '\0';
3470
  printf_filtered ("Received packet: %s\n", buf);
3471
}
3472
 
3473
void
3474
_initialize_remote_mips (void)
3475
{
3476
  /* Initialize the fields in mips_ops that are common to all four targets.  */
3477
  mips_ops.to_longname = "Remote MIPS debugging over serial line";
3478
  mips_ops.to_close = mips_close;
3479
  mips_ops.to_detach = mips_detach;
3480
  mips_ops.to_resume = mips_resume;
3481
  mips_ops.to_fetch_registers = mips_fetch_registers;
3482
  mips_ops.to_store_registers = mips_store_registers;
3483
  mips_ops.to_prepare_to_store = mips_prepare_to_store;
3484
  mips_ops.to_xfer_memory = mips_xfer_memory;
3485
  mips_ops.to_files_info = mips_files_info;
3486
  mips_ops.to_insert_breakpoint = mips_insert_breakpoint;
3487
  mips_ops.to_remove_breakpoint = mips_remove_breakpoint;
3488
  mips_ops.to_kill = mips_kill;
3489
  mips_ops.to_load = mips_load;
3490
  mips_ops.to_create_inferior = mips_create_inferior;
3491
  mips_ops.to_mourn_inferior = mips_mourn_inferior;
3492
  mips_ops.to_stratum = process_stratum;
3493
  mips_ops.to_has_all_memory = 1;
3494
  mips_ops.to_has_memory = 1;
3495
  mips_ops.to_has_stack = 1;
3496
  mips_ops.to_has_registers = 1;
3497
  mips_ops.to_has_execution = 1;
3498
  mips_ops.to_magic = OPS_MAGIC;
3499
 
3500
  /* Copy the common fields to all four target vectors.  */
3501
  pmon_ops = ddb_ops = lsi_ops = mips_ops;
3502
 
3503
  /* Initialize target-specific fields in the target vectors.  */
3504
  mips_ops.to_shortname = "mips";
3505
  mips_ops.to_doc = "\
3506
Debug a board using the MIPS remote debugging protocol over a serial line.\n\
3507
The argument is the device it is connected to or, if it contains a colon,\n\
3508
HOST:PORT to access a board over a network";
3509
  mips_ops.to_open = mips_open;
3510
  mips_ops.to_wait = mips_wait;
3511
 
3512
  pmon_ops.to_shortname = "pmon";
3513
  pmon_ops.to_doc = "\
3514
Debug a board using the PMON MIPS remote debugging protocol over a serial\n\
3515
line. The argument is the device it is connected to or, if it contains a\n\
3516
colon, HOST:PORT to access a board over a network";
3517
  pmon_ops.to_open = pmon_open;
3518
  pmon_ops.to_wait = mips_wait;
3519
 
3520
  ddb_ops.to_shortname = "ddb";
3521
  ddb_ops.to_doc = "\
3522
Debug a board using the PMON MIPS remote debugging protocol over a serial\n\
3523
line. The first argument is the device it is connected to or, if it contains\n\
3524
a colon, HOST:PORT to access a board over a network.  The optional second\n\
3525
parameter is the temporary file in the form HOST:FILENAME to be used for\n\
3526
TFTP downloads to the board.  The optional third parameter is the local name\n\
3527
of the TFTP temporary file, if it differs from the filename seen by the board.";
3528
  ddb_ops.to_open = ddb_open;
3529
  ddb_ops.to_wait = mips_wait;
3530
 
3531
  lsi_ops.to_shortname = "lsi";
3532
  lsi_ops.to_doc = pmon_ops.to_doc;
3533
  lsi_ops.to_open = lsi_open;
3534
  lsi_ops.to_wait = mips_wait;
3535
 
3536
  /* Add the targets.  */
3537
  add_target (&mips_ops);
3538
  add_target (&pmon_ops);
3539
  add_target (&ddb_ops);
3540
  add_target (&lsi_ops);
3541
 
3542
  add_show_from_set (
3543
                      add_set_cmd ("timeout", no_class, var_zinteger,
3544
                                   (char *) &mips_receive_wait,
3545
                       "Set timeout in seconds for remote MIPS serial I/O.",
3546
                                   &setlist),
3547
                      &showlist);
3548
 
3549
  add_show_from_set (
3550
                  add_set_cmd ("retransmit-timeout", no_class, var_zinteger,
3551
                               (char *) &mips_retransmit_wait,
3552
                               "Set retransmit timeout in seconds for remote MIPS serial I/O.\n\
3553
This is the number of seconds to wait for an acknowledgement to a packet\n\
3554
before resending the packet.", &setlist),
3555
                      &showlist);
3556
 
3557
  add_show_from_set (
3558
                   add_set_cmd ("syn-garbage-limit", no_class, var_zinteger,
3559
                                (char *) &mips_syn_garbage,
3560
                                "Set the maximum number of characters to ignore when scanning for a SYN.\n\
3561
This is the maximum number of characters GDB will ignore when trying to\n\
3562
synchronize with the remote system.  A value of -1 means that there is no limit\n\
3563
(Note that these characters are printed out even though they are ignored.)",
3564
                                &setlist),
3565
                      &showlist);
3566
 
3567
  add_show_from_set
3568
    (add_set_cmd ("monitor-prompt", class_obscure, var_string,
3569
                  (char *) &mips_monitor_prompt,
3570
                  "Set the prompt that GDB expects from the monitor.",
3571
                  &setlist),
3572
     &showlist);
3573
 
3574
  add_show_from_set (
3575
               add_set_cmd ("monitor-warnings", class_obscure, var_zinteger,
3576
                            (char *) &monitor_warnings,
3577
                            "Set printing of monitor warnings.\n"
3578
                "When enabled, monitor warnings about hardware breakpoints "
3579
                            "will be displayed.",
3580
                            &setlist),
3581
                      &showlist);
3582
 
3583
  add_com ("pmon <command>", class_obscure, pmon_command,
3584
           "Send a packet to PMON (must be in debug mode).");
3585
 
3586
  add_show_from_set (add_set_cmd ("mask-address", no_class,
3587
                                  var_boolean, &mask_address_p,
3588
                                  "Set zeroing of upper 32 bits of 64-bit addresses when talking to PMON targets.\n\
3589
Use \"on\" to enable the masking and \"off\" to disable it.\n",
3590
                                  &setlist),
3591
                     &showlist);
3592
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.