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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [remote-e7000.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* Remote debugging interface for Hitachi E7000 ICE, for GDB
2
 
3
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4
   2002 Free Software Foundation, Inc.
5
 
6
   Contributed by Cygnus Support.
7
 
8
   Written by Steve Chamberlain for Cygnus Support.
9
 
10
   This file is part of GDB.
11
 
12
   This program is free software; you can redistribute it and/or modify
13
   it under the terms of the GNU General Public License as published by
14
   the Free Software Foundation; either version 2 of the License, or
15
   (at your option) any later version.
16
 
17
   This program is distributed in the hope that it will be useful,
18
   but WITHOUT ANY WARRANTY; without even the implied warranty of
19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
   GNU General Public License for more details.
21
 
22
   You should have received a copy of the GNU General Public License
23
   along with this program; if not, write to the Free Software
24
   Foundation, Inc., 59 Temple Place - Suite 330,
25
   Boston, MA 02111-1307, USA.  */
26
 
27
/* The E7000 is an in-circuit emulator for the Hitachi H8/300-H and
28
   Hitachi-SH processor.  It has serial port and a lan port.
29
 
30
   The monitor command set makes it difficult to load large ammounts of
31
   data over the lan without using ftp - so try not to issue load
32
   commands when communicating over ethernet; use the ftpload command.
33
 
34
   The monitor pauses for a second when dumping srecords to the serial
35
   line too, so we use a slower per byte mechanism but without the
36
   startup overhead.  Even so, it's pretty slow... */
37
 
38
#include "defs.h"
39
#include "gdbcore.h"
40
#include "gdbarch.h"
41
#include "inferior.h"
42
#include "target.h"
43
#include "value.h"
44
#include "command.h"
45
#include "gdb_string.h"
46
#include "gdbcmd.h"
47
#include <sys/types.h>
48
#include "serial.h"
49
#include "remote-utils.h"
50
#include "symfile.h"
51
#include "regcache.h"
52
#include <time.h>
53
#include <ctype.h>
54
 
55
 
56
#if 1
57
#define HARD_BREAKPOINTS        /* Now handled by set option. */
58
#define BC_BREAKPOINTS use_hard_breakpoints
59
#endif
60
 
61
#define CTRLC 0x03
62
#define ENQ  0x05
63
#define ACK  0x06
64
#define CTRLZ 0x1a
65
 
66
/* This file is used by 2 different targets, sh-elf and h8300. The
67
   h8300 is not multiarched and doesn't use the registers defined in
68
   tm-sh.h. To avoid using a macro GDB_TARGET_IS_SH, we do runtime check
69
   of the target, which requires that these namse below are always
70
   defined also in the h8300 case. */
71
 
72
#if !defined (PR_REGNUM)
73
#define PR_REGNUM       -1
74
#endif
75
#if !defined (GBR_REGNUM)
76
#define GBR_REGNUM      -1
77
#endif
78
#if !defined (VBR_REGNUM)
79
#define VBR_REGNUM      -1
80
#endif
81
#if !defined (MACH_REGNUM)
82
#define MACH_REGNUM     -1
83
#endif
84
#if !defined (MACL_REGNUM)
85
#define MACL_REGNUM     -1
86
#endif
87
#if !defined (SR_REGNUM)
88
#define SR_REGNUM       -1
89
#endif
90
 
91
extern void report_transfer_performance (unsigned long, time_t, time_t);
92
 
93
extern char *sh_processor_type;
94
 
95
/* Local function declarations.  */
96
 
97
static void e7000_close (int);
98
 
99
static void e7000_fetch_register (int);
100
 
101
static void e7000_store_register (int);
102
 
103
static void e7000_command (char *, int);
104
 
105
static void e7000_login_command (char *, int);
106
 
107
static void e7000_ftp_command (char *, int);
108
 
109
static void e7000_drain_command (char *, int);
110
 
111
static void expect (char *);
112
 
113
static void expect_full_prompt (void);
114
 
115
static void expect_prompt (void);
116
 
117
static int e7000_parse_device (char *args, char *dev_name, int baudrate);
118
/* Variables. */
119
 
120
static struct serial *e7000_desc;
121
 
122
/* Allow user to chose between using hardware breakpoints or memory. */
123
static int use_hard_breakpoints = 0;     /* use sw breakpoints by default */
124
 
125
/* Nonzero if using the tcp serial driver.  */
126
 
127
static int using_tcp;           /* direct tcp connection to target */
128
static int using_tcp_remote;    /* indirect connection to target
129
                                   via tcp to controller */
130
 
131
/* Nonzero if using the pc isa card.  */
132
 
133
static int using_pc;
134
 
135
extern struct target_ops e7000_ops;     /* Forward declaration */
136
 
137
char *ENQSTRING = "\005";
138
 
139
/* Nonzero if some routine (as opposed to the user) wants echoing.
140
   FIXME: Do this reentrantly with an extra parameter.  */
141
 
142
static int echo;
143
 
144
static int ctrl_c;
145
 
146
static int timeout = 20;
147
 
148
/* Send data to e7000debug.  */
149
 
150
static void
151
puts_e7000debug (char *buf)
152
{
153
  if (!e7000_desc)
154
    error ("Use \"target e7000 ...\" first.");
155
 
156
  if (remote_debug)
157
    printf_unfiltered ("Sending %s\n", buf);
158
 
159
  if (serial_write (e7000_desc, buf, strlen (buf)))
160
    fprintf_unfiltered (gdb_stderr, "serial_write failed: %s\n", safe_strerror (errno));
161
 
162
  /* And expect to see it echoed, unless using the pc interface */
163
#if 0
164
  if (!using_pc)
165
#endif
166
    expect (buf);
167
}
168
 
169
static void
170
putchar_e7000 (int x)
171
{
172
  char b[1];
173
 
174
  b[0] = x;
175
  serial_write (e7000_desc, b, 1);
176
}
177
 
178
static void
179
write_e7000 (char *s)
180
{
181
  serial_write (e7000_desc, s, strlen (s));
182
}
183
 
184
static int
185
normal (int x)
186
{
187
  if (x == '\n')
188
    return '\r';
189
  return x;
190
}
191
 
192
/* Read a character from the remote system, doing all the fancy timeout
193
   stuff.  Handles serial errors and EOF.  If TIMEOUT == 0, and no chars,
194
   returns -1, else returns next char.  Discards chars > 127.  */
195
 
196
static int
197
readchar (int timeout)
198
{
199
  int c;
200
 
201
  do
202
    {
203
      c = serial_readchar (e7000_desc, timeout);
204
    }
205
  while (c > 127);
206
 
207
  if (c == SERIAL_TIMEOUT)
208
    {
209
      if (timeout == 0)
210
        return -1;
211
      echo = 0;
212
      error ("Timeout reading from remote system.");
213
    }
214
  else if (c < 0)
215
    error ("Serial communication error");
216
 
217
  if (remote_debug)
218
    {
219
      putchar_unfiltered (c);
220
      gdb_flush (gdb_stdout);
221
    }
222
 
223
  return normal (c);
224
}
225
 
226
#if 0
227
char *
228
tl (int x)
229
{
230
  static char b[8][10];
231
  static int p;
232
 
233
  p++;
234
  p &= 7;
235
  if (x >= ' ')
236
    {
237
      b[p][0] = x;
238
      b[p][1] = 0;
239
    }
240
  else
241
    {
242
      sprintf (b[p], "<%d>", x);
243
    }
244
 
245
  return b[p];
246
}
247
#endif
248
 
249
/* Scan input from the remote system, until STRING is found.  If
250
   DISCARD is non-zero, then discard non-matching input, else print it
251
   out.  Let the user break out immediately.  */
252
 
253
static void
254
expect (char *string)
255
{
256
  char *p = string;
257
  int c;
258
  int nl = 0;
259
 
260
  while (1)
261
    {
262
      c = readchar (timeout);
263
 
264
      if (echo)
265
        {
266
          if (c == '\r' || c == '\n')
267
            {
268
              if (!nl)
269
                putchar_unfiltered ('\n');
270
              nl = 1;
271
            }
272
          else
273
            {
274
              nl = 0;
275
              putchar_unfiltered (c);
276
            }
277
          gdb_flush (gdb_stdout);
278
        }
279
      if (normal (c) == normal (*p++))
280
        {
281
          if (*p == '\0')
282
            return;
283
        }
284
      else
285
        {
286
          p = string;
287
 
288
          if (normal (c) == normal (string[0]))
289
            p++;
290
        }
291
    }
292
}
293
 
294
/* Keep discarding input until we see the e7000 prompt.
295
 
296
   The convention for dealing with the prompt is that you
297
   o give your command
298
   o *then* wait for the prompt.
299
 
300
   Thus the last thing that a procedure does with the serial line will
301
   be an expect_prompt().  Exception: e7000_resume does not wait for
302
   the prompt, because the terminal is being handed over to the
303
   inferior.  However, the next thing which happens after that is a
304
   e7000_wait which does wait for the prompt.  Note that this includes
305
   abnormal exit, e.g. error().  This is necessary to prevent getting
306
   into states from which we can't recover.  */
307
 
308
static void
309
expect_prompt (void)
310
{
311
  expect (":");
312
}
313
 
314
static void
315
expect_full_prompt (void)
316
{
317
  expect ("\r:");
318
}
319
 
320
static int
321
convert_hex_digit (int ch)
322
{
323
  if (ch >= '0' && ch <= '9')
324
    return ch - '0';
325
  else if (ch >= 'A' && ch <= 'F')
326
    return ch - 'A' + 10;
327
  else if (ch >= 'a' && ch <= 'f')
328
    return ch - 'a' + 10;
329
  return -1;
330
}
331
 
332
static int
333
get_hex (int *start)
334
{
335
  int value = convert_hex_digit (*start);
336
  int try;
337
 
338
  *start = readchar (timeout);
339
  while ((try = convert_hex_digit (*start)) >= 0)
340
    {
341
      value <<= 4;
342
      value += try;
343
      *start = readchar (timeout);
344
    }
345
  return value;
346
}
347
 
348
#if 0
349
/* Get N 32-bit words from remote, each preceded by a space, and put
350
   them in registers starting at REGNO.  */
351
 
352
static void
353
get_hex_regs (int n, int regno)
354
{
355
  long val;
356
  int i;
357
 
358
  for (i = 0; i < n; i++)
359
    {
360
      int j;
361
 
362
      val = 0;
363
      for (j = 0; j < 8; j++)
364
        val = (val << 4) + get_hex_digit (j == 0);
365
      supply_register (regno++, (char *) &val);
366
    }
367
}
368
#endif
369
 
370
/* This is called not only when we first attach, but also when the
371
   user types "run" after having attached.  */
372
 
373
static void
374
e7000_create_inferior (char *execfile, char *args, char **env)
375
{
376
  int entry_pt;
377
 
378
  if (args && *args)
379
    error ("Can't pass arguments to remote E7000DEBUG process");
380
 
381
  if (execfile == 0 || exec_bfd == 0)
382
    error ("No executable file specified");
383
 
384
  entry_pt = (int) bfd_get_start_address (exec_bfd);
385
 
386
#ifdef CREATE_INFERIOR_HOOK
387
  CREATE_INFERIOR_HOOK (0);      /* No process-ID */
388
#endif
389
 
390
  /* The "process" (board) is already stopped awaiting our commands, and
391
     the program is already downloaded.  We just set its PC and go.  */
392
 
393
  clear_proceed_status ();
394
 
395
  /* Tell wait_for_inferior that we've started a new process.  */
396
  init_wait_for_inferior ();
397
 
398
  /* Set up the "saved terminal modes" of the inferior
399
     based on what modes we are starting it with.  */
400
  target_terminal_init ();
401
 
402
  /* Install inferior's terminal modes.  */
403
  target_terminal_inferior ();
404
 
405
  /* insert_step_breakpoint ();  FIXME, do we need this?  */
406
  proceed ((CORE_ADDR) entry_pt, -1, 0); /* Let 'er rip... */
407
}
408
 
409
/* Open a connection to a remote debugger.  NAME is the filename used
410
   for communication.  */
411
 
412
static int baudrate = 9600;
413
static char dev_name[100];
414
 
415
static char *machine = "";
416
static char *user = "";
417
static char *passwd = "";
418
static char *dir = "";
419
 
420
/* Grab the next token and buy some space for it */
421
 
422
static char *
423
next (char **ptr)
424
{
425
  char *p = *ptr;
426
  char *s;
427
  char *r;
428
  int l = 0;
429
 
430
  while (*p && *p == ' ')
431
    p++;
432
  s = p;
433
  while (*p && (*p != ' ' && *p != '\t'))
434
    {
435
      l++;
436
      p++;
437
    }
438
  r = xmalloc (l + 1);
439
  memcpy (r, s, l);
440
  r[l] = 0;
441
  *ptr = p;
442
  return r;
443
}
444
 
445
static void
446
e7000_login_command (char *args, int from_tty)
447
{
448
  if (args)
449
    {
450
      machine = next (&args);
451
      user = next (&args);
452
      passwd = next (&args);
453
      dir = next (&args);
454
      if (from_tty)
455
        {
456
          printf_unfiltered ("Set info to %s %s %s %s\n", machine, user, passwd, dir);
457
        }
458
    }
459
  else
460
    {
461
      error ("Syntax is ftplogin <machine> <user> <passwd> <directory>");
462
    }
463
}
464
 
465
/* Start an ftp transfer from the E7000 to a host */
466
 
467
static void
468
e7000_ftp_command (char *args, int from_tty)
469
{
470
  /* FIXME: arbitrary limit on machine names and such.  */
471
  char buf[200];
472
 
473
  int oldtimeout = timeout;
474
  timeout = remote_timeout;
475
 
476
  sprintf (buf, "ftp %s\r", machine);
477
  puts_e7000debug (buf);
478
  expect (" Username : ");
479
  sprintf (buf, "%s\r", user);
480
  puts_e7000debug (buf);
481
  expect (" Password : ");
482
  write_e7000 (passwd);
483
  write_e7000 ("\r");
484
  expect ("success\r");
485
  expect ("FTP>");
486
  sprintf (buf, "cd %s\r", dir);
487
  puts_e7000debug (buf);
488
  expect ("FTP>");
489
  sprintf (buf, "ll 0;s:%s\r", args);
490
  puts_e7000debug (buf);
491
  expect ("FTP>");
492
  puts_e7000debug ("bye\r");
493
  expect (":");
494
  timeout = oldtimeout;
495
}
496
 
497
static int
498
e7000_parse_device (char *args, char *dev_name, int baudrate)
499
{
500
  char junk[128];
501
  int n = 0;
502
  if (args && strcasecmp (args, "pc") == 0)
503
    {
504
      strcpy (dev_name, args);
505
      using_pc = 1;
506
    }
507
  else
508
    {
509
      /* FIXME! temp hack to allow use with port master -
510
         target tcp_remote <device> */
511
      if (args && strncmp (args, "tcp", 10) == 0)
512
        {
513
          char com_type[128];
514
          n = sscanf (args, " %s %s %d %s", com_type, dev_name, &baudrate, junk);
515
          using_tcp_remote = 1;
516
          n--;
517
        }
518
      else if (args)
519
        {
520
          n = sscanf (args, " %s %d %s", dev_name, &baudrate, junk);
521
        }
522
 
523
      if (n != 1 && n != 2)
524
        {
525
          error ("Bad arguments.  Usage:\ttarget e7000 <device> <speed>\n\
526
or \t\ttarget e7000 <host>[:<port>]\n\
527
or \t\ttarget e7000 tcp_remote <host>[:<port>]\n\
528
or \t\ttarget e7000 pc\n");
529
        }
530
 
531
#if !defined(__GO32__) && !defined(_WIN32) && !defined(__CYGWIN__)
532
      /* FIXME!  test for ':' is ambiguous */
533
      if (n == 1 && strchr (dev_name, ':') == 0)
534
        {
535
          /* Default to normal telnet port */
536
          /* serial_open will use this to determine tcp communication */
537
          strcat (dev_name, ":23");
538
        }
539
#endif
540
      if (!using_tcp_remote && strchr (dev_name, ':'))
541
        using_tcp = 1;
542
    }
543
 
544
  return n;
545
}
546
 
547
/* Stub for catch_errors.  */
548
 
549
static int
550
e7000_start_remote (void *dummy)
551
{
552
  int loop;
553
  int sync;
554
  int try;
555
  int quit_trying;
556
 
557
  immediate_quit++;             /* Allow user to interrupt it */
558
 
559
  /* Hello?  Are you there?  */
560
  sync = 0;
561
  loop = 0;
562
  try = 0;
563
  quit_trying = 20;
564
  putchar_e7000 (CTRLC);
565
  while (!sync && ++try <= quit_trying)
566
    {
567
      int c;
568
 
569
      printf_unfiltered ("[waiting for e7000...]\n");
570
 
571
      write_e7000 ("\r");
572
      c = readchar (1);
573
 
574
      /* FIXME!  this didn't seem right->  while (c != SERIAL_TIMEOUT)
575
       * we get stuck in this loop ...
576
       * We may never timeout, and never sync up :-(
577
       */
578
      while (!sync && c != -1)
579
        {
580
          /* Dont echo cr's */
581
          if (c != '\r')
582
            {
583
              putchar_unfiltered (c);
584
              gdb_flush (gdb_stdout);
585
            }
586
          /* Shouldn't we either break here, or check for sync in inner loop? */
587
          if (c == ':')
588
            sync = 1;
589
 
590
          if (loop++ == 20)
591
            {
592
              putchar_e7000 (CTRLC);
593
              loop = 0;
594
            }
595
 
596
          QUIT;
597
 
598
          if (quit_flag)
599
            {
600
              putchar_e7000 (CTRLC);
601
              /* Was-> quit_flag = 0; */
602
              c = -1;
603
              quit_trying = try + 1;    /* we don't want to try anymore */
604
            }
605
          else
606
            {
607
              c = readchar (1);
608
            }
609
        }
610
    }
611
 
612
  if (!sync)
613
    {
614
      fprintf_unfiltered (gdb_stderr, "Giving up after %d tries...\n", try);
615
      error ("Unable to synchronize with target.\n");
616
    }
617
 
618
  puts_e7000debug ("\r");
619
  expect_prompt ();
620
  puts_e7000debug ("b -\r");    /* Clear breakpoints */
621
  expect_prompt ();
622
 
623
  immediate_quit--;
624
 
625
/* This is really the job of start_remote however, that makes an assumption
626
   that the target is about to print out a status message of some sort.  That
627
   doesn't happen here. */
628
 
629
  flush_cached_frames ();
630
  registers_changed ();
631
  stop_pc = read_pc ();
632
  set_current_frame (create_new_frame (read_fp (), stop_pc));
633
  select_frame (get_current_frame ());
634
  print_stack_frame (selected_frame, -1, 1);
635
 
636
  return 1;
637
}
638
 
639
static void
640
e7000_open (char *args, int from_tty)
641
{
642
  int n;
643
 
644
  target_preopen (from_tty);
645
 
646
  n = e7000_parse_device (args, dev_name, baudrate);
647
 
648
  push_target (&e7000_ops);
649
 
650
  e7000_desc = serial_open (dev_name);
651
 
652
  if (!e7000_desc)
653
    perror_with_name (dev_name);
654
 
655
  if (serial_setbaudrate (e7000_desc, baudrate))
656
    {
657
      serial_close (e7000_desc);
658
      perror_with_name (dev_name);
659
    }
660
  serial_raw (e7000_desc);
661
 
662
#ifdef GDB_TARGET_IS_H8300
663
  h8300hmode = 1;
664
#endif
665
 
666
  /* Start the remote connection; if error (0), discard this target.
667
     In particular, if the user quits, be sure to discard it
668
     (we'd be in an inconsistent state otherwise).  */
669
  if (!catch_errors (e7000_start_remote, (char *) 0,
670
       "Couldn't establish connection to remote target\n", RETURN_MASK_ALL))
671
    if (from_tty)
672
      printf_filtered ("Remote target %s connected to %s\n", target_shortname,
673
                       dev_name);
674
}
675
 
676
/* Close out all files and local state before this target loses control. */
677
 
678
static void
679
e7000_close (int quitting)
680
{
681
  if (e7000_desc)
682
    {
683
      serial_close (e7000_desc);
684
      e7000_desc = 0;
685
    }
686
}
687
 
688
/* Terminate the open connection to the remote debugger.  Use this
689
   when you want to detach and do something else with your gdb.  */
690
 
691
static void
692
e7000_detach (char *arg, int from_tty)
693
{
694
  pop_target ();                /* calls e7000_close to do the real work */
695
  if (from_tty)
696
    printf_unfiltered ("Ending remote %s debugging\n", target_shortname);
697
}
698
 
699
/* Tell the remote machine to resume.  */
700
 
701
static void
702
e7000_resume (ptid_t ptid, int step, enum target_signal sigal)
703
{
704
  if (step)
705
    puts_e7000debug ("S\r");
706
  else
707
    puts_e7000debug ("G\r");
708
}
709
 
710
/* Read the remote registers into the block REGS.
711
 
712
   For the H8/300 a register dump looks like:
713
 
714
   PC=00021A  CCR=80:I*******
715
   ER0 - ER3  0000000A 0000002E 0000002E 00000000
716
   ER4 - ER7  00000000 00000000 00000000 00FFEFF6
717
   000218           MOV.B     R1L,R2L
718
   STEP NORMAL END or
719
   BREAK POINT
720
 */
721
 
722
char *want_h8300h = "PC=%p CCR=%c\n\
723
 ER0 - ER3  %0 %1 %2 %3\n\
724
 ER4 - ER7  %4 %5 %6 %7\n";
725
 
726
char *want_nopc_h8300h = "%p CCR=%c\n\
727
 ER0 - ER3  %0 %1 %2 %3\n\
728
 ER4 - ER7  %4 %5 %6 %7";
729
 
730
char *want_h8300s = "PC=%p CCR=%c\n\
731
 MACH=\n\
732
 ER0 - ER3  %0 %1 %2 %3\n\
733
 ER4 - ER7  %4 %5 %6 %7\n";
734
 
735
char *want_nopc_h8300s = "%p CCR=%c EXR=%9\n\
736
 ER0 - ER3  %0 %1 %2 %3\n\
737
 ER4 - ER7  %4 %5 %6 %7";
738
 
739
char *want_sh = "PC=%16 SR=%22\n\
740
PR=%17 GBR=%18 VBR=%19\n\
741
MACH=%20 MACL=%21\n\
742
R0-7  %0 %1 %2 %3 %4 %5 %6 %7\n\
743
R8-15 %8 %9 %10 %11 %12 %13 %14 %15\n";
744
 
745
char *want_nopc_sh = "%16 SR=%22\n\
746
 PR=%17 GBR=%18 VBR=%19\n\
747
 MACH=%20 MACL=%21\n\
748
 R0-7  %0 %1 %2 %3 %4 %5 %6 %7\n\
749
 R8-15 %8 %9 %10 %11 %12 %13 %14 %15";
750
 
751
char *want_sh3 = "PC=%16 SR=%22\n\
752
PR=%17 GBR=%18 VBR=%19\n\
753
MACH=%20 MACL=%21 SSR=%23 SPC=%24\n\
754
R0-7  %0 %1 %2 %3 %4 %5 %6 %7\n\
755
R8-15 %8 %9 %10 %11 %12 %13 %14 %15\n\
756
R0_BANK0-R3_BANK0 %25 %26 %27 %28\n\
757
R4_BANK0-R7_BANK0 %29 %30 %31 %32\n\
758
R0_BANK1-R3_BANK1 %33 %34 %35 %36\n\
759
R4_BANK1-R7_BANK1 %37 %38 %39 %40";
760
 
761
char *want_nopc_sh3 = "%16 SR=%22\n\
762
 PR=%17 GBR=%18 VBR=%19\n\
763
 MACH=%20 MACL=%21 SSR=%22 SPC=%23\n\
764
 R0-7  %0 %1 %2 %3 %4 %5 %6 %7\n\
765
 R8-15 %8 %9 %10 %11 %12 %13 %14 %15\n\
766
 R0_BANK0-R3_BANK0 %25 %26 %27 %28\n\
767
 R4_BANK0-R7_BANK0 %29 %30 %31 %32\n\
768
 R0_BANK1-R3_BANK1 %33 %34 %35 %36\n\
769
 R4_BANK1-R7_BANK1 %37 %38 %39 %40";
770
 
771
static int
772
gch (void)
773
{
774
  return readchar (timeout);
775
}
776
 
777
static unsigned int
778
gbyte (void)
779
{
780
  int high = convert_hex_digit (gch ());
781
  int low = convert_hex_digit (gch ());
782
 
783
  return (high << 4) + low;
784
}
785
 
786
void
787
fetch_regs_from_dump (int (*nextchar) (), char *want)
788
{
789
  int regno;
790
  char buf[MAX_REGISTER_RAW_SIZE];
791
 
792
  int thischar = nextchar ();
793
 
794
  if (want == NULL)
795
    internal_error (__FILE__, __LINE__, "Register set not selected.");
796
 
797
  while (*want)
798
    {
799
      switch (*want)
800
        {
801
        case '\n':
802
          /* Skip to end of line and then eat all new line type stuff */
803
          while (thischar != '\n' && thischar != '\r')
804
            thischar = nextchar ();
805
          while (thischar == '\n' || thischar == '\r')
806
            thischar = nextchar ();
807
          want++;
808
          break;
809
 
810
        case ' ':
811
          while (thischar == ' '
812
                 || thischar == '\t'
813
                 || thischar == '\r'
814
                 || thischar == '\n')
815
            thischar = nextchar ();
816
          want++;
817
          break;
818
 
819
        default:
820
          if (*want == thischar)
821
            {
822
              want++;
823
              if (*want)
824
                thischar = nextchar ();
825
 
826
            }
827
          else if (thischar == ' ' || thischar == '\n' || thischar == '\r')
828
            {
829
              thischar = nextchar ();
830
            }
831
          else
832
            {
833
              error ("out of sync in fetch registers wanted <%s>, got <%c 0x%x>",
834
                     want, thischar, thischar);
835
            }
836
 
837
          break;
838
        case '%':
839
          /* Got a register command */
840
          want++;
841
          switch (*want)
842
            {
843
#ifdef PC_REGNUM
844
            case 'p':
845
              regno = PC_REGNUM;
846
              want++;
847
              break;
848
#endif
849
#ifdef CCR_REGNUM
850
            case 'c':
851
              regno = CCR_REGNUM;
852
              want++;
853
              break;
854
#endif
855
#ifdef SP_REGNUM
856
            case 's':
857
              regno = SP_REGNUM;
858
              want++;
859
              break;
860
#endif
861
#ifdef FP_REGNUM
862
            case 'f':
863
              regno = FP_REGNUM;
864
              want++;
865
              break;
866
#endif
867
 
868
            default:
869
              if (isdigit (want[0]))
870
                {
871
                  if (isdigit (want[1]))
872
                    {
873
                      regno = (want[0] - '0') * 10 + want[1] - '0';
874
                      want += 2;
875
                    }
876
                  else
877
                    {
878
                      regno = want[0] - '0';
879
                      want++;
880
                    }
881
                }
882
 
883
              else
884
                internal_error (__FILE__, __LINE__, "failed internal consistency check");
885
            }
886
          store_signed_integer (buf,
887
                                REGISTER_RAW_SIZE (regno),
888
                                (LONGEST) get_hex (&thischar));
889
          supply_register (regno, buf);
890
          break;
891
        }
892
    }
893
}
894
 
895
static void
896
e7000_fetch_registers (void)
897
{
898
  int regno;
899
  char *wanted = NULL;
900
 
901
  puts_e7000debug ("R\r");
902
 
903
  if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
904
    {
905
      wanted = want_sh;
906
      switch (TARGET_ARCHITECTURE->mach)
907
        {
908
        case bfd_mach_sh3:
909
        case bfd_mach_sh3e:
910
        case bfd_mach_sh4:
911
          wanted = want_sh3;
912
        }
913
    }
914
#ifdef GDB_TARGET_IS_H8300
915
  if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
916
    {
917
      if (h8300smode)
918
        wanted = want_h8300s;
919
      else
920
        wanted = want_h8300h;
921
    }
922
#endif
923
 
924
  fetch_regs_from_dump (gch, wanted);
925
 
926
  /* And supply the extra ones the simulator uses */
927
  for (regno = NUM_REALREGS; regno < NUM_REGS; regno++)
928
    {
929
      int buf = 0;
930
 
931
      supply_register (regno, (char *) (&buf));
932
    }
933
}
934
 
935
/* Fetch register REGNO, or all registers if REGNO is -1.  Returns
936
   errno value.  */
937
 
938
static void
939
e7000_fetch_register (int regno)
940
{
941
  e7000_fetch_registers ();
942
}
943
 
944
/* Store the remote registers from the contents of the block REGS.  */
945
 
946
static void
947
e7000_store_registers (void)
948
{
949
  int regno;
950
 
951
  for (regno = 0; regno < NUM_REALREGS; regno++)
952
    e7000_store_register (regno);
953
 
954
  registers_changed ();
955
}
956
 
957
/* Store register REGNO, or all if REGNO == 0.  Return errno value.  */
958
 
959
static void
960
e7000_store_register (int regno)
961
{
962
  char buf[200];
963
 
964
  if (regno == -1)
965
    {
966
      e7000_store_registers ();
967
      return;
968
    }
969
 
970
  if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
971
    {
972
      if (regno <= 7)
973
        {
974
          sprintf (buf, ".ER%d %s\r", regno, phex_nz (read_register (regno), 0));
975
          puts_e7000debug (buf);
976
        }
977
      else if (regno == PC_REGNUM)
978
        {
979
          sprintf (buf, ".PC %s\r", phex_nz (read_register (regno), 0));
980
          puts_e7000debug (buf);
981
        }
982
#ifdef CCR_REGNUM
983
      else if (regno == CCR_REGNUM)
984
        {
985
          sprintf (buf, ".CCR %s\r", phex_nz (read_register (regno), 0));
986
          puts_e7000debug (buf);
987
        }
988
#endif
989
    }
990
 
991
  else if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
992
    {
993
      if (regno == PC_REGNUM)
994
        {
995
          sprintf (buf, ".PC %s\r", phex_nz (read_register (regno), 0));
996
          puts_e7000debug (buf);
997
        }
998
 
999
      else if (regno == SR_REGNUM)
1000
        {
1001
          sprintf (buf, ".SR %s\r", phex_nz (read_register (regno), 0));
1002
          puts_e7000debug (buf);
1003
        }
1004
 
1005
      else if (regno ==  PR_REGNUM)
1006
        {
1007
          sprintf (buf, ".PR %s\r", phex_nz (read_register (regno), 0));
1008
          puts_e7000debug (buf);
1009
        }
1010
 
1011
      else if (regno == GBR_REGNUM)
1012
        {
1013
          sprintf (buf, ".GBR %s\r", phex_nz (read_register (regno), 0));
1014
          puts_e7000debug (buf);
1015
        }
1016
 
1017
      else if (regno == VBR_REGNUM)
1018
        {
1019
          sprintf (buf, ".VBR %s\r", phex_nz (read_register (regno), 0));
1020
          puts_e7000debug (buf);
1021
        }
1022
 
1023
      else if (regno == MACH_REGNUM)
1024
        {
1025
          sprintf (buf, ".MACH %s\r", phex_nz (read_register (regno), 0));
1026
          puts_e7000debug (buf);
1027
        }
1028
 
1029
      else if (regno == MACL_REGNUM)
1030
        {
1031
          sprintf (buf, ".MACL %s\r", phex_nz (read_register (regno), 0));
1032
          puts_e7000debug (buf);
1033
        }
1034
      else
1035
        {
1036
          sprintf (buf, ".R%d %s\r", regno, phex_nz (read_register (regno), 0));
1037
          puts_e7000debug (buf);
1038
        }
1039
    }
1040
 
1041
  expect_prompt ();
1042
}
1043
 
1044
/* Get ready to modify the registers array.  On machines which store
1045
   individual registers, this doesn't need to do anything.  On machines
1046
   which store all the registers in one fell swoop, this makes sure
1047
   that registers contains all the registers from the program being
1048
   debugged.  */
1049
 
1050
static void
1051
e7000_prepare_to_store (void)
1052
{
1053
  /* Do nothing, since we can store individual regs */
1054
}
1055
 
1056
static void
1057
e7000_files_info (struct target_ops *ops)
1058
{
1059
  printf_unfiltered ("\tAttached to %s at %d baud.\n", dev_name, baudrate);
1060
}
1061
 
1062
static int
1063
stickbyte (char *where, unsigned int what)
1064
{
1065
  static CONST char digs[] = "0123456789ABCDEF";
1066
 
1067
  where[0] = digs[(what >> 4) & 0xf];
1068
  where[1] = digs[(what & 0xf) & 0xf];
1069
 
1070
  return what;
1071
}
1072
 
1073
/* Write a small ammount of memory. */
1074
 
1075
static int
1076
write_small (CORE_ADDR memaddr, unsigned char *myaddr, int len)
1077
{
1078
  int i;
1079
  char buf[200];
1080
 
1081
  for (i = 0; i < len; i++)
1082
    {
1083
      if (((memaddr + i) & 3) == 0 && (i + 3 < len))
1084
        {
1085
          /* Can be done with a long word */
1086
          sprintf (buf, "m %s %x%02x%02x%02x;l\r",
1087
                   paddr_nz (memaddr + i),
1088
                   myaddr[i], myaddr[i + 1], myaddr[i + 2], myaddr[i + 3]);
1089
          puts_e7000debug (buf);
1090
          i += 3;
1091
        }
1092
      else
1093
        {
1094
          sprintf (buf, "m %s %x\r", paddr_nz (memaddr + i), myaddr[i]);
1095
          puts_e7000debug (buf);
1096
        }
1097
    }
1098
 
1099
  expect_prompt ();
1100
 
1101
  return len;
1102
}
1103
 
1104
/* Write a large ammount of memory, this only works with the serial
1105
   mode enabled.  Command is sent as
1106
 
1107
   il ;s:s\r     ->
1108
   <- il ;s:s\r
1109
   <-   ENQ
1110
   ACK          ->
1111
   <- LO s\r
1112
   Srecords...
1113
   ^Z           ->
1114
   <-   ENQ
1115
   ACK          ->
1116
   <-   :
1117
 */
1118
 
1119
static int
1120
write_large (CORE_ADDR memaddr, unsigned char *myaddr, int len)
1121
{
1122
  int i;
1123
#define maxstride  128
1124
  int stride;
1125
 
1126
  puts_e7000debug ("IL ;S:FK\r");
1127
  expect (ENQSTRING);
1128
  putchar_e7000 (ACK);
1129
  expect ("LO FK\r");
1130
 
1131
  for (i = 0; i < len; i += stride)
1132
    {
1133
      char compose[maxstride * 2 + 50];
1134
      int address = i + memaddr;
1135
      int j;
1136
      int check_sum;
1137
      int where = 0;
1138
      int alen;
1139
 
1140
      stride = len - i;
1141
      if (stride > maxstride)
1142
        stride = maxstride;
1143
 
1144
      compose[where++] = 'S';
1145
      check_sum = 0;
1146
      if (address >= 0xffffff)
1147
        alen = 4;
1148
      else if (address >= 0xffff)
1149
        alen = 3;
1150
      else
1151
        alen = 2;
1152
      /* Insert type. */
1153
      compose[where++] = alen - 1 + '0';
1154
      /* Insert length. */
1155
      check_sum += stickbyte (compose + where, alen + stride + 1);
1156
      where += 2;
1157
      while (alen > 0)
1158
        {
1159
          alen--;
1160
          check_sum += stickbyte (compose + where, address >> (8 * (alen)));
1161
          where += 2;
1162
        }
1163
 
1164
      for (j = 0; j < stride; j++)
1165
        {
1166
          check_sum += stickbyte (compose + where, myaddr[i + j]);
1167
          where += 2;
1168
        }
1169
      stickbyte (compose + where, ~check_sum);
1170
      where += 2;
1171
      compose[where++] = '\r';
1172
      compose[where++] = '\n';
1173
      compose[where++] = 0;
1174
 
1175
      serial_write (e7000_desc, compose, where);
1176
      j = readchar (0);
1177
      if (j == -1)
1178
        {
1179
          /* This is ok - nothing there */
1180
        }
1181
      else if (j == ENQ)
1182
        {
1183
          /* Hmm, it's trying to tell us something */
1184
          expect (":");
1185
          error ("Error writing memory");
1186
        }
1187
      else
1188
        {
1189
          printf_unfiltered ("@%d}@", j);
1190
          while ((j = readchar (0)) > 0)
1191
            {
1192
              printf_unfiltered ("@{%d}@", j);
1193
            }
1194
        }
1195
    }
1196
 
1197
  /* Send the trailer record */
1198
  write_e7000 ("S70500000000FA\r");
1199
  putchar_e7000 (CTRLZ);
1200
  expect (ENQSTRING);
1201
  putchar_e7000 (ACK);
1202
  expect (":");
1203
 
1204
  return len;
1205
}
1206
 
1207
/* Copy LEN bytes of data from debugger memory at MYADDR to inferior's
1208
   memory at MEMADDR.  Returns length moved.
1209
 
1210
   Can't use the Srecord load over ethernet, so don't use fast method
1211
   then.  */
1212
 
1213
static int
1214
e7000_write_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
1215
{
1216
  if (len < 16 || using_tcp || using_pc)
1217
    return write_small (memaddr, myaddr, len);
1218
  else
1219
    return write_large (memaddr, myaddr, len);
1220
}
1221
 
1222
/* Read LEN bytes from inferior memory at MEMADDR.  Put the result
1223
   at debugger address MYADDR.  Returns length moved.
1224
 
1225
   Small transactions we send
1226
   m <addr>;l
1227
   and receive
1228
   00000000 12345678 ?
1229
 */
1230
 
1231
static int
1232
e7000_read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
1233
{
1234
  int count;
1235
  int c;
1236
  int i;
1237
  char buf[200];
1238
  /* Starting address of this pass.  */
1239
 
1240
/*  printf("READ INF %x %x %d\n", memaddr, myaddr, len); */
1241
  if (((memaddr - 1) + len) < memaddr)
1242
    {
1243
      errno = EIO;
1244
      return 0;
1245
    }
1246
 
1247
  sprintf (buf, "m %s;l\r", paddr_nz (memaddr));
1248
  puts_e7000debug (buf);
1249
 
1250
  for (count = 0; count < len; count += 4)
1251
    {
1252
      /* Suck away the address */
1253
      c = gch ();
1254
      while (c != ' ')
1255
        c = gch ();
1256
      c = gch ();
1257
      if (c == '*')
1258
        {                       /* Some kind of error */
1259
          puts_e7000debug (".\r");      /* Some errors leave us in memory input mode */
1260
          expect_full_prompt ();
1261
          return -1;
1262
        }
1263
      while (c != ' ')
1264
        c = gch ();
1265
 
1266
      /* Now read in the data */
1267
      for (i = 0; i < 4; i++)
1268
        {
1269
          int b = gbyte ();
1270
          if (count + i < len)
1271
            {
1272
              myaddr[count + i] = b;
1273
            }
1274
        }
1275
 
1276
      /* Skip the trailing ? and send a . to end and a cr for more */
1277
      gch ();
1278
      gch ();
1279
      if (count + 4 >= len)
1280
        puts_e7000debug (".\r");
1281
      else
1282
        puts_e7000debug ("\r");
1283
 
1284
    }
1285
  expect_prompt ();
1286
  return len;
1287
}
1288
 
1289
 
1290
 
1291
/*
1292
   For large transfers we used to send
1293
 
1294
 
1295
   d <addr> <endaddr>\r
1296
 
1297
   and receive
1298
   <ADDRESS>           <    D   A   T   A    >               <   ASCII CODE   >
1299
   00000000 5F FD FD FF DF 7F DF FF  01 00 01 00 02 00 08 04  "_..............."
1300
   00000010 FF D7 FF 7F D7 F1 7F FF  00 05 00 00 08 00 40 00  "..............@."
1301
   00000020 7F FD FF F7 7F FF FF F7  00 00 00 00 00 00 00 00  "................"
1302
 
1303
   A cost in chars for each transaction of 80 + 5*n-bytes.
1304
 
1305
   Large transactions could be done with the srecord load code, but
1306
   there is a pause for a second before dumping starts, which slows the
1307
   average rate down!
1308
 */
1309
 
1310
static int
1311
e7000_read_inferior_memory_large (CORE_ADDR memaddr, unsigned char *myaddr,
1312
                                  int len)
1313
{
1314
  int count;
1315
  int c;
1316
  char buf[200];
1317
 
1318
  /* Starting address of this pass.  */
1319
 
1320
  if (((memaddr - 1) + len) < memaddr)
1321
    {
1322
      errno = EIO;
1323
      return 0;
1324
    }
1325
 
1326
  sprintf (buf, "d %s %s\r", paddr_nz (memaddr), paddr_nz (memaddr + len - 1));
1327
  puts_e7000debug (buf);
1328
 
1329
  count = 0;
1330
  c = gch ();
1331
 
1332
  /* skip down to the first ">" */
1333
  while (c != '>')
1334
    c = gch ();
1335
  /* now skip to the end of that line */
1336
  while (c != '\r')
1337
    c = gch ();
1338
  c = gch ();
1339
 
1340
  while (count < len)
1341
    {
1342
      /* get rid of any white space before the address */
1343
      while (c <= ' ')
1344
        c = gch ();
1345
 
1346
      /* Skip the address */
1347
      get_hex (&c);
1348
 
1349
      /* read in the bytes on the line */
1350
      while (c != '"' && count < len)
1351
        {
1352
          if (c == ' ')
1353
            c = gch ();
1354
          else
1355
            {
1356
              myaddr[count++] = get_hex (&c);
1357
            }
1358
        }
1359
      /* throw out the rest of the line */
1360
      while (c != '\r')
1361
        c = gch ();
1362
    }
1363
 
1364
  /* wait for the ":" prompt */
1365
  while (c != ':')
1366
    c = gch ();
1367
 
1368
  return len;
1369
}
1370
 
1371
#if 0
1372
 
1373
static int
1374
fast_but_for_the_pause_e7000_read_inferior_memory (CORE_ADDR memaddr,
1375
                                                   char *myaddr, int len)
1376
{
1377
  int loop;
1378
  int c;
1379
  char buf[200];
1380
 
1381
  if (((memaddr - 1) + len) < memaddr)
1382
    {
1383
      errno = EIO;
1384
      return 0;
1385
    }
1386
 
1387
  sprintf (buf, "is %x@%x:s\r", memaddr, len);
1388
  puts_e7000debug (buf);
1389
  gch ();
1390
  c = gch ();
1391
  if (c != ENQ)
1392
    {
1393
      /* Got an error */
1394
      error ("Memory read error");
1395
    }
1396
  putchar_e7000 (ACK);
1397
  expect ("SV s");
1398
  loop = 1;
1399
  while (loop)
1400
    {
1401
      int type;
1402
      int length;
1403
      int addr;
1404
      int i;
1405
 
1406
      c = gch ();
1407
      switch (c)
1408
        {
1409
        case ENQ:               /* ENQ, at the end */
1410
          loop = 0;
1411
          break;
1412
        case 'S':
1413
          /* Start of an Srecord */
1414
          type = gch ();
1415
          length = gbyte ();
1416
          switch (type)
1417
            {
1418
            case '7':           /* Termination record, ignore */
1419
            case '0':
1420
            case '8':
1421
            case '9':
1422
              /* Header record - ignore it */
1423
              while (length--)
1424
                {
1425
                  gbyte ();
1426
                }
1427
              break;
1428
            case '1':
1429
            case '2':
1430
            case '3':
1431
              {
1432
                int alen;
1433
 
1434
                alen = type - '0' + 1;
1435
                addr = 0;
1436
                while (alen--)
1437
                  {
1438
                    addr = (addr << 8) + gbyte ();
1439
                    length--;
1440
                  }
1441
 
1442
                for (i = 0; i < length - 1; i++)
1443
                  myaddr[i + addr - memaddr] = gbyte ();
1444
 
1445
                gbyte ();       /* Ignore checksum */
1446
              }
1447
            }
1448
        }
1449
    }
1450
 
1451
  putchar_e7000 (ACK);
1452
  expect ("TOP ADDRESS =");
1453
  expect ("END ADDRESS =");
1454
  expect (":");
1455
 
1456
  return len;
1457
}
1458
 
1459
#endif
1460
 
1461
/* Transfer LEN bytes between GDB address MYADDR and target address
1462
   MEMADDR.  If WRITE is non-zero, transfer them to the target,
1463
   otherwise transfer them from the target.  TARGET is unused.
1464
 
1465
   Returns the number of bytes transferred. */
1466
 
1467
static int
1468
e7000_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
1469
                            int write, struct mem_attrib *attrib,
1470
                            struct target_ops *target)
1471
{
1472
  if (write)
1473
    return e7000_write_inferior_memory (memaddr, myaddr, len);
1474
  else if (len < 16)
1475
    return e7000_read_inferior_memory (memaddr, myaddr, len);
1476
  else
1477
    return e7000_read_inferior_memory_large (memaddr, myaddr, len);
1478
}
1479
 
1480
static void
1481
e7000_kill (void)
1482
{
1483
}
1484
 
1485
static void
1486
e7000_load (char *args, int from_tty)
1487
{
1488
  struct cleanup *old_chain;
1489
  asection *section;
1490
  bfd *pbfd;
1491
  bfd_vma entry;
1492
#define WRITESIZE 0x1000
1493
  char buf[2 + 4 + 4 + WRITESIZE];      /* `DT' + <addr> + <len> + <data> */
1494
  char *filename;
1495
  int quiet;
1496
  int nostart;
1497
  time_t start_time, end_time;  /* Start and end times of download */
1498
  unsigned long data_count;     /* Number of bytes transferred to memory */
1499
  int oldtimeout = timeout;
1500
 
1501
  timeout = remote_timeout;
1502
 
1503
 
1504
  /* FIXME! change test to test for type of download */
1505
  if (!using_tcp)
1506
    {
1507
      generic_load (args, from_tty);
1508
      return;
1509
    }
1510
 
1511
  /* for direct tcp connections, we can do a fast binary download */
1512
  buf[0] = 'D';
1513
  buf[1] = 'T';
1514
  quiet = 0;
1515
  nostart = 0;
1516
  filename = NULL;
1517
 
1518
  while (*args != '\000')
1519
    {
1520
      char *arg;
1521
 
1522
      while (isspace (*args))
1523
        args++;
1524
 
1525
      arg = args;
1526
 
1527
      while ((*args != '\000') && !isspace (*args))
1528
        args++;
1529
 
1530
      if (*args != '\000')
1531
        *args++ = '\000';
1532
 
1533
      if (*arg != '-')
1534
        filename = arg;
1535
      else if (strncmp (arg, "-quiet", strlen (arg)) == 0)
1536
        quiet = 1;
1537
      else if (strncmp (arg, "-nostart", strlen (arg)) == 0)
1538
        nostart = 1;
1539
      else
1540
        error ("unknown option `%s'", arg);
1541
    }
1542
 
1543
  if (!filename)
1544
    filename = get_exec_file (1);
1545
 
1546
  pbfd = bfd_openr (filename, gnutarget);
1547
  if (pbfd == NULL)
1548
    {
1549
      perror_with_name (filename);
1550
      return;
1551
    }
1552
  old_chain = make_cleanup_bfd_close (pbfd);
1553
 
1554
  if (!bfd_check_format (pbfd, bfd_object))
1555
    error ("\"%s\" is not an object file: %s", filename,
1556
           bfd_errmsg (bfd_get_error ()));
1557
 
1558
  start_time = time (NULL);
1559
  data_count = 0;
1560
 
1561
  puts_e7000debug ("mw\r");
1562
 
1563
  expect ("\nOK");
1564
 
1565
  for (section = pbfd->sections; section; section = section->next)
1566
    {
1567
      if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)
1568
        {
1569
          bfd_vma section_address;
1570
          bfd_size_type section_size;
1571
          file_ptr fptr;
1572
 
1573
          section_address = bfd_get_section_vma (pbfd, section);
1574
          section_size = bfd_get_section_size_before_reloc (section);
1575
 
1576
          if (!quiet)
1577
            printf_filtered ("[Loading section %s at 0x%s (%s bytes)]\n",
1578
                             bfd_get_section_name (pbfd, section),
1579
                             paddr_nz (section_address),
1580
                             paddr_u (section_size));
1581
 
1582
          fptr = 0;
1583
 
1584
          data_count += section_size;
1585
 
1586
          while (section_size > 0)
1587
            {
1588
              int count;
1589
              static char inds[] = "|/-\\";
1590
              static int k = 0;
1591
 
1592
              QUIT;
1593
 
1594
              count = min (section_size, WRITESIZE);
1595
 
1596
              buf[2] = section_address >> 24;
1597
              buf[3] = section_address >> 16;
1598
              buf[4] = section_address >> 8;
1599
              buf[5] = section_address;
1600
 
1601
              buf[6] = count >> 24;
1602
              buf[7] = count >> 16;
1603
              buf[8] = count >> 8;
1604
              buf[9] = count;
1605
 
1606
              bfd_get_section_contents (pbfd, section, buf + 10, fptr, count);
1607
 
1608
              if (serial_write (e7000_desc, buf, count + 10))
1609
                fprintf_unfiltered (gdb_stderr,
1610
                                    "e7000_load: serial_write failed: %s\n",
1611
                                    safe_strerror (errno));
1612
 
1613
              expect ("OK");
1614
 
1615
              if (!quiet)
1616
                {
1617
                  printf_unfiltered ("\r%c", inds[k++ % 4]);
1618
                  gdb_flush (gdb_stdout);
1619
                }
1620
 
1621
              section_address += count;
1622
              fptr += count;
1623
              section_size -= count;
1624
            }
1625
        }
1626
    }
1627
 
1628
  write_e7000 ("ED");
1629
 
1630
  expect_prompt ();
1631
 
1632
  end_time = time (NULL);
1633
 
1634
/* Finally, make the PC point at the start address */
1635
 
1636
  if (exec_bfd)
1637
    write_pc (bfd_get_start_address (exec_bfd));
1638
 
1639
  inferior_ptid = null_ptid;    /* No process now */
1640
 
1641
/* This is necessary because many things were based on the PC at the time that
1642
   we attached to the monitor, which is no longer valid now that we have loaded
1643
   new code (and just changed the PC).  Another way to do this might be to call
1644
   normal_stop, except that the stack may not be valid, and things would get
1645
   horribly confused... */
1646
 
1647
  clear_symtab_users ();
1648
 
1649
  if (!nostart)
1650
    {
1651
      entry = bfd_get_start_address (pbfd);
1652
 
1653
      if (!quiet)
1654
        printf_unfiltered ("[Starting %s at 0x%s]\n", filename, paddr_nz (entry));
1655
 
1656
/*      start_routine (entry); */
1657
    }
1658
 
1659
  report_transfer_performance (data_count, start_time, end_time);
1660
 
1661
  do_cleanups (old_chain);
1662
  timeout = oldtimeout;
1663
}
1664
 
