/* m32r exception, interrupt, and trap (EIT) support
   Copyright (C) 1998-2022 Free Software Foundation, Inc.
   Contributed by Cygnus Solutions & Renesas.

   This file is part of GDB, the GNU debugger.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   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 this program.  If not, see <http://www.gnu.org/licenses/>.  */

/* This must come before any other includes.  */
#include "defs.h"

#include "portability.h"
#include "sim-main.h"
#include "sim-signal.h"
#include "sim-syscall.h"
#include "sim/callback.h"
#include "syscall.h"
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <utime.h>
/* TODO: The Linux syscall emulation needs work to support non-Linux hosts.
   Use an OS hack for now so the CPU emulation is available everywhere.
   NB: The emulation is also missing argument conversion (endian & bitsize)
   even on Linux hosts.  */
#ifdef __linux__
#include <sys/mman.h>
#include <sys/poll.h>
#include <sys/resource.h>
#include <sys/sysinfo.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/timex.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/utsname.h>
#include <sys/vfs.h>
#include <linux/sysctl.h>
#include <linux/types.h>
#include <linux/unistd.h>
#endif

#define TRAP_LINUX_SYSCALL 2
#define TRAP_FLUSH_CACHE 12
/* The semantic code invokes this for invalid (unrecognized) instructions.  */

SEM_PC
sim_engine_invalid_insn (SIM_CPU *current_cpu, IADDR cia, SEM_PC pc)
{
  SIM_DESC sd = CPU_STATE (current_cpu);

#if 0
  if (STATE_ENVIRONMENT (sd) == OPERATING_ENVIRONMENT)
    {
      h_bsm_set (current_cpu, h_sm_get (current_cpu));
      h_bie_set (current_cpu, h_ie_get (current_cpu));
      h_bcond_set (current_cpu, h_cond_get (current_cpu));
      /* sm not changed */
      h_ie_set (current_cpu, 0);
      h_cond_set (current_cpu, 0);

      h_bpc_set (current_cpu, cia);

      sim_engine_restart (CPU_STATE (current_cpu), current_cpu, NULL,
			  EIT_RSVD_INSN_ADDR);
    }
  else
#endif
    sim_engine_halt (sd, current_cpu, NULL, cia, sim_stopped, SIM_SIGILL);

  return pc;
}

/* Process an address exception.  */

void
m32r_core_signal (SIM_DESC sd, SIM_CPU *current_cpu, sim_cia cia,
		  unsigned int map, int nr_bytes, address_word addr,
		  transfer_type transfer, sim_core_signals sig)
{
  if (STATE_ENVIRONMENT (sd) == OPERATING_ENVIRONMENT)
    {
      m32rbf_h_cr_set (current_cpu, H_CR_BBPC,
		       m32rbf_h_cr_get (current_cpu, H_CR_BPC));
      switch (MACH_NUM (CPU_MACH (current_cpu)))
	{
	case MACH_M32R:
	  m32rbf_h_bpsw_set (current_cpu, m32rbf_h_psw_get (current_cpu));
	  /* sm not changed.  */
	  m32rbf_h_psw_set (current_cpu, m32rbf_h_psw_get (current_cpu) & 0x80);
	  break;
	case MACH_M32RX:
  	  m32rxf_h_bpsw_set (current_cpu, m32rxf_h_psw_get (current_cpu));
  	  /* sm not changed.  */
  	  m32rxf_h_psw_set (current_cpu, m32rxf_h_psw_get (current_cpu) & 0x80);
	  break;
	case MACH_M32R2:
	  m32r2f_h_bpsw_set (current_cpu, m32r2f_h_psw_get (current_cpu));
	  /* sm not changed.  */
	  m32r2f_h_psw_set (current_cpu, m32r2f_h_psw_get (current_cpu) & 0x80);
	  break;
	default:
	  abort ();
	}

      m32rbf_h_cr_set (current_cpu, H_CR_BPC, cia);

      sim_engine_restart (CPU_STATE (current_cpu), current_cpu, NULL,
			  EIT_ADDR_EXCP_ADDR);
    }
  else
    sim_core_signal (sd, current_cpu, cia, map, nr_bytes, addr,
		     transfer, sig);
}

/* Translate target's address to host's address.  */

