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

Subversion Repositories or1k

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* Remote debugging interface for Tandem ST2000 phone switch, for GDB.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001
3
   Free Software Foundation, Inc.
4
   Contributed by Cygnus Support.  Written by Jim Kingdon for Cygnus.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 2 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 59 Temple Place - Suite 330,
21
   Boston, MA 02111-1307, USA.  */
22
 
23
/* This file was derived from remote-eb.c, which did a similar job, but for
24
   an AMD-29K running EBMON.  That file was in turn derived from remote.c
25
   as mentioned in the following comment (left in for comic relief):
26
 
27
   "This is like remote.c but is for an esoteric situation--
28
   having an a29k board in a PC hooked up to a unix machine with
29
   a serial line, and running ctty com1 on the PC, through which
30
   the unix machine can run ebmon.  Not to mention that the PC
31
   has PC/NFS, so it can access the same executables that gdb can,
32
   over the net in real time."
33
 
34
   In reality, this module talks to a debug monitor called 'STDEBUG', which
35
   runs in a phone switch.  We communicate with STDEBUG via either a direct
36
   serial line, or a TCP (or possibly TELNET) stream to a terminal multiplexor,
37
   which in turn talks to the phone switch. */
38
 
39
#include "defs.h"
40
#include "gdbcore.h"
41
#include "target.h"
42
#include "gdb_string.h"
43
#include <sys/types.h>
44
#include "serial.h"
45
#include "regcache.h"
46
 
47
extern struct target_ops st2000_ops;    /* Forward declaration */
48
 
49
static void st2000_close ();
50
static void st2000_fetch_register ();
51
static void st2000_store_register ();
52
 
53
#define LOG_FILE "st2000.log"
54
#if defined (LOG_FILE)
55
FILE *log_file;
56
#endif
57
 
58
static int timeout = 24;
59
 
60
/* Descriptor for I/O to remote machine.  Initialize it to -1 so that
61
   st2000_open knows that we don't have a file open when the program
62
   starts.  */
63
 
64
static serial_t st2000_desc;
65
 
66
/* Send data to stdebug.  Works just like printf. */
67
 
68
static void
69
printf_stdebug (char *pattern,...)
70
{
71
  va_list args;
72
  char buf[200];
73
 
74
  va_start (args, pattern);
75
 
76
  vsprintf (buf, pattern, args);
77
  va_end (args);
78
 
79
  if (SERIAL_WRITE (st2000_desc, buf, strlen (buf)))
80
    fprintf (stderr, "SERIAL_WRITE failed: %s\n", safe_strerror (errno));
81
}
82
 
83
/* Read a character from the remote system, doing all the fancy timeout
84
   stuff.  */
85
 
86
static int
87
readchar (int timeout)
88
{
89
  int c;
90
 
91
  c = SERIAL_READCHAR (st2000_desc, timeout);
92
 
93
#ifdef LOG_FILE
94
  putc (c & 0x7f, log_file);
95
#endif
96
 
97
  if (c >= 0)
98
    return c & 0x7f;
99
 
100
  if (c == SERIAL_TIMEOUT)
101
    {
102
      if (timeout == 0)
103
        return c;               /* Polls shouldn't generate timeout errors */
104
 
105
      error ("Timeout reading from remote system.");
106
    }
107
 
108
  perror_with_name ("remote-st2000");
109
}
110
 
111
/* Scan input from the remote system, until STRING is found.  If DISCARD is
112
   non-zero, then discard non-matching input, else print it out.
113
   Let the user break out immediately.  */
114
static void
115
expect (char *string, int discard)
116
{
117
  char *p = string;
118
  int c;
119
 
120
  immediate_quit++;
121
  while (1)
122
    {
123
      c = readchar (timeout);
124
      if (c == *p++)
125
        {
126
          if (*p == '\0')
127
            {
128
              immediate_quit--;
129
              return;
130
            }
131
        }
132
      else
133
        {
134
          if (!discard)
135
            {
136
              fwrite (string, 1, (p - 1) - string, stdout);
137
              putchar ((char) c);
138
              fflush (stdout);
139
            }
140
          p = string;
141
        }
142
    }
143
}
144
 