1665
/* Clean up when a program exits.
1666
 
1667
   The program actually lives on in the remote processor's RAM, and may be
1668
   run again without a download.  Don't leave it full of breakpoint
1669
   instructions.  */
1670
 
1671
static void
1672
e7000_mourn_inferior (void)
1673
{
1674
  remove_breakpoints ();
1675
  unpush_target (&e7000_ops);
1676
  generic_mourn_inferior ();    /* Do all the proper things now */
1677
}
1678
 
1679
#define MAX_BREAKPOINTS 200
1680
#ifdef  HARD_BREAKPOINTS
1681
#define MAX_E7000DEBUG_BREAKPOINTS (BC_BREAKPOINTS ? 5 :  MAX_BREAKPOINTS)
1682
#else
1683
#define MAX_E7000DEBUG_BREAKPOINTS MAX_BREAKPOINTS
1684
#endif
1685
 
1686
/* Since we can change to soft breakpoints dynamically, we must define
1687
   more than enough.  Was breakaddr[MAX_E7000DEBUG_BREAKPOINTS]. */
1688
static CORE_ADDR breakaddr[MAX_BREAKPOINTS] =
1689
{0};
1690
 
1691
static int
1692
e7000_insert_breakpoint (CORE_ADDR addr, char *shadow)
1693
{
1694
  int i;
1695
  char buf[200];
1696
#if 0
1697
  static char nop[2] = NOP;
1698
#endif
1699
 
1700
  for (i = 0; i <= MAX_E7000DEBUG_BREAKPOINTS; i++)
1701
    if (breakaddr[i] == 0)
1702
      {
1703
        breakaddr[i] = addr;
1704
        /* Save old contents, and insert a nop in the space */
1705
#ifdef HARD_BREAKPOINTS
1706
        if (BC_BREAKPOINTS)
1707
          {
1708
            sprintf (buf, "BC%d A=%s\r", i + 1, paddr_nz (addr));
1709
            puts_e7000debug (buf);
1710
          }
1711
        else
1712
          {
1713
            sprintf (buf, "B %s\r", paddr_nz (addr));
1714
            puts_e7000debug (buf);
1715
          }
1716
#else
1717
#if 0
1718
        e7000_read_inferior_memory (addr, shadow, 2);
1719
        e7000_write_inferior_memory (addr, nop, 2);
1720
#endif
1721
 
1722
        sprintf (buf, "B %x\r", addr);
1723
        puts_e7000debug (buf);
1724
#endif
1725
        expect_prompt ();
1726
        return 0;
1727
      }
1728
 
1729
  error ("Too many breakpoints ( > %d) for the E7000\n",
1730
         MAX_E7000DEBUG_BREAKPOINTS);
1731
  return 1;
1732
}
1733
 
