* eCos->devo merge; tx3904 sanitize tags removed
1998-12-29 Frank Ch. Eigler <fche@cygnus.com> * interp.c (sim_open): Allocate jm3904 memory in smaller chunks. (load_word): Call SIM_CORE_SIGNAL hook on error. (signal_exception): Call SIM_CPU_EXCEPTION_TRIGGER hook before starting. For exception dispatching, pass PC instead of NULL_CIA. (decode_coproc): Use COP0_BADVADDR to store faulting address. * sim-main.h (COP0_BADVADDR): Define. (SIM_CORE_SIGNAL): Define hook to call mips_core_signal. (SIM_CPU_EXCEPTION*): Define hooks to call mips_cpu_exception*(). (_sim_cpu): Add exc_* fields to store register value snapshots. * mips.igen (*): Replace memory-related SignalException* calls with references to SIM_CORE_SIGNAL hook. * dv-tx3904irc.c (tx3904irc_port_event): printf format warning fix. * sim-main.c (*): Minor warning cleanups.
This commit is contained in:
parent
a714374d5e
commit
14bbac6609
|
@ -1,3 +1,21 @@
|
|||
1998-12-29 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* interp.c (sim_open): Allocate jm3904 memory in smaller chunks.
|
||||
(load_word): Call SIM_CORE_SIGNAL hook on error.
|
||||
(signal_exception): Call SIM_CPU_EXCEPTION_TRIGGER hook before
|
||||
starting. For exception dispatching, pass PC instead of NULL_CIA.
|
||||
(decode_coproc): Use COP0_BADVADDR to store faulting address.
|
||||
* sim-main.h (COP0_BADVADDR): Define.
|
||||
(SIM_CORE_SIGNAL): Define hook to call mips_core_signal.
|
||||
(SIM_CPU_EXCEPTION*): Define hooks to call mips_cpu_exception*().
|
||||
(_sim_cpu): Add exc_* fields to store register value snapshots.
|
||||
* mips.igen (*): Replace memory-related SignalException* calls
|
||||
with references to SIM_CORE_SIGNAL hook.
|
||||
|
||||
* dv-tx3904irc.c (tx3904irc_port_event): printf format warning
|
||||
fix.
|
||||
* sim-main.c (*): Minor warning cleanups.
|
||||
|
||||
1998-12-24 Gavin Romig-Koch <gavin@cygnus.com>
|
||||
|
||||
* m16.igen (DADDIU5): Correct type-o.
|
||||
|
@ -88,13 +106,11 @@ end-sanitize-vr4xxx
|
|||
|
||||
* mips/interp.c (DEBUG): Cleanups.
|
||||
|
||||
start-sanitize-tx3904
|
||||
1998-12-10 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* dv-tx3904sio.c (tx3904sio_io_read_buffer): Endianness fixes.
|
||||
(tx3904sio_tickle): fflush after a stdout character output.
|
||||
|
||||
end-sanitize-tx3904
|
||||
1998-12-03 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* interp.c (sim_close): Uninstall modules.
|
||||
|
@ -219,14 +235,12 @@ Thu Nov 5 19:40:12 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
|||
(r59fp_store): Clarify "bad value" abort messages.
|
||||
|
||||
end-sanitize-r5900
|
||||
start-sanitize-tx3904
|
||||
Sat Oct 30 09:49:10 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* dv-tx3904cpu.c (deliver_tx3904cpu_interrupt): Add dummy
|
||||
interrupt level number to match changed SignalExceptionInterrupt
|
||||
macro.
|
||||
|
||||
end-sanitize-tx3904
|
||||
start-sanitize-sky
|
||||
Thu Oct 29 12:47:46 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
|
@ -293,7 +307,6 @@ Fri Sep 4 10:37:57 1998 Frank Ch. Eigler <fche@cygnus.com>
|
|||
macros to store output result during computation.
|
||||
|
||||
end-sanitize-r5900
|
||||
start-sanitize-tx3904
|
||||
Tue Sep 1 15:39:18 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* dv-tx3904sio.c: Include sim-assert.h.
|
||||
|
@ -313,7 +326,6 @@ Tue Aug 25 12:49:46 1998 Frank Ch. Eigler <fche@cygnus.com>
|
|||
* dv-tx3904tmr.c: Compiler warning clean-up. Remove particularly
|
||||
frequent hw-trace messages.
|
||||
|
||||
end-sanitize-tx3904
|
||||
start-sanitize-sky
|
||||
Tue Aug 11 13:52:16 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
|
@ -445,22 +457,18 @@ start-sanitize-sky
|
|||
end-sanitize-sky
|
||||
* sim-main.h (interrupt_event): Add prototype.
|
||||
|
||||
start-sanitize-tx3904
|
||||
* dv-tx3904tmr.c (tx3904tmr_io_write_buffer): Delete unused
|
||||
register_ptr, register_value.
|
||||
(deliver_tx3904tmr_tick): Fix types passed to printf fmt.
|
||||
|
||||
end-sanitize-tx3904
|
||||
* sim-main.h (tracefh): Make extern.
|
||||
|
||||
start-sanitize-tx3904
|
||||
Tue Jun 16 14:39:00 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* dv-tx3904tmr.c: Deschedule timer event after dispatching.
|
||||
Reduce unnecessarily high timer event frequency.
|
||||
* dv-tx3904cpu.c: Ditto for interrupt event.
|
||||
|
||||
end-sanitize-tx3904
|
||||
start-sanitize-sky
|
||||
Tue Jun 16 14:12:09 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
|
@ -475,12 +483,10 @@ Wed Jun 10 13:22:32 1998 Frank Ch. Eigler <fche@cygnus.com>
|
|||
* interp.c (decode_coproc): For TX39, add stub COP0 register #7,
|
||||
to allay warnings.
|
||||
(interrupt_event): Made non-static.
|
||||
start-sanitize-tx3904
|
||||
|
||||
* dv-tx3904tmr.c (deliver_tx3904tmr_tick): Correct accidental
|
||||
interchange of configuration values for external vs. internal
|
||||
clock dividers.
|
||||
end-sanitize-tx3904
|
||||
|
||||
Tue Jun 9 12:46:24 1998 Ian Carmichael <iancarm@cygnus.com>
|
||||
|
||||
|
@ -492,7 +498,6 @@ Tue Jun 9 12:46:24 1998 Ian Carmichael <iancarm@cygnus.com>
|
|||
than halting sim.
|
||||
* sim-main.h: Moved magic constants to here.
|
||||
|
||||
start-sanitize-tx3904
|
||||
Tue Jun 9 12:29:50 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* dv-tx3904cpu.c (deliver_*_interrupt,*_port_event): Set the CAUSE
|
||||
|
@ -507,7 +512,6 @@ Tue Jun 9 12:29:50 1998 Frank Ch. Eigler <fche@cygnus.com>
|
|||
* interp.c (sim_open): Added jmr3904pal board type that adds PAL-based
|
||||
serial I/O and timer module at base address 0xFFFF0000.
|
||||
|
||||
end-sanitize-tx3904
|
||||
Tue Jun 9 11:52:29 1998 Gavin Koch <gavin@cygnus.com>
|
||||
|
||||
* mips.igen (SWC1) : Correct the handling of ReverseEndian
|
||||
|
@ -519,7 +523,6 @@ Tue Jun 9 11:40:57 1998 Gavin Koch <gavin@cygnus.com>
|
|||
parts.
|
||||
* configure: Update.
|
||||
|
||||
start-sanitize-tx3904
|
||||
Thu Jun 4 15:37:33 1998 Frank Ch. Eigler <fche@cygnus.com>
|
||||
|
||||
* dv-tx3904tmr.c: New file - implements tx3904 timer.
|
||||
|
@ -529,7 +532,6 @@ Thu Jun 4 15:37:33 1998 Frank Ch. Eigler <fche@cygnus.com>
|
|||
* interp.c (sim_open): Instantiate three timer instances.
|
||||
Fix address typo of tx3904irc instance.
|
||||
|
||||
end-sanitize-tx3904
|
||||
start-sanitize-r5900
|
||||
Thu Jun 4 16:47:27 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
|
@ -563,7 +565,6 @@ Fri May 29 11:40:39 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
|||
|
||||
* configure.in (sim_igen_filter): Match mips*tx39 not mipst*tx39.
|
||||
|
||||
start-sanitize-tx3904
|
||||
Mon May 25 20:47:45 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* dv-tx3904cpu.c, dv-tx3904irc.c: Rename *_callback to *_method.
|
||||
|
@ -572,7 +573,6 @@ Mon May 25 20:47:45 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
|||
sim-main.h. Declare a struct hw_descriptor instead of struct
|
||||
hw_device_descriptor.
|
||||
|
||||
end-sanitize-tx3904
|
||||
Mon May 25 12:41:38 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* mips.igen (do_store_left, do_load_left): Compute nr of left and
|
||||
|
@ -580,7 +580,6 @@ Mon May 25 12:41:38 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
|||
lanes. Fix incorrect computation in do_store_left when loading
|
||||
bytes from second word.
|
||||
|
||||
start-sanitize-tx3904
|
||||
Fri May 22 13:34:20 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* configure.in (SIM_AC_OPTION_HARDWARE): Only enable when tx3904.
|
||||
|
@ -590,7 +589,6 @@ Fri May 22 13:34:20 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
|||
* dv-tx3904irc.c (tx3904irc_finish): Pacify GCC.
|
||||
* interp.c (signal_exception): Ditto.
|
||||
|
||||
end-sanitize-tx3904
|
||||
Thu May 21 14:24:11 1998 Gavin Koch <gavin@cygnus.com>
|
||||
|
||||
* gencode.c: Mark BEGEZALL as LIKELY.
|
||||
|
@ -626,13 +624,11 @@ Mon May 18 18:22:42 1998 Frank Ch. Eigler <fche@cygnus.com>
|
|||
exit.
|
||||
(decode_coproc): Implement RFE instruction for TX39.
|
||||
(mips.igen): Decode RFE instruction as such.
|
||||
start-sanitize-tx3904
|
||||
* configure.in (tx3904cpu,tx3904irc): Added devices for tx3904.
|
||||
* interp.c: Define "jmr3904" and "jmr3904debug" board types and
|
||||
bbegin to implement memory map.
|
||||
* dv-tx3904cpu.c: New file.
|
||||
* dv-tx3904irc.c: New file.
|
||||
end-sanitize-tx3904
|
||||
|
||||
Wed May 13 14:40:11 1998 Gavin Koch <gavin@cygnus.com>
|
||||
|
||||
|
|
|
@ -3968,9 +3968,18 @@ case "${target}" in
|
|||
;;
|
||||
# end-sanitize-cygnus
|
||||
# start-sanitize-vr4xxx
|
||||
mips64vr4xxx*-*-*) sim_gen=IGEN
|
||||
sim_igen_machine="-M mipsIV,vr4100,vr4121 -G gen-multi-sim=mipsIV"
|
||||
;;
|
||||
mips64vr4xxx*-*-*) sim_gen=HACK
|
||||
sim_igen_filter="32,64,f"
|
||||
;;
|
||||
# mips64vr4xxx*-*-*) sim_gen=IGEN
|
||||
# sim_igen_machine="-M mipsIV,vr4100,vr4121 -G gen-multi-sim=mipsIV"
|
||||
# ;;
|
||||
# mips64vr4xxx*-*-*) sim_gen=M16
|
||||
# sim_igen_machine="-M mipsIV,vr4100 -G gen-multi-sim=mipsV"
|
||||
# sim_m16_machine="-M vr4100"
|
||||
# sim_igen_filter="32,64,f"
|
||||
# sim_m16_filter="16"
|
||||
# ;;
|
||||
# end-sanitize-vr4xxx
|
||||
mips64vr41*) sim_gen=M16
|
||||
sim_igen_machine="-M vr4100"
|
||||
|
@ -4007,14 +4016,12 @@ sim_m16_flags=" -F ${sim_m16_filter} ${sim_m16_machine} ${sim_igen_smp}"
|
|||
#
|
||||
hw_enabled=no
|
||||
case "${target}" in
|
||||
# start-sanitize-tx3904
|
||||
mips*tx39*)
|
||||
hw_enabled=yes
|
||||
hw_extra_devices="tx3904cpu tx3904irc tx3904tmr tx3904sio"
|
||||
mips_extra_objs="dv-sockser.o"
|
||||
SIM_SUBTARGET="$SIM_SUBTARGET -DTARGET_TX3904=1"
|
||||
;;
|
||||
# end-sanitize-tx3904
|
||||
# start-sanitize-sky
|
||||
mips64r59*-sky-*)
|
||||
mips_extra_objs='$(SIM_SKY_OBJS)'
|
||||
|
@ -4110,7 +4117,7 @@ esac
|
|||
# Uses ac_ vars as temps to allow command line to override cache and checks.
|
||||
# --without-x overrides everything else, but does not touch the cache.
|
||||
echo $ac_n "checking for X""... $ac_c" 1>&6
|
||||
echo "configure:4114: checking for X" >&5
|
||||
echo "configure:4123: checking for X" >&5
|
||||
|
||||
# Check whether --with-x or --without-x was given.
|
||||
if test "${with_x+set}" = set; then
|
||||
|
@ -4172,12 +4179,12 @@ if test "$ac_x_includes" = NO; then
|
|||
|
||||
# First, try using that file with no special directory specified.
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4176 "configure"
|
||||
#line 4185 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <$x_direct_test_include>
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:4181: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:4190: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
||||
if test -z "$ac_err"; then
|
||||
rm -rf conftest*
|
||||
|
@ -4246,14 +4253,14 @@ if test "$ac_x_libraries" = NO; then
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-l$x_direct_test_library $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4250 "configure"
|
||||
#line 4259 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() {
|
||||
${x_direct_test_function}()
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:4257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:4266: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
LIBS="$ac_save_LIBS"
|
||||
# We can link X programs with no special library path.
|
||||
|
@ -4367,7 +4374,7 @@ then
|
|||
# Uses ac_ vars as temps to allow command line to override cache and checks.
|
||||
# --without-x overrides everything else, but does not touch the cache.
|
||||
echo $ac_n "checking for X""... $ac_c" 1>&6
|
||||
echo "configure:4371: checking for X" >&5
|
||||
echo "configure:4380: checking for X" >&5
|
||||
|
||||
# Check whether --with-x or --without-x was given.
|
||||
if test "${with_x+set}" = set; then
|
||||
|
@ -4429,12 +4436,12 @@ if test "$ac_x_includes" = NO; then
|
|||
|
||||
# First, try using that file with no special directory specified.
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4433 "configure"
|
||||
#line 4442 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <$x_direct_test_include>
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:4438: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:4447: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
||||
if test -z "$ac_err"; then
|
||||
rm -rf conftest*
|
||||
|
@ -4503,14 +4510,14 @@ if test "$ac_x_libraries" = NO; then
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-l$x_direct_test_library $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4507 "configure"
|
||||
#line 4516 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() {
|
||||
${x_direct_test_function}()
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:4514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:4523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
LIBS="$ac_save_LIBS"
|
||||
# We can link X programs with no special library path.
|
||||
|
@ -4600,12 +4607,12 @@ fi
|
|||
if test "$no_x" = ""; then
|
||||
if test "$x_includes" = ""; then
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4604 "configure"
|
||||
#line 4613 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <X11/XIntrinsic.h>
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:4609: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:4618: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
||||
if test -z "$ac_err"; then
|
||||
:
|
||||
|
@ -4625,15 +4632,15 @@ rm -f conftest*
|
|||
fi
|
||||
if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then
|
||||
echo $ac_n "checking for X11 header files""... $ac_c" 1>&6
|
||||
echo "configure:4629: checking for X11 header files" >&5
|
||||
echo "configure:4638: checking for X11 header files" >&5
|
||||
XINCLUDES="# no special path needed"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4632 "configure"
|
||||
#line 4641 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <X11/Intrinsic.h>
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:4637: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:4646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
||||
if test -z "$ac_err"; then
|
||||
:
|
||||
|
@ -4669,7 +4676,7 @@ rm -f conftest*
|
|||
|
||||
if test "$no_x" = yes; then
|
||||
echo $ac_n "checking for X11 libraries""... $ac_c" 1>&6
|
||||
echo "configure:4673: checking for X11 libraries" >&5
|
||||
echo "configure:4682: checking for X11 libraries" >&5
|
||||
XLIBSW=nope
|
||||
dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib"
|
||||
for i in $dirs ; do
|
||||
|
@ -4689,7 +4696,7 @@ echo "configure:4673: checking for X11 libraries" >&5
|
|||
fi
|
||||
if test "$XLIBSW" = nope ; then
|
||||
echo $ac_n "checking for XCreateWindow in -lXwindow""... $ac_c" 1>&6
|
||||
echo "configure:4693: checking for XCreateWindow in -lXwindow" >&5
|
||||
echo "configure:4702: checking for XCreateWindow in -lXwindow" >&5
|
||||
ac_lib_var=`echo Xwindow'_'XCreateWindow | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
|
@ -4697,7 +4704,7 @@ else
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-lXwindow $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4701 "configure"
|
||||
#line 4710 "configure"
|
||||
#include "confdefs.h"
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
|
@ -4708,7 +4715,7 @@ int main() {
|
|||
XCreateWindow()
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:4712: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:4721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||
else
|
||||
|
@ -4824,7 +4831,7 @@ fi
|
|||
#--------------------------------------------------------------------
|
||||
|
||||
echo $ac_n "checking for main in -lXbsd""... $ac_c" 1>&6
|
||||
echo "configure:4828: checking for main in -lXbsd" >&5
|
||||
echo "configure:4837: checking for main in -lXbsd" >&5
|
||||
ac_lib_var=`echo Xbsd'_'main | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
|
@ -4832,14 +4839,14 @@ else
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-lXbsd $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4836 "configure"
|
||||
#line 4845 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() {
|
||||
main()
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:4843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:4852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||
else
|
||||
|
@ -4863,7 +4870,7 @@ fi
|
|||
# CYGNUS LOCAL: Store any socket library(ies) in the cache, and don't
|
||||
# mess up the cache values of the functions we check for.
|
||||
echo $ac_n "checking for socket libraries""... $ac_c" 1>&6
|
||||
echo "configure:4867: checking for socket libraries" >&5
|
||||
echo "configure:4876: checking for socket libraries" >&5
|
||||
if eval "test \"`echo '$''{'sim_cv_lib_sockets'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -4871,12 +4878,12 @@ else
|
|||
sim_checkBoth=0
|
||||
unset ac_cv_func_connect
|
||||
echo $ac_n "checking for connect""... $ac_c" 1>&6
|
||||
echo "configure:4875: checking for connect" >&5
|
||||
echo "configure:4884: checking for connect" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4880 "configure"
|
||||
#line 4889 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char connect(); below. */
|
||||
|
@ -4899,7 +4906,7 @@ connect();
|
|||
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:4903: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:4912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_func_connect=yes"
|
||||
else
|
||||
|
@ -4922,7 +4929,7 @@ fi
|
|||
if test "$sim_checkSocket" = 1; then
|
||||
unset ac_cv_func_connect
|
||||
echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6
|
||||
echo "configure:4926: checking for main in -lsocket" >&5
|
||||
echo "configure:4935: checking for main in -lsocket" >&5
|
||||
ac_lib_var=`echo socket'_'main | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
|
@ -4930,14 +4937,14 @@ else
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-lsocket $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4934 "configure"
|
||||
#line 4943 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() {
|
||||
main()
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:4941: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:4950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||
else
|
||||
|
@ -4964,12 +4971,12 @@ fi
|
|||
SOCKLIBSW="$SOCKLIBSW -lsocket -lnsl"
|
||||
unset ac_cv_func_accept
|
||||
echo $ac_n "checking for accept""... $ac_c" 1>&6
|
||||
echo "configure:4968: checking for accept" >&5
|
||||
echo "configure:4977: checking for accept" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 4973 "configure"
|
||||
#line 4982 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char accept(); below. */
|
||||
|
@ -4992,7 +4999,7 @@ accept();
|
|||
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:4996: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:5005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_func_accept=yes"
|
||||
else
|
||||
|
@ -5019,12 +5026,12 @@ fi
|
|||
sim_oldLibs=$SOCKLIBSW
|
||||
SOCKLIBSW="$SOCKLIBSW $sim_cv_lib_sockets"
|
||||
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
|
||||
echo "configure:5023: checking for gethostbyname" >&5
|
||||
echo "configure:5032: checking for gethostbyname" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 5028 "configure"
|
||||
#line 5037 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char gethostbyname(); below. */
|
||||
|
@ -5047,7 +5054,7 @@ gethostbyname();
|
|||
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:5051: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:5060: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_func_gethostbyname=yes"
|
||||
else
|
||||
|
@ -5065,7 +5072,7 @@ if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
|
|||
else
|
||||
echo "$ac_t""no" 1>&6
|
||||
echo $ac_n "checking for main in -lnsl""... $ac_c" 1>&6
|
||||
echo "configure:5069: checking for main in -lnsl" >&5
|
||||
echo "configure:5078: checking for main in -lnsl" >&5
|
||||
ac_lib_var=`echo nsl'_'main | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
|
@ -5073,14 +5080,14 @@ else
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-lnsl $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 5077 "configure"
|
||||
#line 5086 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() {
|
||||
main()
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:5084: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:5093: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||
else
|
||||
|
@ -5140,17 +5147,17 @@ for ac_hdr in string.h strings.h stdlib.h stdlib.h
|
|||
do
|
||||
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
|
||||
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
|
||||
echo "configure:5144: checking for $ac_hdr" >&5
|
||||
echo "configure:5153: 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 5149 "configure"
|
||||
#line 5158 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <$ac_hdr>
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:5154: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:5163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
||||
if test -z "$ac_err"; then
|
||||
rm -rf conftest*
|
||||
|
@ -5177,7 +5184,7 @@ fi
|
|||
done
|
||||
|
||||
echo $ac_n "checking for fabs in -lm""... $ac_c" 1>&6
|
||||
echo "configure:5181: checking for fabs in -lm" >&5
|
||||
echo "configure:5190: checking for fabs in -lm" >&5
|
||||
ac_lib_var=`echo m'_'fabs | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
|
@ -5185,7 +5192,7 @@ else
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-lm $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 5189 "configure"
|
||||
#line 5198 "configure"
|
||||
#include "confdefs.h"
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
|
@ -5196,7 +5203,7 @@ int main() {
|
|||
fabs()
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:5200: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:5209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||
else
|
||||
|
@ -5226,12 +5233,12 @@ fi
|
|||
for ac_func in aint anint sqrt
|
||||
do
|
||||
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
||||
echo "configure:5230: checking for $ac_func" >&5
|
||||
echo "configure:5239: 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 5235 "configure"
|
||||
#line 5244 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char $ac_func(); below. */
|
||||
|
@ -5254,7 +5261,7 @@ $ac_func();
|
|||
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:5258: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:5267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_func_$ac_func=yes"
|
||||
else
|
||||
|
|
|
@ -217,14 +217,12 @@ AC_SUBST(sim_gen)
|
|||
#
|
||||
hw_enabled=no
|
||||
case "${target}" in
|
||||
# start-sanitize-tx3904
|
||||
mips*tx39*)
|
||||
hw_enabled=yes
|
||||
hw_extra_devices="tx3904cpu tx3904irc tx3904tmr tx3904sio"
|
||||
mips_extra_objs="dv-sockser.o"
|
||||
SIM_SUBTARGET="$SIM_SUBTARGET -DTARGET_TX3904=1"
|
||||
;;
|
||||
# end-sanitize-tx3904
|
||||
# start-sanitize-sky
|
||||
mips64r59*-sky-*)
|
||||
mips_extra_objs='$(SIM_SKY_OBJS)'
|
||||
|
|
|
@ -39,9 +39,7 @@ code on the hardware.
|
|||
#include "sim-assert.h"
|
||||
#include "sim-hw.h"
|
||||
|
||||
#if WITH_IGEN
|
||||
#include "itable.h"
|
||||
#endif
|
||||
|
||||
/* start-sanitize-sky */
|
||||
#ifdef TARGET_SKY
|
||||
|
@ -89,13 +87,6 @@ char* pr_addr PARAMS ((SIM_ADDR addr));
|
|||
char* pr_uword64 PARAMS ((uword64 addr));
|
||||
|
||||
|
||||
/* Get the simulator engine description, without including the code: */
|
||||
#if !(WITH_IGEN)
|
||||
#define SIM_MANIFESTS
|
||||
#include "oengine.c"
|
||||
#undef SIM_MANIFESTS
|
||||
#endif
|
||||
|
||||
/* Within interp.c we refer to the sim_state and sim_cpu directly. */
|
||||
#define CPU cpu
|
||||
#define SD sd
|
||||
|
@ -174,9 +165,7 @@ FILE *tracefh = NULL;
|
|||
static void open_trace PARAMS((SIM_DESC sd));
|
||||
#endif /* TRACE */
|
||||
|
||||
#if WITH_IGEN
|
||||
static const char * get_insn_name (sim_cpu *, int);
|
||||
#endif
|
||||
|
||||
/* simulation target board. NULL=canonical */
|
||||
static char* board = NULL;
|
||||
|
@ -314,14 +303,12 @@ static const OPTION mips_options[] =
|
|||
{ {"board", required_argument, NULL, OPTION_BOARD},
|
||||
'\0', "none" /* rely on compile-time string concatenation for other options */
|
||||
|
||||
/* start-sanitize-tx3904 */
|
||||
#define BOARD_JMR3904 "jmr3904"
|
||||
"|" BOARD_JMR3904
|
||||
#define BOARD_JMR3904_PAL "jmr3904pal"
|
||||
"|" BOARD_JMR3904_PAL
|
||||
#define BOARD_JMR3904_DEBUG "jmr3904debug"
|
||||
"|" BOARD_JMR3904_DEBUG
|
||||
/* end-sanitize-tx3904 */
|
||||
|
||||
, "Customize simulation for a particular board.", mips_option_handler },
|
||||
|
||||
|
@ -377,11 +364,9 @@ sim_open (kind, cb, abfd, argv)
|
|||
STATE_WATCHPOINTS (sd)->sizeof_pc = sizeof (PC);
|
||||
STATE_WATCHPOINTS (sd)->interrupt_handler = interrupt_event;
|
||||
|
||||
#if WITH_IGEN
|
||||
/* Initialize the mechanism for doing insn profiling. */
|
||||
CPU_INSN_NAME (cpu) = get_insn_name;
|
||||
CPU_MAX_INSNS (cpu) = nr_itable_entries;
|
||||
#endif
|
||||
|
||||
STATE = 0;
|
||||
|
||||
|
@ -438,7 +423,6 @@ sim_open (kind, cb, abfd, argv)
|
|||
device_init(sd);
|
||||
}
|
||||
|
||||
/* start-sanitize-tx3904 */
|
||||
#if (WITH_HW)
|
||||
if (board != NULL
|
||||
&& (strcmp(board, BOARD_JMR3904) == 0 ||
|
||||
|
@ -446,6 +430,7 @@ sim_open (kind, cb, abfd, argv)
|
|||
strcmp(board, BOARD_JMR3904_DEBUG) == 0))
|
||||
{
|
||||
/* match VIRTUAL memory layout of JMR-TX3904 board */
|
||||
int i;
|
||||
|
||||
/* --- environment --- */
|
||||
|
||||
|
@ -466,10 +451,14 @@ sim_open (kind, cb, abfd, argv)
|
|||
0xA0000000);
|
||||
|
||||
/* DRAM: 0x8800_0000 - 0x89FF_FFFF and 0xA800_0000 - 0xA9FF_FFFF */
|
||||
sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx,0x%0x",
|
||||
0x88000000,
|
||||
32 * 1024 * 1024, /* 32 MB */
|
||||
0xA8000000);
|
||||
for (i=0; i<8; i++) /* 32 MB total */
|
||||
{
|
||||
unsigned size = 4 * 1024 * 1024; /* 4 MB */
|
||||
sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx,0x%0x",
|
||||
0x88000000 + (i * size),
|
||||
size,
|
||||
0xA8000000 + (i * size));
|
||||
}
|
||||
|
||||
/* Dummy memory regions for unsimulated devices */
|
||||
|
||||
|
@ -544,7 +533,6 @@ sim_open (kind, cb, abfd, argv)
|
|||
device_init(sd);
|
||||
}
|
||||
#endif
|
||||
/* end-sanitize-tx3904 */
|
||||
|
||||
|
||||
/* check for/establish the a reference program image */
|
||||
|
@ -756,14 +744,12 @@ open_trace(sd)
|
|||
}
|
||||
#endif /* TRACE */
|
||||
|
||||
#if WITH_IGEN
|
||||
/* Return name of an insn, used by insn profiling. */
|
||||
static const char *
|
||||
get_insn_name (sim_cpu *cpu, int i)
|
||||
{
|
||||
return itable[i].name;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
sim_close (sd, quitting)
|
||||
|
@ -780,9 +766,11 @@ sim_close (sd, quitting)
|
|||
#endif
|
||||
/* end-sanitize-sky */
|
||||
|
||||
|
||||
/* "quitting" is non-zero if we cannot hang on errors */
|
||||
|
||||
/* shut down modules */
|
||||
sim_module_uninstall (sd);
|
||||
|
||||
/* Ensure that any resources allocated through the callback
|
||||
mechanism are released: */
|
||||
sim_io_shutdown (sd);
|
||||
|
@ -1113,7 +1101,9 @@ sim_fetch_register (sd,rn,memory,length)
|
|||
/* NOTE: gdb (the client) stores registers in target byte order
|
||||
while the simulator uses host byte order */
|
||||
#ifdef DEBUG
|
||||
#if 0 /* FIXME: doesn't compile */
|
||||
sim_io_printf(sd,"sim_fetch_register(%d=0x%s,mem) : place simulator registers into memory\n",rn,pr_addr(registers[rn]));
|
||||
#endif
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (cpu->register_widths[rn] == 0)
|
||||
|
@ -1352,8 +1342,10 @@ sim_create_inferior (sd, abfd, argv,env)
|
|||
{
|
||||
|
||||
#ifdef DEBUG
|
||||
#if 0 /* FIXME: doesn't compile */
|
||||
printf("DBG: sim_create_inferior entered: start_address = 0x%s\n",
|
||||
pr_addr(PC));
|
||||
#endif
|
||||
#endif /* DEBUG */
|
||||
|
||||
ColdReset(sd);
|
||||
|
@ -1416,7 +1408,7 @@ fetch_str (SIM_DESC sd,
|
|||
}
|
||||
|
||||
/* Simple monitor interface (currently setup for the IDT and PMON monitors) */
|
||||
static void
|
||||
void
|
||||
sim_monitor (SIM_DESC sd,
|
||||
sim_cpu *cpu,
|
||||
address_word cia,
|
||||
|
@ -1692,7 +1684,9 @@ load_word (SIM_DESC sd,
|
|||
uword64 vaddr)
|
||||
{
|
||||
if ((vaddr & 3) != 0)
|
||||
SignalExceptionAddressLoad ();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, cpu, cia, read_map, AccessLength_WORD+1, vaddr, read_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
address_word paddr;
|
||||
|
@ -2199,6 +2193,11 @@ signal_exception (SIM_DESC sd,
|
|||
/* Ensure that any active atomic read/modify/write operation will fail: */
|
||||
LLBIT = 0;
|
||||
|
||||
/* Save registers before interrupt dispatching */
|
||||
#ifdef SIM_CPU_EXCEPTION_TRIGGER
|
||||
SIM_CPU_EXCEPTION_TRIGGER(sd, cpu, cia);
|
||||
#endif
|
||||
|
||||
switch (exception) {
|
||||
|
||||
case DebugBreakPoint :
|
||||
|
@ -2343,23 +2342,25 @@ signal_exception (SIM_DESC sd,
|
|||
case InstructionFetch:
|
||||
case DataReference:
|
||||
/* The following is so that the simulator will continue from the
|
||||
exception address on breakpoint operations. */
|
||||
PC = EPC;
|
||||
sim_engine_halt (SD, CPU, NULL, NULL_CIA,
|
||||
exception handler address. */
|
||||
sim_engine_halt (SD, CPU, NULL, PC,
|
||||
sim_stopped, SIM_SIGBUS);
|
||||
|
||||
case ReservedInstruction:
|
||||
case CoProcessorUnusable:
|
||||
PC = EPC;
|
||||
sim_engine_halt (SD, CPU, NULL, NULL_CIA,
|
||||
sim_engine_halt (SD, CPU, NULL, PC,
|
||||
sim_stopped, SIM_SIGILL);
|
||||
|
||||
case IntegerOverflow:
|
||||
case FPE:
|
||||
sim_engine_halt (SD, CPU, NULL, NULL_CIA,
|
||||
sim_engine_halt (SD, CPU, NULL, PC,
|
||||
sim_stopped, SIM_SIGFPE);
|
||||
|
||||
case BreakPoint:
|
||||
sim_engine_halt (SD, CPU, NULL, PC, sim_stopped, SIM_SIGTRAP);
|
||||
break;
|
||||
|
||||
case SystemCall:
|
||||
case Trap:
|
||||
sim_engine_restart (SD, CPU, NULL, PC);
|
||||
|
@ -2367,12 +2368,12 @@ signal_exception (SIM_DESC sd,
|
|||
|
||||
case Watch:
|
||||
PC = EPC;
|
||||
sim_engine_halt (SD, CPU, NULL, NULL_CIA,
|
||||
sim_engine_halt (SD, CPU, NULL, PC,
|
||||
sim_stopped, SIM_SIGTRAP);
|
||||
|
||||
default : /* Unknown internal exception */
|
||||
PC = EPC;
|
||||
sim_engine_halt (SD, CPU, NULL, NULL_CIA,
|
||||
sim_engine_halt (SD, CPU, NULL, PC,
|
||||
sim_stopped, SIM_SIGABRT);
|
||||
|
||||
}
|
||||
|
@ -2473,10 +2474,8 @@ undefined_result(sd,cia)
|
|||
#define FPINF_SINGLE (0x7F800000)
|
||||
#define FPINF_DOUBLE (((uword64)0x7FF00000 << 32) | 0x00000000)
|
||||
|
||||
#if 1 /* def DEBUG */
|
||||
#define RMMODE(v) (((v) == FP_RM_NEAREST) ? "Round" : (((v) == FP_RM_TOZERO) ? "Trunc" : (((v) == FP_RM_TOPINF) ? "Ceil" : "Floor")))
|
||||
#define DOFMT(v) (((v) == fmt_single) ? "single" : (((v) == fmt_double) ? "double" : (((v) == fmt_word) ? "word" : (((v) == fmt_long) ? "long" : (((v) == fmt_unknown) ? "<unknown>" : (((v) == fmt_uninterpreted) ? "<uninterpreted>" : "<format error>"))))))
|
||||
#endif /* DEBUG */
|
||||
#define DOFMT(v) (((v) == fmt_single) ? "single" : (((v) == fmt_double) ? "double" : (((v) == fmt_word) ? "word" : (((v) == fmt_long) ? "long" : (((v) == fmt_unknown) ? "<unknown>" : (((v) == fmt_uninterpreted) ? "<uninterpreted>" : (((v) == fmt_uninterpreted_32) ? "<uninterpreted_32>" : (((v) == fmt_uninterpreted_64) ? "<uninterpreted_64>" : "<format error>"))))))))
|
||||
|
||||
uword64
|
||||
value_fpr (SIM_DESC sd,
|
||||
|
@ -2561,6 +2560,11 @@ value_fpr (SIM_DESC sd,
|
|||
case fmt_double:
|
||||
case fmt_long:
|
||||
if ((fpr & 1) == 0) { /* even registers only */
|
||||
#ifdef DEBUG
|
||||
printf("DBG: ValueFPR: FGR[%d] = %s, FGR[%d] = %s\n",
|
||||
fpr+1, pr_uword64( (uword64) FGR[fpr+1] ),
|
||||
fpr, pr_uword64( (uword64) FGR[fpr] ));
|
||||
#endif
|
||||
value = ((((uword64)FGR[fpr+1]) << 32) | (FGR[fpr] & 0xFFFFFFFF));
|
||||
} else {
|
||||
SignalException(ReservedInstruction,0);
|
||||
|
@ -2577,7 +2581,7 @@ value_fpr (SIM_DESC sd,
|
|||
SignalExceptionSimulatorFault ("Unrecognised FP format in ValueFPR()");
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("DBG: ValueFPR: fpr = %d, fmt = %s, value = 0x%s : PC = 0x%s : SizeFGR() = %d\n",fpr,DOFMT(fmt),pr_addr(value),pr_addr(cia),SizeFGR());
|
||||
printf("DBG: ValueFPR: fpr = %d, fmt = %s, value = 0x%s : PC = 0x%s : SizeFGR() = %d\n",fpr,DOFMT(fmt),pr_uword64(value),pr_addr(cia),SizeFGR());
|
||||
#endif /* DEBUG */
|
||||
|
||||
return(value);
|
||||
|
@ -2594,7 +2598,7 @@ store_fpr (SIM_DESC sd,
|
|||
int err = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("DBG: StoreFPR: fpr = %d, fmt = %s, value = 0x%s : PC = 0x%s : SizeFGR() = %d\n",fpr,DOFMT(fmt),pr_addr(value),pr_addr(cia),SizeFGR());
|
||||
printf("DBG: StoreFPR: fpr = %d, fmt = %s, value = 0x%s : PC = 0x%s : SizeFGR() = %d,\n",fpr,DOFMT(fmt),pr_uword64(value),pr_addr(cia),SizeFGR());
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (SizeFGR() == 64) {
|
||||
|
@ -2663,7 +2667,7 @@ store_fpr (SIM_DESC sd,
|
|||
SignalExceptionSimulatorFault ("Unrecognised FP format in StoreFPR()");
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("DBG: StoreFPR: fpr[%d] = 0x%s (format %s)\n",fpr,pr_addr(FGR[fpr]),DOFMT(fmt));
|
||||
printf("DBG: StoreFPR: fpr[%d] = 0x%s (format %s)\n",fpr,pr_uword64(FGR[fpr]),DOFMT(fmt));
|
||||
#endif /* DEBUG */
|
||||
|
||||
return;
|
||||
|
@ -3391,7 +3395,9 @@ convert (SIM_DESC sd,
|
|||
unsigned64 result64;
|
||||
|
||||
#ifdef DEBUG
|
||||
#if 0 /* FIXME: doesn't compile */
|
||||
printf("DBG: Convert: mode %s : op 0x%s : from %s : to %s : (PC = 0x%s)\n",RMMODE(rm),pr_addr(op),DOFMT(from),DOFMT(to),pr_addr(IPC));
|
||||
#endif
|
||||
#endif /* DEBUG */
|
||||
|
||||
switch (rm)
|
||||
|
@ -3530,6 +3536,11 @@ cop_ld (SIM_DESC sd,
|
|||
int coproc_reg,
|
||||
uword64 memword)
|
||||
{
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("DBG: COP_LD: coproc_num = %d, coproc_reg = %d, value = 0x%s : PC = 0x%s\n", coproc_num, coproc_reg, pr_uword64(memword), pr_addr(cia) );
|
||||
#endif
|
||||
|
||||
switch (coproc_num) {
|
||||
case 1:
|
||||
if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT)
|
||||
|
@ -3743,14 +3754,22 @@ decode_coproc (SIM_DESC sd,
|
|||
/* 12 = SR R4000 VR4100 VR4300 */
|
||||
#ifdef SUBTARGET_R3900
|
||||
case 3:
|
||||
/* ignore */
|
||||
break;
|
||||
/* 3 = Config R3900 */
|
||||
|
||||
case 7:
|
||||
/* 7 = Cache R3900 */
|
||||
case 15:
|
||||
/* 15 = PRID R3900 */
|
||||
|
||||
/* ignore */
|
||||
break;
|
||||
/* 3 = Cache R3900 */
|
||||
|
||||
case 8:
|
||||
/* 8 = BadVAddr R4000 VR4100 VR4300 */
|
||||
if (code == 0x00)
|
||||
GPR[rt] = COP0_BADVADDR;
|
||||
else
|
||||
COP0_BADVADDR = GPR[rt];
|
||||
break;
|
||||
|
||||
#endif /* SUBTARGET_R3900 */
|
||||
case 12:
|
||||
|
@ -3819,9 +3838,9 @@ decode_coproc (SIM_DESC sd,
|
|||
COP0_GPR[rd] = GPR[rt];
|
||||
#if 0
|
||||
if (code == 0x00)
|
||||
sim_io_printf(sd,"Warning: MFC0 %d,%d ignored (architecture specific)\n",rt,rd);
|
||||
sim_io_printf(sd,"Warning: MFC0 %d,%d ignored, PC=%08x (architecture specific)\n",rt,rd, (unsigned)cia);
|
||||
else
|
||||
sim_io_printf(sd,"Warning: MTC0 %d,%d ignored (architecture specific)\n",rt,rd);
|
||||
sim_io_printf(sd,"Warning: MTC0 %d,%d ignored, PC=%08x (architecture specific)\n",rt,rd, (unsigned)cia);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -4084,215 +4103,6 @@ decode_coproc (SIM_DESC sd,
|
|||
}
|
||||
|
||||
|
||||
/*-- instruction simulation -------------------------------------------------*/
|
||||
|
||||
/* When the IGEN simulator is being built, the function below is be
|
||||
replaced by a generated version. However, WITH_IGEN == 2 indicates
|
||||
that the fubction below should be compiled but under a different
|
||||
name (to allow backward compatibility) */
|
||||
|
||||
#if (WITH_IGEN != 1)
|
||||
#if (WITH_IGEN > 1)
|
||||
void old_engine_run PARAMS ((SIM_DESC sd, int next_cpu_nr, int siggnal));
|
||||
void
|
||||
old_engine_run (sd, next_cpu_nr, nr_cpus, siggnal)
|
||||
#else
|
||||
void
|
||||
sim_engine_run (sd, next_cpu_nr, nr_cpus, siggnal)
|
||||
#endif
|
||||
SIM_DESC sd;
|
||||
int next_cpu_nr; /* ignore */
|
||||
int nr_cpus; /* ignore */
|
||||
int siggnal; /* ignore */
|
||||
{
|
||||
sim_cpu *cpu = STATE_CPU (sd, 0); /* hardwire to cpu 0 */
|
||||
#if !defined(FASTSIM)
|
||||
unsigned int pipeline_count = 1;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
if (STATE_MEMORY (sd) == NULL) {
|
||||
printf("DBG: simulate() entered with no memory\n");
|
||||
exit(1);
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
#if 0 /* Disabled to check that everything works OK */
|
||||
/* The VR4300 seems to sign-extend the PC on its first
|
||||
access. However, this may just be because it is currently
|
||||
configured in 32bit mode. However... */
|
||||
PC = SIGNEXTEND(PC,32);
|
||||
#endif
|
||||
|
||||
/* main controlling loop */
|
||||
while (1) {
|
||||
/* vaddr is slowly being replaced with cia - current instruction
|
||||
address */
|
||||
address_word cia = (uword64)PC;
|
||||
address_word vaddr = cia;
|
||||
address_word paddr;
|
||||
int cca;
|
||||
unsigned int instruction; /* uword64? what's this used for? FIXME! */
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
printf("DBG: state = 0x%08X :",state);
|
||||
if (state & simHALTEX) printf(" simHALTEX");
|
||||
if (state & simHALTIN) printf(" simHALTIN");
|
||||
printf("\n");
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
DSSTATE = (STATE & simDELAYSLOT);
|
||||
#ifdef DEBUG
|
||||
if (dsstate)
|
||||
sim_io_printf(sd,"DBG: DSPC = 0x%s\n",pr_addr(DSPC));
|
||||
#endif /* DEBUG */
|
||||
|
||||
/* Fetch the next instruction from the simulator memory: */
|
||||
if (AddressTranslation(cia,isINSTRUCTION,isLOAD,&paddr,&cca,isTARGET,isREAL)) {
|
||||
if ((vaddr & 1) == 0) {
|
||||
/* Copy the action of the LW instruction */
|
||||
unsigned int reverse = (ReverseEndian ? (LOADDRMASK >> 2) : 0);
|
||||
unsigned int bigend = (BigEndianCPU ? (LOADDRMASK >> 2) : 0);
|
||||
uword64 value;
|
||||
unsigned int byte;
|
||||
paddr = ((paddr & ~LOADDRMASK) | ((paddr & LOADDRMASK) ^ (reverse << 2)));
|
||||
LoadMemory(&value,NULL,cca,AccessLength_WORD,paddr,vaddr,isINSTRUCTION,isREAL);
|
||||
byte = ((vaddr & LOADDRMASK) ^ (bigend << 2));
|
||||
instruction = ((value >> (8 * byte)) & 0xFFFFFFFF);
|
||||
} else {
|
||||
/* Copy the action of the LH instruction */
|
||||
unsigned int reverse = (ReverseEndian ? (LOADDRMASK >> 1) : 0);
|
||||
unsigned int bigend = (BigEndianCPU ? (LOADDRMASK >> 1) : 0);
|
||||
uword64 value;
|
||||
unsigned int byte;
|
||||
paddr = (((paddr & ~ (uword64) 1) & ~LOADDRMASK)
|
||||
| (((paddr & ~ (uword64) 1) & LOADDRMASK) ^ (reverse << 1)));
|
||||
LoadMemory(&value,NULL,cca, AccessLength_HALFWORD,
|
||||
paddr & ~ (uword64) 1,
|
||||
vaddr, isINSTRUCTION, isREAL);
|
||||
byte = (((vaddr &~ (uword64) 1) & LOADDRMASK) ^ (bigend << 1));
|
||||
instruction = ((value >> (8 * byte)) & 0xFFFF);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr,"Cannot translate address for PC = 0x%s failed\n",pr_addr(PC));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
sim_io_printf(sd,"DBG: fetched 0x%08X from PC = 0x%s\n",instruction,pr_addr(PC));
|
||||
#endif /* DEBUG */
|
||||
|
||||
/* This is required by exception processing, to ensure that we can
|
||||
cope with exceptions in the delay slots of branches that may
|
||||
already have changed the PC. */
|
||||
if ((vaddr & 1) == 0)
|
||||
PC += 4; /* increment ready for the next fetch */
|
||||
else
|
||||
PC += 2;
|
||||
/* NOTE: If we perform a delay slot change to the PC, this
|
||||
increment is not requuired. However, it would make the
|
||||
simulator more complicated to try and avoid this small hit. */
|
||||
|
||||
/* Currently this code provides a simple model. For more
|
||||
complicated models we could perform exception status checks at
|
||||
this point, and set the simSTOP state as required. This could
|
||||
also include processing any hardware interrupts raised by any
|
||||
I/O model attached to the simulator context.
|
||||
|
||||
Support for "asynchronous" I/O events within the simulated world
|
||||
could be providing by managing a counter, and calling a I/O
|
||||
specific handler when a particular threshold is reached. On most
|
||||
architectures a decrement and check for zero operation is
|
||||
usually quicker than an increment and compare. However, the
|
||||
process of managing a known value decrement to zero, is higher
|
||||
than the cost of using an explicit value UINT_MAX into the
|
||||
future. Which system is used will depend on how complicated the
|
||||
I/O model is, and how much it is likely to affect the simulator
|
||||
bandwidth.
|
||||
|
||||
If events need to be scheduled further in the future than
|
||||
UINT_MAX event ticks, then the I/O model should just provide its
|
||||
own counter, triggered from the event system. */
|
||||
|
||||
/* MIPS pipeline ticks. To allow for future support where the
|
||||
pipeline hit of individual instructions is known, this control
|
||||
loop manages a "pipeline_count" variable. It is initialised to
|
||||
1 (one), and will only be changed by the simulator engine when
|
||||
executing an instruction. If the engine does not have access to
|
||||
pipeline cycle count information then all instructions will be
|
||||
treated as using a single cycle. NOTE: A standard system is not
|
||||
provided by the default simulator because different MIPS
|
||||
architectures have different cycle counts for the same
|
||||
instructions.
|
||||
|
||||
[NOTE: pipeline_count has been replaced the event queue] */
|
||||
|
||||
/* shuffle the floating point status pipeline state */
|
||||
ENGINE_ISSUE_PREFIX_HOOK();
|
||||
|
||||
/* NOTE: For multi-context simulation environments the "instruction"
|
||||
variable should be local to this routine. */
|
||||
|
||||
/* Shorthand accesses for engine. Note: If we wanted to use global
|
||||
variables (and a single-threaded simulator engine), then we can
|
||||
create the actual variables with these names. */
|
||||
|
||||
if (!(STATE & simSKIPNEXT)) {
|
||||
/* Include the simulator engine */
|
||||
#include "oengine.c"
|
||||
#if ((GPRLEN == 64) && !PROCESSOR_64BIT) || ((GPRLEN == 32) && PROCESSOR_64BIT)
|
||||
#error "Mismatch between run-time simulator code and simulation engine"
|
||||
#endif
|
||||
#if (WITH_TARGET_WORD_BITSIZE != GPRLEN)
|
||||
#error "Mismatch between configure WITH_TARGET_WORD_BITSIZE and gencode GPRLEN"
|
||||
#endif
|
||||
#if ((WITH_FLOATING_POINT == HARD_FLOATING_POINT) != defined (HASFPU))
|
||||
#error "Mismatch between configure WITH_FLOATING_POINT and gencode HASFPU"
|
||||
#endif
|
||||
|
||||
/* For certain MIPS architectures, GPR[0] is hardwired to zero. We
|
||||
should check for it being changed. It is better doing it here,
|
||||
than within the simulator, since it will help keep the simulator
|
||||
small. */
|
||||
if (ZERO != 0) {
|
||||
#if defined(WARN_ZERO)
|
||||
sim_io_eprintf(sd,"The ZERO register has been updated with 0x%s (PC = 0x%s) (reset back to zero)\n",pr_addr(ZERO),pr_addr(cia));
|
||||
#endif /* WARN_ZERO */
|
||||
ZERO = 0; /* reset back to zero before next instruction */
|
||||
}
|
||||
} else /* simSKIPNEXT check */
|
||||
STATE &= ~simSKIPNEXT;
|
||||
|
||||
/* If the delay slot was active before the instruction is
|
||||
executed, then update the PC to its new value: */
|
||||
if (DSSTATE) {
|
||||
#ifdef DEBUG
|
||||
printf("DBG: dsstate set before instruction execution - updating PC to 0x%s\n",pr_addr(DSPC));
|
||||
#endif /* DEBUG */
|
||||
PC = DSPC;
|
||||
CANCELDELAYSLOT();
|
||||
}
|
||||
|
||||
#if !defined(FASTSIM)
|
||||
if (sim_events_tickn (sd, pipeline_count))
|
||||
{
|
||||
/* cpu->cia = cia; */
|
||||
sim_events_process (sd);
|
||||
}
|
||||
#else
|
||||
if (sim_events_tick (sd))
|
||||
{
|
||||
/* cpu->cia = cia; */
|
||||
sim_events_process (sd);
|
||||
}
|
||||
#endif /* FASTSIM */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* This code copied from gdb's utils.c. Would like to share this code,
|
||||
but don't know of a common place where both could get to it. */
|
||||
|
||||
|
@ -4347,6 +4157,101 @@ pr_uword64(addr)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
mips_core_signal (SIM_DESC sd,
|
||||
sim_cpu *cpu,
|
||||
sim_cia cia,
|
||||
unsigned map,
|
||||
int nr_bytes,
|
||||
address_word addr,
|
||||
transfer_type transfer,
|
||||
sim_core_signals sig)
|
||||
{
|
||||
const char *copy = (transfer == read_transfer ? "read" : "write");
|
||||
address_word ip = CIA_ADDR (cia);
|
||||
|
||||
switch (sig)
|
||||
{
|
||||
case sim_core_unmapped_signal:
|
||||
sim_io_eprintf (sd, "mips-core: %d byte %s to unmapped address 0x%lx at 0x%lx\n",
|
||||
nr_bytes, copy,
|
||||
(unsigned long) addr, (unsigned long) ip);
|
||||
COP0_BADVADDR = addr;
|
||||
SignalExceptionDataReference();
|
||||
break;
|
||||
|
||||
case sim_core_unaligned_signal:
|
||||
sim_io_eprintf (sd, "mips-core: %d byte %s to unaligned address 0x%lx at 0x%lx\n",
|
||||
nr_bytes, copy,
|
||||
(unsigned long) addr, (unsigned long) ip);
|
||||
COP0_BADVADDR = addr;
|
||||
if(transfer == read_transfer)
|
||||
SignalExceptionAddressLoad();
|
||||
else
|
||||
SignalExceptionAddressStore();
|
||||
break;
|
||||
|
||||
default:
|
||||
sim_engine_abort (sd, cpu, cia,
|
||||
"mips_core_signal - internal error - bad switch");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mips_cpu_exception_trigger(SIM_DESC sd, sim_cpu* cpu, address_word cia)
|
||||
{
|
||||
ASSERT(cpu != NULL);
|
||||
|
||||
if(cpu->exc_suspended > 0)
|
||||
sim_io_eprintf(sd, "Warning, nested exception triggered (%d)\n", cpu->exc_suspended);
|
||||
|
||||
PC = cia;
|
||||
memcpy(cpu->exc_trigger_registers, cpu->registers, sizeof(cpu->exc_trigger_registers));
|
||||
cpu->exc_suspended = 0;
|
||||
}
|
||||
|
||||
void
|
||||
mips_cpu_exception_suspend(SIM_DESC sd, sim_cpu* cpu, int exception)
|
||||
{
|
||||
ASSERT(cpu != NULL);
|
||||
|
||||
if(cpu->exc_suspended > 0)
|
||||
sim_io_eprintf(sd, "Warning, nested exception signal (%d then %d)\n",
|
||||
cpu->exc_suspended, exception);
|
||||
|
||||
memcpy(cpu->exc_suspend_registers, cpu->registers, sizeof(cpu->exc_suspend_registers));
|
||||
memcpy(cpu->registers, cpu->exc_trigger_registers, sizeof(cpu->registers));
|
||||
cpu->exc_suspended = exception;
|
||||
}
|
||||
|
||||
void
|
||||
mips_cpu_exception_resume(SIM_DESC sd, sim_cpu* cpu, int exception)
|
||||
{
|
||||
ASSERT(cpu != NULL);
|
||||
|
||||
if(exception == 0 && cpu->exc_suspended > 0)
|
||||
{
|
||||
/* warn not for breakpoints */
|
||||
if(cpu->exc_suspended != sim_signal_to_host(sd, SIM_SIGTRAP))
|
||||
sim_io_eprintf(sd, "Warning, resuming but ignoring pending exception signal (%d)\n",
|
||||
cpu->exc_suspended);
|
||||
}
|
||||
else if(exception != 0 && cpu->exc_suspended > 0)
|
||||
{
|
||||
if(exception != cpu->exc_suspended)
|
||||
sim_io_eprintf(sd, "Warning, resuming with unmatching exception signal (%d vs %d)\n",
|
||||
cpu->exc_suspended, exception);
|
||||
|
||||
memcpy(cpu->registers, cpu->exc_suspend_registers, sizeof(cpu->registers));
|
||||
}
|
||||
else if(exception != 0 && cpu->exc_suspended == 0)
|
||||
{
|
||||
sim_io_eprintf(sd, "Warning, ignoring spontanous exception signal (%d)\n", exception);
|
||||
}
|
||||
cpu->exc_suspended = 0;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*> EOF interp.c <*/
|
||||
|
|
|
@ -1288,7 +1288,7 @@
|
|||
|
||||
|
||||
|
||||
:function:64::void:do_daddiu:int rs, int rt, unsigned16 immediate
|
||||
:function:::void:do_daddiu:int rs, int rt, unsigned16 immediate
|
||||
{
|
||||
TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
|
||||
GPR[rt] = GPR[rs] + EXTEND16 (immediate);
|
||||
|
@ -1356,28 +1356,32 @@
|
|||
|
||||
|
||||
|
||||
:function:64::void:do_ddiv:int rs, int rt
|
||||
:function:::void:do_ddiv:int rs, int rt
|
||||
{
|
||||
check_div_hilo (SD_, HIHISTORY, LOHISTORY);
|
||||
TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
|
||||
{
|
||||
signed64 n = GPR[rs];
|
||||
signed64 d = GPR[rt];
|
||||
signed64 hi;
|
||||
signed64 lo;
|
||||
if (d == 0)
|
||||
{
|
||||
LO = SIGNED64 (0x8000000000000000);
|
||||
HI = 0;
|
||||
lo = SIGNED64 (0x8000000000000000);
|
||||
hi = 0;
|
||||
}
|
||||
else if (d == -1 && n == SIGNED64 (0x8000000000000000))
|
||||
{
|
||||
LO = SIGNED64 (0x8000000000000000);
|
||||
HI = 0;
|
||||
lo = SIGNED64 (0x8000000000000000);
|
||||
hi = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
LO = (n / d);
|
||||
HI = (n % d);
|
||||
lo = (n / d);
|
||||
hi = (n % d);
|
||||
}
|
||||
HI = hi;
|
||||
LO = lo;
|
||||
}
|
||||
TRACE_ALU_RESULT2 (HI, LO);
|
||||
}
|
||||
|
@ -1409,23 +1413,27 @@
|
|||
|
||||
|
||||
|
||||
:function:64::void:do_ddivu:int rs, int rt
|
||||
:function:::void:do_ddivu:int rs, int rt
|
||||
{
|
||||
check_div_hilo (SD_, HIHISTORY, LOHISTORY);
|
||||
TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
|
||||
{
|
||||
unsigned64 n = GPR[rs];
|
||||
unsigned64 d = GPR[rt];
|
||||
unsigned64 hi;
|
||||
unsigned64 lo;
|
||||
if (d == 0)
|
||||
{
|
||||
LO = SIGNED64 (0x8000000000000000);
|
||||
HI = 0;
|
||||
lo = SIGNED64 (0x8000000000000000);
|
||||
hi = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
LO = (n / d);
|
||||
HI = (n % d);
|
||||
lo = (n / d);
|
||||
hi = (n % d);
|
||||
}
|
||||
HI = hi;
|
||||
LO = lo;
|
||||
}
|
||||
TRACE_ALU_RESULT2 (HI, LO);
|
||||
}
|
||||
|
@ -1683,6 +1691,16 @@
|
|||
do_dmultu (SD_, RS, RT, RD);
|
||||
}
|
||||
|
||||
:function:::void:do_dsll:int rt, int rd, int shift
|
||||
{
|
||||
GPR[rd] = GPR[rt] << shift;
|
||||
}
|
||||
|
||||
:function:::void:do_dsllv:int rs, int rt, int rd
|
||||
{
|
||||
int s = MASKED64 (GPR[rs], 5, 0);
|
||||
GPR[rd] = GPR[rt] << s;
|
||||
}
|
||||
|
||||
|
||||
00000000000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
|
||||
|
@ -1707,8 +1725,7 @@
|
|||
*tx19:
|
||||
// end-sanitize-tx19
|
||||
{
|
||||
int s = SHIFT;
|
||||
GPR[RD] = GPR[RT] << s;
|
||||
do_dsll (SD_, RT, RD, SHIFT);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1738,8 +1755,6 @@
|
|||
GPR[RD] = GPR[RT] << s;
|
||||
}
|
||||
|
||||
|
||||
|
||||
000000,5.RS,5.RT,5.RD,00000010100:SPECIAL:64::DSLLV
|
||||
"dsllv r<RD>, r<RT>, r<RS>"
|
||||
*mipsIII:
|
||||
|
@ -1762,10 +1777,13 @@
|
|||
*tx19:
|
||||
// end-sanitize-tx19
|
||||
{
|
||||
int s = MASKED64 (GPR[RS], 5, 0);
|
||||
GPR[RD] = GPR[RT] << s;
|
||||
do_dsllv (SD_, RS, RT, RD);
|
||||
}
|
||||
|
||||
:function:::void:do_dsra:int rt, int rd, int shift
|
||||
{
|
||||
GPR[rd] = ((signed64) GPR[rt]) >> shift;
|
||||
}
|
||||
|
||||
|
||||
00000000000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
|
||||
|
@ -1790,8 +1808,7 @@
|
|||
*tx19:
|
||||
// end-sanitize-tx19
|
||||
{
|
||||
int s = SHIFT;
|
||||
GPR[RD] = ((signed64) GPR[RT]) >> s;
|
||||
do_dsra (SD_, RT, RD, SHIFT);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1855,6 +1872,11 @@
|
|||
do_dsrav (SD_, RS, RT, RD);
|
||||
}
|
||||
|
||||
:function:::void:do_dsrl:int rt, int rd, int shift
|
||||
{
|
||||
GPR[rd] = (unsigned64) GPR[rt] >> shift;
|
||||
}
|
||||
|
||||
|
||||
00000000000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
|
||||
"dsrl r<RD>, r<RT>, <SHIFT>"
|
||||
|
@ -1878,8 +1900,7 @@
|
|||
*tx19:
|
||||
// end-sanitize-tx19
|
||||
{
|
||||
int s = SHIFT;
|
||||
GPR[RD] = (unsigned64) GPR[RT] >> s;
|
||||
do_dsrl (SD_, RT, RD, SHIFT);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1910,6 +1931,14 @@
|
|||
}
|
||||
|
||||
|
||||
:function:::void:do_dsrlv:int rs, int rt, int rd
|
||||
{
|
||||
int s = MASKED64 (GPR[rs], 5, 0);
|
||||
GPR[rd] = (unsigned64) GPR[rt] >> s;
|
||||
}
|
||||
|
||||
|
||||
|
||||
000000,5.RS,5.RT,5.RD,00000010110:SPECIAL:64::DSRLV
|
||||
"dsrl32 r<RD>, r<RT>, r<RS>"
|
||||
*mipsIII:
|
||||
|
@ -1932,8 +1961,7 @@
|
|||
*tx19:
|
||||
// end-sanitize-tx19
|
||||
{
|
||||
int s = MASKED64 (GPR[RS], 5, 0);
|
||||
GPR[RD] = (unsigned64) GPR[RT] >> s;
|
||||
do_dsrlv (SD_, RS, RT, RD);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2060,7 +2088,6 @@
|
|||
DELAY_SLOT (region | (INSTR_INDEX << 2));
|
||||
}
|
||||
|
||||
|
||||
000000,5.RS,00000,5.RD,00000001001:SPECIAL:32::JALR
|
||||
"jalr r<RS>":RD == 31
|
||||
"jalr r<RD>, r<RS>"
|
||||
|
@ -2129,7 +2156,9 @@
|
|||
|
||||
vaddr = base + offset;
|
||||
if ((vaddr & access) != 0)
|
||||
SignalExceptionAddressLoad ();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, access+1, vaddr, read_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
|
||||
paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
|
||||
LoadMemory (&memval, NULL, uncached, access, paddr, vaddr, isDATA, isREAL);
|
||||
|
@ -2379,7 +2408,9 @@
|
|||
address_word paddr;
|
||||
int uncached;
|
||||
if ((vaddr & 3) != 0)
|
||||
SignalExceptionAddressLoad();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, read_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
|
||||
|
@ -2433,7 +2464,9 @@
|
|||
address_word paddr;
|
||||
int uncached;
|
||||
if ((vaddr & 7) != 0)
|
||||
SignalExceptionAddressLoad();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, read_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
|
||||
|
@ -3098,7 +3131,9 @@
|
|||
|
||||
vaddr = base + offset;
|
||||
if ((vaddr & access) != 0)
|
||||
SignalExceptionAddressStore ();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, access+1, vaddr, write_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
|
||||
paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
|
||||
byte = ((vaddr & mask) ^ bigendiancpu);
|
||||
|
@ -3165,7 +3200,9 @@
|
|||
address_word paddr;
|
||||
int uncached;
|
||||
if ((vaddr & 3) != 0)
|
||||
SignalExceptionAddressStore();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
|
||||
|
@ -3219,7 +3256,9 @@
|
|||
address_word paddr;
|
||||
int uncached;
|
||||
if ((vaddr & 7) != 0)
|
||||
SignalExceptionAddressStore();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, write_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
|
||||
|
@ -4544,13 +4583,6 @@
|
|||
010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1a
|
||||
"bc1%s<TF>%s<ND> <OFFSET>"
|
||||
*mipsI,mipsII,mipsIII:
|
||||
*vr4100:
|
||||
// start-sanitize-vr4xxx
|
||||
*vr4121:
|
||||
// end-sanitize-vr4xxx
|
||||
// start-sanitize-vr4320
|
||||
*vr4320:
|
||||
// end-sanitize-vr4320
|
||||
// start-sanitize-r5900
|
||||
*r5900:
|
||||
// end-sanitize-r5900
|
||||
|
@ -4575,11 +4607,23 @@
|
|||
}
|
||||
}
|
||||
|
||||
// start-sanitize-vr4xxx
|
||||
// FIXME: vr4100,vr4320, and 4121 all should be in the
|
||||
// previous insn, but the renameing thing wasn't working
|
||||
// so I cheated -gavin
|
||||
// end-sanitize-vr4xxx
|
||||
010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1b
|
||||
"bc1%s<TF>%s<ND> <OFFSET>":CC == 0
|
||||
"bc1%s<TF>%s<ND> <CC>, <OFFSET>"
|
||||
*mipsIV:
|
||||
*vr5000:
|
||||
#*vr4100:
|
||||
// start-sanitize-vr4320
|
||||
//*vr4320:
|
||||
// end-sanitize-vr4320
|
||||
// start-sanitize-vr4xxx
|
||||
*vr4121:
|
||||
// end-sanitize-vr4xxx
|
||||
// start-sanitize-cygnus
|
||||
*vr5400:
|
||||
// end-sanitize-cygnus
|
||||
|
@ -4751,7 +4795,7 @@
|
|||
|
||||
// CFC1
|
||||
// CTC1
|
||||
010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
|
||||
010001,00,X,10,5.RT,5.FS,00000000000:COP1Sa:32::CxC1
|
||||
"c%s<X>c1 r<RT>, f<FS>"
|
||||
*mipsI:
|
||||
*mipsII:
|
||||
|
@ -4775,7 +4819,7 @@
|
|||
/* else NOP */
|
||||
}
|
||||
}
|
||||
010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
|
||||
010001,00,X,10,5.RT,5.FS,00000000000:COP1Sb:32::CxC1
|
||||
"c%s<X>c1 r<RT>, f<FS>"
|
||||
*mipsIV:
|
||||
*vr4100:
|
||||
|
@ -5003,7 +5047,7 @@
|
|||
|
||||
// DMFC1
|
||||
// DMTC1
|
||||
010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
|
||||
010001,00,X,01,5.RT,5.FS,00000000000:COP1Sa:64::DMxC1
|
||||
"dm%s<X>c1 r<RT>, f<FS>"
|
||||
*mipsIII:
|
||||
{
|
||||
|
@ -5027,7 +5071,7 @@
|
|||
PENDING_FILL(RT,SET64HI(0xDEADC0DE) | 0xBAD0BAD0);
|
||||
}
|
||||
}
|
||||
010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
|
||||
010001,00,X,01,5.RT,5.FS,00000000000:COP1Sb:64::DMxC1
|
||||
"dm%s<X>c1 r<RT>, f<FS>"
|
||||
*mipsIV:
|
||||
*vr4100:
|
||||
|
@ -5273,7 +5317,7 @@
|
|||
|
||||
// MFC1
|
||||
// MTC1
|
||||
010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
|
||||
010001,00,X,00,5.RT,5.FS,00000000000:COP1Sa:32::MxC1
|
||||
"m%s<X>c1 r<RT>, f<FS>"
|
||||
*mipsI:
|
||||
*mipsII:
|
||||
|
@ -5289,7 +5333,7 @@
|
|||
else /*MFC1*/
|
||||
PENDING_FILL (RT, SIGNEXTEND(FGR[FS],32));
|
||||
}
|
||||
010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
|
||||
010001,00,X,00,5.RT,5.FS,00000000000:COP1Sb:32::MxC1
|
||||
"m%s<X>c1 r<RT>, f<FS>"
|
||||
*mipsIV:
|
||||
*vr4100:
|
||||
|
@ -5942,7 +5986,9 @@
|
|||
address_word paddr;
|
||||
int uncached;
|
||||
if ((vaddr & 3) != 0)
|
||||
SignalExceptionAddressStore();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, CPU, cia, read_map, AccessLength_WORD+1, vaddr, write_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
|
||||
|
@ -5983,7 +6029,9 @@
|
|||
address_word paddr;
|
||||
int uncached;
|
||||
if ((vaddr & 3) != 0)
|
||||
SignalExceptionAddressStore();
|
||||
{
|
||||
SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer, sim_core_unaligned_signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
|
||||
|
|
|
@ -32,6 +32,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#define WITH_WATCHPOINTS 1
|
||||
#define WITH_MODULO_MEMORY 1
|
||||
|
||||
|
||||
#define SIM_CORE_SIGNAL(SD,CPU,CIA,MAP,NR_BYTES,ADDR,TRANSFER,ERROR) \
|
||||
mips_core_signal ((SD), (CPU), (CIA), (MAP), (NR_BYTES), (ADDR), (TRANSFER), (ERROR))
|
||||
|
||||
#include "sim-basics.h"
|
||||
|
||||
typedef address_word sim_cia;
|
||||
|
@ -124,11 +128,13 @@ convert (SD, CPU, cia, rm, op, from, to)
|
|||
instruction: */
|
||||
#define PREVCOC1() ((STATE & simPCOC1) ? 1 : 0)
|
||||
|
||||
#if 1
|
||||
#define SizeFGR() (WITH_TARGET_FLOATING_POINT_BITSIZE)
|
||||
#ifdef TARGET_ENABLE_FR
|
||||
/* FIXME: this should be enabled for all targets, but needs testing first. */
|
||||
#define SizeFGR() (((WITH_TARGET_FLOATING_POINT_BITSIZE) == 64) \
|
||||
? ((SR & status_FR) ? 64 : 32) \
|
||||
: (WITH_TARGET_FLOATING_POINT_BITSIZE))
|
||||
#else
|
||||
/* They depend on the CPU being simulated */
|
||||
#define SizeFGR() ((WITH_TARGET_WORD_BITSIZE == 64 && ((SR & status_FR) == 1)) ? 64 : 32)
|
||||
#define SizeFGR() (WITH_TARGET_FLOATING_POINT_BITSIZE)
|
||||
#endif
|
||||
|
||||
/* Standard FCRS bits: */
|
||||
|
@ -608,6 +614,7 @@ enum float_operation
|
|||
manifests to access the correct slot. */
|
||||
|
||||
unsigned_word registers[LAST_EMBED_REGNUM + 1];
|
||||
|
||||
int register_widths[NUM_REGS];
|
||||
#define REGISTERS ((CPU)->registers)
|
||||
|
||||
|
@ -640,6 +647,16 @@ enum float_operation
|
|||
#define EPC (REGISTERS[88])
|
||||
#define COCIDX (LAST_EMBED_REGNUM + 2) /* special case : outside the normal range */
|
||||
|
||||
/* All internal state modified by signal_exception() that may need to be
|
||||
rolled back for passing moment-of-exception image back to gdb. */
|
||||
unsigned_word exc_trigger_registers[LAST_EMBED_REGNUM + 1];
|
||||
unsigned_word exc_suspend_registers[LAST_EMBED_REGNUM + 1];
|
||||
int exc_suspended;
|
||||
|
||||
#define SIM_CPU_EXCEPTION_TRIGGER(SD,CPU,CIA) mips_cpu_exception_trigger(SD,CPU,CIA)
|
||||
#define SIM_CPU_EXCEPTION_SUSPEND(SD,CPU,EXC) mips_cpu_exception_suspend(SD,CPU,EXC)
|
||||
#define SIM_CPU_EXCEPTION_RESUME(SD,CPU,EXC) mips_cpu_exception_resume(SD,CPU,EXC)
|
||||
|
||||
unsigned_word c0_config_reg;
|
||||
#define C0_CONFIG ((CPU)->c0_config_reg)
|
||||
|
||||
|
@ -679,7 +696,9 @@ enum float_operation
|
|||
#define COP0_CONTEXT ((unsigned32)(COP0_GPR[4]))
|
||||
#define COP0_PAGEMASK ((unsigned32)(COP0_GPR[5]))
|
||||
#define COP0_WIRED ((unsigned32)(COP0_GPR[6]))
|
||||
/* end-sanitize-r5900 */
|
||||
#define COP0_BADVADDR ((unsigned32)(COP0_GPR[8]))
|
||||
/* start-sanitize-r5900 */
|
||||
#define COP0_COUNT ((unsigned32)(COP0_GPR[9]))
|
||||
#define COP0_ENTRYHI ((unsigned32)(COP0_GPR[10]))
|
||||
#define COP0_COMPARE ((unsigned32)(COP0_GPR[11]))
|
||||
|
@ -995,6 +1014,7 @@ void signal_exception (SIM_DESC sd, sim_cpu *cpu, address_word cia, int exceptio
|
|||
#define SignalExceptionInstructionFetch() signal_exception (SD, CPU, cia, InstructionFetch)
|
||||
#define SignalExceptionAddressStore() signal_exception (SD, CPU, cia, AddressStore)
|
||||
#define SignalExceptionAddressLoad() signal_exception (SD, CPU, cia, AddressLoad)
|
||||
#define SignalExceptionDataReference() signal_exception (SD, CPU, cia, DataReference)
|
||||
#define SignalExceptionSimulatorFault(buf) signal_exception (SD, CPU, cia, SimulatorFault, buf)
|
||||
#define SignalExceptionFPE() signal_exception (SD, CPU, cia, FPE)
|
||||
#define SignalExceptionIntegerOverflow() signal_exception (SD, CPU, cia, IntegerOverflow)
|
||||
|
@ -1116,6 +1136,7 @@ void dotrace PARAMS ((SIM_DESC sd, sim_cpu *cpu, FILE *tracefh, int type, SIM_AD
|
|||
extern FILE *tracefh;
|
||||
|
||||
INLINE_SIM_MAIN (void) pending_tick PARAMS ((SIM_DESC sd, sim_cpu *cpu, address_word cia));
|
||||
extern SIM_CORE_SIGNAL_FN mips_core_signal;
|
||||
|
||||
char* pr_addr PARAMS ((SIM_ADDR addr));
|
||||
char* pr_uword64 PARAMS ((uword64 addr));
|
||||
|
@ -1176,6 +1197,11 @@ enum txvu_cpu_context
|
|||
#endif /* TARGET_SKY */
|
||||
/* end-sanitize-sky */
|
||||
|
||||
void mips_cpu_exception_trigger(SIM_DESC sd, sim_cpu* cpu, address_word pc);
|
||||
void mips_cpu_exception_suspend(SIM_DESC sd, sim_cpu* cpu, int exception);
|
||||
void mips_cpu_exception_resume(SIM_DESC sd, sim_cpu* cpu, int exception);
|
||||
|
||||
|
||||
#if H_REVEALS_MODULE_P (SIM_MAIN_INLINE)
|
||||
#include "sim-main.c"
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue