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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [remote-bug.c] - Blame information for rev 1775

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Remote debugging interface for Motorola's MVME187BUG monitor, an embedded
2
   monitor for the m88k.
3
 
4
   Copyright 1992, 1993 Free Software Foundation, Inc.
5
   Contributed by Cygnus Support.  Written by K. Richard Pixley.
6
 
7
   This file is part of GDB.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 2 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program; if not, write to the Free Software
21
   Foundation, Inc., 59 Temple Place - Suite 330,
22
   Boston, MA 02111-1307, USA.  */
23
 
24
#include "defs.h"
25
#include "inferior.h"
26
#include "gdb_wait.h"
27
 
28
#include "gdb_string.h"
29
#include <ctype.h>
30
#include <fcntl.h>
31
#include <signal.h>
32
#include <setjmp.h>
33
#include <errno.h>
34
 
35
#include "terminal.h"
36
#include "gdbcore.h"
37
#include "gdbcmd.h"
38
 
39
#include "remote-utils.h"
40
 
41
 
42
extern int sleep ();
43
 
44
/* External data declarations */
45
extern int stop_soon_quietly;   /* for wait_for_inferior */
46
 
47
/* Forward data declarations */
48
extern struct target_ops bug_ops;       /* Forward declaration */
49
 
50
/* Forward function declarations */
51
static int bug_clear_breakpoints PARAMS ((void));
52
 
53
static int bug_read_memory PARAMS ((CORE_ADDR memaddr,
54
                                    unsigned char *myaddr,
55
                                    int len));
56
 
57
static int bug_write_memory PARAMS ((CORE_ADDR memaddr,
58
                                     unsigned char *myaddr,
59
                                     int len));
60
 
61
/* This variable is somewhat arbitrary.  It's here so that it can be
62
   set from within a running gdb.  */
63
 
64
static int srec_max_retries = 3;
65
 
66
/* Each S-record download to the target consists of an S0 header
67
   record, some number of S3 data records, and one S7 termination
68
   record.  I call this download a "frame".  Srec_frame says how many
69
   bytes will be represented in each frame.  */
70
 
71
#define SREC_SIZE 160
72
static int srec_frame = SREC_SIZE;
73
 
74
/* This variable determines how many bytes will be represented in each
75
   S3 s-record.  */
76
 
77
static int srec_bytes = 40;
78
 
79
/* At one point it appeared to me as though the bug monitor could not
80
   really be expected to receive two sequential characters at 9600
81
   baud reliably.  Echo-pacing is an attempt to force data across the
82
   line even in this condition.  Specifically, in echo-pace mode, each
83
   character is sent one at a time and we look for the echo before
84
   sending the next.  This is excruciatingly slow.  */
85
 
86
static int srec_echo_pace = 0;
87
 
88
/* How long to wait after an srec for a possible error message.
89
   Similar to the above, I tried sleeping after sending each S3 record
90
   in hopes that I might actually see error messages from the bug
91
   monitor.  This might actually work if we were to use sleep
92
   intervals smaller than 1 second.  */
93
 
94
static int srec_sleep = 0;
95
 
96
/* Every srec_noise records, flub the checksum.  This is a debugging
97
   feature.  Set the variable to something other than 1 in order to
98
   inject *deliberate* checksum errors.  One might do this if one
99
   wanted to test error handling and recovery.  */
100
 
101
static int srec_noise = 0;
102
 
103
/* Called when SIGALRM signal sent due to alarm() timeout.  */
104
 
105
/* Number of SIGTRAPs we need to simulate.  That is, the next
106
   NEED_ARTIFICIAL_TRAP calls to bug_wait should just return
107
   SIGTRAP without actually waiting for anything.  */
108
 
109
static int need_artificial_trap = 0;
110
 
111
/*
112
 * Download a file specified in 'args', to the bug.
113
 */
114
 
115
static void
116
bug_load (args, fromtty)
117
     char *args;
118
     int fromtty;