1734
static int
1735
e7000_remove_breakpoint (CORE_ADDR addr, char *shadow)
1736
{
1737
  int i;
1738
  char buf[200];
1739
 
1740
  for (i = 0; i < MAX_E7000DEBUG_BREAKPOINTS; i++)
1741
    if (breakaddr[i] == addr)
1742
      {
1743
        breakaddr[i] = 0;
1744
#ifdef HARD_BREAKPOINTS
1745
        if (BC_BREAKPOINTS)
1746
          {
1747
            sprintf (buf, "BC%d - \r", i + 1);
1748
            puts_e7000debug (buf);
1749
          }
1750
        else
1751
          {
1752
            sprintf (buf, "B - %s\r", paddr_nz (addr));
1753
            puts_e7000debug (buf);
1754
          }
1755
        expect_prompt ();
1756
#else
1757
        sprintf (buf, "B - %s\r", paddr_nz (addr));
1758
        puts_e7000debug (buf);
1759
        expect_prompt ();
1760
 
1761
#if 0
1762
        /* Replace the insn under the break */
1763
        e7000_write_inferior_memory (addr, shadow, 2);
1764
#endif
1765
#endif
1766
 
1767
        return 0;
1768
      }
1769
 
1770
  warning ("Can't find breakpoint associated with 0x%s\n", paddr_nz (addr));
1771
  return 1;
1772
}
1773
 