static void *
t2h_addr (host_callback *cb, struct cb_syscall *sc,
	  unsigned long taddr)
{
  void *addr;
  SIM_DESC sd = (SIM_DESC) sc->p1;
  SIM_CPU *cpu = (SIM_CPU *) sc->p2;

  if (taddr == 0)
    return NULL;

  return sim_core_trans_addr (sd, cpu, read_map, taddr);
}

/* TODO: These functions are a big hack and assume that the host runtime has
   type sizes and struct layouts that match the target.  So the Linux emulation
   probaly only really works in 32-bit runtimes.  */

static void
translate_endian_h2t (void *addr, size_t size)
{
  unsigned int *p = (unsigned int *) addr;
  int i;

  for (i = 0; i <= size - 4; i += 4,p++)
    *p = H2T_4 (*p);

  if (i <= size - 2)
    *((unsigned short *) p) = H2T_2 (*((unsigned short *) p));
}

static void
translate_endian_t2h (void *addr, size_t size)
{
  unsigned int *p = (unsigned int *) addr;
  int i;

  for (i = 0; i <= size - 4; i += 4,p++)
    *p = T2H_4 (*p);

  if (i <= size - 2)
    *((unsigned short *) p) = T2H_2 (*((unsigned short *) p));
}

/* Trap support.
   The result is the pc address to continue at.
   Preprocessing like saving the various registers has already been done.  */

