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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [sim/] [rx/] [main.c] - Blame information for rev 854

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

Line No. Rev Author Line
1 227 jeremybenn
/* main.c --- main function for stand-alone RX simulator.
2
 
3
Copyright (C) 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4
Contributed by Red Hat, Inc.
5
 
6
This file is part of the GNU simulators.
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 3 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, see <http://www.gnu.org/licenses/>.  */
20
 
21
 
22
#include "config.h"
23
#include <stdio.h>
24
#include <string.h>
25
#ifdef HAVE_STDLIB_H
26
#include <stdlib.h>
27
#endif
28
#ifdef HAVE_UNISTD_H
29
#include <unistd.h>
30
#endif
31
#include <assert.h>
32
#include <setjmp.h>
33
#include <signal.h>
34
#ifdef HAVE_GETOPT_H
35
#include <getopt.h>
36
#endif
37
 
38
#include "bfd.h"
39
 
40
#include "cpu.h"
41
#include "mem.h"
42
#include "misc.h"
43
#include "load.h"
44
#include "trace.h"
45
#include "err.h"
46
 
47
static int disassemble = 0;
48
 
49
/* This must be higher than any other option index.  */
50
#define OPT_ACT 400
51
 
52
#define ACT(E,A) (OPT_ACT + SIM_ERR_##E * SIM_ERRACTION_NUM_ACTIONS + SIM_ERRACTION_##A)
53
 
54
static struct option sim_options[] =
55
{
56
  { "end-sim-args", 0, NULL, 'E' },
57
  { "exit-null-deref", 0, NULL, ACT(NULL_POINTER_DEREFERENCE,EXIT) },
58
  { "warn-null-deref", 0, NULL, ACT(NULL_POINTER_DEREFERENCE,WARN) },
59
  { "ignore-null-deref", 0, NULL, ACT(NULL_POINTER_DEREFERENCE,IGNORE) },
60
  { "exit-unwritten-pages", 0, NULL, ACT(READ_UNWRITTEN_PAGES,EXIT) },
61
  { "warn-unwritten-pages", 0, NULL, ACT(READ_UNWRITTEN_PAGES,WARN) },
62
  { "ignore-unwritten-pages", 0, NULL, ACT(READ_UNWRITTEN_PAGES,IGNORE) },
63
  { "exit-unwritten-bytes", 0, NULL, ACT(READ_UNWRITTEN_BYTES,EXIT) },
64
  { "warn-unwritten-bytes", 0, NULL, ACT(READ_UNWRITTEN_BYTES,WARN) },
65
  { "ignore-unwritten-bytes", 0, NULL, ACT(READ_UNWRITTEN_BYTES,IGNORE) },
66
  { "exit-corrupt-stack", 0, NULL, ACT(CORRUPT_STACK,EXIT) },
67
  { "warn-corrupt-stack", 0, NULL, ACT(CORRUPT_STACK,WARN) },
68
  { "ignore-corrupt-stack", 0, NULL, ACT(CORRUPT_STACK,IGNORE) },
69
  { 0, 0, 0, 0 }
70
};
71
 
72
static void
73
done (int exit_code)
74
{
75
  if (verbose)
76
    {
77
      stack_heap_stats ();
78
      mem_usage_stats ();
79
      /* Only use comma separated numbers when being very verbose.
80
         Comma separated numbers are hard to parse in awk scripts.  */
81
      if (verbose > 1)
82
        printf ("insns: %14s\n", comma (rx_cycles));
83
      else
84
        printf ("insns: %u\n", rx_cycles);
85
    }
86
  exit (exit_code);
87
}
88
 
89
int
90
main (int argc, char **argv)
91
{
92
  int o;
93
  int save_trace;
94
  bfd *prog;
95
 
96
  /* By default, we exit when an execution error occurs.  */
97
  execution_error_init_standalone ();
98
 
99
  while ((o = getopt_long (argc, argv, "tvdeEwi", sim_options, NULL)) != -1)
100
    {
101
      if (o == 'E')
102
        /* Stop processing the command line. This is so that any remaining
103
           words on the command line that look like arguments will be passed
104
           on to the program being simulated.  */
105
        break;
106
 
107
      if (o >= OPT_ACT)
108
        {
109
          int e, a;
110
 
111
          o -= OPT_ACT;
112
          e = o / SIM_ERRACTION_NUM_ACTIONS;
113
          a = o % SIM_ERRACTION_NUM_ACTIONS;
114
          execution_error_set_action (e, a);
115
        }
116
      else switch (o)
117
        {
118
        case 't':
119
          trace++;
120
          break;
121
        case 'v':
122
          verbose++;
123
          break;
124
        case 'd':
125
          disassemble++;
126
          break;
127
        case 'e':
128
          execution_error_init_standalone ();
129
          break;
130
        case 'w':
131
          execution_error_warn_all ();
132
          break;
133
        case 'i':
134
          execution_error_ignore_all ();
135
          break;
136
        case '?':
137
          {
138
            int i;
139
            fprintf (stderr,
140
                     "usage: run [options] program [arguments]\n");
141
            fprintf (stderr,
142
                     "\t-v\t- increase verbosity.\n"
143
                     "\t-t\t- trace.\n"
144
                     "\t-d\t- disassemble.\n"
145
                     "\t-E\t- stop processing sim args\n"
146
                     "\t-e\t- exit on all execution errors.\n"
147
                     "\t-w\t- warn (do not exit) on all execution errors.\n"
148
                     "\t-i\t- ignore all execution errors.\n");
149
            for (i=0; sim_options[i].name; i++)
150
              fprintf (stderr, "\t--%s\n", sim_options[i].name);
151
            exit (1);
152
          }
153
        }
154
    }
155
 
156
  prog = bfd_openr (argv[optind], 0);
157
  if (!prog)
158
    {
159
      fprintf (stderr, "Can't read %s\n", argv[optind]);
160
      exit (1);
161
    }
162
 
163
  if (!bfd_check_format (prog, bfd_object))
164
    {
165
      fprintf (stderr, "%s not a rx program\n", argv[optind]);
166
      exit (1);
167
    }
168
 
169
  init_regs ();
170
 
171
  rx_in_gdb = 0;
172
  save_trace = trace;
173
  trace = 0;
174
  rx_load (prog);
175
  trace = save_trace;
176
 
177
  sim_disasm_init (prog);
178
 
179
  while (1)
180
    {
181
      int rc;
182
 
183
      if (trace)
184
        printf ("\n");
185
 
186
      if (disassemble)
187
        sim_disasm_one ();
188
 
189
      enable_counting = verbose;
190
      rc = decode_opcode ();
191
      enable_counting = 0;
192
 
193
      if (RX_HIT_BREAK (rc))
194
        done (1);
195
      else if (RX_EXITED (rc))
196
        done (RX_EXIT_STATUS (rc));
197
      else if (RX_STOPPED (rc))
198
        {
199
          if (verbose)
200
            printf("Stopped on signal %d\n", RX_STOP_SIG (rc));
201
          exit(1);
202
        }
203
      else
204
        assert (RX_STEPPED (rc));
205
 
206
      trace_register_changes ();
207
    }
208
}

powered by: WebSVN 2.1.0

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