145
/* Keep discarding input until we see the STDEBUG prompt.
146
 
147
   The convention for dealing with the prompt is that you
148
   o give your command
149
   o *then* wait for the prompt.
150
 
151
   Thus the last thing that a procedure does with the serial line
152
   will be an expect_prompt().  Exception:  st2000_resume does not
153
   wait for the prompt, because the terminal is being handed over
154
   to the inferior.  However, the next thing which happens after that
155
   is a st2000_wait which does wait for the prompt.
156
   Note that this includes abnormal exit, e.g. error().  This is
157
   necessary to prevent getting into states from which we can't
158
   recover.  */
159
static void
160
expect_prompt (int discard)
161
{
162
#if defined (LOG_FILE)
163
  /* This is a convenient place to do this.  The idea is to do it often
164
     enough that we never lose much data if we terminate abnormally.  */
165
  fflush (log_file);
166
#endif
167
  expect ("dbug> ", discard);
168
}
169
 
170
/* Get a hex digit from the remote system & return its value.
171
   If ignore_space is nonzero, ignore spaces (not newline, tab, etc).  */
172
static int
173
get_hex_digit (int ignore_space)
174
{
175
  int ch;
176
  while (1)
177
    {
178
      ch = readchar (timeout);
179
      if (ch >= '0' && ch <= '9')
180
        return ch - '0';
181
      else if (ch >= 'A' && ch <= 'F')
182
        return ch - 'A' + 10;
183
      else if (ch >= 'a' && ch <= 'f')
184
        return ch - 'a' + 10;
185
      else if (ch == ' ' && ignore_space)
186
        ;
187
      else
188
        {
189
          expect_prompt (1);
190
          error ("Invalid hex digit from remote system.");
191
        }
192
    }
193
}
194
 
195
/* Get a byte from stdebug and put it in *BYT.  Accept any number
196
   leading spaces.  */
197
static void
198
get_hex_byte (char *byt)
199
{
200
  int val;
201
 
202
  val = get_hex_digit (1) << 4;
203
  val |= get_hex_digit (0);
204
  *byt = val;
205
}
206
 
207
/* Get N 32-bit words from remote, each preceded by a space,
208
   and put them in registers starting at REGNO.  */
209
static void
210
get_hex_regs (int n, int regno)
211
{
212
  long val;
213
  int i;
214
 
215
  for (i = 0; i < n; i++)
216
    {
217
      int j;
218
 
219
      val = 0;
220
      for (j = 0; j < 8; j++)
221
        val = (val << 4) + get_hex_digit (j == 0);
222
      supply_register (regno++, (char *) &val);
223
    }
224
}
225
 
226
/* This is called not only when we first attach, but also when the
227
   user types "run" after having attached.  */
228
static void
229
st2000_create_inferior (char *execfile, char *args, char **env)
230
{
231
  int entry_pt;
232
 
233
  if (args && *args)
234
    error ("Can't pass arguments to remote STDEBUG process");
235
 
236
  if (execfile == 0 || exec_bfd == 0)
237
    error ("No executable file specified");
238
 
239
  entry_pt = (int) bfd_get_start_address (exec_bfd);
240
 
241
/* The "process" (board) is already stopped awaiting our commands, and
242
   the program is already downloaded.  We just set its PC and go.  */
243
 
244
  clear_proceed_status ();
245
 
246
  /* Tell wait_for_inferior that we've started a new process.  */
247
  init_wait_for_inferior ();
248
 
249
  /* Set up the "saved terminal modes" of the inferior
250
     based on what modes we are starting it with.  */
251
  target_terminal_init ();
252
 
253
  /* Install inferior's terminal modes.  */
254
  target_terminal_inferior ();
255
 
256
  /* insert_step_breakpoint ();  FIXME, do we need this?  */
257
  /* Let 'er rip... */
258
  proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0);
259
}
260
 