1774
/* Put a command string, in args, out to STDBUG.  Output from STDBUG
1775
   is placed on the users terminal until the prompt is seen. */
1776
 
1777
static void
1778
e7000_command (char *args, int fromtty)
1779
{
1780
  /* FIXME: arbitrary limit on length of args.  */
1781
  char buf[200];
1782
 
1783
  echo = 0;
1784
 
1785
  if (!e7000_desc)
1786
    error ("e7000 target not open.");
1787
  if (!args)
1788
    {
1789
      puts_e7000debug ("\r");
1790
    }
1791
  else
1792
    {
1793
      sprintf (buf, "%s\r", args);
1794
      puts_e7000debug (buf);
1795
    }
1796
 
1797
  echo++;
1798
  ctrl_c = 2;
1799
  expect_full_prompt ();
1800
  echo--;
1801
  ctrl_c = 0;
1802
  printf_unfiltered ("\n");
1803
 
1804
  /* Who knows what the command did... */
1805
  registers_changed ();
1806
}
1807
 
1808
 
1809
static void
1810
e7000_drain_command (char *args, int fromtty)
1811
{
1812
  int c;
1813
 
1814
  puts_e7000debug ("end\r");
1815
  putchar_e7000 (CTRLC);
1816
 
1817
  while ((c = readchar (1) != -1))
1818
    {
1819
      if (quit_flag)
1820
        {
1821
          putchar_e7000 (CTRLC);
1822
          quit_flag = 0;
1823
        }
1824
      if (c > ' ' && c < 127)
1825
        printf_unfiltered ("%c", c & 0xff);
1826
      else
1827
        printf_unfiltered ("<%x>", c & 0xff);
1828
    }
1829
}
1830
 
