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

Subversion Repositories or1k

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

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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