261
/* Open a connection to a remote debugger.
262
   NAME is the filename used for communication.  */
263
 
264
static int baudrate = 9600;
265
static char dev_name[100];
266
 
267
static void
268
st2000_open (char *args, int from_tty)
269
{
270
  int n;
271
  char junk[100];
272
 
273
  target_preopen (from_tty);
274
 
275
  n = sscanf (args, " %s %d %s", dev_name, &baudrate, junk);
276
 
277
  if (n != 2)
278
    error ("Bad arguments.  Usage: target st2000 <device> <speed>\n\
279
or target st2000 <host> <port>\n");
280
 
281
  st2000_close (0);
282
 
283
  st2000_desc = SERIAL_OPEN (dev_name);
284
 
285
  if (!st2000_desc)
286
    perror_with_name (dev_name);
287
 
288
  if (SERIAL_SETBAUDRATE (st2000_desc, baudrate))
289
    {
290
      SERIAL_CLOSE (dev_name);
291
      perror_with_name (dev_name);
292
    }
293
 
294
  SERIAL_RAW (st2000_desc);
295
 
296
  push_target (&st2000_ops);
297
 
298
#if defined (LOG_FILE)
299
  log_file = fopen (LOG_FILE, "w");
300
  if (log_file == NULL)
301
    perror_with_name (LOG_FILE);
302
#endif
303
 
304
  /* Hello?  Are you there?  */
305
  printf_stdebug ("\003");      /* ^C wakes up dbug */
306
 
307
  expect_prompt (1);
308
 
309
  if (from_tty)
310
    printf ("Remote %s connected to %s\n", target_shortname,
311
            dev_name);
312
}
313
 
314
/* Close out all files and local state before this target loses control. */
315
 
316
static void
317
st2000_close (int quitting)
318
{
319
  SERIAL_CLOSE (st2000_desc);
320
 
321
#if defined (LOG_FILE)
322
  if (log_file)
323
    {
324
      if (ferror (log_file))
325
        fprintf (stderr, "Error writing log file.\n");
326
      if (fclose (log_file) != 0)
327
        fprintf (stderr, "Error closing log file.\n");
328
    }
329
#endif
330
}
331
 
332
/* Terminate the open connection to the remote debugger.
333
   Use this when you want to detach and do something else
334
   with your gdb.  */
335
static void
336
st2000_detach (int from_tty)
337
{
338
  pop_target ();                /* calls st2000_close to do the real work */
339
  if (from_tty)
340
    printf ("Ending remote %s debugging\n", target_shortname);
341
}
342
 
343
/* Tell the remote machine to resume.  */
344
 
345
static void
346
st2000_resume (ptid_t ptid, int step, enum target_signal sig)
347
{
348
  if (step)
349
    {
350
      printf_stdebug ("ST\r");
351
      /* Wait for the echo.  */
352
      expect ("ST\r", 1);
353
    }
354
  else
355
    {
356
      printf_stdebug ("GO\r");
357
      /* Swallow the echo.  */
358
      expect ("GO\r", 1);
359
    }
360
}
361
 
362
/* Wait until the remote machine stops, then return,
363
   storing status in STATUS just as `wait' would.  */
364
 
365
static ptid_t
366
st2000_wait (ptid_t ptid, struct target_waitstatus *status)
367
{
368
  int old_timeout = timeout;
369
 
370
  status->kind = TARGET_WAITKIND_EXITED;
371
  status->value.integer = 0;
372
 
373
  timeout = 0;                   /* Don't time out -- user program is running. */
374
 
375
  expect_prompt (0);             /* Wait for prompt, outputting extraneous text */
376
 
377
  status->kind = TARGET_WAITKIND_STOPPED;
378
  status->value.sig = TARGET_SIGNAL_TRAP;
379
 
380
  timeout = old_timeout;
381
 
382
  return inferior_ptid;
383
}
384
 
385
/* Return the name of register number REGNO in the form input and output by
386
   STDEBUG.  Currently, REGISTER_NAMES just happens to contain exactly what
387
   STDEBUG wants.  Lets take advantage of that just as long as possible! */
388
 
389
static char *
390
get_reg_name (int regno)
391
{
392
  static char buf[50];
393
  const char *p;
394
  char *b;
395
 
396
  b = buf;
397
 
398
  for (p = REGISTER_NAME (regno); *p; p++)
399
    *b++ = toupper (*p);
400
  *b = '\000';
401
 
402
  return buf;
403
}
404
 
405
/* Read the remote registers into the block REGS.  */
406
 
407
static void
408
st2000_fetch_registers (void)
409
{
410
  int regno;
411
 
412
  /* Yeah yeah, I know this is horribly inefficient.  But it isn't done
413
     very often...  I'll clean it up later.  */
414
 
415
  for (regno = 0; regno <= PC_REGNUM; regno++)
416
    st2000_fetch_register (regno);
417
}
418
 
419
/* Fetch register REGNO, or all registers if REGNO is -1.
420
   Returns errno value.  */
421
static void
422
st2000_fetch_register (int regno)
423
{
424
  if (regno == -1)
425
    st2000_fetch_registers ();
426
  else
427
    {
428
      char *name = get_reg_name (regno);
429
      printf_stdebug ("DR %s\r", name);
430
      expect (name, 1);
431
      expect (" : ", 1);
432
      get_hex_regs (1, regno);
433
      expect_prompt (1);
434
    }
435
  return;
436
}
437
 
438
/* Store the remote registers from the contents of the block REGS.  */
439
 
440
static void
441
st2000_store_registers (void)
442
{
443
  int regno;
444
 
445
  for (regno = 0; regno <= PC_REGNUM; regno++)
446
    st2000_store_register (regno);
447
 
448
  registers_changed ();
449
}
450
 
451
/* Store register REGNO, or all if REGNO == 0.
452
   Return errno value.  */
453
static void
454
st2000_store_register (int regno)
455
{
456
  if (regno == -1)
457
    st2000_store_registers ();
458
  else
459
    {
460
      printf_stdebug ("PR %s %x\r", get_reg_name (regno),
461
                      read_register (regno));
462
 
463
      expect_prompt (1);
464
    }
465
}
466
 
467
/* Get ready to modify the registers array.  On machines which store
468
   individual registers, this doesn't need to do anything.  On machines
469
   which store all the registers in one fell swoop, this makes sure
470
   that registers contains all the registers from the program being
471
   debugged.  */
472
 
473
static void
474
st2000_prepare_to_store (void)
475
{
476
  /* Do nothing, since we can store individual regs */
477
}
478
 
479
static void
480
st2000_files_info (void)
481
{
482
  printf ("\tAttached to %s at %d baud.\n",
483
          dev_name, baudrate);
484
}
485
 
486
/* Copy LEN bytes of data from debugger memory at MYADDR
487
   to inferior's memory at MEMADDR.  Returns length moved.  */
488
static int
489
st2000_write_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
490
{
491
  int i;
492
 
493
  for (i = 0; i < len; i++)
494
    {
495
      printf_stdebug ("PM.B %x %x\r", memaddr + i, myaddr[i]);
496
      expect_prompt (1);
497
    }
498
  return len;
499
}
500
 
501
/* Read LEN bytes from inferior memory at MEMADDR.  Put the result
502
   at debugger address MYADDR.  Returns length moved.  */
503
static int
504
st2000_read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
505
{
506
  int i;
507
 
508
  /* Number of bytes read so far.  */
509
  int count;
510
 
511
  /* Starting address of this pass.  */
512
  unsigned long startaddr;
513
 
514
  /* Number of bytes to read in this pass.  */
515
  int len_this_pass;
516
 
517
  /* Note that this code works correctly if startaddr is just less
518
     than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
519
     thing).  That is, something like
520
     st2000_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
521
     works--it never adds len to memaddr and gets 0.  */
522
  /* However, something like
523
     st2000_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
524
     doesn't need to work.  Detect it and give up if there's an attempt
525
     to do that.  */
526
  if (((memaddr - 1) + len) < memaddr)
527
    {
528
      errno = EIO;
529
      return 0;
530
    }
531
 
532
  startaddr = memaddr;
533
  count = 0;
534
  while (count < len)
535
    {
536
      len_this_pass = 16;
537
      if ((startaddr % 16) != 0)
538
        len_this_pass -= startaddr % 16;
539
      if (len_this_pass > (len - count))
540
        len_this_pass = (len - count);
541
 
542
      printf_stdebug ("DI.L %x %x\r", startaddr, len_this_pass);
543
      expect (":  ", 1);
544
 
545
      for (i = 0; i < len_this_pass; i++)
546
        get_hex_byte (&myaddr[count++]);
547
 
548
      expect_prompt (1);
549
 
550
      startaddr += len_this_pass;
551
    }
552
  return len;
553
}
554
 
555
/* Transfer LEN bytes between GDB address MYADDR and target address
556
   MEMADDR.  If WRITE is non-zero, transfer them to the target,
557
   otherwise transfer them from the target.  TARGET is unused.
558
 
559
   Returns the number of bytes transferred. */
560
 
561
static int
562
st2000_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
563
                             int write,
564
                             struct mem_attrib *attrib ATTRIBUTE_UNUSED,
565
                             struct target_ops *target ATTRIBUTE_UNUSED)