119
{
120
  bfd *abfd;
121
  asection *s;
122
  char buffer[1024];
123
 
124
  sr_check_open ();
125
 
126
  dcache_flush (gr_get_dcache ());
127
  inferior_pid = 0;
128
  abfd = bfd_openr (args, 0);
129
  if (!abfd)
130
    {
131
      printf_filtered ("Unable to open file %s\n", args);
132
      return;
133
    }
134
 
135
  if (bfd_check_format (abfd, bfd_object) == 0)
136
    {
137
      printf_filtered ("File is not an object file\n");
138
      return;
139
    }
140
 
141
  s = abfd->sections;
142
  while (s != (asection *) NULL)
143
    {
144
      srec_frame = SREC_SIZE;
145
      if (s->flags & SEC_LOAD)
146
        {
147
          int i;
148
 
149
          char *buffer = xmalloc (srec_frame);
150
 
151
          printf_filtered ("%s\t: 0x%4x .. 0x%4x  ", s->name, s->vma, s->vma + s->_raw_size);
152
          gdb_flush (gdb_stdout);
153
          for (i = 0; i < s->_raw_size; i += srec_frame)
154
            {
155
              if (srec_frame > s->_raw_size - i)
156
                srec_frame = s->_raw_size - i;
157
 
158
              bfd_get_section_contents (abfd, s, buffer, i, srec_frame);
159
              bug_write_memory (s->vma + i, buffer, srec_frame);
160
              printf_filtered ("*");
161
              gdb_flush (gdb_stdout);
162
            }
163
          printf_filtered ("\n");
164
          free (buffer);
165
        }
166
      s = s->next;
167
    }
168
  sprintf (buffer, "rs ip %lx", (unsigned long) abfd->start_address);
169
  sr_write_cr (buffer);
170
  gr_expect_prompt ();
171
}
172
 
173
#if 0
174
static char *
175
get_word (p)
176
     char **p;
177
{
178
  char *s = *p;
179
  char *word;
180
  char *copy;
181
  size_t len;
182
 
183
  while (isspace (*s))
184
    s++;
185
 
186
  word = s;
187
 
188
  len = 0;
189
 
190
  while (*s && !isspace (*s))
191
    {
192
      s++;
193
      len++;
194
 
195
    }
196
  copy = xmalloc (len + 1);
197
  memcpy (copy, word, len);
198
  copy[len] = 0;
199
  *p = s;
200
  return copy;
201
}
202
#endif
203
 
204
static struct gr_settings bug_settings =
205
{
206
  NULL,                         /* dcache */
207
  "Bug>",                       /* prompt */
208
  &bug_ops,                     /* ops */
209
  bug_clear_breakpoints,        /* clear_all_breakpoints */
210
  bug_read_memory,              /* readfunc */
211
  bug_write_memory,             /* writefunc */
212
  gr_generic_checkin,           /* checkin */
213
};
214
 
215
static char *cpu_check_strings[] =
216
{
217
  "=",
218
  "Invalid Register",
219
};
220
 
221
static void
222
bug_open (args, from_tty)
223
     char *args;
224
     int from_tty;
225
{
226
  if (args == NULL)
227
    args = "";
228
 
229
  gr_open (args, from_tty, &bug_settings);
230
  /* decide *now* whether we are on an 88100 or an 88110 */
231
  sr_write_cr ("rs cr06");
232
  sr_expect ("rs cr06");
233
 
234
  switch (gr_multi_scan (cpu_check_strings, 0))
235
    {
236
    case 0:                      /* this is an m88100 */
237
      target_is_m88110 = 0;
238
      break;
239
    case 1:                     /* this is an m88110 */
240
      target_is_m88110 = 1;
241
      break;
242
    default:
243
      abort ();
244
    }
245
}
246
 
247
/* Tell the remote machine to resume.  */
248
 
249
void
250
bug_resume (pid, step, sig)
251
     int pid, step;
252
     enum target_signal sig;
253
{
254
  dcache_flush (gr_get_dcache ());
255
 
256
  if (step)
257
    {
258
      sr_write_cr ("t");
259
 
260
      /* Force the next bug_wait to return a trap.  Not doing anything
261
         about I/O from the target means that the user has to type
262
         "continue" to see any.  FIXME, this should be fixed.  */
263
      need_artificial_trap = 1;
264
    }
265
  else
266
    sr_write_cr ("g");
267
 
268
  return;
269
}
270
 
271
/* Wait until the remote machine stops, then return,
272
   storing status in STATUS just as `wait' would.  */
273
 
274
static char *wait_strings[] =
275
{
276
  "At Breakpoint",
277
  "Exception: Data Access Fault (Local Bus Timeout)",
278
  "\r8??\?-Bug>",               /* The '\?' avoids creating a trigraph */
279
  "\r197-Bug>",
280
  NULL,
281
};
282
 
283
int
284
bug_wait (pid, status)
285
     int pid;
286
     struct target_waitstatus *status;