1831
#define NITEMS 7
1832
 
1833
static int
1834
why_stop (void)
1835
{
1836
  static char *strings[NITEMS] =
1837
  {
1838
    "STEP NORMAL",
1839
    "BREAK POINT",
1840
    "BREAK KEY",
1841
    "BREAK CONDI",
1842
    "CYCLE ACCESS",
1843
    "ILLEGAL INSTRUCTION",
1844
    "WRITE PROTECT",
1845
  };
1846
  char *p[NITEMS];
1847
  int c;
1848
  int i;
1849
 
1850
  for (i = 0; i < NITEMS; ++i)
1851
    p[i] = strings[i];
1852
 
1853
  c = gch ();
1854
  while (1)
1855
    {
1856
      for (i = 0; i < NITEMS; i++)
1857
        {
1858
          if (c == *(p[i]))
1859
            {
1860
              p[i]++;
1861
              if (*(p[i]) == 0)
1862
                {
1863
                  /* found one of the choices */
1864
                  return i;
1865
                }
1866
            }
1867
          else
1868
            p[i] = strings[i];
1869
        }
1870
 
1871
      c = gch ();
1872
    }
1873
}
1874
 
1875
/* Suck characters, if a string match, then return the strings index
1876
   otherwise echo them.  */
1877
 
