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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [sim/] [ppc/] [sim_calls.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/*  This file is part of the program psim.
2
 
3
    Copyright (C) 1994-1996,1998, Andrew Cagney <cagney@highland.com.au>
4
 
5
    This program is free software; you can redistribute it and/or modify
6
    it under the terms of the GNU General Public License as published by
7
    the Free Software Foundation; either version 2 of the License, or
8
    (at your option) any later version.
9
 
10
    This program is distributed in the hope that it will be useful,
11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
    GNU General Public License for more details.
14
 
15
    You should have received a copy of the GNU General Public License
16
    along with this program; if not, write to the Free Software
17
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
 
19
    */
20
 
21
 
22
#include <signal.h> /* FIXME - should be machine dependant version */
23
#include <stdarg.h>
24
#include <ctype.h>
25
 
26
#include "psim.h"
27
#include "options.h"
28
 
29
#undef printf_filtered /* blow away the mapping */
30
 
31
#ifdef HAVE_STDLIB_H
32
#include <stdlib.h>
33
#endif
34
 
35
#ifdef HAVE_STRING_H
36
#include <string.h>
37
#else
38
#ifdef HAVE_STRINGS_H
39
#include <strings.h>
40
#endif
41
#endif
42
 
43
#include "defs.h"
44
#include "bfd.h"
45
#include "gdb/callback.h"
46
#include "gdb/remote-sim.h"
47
 
48
/* Define the rate at which the simulator should poll the host
49
   for a quit. */
50
#ifndef POLL_QUIT_INTERVAL
51
#define POLL_QUIT_INTERVAL 0x20
52
#endif
53
 
54
static int poll_quit_count = POLL_QUIT_INTERVAL;
55
 
56
/* Structures used by the simulator, for gdb just have static structures */
57
 
58
static psim *simulator;
59
static device *root_device;
60
static host_callback *callbacks;
61
 
62
/* We use GDB's gdbarch_register_name function to map GDB register
63
   numbers onto names, which we can then look up in the register
64
   table.  Since the `set architecture' command can select a new
65
   processor variant at run-time, the meanings of the register numbers
66
   can change, so we need to make sure the sim uses the same
67
   name/number mapping that GDB uses.
68
 
69
   (We don't use the REGISTER_NAME macro, which is a wrapper for
70
   gdbarch_register_name.  We #include GDB's "defs.h", which tries to
71
   #include GDB's "config.h", but gets ours instead, and REGISTER_NAME
72
   ends up not getting defined.  Simpler to just use
73
   gdbarch_register_name directly.)
74
 
75
   We used to just use the REGISTER_NAMES macro from GDB's
76
   target-dependent header files, which expanded into an initializer
77
   for an array of strings.  That was kind of nice, because it meant
78
   that libsim.a had only a compile-time dependency on GDB; using
79
   gdbarch_register_name directly means that there are now link-time
80
   and run-time dependencies too.
81
 
82
   Perhaps the host_callback structure could provide a function for
83
   retrieving register names; that would be cleaner.  */
84
 
85
SIM_DESC
86
sim_open (SIM_OPEN_KIND kind,
87
          host_callback *callback,
88
          struct _bfd *abfd,
89
          char **argv)
90
{
91
  callbacks = callback;
92
 
93
  /* Note: The simulation is not created by sim_open() because
94
     complete information is not yet available */
95
  /* trace the call */
96
  TRACE(trace_gdb, ("sim_open called\n"));
97
 
98
  if (root_device != NULL)
99
    sim_io_printf_filtered("Warning - re-open of simulator leaks memory\n");
100
  root_device = psim_tree();
101
  simulator = NULL;
102
 
103
  psim_options(root_device, argv + 1);
104
 
105
  if (ppc_trace[trace_opts])
106
    print_options ();
107
 
108
  /* fudge our descriptor for now */
109
  return (SIM_DESC) 1;
110
}
111
 
112
 
113
void
114
sim_close (SIM_DESC sd, int quitting)
115
{
116
  TRACE(trace_gdb, ("sim_close(quitting=%d) called\n", quitting));
117
  if (ppc_trace[trace_print_info] && simulator != NULL)
118
    psim_print_info (simulator, ppc_trace[trace_print_info]);
119
}
120
 
121
 
122
SIM_RC
123
sim_load (SIM_DESC sd, char *prog, bfd *abfd, int from_tty)
124
{
125
  TRACE(trace_gdb, ("sim_load(prog=%s, from_tty=%d) called\n",
126
                    prog, from_tty));
127
  ASSERT(prog != NULL);
128
 
129
  /* create the simulator */
130
  TRACE(trace_gdb, ("sim_load() - first time, create the simulator\n"));
131
  simulator = psim_create(prog, root_device);
132
 
133
  /* bring in all the data section */
134
  psim_init(simulator);
135
 
136
  /* get the start address */
137
  if (abfd == NULL)
138
    {
139
      abfd = bfd_openr (prog, 0);
140
      if (abfd == NULL)
141
        error ("psim: can't open \"%s\": %s\n",
142
               prog, bfd_errmsg (bfd_get_error ()));
143
      if (!bfd_check_format (abfd, bfd_object))
144
        {
145
          const char *errmsg = bfd_errmsg (bfd_get_error ());
146
          bfd_close (abfd);
147
          error ("psim: \"%s\" is not an object file: %s\n",
148
                 prog, errmsg);
149
        }
150
      bfd_close (abfd);
151
    }
152
 
153
  return SIM_RC_OK;
154
}
155
 
156
 
157
int
158
sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
159
{
160
  int result = psim_read_memory(simulator, MAX_NR_PROCESSORS,
161
                                buf, mem, length);
162
  TRACE(trace_gdb, ("sim_read(mem=0x%lx, buf=0x%lx, length=%d) = %d\n",
163
                    (long)mem, (long)buf, length, result));
164
  return result;
165
}
166
 
167
 
168
int
169
sim_write (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
170
{
171
  int result = psim_write_memory(simulator, MAX_NR_PROCESSORS,
172
                                 buf, mem, length,
173
                                 1/*violate_ro*/);
174
  TRACE(trace_gdb, ("sim_write(mem=0x%lx, buf=0x%lx, length=%d) = %d\n",
175
                    (long)mem, (long)buf, length, result));
176
  return result;
177
}
178
 
179
 
180
int
181
sim_fetch_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
182
{
183
  char *regname;
184
 
185
  if (simulator == NULL) {
186
    return 0;
187
  }
188
 
189
  /* GDB will sometimes ask for the contents of a register named "";
190
     we ignore such requests, and leave garbage in *BUF.  In GDB
191
     terms, the empty string means "the register with this number is
192
     not present in the currently selected architecture variant."
193
     That's following the kludge we're using for the MIPS processors.
194
     But there are loops that just walk through the entire list of
195
     names and try to get everything.  */
196
  regname = gdbarch_register_name (current_gdbarch, regno);
197
  /* FIXME: ezannoni 2002/04/15 Remove the 'vr' and 'vscr' check
198
     once AltiVec support is committed.  */
199
  if (! regname || regname[0] == '\0'
200
      || (regname[0] == 'v' && regname[1] == 'r')
201
      || (strcmp (regname, "vscr") == 0))
202
    return -1;
203
 
204
  TRACE(trace_gdb, ("sim_fetch_register(regno=%d(%s), buf=0x%lx)\n",
205
                    regno, regname, (long)buf));
206
  psim_read_register(simulator, MAX_NR_PROCESSORS,
207
                     buf, regname, raw_transfer);
208
  return -1;
209
}
210
 
211
 
212
int
213
sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
214
{
215
  char *regname;
216
 
217
  if (simulator == NULL)
218
    return 0;
219
 
220
  /* See comments in sim_fetch_register, above.  */
221
  regname = gdbarch_register_name (current_gdbarch, regno);
222
  /* FIXME: ezannoni 2002/04/15 Remove the 'vr' and 'vscr' check
223
     once AltiVec support is committed.  */
224
  if (! regname || regname[0] == '\0'
225
      || (regname[0] == 'v' && regname[1] == 'r')
226
      || (strcmp (regname, "vscr") == 0))
227
    return -1;
228
 
229
  TRACE(trace_gdb, ("sim_store_register(regno=%d(%s), buf=0x%lx)\n",
230
                    regno, regname, (long)buf));
231
  psim_write_register(simulator, MAX_NR_PROCESSORS,
232
                      buf, regname, raw_transfer);
233
  return -1;
234
}
235
 
236
 
237
void
238
sim_info (SIM_DESC sd, int verbose)
239
{
240
  TRACE(trace_gdb, ("sim_info(verbose=%d) called\n", verbose));
241
  psim_print_info (simulator, verbose);
242
}
243
 
244
 
245
SIM_RC
246
sim_create_inferior (SIM_DESC sd,
247
                     struct _bfd *abfd,
248
                     char **argv,
249
                     char **envp)
250
{
251
  unsigned_word entry_point;
252
  TRACE(trace_gdb, ("sim_create_inferior(start_address=0x%x, ...)\n",
253
                    entry_point));
254
 
255
  if (simulator == NULL)
256
    error ("No program loaded");
257
 
258
  if (abfd != NULL)
259
    entry_point = bfd_get_start_address (abfd);
260
  else
261
    entry_point = 0xfff00000; /* ??? */
262
 
263
  psim_init(simulator);
264
  psim_stack(simulator, argv, envp);
265
 
266
  psim_write_register(simulator, -1 /* all start at same PC */,
267
                      &entry_point, "pc", cooked_transfer);
268
  return SIM_RC_OK;
269
}
270
 
271
 
272
void
273
sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc)
274
{
275
  psim_status status = psim_get_status(simulator);
276
 
277
  switch (status.reason) {
278
  case was_continuing:
279
    *reason = sim_stopped;
280
    if (status.signal == 0)
281
      *sigrc = SIGTRAP;
282
    else
283
      *sigrc = status.signal;
284
    break;
285
  case was_trap:
286
    *reason = sim_stopped;
287
    *sigrc = SIGTRAP;
288
    break;
289
  case was_exited:
290
    *reason = sim_exited;
291
    *sigrc = status.signal;
292
    break;
293
  case was_signalled:
294
    *reason = sim_signalled;
295
    *sigrc = status.signal;
296
    break;
297
  }
298
 
299
  TRACE(trace_gdb, ("sim_stop_reason(reason=0x%lx(%ld), sigrc=0x%lx(%ld))\n",
300
                    (long)reason, (long)*reason, (long)sigrc, (long)*sigrc));
301
}
302
 
303
 
304
 
305
/* Run (or resume) the program.  */
306
 
307
int
308
sim_stop (SIM_DESC sd)
309
{
310
  psim_stop (simulator);
311
  return 1;
312
}
313
 
314
void
315
sim_resume (SIM_DESC sd, int step, int siggnal)
316
{
317
  TRACE(trace_gdb, ("sim_resume(step=%d, siggnal=%d)\n",
318
                    step, siggnal));
319
 
320
  if (step)
321
    {
322
      psim_step (simulator);
323
    }
324
  else
325
    {
326
      psim_run (simulator);
327
    }
328
}
329
 
330
void
331
sim_do_command (SIM_DESC sd, char *cmd)
332
{
333
  TRACE(trace_gdb, ("sim_do_commands(cmd=%s) called\n",
334
                    cmd ? cmd : "(null)"));
335
  if (cmd != NULL) {
336
    char **argv = buildargv(cmd);
337
    psim_command(root_device, argv);
338
    freeargv(argv);
339
  }
340
}
341
 
342
 
343
/* Polling, if required */
344
 
345
void
346
sim_io_poll_quit (void)
347
{
348
  if (callbacks->poll_quit != NULL && poll_quit_count-- < 0)
349
    {
350
      poll_quit_count = POLL_QUIT_INTERVAL;
351
      if (callbacks->poll_quit (callbacks))
352
        psim_stop (simulator);
353
    }
354
}
355
 
356
 
357
 
358
/* Map simulator IO operations onto the corresponding GDB I/O
359
   functions.
360
 
361
   NB: Only a limited subset of operations are mapped across.  More
362
   advanced operations (such as dup or write) must either be mapped to
363
   one of the below calls or handled internally */
364
 
365
int
366
sim_io_read_stdin(char *buf,
367
                  int sizeof_buf)
368
{
369
  switch (CURRENT_STDIO) {
370
  case DO_USE_STDIO:
371
    return callbacks->read_stdin(callbacks, buf, sizeof_buf);
372
    break;
373
  case DONT_USE_STDIO:
374
    return callbacks->read(callbacks, 0, buf, sizeof_buf);
375
    break;
376
  default:
377
    error("sim_io_read_stdin: unaccounted switch\n");
378
    break;
379
  }
380
  return 0;
381
}
382
 
383
int
384
sim_io_write_stdout(const char *buf,
385
                    int sizeof_buf)
386
{
387
  switch (CURRENT_STDIO) {
388
  case DO_USE_STDIO:
389
    return callbacks->write_stdout(callbacks, buf, sizeof_buf);
390
    break;
391
  case DONT_USE_STDIO:
392
    return callbacks->write(callbacks, 1, buf, sizeof_buf);
393
    break;
394
  default:
395
    error("sim_io_write_stdout: unaccounted switch\n");
396
    break;
397
  }
398
  return 0;
399
}
400
 
401
int
402
sim_io_write_stderr(const char *buf,
403
                    int sizeof_buf)
404
{
405
  switch (CURRENT_STDIO) {
406
  case DO_USE_STDIO:
407
    /* NB: I think there should be an explicit write_stderr callback */
408
    return callbacks->write(callbacks, 3, buf, sizeof_buf);
409
    break;
410
  case DONT_USE_STDIO:
411
    return callbacks->write(callbacks, 3, buf, sizeof_buf);
412
    break;
413
  default:
414
    error("sim_io_write_stderr: unaccounted switch\n");
415
    break;
416
  }
417
  return 0;
418
}
419
 
420
 
421
void
422
sim_io_printf_filtered(const char *fmt,
423
                       ...)
424
{
425
  char message[1024];
426
  va_list ap;
427
  /* format the message */
428
  va_start(ap, fmt);
429
  vsprintf(message, fmt, ap);
430
  va_end(ap);
431
  /* sanity check */
432
  if (strlen(message) >= sizeof(message))
433
    error("sim_io_printf_filtered: buffer overflow\n");
434
  callbacks->printf_filtered(callbacks, "%s", message);
435
}
436
 
437
void
438
sim_io_flush_stdoutput(void)
439
{
440
  switch (CURRENT_STDIO) {
441
  case DO_USE_STDIO:
442
    callbacks->flush_stdout (callbacks);
443
    break;
444
  case DONT_USE_STDIO:
445
    break;
446
  default:
447
    error("sim_io_read_stdin: unaccounted switch\n");
448
    break;
449
  }
450
}
451
 
452
void
453
sim_io_error (SIM_DESC sd, const char *fmt, ...)
454
{
455
  va_list ap;
456
  va_start(ap, fmt);
457
  callbacks->evprintf_filtered (callbacks, fmt, ap);
458
  va_end(ap);
459
  callbacks->error (callbacks, "");
460
}
461
 
462
/****/
463
 
464
void *
465
zalloc(long size)
466
{
467
  void *memory = (void*)xmalloc(size);
468
  if (memory == NULL)
469
    error("xmalloc failed\n");
470
  memset(memory, 0, size);
471
  return memory;
472
}
473
 
474
void zfree(void *data)
475
{
476
  free(data);
477
}

powered by: WebSVN 2.1.0

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