287
{
288
  int old_timeout = sr_get_timeout ();
289
  int old_immediate_quit = immediate_quit;
290
 
291
  status->kind = TARGET_WAITKIND_EXITED;
292
  status->value.integer = 0;
293
 
294
  /* read off leftovers from resume so that the rest can be passed
295
     back out as stdout.  */
296
  if (need_artificial_trap == 0)
297
    {
298
      sr_expect ("Effective address: ");
299
      (void) sr_get_hex_word ();
300
      sr_expect ("\r\n");
301
    }
302
 
303
  sr_set_timeout (-1);          /* Don't time out -- user program is running. */
304
  immediate_quit = 1;           /* Helps ability to QUIT */
305
 
306
  switch (gr_multi_scan (wait_strings, need_artificial_trap == 0))
307
    {
308
    case 0:                      /* breakpoint case */
309
      status->kind = TARGET_WAITKIND_STOPPED;
310
      status->value.sig = TARGET_SIGNAL_TRAP;
311
      /* user output from the target can be discarded here. (?) */
312
      gr_expect_prompt ();
313
      break;
314
 
315
    case 1:                     /* bus error */
316
      status->kind = TARGET_WAITKIND_STOPPED;
317
      status->value.sig = TARGET_SIGNAL_BUS;
318
      /* user output from the target can be discarded here. (?) */
319
      gr_expect_prompt ();
320
      break;
321
 
322
    case 2:                     /* normal case */
323
    case 3:
324
      if (need_artificial_trap != 0)
325
        {
326
          /* stepping */
327
          status->kind = TARGET_WAITKIND_STOPPED;
328
          status->value.sig = TARGET_SIGNAL_TRAP;
329
          need_artificial_trap--;
330
          break;
331
        }
332
      else
333
        {
334
          /* exit case */
335
          status->kind = TARGET_WAITKIND_EXITED;
336
          status->value.integer = 0;
337
          break;
338
        }
339
 
340
    case -1:                    /* trouble */
341
    default:
342
      fprintf_filtered (gdb_stderr,
343
                        "Trouble reading target during wait\n");
344
      break;
345
    }
346
 
347
  sr_set_timeout (old_timeout);
348
  immediate_quit = old_immediate_quit;
349
  return 0;
350
}
351
 
352
/* Return the name of register number REGNO
353
   in the form input and output by bug.
354
 
355
   Returns a pointer to a static buffer containing the answer.  */
356
static char *
357
get_reg_name (regno)
358
     int regno;
359
{
360
  static char *rn[] =
361
  {
362
    "r00", "r01", "r02", "r03", "r04", "r05", "r06", "r07",
363
    "r08", "r09", "r10", "r11", "r12", "r13", "r14", "r15",
364
    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
365
    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
366
 
367
  /* these get confusing because we omit a few and switch some ordering around. */
368
 
369
    "cr01",                     /* 32 = psr */
370
    "fcr62",                    /* 33 = fpsr */
371
    "fcr63",                    /* 34 = fpcr */
372
    "ip",                       /* this is something of a cheat. */
373
  /* 35 = sxip */
374
    "cr05",                     /* 36 = snip */
375
    "cr06",                     /* 37 = sfip */
376
 
377
    "x00", "x01", "x02", "x03", "x04", "x05", "x06", "x07",
378
    "x08", "x09", "x10", "x11", "x12", "x13", "x14", "x15",
379
    "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
380
    "x24", "x25", "x26", "x27", "x28", "x29", "x30", "x31",
381
  };
382
 
383
  return rn[regno];
384
}
385
 
386
#if 0                           /* not currently used */
387
/* Read from remote while the input matches STRING.  Return zero on
388
   success, -1 on failure.  */
389
 
390
static int
391
bug_scan (s)
392
     char *s;
393
{
394
  int c;
395
 
396
  while (*s)
397
    {
398
      c = sr_readchar ();
399
      if (c != *s++)
400
        {
401
          fflush (stdout);
402
          printf ("\nNext character is '%c' - %d and s is \"%s\".\n", c, c, --s);
403
          return (-1);
404
        }
405
    }
406
 
407
  return (0);
408
}
409
#endif /* never */
410
 
411
static int
412
bug_srec_write_cr (s)
413
     char *s;
414
{
415
  char *p = s;
416
 
417
  if (srec_echo_pace)
418
    for (p = s; *p; ++p)
419
      {
420
        if (sr_get_debug () > 0)
421
          printf ("%c", *p);
422
 
423
        do
424
          SERIAL_WRITE (sr_get_desc (), p, 1);
425
        while (sr_pollchar () != *p);
426
      }
427
  else
428
    {
429
      sr_write_cr (s);
430
/*       return(bug_scan (s) || bug_scan ("\n")); */
431
    }
432
 
433
  return (0);
434
}
435
 
436
/* Store register REGNO, or all if REGNO == -1. */
437
 
438
static void
439
bug_fetch_register (regno)
440
     int regno;