566
{
567
  if (write)
568
    return st2000_write_inferior_memory (memaddr, myaddr, len);
569
  else
570
    return st2000_read_inferior_memory (memaddr, myaddr, len);
571
}
572
 
573
static void
574
st2000_kill (char *args, int from_tty)
575
{
576
  return;                       /* Ignore attempts to kill target system */
577
}
578
 
579
/* Clean up when a program exits.
580
 
581
   The program actually lives on in the remote processor's RAM, and may be
582
   run again without a download.  Don't leave it full of breakpoint
583
   instructions.  */
584
 
585
static void
586
st2000_mourn_inferior (void)
587
{
588
  remove_breakpoints ();
589
  unpush_target (&st2000_ops);
590
  generic_mourn_inferior ();    /* Do all the proper things now */
591
}
592
 
593
#define MAX_STDEBUG_BREAKPOINTS 16
594
 
595
static CORE_ADDR breakaddr[MAX_STDEBUG_BREAKPOINTS] =
596
{0};
597
 
598
static int
599
st2000_insert_breakpoint (CORE_ADDR addr, char *shadow)
600
{
601
  int i;
602
  CORE_ADDR bp_addr = addr;
603
  int bp_size = 0;
604
 
605
  BREAKPOINT_FROM_PC (&bp_addr, &bp_size);
606
 
607
  for (i = 0; i <= MAX_STDEBUG_BREAKPOINTS; i++)
608
    if (breakaddr[i] == 0)
609
      {
610
        breakaddr[i] = addr;
611
 
612
        st2000_read_inferior_memory (bp_addr, shadow, bp_size);
613
        printf_stdebug ("BR %x H\r", addr);
614
        expect_prompt (1);
615
        return 0;
616
      }
617
 
618
  fprintf (stderr, "Too many breakpoints (> 16) for STDBUG\n");
619
  return 1;
620
}
621
 
