(SIM_OBJS,SIM_EXTRA_CFLAGS,SIM_EXTRA_CLEAN): Define.
* configure.in: Simplify using macros in ../common/aclocal.m4.
Call AC_CHECK_HEADERS(unistd.h).
* configure: Regenerated.
* config.in: New file.
* interp.c: #include "callback.h".
* simops.c: #include "config.h". #include <unistd.h> if present.
+Wed Nov 20 01:23:03 1996 Doug Evans <dje@canuck.cygnus.com>
+
+ * Makefile.in: Delete all stuff moved to ../common/Make-common.in.
+ (SIM_OBJS,SIM_EXTRA_CFLAGS,SIM_EXTRA_CLEAN): Define.
+ * configure.in: Simplify using macros in ../common/aclocal.m4.
+ Call AC_CHECK_HEADERS(unistd.h).
+ * configure: Regenerated.
+ * config.in: New file.
+ * interp.c: #include "callback.h".
+ * simops.c: #include "config.h". #include <unistd.h> if present.
+
+Fri Nov 8 16:19:55 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
+
+ * d10v-sim.h (simops): Add flag is_long.
+ (State): Add pc_changed. Instructions which update the PC should
+ use the JMP macro which sets this.
+ (JMP): New macro. Sets the PC and the pc_changed flag.
+
+ * gencode.c (write_opcodes): Add is_long field.
+
+ * interp.c (lookup_hash): If we blindly apply a short opcode's mask
+ to a long opcode we could get a false match. Check the opcode size.
+ (hash): Add a size field to the hash table.
+ (sim_open): Initialize size field in hash table.
+ (sim_resume): Change to logic for setting the PC. Used to increment the
+ PC if it had not been changed. This didn't allow single-instruction loops.
+ Now checks the flag State.pc_changed. Also now stops when ^C is received.
+ (dmem_addr): Fix translation of data segments to unified memory.
+ (sim_ctrl_c): New function. When ^C is received, set stop_simulator flag.
+
+ * simops.c: Changed all branch and jump instructions to use new JMP macro.
+ (OP_20000000): Corrected trace information to show this is a ldi.l, not
+ a ldi.s instruction.
+
Thu Oct 31 19:13:55 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
* interp.c (sim_fetch_register, sim_store_register): Fix bug where
AC_PREREQ(2.5)dnl
AC_INIT(Makefile.in)
-AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/../..)
-AC_CANONICAL_SYSTEM
-AC_ARG_PROGRAM
-AC_PROG_CC
-AC_PROG_INSTALL
-AC_C_BIGENDIAN
+SIM_AC_COMMON
-# Put a plausible default for CC_FOR_BUILD in Makefile.
-AC_C_CROSS
-if test "x$cross_compiling" = "xno"; then
- CC_FOR_BUILD='$(CC)'
-else
- CC_FOR_BUILD=gcc
-fi
+AC_CHECK_HEADERS(unistd.h)
-. ${srcdir}/../../bfd/configure.host
-
-AC_ARG_ENABLE(sim-cflags,
-[ --enable-sim-cflags=opts Extra CFLAGS for use in building simulator],
-[case "${enableval}" in
- yes) sim_cflags="-O2";;
- trace) AC_MSG_ERROR("Please use --enable-sim-debug instead."); sim_cflags="";;
- no) sim_cflags="";;
- *) sim_cflags=`echo "${enableval}" | sed -e "s/,/ /g"`;;
-esac
-if test x"$silent" != x"yes" && test x"$sim_cflags" != x""; then
- echo "Setting sim cflags = $sim_cflags" 6>&1
-fi],[sim_cflags=""])dnl
-
-AC_ARG_ENABLE(sim-debug,
-[ --enable-sim-debug=opts Enable debugging flags],
-[case "${enableval}" in
- yes) sim_debug="-DDEBUG=7";;
- no) sim_debug="-DDEBUG=0";;
- *) sim_debug="-DDEBUG='(${enableval})'";;
-esac
-if test x"$silent" != x"yes" && test x"$sim_debug" != x""; then
- echo "Setting sim debug = $sim_debug" 6>&1
-fi],[sim_cflags=""])dnl
-
-AC_ARG_ENABLE(sim-bswap,
-[ --enable-sim-bswap Use the BSWAP instruction on Intel 486s and Pentiums.],
-[case "${enableval}" in
- yes) sim_bswap="-DUSE_BSWAP";;
- no) sim_bswap="";;
- *) AC_MSG_ERROR("--enable-sim-bswap does not take a value"); sim_bswap="";;
-esac
-if test x"$silent" != x"yes" && test x"$sim_bswap" != x""; then
- echo "Setting bswap flags = $sim_bswap" 6>&1
-fi],[sim_bswap=""])dnl
-
-AC_SUBST(CC_FOR_BUILD)
-AC_SUBST(CFLAGS)
-AC_SUBST(HDEFINES)
-AR=${AR-ar}
-AC_SUBST(AR)
-AC_PROG_RANLIB
-AC_SUBST(sim_cflags)
-AC_SUBST(sim_debug)
-AC_SUBST(sim_bswap)
-
-# Put a plausible default for CC_FOR_BUILD in Makefile.
-AC_C_CROSS
-if test "x$cross_compiling" = "xno"; then
- CC_FOR_BUILD='$(CC)'
-else
- CC_FOR_BUILD=gcc
-fi
-AC_SUBST(CC_FOR_BUILD)
-
-AC_OUTPUT(Makefile)
+SIM_AC_OUTPUT
#include <signal.h>
#include "sysdep.h"
+#include "callback.h"
#include "remote-sim.h"
#include "d10v_sim.h"
struct hash_entry *next;
long opcode;
long mask;
+ int size;
struct simops *ops;
};
else
h = &hash_table[(ins & 0x7E00) >> 9];
- while ((ins & h->mask) != h->opcode)
+ while ((ins & h->mask) != h->opcode || h->size != size)
{
if (h->next == NULL)
{
h->ops = s;
h->mask = s->mask;
h->opcode = s->opcode;
+ h->size = s->is_long;
}
}
}
/* unified memory */
/* this is ugly because we allocate unified memory in 128K segments and */
/* dmap addresses 16k segments */
- seg = (DMAP & 0x3ff) >> 2;
+ seg = (DMAP & 0x3ff) >> 3;
if (State.umem[seg] == NULL)
{
(*d10v_callback->printf_filtered) (d10v_callback, "ERROR: unified memory region %d unmapped, pc = 0x%lx\n",
seg, (long)decode_pc ());
exit(1);
}
- return State.umem[seg] + (DMAP & 3) * 0x4000;
+ return State.umem[seg] + (DMAP & 7) * 0x4000;
}
return State.dmem + addr;
}
+static int stop_simulator;
+
+static void
+sim_ctrl_c()
+{
+ stop_simulator = 1;
+}
+
+
+/* Run (or resume) the program. */
void
sim_resume (step, siggnal)
int step, siggnal;
{
+ void (*prev) ();
uint32 inst;
- reg_t oldpc = 0;
/* (*d10v_callback->printf_filtered) (d10v_callback, "sim_resume (%d,%d) PC=0x%x\n",step,siggnal,PC); */
-
State.exception = 0;
+ prev = signal(SIGINT, sim_ctrl_c);
+ stop_simulator = step;
+
do
{
inst = get_longword( pc_addr() );
- oldpc = PC;
+ State.pc_changed = 0;
ins_type_counters[ (int)INS_CYCLES ]++;
switch (inst & 0xC0000000)
{
else
PC = RPT_S;
}
-
- /* FIXME */
- if (PC == oldpc)
+ else if (!State.pc_changed)
PC++;
-
}
- while ( !State.exception && !step);
+ while ( !State.exception && !stop_simulator);
if (step && !State.exception)
State.exception = SIGTRAP;
+
+ signal(SIGINT, prev);
}
int
sim_set_callbacks(p)
host_callback *p;
{
-/* printf ("sim_set_callbacks\n"); */
d10v_callback = p;
}