441
{
442
  sr_check_open ();
443
 
444
  if (regno == -1)
445
    {
446
      int i;
447
 
448
      for (i = 0; i < NUM_REGS; ++i)
449
        bug_fetch_register (i);
450
    }
451
  else if (target_is_m88110 && regno == SFIP_REGNUM)
452
    {
453
      /* m88110 has no sfip. */
454
      long l = 0;
455
      supply_register (regno, (char *) &l);
456
    }
457
  else if (regno < XFP_REGNUM)
458
    {
459
      char buffer[MAX_REGISTER_RAW_SIZE];
460
 
461
      sr_write ("rs ", 3);
462
      sr_write_cr (get_reg_name (regno));
463
      sr_expect ("=");
464
      store_unsigned_integer (buffer, REGISTER_RAW_SIZE (regno),
465
                              sr_get_hex_word ());
466
      gr_expect_prompt ();
467
      supply_register (regno, buffer);
468
    }
469
  else
470
    {
471
      /* Float register so we need to parse a strange data format. */
472
      long p;
473
      unsigned char fpreg_buf[10];
474
 
475
      sr_write ("rs ", 3);
476
      sr_write (get_reg_name (regno), strlen (get_reg_name (regno)));
477
      sr_write_cr (";d");
478
      sr_expect ("rs");
479
      sr_expect (get_reg_name (regno));
480
      sr_expect (";d");
481
      sr_expect ("=");
482
 
483
      /* sign */
484
      p = sr_get_hex_digit (1);
485
      fpreg_buf[0] = p << 7;
486
 
487
      /* exponent */
488
      sr_expect ("_");
489
      p = sr_get_hex_digit (1);
490
      fpreg_buf[0] += (p << 4);
491
      fpreg_buf[0] += sr_get_hex_digit (1);
492
 
493
      fpreg_buf[1] = sr_get_hex_digit (1) << 4;
494
 
495
      /* fraction */
496
      sr_expect ("_");
497
      fpreg_buf[1] += sr_get_hex_digit (1);
498
 
499
      fpreg_buf[2] = (sr_get_hex_digit (1) << 4) + sr_get_hex_digit (1);
500
      fpreg_buf[3] = (sr_get_hex_digit (1) << 4) + sr_get_hex_digit (1);
501
      fpreg_buf[4] = (sr_get_hex_digit (1) << 4) + sr_get_hex_digit (1);
502
      fpreg_buf[5] = (sr_get_hex_digit (1) << 4) + sr_get_hex_digit (1);
503
      fpreg_buf[6] = (sr_get_hex_digit (1) << 4) + sr_get_hex_digit (1);
504
      fpreg_buf[7] = (sr_get_hex_digit (1) << 4) + sr_get_hex_digit (1);
505
      fpreg_buf[8] = 0;
506
      fpreg_buf[9] = 0;
507
 
508
      gr_expect_prompt ();
509
      supply_register (regno, fpreg_buf);
510
    }
511
 
512
  return;
513
}
514
 
515
/* Store register REGNO, or all if REGNO == -1. */
516
 
517
static void
518
bug_store_register (regno)
519
     int regno;
520
{
521
  char buffer[1024];
522
  sr_check_open ();
523
 
524
  if (regno == -1)
525
    {
526
      int i;
527
 
528
      for (i = 0; i < NUM_REGS; ++i)
529
        bug_store_register (i);
530
    }
531
  else
532
    {
533
      char *regname;
534
 
535
      regname = get_reg_name (regno);
536
 
537
      if (target_is_m88110 && regno == SFIP_REGNUM)
538
        return;
539
      else if (regno < XFP_REGNUM)
540
        sprintf (buffer, "rs %s %08x",
541
                 regname,
542
                 read_register (regno));
543
      else
544
        {
545
          unsigned char *fpreg_buf =
546
          (unsigned char *) &registers[REGISTER_BYTE (regno)];
547
 
548
          sprintf (buffer, "rs %s %1x_%02x%1x_%1x%02x%02x%02x%02x%02x%02x;d",
549
                   regname,
550
          /* sign */
551
                   (fpreg_buf[0] >> 7) & 0xf,
552
          /* exponent */
553
                   fpreg_buf[0] & 0x7f,
554
                   (fpreg_buf[1] >> 8) & 0xf,
555
          /* fraction */
556
                   fpreg_buf[1] & 0xf,
557
                   fpreg_buf[2],
558
                   fpreg_buf[3],
559
                   fpreg_buf[4],
560
                   fpreg_buf[5],
561
                   fpreg_buf[6],
562
                   fpreg_buf[7]);
563
        }
564
 
565
      sr_write_cr (buffer);
566
      gr_expect_prompt ();
567
    }
568
 
569
  return;
570
}
571
 