1878
int
1879
expect_n (char **strings)
1880
{
1881
  char *(ptr[10]);
1882
  int n;
1883
  int c;
1884
  char saveaway[100];
1885
  char *buffer = saveaway;
1886
  /* Count number of expect strings  */
1887
 
1888
  for (n = 0; strings[n]; n++)
1889
    {
1890
      ptr[n] = strings[n];
1891
    }
1892
 
1893
  while (1)
1894
    {
1895
      int i;
1896
      int gotone = 0;
1897
 
1898
      c = readchar (1);
1899
      if (c == -1)
1900
        {
1901
          printf_unfiltered ("[waiting for e7000...]\n");
1902
        }
1903
#ifdef __GO32__
1904
      if (kbhit ())
1905
        {
1906
          int k = getkey ();
1907
 
1908
          if (k == 1)
1909
            quit_flag = 1;
1910
        }
1911
#endif
1912
      if (quit_flag)
1913
        {
1914
          putchar_e7000 (CTRLC);        /* interrupt the running program */
1915
          quit_flag = 0;
1916
        }
1917
 
1918
      for (i = 0; i < n; i++)
1919
        {
1920
          if (c == ptr[i][0])
1921
            {
1922
              ptr[i]++;
1923
              if (ptr[i][0] == 0)
1924
                {
1925
                  /* Gone all the way */
1926
                  return i;
1927
                }
1928
              gotone = 1;
1929
            }
1930
          else
1931
            {
1932
              ptr[i] = strings[i];
1933
            }
1934
        }
1935
 
1936
      if (gotone)
1937
        {
1938
          /* Save it up incase we find that there was no match */
1939
          *buffer++ = c;
1940
        }
1941
      else
1942
        {
1943
          if (buffer != saveaway)
1944
            {
1945
              *buffer++ = 0;
1946
              printf_unfiltered ("%s", buffer);
1947
              buffer = saveaway;
1948
            }
1949
          if (c != -1)
1950
            {
1951
              putchar_unfiltered (c);
1952
              gdb_flush (gdb_stdout);
1953
            }
1954
        }
1955
    }
1956
}
1957
 