622
static int
623
st2000_remove_breakpoint (CORE_ADDR addr, char *shadow)
624
{
625
  int i;
626
 
627
  for (i = 0; i < MAX_STDEBUG_BREAKPOINTS; i++)
628
    if (breakaddr[i] == addr)
629
      {
630
        breakaddr[i] = 0;
631
 
632
        printf_stdebug ("CB %d\r", i);
633
        expect_prompt (1);
634
        return 0;
635
      }
636
 
637
  fprintf (stderr, "Can't find breakpoint associated with 0x%x\n", addr);
638
  return 1;
639
}
640
 
641
 
642
/* Put a command string, in args, out to STDBUG.  Output from STDBUG is placed
643
   on the users terminal until the prompt is seen. */
644
 
645
static void
646
st2000_command (char *args, int fromtty)
647
{
648
  if (!st2000_desc)
649
    error ("st2000 target not open.");
650
 
651
  if (!args)
652
    error ("Missing command.");
653
 
654
  printf_stdebug ("%s\r", args);
655
  expect_prompt (0);
656
}
657
 
658
/* Connect the user directly to STDBUG.  This command acts just like the
659
   'cu' or 'tip' command.  Use <CR>~. or <CR>~^D to break out.  */
660
 
661
/*static struct ttystate ttystate; */
662
 
