Replace memory model with one from sim/common directory.
[binutils-gdb.git] / sim / v850 / simops.c
index 70df0ce1775ae326c09f110f888d4a63416822ce..4926910b8b763684ac3fcad3c8cd4a65231f6f0f 100644 (file)
@@ -1,8 +1,27 @@
 #include <signal.h>
+#include "sim-main.h"
 #include "v850_sim.h"
 #include "simops.h"
-#include "sys/syscall.h"
+
+#ifdef HAVE_UTIME_H
+#include <utime.h>
+#endif
+
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+ /* FIXME - should be including a version of syscall.h that does not
+    pollute the name space */
+#include "../../libgloss/v850/sys/syscall.h"
+
 #include "bfd.h"
+#include "libiberty.h"
+
 #include <errno.h>
 #if !defined(__GO32__) && !defined(_WIN32)
 #include <sys/stat.h>
@@ -576,6 +595,50 @@ Multiply64 (boolean sign, unsigned long op0)
   return;
 }
 
+\f
+/* Read a null terminated string from memory, return in a buffer */
+static char *
+fetch_str (sd, addr)
+     SIM_DESC sd;
+     address_word addr;
+{
+  char *buf;
+  int nr = 0;
+  while (sim_core_read_1 (STATE_CPU (sd, 0),
+                         PC, sim_core_read_map, addr + nr) != 0)
+    nr++;
+  buf = NZALLOC (char, nr + 1);
+  sim_read (simulator, addr, buf, nr);
+  return buf;
+}
+
+/* Read a null terminated argument vector from memory, return in a
+   buffer */
+static char **
+fetch_argv (sd, addr)
+     SIM_DESC sd;
+     address_word addr;
+{
+  int max_nr = 64;
+  int nr = 0;
+  char **buf = xmalloc (max_nr * sizeof (char*));
+  while (1)
+    {
+      unsigned32 a = sim_core_read_4 (STATE_CPU (sd, 0),
+                                     PC, sim_core_read_map, addr + nr * 4);
+      if (a == 0) break;
+      buf[nr] = fetch_str (sd, a);
+      nr ++;
+      if (nr == max_nr - 1)
+       {
+         max_nr += 50;
+         buf = xrealloc (buf, max_nr * sizeof (char*));
+       }
+    }
+  buf[nr] = 0;
+  return buf;
+}
+
 \f
 /* sld.b */
 int
@@ -788,9 +851,6 @@ OP_10760 ()
 static int
 branch (int code)
 {
-  unsigned int psw;
-  int op0;
-
   trace_input ("Bcond", OP_COND_BR, 0);
   trace_output (OP_COND_BR);
 
@@ -1690,7 +1750,7 @@ OP_640 ()
     {
       trace_input ("movhi", OP_UIMM_REG_REG, 16);
       
-      State.regs[ OP[1] ] = State.regs[ OP[0] ] + OP[2] << 16;
+      State.regs[ OP[1] ] = State.regs[ OP[0] ] + (OP[2] << 16);
       
       trace_output (OP_UIMM_REG_REG);
     }
@@ -2215,20 +2275,47 @@ OP_10007E0 ()
 
       switch (FUNC)
        {
-#if !defined(__GO32__) && !defined(_WIN32)
+
+#ifdef HAVE_FORK
+#ifdef SYS_fork
        case SYS_fork:
          RETVAL = fork ();
          break;
+#endif
+#endif
+
+#ifdef HAVE_EXECVE
+#ifdef SYS_execv
        case SYS_execve:
-         RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2),
-                          (char **)MEMPTR (PARM3));
-         break;
+         {
+           char *path = fetch_str (simulator, PARM1);
+           char **argv = fetch_argv (simulator, PARM2);
+           char **envp = fetch_argv (simulator, PARM3);
+           RETVAL = execve (path, argv, envp);
+           zfree (path);
+           freeargv (argv);
+           freeargv (envp);
+           break;
+         }
+#endif
+#endif
+
+#if HAVE_EXECV
 #ifdef SYS_execv
        case SYS_execv:
-         RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL);
-         break;
+         {
+           char *path = fetch_str (simulator, PARM1);
+           char **argv = fetch_argv (simulator, PARM2);
+           RETVAL = execv (path, argv);
+           zfree (path);
+           freeargv (argv);
+           break;
+         }
+#endif
 #endif
+
 #if 0
+#ifdef SYS_pipe
        case SYS_pipe:
          {
            reg_t buf;
@@ -2241,7 +2328,11 @@ OP_10007E0 ()
            SW (buf, host_fd[1]);
          }
          break;
+#endif
+#endif
 