1958
/* We subtract two from the pc here rather than use
1959
   DECR_PC_AFTER_BREAK since the e7000 doesn't always add two to the
1960
   pc, and the simulators never do. */
1961
 
1962
static void
1963
sub2_from_pc (void)
1964
{
1965
  char buf[4];
1966
  char buf2[200];
1967
 
1968
  store_signed_integer (buf,
1969
                        REGISTER_RAW_SIZE (PC_REGNUM),
1970
                        read_register (PC_REGNUM) - 2);
1971
  supply_register (PC_REGNUM, buf);
1972
  sprintf (buf2, ".PC %s\r", phex_nz (read_register (PC_REGNUM), 0));
1973
  puts_e7000debug (buf2);
1974
}
1975
 
1976
#define WAS_SLEEP 0
1977
#define WAS_INT 1
1978
#define WAS_RUNNING 2
1979
#define WAS_OTHER 3
1980
 
1981
static char *estrings[] =
1982
{
1983
  "** SLEEP",
1984
  "BREAK !",
1985
  "** PC",
1986
  "PC",
1987
  NULL
1988
};
1989
 
1990
/* Wait until the remote machine stops, then return, storing status in
1991
   STATUS just as `wait' would.  */
1992
 
1993
static ptid_t
1994
e7000_wait (ptid_t ptid, struct target_waitstatus *status)
1995
{
1996
  int stop_reason;
1997
  int regno;
1998
  int running_count = 0;
1999
  int had_sleep = 0;
2000
  int loop = 1;
2001
  char *wanted_nopc = NULL;
2002
 
2003
  /* Then echo chars until PC= string seen */
2004
  gch ();                       /* Drop cr */
2005
  gch ();                       /* and space */
2006
 
2007
  while (loop)
2008
    {
2009
      switch (expect_n (estrings))
2010
        {
2011
        case WAS_OTHER:
2012
          /* how did this happen ? */
2013
          loop = 0;
2014
          break;
2015
        case WAS_SLEEP:
2016
          had_sleep = 1;
2017
          putchar_e7000 (CTRLC);
2018
          loop = 0;
2019
          break;
2020
        case WAS_INT:
2021
          loop = 0;
2022
          break;
2023
        case WAS_RUNNING:
2024
          running_count++;
2025
          if (running_count == 20)
2026
            {
2027
              printf_unfiltered ("[running...]\n");
2028
              running_count = 0;
2029
            }
2030
          break;
2031
        default:
2032
          /* error? */
2033
          break;
2034
        }
2035
    }
2036
 
2037
  /* Skip till the PC= */
2038
  expect ("=");
2039
 
2040
  if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
2041
    {
2042
      wanted_nopc = want_nopc_sh;
2043
      switch (TARGET_ARCHITECTURE->mach)
2044
        {
2045
        case bfd_mach_sh3:
2046
        case bfd_mach_sh3e:
2047
        case bfd_mach_sh4:
2048
          wanted_nopc = want_nopc_sh3;
2049
        }
2050
    }
2051
#ifdef GDB_TARGET_IS_H8300
2052
  if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
2053
    {
2054
      if (h8300smode)
2055
        wanted_nopc = want_nopc_h8300s;
2056
      else
2057
        wanted_nopc = want_nopc_h8300h;
2058
    }
2059
#endif
2060
  fetch_regs_from_dump (gch, wanted_nopc);
2061
 
2062
  /* And supply the extra ones the simulator uses */
2063
  for (regno = NUM_REALREGS; regno < NUM_REGS; regno++)
2064
    {
2065
      int buf = 0;
2066
      supply_register (regno, (char *) &buf);
2067
    }
2068
 
2069
  stop_reason = why_stop ();
2070
  expect_full_prompt ();
2071
 
2072
  status->kind = TARGET_WAITKIND_STOPPED;
2073
  status->value.sig = TARGET_SIGNAL_TRAP;
2074
 
2075
  switch (stop_reason)
2076
    {
2077
    case 1:                     /* Breakpoint */
2078
      write_pc (read_pc ());    /* PC is always off by 2 for breakpoints */
2079
      status->value.sig = TARGET_SIGNAL_TRAP;
2080
      break;
2081
    case 0:                      /* Single step */
2082
      status->value.sig = TARGET_SIGNAL_TRAP;
2083
      break;
2084
    case 2:                     /* Interrupt */
2085
      if (had_sleep)
2086
        {
2087
          status->value.sig = TARGET_SIGNAL_TRAP;
2088
          sub2_from_pc ();
2089
        }
2090
      else
2091
        {
2092
          status->value.sig = TARGET_SIGNAL_INT;
2093
        }
2094
      break;
2095
    case 3:
2096
      break;
2097
    case 4:
2098
      printf_unfiltered ("a cycle address error?\n");
2099
      status->value.sig = TARGET_SIGNAL_UNKNOWN;
2100
      break;
2101
    case 5:
2102
      status->value.sig = TARGET_SIGNAL_ILL;
2103
      break;
2104
    case 6:
2105
      status->value.sig = TARGET_SIGNAL_SEGV;
2106
      break;
2107
    case 7:                     /* Anything else (NITEMS + 1) */
2108
      printf_unfiltered ("a write protect error?\n");
2109
      status->value.sig = TARGET_SIGNAL_UNKNOWN;
2110
      break;
2111
    default:
2112
      /* Get the user's attention - this should never happen. */
2113
      internal_error (__FILE__, __LINE__, "failed internal consistency check");
2114
    }
2115
 
2116
  return inferior_ptid;
2117
}
2118
 