663
static void
664
cleanup_tty (void)
665
{
666
  printf ("\r\n[Exiting connect mode]\r\n");
667
/*  SERIAL_RESTORE(0, &ttystate); */
668
}
669
 
670
#if 0
671
/* This all should now be in serial.c */
672
 
673
static void
674
connect_command (char *args, int fromtty)
675
{
676
  fd_set readfds;
677
  int numfds;
678
  int c;
679
  char cur_esc = 0;
680
 
681
  dont_repeat ();
682
 
683
  if (st2000_desc < 0)
684
    error ("st2000 target not open.");
685
 
686
  if (args)
687
    fprintf ("This command takes no args.  They have been ignored.\n");
688
 
689
  printf ("[Entering connect mode.  Use ~. or ~^D to escape]\n");
690
 
691
  serial_raw (0, &ttystate);
692
 
693
  make_cleanup (cleanup_tty, 0);
694
 
695
  FD_ZERO (&readfds);
696
 
697
  while (1)
698
    {
699
      do
700
        {
701
          FD_SET (0, &readfds);
702
          FD_SET (DEPRECATED_SERIAL_FD (st2000_desc), &readfds);
703
          numfds = select (sizeof (readfds) * 8, &readfds, 0, 0, 0);
704
        }
705
      while (numfds == 0);
706
 
707
      if (numfds < 0)
708
        perror_with_name ("select");
709
 
710
      if (FD_ISSET (0, &readfds))
711
        {                       /* tty input, send to stdebug */
712
          c = getchar ();
713
          if (c < 0)
714
            perror_with_name ("connect");
715
 
716
          printf_stdebug ("%c", c);
717
          switch (cur_esc)
718
            {
719
            case 0:
720
              if (c == '\r')
721
                cur_esc = c;
722
              break;
723
            case '\r':
724
              if (c == '~')
725
                cur_esc = c;
726
              else
727
                cur_esc = 0;
728
              break;
729
            case '~':
730
              if (c == '.' || c == '\004')
731
                return;
732
              else
733
                cur_esc = 0;
734
            }
735
        }
736
 
737
      if (FD_ISSET (DEPRECATED_SERIAL_FD (st2000_desc), &readfds))
738
        {
739
          while (1)
740
            {
741
              c = readchar (0);
742
              if (c < 0)
743
                break;
744
              putchar (c);
745
            }
746
          fflush (stdout);
747
        }
748
    }
749
}
750
#endif /* 0 */
751
 
752
/* Define the target subroutine names */
753
 
754
struct target_ops st2000_ops;
755
 