+#if 0
+#ifdef SYS_wait
        case SYS_wait:
          {
            int status;
@@ -2253,27 +2344,54 @@ OP_10007E0 ()
 #endif
 #endif
 
+#ifdef SYS_read
        case SYS_read:
-         RETVAL = v850_callback->read (v850_callback, PARM1, MEMPTR (PARM2),
-                                       PARM3);
-         break;
+         {
+           char *buf = zalloc (PARM3);
+           RETVAL = sim_io_read (simulator, PARM1, buf, PARM3);
+           sim_write (simulator, PARM2, buf, PARM3);
+           zfree (buf);
+           break;
+         }
+#endif
+
+#ifdef SYS_write
        case SYS_write:
-         if (PARM1 == 1)
-           RETVAL = (int)v850_callback->write_stdout (v850_callback,
-                                                      MEMPTR (PARM2), PARM3);
-         else
-           RETVAL = (int)v850_callback->write (v850_callback, PARM1,
-                                               MEMPTR (PARM2), PARM3);
-         break;
+         {
+           char *buf = zalloc (PARM3);
+           sim_read (simulator, PARM2, buf, PARM3);
+           if (PARM1 == 1)
+             RETVAL = sim_io_write_stdout (simulator, buf, PARM3);
+           else
+             RETVAL = sim_io_write (simulator, PARM1, buf, PARM3);
+           zfree (buf);
+           break;
+         }
+#endif
+
+#ifdef SYS_lseek
        case SYS_lseek:
-         RETVAL = v850_callback->lseek (v850_callback, PARM1, PARM2, PARM3);
+         RETVAL = sim_io_lseek (simulator, PARM1, PARM2, PARM3);
          break;
+#endif
+
+#ifdef SYS_close
        case SYS_close:
-         RETVAL = v850_callback->close (v850_callback, PARM1);
+         RETVAL = sim_io_close (simulator, PARM1);
          break;
+#endif
+
+#ifdef SYS_open
        case SYS_open:
-         RETVAL = v850_callback->open (v850_callback, MEMPTR (PARM1), PARM2);
-         break;
+         {
+           char *buf = fetch_str (simulator, PARM1);
+           RETVAL = sim_io_open (simulator, buf, PARM2);
+           zfree (buf);
+           break;
+         }
+#endif
+
+#ifdef SYS_exit
        case SYS_exit:
          if ((PARM1 & 0xffff0000) == 0xdead0000 && (PARM1 & 0xffff) != 0)
            State.exception = PARM1 & 0xffff;   /* get signal encoded by kill */
@@ -2282,16 +2400,20 @@ OP_10007E0 ()
          else
            State.exception = SIG_V850_EXIT;    /* PARM1 has exit status encoded */
          break;
+#endif
 
 #if !defined(__GO32__) && !defined(_WIN32)
+#ifdef SYS_stat
        case SYS_stat:  /* added at hmsi */
          /* stat system call */
          {
            struct stat host_stat;
            reg_t buf;
+           char *path = fetch_str (simulator, PARM1);
 
-           RETVAL = stat (MEMPTR (PARM1), &host_stat);
+           RETVAL = stat (path, &host_stat);
 
+           zfree (path);
            buf = PARM2;
 
            /* Just wild-assed guesses.  */
@@ -2308,14 +2430,35 @@ OP_10007E0 ()
            store_mem (buf + 36, 4, host_stat.st_ctime);
          }
          break;
+#endif
+#endif
 
+#ifdef HAVE_CHOWN
+#ifdef SYS_chown
        case SYS_chown:
-         RETVAL = chown (MEMPTR (PARM1), PARM2, PARM3);
+         {
+           char *path = fetch_str (simulator, PARM1);
+           RETVAL = chown (path, PARM2, PARM3);
+           zfree (path);
+         }
          break;
+#endif
+#endif
+
+#if HAVE_CHMOD
+#ifdef SYS_chmod
        case SYS_chmod:
-         RETVAL = chmod (MEMPTR (PARM1), PARM2);
+         {
+           char *path = fetch_str (simulator, PARM1);
+           RETVAL = chmod (path, PARM2);
+           zfree (path);
+         }
          break;
+#endif
+#endif
+
 #ifdef SYS_time
+#if HAVE_TIME
        case SYS_time:
          {
            time_t now;
@@ -2324,6 +2467,9 @@ OP_10007E0 ()
          }
          break;
 #endif
+#endif
+
+#if !defined(__GO32__) && !defined(_WIN32)
 #ifdef SYS_times
        case SYS_times:
          {
@@ -2336,6 +2482,10 @@ OP_10007E0 ()
            break;
          }
 #endif
+#endif
+
+#ifdef SYS_gettimeofday
+#if !defined(__GO32__) && !defined(_WIN32)
        case SYS_gettimeofday:
          {
            struct timeval t;
@@ -2347,14 +2497,22 @@ OP_10007E0 ()
            store_mem (PARM2 + 4, 4, tz.tz_dsttime);
            break;
          }
+#endif
+#endif
+
 #ifdef SYS_utime
+#if HAVE_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));
+         {
+           /* Cast the second argument to void *, to avoid type mismatch
+              if a prototype is present.  */
+           sim_io_error (simulator, "Utime not supported");
+           /* RETVAL = utime (path, (void *) MEMPTR (PARM2)); */
+         }
          break;
 #endif
 #endif
+
        default:
          abort ();
        }
