Add ABFD argument to sim_open call. Pass through to sim_config so

that image properties such as endianness can be checked.

More strongly document the expected behavour of each of the sim_*
interfaces.

Add default endian argument to simulator config macro
SIM_AC_OPTION_ENDIAN.  Use in sim_config.
This commit is contained in:
Andrew Cagney
1997-08-25 23:14:25 +00:00
parent 04f295b648
commit 247fccdeb5
41 changed files with 3429 additions and 518 deletions

View File

@@ -1,8 +1,40 @@
Mon Aug 25 17:50:22 1997 Andrew Cagney <cagney@b1.cygnus.com>
* configure: Regenerated to track ../common/aclocal.m4 changes.
* config.in: Ditto.
Mon Aug 25 12:11:06 1997 Andrew Cagney <cagney@b1.cygnus.com>
* aclocal.m4 (sim-endian): Add second argument to
SIM_AC_OPTION_ENDIAN. First is hardwired endian, second is
default endian when not hardwired.
* sim-config.h (WITH_DEFAULT_TARGET_BYTE_ORDER): New macro, if all
else failes value for target byte order.
* sim-config.c (sim_config): Add abfd arguments. Set
STATE_PROG_BFD accordingly. Determine prefered_target_byte_order
from same.
(sim_config): Return SIM_RC, don't abort.
(bfd.h): Include.
* run.c (main): Update call to sim_open - add ABFD argument.
* nrun.c (main): Add NULL ABFD argument.
Thu Aug 14 12:48:57 1997 Doug Evans <dje@canuck.cygnus.com>
* callback.c (os_poll_quit): Make static.
Call sim_cb_eprintf, not p->eprintf.
(sim_cb_printf, sim_cb_eprintf): New functions.
* sim-utils.h (sim_cb_printf, sim_cb_eprintf): Declare.
* sim-basics.h (zalloc,zfree,sim_add_commas,SIM_ELAPSED_TIME,
sim_elapsed_time_get,sim_elapsed_time_since): Move decls to
sim-utils.h. #include sim-utils.h.
* sim-utils.h: Above decls moved here.
(sim_analyze_program,sim_load_file): Use `struct _bfd', not `bfd'.
* sim-watch.c (action_watchpoint): Fix thinkos.
Thu Jul 24 08:48:05 1997 Stu Grossman (grossman@critters.cygnus.com)

110
sim/common/aclocal.m4 vendored
View File

