* Makefile.in (SIM_OBJS): Add sim-load.o.
* interp.c: #include bfd.h. (target_byte_order): Delete. (sim_kind, myname, big_endian_p): New static locals. (sim_open): Set sim_kind, myname. Move call to set_endianness to after argument parsing. Recognize -E arg, set endianness accordingly. (sim_load): Return SIM_RC. New arg abfd. Call sim_load_file to load file into simulator. Set PC from bfd. (sim_create_inferior): Return SIM_RC. Delete arg start_address. (set_endianness): Use big_endian_p instead of target_byte_order.
This commit is contained in:
parent
463372706f
commit
9d52bcb7f0
2 changed files with 52 additions and 26 deletions
|
@ -1,3 +1,16 @@
|
||||||
|
Thu Apr 17 03:18:14 1997 Doug Evans <dje@canuck.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in (SIM_OBJS): Add sim-load.o.
|
||||||
|
* interp.c: #include bfd.h.
|
||||||
|
(target_byte_order): Delete.
|
||||||
|
(sim_kind, myname, big_endian_p): New static locals.
|
||||||
|
(sim_open): Set sim_kind, myname. Move call to set_endianness to
|
||||||
|
after argument parsing. Recognize -E arg, set endianness accordingly.
|
||||||
|
(sim_load): Return SIM_RC. New arg abfd. Call sim_load_file to
|
||||||
|
load file into simulator. Set PC from bfd.
|
||||||
|
(sim_create_inferior): Return SIM_RC. Delete arg start_address.
|
||||||
|
(set_endianness): Use big_endian_p instead of target_byte_order.
|
||||||
|
|
||||||
Wed Apr 16 17:55:37 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
Wed Apr 16 17:55:37 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* interp.c (sim_size): Delete prototype - conflicts with
|
* interp.c (sim_size): Delete prototype - conflicts with
|
||||||
|
|
|
@ -62,7 +62,7 @@ code on the hardware.
|
||||||
|
|
||||||
#include "getopt.h"
|
#include "getopt.h"
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
|
#include "bfd.h"
|
||||||
#include "callback.h" /* GDB simulator callback interface */
|
#include "callback.h" /* GDB simulator callback interface */
|
||||||
#include "remote-sim.h" /* GDB simulator interface */
|
#include "remote-sim.h" /* GDB simulator interface */
|
||||||
|
|
||||||
|
@ -86,8 +86,9 @@ char* pr_uword64 PARAMS ((uword64 addr));
|
||||||
#include "engine.c"
|
#include "engine.c"
|
||||||
#undef SIM_MANIFESTS
|
#undef SIM_MANIFESTS
|
||||||
|
|
||||||
/* This variable holds the GDB view of the target endianness: */
|
static SIM_OPEN_KIND sim_kind;
|
||||||
extern int target_byte_order;
|
static char *myname;
|
||||||
|
static int big_endian_p;
|
||||||
|
|
||||||
/* The following reserved instruction value is used when a simulator
|
/* The following reserved instruction value is used when a simulator
|
||||||
trap is required. NOTE: Care must be taken, since this value may be
|
trap is required. NOTE: Care must be taken, since this value may be
|
||||||
|
@ -666,6 +667,9 @@ sim_open (kind,argv)
|
||||||
stdout and stderr are initialised: */
|
stdout and stderr are initialised: */
|
||||||
callback->init(callback);
|
callback->init(callback);
|
||||||
|
|
||||||
|
sim_kind = kind;
|
||||||
|
myname = argv[0];
|
||||||
|
|
||||||
state = 0;
|
state = 0;
|
||||||
CHECKSIM();
|
CHECKSIM();
|
||||||
if (state & simEXCEPTION) {
|
if (state & simEXCEPTION) {
|
||||||
|
@ -679,8 +683,6 @@ sim_open (kind,argv)
|
||||||
state |= simHOSTBE; /* big-endian host */
|
state |= simHOSTBE; /* big-endian host */
|
||||||
}
|
}
|
||||||
|
|
||||||
set_endianness ();
|
|
||||||
|
|
||||||
#if defined(HASFPU)
|
#if defined(HASFPU)
|
||||||
/* Check that the host FPU conforms to IEEE 754-1985 for the SINGLE
|
/* Check that the host FPU conforms to IEEE 754-1985 for the SINGLE
|
||||||
and DOUBLE binary formats. This is a bit nasty, requiring that we
|
and DOUBLE binary formats. This is a bit nasty, requiring that we
|
||||||
|
@ -752,11 +754,15 @@ sim_open (kind,argv)
|
||||||
while (1) {
|
while (1) {
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
|
|
||||||
c = getopt_long(argc,argv,"hn:s:tp",cmdline,&option_index);
|
c = getopt_long(argc,argv,"E:hn:s:tp",cmdline,&option_index);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
case 'E' :
|
||||||
|
big_endian_p = strcmp (optarg, "big") == 0;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
callback->printf_filtered(callback,"Usage:\n\t\
|
callback->printf_filtered(callback,"Usage:\n\t\
|
||||||
target sim [-h] [--log=<file>] [--name=<model>] [--size=<amount>]");
|
target sim [-h] [--log=<file>] [--name=<model>] [--size=<amount>]");
|
||||||
|
@ -871,6 +877,8 @@ Re-compile simulator with \"-DPROFILE\" to enable this option.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_endianness ();
|
||||||
|
|
||||||
/* If the host has "mmap" available we could use it to provide a
|
/* If the host has "mmap" available we could use it to provide a
|
||||||
very large virtual address space for the simulator, since memory
|
very large virtual address space for the simulator, since memory
|
||||||
would only be allocated within the "mmap" space as it is
|
would only be allocated within the "mmap" space as it is
|
||||||
|
@ -1449,40 +1457,45 @@ sim_info (sd,verbose)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
SIM_RC
|
||||||
sim_load (sd,prog,from_tty)
|
sim_load (sd,prog,abfd,from_tty)
|
||||||
SIM_DESC sd;
|
SIM_DESC sd;
|
||||||
char *prog;
|
char *prog;
|
||||||
|
bfd *abfd;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
/* Return non-zero if the caller should handle the load. Zero if
|
extern bfd *sim_load_file (); /* ??? Don't know where this should live. */
|
||||||
we have loaded the image. */
|
bfd *prog_bfd;
|
||||||
return(-1);
|
|
||||||
|
prog_bfd = sim_load_file (sd, myname, callback, prog, abfd,
|
||||||
|
sim_kind == SIM_OPEN_DEBUG);
|
||||||
|
if (prog_bfd == NULL)
|
||||||
|
return SIM_RC_FAIL;
|
||||||
|
#if 1
|
||||||
|
PC = (uword64) bfd_get_start_address (prog_bfd);
|
||||||
|
#else
|
||||||
|
/* TODO: Sort this properly. SIM_ADDR may already be a 64bit value: */
|
||||||
|
PC = SIGNEXTEND(bfd_get_start_address(prog_bfd),32);
|
||||||
|
#endif
|
||||||
|
if (abfd == NULL)
|
||||||
|
bfd_close (prog_bfd);
|
||||||
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
SIM_RC
|
||||||
sim_create_inferior (sd, start_address,argv,env)
|
sim_create_inferior (sd, argv,env)
|
||||||
SIM_DESC sd;
|
SIM_DESC sd;
|
||||||
SIM_ADDR start_address;
|
|
||||||
char **argv;
|
char **argv;
|
||||||
char **env;
|
char **env;
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("DBG: sim_create_inferior entered: start_address = 0x%s\n",pr_addr(start_address));
|
printf("DBG: sim_create_inferior entered: start_address = 0x%s\n",
|
||||||
|
pr_addr(PC));
|
||||||
#endif /* DEBUG */
|
#endif /* DEBUG */
|
||||||
|
|
||||||
/* Prepare to execute the program to be simulated */
|
/* Prepare to execute the program to be simulated */
|
||||||
/* argv and env are NULL terminated lists of pointers */
|
/* argv and env are NULL terminated lists of pointers */
|
||||||
|
|
||||||
#if 1
|
|
||||||
PC = (uword64)start_address;
|
|
||||||
#else
|
|
||||||
/* TODO: Sort this properly. SIM_ADDR may already be a 64bit value: */
|
|
||||||
PC = SIGNEXTEND(start_address,32);
|
|
||||||
#endif
|
|
||||||
/* NOTE: GDB normally sets the PC explicitly. However, this call is
|
|
||||||
used by other clients of the simulator. */
|
|
||||||
|
|
||||||
if (argv || env) {
|
if (argv || env) {
|
||||||
#if 0 /* def DEBUG */
|
#if 0 /* def DEBUG */
|
||||||
callback->printf_filtered(callback,"sim_create_inferior() : passed arguments ignored\n");
|
callback->printf_filtered(callback,"sim_create_inferior() : passed arguments ignored\n");
|
||||||
|
@ -1498,7 +1511,7 @@ sim_create_inferior (sd, start_address,argv,env)
|
||||||
true at the moment. */
|
true at the moment. */
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2350,7 +2363,7 @@ set_endianness ()
|
||||||
within the simulation, since it is possible to change the
|
within the simulation, since it is possible to change the
|
||||||
endianness of user programs. However, we perform the check here
|
endianness of user programs. However, we perform the check here
|
||||||
to ensure that the start-of-day values agree. */
|
to ensure that the start-of-day values agree. */
|
||||||
if (target_byte_order == 4321)
|
if (big_endian_p)
|
||||||
state |= simBE;
|
state |= simBE;
|
||||||
|
|
||||||
/* ??? This is a lot more code than is necessary to solve the problem.
|
/* ??? This is a lot more code than is necessary to solve the problem.
|
||||||
|
|
Loading…
Reference in a new issue