572
int
573
bug_xfer_memory (memaddr, myaddr, len, write, target)
574
     CORE_ADDR memaddr;
575
     char *myaddr;
576
     int len;
577
     int write;
578
     struct target_ops *target; /* ignored */
579
{
580
  register int i;
581
 
582
  /* Round starting address down to longword boundary.  */
583
  register CORE_ADDR addr;
584
 
585
  /* Round ending address up; get number of longwords that makes.  */
586
  register int count;
587
 
588
  /* Allocate buffer of that many longwords.  */
589
  register int *buffer;
590
 
591
  addr = memaddr & -sizeof (int);
592
  count = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
593
 
594
  buffer = (int *) alloca (count * sizeof (int));
595
 
596
  if (write)
597
    {
598
      /* Fill start and end extra bytes of buffer with existing memory data.  */
599
 
600
      if (addr != memaddr || len < (int) sizeof (int))
601
        {
602
          /* Need part of initial word -- fetch it.  */
603
          buffer[0] = gr_fetch_word (addr);
604
        }
605
 
606
      if (count > 1)            /* FIXME, avoid if even boundary */
607
        {
608
          buffer[count - 1]
609
            = gr_fetch_word (addr + (count - 1) * sizeof (int));
610
        }
611
 
612
      /* Copy data to be written over corresponding part of buffer */
613
 
614
      memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
615
 
616
      /* Write the entire buffer.  */
617
 
618
      for (i = 0; i < count; i++, addr += sizeof (int))
619
        {
620
          errno = 0;
621
          gr_store_word (addr, buffer[i]);
622
          if (errno)
623
            {
624
 
625
              return 0;
626
            }
627
 
628
        }
629
    }
630
  else
631
    {
632
      /* Read all the longwords */
633
      for (i = 0; i < count; i++, addr += sizeof (int))
634
        {
635
          errno = 0;
636
          buffer[i] = gr_fetch_word (addr);
637
          if (errno)
638
            {
639
              return 0;
640
            }
641
          QUIT;
642
        }
643
 
644
      /* Copy appropriate bytes out of the buffer.  */
645
      memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
646
    }
647
 
648
  return len;
649
}
650
 
651
static void
652
start_load ()
653
{
654
  char *command;
655
 
656
  command = (srec_echo_pace ? "lo 0 ;x" : "lo 0");
657
 
658
  sr_write_cr (command);
659
  sr_expect (command);
660
  sr_expect ("\r\n");
661
  bug_srec_write_cr ("S0030000FC");
662
  return;
663
}
664
 
665
/* This is an extremely vulnerable and fragile function.  I've made
666
   considerable attempts to make this deterministic, but I've
667
   certainly forgotten something.  The trouble is that S-records are
668
   only a partial file format, not a protocol.  Worse, apparently the
669
   m88k bug monitor does not run in real time while receiving
670
   S-records.  Hence, we must pay excruciating attention to when and
671
   where error messages are returned, and what has actually been sent.
672
 
673
   Each call represents a chunk of memory to be sent to the target.
674
   We break that chunk into an S0 header record, some number of S3
675
   data records each containing srec_bytes, and an S7 termination
676
   record.  */
677
 
678
static char *srecord_strings[] =
679
{
680
  "S-RECORD",
681
  "-Bug>",
682
  NULL,
683
};
684
 
685
static int
686
bug_write_memory (memaddr, myaddr, len)
687
     CORE_ADDR memaddr;
688
     unsigned char *myaddr;
689
     int len;
690
{
691
  int done;
692
  int checksum;
693
  int x;
694
  int retries;
695
  char *buffer = alloca ((srec_bytes + 8) << 1);
696
 
697
  retries = 0;
698
 
699
  do
700
    {
701
      done = 0;
702
 
703
      if (retries > srec_max_retries)
704
        return (-1);
705
 
706
      if (retries > 0)
707
        {
708
          if (sr_get_debug () > 0)
709
            printf ("\n<retrying...>\n");
710
 
711
          /* This gr_expect_prompt call is extremely important.  Without
712
             it, we will tend to resend our packet so fast that it
713
             will arrive before the bug monitor is ready to receive
714
             it.  This would lead to a very ugly resend loop.  */
715
 
716
          gr_expect_prompt ();
717
        }
718
 
719
      start_load ();
720
 
721
      while (done < len)
722
        {
723
          int thisgo;
724
          int idx;
725
          char *buf = buffer;
726
          CORE_ADDR address;
727
 
728
          checksum = 0;
729
          thisgo = len - done;
730
          if (thisgo > srec_bytes)
731
            thisgo = srec_bytes;
732
 
733
          address = memaddr + done;
734
          sprintf (buf, "S3%02X%08X", thisgo + 4 + 1, address);
735
          buf += 12;
736
 
737
          checksum += (thisgo + 4 + 1
738
                       + (address & 0xff)
739
                       + ((address >> 8) & 0xff)
740
                       + ((address >> 16) & 0xff)
741
                       + ((address >> 24) & 0xff));
742
 
743
          for (idx = 0; idx < thisgo; idx++)
744
            {
745
              sprintf (buf, "%02X", myaddr[idx + done]);
746
              checksum += myaddr[idx + done];
747
              buf += 2;
748
            }
749
 
750
          if (srec_noise > 0)
751
            {
752
              /* FIXME-NOW: insert a deliberate error every now and then.
753
                 This is intended for testing/debugging the error handling
754
                 stuff.  */
755
              static int counter = 0;
756
              if (++counter > srec_noise)
757
                {
758
                  counter = 0;
759
                  ++checksum;
760
                }
761
            }
762
 
763
          sprintf (buf, "%02X", ~checksum & 0xff);
764
          bug_srec_write_cr (buffer);
765
 
766
          if (srec_sleep != 0)
767
            sleep (srec_sleep);
768
 
769
          /* This pollchar is probably redundant to the gr_multi_scan
770
             below.  Trouble is, we can't be sure when or where an
771
             error message will appear.  Apparently, when running at
772
             full speed from a typical sun4, error messages tend to
773
             appear to arrive only *after* the s7 record.   */
774
 
775
          if ((x = sr_pollchar ()) != 0)
776
            {
777
              if (sr_get_debug () > 0)
778
                printf ("\n<retrying...>\n");
779
 
780
              ++retries;
781
 
782
              /* flush any remaining input and verify that we are back
783
                 at the prompt level. */
784
              gr_expect_prompt ();
785
              /* start all over again. */
786
              start_load ();
787
              done = 0;
788
              continue;
789
            }
790
 
791
          done += thisgo;
792
        }
793
 
794
      bug_srec_write_cr ("S7060000000000F9");
795
      ++retries;
796
 
797
      /* Having finished the load, we need to figure out whether we
798
         had any errors.  */
799
    }
800
  while (gr_multi_scan (srecord_strings, 0) == 0);;
801
 
802
  return (0);
803
}
804
 
805
/* Copy LEN bytes of data from debugger memory at MYADDR
806
   to inferior's memory at MEMADDR.  Returns errno value.
807
   * sb/sh instructions don't work on unaligned addresses, when TU=1.
808
 */
809
 
810
/* Read LEN bytes from inferior memory at MEMADDR.  Put the result
811
   at debugger address MYADDR.  Returns errno value.  */
812
static int
813
bug_read_memory (memaddr, myaddr, len)
814
     CORE_ADDR memaddr;
815
     unsigned char *myaddr;
816
     int len;
817
{
818
  char request[100];
819
  char *buffer;
820
  char *p;
821
  char type;
822
  char size;
823
  unsigned char c;
824
  unsigned int inaddr;
825
  unsigned int checksum;
826
 
827
  sprintf (request, "du 0 %x:&%d", memaddr, len);
828
  sr_write_cr (request);
829
 
830
  p = buffer = alloca (len);
831
 
832
  /* scan up through the header */
833
  sr_expect ("S0030000FC");
834
 
835
  while (p < buffer + len)
836
    {
837
      /* scan off any white space. */
838
      while (sr_readchar () != 'S');;
839
 
840
      /* what kind of s-rec? */
841
      type = sr_readchar ();
842
 
843
      /* scan record size */
844
      sr_get_hex_byte (&size);
845
      checksum = size;
846
      --size;
847
      inaddr = 0;
848
 
849
      switch (type)
850
        {
851
        case '7':
852
        case '8':
853
        case '9':
854
          goto done;
855
 
856
        case '3':
857
          sr_get_hex_byte (&c);
858
          inaddr = (inaddr << 8) + c;
859
          checksum += c;
860
          --size;
861
          /* intentional fall through */
862
        case '2':
863
          sr_get_hex_byte (&c);
864
          inaddr = (inaddr << 8) + c;
865
          checksum += c;
866
          --size;
867
          /* intentional fall through */
868
        case '1':
869
          sr_get_hex_byte (&c);
870
          inaddr = (inaddr << 8) + c;
871
          checksum += c;
872
          --size;
873
          sr_get_hex_byte (&c);
874
          inaddr = (inaddr << 8) + c;
875
          checksum += c;
876
          --size;
877
          break;
878
 
879
        default:
880
          /* bonk */
881
          error ("reading s-records.");
882
        }
883
 
884
      if (inaddr < memaddr
885
          || (memaddr + len) < (inaddr + size))
886
        error ("srec out of memory range.");
887
 
888
      if (p != buffer + inaddr - memaddr)
889
        error ("srec out of sequence.");
890
 
891
      for (; size; --size, ++p)
892
        {
893
          sr_get_hex_byte (p);
894
          checksum += *p;
895
        }
896
 
897
      sr_get_hex_byte (&c);
898
      if (c != (~checksum & 0xff))
899
        error ("bad s-rec checksum");
900
    }
901
 
902
done:
903
  gr_expect_prompt ();
904
  if (p != buffer + len)
905
    return (1);
906
 
907
  memcpy (myaddr, buffer, len);
908
  return (0);
909
}
910
 