@@ -2395,8 +2553,6 @@ OP_2007E0 ()
 int
 OP_4007E0 ()
 {
-  unsigned int op0;
-
   trace_input ("stsr", OP_STSR, 0);
   
   State.regs[ OP[1] ] = State.sregs[ OP[0] ];
@@ -2508,20 +2664,20 @@ divun
   boolean *          overflow_ptr
 )
 {
-  unsigned long   ald = sfi >> N - 1;
+  unsigned long   ald = sfi >> (N - 1);
   unsigned long   alo = als;
   unsigned int    Q   = 1;
   unsigned int    C;
   unsigned int    S   = 0;
   unsigned int    i;
   unsigned int    R1  = 1;
-  unsigned int    OV;
   unsigned int    DBZ = (als == 0) ? 1 : 0;
   unsigned long   alt = Q ? ~als : als;
 
   /* 1st Loop */
   alo = ald + alt + Q;
-  C   = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31);
+  C   = (((alt >> 31) & (ald >> 31))
+        | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
   C   = C ^ Q;
   Q   = ~(C ^ S) & 1;
   R1  = (alo == 0) ? 0 : (R1 & Q);
@@ -2538,7 +2694,8 @@ divun
     {
       alt = Q ? ~als : als;
       alo = ald + alt + Q;
-      C   = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31);
+      C   = (((alt >> 31) & (ald >> 31))
+            | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
       C   = C ^ Q;
       Q   = ~(C ^ S) & 1;
       R1  = (alo == 0) ? 0 : (R1 & Q);
@@ -2554,7 +2711,8 @@ divun
   /* Nth Loop */
   alt = Q ? ~als : als;
   alo = ald + alt + Q;
-  C   = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31);
+  C   = (((alt >> 31) & (ald >> 31))
+        | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
   C   = C ^ Q;
   Q   = ~(C ^ S) & 1;
   R1  = (alo == 0) ? 0 : (R1 & Q);
@@ -2597,7 +2755,8 @@ divn
   /* 1st Loop */
   
   alo = ald + alt + Q;
-  C   = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31);
+  C   = (((alt >> 31) & (ald >> 31))
+        | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
   Q   = C ^ SS;
   R1  = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
   S   = alo >> 31;
@@ -2614,7 +2773,8 @@ divn
     {
       alt = Q ? ~als : als;
       alo = ald + alt + Q;
-      C   = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31);
+      C   = (((alt >> 31) & (ald >> 31))
+            | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
       Q   = C ^ SS;
       R1  = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
       S   = alo >> 31;
@@ -2629,7 +2789,8 @@ divn
   /* Nth Loop */
   alt = Q ? ~als : als;
   alo = ald + alt + Q;
-  C   = (alt >> 31) & (ald >> 31) | ((alt >> 31) ^ (ald >> 31)) & (~alo >> 31);
+  C   = (((alt >> 31) & (ald >> 31))
+        | (((alt >> 31) ^ (ald >> 31)) & (~alo >> 31)));
   Q   = C ^ SS;
   R1  = (alo == 0) ? 0 : (R1 & (Q ^ (SS ^ SD)));
   sfi = (sfi << (32-N+1));
@@ -2653,7 +2814,8 @@ divn
   * remainder_ptr = alo;
 
   /* Adj */
-  if ((alo != 0) && ((SS ^ SD) ^ R1) || (alo == 0) && (SS ^ R1))
+  if (((alo != 0) && ((SS ^ SD) ^ R1))
+      || ((alo == 0) && (SS ^ R1)))
     alo = ald + 1;
   else
     alo = ald;
@@ -3306,7 +3468,8 @@ OP_10780 (void)
 
       trace_input ("ld.bu", OP_LOAD32, 1);
 
-      adr = State.regs[ OP[0] ] + SEXT16 (OP[2] & ~1) | ((OP[3] >> 5) & 1);
+      adr = (State.regs[ OP[0] ]
+            + (SEXT16 (OP[2] & ~1) | ((OP[3] >> 5) & 1)));
       
       State.regs[ OP[1] ] = load_mem (adr, 1);
   
@@ -3548,6 +3711,8 @@ OP_107F0 (void)
       }
   
   trace_output (OP_PUSHPOP2);
+
+  return 4;
 }
 
 /* pushmh list18 */