diff options
author | Andrew Cagney <cagney@redhat.com> | 1997-09-03 04:10:33 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 1997-09-03 04:10:33 +0000 |
commit | 9cdd2c6d728fad88b49377ff2951ed436cbfb470 (patch) | |
tree | 12f35007d417e40add149e064c4d09e964cb6a2b /sim | |
parent | 80c651f02dfef05adafe2cf9cc52014a0982d055 (diff) | |
download | gdb-9cdd2c6d728fad88b49377ff2951ed436cbfb470.zip gdb-9cdd2c6d728fad88b49377ff2951ed436cbfb470.tar.gz gdb-9cdd2c6d728fad88b49377ff2951ed436cbfb470.tar.bz2 |
Add real SIM_DESC arg to v850 simulator.
Add --enable-sim-warnings, use/fix errors.
Add --enable-sim-endian, don't use.
Add common modules. Don't yet use most.
Diffstat (limited to 'sim')
-rw-r--r-- | sim/v850/ChangeLog | 66 | ||||
-rw-r--r-- | sim/v850/Makefile.in | 32 | ||||
-rwxr-xr-x | sim/v850/configure | 244 | ||||
-rw-r--r-- | sim/v850/configure.in | 8 | ||||
-rw-r--r-- | sim/v850/gencode.c | 10 | ||||
-rw-r--r-- | sim/v850/interp.c | 372 | ||||
-rw-r--r-- | sim/v850/simops.c | 60 | ||||
-rw-r--r-- | sim/v850/v850_sim.h | 164 |
8 files changed, 532 insertions, 424 deletions
diff --git a/sim/v850/ChangeLog b/sim/v850/ChangeLog index 17a255c..85ac6b4 100644 --- a/sim/v850/ChangeLog +++ b/sim/v850/ChangeLog @@ -1,3 +1,69 @@ +Wed Sep 3 10:18:55 1997 Andrew Cagney <cagney@b1.cygnus.com> + + * simops.c (utime.h): Include if available. + (OP_10007E0): Check for UTIME function. + (divun): Put parentheses around shift argument. + (OP_640): Put parentheses around shift argument, was wrong. + (OP_107F0): Return something. + + * interp.c (sim_parse_number): Use strtoul not strtol. + (sim_resume): Use sim_elapsed_time_get to keep track of the time. + + * configure.in (SIM_AC_OPTION_WARNINGS): Add. + (SIM_AC_OPTION_ENDIAN): Set to hardwired big. + (SIM_AC_OPTION_HOST_ENDIAN): Add. + (AC_CHECK_FUNCS): Add utime. + (AC_CHECK_HEADERS): Add stdlib.h, string.h, strings.h, utime.h + configure: Regenerate. + + + * Makefile.in (SIM_RUN_OBJS): Use nrun.o. + (SIM_OBJS): Add sim-io.o, sim-hload.o, sim-utils.o, sim-options.o, + sim-config.o, sim-module.o, sim-events.o, sim-core.o, + sim-endian.o, sim-engine.o, sim-trace.o, sim-profile.o + (SIM_ENDIAN, SIM_WARNGINS): Define. + + * simops.c (OP_10007E0): Use sim_io_* for transfers. + + * interp.c (sim_resume): Pass sd around. + + * simops.c (sim-main.h): Include. + + * gencode.c (write_template): Generate #include sim-main.h. + (write_opcodes): Ditto. + + * interp.c (prog_bfd, prog_bfd_was_opened_p): Delete. + (v850_callback): Ditto. + (sim_kind, myname): Ditto. + (lookup_hash): Pass SD. Use sim_io_error. + (sim_set_memory_map): Pass in SD, use. + (init_system): Pass in SD, use. + (sim_open): Update. + (sim_set_profile): Delete. + (sim_set_profile_size): Delete. + (do_interrupt): Pass in SD, use. + (sim_info): Use sim_io_printf. + (sim_create_inferior): Reset registers. Set PC from prog_bfd + argument. + (sim_load): Delete, use common/sim-hload.c + (sim_size): Rename to sim_memory_init. + (sim_write): Remove call to init_system. + (init_system): Delete. + (sim_set_callbacks): Delete. + (sim_set_interrupt): Pass in SD, use. + (start_time): Delete. + + * v850_sim.h: Remove everything except `struct simops' from here. + * sim-main.h: Move most to here. + * gencode.c: Move #includes to here. + + * sim-main.h(struct _sim_cpu): Rename struct _state. + (#define PC, et.al.): Update + (v850_callback): Delete. Replaced with SIM_DESC arg. + (int8, uint8, int16, uint16, int32, uint32): Define types using + unsigned8 et.al from common/sim-types.h. + * sim-main.h (State): Define as STATE_CPU. + Mon Sep 1 12:07:55 1997 Andrew Cagney <cagney@b1.cygnus.com> * configure.in: Check for time, chmod. diff --git a/sim/v850/Makefile.in b/sim/v850/Makefile.in index a7cd628..da851a9 100644 --- a/sim/v850/Makefile.in +++ b/sim/v850/Makefile.in @@ -1,5 +1,5 @@ # Makefile template for Configure for the V850 sim library. -# Copyright (C) 1996 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997 Free Software Foundation, Inc. # Written by Cygnus Support. # # This program is free software; you can redistribute it and/or modify @@ -16,13 +16,37 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -SIM_OBJS = interp.o table.o simops.o -SIM_EXTRA_CFLAGS = -I$(srcdir)/../../newlib/libc/sys/sysnecv850 +## COMMON_PRE_CONFIG_FRAG + +SIM_OBJS = interp.o table.o simops.o \ + sim-config.o \ + sim-core.o \ + sim-engine.o \ + sim-endian.o \ + sim-events.o \ + sim-hload.o \ + sim-io.o \ + sim-load.o \ + sim-module.o \ + sim-options.o \ + sim-profile.o \ + sim-trace.o \ + sim-utils.o +SIM_RUN_OBJS = nrun.o + +# List of flags to always pass to $(CC) +SIM_WARNINGS=@sim_warnings@ +SIM_ENDIAN=@sim_endian@ +SIM_HOSTENDIAN=@sim_hostendian@ +SIM_EXTRA_CFLAGS = -I$(srcdir)/../../newlib/libc/sys/sysnecv850 \ + $(SIM_WARNINGS) \ + $(SIM_ENDIAN) \ + $(SIM_HOSTENDIAN) SIM_EXTRA_CLEAN = clean-extra INCLUDE = v850_sim.h $(srcdir)/../../include/callback.h -@COMMON_MAKEFILE_FRAG@ +## COMMON_POST_CONFIG_FRAG simops.h: gencode ./gencode -h >$@ diff --git a/sim/v850/configure b/sim/v850/configure index 9d97a3d..2395cb3 100755 --- a/sim/v850/configure +++ b/sim/v850/configure @@ -23,6 +23,12 @@ ac_help="$ac_help --enable-sim-trace=opts Enable tracing flags" ac_help="$ac_help --enable-sim-profile=opts Enable profiling flags" +ac_help="$ac_help + --enable-sim-endian=endian Specify target byte endian orientation." +ac_help="$ac_help + --enable-sim-hostendain=end Specify host byte endian orientation." +ac_help="$ac_help + --enable-sim-warnings=opts Extra CFLAGS for turning on compiler warnings" # Initialize some variables set by options. # The variables have the same names as the options, with @@ -532,7 +538,7 @@ fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:536: checking how to run the C preprocessor" >&5 +echo "configure:542: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -547,13 +553,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext <<EOF -#line 551 "configure" +#line 557 "configure" #include "confdefs.h" #include <assert.h> Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:557: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:563: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -564,13 +570,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext <<EOF -#line 568 "configure" +#line 574 "configure" #include "confdefs.h" #include <assert.h> Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:574: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:580: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -643,7 +649,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:647: checking host system type" >&5 +echo "configure:653: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -664,7 +670,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 -echo "configure:668: checking target system type" >&5 +echo "configure:674: checking target system type" >&5 target_alias=$target case "$target_alias" in @@ -682,7 +688,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$target" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:686: checking build system type" >&5 +echo "configure:692: checking build system type" >&5 build_alias=$build case "$build_alias" in @@ -726,7 +732,7 @@ test "$program_transform_name" = "" && program_transform_name="s,x,x," # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:730: checking for $ac_word" >&5 +echo "configure:736: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -755,7 +761,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:759: checking for $ac_word" >&5 +echo "configure:765: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -803,7 +809,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:807: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:813: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -813,11 +819,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <<EOF -#line 817 "configure" +#line 823 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:821: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:827: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -837,12 +843,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:841: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:847: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:846: checking whether we are using GNU C" >&5 +echo "configure:852: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -851,7 +857,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:855: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:861: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -866,7 +872,7 @@ if test $ac_cv_prog_gcc = yes; then ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:870: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:876: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -904,7 +910,7 @@ fi # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:908: checking for a BSD compatible install" >&5 +echo "configure:914: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -969,7 +975,7 @@ AR=${AR-ar} # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:973: checking for $ac_word" >&5 +echo "configure:979: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1003,17 +1009,17 @@ for ac_hdr in stdlib.h string.h strings.h unistd.h time.h sys/time.h sys/resourc do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1007: checking for $ac_hdr" >&5 +echo "configure:1013: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1012 "configure" +#line 1018 "configure" #include "confdefs.h" #include <$ac_hdr> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1017: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1023: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -1042,12 +1048,12 @@ done for ac_func in getrusage time do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1046: checking for $ac_func" >&5 +echo "configure:1052: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1051 "configure" +#line 1057 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func(); below. */ @@ -1070,7 +1076,7 @@ $ac_func(); ; return 0; } EOF -if { (eval echo configure:1074: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1080: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1225,12 +1231,12 @@ fi echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 -echo "configure:1229: checking return type of signal handlers" >&5 +echo "configure:1235: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1234 "configure" +#line 1240 "configure" #include "confdefs.h" #include <sys/types.h> #include <signal.h> @@ -1247,7 +1253,7 @@ int main() { int i; ; return 0; } EOF -if { (eval echo configure:1251: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1257: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else @@ -1287,15 +1293,182 @@ sim_link_links="${sim_link_links} targ-vals.def" + +wire_endian="LITTLE_ENDIAN" +default_endian="LITTLE_ENDIAN" +default_sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN" +# Check whether --enable-sim-endian or --disable-sim-endian was given. +if test "${enable_sim_endian+set}" = set; then + enableval="$enable_sim_endian" + case "${enableval}" in + 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;; + *) { echo "configure: error: "Unknown value $enableval for --enable-sim-endian"" 1>&2; exit 1; }; sim_endian="";; +esac +if test x"$silent" != x"yes" && test x"$sim_endian" != x""; then + echo "Setting endian flags = $sim_endian" 6>&1 +fi +else + sim_endian="${default_sim_endian}" +fi + + + +# Check whether --enable-sim-hostendian or --disable-sim-hostendian was given. +if test "${enable_sim_hostendian+set}" = set; then + enableval="$enable_sim_hostendian" + case "${enableval}" in + no) sim_hostendian="-DWITH_HOST_BYTE_ORDER=0";; + b*|B*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=BIG_ENDIAN";; + l*|L*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=LITTLE_ENDIAN";; + *) { echo "configure: error: "Unknown value $enableval for --enable-sim-hostendian"" 1>&2; exit 1; }; sim_hostendian="";; +esac +if test x"$silent" != x"yes" && test x"$sim_hostendian" != x""; then + echo "Setting hostendian flags = $sim_hostendian" 6>&1 +fi +else + +if test "x$cross_compiling" = "xno"; then + echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 +echo "configure:1346: checking whether byte ordering is bigendian" >&5 +if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_bigendian=unknown +# See if sys/param.h defines the BYTE_ORDER macro. +cat > conftest.$ac_ext <<EOF +#line 1353 "configure" +#include "confdefs.h" +#include <sys/types.h> +#include <sys/param.h> +int main() { + +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif +; return 0; } +EOF +if { (eval echo configure:1364: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + # It does; now see whether it defined to BIG_ENDIAN or not. +cat > conftest.$ac_ext <<EOF +#line 1368 "configure" +#include "confdefs.h" +#include <sys/types.h> +#include <sys/param.h> +int main() { + +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif +; return 0; } +EOF +if { (eval echo configure:1379: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_bigendian=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_bigendian=no +fi +rm -f conftest* +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +if test $ac_cv_c_bigendian = unknown; then +if test "$cross_compiling" = yes; then + { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } +else + cat > conftest.$ac_ext <<EOF +#line 1399 "configure" +#include "confdefs.h" +main () { + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); +} +EOF +if { (eval echo configure:1412: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + ac_cv_c_bigendian=no +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_c_bigendian=yes +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_c_bigendian" 1>&6 +if test $ac_cv_c_bigendian = yes; then + cat >> confdefs.h <<\EOF +#define WORDS_BIGENDIAN 1 +EOF + +fi + + if test $ac_cv_c_bigendian = yes; then + sim_hostendian="-DWITH_HOST_BYTE_ORDER=BIG_ENDIAN" + else + sim_hostendian="-DWITH_HOST_BYTE_ORDER=LITTLE_ENDIAN" + fi +else + sim_hostendian="-DWITH_HOST_BYTE_ORDER=0" +fi +fi + + + +# Check whether --enable-sim-warnings or --disable-sim-warnings was given. +if test "${enable_sim_warnings+set}" = set; then + enableval="$enable_sim_warnings" + case "${enableval}" in + yes) sim_warnings="-Werror -Wall -Wpointer-arith -Wmissing-prototypes -Wmissing-declarations ";; + no) sim_warnings="-w";; + *) sim_warnings=`echo "${enableval}" | sed -e "s/,/ /g"`;; +esac +if test x"$silent" != x"yes" && test x"$sim_warnings" != x""; then + echo "Setting warning flags = $sim_warnings" 6>&1 +fi +else + sim_warnings="" +fi + + + for ac_func in time do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1294: checking for $ac_func" >&5 +echo "configure:1467: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1299 "configure" +#line 1472 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func(); below. */ @@ -1318,7 +1491,7 @@ $ac_func(); ; return 0; } EOF -if { (eval echo configure:1322: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1346,17 +1519,17 @@ for ac_hdr in unistd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1350: checking for $ac_hdr" >&5 +echo "configure:1523: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1355 "configure" +#line 1528 "configure" #include "confdefs.h" #include <$ac_hdr> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1360: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -1545,6 +1718,9 @@ s%@sim_debug@%$sim_debug%g s%@sim_stdio@%$sim_stdio%g s%@sim_trace@%$sim_trace%g s%@sim_profile@%$sim_profile%g +s%@sim_endian@%$sim_endian%g +s%@sim_hostendian@%$sim_hostendian%g +s%@sim_warnings@%$sim_warnings%g CEOF EOF diff --git a/sim/v850/configure.in b/sim/v850/configure.in index bcfe15e..b125c68 100644 --- a/sim/v850/configure.in +++ b/sim/v850/configure.in @@ -5,7 +5,11 @@ AC_INIT(Makefile.in) SIM_AC_COMMON -AC_CHECK_FUNCS(time, chmod) -AC_CHECK_HEADERS(unistd.h) +SIM_AC_OPTION_ENDIAN(LITTLE_ENDIAN) +SIM_AC_OPTION_HOSTENDIAN +SIM_AC_OPTION_WARNINGS + +AC_CHECK_FUNCS(time, chmod, utime) +AC_CHECK_HEADERS(unistd.h stdlib.h string.h strings.h utime.h) SIM_AC_OUTPUT diff --git a/sim/v850/gencode.c b/sim/v850/gencode.c index 05fc4ec..05ce866 100644 --- a/sim/v850/gencode.c +++ b/sim/v850/gencode.c @@ -1,4 +1,8 @@ -#include "v850_sim.h" +#include <stdio.h> +#include <ctype.h> +#include "ansidecl.h" +#include "opcode/v850.h" +#include <limits.h> static void write_header PARAMS ((void)); static void write_opcodes PARAMS ((void)); @@ -42,12 +46,13 @@ write_template () struct v850_opcode *opcode; int i,j; + printf ("#include \"sim-main.h\"\n"); printf ("#include \"v850_sim.h\"\n"); printf ("#include \"simops.h\"\n"); for (opcode = (struct v850_opcode *)v850_opcodes; opcode->name; opcode++) { - printf("/* %s */\nvoid\nOP_%X ()\n{\n", opcode->name, opcode->opcode); + printf("/* %s */\nvoid\nOP_%X (void)\n{\n", opcode->name, opcode->opcode); /* count operands */ j = 0; @@ -89,6 +94,7 @@ write_opcodes () int numops; /* write out opcode table */ + printf ("#include \"sim-main.h\"\n"); printf ("#include \"v850_sim.h\"\n"); printf ("#include \"simops.h\"\n\n"); printf ("struct simops Simops[] = {\n"); diff --git a/sim/v850/interp.c b/sim/v850/interp.c index 387b6dc..f4871ce 100644 --- a/sim/v850/interp.c +++ b/sim/v850/interp.c @@ -1,8 +1,25 @@ #include <signal.h> -#include "sysdep.h" +#include "sim-main.h" +#include "sim-options.h" +#include "v850_sim.h" + +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif + +#ifdef HAVE_STRING_H +#include <string.h> +#else +#ifdef HAVE_STRINGS_H +#include <strings.h> +#endif +#endif + #include "bfd.h" -#include "v850_sim.h" + +/* For compatibility */ +SIM_DESC simulator; enum interrupt_type { @@ -66,27 +83,13 @@ static int have_nm_generator; /* These default values correspond to expected usage for the chip. */ -SIM_ADDR rom_size = 0x8000; -SIM_ADDR low_end = 0x200000; -SIM_ADDR high_start = 0xffe000; - -SIM_ADDR high_base; - -host_callback *v850_callback; - int v850_debug; -/* non-zero if we opened prog_bfd */ -static int prog_bfd_was_opened_p; -bfd *prog_bfd; - -static SIM_OPEN_KIND sim_kind; -static char *myname; - uint32 OP[4]; -static struct hash_entry *lookup_hash PARAMS ((uint32 ins)); +static struct hash_entry *lookup_hash PARAMS ((SIM_DESC sd, uint32 ins)); static long hash PARAMS ((long)); +#if 0 static void do_format_1_2 PARAMS ((uint32)); static void do_format_3 PARAMS ((uint32)); static void do_format_4 PARAMS ((uint32)); @@ -95,7 +98,7 @@ static void do_format_6 PARAMS ((uint32)); static void do_format_7 PARAMS ((uint32)); static void do_format_8 PARAMS ((uint32)); static void do_format_9_10 PARAMS ((uint32)); -static void init_system PARAMS ((void)); +#endif #define MAX_HASH 63 @@ -132,7 +135,8 @@ hash(insn) } static struct hash_entry * -lookup_hash (ins) +lookup_hash (sd, ins) + SIM_DESC sd; uint32 ins; { struct hash_entry *h; @@ -143,8 +147,8 @@ lookup_hash (ins) { if (h->next == NULL) { - (*v850_callback->printf_filtered) (v850_callback, "ERROR looking up hash for 0x%x, PC=0x%x\n", ins, PC); - exit(1); + sim_io_error (sd, "ERROR looking up hash for 0x%lx, PC=0x%lx", + (long) ins, (long) PC); } h = h->next; } @@ -212,21 +216,22 @@ uint8 * map (addr) SIM_ADDR addr; { - uint8 *p; - /* Mask down to 24 bits. */ addr &= 0xffffff; - if (addr < low_end) + if (addr < 0x100000) { /* "Mirror" the addresses below 1MB. */ - if (addr < 0x100000) - addr &= (rom_size - 1); - else - addr += (rom_size - 0x100000); - return (uint8 *) (addr + State.mem); + addr = addr & (simulator->rom_size - 1); + return (uint8 *) (addr + STATE_MEMORY (simulator)); } - else if (addr >= high_start) + else if (addr < simulator->low_end) + { + /* chunk is just after the rom */ + addr = addr - 0x100000 + simulator->rom_size; + return (uint8 *) (addr + STATE_MEMORY (simulator)); + } + else if (addr >= simulator->high_start) { /* If in the peripheral I/O region, mirror 1K region across 4K, and similarly if in the internal RAM region. */ @@ -234,11 +239,16 @@ map (addr) addr &= 0xfff3ff; else if (addr >= 0xffe000) addr &= 0xffe3ff; - return (uint8 *) (addr - high_start + high_base + State.mem); + addr = addr - simulator->high_start + simulator->high_base; + return (uint8 *) (STATE_MEMORY (simulator)); } else { - fprintf (stderr, "segmentation fault: access address: %x not below %x or above %x [ep = %x]\n", addr, low_end, high_start, State.regs[30]); + sim_io_eprintf (simulator, "segmentation fault: access address: %lx not below %lx or above %lx [ep = %lx]\n", + (long) addr, + (long) simulator->low_end, + (long) simulator->high_start, + State.regs[30]); /* Signal a memory error. */ State.exception = SIGSEGV; @@ -296,44 +306,55 @@ store_mem (addr, len, data) } } -void -sim_size (power) - int power; - +static void +sim_memory_init (SIM_DESC sd) { int totsize; - if (State.mem) - free (State.mem); - - totsize = rom_size + (low_end - 0x100000) + (0x1000000 - high_start); - - high_base = rom_size + (low_end - 0x100000); - - State.mem = (uint8 *) calloc (1, totsize); - if (!State.mem) + if (STATE_MEMORY (sd)) + zfree (STATE_MEMORY (sd)); + + totsize = (simulator->rom_size + + (sd->low_end - 0x100000) + + (0x1000000 - sd->high_start)); + + sd->high_base = sd->rom_size + (sd->low_end - 0x100000); + + STATE_MEMORY (sd) = zalloc (totsize); + if (!STATE_MEMORY (sd)) { - (*v850_callback->printf_filtered) (v850_callback, "Allocation of main memory failed.\n"); - exit (1); + sim_io_error (sd, "Allocation of main memory failed."); } } -void -sim_set_memory_map (spec) +static int +sim_parse_number (str, rest) + char *str, **rest; +{ + if (str[0] == '0' && str[1] == 'x') + return strtoul (str, rest, 16); + else if (str[0] == '0') + return strtoul (str, rest, 16); + else + return strtoul (str, rest, 10); +} + +static void +sim_set_memory_map (sd, spec) + SIM_DESC sd; char *spec; { char *reststr, *nreststr; SIM_ADDR new_low_end, new_high_start; - new_low_end = low_end; - new_high_start = high_start; + new_low_end = sd->low_end; + new_high_start = sd->high_start; if (! strncmp (spec, "hole=", 5)) { new_low_end = sim_parse_number (spec + 5, &reststr); if (new_low_end < 0x100000) { - (*v850_callback->printf_filtered) (v850_callback, - "Low end must be at least 0x100000\n"); + sim_io_printf (sd, "Low end must be at least 0x100000\n"); return; } if (*reststr == ',') @@ -342,49 +363,26 @@ sim_set_memory_map (spec) new_high_start = sim_parse_number (reststr, &nreststr); /* FIXME Check high_start also */ } - (*v850_callback->printf_filtered) (v850_callback, - "Hole goes from 0x%x to 0x%x\n", - new_low_end, new_high_start); + sim_io_printf (sd, "Hole goes from 0x%x to 0x%x\n", + new_low_end, new_high_start); } else { - (*v850_callback->printf_filtered) (v850_callback, "Invalid specification for memory map, must be `hole=<m>[,<n>]'\n"); + sim_io_printf (sd, "Invalid specification for memory map, must be `hole=<m>[,<n>]'\n"); } - if (new_low_end != low_end || new_high_start != high_start) + if (new_low_end != sd->low_end || new_high_start != sd->high_start) { - low_end = new_low_end; - high_start = new_high_start; - if (State.mem) - { - (*v850_callback->printf_filtered) (v850_callback, "Reconfiguring memory (old contents will be lost)\n"); - sim_size (1); - } + sd->low_end = new_low_end; + sd->high_start = new_high_start; + sim_io_printf (sd, "Reconfiguring memory (old contents will be lost)\n"); + sim_memory_init (sd); } } /* Parse a number in hex, octal, or decimal form. */ int -sim_parse_number (str, rest) - char *str, **rest; -{ - if (str[0] == '0' && str[1] == 'x') - return strtol (str, rest, 16); - else if (str[0] == '0') - return strtol (str, rest, 16); - else - return strtol (str, rest, 10); -} - -static void -init_system () -{ - if (!State.mem) - sim_size(1); -} - -int sim_write (sd, addr, buffer, size) SIM_DESC sd; SIM_ADDR addr; @@ -393,14 +391,13 @@ sim_write (sd, addr, buffer, size) { int i; - init_system (); - for (i = 0; i < size; i++) store_mem (addr + i, 1, buffer[i]); return size; } + SIM_DESC sim_open (kind, cb, abfd, argv) SIM_OPEN_KIND kind; @@ -408,25 +405,58 @@ sim_open (kind, cb, abfd, argv) struct _bfd *abfd; char **argv; { + SIM_DESC sd = sim_state_alloc (kind, cb); struct simops *s; struct hash_entry *h; - char **p; - sim_kind = kind; - myname = argv[0]; - v850_callback = cb; + /* for compatibility */ + simulator = sd; - if (argv != NULL) + sd->rom_size = V850_ROM_SIZE; + sd->low_end = V850_LOW_END; + sd->high_start = V850_HIGH_START; + + /* Allocate memory */ + sim_memory_init (sd); + + if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK) + return 0; + + /* getopt will print the error message so we just have to exit if this fails. + FIXME: Hmmm... in the case of gdb we need getopt to call + print_filtered. */ + if (sim_parse_args (sd, argv) != SIM_RC_OK) { - for (p = argv + 1; *p; ++p) - { -#ifdef DEBUG - if (strcmp (*p, "-t") == 0) - v850_debug = DEBUG; - else -#endif - (*v850_callback->printf_filtered) (v850_callback, "ERROR: unsupported option(s): %s\n",*p); - } + /* Uninstall the modules to avoid memory leaks, + file descriptor leaks, etc. */ + sim_module_uninstall (sd); + return 0; + } + + /* check for/establish the a reference program image */ + if (sim_analyze_program (sd, + (STATE_PROG_ARGV (sd) != NULL + ? *STATE_PROG_ARGV (sd) + : NULL), + abfd) != SIM_RC_OK) + { + sim_module_uninstall (sd); + return 0; + } + + /* establish any remaining configuration options */ + if (sim_config (sd) != SIM_RC_OK) + { + sim_module_uninstall (sd); + return 0; + } + + if (sim_post_argv_init (sd) != SIM_RC_OK) + { + /* Uninstall the modules to avoid memory leaks, + file descriptor leaks, etc. */ + sim_module_uninstall (sd); + return 0; } /* put all the opcodes in the hash table */ @@ -448,8 +478,7 @@ sim_open (kind, cb, abfd, argv) h->opcode = s->opcode; } - /* fudge our descriptor for now */ - return (SIM_DESC) 1; + return sd; } @@ -458,27 +487,10 @@ sim_close (sd, quitting) SIM_DESC sd; int quitting; { - if (prog_bfd != NULL && prog_bfd_was_opened_p) - bfd_close (prog_bfd); -} - -void -sim_set_profile (n) - int n; -{ - (*v850_callback->printf_filtered) (v850_callback, "sim_set_profile %d\n", n); -} - -void -sim_set_profile_size (n) - int n; -{ - (*v850_callback->printf_filtered) (v850_callback, "sim_set_profile_size %d\n", n); + sim_module_uninstall (sd); } -time_t start_time; - -static void do_interrupt PARAMS ((enum interrupt_type)); +static void do_interrupt PARAMS ((SIM_DESC sd, enum interrupt_type)); int sim_stop (sd) @@ -492,17 +504,18 @@ sim_resume (sd, step, siggnal) SIM_DESC sd; int step, siggnal; { - uint32 inst, opcode; + SIM_ELAPSED_TIME start_time; + uint32 inst; reg_t oldpc; struct interrupt_generator *intgen; - time_t now; if (step) State.exception = SIGTRAP; else State.exception = 0; - time (&start_time); + + start_time = sim_elapsed_time_get (); do { @@ -511,13 +524,13 @@ sim_resume (sd, step, siggnal) inst = RLW (PC); oldpc = PC; - h = lookup_hash (inst); + h = lookup_hash (sd, inst); OP[0] = inst & 0x1f; OP[1] = (inst >> 11) & 0x1f; OP[2] = (inst >> 16) & 0xffff; OP[3] = inst; -// fprintf (stderr, "PC = %x, SP = %x\n", PC, SP ); + /* fprintf (stderr, "PC = %x, SP = %x\n", PC, SP ); */ if (inst == 0) { @@ -529,7 +542,7 @@ sim_resume (sd, step, siggnal) if (oldpc == PC) { - fprintf (stderr, "simulator loop at %x\n", PC ); + sim_io_eprintf (sd, "simulator loop at %lx\n", (long) PC ); break; } @@ -548,8 +561,9 @@ sim_resume (sd, step, siggnal) else if (intgen->cond_type == int_cond_time && intgen->enabled) { - time (&now); - if (((long) now - (long) start_time) > intgen->time) + SIM_ELAPSED_TIME delta; + delta = sim_elapsed_time_since (start_time); + if (delta > intgen->time) { intgen->enabled = 0; break; @@ -557,19 +571,20 @@ sim_resume (sd, step, siggnal) } } if (intgen) - do_interrupt (intgen->type); + do_interrupt (sd, intgen->type); } else if (State.pending_nmi) { State.pending_nmi = 0; - do_interrupt (int_nmi); + do_interrupt (sd, int_nmi); } } while (!State.exception); } static void -do_interrupt (inttype) +do_interrupt (sd, inttype) + SIM_DESC sd; enum interrupt_type inttype; { /* Disable further interrupts. */ @@ -659,30 +674,22 @@ sim_info (sd, verbose) SIM_DESC sd; int verbose; { - (*v850_callback->printf_filtered) (v850_callback, "sim_info\n"); + sim_io_printf (sd, "sim_info\n"); } SIM_RC -sim_create_inferior (sd, abfd, argv, env) +sim_create_inferior (sd, prog_bfd, argv, env) SIM_DESC sd; - struct _bfd *abfd; + struct _bfd *prog_bfd; char **argv; char **env; { - if (abfd == NULL) + memset (&State, 0, sizeof (State)); + if (prog_bfd != NULL) PC = bfd_get_start_address (prog_bfd); - else - PC = 0; /* ??? */ return SIM_RC_OK; } -void -sim_set_callbacks (p) - host_callback *p; -{ - v850_callback = p; -} - /* All the code for exiting, signals, etc needs to be revamped. This is enough to get c-torture limping though. */ @@ -739,8 +746,9 @@ sim_read (sd, addr, buffer, size) int current_intgen_number = 1; -void -sim_set_interrupt (spec) +static void +sim_set_interrupt (sd, spec) + SIM_DESC sd; char *spec; { int i, num; @@ -772,12 +780,12 @@ sim_set_interrupt (spec) } if (intgen->type == int_none) { - (*v850_callback->printf_filtered) (v850_callback, "Interrupt type unknown; known types are\n"); + sim_io_printf (sd, "Interrupt type unknown; known types are\n"); for (i = 0; i < num_int_types; ++i) { - (*v850_callback->printf_filtered) (v850_callback, " %s", interrupt_names[i]); + sim_io_printf (sd, " %s", interrupt_names[i]); } - (*v850_callback->printf_filtered) (v850_callback, "\n"); + sim_io_printf (sd, "\n"); free (intgen); return; } @@ -798,7 +806,7 @@ sim_set_interrupt (spec) } else { - (*v850_callback->printf_filtered) (v850_callback, "Condition type must be `pc' or `time'.\n"); + sim_io_printf (sd, "Condition type must be `pc' or `time'.\n"); free (intgen); return; } @@ -808,7 +816,7 @@ sim_set_interrupt (spec) intgen->enabled = 1; intgen->next = intgen_list; intgen_list = intgen; - (*v850_callback->printf_filtered) (v850_callback, "Interrupt generator %d (NMI) at pc=0x%x, time=%d.\n", intgen_list->number, intgen_list->address, intgen_list->time); + sim_io_printf (sd, "Interrupt generator %d (NMI) at pc=0x%x, time=%d.\n", intgen_list->number, intgen_list->address, intgen_list->time); } else if (*argv && !strcmp (*argv, "remove")) { @@ -837,8 +845,7 @@ sim_set_interrupt (spec) if (tmpgen) free (tmpgen); else - (*v850_callback->printf_filtered) (v850_callback, - "No interrupt generator numbered %d, ignoring.\n", num); + sim_io_printf (sd, "No interrupt generator numbered %d, ignoring.\n", num); } } else if (*argv && !strcmp (*argv, "info")) @@ -846,24 +853,22 @@ sim_set_interrupt (spec) if (intgen_list) { for (intgen = intgen_list; intgen != NULL; intgen = intgen->next) - (*v850_callback->printf_filtered) (v850_callback, - "Interrupt generator %d (%s) at pc=0x%x/time=%d%s.\n", - intgen->number, - interrupt_names[intgen->type], - intgen->address, - intgen->time, - (intgen->enabled ? "" : " (disabled)")); + sim_io_printf (sd, "Interrupt generator %d (%s) at pc=0x%x/time=%d%s.\n", + intgen->number, + interrupt_names[intgen->type], + intgen->address, + intgen->time, + (intgen->enabled ? "" : " (disabled)")); } else { - (*v850_callback->printf_filtered) (v850_callback, "No interrupt generators defined.\n"); + sim_io_printf (sd, "No interrupt generators defined.\n"); } } else { - (*v850_callback->printf_filtered) (v850_callback, - "Invalid interrupt command, must be one of `add', `remove', or `info'.\n"); + sim_io_printf (sd, "Invalid interrupt command, must be one of `add', `remove', or `info'.\n"); } /* Cache the presence of a non-maskable generator. */ have_nm_generator = 0; @@ -887,41 +892,22 @@ sim_do_command (sd, cmd) if (! strncmp (cmd, mm_cmd, strlen (mm_cmd)) && strchr (" ", cmd[strlen(mm_cmd)])) - sim_set_memory_map (cmd + strlen(mm_cmd) + 1); + sim_set_memory_map (sd, cmd + strlen(mm_cmd) + 1); else if (! strncmp (cmd, int_cmd, strlen (int_cmd)) && strchr (" ", cmd[strlen(int_cmd)])) - sim_set_interrupt (cmd + strlen(int_cmd) + 1); + sim_set_interrupt (sd, cmd + strlen(int_cmd) + 1); else if (! strcmp (cmd, "help")) { - (*v850_callback->printf_filtered) (v850_callback, "V850 simulator commands:\n\n"); - (*v850_callback->printf_filtered) (v850_callback, "interrupt add <inttype> { pc | time } <value> -- Set up an interrupt generator\n"); - (*v850_callback->printf_filtered) (v850_callback, "interrupt remove <n> -- Remove an existing interrupt generator\n"); - (*v850_callback->printf_filtered) (v850_callback, "interrupt info -- List all the interrupt generators\n"); - (*v850_callback->printf_filtered) (v850_callback, "memory-map hole=<m>,<n> -- Set the memory map to have a hole between <m> and <n>\n"); - (*v850_callback->printf_filtered) (v850_callback, "\n"); + sim_io_printf (sd, "V850 simulator commands:\n\n"); + sim_io_printf (sd, "interrupt add <inttype> { pc | time } <value> -- Set up an interrupt generator\n"); + sim_io_printf (sd, "interrupt remove <n> -- Remove an existing interrupt generator\n"); + sim_io_printf (sd, "interrupt info -- List all the interrupt generators\n"); + sim_io_printf (sd, "memory-map hole=<m>,<n> -- Set the memory map to have a hole between <m> and <n>\n"); + sim_io_printf (sd, "\n"); } else - (*v850_callback->printf_filtered) (v850_callback, "\"%s\" is not a valid V850 simulator command.\n", + sim_io_printf (sd, "\"%s\" is not a valid V850 simulator command.\n", cmd); } - -SIM_RC -sim_load (sd, prog, abfd, from_tty) - SIM_DESC sd; - char *prog; - bfd *abfd; - int from_tty; -{ - extern bfd *sim_load_file (); /* ??? Don't know where this should live. */ - - if (prog_bfd != NULL && prog_bfd_was_opened_p) - bfd_close (prog_bfd); - prog_bfd = sim_load_file (sd, myname, v850_callback, prog, abfd, - sim_kind == SIM_OPEN_DEBUG); - if (prog_bfd == NULL) - return SIM_RC_FAIL; - prog_bfd_was_opened_p = abfd == NULL; - return SIM_RC_OK; -} diff --git a/sim/v850/simops.c b/sim/v850/simops.c index 5a57fed..fe1ed8f 100644 --- a/sim/v850/simops.c +++ b/sim/v850/simops.c @@ -1,9 +1,16 @@ #include <signal.h> +#include "sim-main.h" #include "v850_sim.h" #include "simops.h" + +#ifdef HAVE_UTIME_H +#include <utime.h> +#endif + /* FIXME - should be including a version of syscall.h that does not pollute the name space */ #include "../../libgloss/v850/sys/syscall.h" + #include "bfd.h" #include <errno.h> #if !defined(__GO32__) && !defined(_WIN32) @@ -790,9 +797,6 @@ OP_10760 () static int branch (int code) { - unsigned int psw; - int op0; - trace_input ("Bcond", OP_COND_BR, 0); trace_output (OP_COND_BR); @@ -1692,7 +1696,7 @@ OP_640 () { trace_input ("movhi", OP_UIMM_REG_REG, 16); - State.regs[ OP[1] ] = State.regs[ OP[0] ] + OP[2] << 16; + State.regs[ OP[1] ] = State.regs[ OP[0] ] + (OP[2] << 16); trace_output (OP_UIMM_REG_REG); } @@ -2275,37 +2279,34 @@ OP_10007E0 () #ifdef SYS_read case SYS_read: - RETVAL = v850_callback->read (v850_callback, PARM1, MEMPTR (PARM2), - PARM3); + RETVAL = sim_io_read (simulator, PARM1, MEMPTR (PARM2), PARM3); break; #endif #ifdef SYS_write case SYS_write: if (PARM1 == 1) - RETVAL = (int)v850_callback->write_stdout (v850_callback, - MEMPTR (PARM2), PARM3); + RETVAL = sim_io_write_stdout (simulator, MEMPTR (PARM2), PARM3); else - RETVAL = (int)v850_callback->write (v850_callback, PARM1, - MEMPTR (PARM2), PARM3); + RETVAL = sim_io_write (simulator, PARM1, MEMPTR (PARM2), PARM3); break; #endif #ifdef SYS_lseek case SYS_lseek: - RETVAL = v850_callback->lseek (v850_callback, PARM1, PARM2, PARM3); + RETVAL = sim_io_lseek (simulator, PARM1, PARM2, PARM3); break; #endif #ifdef SYS_close case SYS_close: - RETVAL = v850_callback->close (v850_callback, PARM1); + RETVAL = sim_io_close (simulator, PARM1); break; #endif #ifdef SYS_open case SYS_open: - RETVAL = v850_callback->open (v850_callback, MEMPTR (PARM1), PARM2); + RETVAL = sim_io_open (simulator, MEMPTR (PARM1), PARM2); break; #endif @@ -2408,8 +2409,8 @@ OP_10007E0 () #endif #endif -#if !defined(__GO32__) && !defined(_WIN32) #ifdef SYS_utime +#if HAVE_UTIME case SYS_utime: /* Cast the second argument to void *, to avoid type mismatch if a prototype is present. */ @@ -2458,8 +2459,6 @@ OP_2007E0 () int OP_4007E0 () { - unsigned int op0; - trace_input ("stsr", OP_STSR, 0); State.regs[ OP[1] ] = State.sregs[ OP[0] ]; @@ -2571,20 +2570,20 @@ divun boolean * overflow_ptr ) { - unsigned long ald = sfi >> N - 1; + unsigned long ald = sfi >> (N - 1); unsigned long alo = als; unsigned int Q = 1; unsigned int C; unsigned int S = 0; unsigned int i; unsigned int R1 = 1; - unsigned int OV; unsigned int DBZ = (als == 0) ? 1 : 0; unsigned long alt = Q ? ~als : als; /* 1st Loop */ alo = ald + alt + Q; - C = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31); + C = (((alt >> 31) & (ald >> 31)) + | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31))); C = C ^ Q; Q = ~(C ^ S) & 1; R1 = (alo == 0) ? 0 : (R1 & Q); @@ -2601,7 +2600,8 @@ divun { alt = Q ? ~als : als; alo = ald + alt + Q; - C = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31); + C = (((alt >> 31) & (ald >> 31)) + | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31))); C = C ^ Q; Q = ~(C ^ S) & 1; R1 = (alo == 0) ? 0 : (R1 & Q); @@ -2617,7 +2617,8 @@ divun /* Nth Loop */ alt = Q ? ~als : als; alo = ald + alt + Q; - C = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31); + C = (((alt >> 31) & (ald >> 31)) + | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31))); C = C ^ Q; Q = ~(C ^ S) & 1; R1 = (alo == 0) ? 0 : (R1 & Q); @@ -2660,7 +2661,8 @@ divn /* 1st Loop */ alo = ald + alt + Q; - C = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31); + C = (((alt >> 31) & (ald >> 31)) + | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31))); Q = C ^ SS; R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD))); S = alo >> 31; @@ -2677,7 +2679,8 @@ divn { alt = Q ? ~als : als; alo = ald + alt + Q; - C = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31); + C = (((alt >> 31) & (ald >> 31)) + | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31))); Q = C ^ SS; R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD))); S = alo >> 31; @@ -2692,7 +2695,8 @@ divn /* Nth Loop */ alt = Q ? ~als : als; alo = ald + alt + Q; - C = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31); + C = (((alt >> 31) & (ald >> 31)) + | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31))); Q = C ^ SS; R1 = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD))); sfi = (sfi << (32-N+1)); @@ -2716,7 +2720,8 @@ divn * remainder_ptr = alo; /* Adj */ - if ((alo != 0) && ((SS ^ SD) ^ R1) || (alo == 0) && (SS ^ R1)) + if (((alo != 0) && ((SS ^ SD) ^ R1)) + || ((alo == 0) && (SS ^ R1))) alo = ald + 1; else alo = ald; @@ -3369,7 +3374,8 @@ OP_10780 (void) trace_input ("ld.bu", OP_LOAD32, 1); - adr = State.regs[ OP[0] ] + SEXT16 (OP[2] & ~1) | ((OP[3] >> 5) & 1); + adr = (State.regs[ OP[0] ] + + (SEXT16 (OP[2] & ~1) | ((OP[3] >> 5) & 1))); State.regs[ OP[1] ] = load_mem (adr, 1); @@ -3611,6 +3617,8 @@ OP_107F0 (void) } trace_output (OP_PUSHPOP2); + + return 4; } /* pushmh list18 */ diff --git a/sim/v850/v850_sim.h b/sim/v850/v850_sim.h index a12428b..d88bb14 100644 --- a/sim/v850/v850_sim.h +++ b/sim/v850/v850_sim.h @@ -1,170 +1,8 @@ -#include <stdio.h> -#include <ctype.h> -#include "ansidecl.h" -#include "callback.h" -#include "opcode/v850.h" -#include <limits.h> -#include "remote-sim.h" - -extern host_callback *v850_callback; - -#define DEBUG_TRACE 0x00000001 -#define DEBUG_VALUES 0x00000002 - -extern int v850_debug; - -#if UCHAR_MAX == 255 -typedef unsigned char uint8; -typedef signed char int8; -#else -#error "Char is not an 8-bit type" -#endif - -#if SHRT_MAX == 32767 -typedef unsigned short uint16; -typedef signed short int16; -#else -#error "Short is not a 16-bit type" -#endif - -#if INT_MAX == 2147483647 - -typedef unsigned int uint32; -typedef signed int int32; - -#else -# if LONG_MAX == 2147483647 - -typedef unsigned long uint32; -typedef signed long int32; - -# else -# error "Neither int nor long is a 32-bit type" -# endif -#endif - -/* FIXME: V850 defines */ -typedef uint32 reg_t; - struct simops { long opcode; long mask; - int (* func)(void); + int (* func) PARAMS ((void)); int numops; int operands[12]; }; - -/* The current state of the processor; registers, memory, etc. */ - -struct _state -{ - reg_t regs[32]; /* general-purpose registers */ - reg_t sregs[32]; /* system registers, including psw */ - reg_t pc; - uint8 * mem; /* main memory */ - int dummy_mem; /* where invalid accesses go */ - int exception; - int pending_nmi; -} State; - -#define SIG_V850_EXIT -1 /* indication of a normal exit */ - -extern uint32 OP[4]; -extern struct simops Simops[]; - -#define PC (State.pc) -#define SP (State.regs[3]) -#define EP (State.regs[30]) - -#define EIPC (State.sregs[0]) -#define EIPSW (State.sregs[1]) -#define FEPC (State.sregs[2]) -#define FEPSW (State.sregs[3]) -#define ECR (State.sregs[4]) -#define PSW (State.sregs[5]) -/* start-sanitize-v850e */ -#define CTPC (State.sregs[16]) -#define CTPSW (State.sregs[17]) -/* end-sanitize-v850e */ -#define DBPC (State.sregs[18]) -#define DBPSW (State.sregs[19]) -/* start-sanitize-v850e */ -#define CTBP (State.sregs[20]) -/* end-sanitize-v850e */ - -#define PSW_NP 0x80 -#define PSW_EP 0x40 -#define PSW_ID 0x20 -#define PSW_SAT 0x10 -#define PSW_CY 0x8 -#define PSW_OV 0x4 -#define PSW_S 0x2 -#define PSW_Z 0x1 - -#define SEXT3(x) ((((x)&0x7)^(~0x3))+0x4) - -/* sign-extend a 4-bit number */ -#define SEXT4(x) ((((x)&0xf)^(~0x7))+0x8) - -/* sign-extend a 5-bit number */ -#define SEXT5(x) ((((x)&0x1f)^(~0xf))+0x10) - -/* sign-extend an 8-bit number */ -#define SEXT8(x) ((((x)&0xff)^(~0x7f))+0x80) - -/* sign-extend a 9-bit number */ -#define SEXT9(x) ((((x)&0x1ff)^(~0xff))+0x100) - -/* sign-extend a 16-bit number */ -#define SEXT16(x) ((((x)&0xffff)^(~0x7fff))+0x8000) - -/* sign-extend a 22-bit number */ -#define SEXT22(x) ((((x)&0x3fffff)^(~0x1fffff))+0x200000) - -/* sign-extend a 32-bit number */ -#define SEXT32(x) ((((x)&0xffffffffLL)^(~0x7fffffffLL))+0x80000000LL) - -/* sign extend a 40 bit number */ -#define SEXT40(x) ((((x)&0xffffffffffLL)^(~0x7fffffffffLL))+0x8000000000LL) - -/* sign extend a 44 bit number */ -#define SEXT44(x) ((((x)&0xfffffffffffLL)^(~0x7ffffffffffLL))+0x80000000000LL) - -/* sign extend a 60 bit number */ -#define SEXT60(x) ((((x)&0xfffffffffffffffLL)^(~0x7ffffffffffffffLL))+0x800000000000000LL) - -/* No sign extension */ -#define NOP(x) (x) - -#define MAX32 0x7fffffffLL -#define MIN32 0xff80000000LL -#define MASK32 0xffffffffLL -#define MASK40 0xffffffffffLL - -#define INC_ADDR(x,i) x = ((State.MD && x == MOD_E) ? MOD_S : (x)+(i)) - -#define RLW(x) load_mem (x, 4) - -#ifdef _WIN32 -#ifndef SIGTRAP -#define SIGTRAP 5 -#endif -#ifndef SIGQUIT -#define SIGQUIT 3 -#endif -#endif - -/* Function declarations. */ - -uint32 get_word PARAMS ((uint8 *)); -uint16 get_half PARAMS ((uint8 *)); -uint8 get_byte PARAMS ((uint8 *)); -void put_word PARAMS ((uint8 *, uint32)); -void put_half PARAMS ((uint8 *, uint16)); -void put_byte PARAMS ((uint8 *, uint8)); - -extern uint32 load_mem PARAMS ((SIM_ADDR addr, int len)); -extern void store_mem PARAMS ((SIM_ADDR addr, int len, uint32 data)); - -extern uint8 *map PARAMS ((SIM_ADDR addr)); |