@@ -118,13 +118,27 @@ AC_SUBST(sim_stdio)
dnl --enable-sim-trace is for users of the simulator
dnl the allowable values are work-in-progress
dnl The argument is either a bitmask of things to enable [exactly what is
dnl up to the simulator], or is a comma separated list of names of tracing
dnl elements to enable. The latter is only supported on simulators that
dnl use WITH_TRACE.
AC_ARG_ENABLE(sim-trace,
[ --enable-sim-trace=opts Enable tracing flags],
[case "${enableval}" in
yes) sim_trace="-DTRACE=1 -DWITH_TRACE=1";;
yes) sim_trace="-DTRACE=1 -DWITH_TRACE=-1";;
no) sim_trace="-DTRACE=0 -DWITH_TRACE=0";;
*) sim_trace="-DTRACE='(${enableval})' -DWITH_TRACE='(${enableval})'";;
[[-0-9]]*)
sim_trace="-DTRACE='(${enableval})' -DWITH_TRACE='(${enableval})'";;
[[a-z]]*)
sim_trace=""
for x in `echo "$enableval" | sed -e "s/,/ /g"`; do
if test x"$sim_trace" = x; then
sim_trace="-DWITH_TRACE='(TRACE_$x"
else
sim_trace="${sim_trace}|TRACE_$x"
fi
done
sim_trace="$sim_trace)'" ;;
esac
if test x"$silent" != x"yes" && test x"$sim_trace" != x""; then
echo "Setting sim trace = $sim_trace" 6>&1
@@ -132,6 +146,35 @@ fi],[sim_trace=""])dnl
AC_SUBST(sim_trace)
dnl --enable-sim-profile
dnl The argument is either a bitmask of things to enable [exactly what is
dnl up to the simulator], or is a comma separated list of names of profiling
dnl elements to enable. The latter is only supported on simulators that
dnl use WITH_PROFILE.
AC_ARG_ENABLE(sim-profile,
[ --enable-sim-profile=opts Enable profiling flags],
[case "${enableval}" in
yes) sim_profile="-DPROFILE=1 -DWITH_PROFILE=-1";;
no) sim_profile="-DPROFILE=0 -DWITH_PROFILE=0";;
[[-0-9]]*)
sim_profile="-DPROFILE='(${enableval})' -DWITH_PROFILE='(${enableval})'";;
[[a-z]]*)
sim_profile=""
for x in `echo "$enableval" | sed -e "s/,/ /g"`; do
if test x"$sim_profile" = x; then
sim_profile="-DWITH_PROFILE='(PROFILE_$x"
else
sim_profile="${sim_profile}|PROFILE_$x"
fi
done
sim_profile="$sim_profile)'" ;;
esac
if test x"$silent" != x"yes" && test x"$sim_profile" != x""; then
echo "Setting sim profile = $sim_profile" 6>&1
fi],[sim_profile=""])dnl
AC_SUBST(sim_profile)
dnl Types used by common code
AC_TYPE_SIGNAL
@@ -205,20 +248,30 @@ AC_SUBST(sim_assert)
dnl --enable-sim-endian={yes,no,big,little} is for simulators
dnl that support both big and little endian targets.
dnl arg[1] is hardwired target endianness.
dnl arg[2] is default target endianness.
AC_DEFUN(SIM_AC_OPTION_ENDIAN,
[
default_sim_endian="ifelse([$1],,,-DWITH_TARGET_BYTE_ORDER=[$1])"
wire_endian="ifelse([$1],,ifelse([$2],,,[$2]),[$1])"
default_endian="ifelse([$2],,ifelse([$1],,,[$1]),[$2])"
default_sim_endian="ifelse([$1],,ifelse([$2],,,-DWITH_DEFAULT_TARGET_BYTE_ORDER=[$2]),-DWITH_TARGET_BYTE_ORDER=[$1])"
AC_ARG_ENABLE(sim-endian,
[ --enable-sim-endian=endian Specify target byte endian orientation.],
[case "${enableval}" in
yes) case "$target" in
*powerpc-*) sim_endian="-DWITH_TARGET_BYTE_ORDER=BIG_ENDIAN";;
*powerpcle-*) sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN";;
*) echo "Unknown target $target" 1>&6; sim_endian="-DWITH_TARGET_BYTE_ORDER=0";;
esac;;
no) sim_endian="-DWITH_TARGET_BYTE_ORDER=0";;
b*|B*) sim_endian="-DWITH_TARGET_BYTE_ORDER=BIG_ENDIAN";;
l*|L*) sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN";;
yes) if test x"$wire_endian" != x; then
sim_endian="-DWITH_TARGET_BYTE_ORDER=${wire_endian}"
else
echo "No hard-wired endian for target $target" 1>&6
sim_endian="-DWITH_TARGET_BYTE_ORDER=0"
fi;;
no) if test x"$default_endian" != x; then
sim_endian="-DWITH_DEFAULT_TARGET_BYTE_ORDER=${default_endian}"
else
echo "No default endian for target $target" 1>&6
sim_endian="-DWITH_DEFAULT_TARGET_BYTE_ORDER=0"
fi;;
*) AC_MSG_ERROR("Unknown value $enableval for --enable-sim-endian"); sim_endian="";;
esac
if test x"$silent" != x"yes" && test x"$sim_endian" != x""; then
@@ -275,6 +328,43 @@ AC_SUBST(sim_float)
])
dnl The argument is the default cache size if none is specified.
AC_DEFUN(SIM_AC_OPTION_SCACHE,
[
default_sim_scache="ifelse([$1],,0,[$1])"
AC_ARG_ENABLE(sim-scache,
[ --enable-sim-scache=size Specify simulator execution cache size.],
[case "${enableval}" in
yes) sim_scache="-DWITH_SCACHE=${default_sim_scache}";;
no) sim_scace= ;;
[[0-9]]*) sim_cache=${enableval};;
*) AC_MSG_ERROR("Bad value $enableval passed to --enable-sim-scache");
sim_scache="";;
esac
if test x"$silent" != x"yes" && test x"$sim_scache" != x""; then
echo "Setting scache size = $sim_scache" 6>&1
fi],[sim_scache="-DWITH_SCACHE=${default_sim_scache}"])
AC_SUBST(sim_scache)
])
dnl The argument is the default model if none is specified.
AC_DEFUN(SIM_AC_OPTION_DEFAULT_MODEL,
[
default_sim_default_model="ifelse([$1],,0,[$1])"
AC_ARG_ENABLE(sim-default-model,
[ --enable-sim-default-model=model Specify default model to simulate.],
[case "${enableval}" in
yes|no) AC_MSG_ERROR("Missing argument to --enable-sim-default-model");;
*) sim_default_model="-DWITH_DEFAULT_MODEL='\"${enableval}\"'";;
esac
if test x"$silent" != x"yes" && test x"$sim_default_model" != x""; then
echo "Setting default model = $sim_default_model" 6>&1
fi],[sim_default_model="-DWITH_DEFAULT_MODEL='\"${default_sim_default_model}\"'"])
AC_SUBST(sim_default_model)
])
AC_DEFUN(SIM_AC_OPTION_HARDWARE,
[
AC_ARG_ENABLE(sim-hardware,

View File

@@ -15,40 +15,54 @@ You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <signal.h>
#include "sim-main.h"
#ifdef HAVE_ENVIRON
extern char **environ;
#endif
static void usage PARAMS ((void));
static void usage (void);
extern host_callback default_callback;
static char *myname;
static SIM_DESC sd;
static RETSIGTYPE
cntrl_c (int sig)
{
if (! sim_stop (sd))
{
fprintf (stderr, "Quit!\n");
exit (1);
}
}
int
main (argc, argv)
int argc;
char **argv;
main (int argc, char **argv)
{
char *name;
char **prog_argv = NULL;
enum sim_stop reason;
int sigrc;
SIM_DESC sd;
RETSIGTYPE (*prev_sigint) ();
myname = argv[0] + strlen (argv[0]);
while (myname > argv[0] && myname[-1] != '/')
--myname;
sim_set_callbacks (NULL, &default_callback);
default_callback.init (&default_callback);
/* Create an instance of the simulator. */
sd = sim_open (SIM_OPEN_STANDALONE, argv);
default_callback.init (&default_callback);
sd = sim_open (SIM_OPEN_STANDALONE, &default_callback, NULL, argv);
if (sd == 0)
exit (1);
if (STATE_MAGIC (sd) != SIM_MAGIC_NUMBER)
{
fprintf (stderr, "Internal error - bad magic number in simulator struct\n");
abort ();
}
/* Was there a program to run? */
prog_argv = STATE_PROG_ARGV (sd);
@@ -72,7 +86,9 @@ main (argc, argv)
#endif
/* Run the program. */
prev_sigint = signal (SIGINT, cntrl_c);
sim_resume (sd, 0, 0);
signal (SIGINT, prev_sigint);
/* Print any stats the simulator collected. */
sim_info (sd, 0);
@@ -104,6 +120,11 @@ main (argc, argv)
case sim_exited:
break;
default:
fprintf (stderr, "program in undefined state (%d:%d)\n", reason, sigrc);
break;
}
#endif

View File

@@ -58,7 +58,6 @@ static char *myname;
/* NOTE: sim_size() and sim_trace() are going away */
extern void sim_size PARAMS ((int i));
extern int sim_trace PARAMS ((SIM_DESC sd));
extern int getopt ();
@@ -104,6 +103,12 @@ main (ac, av)
no_args[2] = "set-later";
#endif
/* FIXME: This is currently being migrated into sim_open.
Simulators that use functions such as sim_size() still require
this. */
default_callback.init (&default_callback);
sim_set_callbacks (&default_callback);
/* FIXME: This is currently being rewritten to have each simulator
do all argv processing. */
@@ -212,8 +217,7 @@ main (ac, av)
/* Ensure that any run-time initialisation that needs to be
performed by the simulator can occur. */
default_callback.init (&default_callback);
sd = sim_open (SIM_OPEN_STANDALONE, &default_callback, sim_argv);
sd = sim_open (SIM_OPEN_STANDALONE, &default_callback, abfd, sim_argv);
if (sd == 0)
exit (1);

View File

@@ -19,7 +19,8 @@
*/
#include "sim-state.h"
#include "sim-main.h"
#include "bfd.h"
int current_host_byte_order;
@@ -31,7 +32,7 @@ int current_environment;
#endif
#if defined (WITH_ALIGNMENT)
int current_alignment;
enum sim_alignments current_alignment;
#endif
#if defined (WITH_FLOATING_POINT)
@@ -94,22 +95,22 @@ config_environment_to_a (int environment)
#endif
#if defined (WITH_ALIGNMENT)
static const char *
config_alignment_to_a (int alignment)
{
switch (alignment)
{
case MIXED_ALIGNMENT:
return "MIXED_ALIGNMENT";
case NONSTRICT_ALIGNMENT:
return "NONSTRICT_ALIGNMENT";
case STRICT_ALIGNMENT:
return "STRICT_ALIGNMENT";
case 0:
return "0";
case FORCED_ALIGNMENT:
return "FORCED_ALIGNMENT";
}
return "UNKNOWN";
}
#endif
#if defined (WITH_FLOATING_POINT)
@@ -130,10 +131,48 @@ config_floating_point_to_a (int floating_point)
#endif
void
SIM_RC
sim_config (SIM_DESC sd,
int prefered_target_byte_order)
struct _bfd *abfd)
{
int prefered_target_byte_order;
/* clone the bfd struct (or open prog_name directly) */
{
const char *prog_name;
if (STATE_PROG_ARGV (sd) == NULL)
{
if (abfd != NULL)
prog_name = bfd_get_filename (abfd);
else
prog_name = NULL;
}
else
prog_name = *STATE_PROG_ARGV (sd);
if (prog_name != NULL)
{
abfd = bfd_openr (prog_name, 0);
if (abfd == NULL)
{
sim_io_eprintf (sd, "%s: can't open \"%s\": %s\n",
STATE_MY_NAME (sd),
prog_name,
bfd_errmsg (bfd_get_error ()));
return SIM_RC_FAIL;
}
STATE_PROG_BFD (sd) = abfd;
}
else
STATE_PROG_BFD (sd) = NULL;
}
/* extract all relevant information */
if (abfd == NULL)
prefered_target_byte_order = 0;
else
prefered_target_byte_order = (bfd_little_endian(abfd)
? LITTLE_ENDIAN
: BIG_ENDIAN);
/* set the host byte order */
current_host_byte_order = 1;
@@ -144,16 +183,19 @@ sim_config (SIM_DESC sd,
/* verify the host byte order */
if (CURRENT_HOST_BYTE_ORDER != current_host_byte_order)
sim_io_error (sd, "host (%s) and configured (%s) byte order in conflict",
config_byte_order_to_a (current_host_byte_order),
config_byte_order_to_a (CURRENT_HOST_BYTE_ORDER));
{
sim_io_eprintf (sd, "host (%s) and configured (%s) byte order in conflict",
config_byte_order_to_a (current_host_byte_order),
config_byte_order_to_a (CURRENT_HOST_BYTE_ORDER));
return SIM_RC_FAIL;
}
/* set the target byte order */
#if (WITH_DEVICES)
if (current_target_byte_order == 0)
current_target_byte_order
= (tree_find_boolean_property(root, "/options/little-endian?")
= (tree_find_boolean_property (root, "/options/little-endian?")
? LITTLE_ENDIAN
: BIG_ENDIAN);
#endif
@@ -162,17 +204,22 @@ sim_config (SIM_DESC sd,
current_target_byte_order = prefered_target_byte_order;
if (current_target_byte_order == 0)
current_target_byte_order = WITH_TARGET_BYTE_ORDER;
if (current_target_byte_order == 0)
current_target_byte_order = WITH_DEFAULT_TARGET_BYTE_ORDER;
/* verify the target byte order */
if (CURRENT_TARGET_BYTE_ORDER == 0)
sim_io_error (sd, "target byte order unspecified");
{
sim_io_eprintf (sd, "target byte order unspecified");
return SIM_RC_FAIL;
}
if (CURRENT_TARGET_BYTE_ORDER != current_target_byte_order)
sim_io_error (sd, "target (%s) and configured (%s) byte order in conflict",
sim_io_eprintf (sd, "target (%s) and configured (%s) byte order in conflict",
config_byte_order_to_a (current_target_byte_order),
config_byte_order_to_a (CURRENT_TARGET_BYTE_ORDER));
if (prefered_target_byte_order != 0
&& CURRENT_TARGET_BYTE_ORDER != prefered_target_byte_order)
sim_io_error (sd, "target (%s) and specified (%s) byte order in conflict",
sim_io_eprintf (sd, "target (%s) and specified (%s) byte order in conflict",
config_byte_order_to_a (CURRENT_TARGET_BYTE_ORDER),
config_byte_order_to_a (prefered_target_byte_order));
@@ -185,15 +232,31 @@ sim_config (SIM_DESC sd,
/* verify the stdio */
if (CURRENT_STDIO == 0)
sim_io_error (sd, "target standard IO unspecified");
{
sim_io_eprintf (sd, "target standard IO unspecified");
return SIM_RC_FAIL;
}
if (CURRENT_STDIO != current_stdio)
sim_io_error (sd, "target (%s) and configured (%s) standard IO in conflict",
config_stdio_to_a (CURRENT_STDIO),
config_stdio_to_a (current_stdio));
{
sim_io_eprintf (sd, "target (%s) and configured (%s) standard IO in conflict",
config_stdio_to_a (CURRENT_STDIO),
config_stdio_to_a (current_stdio));
return SIM_RC_FAIL;
}
/* check the value of MSB */
if (WITH_TARGET_WORD_MSB != 0
&& WITH_TARGET_WORD_MSB != (WITH_TARGET_WORD_BITSIZE - 1))
{
sim_io_eprintf (sd, "target bitsize (%d) contradicts target most significant bit (%d)",
WITH_TARGET_WORD_BITSIZE, WITH_TARGET_WORD_MSB);
return SIM_RC_FAIL;
}
#if defined (WITH_ENVIRONMENT)
/* set the environment */
#if (WITH_DEVICES)
if (current_environment == 0)
@@ -214,19 +277,25 @@ sim_config (SIM_DESC sd,
#endif
if (current_environment == 0)
current_environment = WITH_ENVIRONMENT;
/* verify the environment */
if (CURRENT_ENVIRONMENT == 0)
sim_io_error (sd, "target environment unspecified");
{
sim_io_eprintf (sd, "target environment unspecified");
return SIM_RC_FAIL;
}
if (CURRENT_ENVIRONMENT != current_environment)
sim_io_error (sd, "target (%s) and configured (%s) environment in conflict",
config_environment_to_a (CURRENT_ENVIRONMENT),
config_environment_to_a (current_environment));
{
sim_io_eprintf (sd, "target (%s) and configured (%s) environment in conflict",
config_environment_to_a (CURRENT_ENVIRONMENT),
config_environment_to_a (current_environment));
return SIM_RC_FAIL;
}
#endif
#if defined (WITH_ALIGNMENT)
/* set the alignment */
#if defined (WITH_DEVICES)
if (current_alignment == 0)
@@ -237,34 +306,45 @@ sim_config (SIM_DESC sd,
#endif
if (current_alignment == 0)
current_alignment = WITH_ALIGNMENT;
/* verify the alignment */
if (CURRENT_ALIGNMENT == 0)
sim_io_error (sd, "target alignment unspecified");
{
sim_io_eprintf (sd, "target alignment unspecified");
return SIM_RC_FAIL;
}
if (CURRENT_ALIGNMENT != current_alignment)
sim_io_error (sd, "target (%s) and configured (%s) alignment in conflict",
config_alignment_to_a (CURRENT_ALIGNMENT),
config_alignment_to_a (current_alignment));
{
sim_io_eprintf (sd, "target (%s) and configured (%s) alignment in conflict",
config_alignment_to_a (CURRENT_ALIGNMENT),
config_alignment_to_a (current_alignment));
return SIM_RC_FAIL;
}
#endif
#if defined (WITH_FLOAING_POINT)
/* set the floating point */
if (current_floating_point == 0)
current_floating_point = WITH_FLOATING_POINT;
/* verify the floating point */
if (CURRENT_FLOATING_POINT == 0)
sim_io_error (sd, "target floating-point unspecified");
{
sim_io_eprintf (sd, "target floating-point unspecified");
return SIM_RC_FAIL;
}
if (CURRENT_FLOATING_POINT != current_floating_point)
sim_io_error (sd, "target (%s) and configured (%s) floating-point in conflict",
config_alignment_to_a (CURRENT_FLOATING_POINT),
config_alignment_to_a (current_floating_point));
{
sim_io_eprintf (sd, "target (%s) and configured (%s) floating-point in conflict",
config_alignment_to_a (CURRENT_FLOATING_POINT),
config_alignment_to_a (current_floating_point));
return SIM_RC_FAIL;
}
#endif
return SIM_RC_OK;
}
@@ -278,15 +358,24 @@ print_sim_config (SIM_DESC sd)
sim_io_printf (sd, "Compiled on %s %s\n", __DATE__, __TIME__);
#endif
sim_io_printf (sd, "WITH_TARGET_BYTE_ORDER = %s\n",
sim_io_printf (sd, "WITH_TARGET_BYTE_ORDER = %s\n",
config_byte_order_to_a (WITH_TARGET_BYTE_ORDER));
sim_io_printf (sd, "WITH_HOST_BYTE_ORDER = %s\n",
sim_io_printf (sd, "WITH_DEFAULT_TARGET_BYTE_ORDER = %s\n",
config_byte_order_to_a (WITH_DEFAULT_TARGET_BYTE_ORDER));
sim_io_printf (sd, "WITH_HOST_BYTE_ORDER = %s\n",
config_byte_order_to_a (WITH_HOST_BYTE_ORDER));
sim_io_printf (sd, "WITH_STDIO = %s\n",
sim_io_printf (sd, "WITH_STDIO = %s\n",
config_stdio_to_a (WITH_STDIO));
sim_io_printf (sd, "WITH_TARGET_WORD_BITSIZE = %d\n",
WITH_TARGET_WORD_BITSIZE);
sim_io_printf (sd, "WITH_TARGET_WORD_MSB = %d\n",
WITH_TARGET_WORD_MSB);
#if defined (WITH_XOR_ENDIAN)
sim_io_printf (sd, "WITH_XOR_ENDIAN = %d\n", WITH_XOR_ENDIAN);
#endif

View File

@@ -222,6 +222,10 @@
#define WITH_TARGET_BYTE_ORDER 0 /*unknown*/
#endif
#ifndef WITH_DEFAULT_TARGET_BYTE_ORDER
#define WITH_DEFAULT_TARGET_BYTE_ORDER 0 /* fatal */
#endif
extern int current_host_byte_order;
#define CURRENT_HOST_BYTE_ORDER (WITH_HOST_BYTE_ORDER \
? WITH_HOST_BYTE_ORDER \
@@ -235,12 +239,16 @@ extern int current_target_byte_order;
/* XOR endian.
In addition to the above, the simulator can support the's horrible
XOR endian mode (for instance implemented by the PowerPC). This
feature makes it possible to control the endian mode of a processor
using the MSR. */
In addition to the above, the simulator can support the horrible
XOR endian mode (as found in the PowerPC and MIPS ISA). See
sim-core for more information.
/* #define WITH_XOR_ENDIAN 8 */
If WITH_XOR_ENDIAN is non-zero, it specifies the number of bytes
potentially involved in the XOR munge. A typical value is 8. */
#ifndef WITH_XOR_ENDIAN
#define WITH_XOR_ENDIAN 0
#endif
@@ -258,23 +266,20 @@ extern int current_target_byte_order;
Sets a limit on the number of processors that can be simulated. If
WITH_SMP is set to zero (0), the simulator is restricted to
suporting only on processor (and as a consequence leaves the SMP
suporting only one processor (and as a consequence leaves the SMP
code out of the build process).
The actual number of processors is taken from the device
/options/smp@<nr-cpu> */
#if defined (WITH_SMP)
#if WITH_SMP
#if defined (WITH_SMP) && WITH_SMP > 0
#define MAX_NR_PROCESSORS WITH_SMP
#else
#endif
#ifndef MAX_NR_PROCESSORS
#define MAX_NR_PROCESSORS 1
#endif
#endif
/* Word size of host/target:
@@ -369,29 +374,35 @@ extern int current_environment;
/* Alignment:
The PowerPC may or may not handle miss aligned transfers. An
implementation normally handles miss aligned transfers in big
endian mode but generates an exception in little endian mode.
A processor architecture may or may not handle miss aligned
transfers.
This model. Instead allows both little and big endian modes to
either take exceptions or handle miss aligned transfers.
As alternatives: both little and big endian modes take an exception
(STRICT_ALIGNMENT); big and little endian models handle mis aligned
transfers (NONSTRICT_ALIGNMENT); or the address is forced into
alignment using a mask (FORCED_ALIGNMENT).
If 0 is specified then for big-endian mode miss alligned accesses
are permitted (NONSTRICT_ALIGNMENT) while in little-endian mode the
processor will fault on them (STRICT_ALIGNMENT). */
Mixed alignment should be specified when the simulator needs to be
able to change the alignment requirements on the fly (eg for
bi-endian support). */
#if defined (WITH_ALIGNMENT)
enum sim_alignments {
MIXED_ALIGNMENT,
NONSTRICT_ALIGNMENT,
STRICT_ALIGNMENT,
FORCED_ALIGNMENT,
};
#define NONSTRICT_ALIGNMENT 1
#define STRICT_ALIGNMENT 2
extern enum sim_alignments current_alignment;
#if !defined (WITH_ALIGNMENT)
#define WITH_ALIGNMENT NONSTRICT_ALIGNMENT
#endif
extern int current_alignment;
#define CURRENT_ALIGNMENT (WITH_ALIGNMENT \
? WITH_ALIGNMENT \
: current_alignment)
#endif
/* Floating point suport:
@@ -414,6 +425,18 @@ extern int current_floating_point;
/* Engine module.
Use the common start/stop/restart framework (sim-engine).
Simulators using the other modules but not the engine should define
WITH_ENGINE=0. */
#ifndef WITH_ENGINE
#define WITH_ENGINE 1
#endif
/* Debugging:
Control the inclusion of debugging code.
@@ -428,7 +451,14 @@ extern int current_floating_point;
code */
#ifndef WITH_TRACE
#define WITH_TRACE 1
#define WITH_TRACE (-1)
#endif
/* Include the profiling code. Disabling this eliminates all profiling
code. */
#ifndef WITH_PROFILE
#define WITH_PROFILE (-1)
#endif
@@ -515,26 +545,10 @@ extern int current_stdio;
/* complete/verify/print the simulator configuration */
extern SIM_RC sim_config
(SIM_DESC sd,
struct _bfd *abfd);
/* For prefered_target_byte_order arugment */
#if defined (bfd_little_endian)
#define PREFERED_TARGET_BYTE_ORDER(IMAGE) ((IMAGE) == NULL \
? 0 \
: bfd_little_endian(IMAGE) \
? LITTLE_ENDIAN \
: BIG_ENDIAN)
#else
#define PREFERED_TARGET_BYTE_ORDER(IMAGE) ((IMAGE) == NULL \
? 0 \
: !(IMAGE)->xvec->byteorder_big_p \
? LITTLE_ENDIAN \
: BIG_ENDIAN)
#endif
extern void sim_config (SIM_DESC sd,
int prefered_target_byte_order);
extern void print_sim_config (SIM_DESC sd);