911
#define MAX_BREAKS      16
912
static int num_brkpts = 0;
913
static int
914
bug_insert_breakpoint (addr, save)
915
     CORE_ADDR addr;
916
     char *save;                /* Throw away, let bug save instructions */
917
{
918
  sr_check_open ();
919
 
920
  if (num_brkpts < MAX_BREAKS)
921
    {
922
      char buffer[100];
923
 
924
      num_brkpts++;
925
      sprintf (buffer, "br %x", addr);
926
      sr_write_cr (buffer);
927
      gr_expect_prompt ();
928
      return (0);
929
    }
930
  else
931
    {
932
      fprintf_filtered (gdb_stderr,
933
                      "Too many break points, break point not installed\n");
934
      return (1);
935
    }
936
 
937
}
938
static int
939
bug_remove_breakpoint (addr, save)
940
     CORE_ADDR addr;
941
     char *save;                /* Throw away, let bug save instructions */
942
{
943
  if (num_brkpts > 0)
944
    {
945
      char buffer[100];
946
 
947
      num_brkpts--;
948
      sprintf (buffer, "nobr %x", addr);
949
      sr_write_cr (buffer);
950
      gr_expect_prompt ();
951
 
952
    }
953
  return (0);
954
}
955
 
956
/* Clear the bugs notion of what the break points are */
957
static int
958
bug_clear_breakpoints ()
959
{
960
 
961
  if (sr_is_open ())
962
    {
963
      sr_write_cr ("nobr");
964
      sr_expect ("nobr");
965
      gr_expect_prompt ();
966
    }
967
  num_brkpts = 0;
968
  return (0);
969
}
970
 
971
struct target_ops bug_ops;
972
 
973
static void
974
init_bug_ops (void)
975
{
976
  bug_ops.to_shortname = "bug";
977
  "Remote BUG monitor",
978
    bug_ops.to_longname = "Use the mvme187 board running the BUG monitor connected by a serial line.";
979
  bug_ops.to_doc = " ";
980
  bug_ops.to_open = bug_open;
981
  bug_ops.to_close = gr_close;
982
  bug_ops.to_attach = 0;
983
  bug_ops.to_post_attach = NULL;
984
  bug_ops.to_require_attach = NULL;
985
  bug_ops.to_detach = gr_detach;
986
  bug_ops.to_require_detach = NULL;
987
  bug_ops.to_resume = bug_resume;
988
  bug_ops.to_wait = bug_wait;
989
  bug_ops.to_post_wait = NULL;
990
  bug_ops.to_fetch_registers = bug_fetch_register;
991
  bug_ops.to_store_registers = bug_store_register;
992
  bug_ops.to_prepare_to_store = gr_prepare_to_store;
993
  bug_ops.to_xfer_memory = bug_xfer_memory;
994
  bug_ops.to_files_info = gr_files_info;
995
  bug_ops.to_insert_breakpoint = bug_insert_breakpoint;
996
  bug_ops.to_remove_breakpoint = bug_remove_breakpoint;
997
  bug_ops.to_terminal_init = 0;
998
  bug_ops.to_terminal_inferior = 0;
999
  bug_ops.to_terminal_ours_for_output = 0;
1000
  bug_ops.to_terminal_ours = 0;
1001
  bug_ops.to_terminal_info = 0;
1002
  bug_ops.to_kill = gr_kill;
1003
  bug_ops.to_load = bug_load;
1004
  bug_ops.to_lookup_symbol = 0;
1005
  bug_ops.to_create_inferior = gr_create_inferior;
1006
  bug_ops.to_post_startup_inferior = NULL;
1007
  bug_ops.to_acknowledge_created_inferior = NULL;
1008
  bug_ops.to_clone_and_follow_inferior = NULL;
1009
  bug_ops.to_post_follow_inferior_by_clone = NULL;
1010
  bug_ops.to_insert_fork_catchpoint = NULL;
1011
  bug_ops.to_remove_fork_catchpoint = NULL;
1012
  bug_ops.to_insert_vfork_catchpoint = NULL;
1013
  bug_ops.to_remove_vfork_catchpoint = NULL;
1014
  bug_ops.to_has_forked = NULL;
1015
  bug_ops.to_has_vforked = NULL;
1016
  bug_ops.to_can_follow_vfork_prior_to_exec = NULL;
1017
  bug_ops.to_post_follow_vfork = NULL;
1018
  bug_ops.to_insert_exec_catchpoint = NULL;
1019
  bug_ops.to_remove_exec_catchpoint = NULL;
1020
  bug_ops.to_has_execd = NULL;
1021
  bug_ops.to_reported_exec_events_per_exec_call = NULL;
1022
  bug_ops.to_has_exited = NULL;
1023
  bug_ops.to_mourn_inferior = gr_mourn;
1024
  bug_ops.to_can_run = 0;
1025
  bug_ops.to_notice_signals = 0;
1026
  bug_ops.to_thread_alive = 0;
1027
  bug_ops.to_stop = 0;
1028
  bug_ops.to_pid_to_exec_file = NULL;
1029
  bug_ops.to_core_file_to_sym_file = NULL;
1030
  bug_ops.to_stratum = process_stratum;
1031
  bug_ops.DONT_USE = 0;
1032
  bug_ops.to_has_all_memory = 1;
1033
  bug_ops.to_has_memory = 1;
1034
  bug_ops.to_has_stack = 1;
1035
  bug_ops.to_has_registers = 0;
1036
  bug_ops.to_has_execution = 0;
1037
  bug_ops.to_sections = 0;
1038
  bug_ops.to_sections_end = 0;
1039
  bug_ops.to_magic = OPS_MAGIC; /* Always the last thing */
1040
}                               /* init_bug_ops */
1041
 
