aboutsummaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
Diffstat (limited to 'sim')
-rw-r--r--sim/arm/ChangeLog9
-rw-r--r--sim/arm/wrapper.c169
-rw-r--r--sim/d10v/ChangeLog10
-rw-r--r--sim/d10v/simops.c64
-rw-r--r--sim/mips/ChangeLog10
-rw-r--r--sim/mips/interp.c31
-rw-r--r--sim/mn10300/ChangeLog10
-rw-r--r--sim/mn10300/simops.c10
-rw-r--r--sim/v850/ChangeLog10
-rw-r--r--sim/v850/simops.c27
10 files changed, 237 insertions, 113 deletions
diff --git a/sim/arm/ChangeLog b/sim/arm/ChangeLog
index eda154d..41f05a1 100644
--- a/sim/arm/ChangeLog
+++ b/sim/arm/ChangeLog
@@ -1,3 +1,12 @@
+Thu Apr 17 11:48:25 1997 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * wrapper.c (sim_trace): Update so that it matches prototype.
+
+Mon Apr 7 15:45:02 1997 Andrew Cagney <cagney@kremvax.cygnus.com>
+
+ * configure: Regenerated to track ../common/aclocal.m4 changes.
+ * config.in: Ditto.
+
Mon Apr 7 12:01:17 1997 Andrew Cagney <cagney@kremvax.cygnus.com>
* Makefile.in (armemu32.o): Replace $< with autoconf recommended
diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c
index fdbff86..2a582cd 100644
--- a/sim/arm/wrapper.c
+++ b/sim/arm/wrapper.c
@@ -1,7 +1,7 @@
/* run front end support for arm
- Copyright (C) 1995 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of ARM SIM
+This file is part of ARM SIM.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -14,68 +14,95 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* This file provides the interface between the simulator and run.c and gdb
+ (when the simulator is linked with gdb).
+ All simulator interaction should go through this file. */
#include <stdio.h>
#include <stdarg.h>
-#include <armdefs.h>
#include <bfd.h>
#include <signal.h>
#include "callback.h"
#include "remote-sim.h"
+#include "armdefs.h"
+#include "armemu.h"
+#include "dbg_rdi.h"
+
+host_callback *sim_callback;
+
static struct ARMul_State *state;
+/* Memory size in bytes. */
+static int mem_size = (1 << 21);
+
+/* Non-zero to display start up banner, and maybe other things. */
+static int verbosity;
+
static void
init ()
{
static int done;
+
if (!done)
{
ARMul_EmulateInit();
state = ARMul_NewState ();
- ARMul_MemoryInit(state, 1<<21);
+ ARMul_MemoryInit(state, mem_size);
ARMul_OSInit(state);
ARMul_CoProInit(state);
+ state->verbose = verbosity;
done = 1;
}
-
-}
-void
-ARMul_ConsolePrint (ARMul_State * state, const char *format,...)
-{
- va_list ap;
- va_start (ap, format);
- vprintf (format, ap);
- va_end (ap);
}
-ARMword
-ARMul_Debug (ARMul_State * state, ARMword pc, ARMword instr)
-{
+/* Set verbosity level of simulator.
+ This is not intended to produce detailed tracing or debugging information.
+ Just summaries. */
+/* FIXME: common/run.c doesn't do this yet. */
+void
+sim_set_verbose (v)
+ int v;
+{
+ verbosity = v;
}
+/* Set the memory size to SIZE bytes.
+ Must be called before initializing simulator. */
+/* FIXME: Rename to sim_set_mem_size. */
+
void
sim_size (size)
int size;
{
- init ();
- ARMul_MemoryInit (state, 1 << size);
+ mem_size = size;
}
-
void
-sim_set_profile ()
+ARMul_ConsolePrint (ARMul_State * state, const char *format,...)
{
+ va_list ap;
+
+ if (state->verbose)
+ {
+ va_start (ap, format);
+ vprintf (format, ap);
+ va_end (ap);
+ }
}
-void
-sim_set_profile_size ()
+
+ARMword
+ARMul_Debug (ARMul_State * state, ARMword pc, ARMword instr)
{
+
}
int
-sim_write (addr, buffer, size)
+sim_write (sd, addr, buffer, size)
+ SIM_DESC sd;
SIM_ADDR addr;
unsigned char *buffer;
int size;
@@ -90,7 +117,8 @@ sim_write (addr, buffer, size)
}
int
-sim_read (addr, buffer, size)
+sim_read (sd, addr, buffer, size)
+ SIM_DESC sd;
SIM_ADDR addr;
unsigned char *buffer;
int size;
@@ -104,29 +132,38 @@ sim_read (addr, buffer, size)
return size;
}
-void
-sim_trace ()
+int
+sim_trace (sd)
+ SIM_DESC sd;
{
+ (*sim_callback->printf_filtered) (sim_callback, "This simulator does not support tracing\n");
+ return 1;
}
-static int rc;
void
-sim_resume (step, siggnal)
+sim_resume (sd, step, siggnal)
+ SIM_DESC sd;
int step, siggnal;
{
+ state->EndCondition = 0;
+
if (step)
{
- rc = SIGTRAP;
- state->Reg[15] = ARMul_DoInstr (state);
+ state->Reg[15] = ARMul_DoInstr (state);
+ if (state->EndCondition == 0)
+ state->EndCondition = RDIError_BreakpointReached;
}
else
{
- state->Reg[15] = ARMul_DoProg (state);
+ state->Reg[15] = ARMul_DoProg (state);
}
+
+ FLUSHPIPE;
}
void
-sim_create_inferior (start_address, argv, env)
+sim_create_inferior (sd, start_address, argv, env)
+ SIM_DESC sd;
SIM_ADDR start_address;
char **argv;
char **env;
@@ -135,13 +172,14 @@ sim_create_inferior (start_address, argv, env)
}
void
-sim_info (verbose)
+sim_info (sd, verbose)
+ SIM_DESC sd;
int verbose;
{
}
-int
+static int
frommem (state, memory)
struct ARMul_State *state;
unsigned char *memory;
@@ -163,7 +201,7 @@ frommem (state, memory)
}
-void
+static void
tomem (state, memory, val)
struct ARMul_State *state;
unsigned char *memory;
@@ -186,7 +224,8 @@ tomem (state, memory, val)
}
void
-sim_store_register (rn, memory)
+sim_store_register (sd, rn, memory)
+ SIM_DESC sd;
int rn;
unsigned char *memory;
{
@@ -195,7 +234,8 @@ sim_store_register (rn, memory)
}
void
-sim_fetch_register (rn, memory)
+sim_fetch_register (sd, rn, memory)
+ SIM_DESC sd;
int rn;
unsigned char *memory;
{
@@ -206,22 +246,27 @@ sim_fetch_register (rn, memory)
-void
-sim_open (name)
- char *name;
+SIM_DESC
+sim_open (kind, argv)
+ SIM_OPEN_KIND kind;
+ char **argv;
{
- /* nothing to do */
+ /* (*sim_callback->error) (sim_callback, "testing 1 2 3\n");*/
+ /* nothing to do, fudge our descriptor */
+ return (SIM_DESC) 1;
}
void
-sim_close (quitting)
+sim_close (sd, quitting)
+ SIM_DESC sd;
int quitting;
{
/* nothing to do */
}
int
-sim_load (prog, from_tty)
+sim_load (sd, prog, from_tty)
+ SIM_DESC sd;
char *prog;
int from_tty;
{
@@ -230,30 +275,46 @@ sim_load (prog, from_tty)
}
void
-sim_stop_reason (reason, sigrc)
+sim_stop_reason (sd, reason, sigrc)
+ SIM_DESC sd;
enum sim_stop *reason;
int *sigrc;
{
- *reason = sim_stopped;
- *sigrc = rc;
+ if (state->EndCondition == 0)
+ {
+ *reason = sim_exited;
+ *sigrc = state->Reg[0] & 255;
+ }
+ else
+ {
+ *reason = sim_stopped;
+ if (state->EndCondition == RDIError_BreakpointReached)
+ *sigrc = SIGTRAP;
+ else
+ *sigrc = 0;
+ }
}
+
void
-sim_kill ()
+sim_kill (sd)
+ SIM_DESC sd;
{
/* nothing to do */
}
void
-sim_do_command (cmd)
+sim_do_command (sd, cmd)
+ SIM_DESC sd;
char *cmd;
{
- printf_filtered ("This simulator does not accept any commands.\n");
+ (*sim_callback->printf_filtered) (sim_callback, "This simulator does not accept any commands.\n");
}
void
-sim_set_callbacks (ptr)
-struct host_callback_struct *ptr;
+sim_set_callbacks (sd, ptr)
+ SIM_DESC sd;
+ host_callback *ptr;
{
-
+ sim_callback = ptr;
}
diff --git a/sim/d10v/ChangeLog b/sim/d10v/ChangeLog
index b6eeed6..0cd9cc4 100644
--- a/sim/d10v/ChangeLog
+++ b/sim/d10v/ChangeLog
@@ -1,3 +1,13 @@
+Wed Apr 16 16:12:03 1997 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * simops.c (OP_5F00): Only provide system calls SYS_execv,
+ SYS_wait, SYS_wait, SYS_utime, SYS_time if defined by the host.
+
+Mon Apr 7 15:45:02 1997 Andrew Cagney <cagney@kremvax.cygnus.com>
+
+ * configure: Regenerated to track ../common/aclocal.m4 changes.
+ * config.in: Ditto.
+
Wed Apr 2 15:06:28 1997 Doug Evans <dje@canuck.cygnus.com>
* interp.c (sim_open): New arg `kind'.
diff --git a/sim/d10v/simops.c b/sim/d10v/simops.c
index 3c4a0af..9a654f4 100644
--- a/sim/d10v/simops.c
+++ b/sim/d10v/simops.c
@@ -2628,24 +2628,26 @@ OP_5F00 ()
(*d10v_callback->printf_filtered) (d10v_callback, " a0 a1 f0 f1 c\n");
}
- (*d10v_callback->printf_filtered) (d10v_callback, "Trap %2d 0x%.4x:", (int)OP[0], (int)PC);
+ (*d10v_callback->printf_filtered) (d10v_callback, "Trap %2d 0x%.4x:", (int)OP[0], (int)PC);
- for (i = 0; i < 16; i++)
- (*d10v_callback->printf_filtered) (d10v_callback, " %.4x", (int) State.regs[i]);
+ for (i = 0; i < 16; i++)
+ (*d10v_callback->printf_filtered) (d10v_callback, " %.4x", (int) State.regs[i]);
- for (i = 0; i < 2; i++)
- (*d10v_callback->printf_filtered) (d10v_callback, " %.2x%.8lx",
- ((int)(State.a[i] >> 32) & 0xff),
- ((unsigned long)State.a[i]) & 0xffffffff);
+ for (i = 0; i < 2; i++)
+ (*d10v_callback->printf_filtered) (d10v_callback, " %.2x%.8lx",
+ ((int)(State.a[i] >> 32) & 0xff),
+ ((unsigned long)State.a[i]) & 0xffffffff);
- (*d10v_callback->printf_filtered) (d10v_callback, " %d %d %d\n",
- State.F0 != 0, State.F1 != 0, State.C != 0);
- (*d10v_callback->flush_stdout) (d10v_callback);
- break;
+ (*d10v_callback->printf_filtered) (d10v_callback, " %d %d %d\n",
+ State.F0 != 0, State.F1 != 0, State.C != 0);
+ (*d10v_callback->flush_stdout) (d10v_callback);
+ break;
+ }
#endif
- case 0:
- /* Trap 0 is used for simulating low-level I/O */
+ case 0: /* old system call trap, to be deleted */
+ case 15: /* new system call trap */
+ /* Trap 15 is used for simulating low-level I/O */
{
errno = 0;
@@ -2818,11 +2820,13 @@ OP_5F00 ()
trace_output (OP_R2);
break;
+#ifdef SYS_execv
case SYS_execv:
RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL);
trace_input ("<execv>", OP_R2, OP_R3, OP_VOID);
trace_output (OP_R2);
break;
+#endif
case SYS_pipe:
{
@@ -2839,6 +2843,7 @@ OP_5F00 ()
}
break;
+#ifdef SYS_wait
case SYS_wait:
{
int status;
@@ -2850,6 +2855,7 @@ OP_5F00 ()
trace_output (OP_R2);
}
break;
+#endif
#else
case SYS_getpid:
trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
@@ -2955,6 +2961,7 @@ OP_5F00 ()
trace_output (OP_R2);
break;
+#ifdef SYS_utime
case SYS_utime:
/* Cast the second argument to void *, to avoid type mismatch
if a prototype is present. */
@@ -2962,7 +2969,9 @@ OP_5F00 ()
trace_input ("<utime>", OP_R2, OP_R3, OP_R4);
trace_output (OP_R2);
break;
+#endif
+#ifdef SYS_time
case SYS_time:
{
unsigned long ret = time (PARM1 ? MEMPTR (PARM1) : NULL);
@@ -2972,39 +2981,14 @@ OP_5F00 ()
trace_input ("<time>", OP_R2, OP_R3, OP_R4);
trace_output (OP_R2R3);
break;
+#endif
default:
abort ();
}
- RETERR = d10v_callback->get_errno(d10v_callback);
- break;
- }
-
- case 1:
- /* Trap 1 prints a string */
- {
- char *fstr = dmem_addr(State.regs[2]);
- fputs (fstr, stdout);
- break;
- }
-
- case 2:
- /* Trap 2 calls printf */
- {
- char *fstr = dmem_addr(State.regs[2]);
- (*d10v_callback->printf_filtered) (d10v_callback, fstr,
- (int16)State.regs[3],
- (int16)State.regs[4],
- (int16)State.regs[5]);
- (*d10v_callback->flush_stdout) (d10v_callback);
+ RETERR = (RETVAL == (uint16) -1) ? d10v_callback->get_errno(d10v_callback) : 0;
break;
}
-
- case 3:
- /* Trap 3 writes a character */
- putchar (State.regs[2]);
- break;
- }
}
}
diff --git a/sim/mips/ChangeLog b/sim/mips/ChangeLog
index 5c78457..de7075e 100644
--- a/sim/mips/ChangeLog
+++ b/sim/mips/ChangeLog
@@ -1,3 +1,13 @@
+Wed Apr 16 17:55:37 1997 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * interp.c (sim_size): Delete prototype - conflicts with
+ definition in remote-sim.h. Correct definition.
+
+Mon Apr 7 15:45:02 1997 Andrew Cagney <cagney@kremvax.cygnus.com>
+
+ * configure: Regenerated to track ../common/aclocal.m4 changes.
+ * config.in: Ditto.
+
Wed Apr 2 15:06:28 1997 Doug Evans <dje@canuck.cygnus.com>
* interp.c (sim_open): New arg `kind'.
diff --git a/sim/mips/interp.c b/sim/mips/interp.c
index 3b434f1..f4b42a9 100644
--- a/sim/mips/interp.c
+++ b/sim/mips/interp.c
@@ -75,6 +75,7 @@ code on the hardware.
#endif
char* pr_addr PARAMS ((SIM_ADDR addr));
+char* pr_uword64 PARAMS ((uword64 addr));
#ifndef SIGBUS
#define SIGBUS SIGSEGV
@@ -460,7 +461,6 @@ static void LoadMemory PARAMS((uword64*memvalp,uword64*memval1p,int CCA,int Acce
static void SignalException PARAMS((int exception,...));
static void simulate PARAMS((void));
static long getnum PARAMS((char *value));
-extern void sim_size PARAMS((unsigned int newsize));
extern void sim_set_profile PARAMS((int frequency));
static unsigned int power2 PARAMS((unsigned int value));
@@ -653,7 +653,8 @@ static fnptr_swap_long host_swap_long;
/*---------------------------------------------------------------------------*/
SIM_DESC
-sim_open (argv)
+sim_open (kind,argv)
+ SIM_OPEN_KIND kind;
char **argv;
{
if (callback == NULL) {
@@ -745,6 +746,9 @@ sim_open (argv)
for (argc = 0; argv[argc]; argc++);
+ /* Ensure getopt is reset [don't know whether caller used it]. */
+ optind = 0;
+
while (1) {
int option_index = 0;
@@ -1657,7 +1661,7 @@ sim_set_profile_size (n)
void
sim_size(newsize)
- unsigned int newsize;
+ int newsize;
{
char *new;
/* Used by "run", and internally, to set the simulated memory size */
@@ -2682,7 +2686,7 @@ LoadMemory(memvalp,memval1p,CCA,AccessLength,pAddr,vAddr,IorD,raw)
#ifdef DEBUG
printf("DBG: LoadMemory() : (offset %d) : value = 0x%s%s\n",
- (int)(pAddr & LOADDRMASK),pr_addr(value1),pr_addr(value));
+ (int)(pAddr & LOADDRMASK),pr_uword64(value1),pr_uword64(value));
#endif /* DEBUG */
/* TODO: We could try and avoid the shifts when dealing with raw
@@ -2700,7 +2704,7 @@ LoadMemory(memvalp,memval1p,CCA,AccessLength,pAddr,vAddr,IorD,raw)
#ifdef DEBUG
printf("DBG: LoadMemory() : shifted value = 0x%s%s\n",
- pr_addr(value1),pr_addr(value));
+ pr_uword64(value1),pr_uword64(value));
#endif /* DEBUG */
}
}
@@ -2733,7 +2737,7 @@ StoreMemory(CCA,AccessLength,MemElem,MemElem1,pAddr,vAddr,raw)
int raw;
{
#ifdef DEBUG
- callback->printf_filtered(callback,"DBG: StoreMemory(%d,%d,0x%s,0x%s,0x%s,0x%s,%s)\n",CCA,AccessLength,pr_addr(MemElem),pr_addr(MemElem1),pr_addr(pAddr),pr_addr(vAddr),(raw ? "isRAW" : "isREAL"));
+ callback->printf_filtered(callback,"DBG: StoreMemory(%d,%d,0x%s,0x%s,0x%s,0x%s,%s)\n",CCA,AccessLength,pr_uword64(MemElem),pr_uword64(MemElem1),pr_addr(pAddr),pr_addr(vAddr),(raw ? "isRAW" : "isREAL"));
#endif /* DEBUG */
#if defined(WARN_MEM)
@@ -2772,7 +2776,7 @@ StoreMemory(CCA,AccessLength,MemElem,MemElem1,pAddr,vAddr,raw)
int shift = 0;
#ifdef DEBUG
- printf("DBG: StoreMemory: offset = %d MemElem = 0x%s%s\n",(unsigned int)(pAddr & LOADDRMASK),pr_addr(MemElem1),pr_addr(MemElem));
+ printf("DBG: StoreMemory: offset = %d MemElem = 0x%s%s\n",(unsigned int)(pAddr & LOADDRMASK),pr_uword64(MemElem1),pr_uword64(MemElem));
#endif /* DEBUG */
if (AccessLength <= AccessLength_DOUBLEWORD) {
@@ -2790,7 +2794,7 @@ StoreMemory(CCA,AccessLength,MemElem,MemElem1,pAddr,vAddr,raw)
}
#ifdef DEBUG
- printf("DBG: StoreMemory: shift = %d MemElem = 0x%s%s\n",shift,pr_addr(MemElem1),pr_addr(MemElem));
+ printf("DBG: StoreMemory: shift = %d MemElem = 0x%s%s\n",shift,pr_uword64(MemElem1),pr_uword64(MemElem));
#endif /* DEBUG */
if (BigEndianMem) {
@@ -4528,5 +4532,16 @@ pr_addr(addr)
return paddr_str;
}
+char*
+pr_uword64(addr)
+ uword64 addr;
+{
+ char *paddr_str=get_cell();
+ sprintf(paddr_str,"%08x%08x",
+ (unsigned long)(addr>>thirty_two),(unsigned long)(addr&0xffffffff));
+ return paddr_str;
+}
+
+
/*---------------------------------------------------------------------------*/
/*> EOF interp.c <*/
diff --git a/sim/mn10300/ChangeLog b/sim/mn10300/ChangeLog
index c9090ed..8f83302 100644
--- a/sim/mn10300/ChangeLog
+++ b/sim/mn10300/ChangeLog
@@ -1,3 +1,13 @@
+Wed Apr 16 19:30:44 1997 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * simops.c (OP_F020): SYS_execv, SYS_time, SYS_times, SYS_utime
+ only include if implemented by host.
+ (OP_F020): Typecast arg passed to time function;
+
+Mon Apr 7 23:57:49 1997 Jeffrey A Law (law@cygnus.com)
+
+ * simops.c (syscall): Handle new mn10300 calling conventions.
+
Mon Apr 7 15:45:02 1997 Andrew Cagney <cagney@kremvax.cygnus.com>
* configure: Regenerated to track ../common/aclocal.m4 changes.
diff --git a/sim/mn10300/simops.c b/sim/mn10300/simops.c
index 27f6fda..5f9fc92 100644
--- a/sim/mn10300/simops.c
+++ b/sim/mn10300/simops.c
@@ -2920,10 +2920,12 @@ void OP_F020 (insn, extension)
RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2),
(char **)MEMPTR (PARM3));
break;
+#ifdef SYS_execv
case SYS_execv:
RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL);
break;
#endif
+#endif
case SYS_read:
RETVAL = mn10300_callback->read (mn10300_callback, PARM1,
@@ -2986,9 +2988,12 @@ void OP_F020 (insn, extension)
case SYS_chmod:
RETVAL = chmod (MEMPTR (PARM1), PARM2);
break;
+#ifdef SYS_time
case SYS_time:
- RETVAL = time (MEMPTR (PARM1));
+ RETVAL = time ((void*) MEMPTR (PARM1));
break;
+#endif
+#ifdef SYS_times
case SYS_times:
{
struct tms tms;
@@ -2999,6 +3004,7 @@ void OP_F020 (insn, extension)
store_mem (PARM1 + 12, 4, tms.tms_cstime);
break;
}
+#endif
case SYS_gettimeofday:
{
struct timeval t;
@@ -3010,11 +3016,13 @@ void OP_F020 (insn, extension)
store_mem (PARM2 + 4, 4, tz.tz_dsttime);
break;
}
+#ifdef SYS_utime
case SYS_utime:
/* Cast the second argument to void *, to avoid type mismatch
if a prototype is present. */
RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2));
break;
+#endif
default:
abort ();
}
diff --git a/sim/v850/ChangeLog b/sim/v850/ChangeLog
index 316c7ad..79e5593 100644
--- a/sim/v850/ChangeLog
+++ b/sim/v850/ChangeLog
@@ -1,3 +1,13 @@
+Wed Apr 16 19:53:55 1997 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * simops.c (OP_10007E0): Only provide system calls SYS_execv,
+ SYS_wait, SYS_wait, SYS_utime, SYS_time if defined by the host.
+
+Mon Apr 7 15:45:02 1997 Andrew Cagney <cagney@kremvax.cygnus.com>
+
+ * configure: Regenerated to track ../common/aclocal.m4 changes.
+ * config.in: Ditto.
+
Wed Apr 2 15:06:28 1997 Doug Evans <dje@canuck.cygnus.com>
* interp.c (sim_open): New arg `kind'.
diff --git a/sim/v850/simops.c b/sim/v850/simops.c
index e044c46..101741a 100644
--- a/sim/v850/simops.c
+++ b/sim/v850/simops.c
@@ -1,17 +1,14 @@
-#include "config.h"
-
#include <signal.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
#include "v850_sim.h"
#include "simops.h"
#include "sys/syscall.h"
#include "bfd.h"
#include <errno.h>
+#if !defined(__GO32__) && !defined(_WIN32)
#include <sys/stat.h>
#include <sys/times.h>
#include <sys/time.h>
+#endif
enum op_types {
OP_UNKNOWN,
@@ -1077,8 +1074,8 @@ void
OP_E0 ()
{
trace_input ("mulh", OP_REG_REG, 0);
- State.regs[OP[1]] = ((State.regs[OP[1]] & 0xffff)
- * (State.regs[OP[0]] & 0xffff));
+ State.regs[OP[1]] = (SEXT16 (State.regs[OP[1]])
+ * SEXT16 (State.regs[OP[0]]));
trace_output (OP_REG_REG);
}
@@ -1091,7 +1088,7 @@ OP_2E0 ()
int value = SEXT5 (OP[0]);
trace_input ("mulh", OP_IMM_REG, 0);
- State.regs[OP[1]] = (State.regs[OP[1]] & 0xffff) * value;
+ State.regs[OP[1]] = SEXT16 (State.regs[OP[1]]) * value;
trace_output (OP_IMM_REG);
}
@@ -1099,10 +1096,10 @@ OP_2E0 ()
void
OP_6E0 ()
{
- int value = OP[0] & 0xffff;
+ int value = SEXT16 (OP[0]);
trace_input ("mulhi", OP_IMM_REG_REG, 0);
- State.regs[OP[2]] = (State.regs[OP[1]] & 0xffff) * value;
+ State.regs[OP[2]] = SEXT16 (State.regs[OP[1]]) * value;
trace_output (OP_IMM_REG_REG);
}
@@ -2003,9 +2000,11 @@ OP_10007E0 ()
RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2),
(char **)MEMPTR (PARM3));
break;
+#ifdef SYS_execv
case SYS_execv:
RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL);
break;
+#endif
#if 0
case SYS_pipe:
{
@@ -2061,6 +2060,7 @@ OP_10007E0 ()
State.exception = SIG_V850_EXIT; /* PARM1 has exit status encoded */
break;
+#if !defined(__GO32__) && !defined(_WIN32)
case SYS_stat: /* added at hmsi */
/* stat system call */
{
@@ -2092,6 +2092,7 @@ OP_10007E0 ()
case SYS_chmod:
RETVAL = chmod (MEMPTR (PARM1), PARM2);
break;
+#ifdef SYS_time
case SYS_time:
{
time_t now;
@@ -2099,6 +2100,8 @@ OP_10007E0 ()
store_mem (PARM1, 4, now);
}
break;
+#endif
+#ifdef SYS_times
case SYS_times:
{
struct tms tms;
@@ -2109,6 +2112,7 @@ OP_10007E0 ()
store_mem (PARM1 + 12, 4, tms.tms_cstime);
break;
}
+#endif
case SYS_gettimeofday:
{
struct timeval t;
@@ -2120,11 +2124,14 @@ OP_10007E0 ()
store_mem (PARM2 + 4, 4, tz.tz_dsttime);
break;
}
+#ifdef SYS_utime
case SYS_utime:
/* Cast the second argument to void *, to avoid type mismatch
if a prototype is present. */
RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2));
break;
+#endif
+#endif
default:
abort ();
}