USI
m32r_trap (SIM_CPU *current_cpu, PCADDR pc, int num)
{
  SIM_DESC sd = CPU_STATE (current_cpu);
  host_callback *cb = STATE_CALLBACK (sd);

  if (STATE_ENVIRONMENT (sd) == OPERATING_ENVIRONMENT)
    goto case_default;

  switch (num)
    {
    case TRAP_SYSCALL:
      {
	long result, result2;
	int errcode;

	sim_syscall_multi (current_cpu,
			   m32rbf_h_gr_get (current_cpu, 0),
			   m32rbf_h_gr_get (current_cpu, 1),
			   m32rbf_h_gr_get (current_cpu, 2),
			   m32rbf_h_gr_get (current_cpu, 3),
			   m32rbf_h_gr_get (current_cpu, 4),
			   &result, &result2, &errcode);

	m32rbf_h_gr_set (current_cpu, 2, errcode);
	m32rbf_h_gr_set (current_cpu, 0, result);
	m32rbf_h_gr_set (current_cpu, 1, result2);
	break;
      }

#ifdef __linux__
    case TRAP_LINUX_SYSCALL:
      {
	CB_SYSCALL s;
	unsigned int func, arg1, arg2, arg3, arg4, arg5, arg6, arg7;
	int result, result2, errcode;

	if (STATE_ENVIRONMENT (sd) != USER_ENVIRONMENT)
	  goto case_default;

	func = m32rbf_h_gr_get (current_cpu, 7);
	arg1 = m32rbf_h_gr_get (current_cpu, 0);
	arg2 = m32rbf_h_gr_get (current_cpu, 1);
	arg3 = m32rbf_h_gr_get (current_cpu, 2);
	arg4 = m32rbf_h_gr_get (current_cpu, 3);
	arg5 = m32rbf_h_gr_get (current_cpu, 4);
	arg6 = m32rbf_h_gr_get (current_cpu, 5);
	arg7 = m32rbf_h_gr_get (current_cpu, 6);

	CB_SYSCALL_INIT (&s);
	s.func = func;
	s.arg1 = arg1;
	s.arg2 = arg2;
	s.arg3 = arg3;
	s.arg4 = arg4;
	s.arg5 = arg5;
	s.arg6 = arg6;
	s.arg7 = arg7;

	s.p1 = sd;
	s.p2 = current_cpu;
	s.read_mem = sim_syscall_read_mem;
	s.write_mem = sim_syscall_write_mem;

	result = 0;
	result2 = 0;
	errcode = 0;

	switch (func)
	  {
	  case TARGET_LINUX_SYS_exit:
	    sim_engine_halt (sd, current_cpu, NULL, pc, sim_exited, arg1);
	    break;

	  case TARGET_LINUX_SYS_read:
	    result = read (arg1, t2h_addr (cb, &s, arg2), arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_write:
	    result = write (arg1, t2h_addr (cb, &s, arg2), arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_open:
	    result = open ((char *) t2h_addr (cb, &s, arg1), arg2, arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_close:
	    result = close (arg1);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_creat:
	    result = creat ((char *) t2h_addr (cb, &s, arg1), arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_link:
	    result = link ((char *) t2h_addr (cb, &s, arg1),
			   (char *) t2h_addr (cb, &s, arg2));
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_unlink:
	    result = unlink ((char *) t2h_addr (cb, &s, arg1));
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_chdir:
	    result = chdir ((char *) t2h_addr (cb, &s, arg1));
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_time:
	    {
	      time_t t;

	      if (arg1 == 0)
		{
		  result = (int) time (NULL);
		  errcode = errno;
		}
	      else
		{
		  result = (int) time (&t);
		  errcode = errno;

		  if (result != 0)
		    break;

		  t = H2T_4 (t);
		  if ((s.write_mem) (cb, &s, arg1, (char *) &t, sizeof(t)) != sizeof(t))
		    {
		      result = -1;
		      errcode = EINVAL;
		    }
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_mknod:
	    result = mknod ((char *) t2h_addr (cb, &s, arg1),
			    (mode_t) arg2, (dev_t) arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_chmod:
	    result = chmod ((char *) t2h_addr (cb, &s, arg1), (mode_t) arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_lchown32:
	  case TARGET_LINUX_SYS_lchown:
	    result = lchown ((char *) t2h_addr (cb, &s, arg1),
			     (uid_t) arg2, (gid_t) arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_lseek:
	    result = (int) lseek (arg1, (off_t) arg2, arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_getpid:
	    result = getpid ();
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_getuid32:
	  case TARGET_LINUX_SYS_getuid:
	    result = getuid ();
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_utime:
	    {
	      struct utimbuf buf;

	      if (arg2 == 0)
		{
		  result = utime ((char *) t2h_addr (cb, &s, arg1), NULL);
		  errcode = errno;
		}
	      else
		{
		  buf = *((struct utimbuf *) t2h_addr (cb, &s, arg2));
		  translate_endian_t2h (&buf, sizeof(buf));
		  result = utime ((char *) t2h_addr (cb, &s, arg1), &buf);
		  errcode = errno;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_access:
	    result = access ((char *) t2h_addr (cb, &s, arg1), arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_ftime:
	    {
	      struct timeb t;

	      result = ftime (&t);
	      errcode = errno;

	      if (result != 0)
		break;

	      t.time = H2T_4 (t.time);
	      t.millitm = H2T_2 (t.millitm);
	      t.timezone = H2T_2 (t.timezone);
	      t.dstflag = H2T_2 (t.dstflag);
	      if ((s.write_mem) (cb, &s, arg1, (char *) &t, sizeof(t))
		  != sizeof(t))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }

	  case TARGET_LINUX_SYS_sync:
	    sync ();
	    result = 0;
	    break;

	  case TARGET_LINUX_SYS_rename:
	    result = rename ((char *) t2h_addr (cb, &s, arg1),
			     (char *) t2h_addr (cb, &s, arg2));
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_mkdir:
	    result = mkdir ((char *) t2h_addr (cb, &s, arg1), arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_rmdir:
	    result = rmdir ((char *) t2h_addr (cb, &s, arg1));
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_dup:
	    result = dup (arg1);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_brk:
	    result = brk ((void *) arg1);
	    errcode = errno;
	    //result = arg1;
	    break;

	  case TARGET_LINUX_SYS_getgid32:
	  case TARGET_LINUX_SYS_getgid:
	    result = getgid ();
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_geteuid32:
	  case TARGET_LINUX_SYS_geteuid:
	    result = geteuid ();
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_getegid32:
	  case TARGET_LINUX_SYS_getegid:
	    result = getegid ();
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_ioctl:
	    result = ioctl (arg1, arg2, arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_fcntl:
	    result = fcntl (arg1, arg2, arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_dup2:
	    result = dup2 (arg1, arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_getppid:
	    result = getppid ();
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_getpgrp:
	    result = getpgrp ();
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_getrlimit:
	    {
	      struct rlimit rlim;

	      result = getrlimit (arg1, &rlim);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&rlim, sizeof(rlim));
	      if ((s.write_mem) (cb, &s, arg2, (char *) &rlim, sizeof(rlim))
		  != sizeof(rlim))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_getrusage:
	    {
	      struct rusage usage;

	      result = getrusage (arg1, &usage);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&usage, sizeof(usage));
	      if ((s.write_mem) (cb, &s, arg2, (char *) &usage, sizeof(usage))
		  != sizeof(usage))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_gettimeofday:
	    {
	      struct timeval tv;
	      struct timezone tz;

	      result = gettimeofday (&tv, &tz);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&tv, sizeof(tv));
	      if ((s.write_mem) (cb, &s, arg1, (char *) &tv, sizeof(tv))
		  != sizeof(tv))
		{
		  result = -1;
		  errcode = EINVAL;
		}

	      translate_endian_h2t (&tz, sizeof(tz));
	      if ((s.write_mem) (cb, &s, arg2, (char *) &tz, sizeof(tz))
		  != sizeof(tz))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_getgroups32:
	  case TARGET_LINUX_SYS_getgroups:
	    {
	      gid_t *list;

	      if (arg1 > 0)
		list = (gid_t *) malloc (arg1 * sizeof(gid_t));

	      result = getgroups (arg1, list);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (list, arg1 * sizeof(gid_t));
	      if (arg1 > 0)
		if ((s.write_mem) (cb, &s, arg2, (char *) list, arg1 * sizeof(gid_t))
		    != arg1 * sizeof(gid_t))
		  {
		    result = -1;
		     errcode = EINVAL;
		  }
	    }
	    break;

	  case TARGET_LINUX_SYS_select:
	    {
	      int n;
	      fd_set readfds;
	      fd_set *treadfdsp;
	      fd_set *hreadfdsp;
	      fd_set writefds;
	      fd_set *twritefdsp;
	      fd_set *hwritefdsp;
	      fd_set exceptfds;
	      fd_set *texceptfdsp;
	      fd_set *hexceptfdsp;
	      struct timeval *ttimeoutp;
	      struct timeval timeout;

	      n = arg1;

	      treadfdsp = (fd_set *) arg2;
	      if (treadfdsp != NULL)
		{
		  readfds = *((fd_set *) t2h_addr (cb, &s, (unsigned int) treadfdsp));
		  translate_endian_t2h (&readfds, sizeof(readfds));
		  hreadfdsp = &readfds;
		}
	      else
		hreadfdsp = NULL;

	      twritefdsp  = (fd_set *) arg3;
	      if (twritefdsp != NULL)
		{
		  writefds = *((fd_set *) t2h_addr (cb, &s, (unsigned int) twritefdsp));
		  translate_endian_t2h (&writefds, sizeof(writefds));
		  hwritefdsp = &writefds;
		}
	      else
		hwritefdsp = NULL;

	      texceptfdsp = (fd_set *) arg4;
	      if (texceptfdsp != NULL)
		{
		  exceptfds = *((fd_set *) t2h_addr (cb, &s, (unsigned int) texceptfdsp));
		  translate_endian_t2h (&exceptfds, sizeof(exceptfds));
		  hexceptfdsp = &exceptfds;
		}
	      else
		hexceptfdsp = NULL;

	      ttimeoutp = (struct timeval *) arg5;
	      timeout = *((struct timeval *) t2h_addr (cb, &s, (unsigned int) ttimeoutp));
	      translate_endian_t2h (&timeout, sizeof(timeout));

	      result = select (n, hreadfdsp, hwritefdsp, hexceptfdsp, &timeout);
	      errcode = errno;

	      if (result != 0)
		break;

	      if (treadfdsp != NULL)
		{
		  translate_endian_h2t (&readfds, sizeof(readfds));
		  if ((s.write_mem) (cb, &s, (unsigned long) treadfdsp,
		       (char *) &readfds, sizeof(readfds)) != sizeof(readfds))
		    {
		      result = -1;
		      errcode = EINVAL;
		    }
		}

	      if (twritefdsp != NULL)
		{
		  translate_endian_h2t (&writefds, sizeof(writefds));
		  if ((s.write_mem) (cb, &s, (unsigned long) twritefdsp,
		       (char *) &writefds, sizeof(writefds)) != sizeof(writefds))
		    {
		      result = -1;
		      errcode = EINVAL;
		    }
		}

	      if (texceptfdsp != NULL)
		{
		  translate_endian_h2t (&exceptfds, sizeof(exceptfds));
		  if ((s.write_mem) (cb, &s, (unsigned long) texceptfdsp,
		       (char *) &exceptfds, sizeof(exceptfds)) != sizeof(exceptfds))
		    {
		      result = -1;
		      errcode = EINVAL;
		    }
		}

	      translate_endian_h2t (&timeout, sizeof(timeout));
	      if ((s.write_mem) (cb, &s, (unsigned long) ttimeoutp,
		   (char *) &timeout, sizeof(timeout)) != sizeof(timeout))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_symlink:
	    result = symlink ((char *) t2h_addr (cb, &s, arg1),
			      (char *) t2h_addr (cb, &s, arg2));
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_readlink:
	    result = readlink ((char *) t2h_addr (cb, &s, arg1),
			       (char *) t2h_addr (cb, &s, arg2),
			       arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_readdir:
	    result = (int) readdir ((DIR *) t2h_addr (cb, &s, arg1));
	    errcode = errno;
	    break;

#if 0
	  case TARGET_LINUX_SYS_mmap:
	    {
	      result = (int) mmap ((void *) t2h_addr (cb, &s, arg1),
				   arg2, arg3, arg4, arg5, arg6);
	      errcode = errno;

	      if (errno == 0)
		{
		  sim_core_attach (sd, NULL,
				   0, access_read_write_exec, 0,
				   result, arg2, 0, NULL, NULL);
		}
	    }
	    break;
#endif
	  case TARGET_LINUX_SYS_mmap2:
	    {
	      void *addr;
	      size_t len;
	      int prot, flags, fildes;
	      off_t off;

	      addr   = (void *) t2h_addr (cb, &s, arg1);
	      len    = arg2;
	      prot   = arg3;
	      flags  = arg4;
	      fildes = arg5;
	      off    = arg6 << 12;

	      result = (int) mmap (addr, len, prot, flags, fildes, off);
	      errcode = errno;
	      if (result != -1)
		{
		  char c;
		  if (sim_core_read_buffer (sd, NULL, read_map, &c, result, 1) == 0)
		    sim_core_attach (sd, NULL,
				     0, access_read_write_exec, 0,
				     result, len, 0, NULL, NULL);
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_mmap:
	    {
	      void *addr;
	      size_t len;
	      int prot, flags, fildes;
	      off_t off;

	      addr   = *((void **)  t2h_addr (cb, &s, arg1));
	      len    = *((size_t *) t2h_addr (cb, &s, arg1 + 4));
	      prot   = *((int *)    t2h_addr (cb, &s, arg1 + 8));
	      flags  = *((int *)    t2h_addr (cb, &s, arg1 + 12));
	      fildes = *((int *)    t2h_addr (cb, &s, arg1 + 16));
	      off    = *((off_t *)  t2h_addr (cb, &s, arg1 + 20));

	      addr   = (void *) T2H_4 ((unsigned int) addr);
	      len    = T2H_4 (len);
	      prot   = T2H_4 (prot);
	      flags  = T2H_4 (flags);
	      fildes = T2H_4 (fildes);
	      off    = T2H_4 (off);

	      //addr   = (void *) t2h_addr (cb, &s, (unsigned int) addr);
	      result = (int) mmap (addr, len, prot, flags, fildes, off);
	      errcode = errno;

	      //if (errno == 0)
	      if (result != -1)
		{
		  char c;
		  if (sim_core_read_buffer (sd, NULL, read_map, &c, result, 1) == 0)
		    sim_core_attach (sd, NULL,
				     0, access_read_write_exec, 0,
				     result, len, 0, NULL, NULL);
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_munmap:
	    result = munmap ((void *)arg1, arg2);
	    errcode = errno;
	    if (result != -1)
	      sim_core_detach (sd, NULL, 0, arg2, result);
	    break;

	  case TARGET_LINUX_SYS_truncate:
	    result = truncate ((char *) t2h_addr (cb, &s, arg1), arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_ftruncate:
	    result = ftruncate (arg1, arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_fchmod:
	    result = fchmod (arg1, arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_fchown32:
	  case TARGET_LINUX_SYS_fchown:
	    result = fchown (arg1, arg2, arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_statfs:
	    {
	      struct statfs statbuf;

	      result = statfs ((char *) t2h_addr (cb, &s, arg1), &statbuf);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&statbuf, sizeof(statbuf));
	      if ((s.write_mem) (cb, &s, arg2, (char *) &statbuf, sizeof(statbuf))
		  != sizeof(statbuf))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_fstatfs:
	    {
	      struct statfs statbuf;

	      result = fstatfs (arg1, &statbuf);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&statbuf, sizeof(statbuf));
	      if ((s.write_mem) (cb, &s, arg2, (char *) &statbuf, sizeof(statbuf))
		  != sizeof(statbuf))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_syslog:
	    result = syslog (arg1, (char *) t2h_addr (cb, &s, arg2));
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_setitimer:
	    {
	      struct itimerval value, ovalue;

	      value = *((struct itimerval *) t2h_addr (cb, &s, arg2));
	      translate_endian_t2h (&value, sizeof(value));

	      if (arg2 == 0)
		{
		  result = setitimer (arg1, &value, NULL);
		  errcode = errno;
		}
	      else
		{
		  result = setitimer (arg1, &value, &ovalue);
		  errcode = errno;

		  if (result != 0)
		    break;

		  translate_endian_h2t (&ovalue, sizeof(ovalue));
		  if ((s.write_mem) (cb, &s, arg3, (char *) &ovalue, sizeof(ovalue))
		      != sizeof(ovalue))
		    {
		      result = -1;
		      errcode = EINVAL;
		    }
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_getitimer:
	    {
	      struct itimerval value;

	      result = getitimer (arg1, &value);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&value, sizeof(value));
	      if ((s.write_mem) (cb, &s, arg2, (char *) &value, sizeof(value))
		  != sizeof(value))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_stat:
	    {
	      char *buf;
	      int buflen;
	      struct stat statbuf;

	      result = stat ((char *) t2h_addr (cb, &s, arg1), &statbuf);
	      errcode = errno;
	      if (result < 0)
		break;

	      buflen = cb_host_to_target_stat (cb, NULL, NULL);
	      buf = xmalloc (buflen);
	      if (cb_host_to_target_stat (cb, &statbuf, buf) != buflen)
		{
		  /* The translation failed.  This is due to an internal
		     host program error, not the target's fault.  */
		  free (buf);
		  result = -1;
		  errcode = ENOSYS;
		  break;
		}
	      if ((s.write_mem) (cb, &s, arg2, buf, buflen) != buflen)
		{
		  free (buf);
		  result = -1;
		  errcode = EINVAL;
		  break;
		}
	      free (buf);
	    }
	    break;

	  case TARGET_LINUX_SYS_lstat:
	    {
	      char *buf;
	      int buflen;
	      struct stat statbuf;

	      result = lstat ((char *) t2h_addr (cb, &s, arg1), &statbuf);
	      errcode = errno;
	      if (result < 0)
		break;

	      buflen = cb_host_to_target_stat (cb, NULL, NULL);
	      buf = xmalloc (buflen);
	      if (cb_host_to_target_stat (cb, &statbuf, buf) != buflen)
		{
		  /* The translation failed.  This is due to an internal
		     host program error, not the target's fault.  */
		  free (buf);
		  result = -1;
		  errcode = ENOSYS;
		  break;
		}
	      if ((s.write_mem) (cb, &s, arg2, buf, buflen) != buflen)
		{
		  free (buf);
		  result = -1;
		  errcode = EINVAL;
		  break;
		}
	      free (buf);
	    }
	    break;

	  case TARGET_LINUX_SYS_fstat:
	    {
	      char *buf;
	      int buflen;
	      struct stat statbuf;

	      result = fstat (arg1, &statbuf);
	      errcode = errno;
	      if (result < 0)
		break;

	      buflen = cb_host_to_target_stat (cb, NULL, NULL);
	      buf = xmalloc (buflen);
	      if (cb_host_to_target_stat (cb, &statbuf, buf) != buflen)
		{
		  /* The translation failed.  This is due to an internal
		     host program error, not the target's fault.  */
		  free (buf);
		  result = -1;
		  errcode = ENOSYS;
		  break;
		}
	      if ((s.write_mem) (cb, &s, arg2, buf, buflen) != buflen)
		{
		  free (buf);
		  result = -1;
		  errcode = EINVAL;
		  break;
		}
	      free (buf);
	    }
	    break;

	  case TARGET_LINUX_SYS_sysinfo:
	    {
	      struct sysinfo info;

	      result = sysinfo (&info);
	      errcode = errno;

	      if (result != 0)
		break;

	      info.uptime    = H2T_4 (info.uptime);
	      info.loads[0]  = H2T_4 (info.loads[0]);
	      info.loads[1]  = H2T_4 (info.loads[1]);
	      info.loads[2]  = H2T_4 (info.loads[2]);
	      info.totalram  = H2T_4 (info.totalram);
	      info.freeram   = H2T_4 (info.freeram);
	      info.sharedram = H2T_4 (info.sharedram);
	      info.bufferram = H2T_4 (info.bufferram);
	      info.totalswap = H2T_4 (info.totalswap);
	      info.freeswap  = H2T_4 (info.freeswap);
	      info.procs     = H2T_2 (info.procs);
#if LINUX_VERSION_CODE >= 0x20400
	      info.totalhigh = H2T_4 (info.totalhigh);
	      info.freehigh  = H2T_4 (info.freehigh);
	      info.mem_unit  = H2T_4 (info.mem_unit);
#endif
	      if ((s.write_mem) (cb, &s, arg1, (char *) &info, sizeof(info))
		  != sizeof(info))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

#if 0
	  case TARGET_LINUX_SYS_ipc:
	    {
	      result = ipc (arg1, arg2, arg3, arg4,
			    (void *) t2h_addr (cb, &s, arg5), arg6);
	      errcode = errno;
	    }
	    break;
#endif

	  case TARGET_LINUX_SYS_fsync:
	    result = fsync (arg1);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_uname:
	    /* utsname contains only arrays of char, so it is not necessary
	       to translate endian. */
	    result = uname ((struct utsname *) t2h_addr (cb, &s, arg1));
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_adjtimex:
	    {
	      struct timex buf;

	      result = adjtimex (&buf);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&buf, sizeof(buf));
	      if ((s.write_mem) (cb, &s, arg1, (char *) &buf, sizeof(buf))
		  != sizeof(buf))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_mprotect:
	    result = mprotect ((void *) arg1, arg2, arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_fchdir:
	    result = fchdir (arg1);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_setfsuid32:
	  case TARGET_LINUX_SYS_setfsuid:
	    result = setfsuid (arg1);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_setfsgid32:
	  case TARGET_LINUX_SYS_setfsgid:
	    result = setfsgid (arg1);
	    errcode = errno;
	    break;

#if 0
	  case TARGET_LINUX_SYS__llseek:
	    {
	      loff_t buf;

	      result = _llseek (arg1, arg2, arg3, &buf, arg5);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&buf, sizeof(buf));
	      if ((s.write_mem) (cb, &s, t2h_addr (cb, &s, arg4),
				 (char *) &buf, sizeof(buf)) != sizeof(buf))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_getdents:
	    {
	      struct dirent dir;

	      result = getdents (arg1, &dir, arg3);
	      errcode = errno;

	      if (result != 0)
		break;

	      dir.d_ino = H2T_4 (dir.d_ino);
	      dir.d_off = H2T_4 (dir.d_off);
	      dir.d_reclen = H2T_2 (dir.d_reclen);
	      if ((s.write_mem) (cb, &s, arg2, (char *) &dir, sizeof(dir))
		  != sizeof(dir))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;
#endif

	  case TARGET_LINUX_SYS_flock:
	    result = flock (arg1, arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_msync:
	    result = msync ((void *) arg1, arg2, arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_readv:
	    {
	      struct iovec vector;

	      vector = *((struct iovec *) t2h_addr (cb, &s, arg2));
	      translate_endian_t2h (&vector, sizeof(vector));

	      result = readv (arg1, &vector, arg3);
	      errcode = errno;
	    }
	    break;

	  case TARGET_LINUX_SYS_writev:
	    {
	      struct iovec vector;

	      vector = *((struct iovec *) t2h_addr (cb, &s, arg2));
	      translate_endian_t2h (&vector, sizeof(vector));

	      result = writev (arg1, &vector, arg3);
	      errcode = errno;
	    }
	    break;

	  case TARGET_LINUX_SYS_fdatasync:
	    result = fdatasync (arg1);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_mlock:
	    result = mlock ((void *) t2h_addr (cb, &s, arg1), arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_munlock:
	    result = munlock ((void *) t2h_addr (cb, &s, arg1), arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_nanosleep:
	    {
	      struct timespec req, rem;

	      req = *((struct timespec *) t2h_addr (cb, &s, arg2));
	      translate_endian_t2h (&req, sizeof(req));

	      result = nanosleep (&req, &rem);
	      errcode = errno;

	      if (result != 0)
		break;

	      translate_endian_h2t (&rem, sizeof(rem));
	      if ((s.write_mem) (cb, &s, arg2, (char *) &rem, sizeof(rem))
		  != sizeof(rem))
		{
		  result = -1;
		  errcode = EINVAL;
		}
	    }
	    break;

	  case TARGET_LINUX_SYS_mremap: /* FIXME */
	    result = (int) mremap ((void *) t2h_addr (cb, &s, arg1), arg2, arg3, arg4);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_getresuid32:
	  case TARGET_LINUX_SYS_getresuid:
	    {
	      uid_t ruid, euid, suid;

	      result = getresuid (&ruid, &euid, &suid);
	      errcode = errno;

	      if (result != 0)
		break;

	      *((uid_t *) t2h_addr (cb, &s, arg1)) = H2T_4 (ruid);
	      *((uid_t *) t2h_addr (cb, &s, arg2)) = H2T_4 (euid);
	      *((uid_t *) t2h_addr (cb, &s, arg3)) = H2T_4 (suid);
	    }
	    break;

	  case TARGET_LINUX_SYS_poll:
	    {
	      struct pollfd ufds;

	      ufds = *((struct pollfd *) t2h_addr (cb, &s, arg1));
	      ufds.fd = T2H_4 (ufds.fd);
	      ufds.events = T2H_2 (ufds.events);
	      ufds.revents = T2H_2 (ufds.revents);

	      result = poll (&ufds, arg2, arg3);
	      errcode = errno;
	    }
	    break;

	  case TARGET_LINUX_SYS_getresgid32:
	  case TARGET_LINUX_SYS_getresgid:
	    {
	      uid_t rgid, egid, sgid;

	      result = getresgid (&rgid, &egid, &sgid);
	      errcode = errno;

	      if (result != 0)
		break;

	      *((uid_t *) t2h_addr (cb, &s, arg1)) = H2T_4 (rgid);
	      *((uid_t *) t2h_addr (cb, &s, arg2)) = H2T_4 (egid);
	      *((uid_t *) t2h_addr (cb, &s, arg3)) = H2T_4 (sgid);
	    }
	    break;

	  case TARGET_LINUX_SYS_pread:
	    result =  pread (arg1, (void *) t2h_addr (cb, &s, arg2), arg3, arg4);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_pwrite:
	    result =  pwrite (arg1, (void *) t2h_addr (cb, &s, arg2), arg3, arg4);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_chown32:
	  case TARGET_LINUX_SYS_chown:
	    result = chown ((char *) t2h_addr (cb, &s, arg1), arg2, arg3);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_getcwd:
	    result = (int) getcwd ((char *) t2h_addr (cb, &s, arg1), arg2);
	    errcode = errno;
	    break;

	  case TARGET_LINUX_SYS_sendfile:
	    {
	      off_t offset;

	      offset = *((off_t *) t2h_addr (cb, &s, arg3));
	      offset = T2H_4 (offset);

	      result = sendfile (arg1, arg2, &offset, arg3);
	      errcode = errno;

	      if (result != 0)
		break;

	      *((off_t *) t2h_addr (cb, &s, arg3)) = H2T_4 (offset);
	    }
	    break;

	  default:
	    result = -1;
	    errcode = ENOSYS;
	    break;
	  }

	if (result == -1)
	  m32rbf_h_gr_set (current_cpu, 0, -errcode);
	else
	  m32rbf_h_gr_set (current_cpu, 0, result);
	break;
      }
#endif

    case TRAP_BREAKPOINT:
      sim_engine_halt (sd, current_cpu, NULL, pc,
		       sim_stopped, SIM_SIGTRAP);
      break;

    case TRAP_FLUSH_CACHE:
      /* Do nothing.  */
      break;

    case_default:
    default:
      {
	/* The new pc is the trap vector entry.
	   We assume there's a branch there to some handler.
	   Use cr5 as EVB (EIT Vector Base) register.  */
	/* USI new_pc = EIT_TRAP_BASE_ADDR + num * 4; */
	USI new_pc = m32rbf_h_cr_get (current_cpu, 5) + 0x40 + num * 4;
	return new_pc;
      }
    }

  /* Fake an "rte" insn.  */
  /* FIXME: Should duplicate all of rte processing.  */
  return (pc & -4) + 4;
}