1042
void
1043
_initialize_remote_bug ()
1044
{
1045
  init_bug_ops ();
1046
  add_target (&bug_ops);
1047
 
1048
  add_show_from_set
1049
    (add_set_cmd ("srec-bytes", class_support, var_uinteger,
1050
                  (char *) &srec_bytes,
1051
                  "\
1052
Set the number of bytes represented in each S-record.\n\
1053
This affects the communication protocol with the remote target.",
1054
                  &setlist),
1055
     &showlist);
1056
 
1057
  add_show_from_set
1058
    (add_set_cmd ("srec-max-retries", class_support, var_uinteger,
1059
                  (char *) &srec_max_retries,
1060
                  "\
1061
Set the number of retries for shipping S-records.\n\
1062
This affects the communication protocol with the remote target.",
1063
                  &setlist),
1064
     &showlist);
1065
 
1066
#if 0
1067
  /* This needs to set SREC_SIZE, not srec_frame which gets changed at the
1068
     end of a download.  But do we need the option at all?  */
1069
  add_show_from_set
1070
    (add_set_cmd ("srec-frame", class_support, var_uinteger,
1071
                  (char *) &srec_frame,
1072
                  "\
1073
Set the number of bytes in an S-record frame.\n\
1074
This affects the communication protocol with the remote target.",
1075
                  &setlist),
1076
     &showlist);
1077
#endif /* 0 */
1078
 
1079
  add_show_from_set
1080
    (add_set_cmd ("srec-noise", class_support, var_zinteger,
1081
                  (char *) &srec_noise,
1082
                  "\
1083
Set number of S-record to send before deliberately flubbing a checksum.\n\
1084
Zero means flub none at all.  This affects the communication protocol\n\
1085
with the remote target.",
1086
                  &setlist),
1087
     &showlist);
1088
 
1089
  add_show_from_set
1090
    (add_set_cmd ("srec-sleep", class_support, var_zinteger,
1091
                  (char *) &srec_sleep,
1092
                  "\
1093
Set number of seconds to sleep after an S-record for a possible error message to arrive.\n\
1094
This affects the communication protocol with the remote target.",
1095
                  &setlist),
1096
     &showlist);
1097
 
1098
  add_show_from_set
1099
    (add_set_cmd ("srec-echo-pace", class_support, var_boolean,
1100
                  (char *) &srec_echo_pace,
1101
                  "\
1102
Set echo-verification.\n\
1103
When on, use verification by echo when downloading S-records.  This is\n\
1104
much slower, but generally more reliable.",
1105
                  &setlist),
1106
     &showlist);
1107
}

powered by: WebSVN 2.1.0

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