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

Subversion Repositories or1k

[/] [or1k/] [branches/] [oc/] [gdb-5.0/] [gdb/] [remote-mips.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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