756
static void
757
init_st2000_ops (void)
758
{
759
  st2000_ops.to_shortname = "st2000";
760
  st2000_ops.to_longname = "Remote serial Tandem ST2000 target";
761
  st2000_ops.to_doc = "Use a remote computer running STDEBUG connected by a serial line;\n\
762
or a network connection.\n\
763
Arguments are the name of the device for the serial line,\n\
764
the speed to connect at in bits per second.";
765
  st2000_ops.to_open = st2000_open;
766
  st2000_ops.to_close = st2000_close;
767
  st2000_ops.to_attach = 0;
768
  st2000_run_ops.to_post_attach = NULL;
769
  st2000_ops.to_require_attach = NULL;
770
  st2000_ops.to_detach = st2000_detach;
771
  st2000_ops.to_require_detach = NULL;
772
  st2000_ops.to_resume = st2000_resume;
773
  st2000_ops.to_wait = st2000_wait;
774
  st2000_ops.to_post_wait = NULL;
775
  st2000_ops.to_fetch_registers = st2000_fetch_register;
776
  st2000_ops.to_store_registers = st2000_store_register;
777
  st2000_ops.to_prepare_to_store = st2000_prepare_to_store;
778
  st2000_ops.to_xfer_memory = st2000_xfer_inferior_memory;
779
  st2000_ops.to_files_info = st2000_files_info;
780
  st2000_ops.to_insert_breakpoint = st2000_insert_breakpoint;
781
  st2000_ops.to_remove_breakpoint = st2000_remove_breakpoint;   /* Breakpoints */
782
  st2000_ops.to_terminal_init = 0;
783
  st2000_ops.to_terminal_inferior = 0;
784
  st2000_ops.to_terminal_ours_for_output = 0;
785
  st2000_ops.to_terminal_ours = 0;
786
  st2000_ops.to_terminal_info = 0;       /* Terminal handling */
787
  st2000_ops.to_kill = st2000_kill;
788
  st2000_ops.to_load = 0;        /* load */
789
  st2000_ops.to_lookup_symbol = 0;       /* lookup_symbol */
790
  st2000_ops.to_create_inferior = st2000_create_inferior;
791
  st2000_ops.to_post_startup_inferior = NULL;
792
  st2000_ops.to_acknowledge_created_inferior = NULL;
793
  st2000_ops.to_clone_and_follow_inferior = NULL;
794
  st2000_ops.to_post_follow_inferior_by_clone = NULL;
795
  st2000_run_ops.to_insert_fork_catchpoint = NULL;
796
  st2000_run_ops.to_remove_fork_catchpoint = NULL;
797
  st2000_run_ops.to_insert_vfork_catchpoint = NULL;
798
  st2000_run_ops.to_remove_vfork_catchpoint = NULL;
799
  st2000_ops.to_has_forked = NULL;
800
  st2000_ops.to_has_vforked = NULL;
801
  st2000_run_ops.to_can_follow_vfork_prior_to_exec = NULL;
802
  st2000_ops.to_post_follow_vfork = NULL;
803
  st2000_run_ops.to_insert_exec_catchpoint = NULL;
804
  st2000_run_ops.to_remove_exec_catchpoint = NULL;
805
  st2000_run_ops.to_has_execd = NULL;
806
  st2000_run_ops.to_reported_exec_events_per_exec_call = NULL;
807
  st2000_run_ops.to_has_exited = NULL;
808
  st2000_ops.to_mourn_inferior = st2000_mourn_inferior;
809
  st2000_ops.to_can_run = 0;     /* can_run */
810
  st2000_ops.to_notice_signals = 0;      /* notice_signals */
811
  st2000_ops.to_thread_alive = 0;        /* thread alive */
812
  st2000_ops.to_stop = 0;        /* to_stop */
813
  st2000_ops.to_pid_to_exec_file = NULL;
814
  st2000_ops.to_stratum = process_stratum;
815
  st2000_ops.DONT_USE = 0;       /* next */
816
  st2000_ops.to_has_all_memory = 1;
817
  st2000_ops.to_has_memory = 1;
818
  st2000_ops.to_has_stack = 1;
819
  st2000_ops.to_has_registers = 1;
820
  st2000_ops.to_has_execution = 1;      /* all mem, mem, stack, regs, exec */
821
  st2000_ops.to_sections = 0;
822
  st2000_ops.to_sections_end = 0;        /* Section pointers */
823
  st2000_ops.to_magic = OPS_MAGIC;      /* Always the last thing */
824
};
825
 
826
void
827
_initialize_remote_st2000 (void)
828
{
829
  init_st2000_ops ();
830
  add_target (&st2000_ops);
831
  add_com ("st2000 <command>", class_obscure, st2000_command,
832
           "Send a command to the STDBUG monitor.");
833
  add_com ("connect", class_obscure, connect_command,
834
           "Connect the terminal directly up to the STDBUG command monitor.\n\
835
Use <CR>~. or <CR>~^D to break out.");
836
}

powered by: WebSVN 2.1.0

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