2119
/* Stop the running program.  */
2120
 
2121
static void
2122
e7000_stop (void)
2123
{
2124
  /* Sending a ^C is supposed to stop the running program.  */
2125
  putchar_e7000 (CTRLC);
2126
}
2127
 
2128
/* Define the target subroutine names. */
2129
 
2130
struct target_ops e7000_ops;
2131
 
2132
static void
2133
init_e7000_ops (void)
2134
{
2135
  e7000_ops.to_shortname = "e7000";
2136
  e7000_ops.to_longname = "Remote Hitachi e7000 target";
2137
  e7000_ops.to_doc = "Use a remote Hitachi e7000 ICE connected by a serial line;\n\
2138
or a network connection.\n\
2139
Arguments are the name of the device for the serial line,\n\
2140
the speed to connect at in bits per second.\n\
2141
eg\n\
2142
target e7000 /dev/ttya 9600\n\
2143
target e7000 foobar";
2144
  e7000_ops.to_open = e7000_open;
2145
  e7000_ops.to_close = e7000_close;
2146
  e7000_ops.to_attach = 0;
2147
  e7000_ops.to_post_attach = NULL;
2148
  e7000_ops.to_require_attach = NULL;
2149
  e7000_ops.to_detach = e7000_detach;
2150
  e7000_ops.to_require_detach = NULL;
2151
  e7000_ops.to_resume = e7000_resume;
2152
  e7000_ops.to_wait = e7000_wait;
2153
  e7000_ops.to_post_wait = NULL;
2154
  e7000_ops.to_fetch_registers = e7000_fetch_register;
2155
  e7000_ops.to_store_registers = e7000_store_register;
2156
  e7000_ops.to_prepare_to_store = e7000_prepare_to_store;
2157
  e7000_ops.to_xfer_memory = e7000_xfer_inferior_memory;
2158
  e7000_ops.to_files_info = e7000_files_info;
2159
  e7000_ops.to_insert_breakpoint = e7000_insert_breakpoint;
2160
  e7000_ops.to_remove_breakpoint = e7000_remove_breakpoint;
2161
  e7000_ops.to_terminal_init = 0;
2162
  e7000_ops.to_terminal_inferior = 0;
2163
  e7000_ops.to_terminal_ours_for_output = 0;
2164
  e7000_ops.to_terminal_ours = 0;
2165
  e7000_ops.to_terminal_info = 0;
2166
  e7000_ops.to_kill = e7000_kill;
2167
  e7000_ops.to_load = e7000_load;
2168
  e7000_ops.to_lookup_symbol = 0;
2169
  e7000_ops.to_create_inferior = e7000_create_inferior;
2170
  e7000_ops.to_post_startup_inferior = NULL;
2171
  e7000_ops.to_acknowledge_created_inferior = NULL;
2172
  e7000_ops.to_clone_and_follow_inferior = NULL;
2173
  e7000_ops.to_post_follow_inferior_by_clone = NULL;
2174
  e7000_ops.to_insert_fork_catchpoint = NULL;
2175
  e7000_ops.to_remove_fork_catchpoint = NULL;
2176
  e7000_ops.to_insert_vfork_catchpoint = NULL;
2177
  e7000_ops.to_remove_vfork_catchpoint = NULL;
2178
  e7000_ops.to_has_forked = NULL;
2179
  e7000_ops.to_has_vforked = NULL;
2180
  e7000_ops.to_can_follow_vfork_prior_to_exec = NULL;
2181
  e7000_ops.to_post_follow_vfork = NULL;
2182
  e7000_ops.to_insert_exec_catchpoint = NULL;
2183
  e7000_ops.to_remove_exec_catchpoint = NULL;
2184
  e7000_ops.to_has_execd = NULL;
2185
  e7000_ops.to_reported_exec_events_per_exec_call = NULL;
2186
  e7000_ops.to_has_exited = NULL;
2187
  e7000_ops.to_mourn_inferior = e7000_mourn_inferior;
2188
  e7000_ops.to_can_run = 0;
2189
  e7000_ops.to_notice_signals = 0;
2190
  e7000_ops.to_thread_alive = 0;
2191
  e7000_ops.to_stop = e7000_stop;
2192
  e7000_ops.to_pid_to_exec_file = NULL;
2193
  e7000_ops.to_stratum = process_stratum;
2194
  e7000_ops.DONT_USE = 0;
2195
  e7000_ops.to_has_all_memory = 1;
2196
  e7000_ops.to_has_memory = 1;
2197
  e7000_ops.to_has_stack = 1;
2198
  e7000_ops.to_has_registers = 1;
2199
  e7000_ops.to_has_execution = 1;
2200
  e7000_ops.to_sections = 0;
2201
  e7000_ops.to_sections_end = 0;
2202
  e7000_ops.to_magic = OPS_MAGIC;
2203
};
2204
 
2205
void
2206
_initialize_remote_e7000 (void)
2207
{
2208
  init_e7000_ops ();
2209
  add_target (&e7000_ops);
2210
 
2211
  add_com ("e7000", class_obscure, e7000_command,
2212
           "Send a command to the e7000 monitor.");
2213
 
2214
  add_com ("ftplogin", class_obscure, e7000_login_command,
2215
           "Login to machine and change to directory.");
2216
 
2217
  add_com ("ftpload", class_obscure, e7000_ftp_command,
2218
           "Fetch and load a file from previously described place.");
2219
 
2220
  add_com ("drain", class_obscure, e7000_drain_command,
2221
           "Drain pending e7000 text buffers.");
2222
 
2223
  add_show_from_set (add_set_cmd ("usehardbreakpoints", no_class,
2224
                                var_integer, (char *) &use_hard_breakpoints,
2225
        "Set use of hardware breakpoints for all breakpoints.\n", &setlist),
2226
                     &showlist);
2227
}

powered by: WebSVN 2.1.0

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