/* Process record and replay target code for GNU/Linux.

   Copyright (C) 2008-2022 Free Software Foundation, Inc.

   This file is part of GDB.

   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/>.  */

#include "defs.h"
#include "target.h"
#include "gdbtypes.h"
#include "regcache.h"
#include "record.h"
#include "record-full.h"
#include "linux-record.h"
#include "gdbarch.h"

/* These macros are the values of the first argument of system call
   "sys_ptrace".  The values of these macros were obtained from Linux
   Kernel source.  */

#define RECORD_PTRACE_PEEKTEXT	1
#define RECORD_PTRACE_PEEKDATA	2
#define RECORD_PTRACE_PEEKUSR	3

/* These macros are the values of the first argument of system call
   "sys_socketcall".  The values of these macros were obtained from
   Linux Kernel source.  */

#define RECORD_SYS_SOCKET	1
#define RECORD_SYS_BIND		2
#define RECORD_SYS_CONNECT	3
#define RECORD_SYS_LISTEN	4
#define RECORD_SYS_ACCEPT	5
#define RECORD_SYS_GETSOCKNAME	6
#define RECORD_SYS_GETPEERNAME	7
#define RECORD_SYS_SOCKETPAIR	8
#define RECORD_SYS_SEND		9
#define RECORD_SYS_RECV		10
#define RECORD_SYS_SENDTO	11
#define RECORD_SYS_RECVFROM	12
#define RECORD_SYS_SHUTDOWN	13
#define RECORD_SYS_SETSOCKOPT	14
#define RECORD_SYS_GETSOCKOPT	15
#define RECORD_SYS_SENDMSG	16
#define RECORD_SYS_RECVMSG	17

/* These macros are the values of the first argument of system call
   "sys_ipc".  The values of these macros were obtained from Linux
   Kernel source.  */

#define RECORD_SEMOP		1
#define RECORD_SEMGET		2
#define RECORD_SEMCTL		3
#define RECORD_SEMTIMEDOP	4
#define RECORD_MSGSND		11
#define RECORD_MSGRCV		12
#define RECORD_MSGGET		13
#define RECORD_MSGCTL		14
#define RECORD_SHMAT		21
#define RECORD_SHMDT		22
#define RECORD_SHMGET		23
#define RECORD_SHMCTL		24

/* These macros are the values of the first argument of system call
   "sys_quotactl".  The values of these macros were obtained from Linux
   Kernel source.  */

#define RECORD_Q_GETFMT		0x800004
#define RECORD_Q_GETINFO	0x800005
#define RECORD_Q_GETQUOTA	0x800007
#define RECORD_Q_XGETQSTAT	(('5' << 8) + 5)
#define RECORD_Q_XGETQUOTA	(('3' << 8) + 3)

#define OUTPUT_REG(val, num)      phex_nz ((val), \
    gdbarch_register_type (regcache->arch (), (num))->length ())

/* Record a memory area of length LEN pointed to by register
   REGNUM.  */

static int
record_mem_at_reg (struct regcache *regcache, int regnum, int len)
{
  ULONGEST addr;

  regcache_raw_read_unsigned (regcache, regnum, &addr);
  return record_full_arch_list_add_mem ((CORE_ADDR) addr, len);
}

static int
record_linux_sockaddr (struct regcache *regcache,
		       struct linux_record_tdep *tdep, ULONGEST addr,
		       ULONGEST len)
{
  gdb_byte *a;
  int addrlen;
  struct gdbarch *gdbarch = regcache->arch ();
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);

  if (!addr)
    return 0;

  a = (gdb_byte *) alloca (tdep->size_int);

  if (record_full_arch_list_add_mem ((CORE_ADDR) len, tdep->size_int))
    return -1;

  /* Get the addrlen.  */
  if (target_read_memory ((CORE_ADDR) len, a, tdep->size_int))
    {
      if (record_debug)
	gdb_printf (gdb_stdlog,
		    "Process record: error reading "
		    "memory at addr = 0x%s len = %d.\n",
		    phex_nz (len, tdep->size_pointer),
		    tdep->size_int);
      return -1;
    }
  addrlen = (int) extract_unsigned_integer (a, tdep->size_int, byte_order);
  if (addrlen <= 0 || addrlen > tdep->size_sockaddr)
    addrlen = tdep->size_sockaddr;

  if (record_full_arch_list_add_mem ((CORE_ADDR) addr, addrlen))
    return -1;

  return 0;
}

static int
record_linux_msghdr (struct regcache *regcache,
		     struct linux_record_tdep *tdep, ULONGEST addr)
{
  gdb_byte *a;
  struct gdbarch *gdbarch = regcache->arch ();
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  CORE_ADDR tmpaddr;
  int tmpint;

  if (!addr)
    return 0;

  if (record_full_arch_list_add_mem ((CORE_ADDR) addr, tdep->size_msghdr))
    return -1;

  a = (gdb_byte *) alloca (tdep->size_msghdr);
  if (target_read_memory ((CORE_ADDR) addr, a, tdep->size_msghdr))
    {
      if (record_debug)
	gdb_printf (gdb_stdlog,
		    "Process record: error reading "
		    "memory at addr = 0x%s "
		    "len = %d.\n",
		    phex_nz (addr, tdep->size_pointer),
		    tdep->size_msghdr);
      return -1;
    }

  /* msg_name msg_namelen */
  addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
  a += tdep->size_pointer;
  if (record_full_arch_list_add_mem
      ((CORE_ADDR) addr,
       (int) extract_unsigned_integer (a,
				       tdep->size_int,
				       byte_order)))
    return -1;
  /* We have read an int, but skip size_pointer bytes to account for alignment
     of the next field on 64-bit targets. */
  a += tdep->size_pointer;

  /* msg_iov msg_iovlen */
  addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
  a += tdep->size_pointer;
  if (addr)
    {
      ULONGEST i;
      ULONGEST len = extract_unsigned_integer (a, tdep->size_size_t,
					       byte_order);
      gdb_byte *iov = (gdb_byte *) alloca (tdep->size_iovec);

      for (i = 0; i < len; i++)
	{
	  if (target_read_memory ((CORE_ADDR) addr, iov, tdep->size_iovec))
	    {
	      if (record_debug)
		gdb_printf (gdb_stdlog,
			    "Process record: error "
			    "reading memory at "
			    "addr = 0x%s "
			    "len = %d.\n",
			    phex_nz (addr,tdep->size_pointer),
			    tdep->size_iovec);
	      return -1;
	    }
	  tmpaddr = (CORE_ADDR) extract_unsigned_integer (iov,
							  tdep->size_pointer,
							  byte_order);
	  tmpint = (int) extract_unsigned_integer (iov + tdep->size_pointer,
						   tdep->size_size_t,
						   byte_order);
	  if (record_full_arch_list_add_mem (tmpaddr, tmpint))
	    return -1;
	  addr += tdep->size_iovec;
	}
    }
  a += tdep->size_size_t;

  /* msg_control msg_controllen */
  addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
  a += tdep->size_pointer;
  tmpint = (int) extract_unsigned_integer (a, tdep->size_size_t, byte_order);
  if (record_full_arch_list_add_mem ((CORE_ADDR) addr, tmpint))
    return -1;

  return 0;
}

/* When the architecture process record get a Linux syscall
   instruction, it will get a Linux syscall number of this
   architecture and convert it to the Linux syscall number "num" which
   is internal to GDB.  Most Linux syscalls across architectures in
   Linux would be similar and mostly differ by sizes of types and
   structures.  This sizes are put to "tdep".

   Record the values of the registers and memory that will be changed
   in current system call.

   Return -1 if something wrong.  */

int
record_linux_system_call (enum gdb_syscall syscall,
			  struct regcache *regcache,
			  struct linux_record_tdep *tdep)
{
  struct gdbarch *gdbarch = regcache->arch ();
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  ULONGEST tmpulongest;
  CORE_ADDR tmpaddr;
  int tmpint;

  switch (syscall)
    {
    case gdb_sys_restart_syscall:
      break;

    case gdb_sys_exit:
      if (yquery (_("The next instruction is syscall exit.  "
		    "It will make the program exit.  "
		    "Do you want to stop the program?")))
	return 1;
      break;

    case gdb_sys_fork:
      break;

    case gdb_sys_read:
    case gdb_sys_readlink:
    case gdb_sys_recv:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_mem_at_reg (regcache, tdep->arg2, (int) tmpulongest))
	return -1;
      break;

    case gdb_sys_write:
    case gdb_sys_open:
    case gdb_sys_close:
      break;

    case gdb_sys_waitpid:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					   tdep->size_int))
	  return -1;
      break;

    case gdb_sys_creat:
    case gdb_sys_link:
    case gdb_sys_unlink:
    case gdb_sys_execve:
    case gdb_sys_chdir:
      break;

    case gdb_sys_time:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest)
	if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					   tdep->size_time_t))
	  return -1;
      break;

    case gdb_sys_mknod:
    case gdb_sys_chmod:
    case gdb_sys_lchown16:
    case gdb_sys_ni_syscall17:
      break;

    case gdb_sys_stat:
    case gdb_sys_fstat:
    case gdb_sys_lstat:
      if (record_mem_at_reg (regcache, tdep->arg2,
			     tdep->size__old_kernel_stat))
	return -1;
      break;

    case gdb_sys_lseek:
    case gdb_sys_getpid:
    case gdb_sys_mount:
    case gdb_sys_oldumount:
    case gdb_sys_setuid16:
    case gdb_sys_getuid16:
    case gdb_sys_stime:
      break;

    case gdb_sys_ptrace:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest == RECORD_PTRACE_PEEKTEXT
	  || tmpulongest == RECORD_PTRACE_PEEKDATA
	  || tmpulongest == RECORD_PTRACE_PEEKUSR)
	{
	  if (record_mem_at_reg (regcache, tdep->arg4, 4))
	    return -1;
	}
      break;

    case gdb_sys_alarm:
    case gdb_sys_pause:
    case gdb_sys_utime:
    case gdb_sys_ni_syscall31:
    case gdb_sys_ni_syscall32:
    case gdb_sys_access:
    case gdb_sys_nice:
    case gdb_sys_ni_syscall35:
    case gdb_sys_sync:
    case gdb_sys_kill:
    case gdb_sys_rename:
    case gdb_sys_mkdir:
    case gdb_sys_rmdir:
    case gdb_sys_dup:
      break;

    case gdb_sys_pipe:
    case gdb_sys_pipe2:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int * 2))
	return -1;
      break;

    case gdb_sys_getrandom:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_mem_at_reg (regcache, tdep->arg1, tmpulongest))
	return -1;
      break;

    case gdb_sys_times:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_tms))
	return -1;
      break;

    case gdb_sys_ni_syscall44:
    case gdb_sys_brk:
    case gdb_sys_setgid16:
    case gdb_sys_getgid16:
    case gdb_sys_signal:
    case gdb_sys_geteuid16:
    case gdb_sys_getegid16:
    case gdb_sys_acct:
    case gdb_sys_umount:
    case gdb_sys_ni_syscall53:
      break;

    case gdb_sys_ioctl:
      /* XXX Need to add a lot of support of other ioctl requests.  */
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest == tdep->ioctl_FIOCLEX
	  || tmpulongest == tdep->ioctl_FIONCLEX
	  || tmpulongest == tdep->ioctl_FIONBIO
	  || tmpulongest == tdep->ioctl_FIOASYNC
	  || tmpulongest == tdep->ioctl_TCSETS
	  || tmpulongest == tdep->ioctl_TCSETSW
	  || tmpulongest == tdep->ioctl_TCSETSF
	  || tmpulongest == tdep->ioctl_TCSETA
	  || tmpulongest == tdep->ioctl_TCSETAW
	  || tmpulongest == tdep->ioctl_TCSETAF
	  || tmpulongest == tdep->ioctl_TCSBRK
	  || tmpulongest == tdep->ioctl_TCXONC
	  || tmpulongest == tdep->ioctl_TCFLSH
	  || tmpulongest == tdep->ioctl_TIOCEXCL
	  || tmpulongest == tdep->ioctl_TIOCNXCL
	  || tmpulongest == tdep->ioctl_TIOCSCTTY
	  || tmpulongest == tdep->ioctl_TIOCSPGRP
	  || tmpulongest == tdep->ioctl_TIOCSTI
	  || tmpulongest == tdep->ioctl_TIOCSWINSZ
	  || tmpulongest == tdep->ioctl_TIOCMBIS
	  || tmpulongest == tdep->ioctl_TIOCMBIC
	  || tmpulongest == tdep->ioctl_TIOCMSET
	  || tmpulongest == tdep->ioctl_TIOCSSOFTCAR
	  || tmpulongest == tdep->ioctl_TIOCCONS
	  || tmpulongest == tdep->ioctl_TIOCSSERIAL
	  || tmpulongest == tdep->ioctl_TIOCPKT
	  || tmpulongest == tdep->ioctl_TIOCNOTTY
	  || tmpulongest == tdep->ioctl_TIOCSETD
	  || tmpulongest == tdep->ioctl_TCSBRKP
	  || tmpulongest == tdep->ioctl_TIOCTTYGSTRUCT
	  || tmpulongest == tdep->ioctl_TIOCSBRK
	  || tmpulongest == tdep->ioctl_TIOCCBRK
	  || tmpulongest == tdep->ioctl_TCSETS2
	  || tmpulongest == tdep->ioctl_TCSETSW2
	  || tmpulongest == tdep->ioctl_TCSETSF2
	  || tmpulongest == tdep->ioctl_TIOCSPTLCK
	  || tmpulongest == tdep->ioctl_TIOCSERCONFIG
	  || tmpulongest == tdep->ioctl_TIOCSERGWILD
	  || tmpulongest == tdep->ioctl_TIOCSERSWILD
	  || tmpulongest == tdep->ioctl_TIOCSLCKTRMIOS
	  || tmpulongest == tdep->ioctl_TIOCSERGETMULTI
	  || tmpulongest == tdep->ioctl_TIOCSERSETMULTI
	  || tmpulongest == tdep->ioctl_TIOCMIWAIT
	  || tmpulongest == tdep->ioctl_TIOCSHAYESESP)
	{
	  /* Nothing to do.  */
	}
      else if (tmpulongest == tdep->ioctl_TCGETS
	       || tmpulongest == tdep->ioctl_TCGETA
	       || tmpulongest == tdep->ioctl_TIOCGLCKTRMIOS)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3,
				 tdep->size_termios))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TIOCGPGRP
	       || tmpulongest == tdep->ioctl_TIOCGSID)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_pid_t))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TIOCOUTQ
	       || tmpulongest == tdep->ioctl_TIOCMGET
	       || tmpulongest == tdep->ioctl_TIOCGSOFTCAR
	       || tmpulongest == tdep->ioctl_FIONREAD
	       || tmpulongest == tdep->ioctl_TIOCINQ
	       || tmpulongest == tdep->ioctl_TIOCGETD
	       || tmpulongest == tdep->ioctl_TIOCGPTN
	       || tmpulongest == tdep->ioctl_TIOCSERGETLSR)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_int))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TIOCGWINSZ)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3,
				 tdep->size_winsize))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TIOCLINUX)
	{
	  /* This syscall affects a char-size memory.  */
	  if (record_mem_at_reg (regcache, tdep->arg3, 1))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TIOCGSERIAL)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3,
				 tdep->size_serial_struct))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TCGETS2)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3,
				 tdep->size_termios2))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_FIOQSIZE)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_loff_t))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TIOCGICOUNT)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3,
				 tdep->size_serial_icounter_struct))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TIOCGHAYESESP)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3,
				 tdep->size_hayes_esp_config))
	    return -1;
	}
      else if (tmpulongest == tdep->ioctl_TIOCSERGSTRUCT)
	{
	  gdb_printf (gdb_stderr,
		      _("Process record and replay target doesn't "
			"support ioctl request TIOCSERGSTRUCT\n"));
	  return 1;
	}
      else
	{
	  gdb_printf (gdb_stderr,
		      _("Process record and replay target doesn't "
			"support ioctl request 0x%s.\n"),
		      OUTPUT_REG (tmpulongest, tdep->arg2));
	  return 1;
	}
      break;

    case gdb_sys_fcntl:
      /* XXX */
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
    sys_fcntl:
      if (tmpulongest == tdep->fcntl_F_GETLK)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_flock))
	    return -1;
	}
      break;

    case gdb_sys_ni_syscall56:
    case gdb_sys_setpgid:
    case gdb_sys_ni_syscall58:
      break;

    case gdb_sys_olduname:
      if (record_mem_at_reg (regcache, tdep->arg1,
			     tdep->size_oldold_utsname))
	return -1;
      break;

    case gdb_sys_umask:
    case gdb_sys_chroot:
      break;

    case gdb_sys_ustat:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_ustat))
	return -1;
      break;

    case gdb_sys_dup2:
    case gdb_sys_getppid:
    case gdb_sys_getpgrp:
    case gdb_sys_setsid:
      break;

    case gdb_sys_sigaction:
      if (record_mem_at_reg (regcache, tdep->arg3,
			     tdep->size_old_sigaction))
	return -1;
      break;

    case gdb_sys_sgetmask:
    case gdb_sys_ssetmask:
    case gdb_sys_setreuid16:
    case gdb_sys_setregid16:
    case gdb_sys_sigsuspend:
      break;

    case gdb_sys_sigpending:
      if (record_mem_at_reg (regcache, tdep->arg1,
			     tdep->size_old_sigset_t))
	return -1;
      break;

    case gdb_sys_sethostname:
    case gdb_sys_setrlimit:
      break;

    case gdb_sys_old_getrlimit:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_rlimit))
	return -1;
      break;

    case gdb_sys_getrusage:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_rusage))
	return -1;
      break;

    case gdb_sys_gettimeofday:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_timeval)
	  || record_mem_at_reg (regcache, tdep->arg2, tdep->size_timezone))
	return -1;
      break;

    case gdb_sys_settimeofday:
      break;

    case gdb_sys_getgroups16:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST gidsetsize;

	  regcache_raw_read_unsigned (regcache, tdep->arg1,
				      &gidsetsize);
	  tmpint = tdep->size_old_gid_t * (int) gidsetsize;
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest, tmpint))
	    return -1;
	}
      break;

    case gdb_sys_setgroups16:
      break;

    case gdb_old_select:
      {
	unsigned long sz_sel_arg = tdep->size_long + tdep->size_pointer * 4;
	gdb_byte *a = (gdb_byte *) alloca (sz_sel_arg);
	CORE_ADDR inp, outp, exp, tvp;

	regcache_raw_read_unsigned (regcache, tdep->arg1,
				    &tmpulongest);
	if (tmpulongest)
	  {
	    if (target_read_memory (tmpulongest, a, sz_sel_arg))
	      {
		if (record_debug)
		  gdb_printf (gdb_stdlog,
			      "Process record: error reading memory "
			      "at addr = 0x%s len = %lu.\n",
			      OUTPUT_REG (tmpulongest, tdep->arg1),
			      sz_sel_arg);
		return -1;
	      }
	    /* Skip n. */
	    a += tdep->size_long;
	    inp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
	    a += tdep->size_pointer;
	    outp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
	    a += tdep->size_pointer;
	    exp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
	    a += tdep->size_pointer;
	    tvp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
	    if (inp)
	      if (record_full_arch_list_add_mem (inp, tdep->size_fd_set))
		return -1;
	    if (outp)
	      if (record_full_arch_list_add_mem (outp, tdep->size_fd_set))
		return -1;
	    if (exp)
	      if (record_full_arch_list_add_mem (exp, tdep->size_fd_set))
		return -1;
	    if (tvp)
	      if (record_full_arch_list_add_mem (tvp, tdep->size_timeval))
		return -1;
	  }
      }
      break;

    case gdb_sys_symlink:
      break;

    case gdb_sys_uselib:
    case gdb_sys_swapon:
      break;

    case gdb_sys_reboot:
      if (yquery (_("The next instruction is syscall reboot.  "
		    "It will restart the computer.  "
		    "Do you want to stop the program?")))
	return 1;
      break;

    case gdb_old_readdir:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_old_dirent))
	return -1;
      break;

    case gdb_old_mmap:
      break;

    case gdb_sys_munmap:
      {
	ULONGEST len;

	regcache_raw_read_unsigned (regcache, tdep->arg1,
				    &tmpulongest);
	regcache_raw_read_unsigned (regcache, tdep->arg2, &len);
	if (record_full_memory_query)
	  {
	    if (yquery (_("\
The next instruction is syscall munmap.\n\
It will free the memory addr = 0x%s len = %u.\n\
It will make record target cannot record some memory change.\n\
Do you want to stop the program?"),
			OUTPUT_REG (tmpulongest, tdep->arg1), (int) len))
	      return 1;
	  }
      }
      break;

    case gdb_sys_truncate:
    case gdb_sys_ftruncate:
    case gdb_sys_fchmod:
    case gdb_sys_fchown16:
    case gdb_sys_getpriority:
    case gdb_sys_setpriority:
    case gdb_sys_ni_syscall98:
      break;

    case gdb_sys_statfs:
    case gdb_sys_fstatfs:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_statfs))
	return -1;
      break;

    case gdb_sys_ioperm:
      break;

    case gdb_sys_socket:
    case gdb_sys_sendto:
    case gdb_sys_sendmsg:
    case gdb_sys_shutdown:
    case gdb_sys_bind:
    case gdb_sys_connect:
    case gdb_sys_listen:
    case gdb_sys_setsockopt:
      break;

    case gdb_sys_accept:
    case gdb_sys_getsockname:
    case gdb_sys_getpeername:
      {
	ULONGEST len;

	regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
	regcache_raw_read_unsigned (regcache, tdep->arg3, &len);
	if (record_linux_sockaddr (regcache, tdep, tmpulongest, len))
	  return -1;
      }
      break;

    case gdb_sys_recvfrom:
      {
	ULONGEST len;

	regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
	regcache_raw_read_unsigned (regcache, tdep->arg5, &len);
	if (record_linux_sockaddr (regcache, tdep, tmpulongest, len))
	  return -1;
      }
      break;

    case gdb_sys_recvmsg:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_linux_msghdr (regcache, tdep, tmpulongest))
	return -1;
      break;

    case gdb_sys_socketpair:
      if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_int))
	return -1;
      break;

    case gdb_sys_getsockopt:
      regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST optvalp;
	  gdb_byte *optlenp = (gdb_byte *) alloca (tdep->size_int);

	  if (target_read_memory ((CORE_ADDR) tmpulongest, optlenp,
				  tdep->size_int))
	    {
	      if (record_debug)
		gdb_printf (gdb_stdlog,
			    "Process record: error reading "
			    "memory at addr = 0x%s "
			    "len = %d.\n",
			    OUTPUT_REG (tmpulongest, tdep->arg5),
			    tdep->size_int);
	      return -1;
	    }
	  regcache_raw_read_unsigned (regcache, tdep->arg4, &optvalp);
	  tmpint = (int) extract_signed_integer (optlenp, tdep->size_int,
						 byte_order);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) optvalp, tmpint))
	    return -1;
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     tdep->size_int))
	    return -1;
	}
      break;

    case gdb_sys_socketcall:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      switch (tmpulongest)
	{
	case RECORD_SYS_SOCKET:
	case RECORD_SYS_BIND:
	case RECORD_SYS_CONNECT:
	case RECORD_SYS_LISTEN:
	  break;
	case RECORD_SYS_ACCEPT:
	case RECORD_SYS_GETSOCKNAME:
	case RECORD_SYS_GETPEERNAME:
	  {
	    regcache_raw_read_unsigned (regcache, tdep->arg2,
					&tmpulongest);
	    if (tmpulongest)
	      {
		gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong * 2);
		ULONGEST len;

		tmpulongest += tdep->size_ulong;
		if (target_read_memory ((CORE_ADDR) tmpulongest, a,
					tdep->size_ulong * 2))
		  {
		    if (record_debug)
		      gdb_printf (gdb_stdlog,
				  "Process record: error reading "
				  "memory at addr = 0x%s len = %d.\n",
				  OUTPUT_REG (tmpulongest, tdep->arg2),
				  tdep->size_ulong * 2);
		    return -1;
		  }
		tmpulongest = extract_unsigned_integer (a,
							tdep->size_ulong,
							byte_order);
		len = extract_unsigned_integer (a + tdep->size_ulong,
						tdep->size_ulong, byte_order);
		if (record_linux_sockaddr (regcache, tdep, tmpulongest, len))
		  return -1;
	      }
	  }
	  break;

	case RECORD_SYS_SOCKETPAIR:
	  {
	    gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong);

	    regcache_raw_read_unsigned (regcache, tdep->arg2,
					&tmpulongest);
	    if (tmpulongest)
	      {
		tmpulongest += tdep->size_ulong * 3;
		if (target_read_memory ((CORE_ADDR) tmpulongest, a,
					tdep->size_ulong))
		  {
		    if (record_debug)
		      gdb_printf (gdb_stdlog,
				  "Process record: error reading "
				  "memory at addr = 0x%s len = %d.\n",
				  OUTPUT_REG (tmpulongest, tdep->arg2),
				  tdep->size_ulong);
		    return -1;
		  }
		tmpaddr
		  = (CORE_ADDR) extract_unsigned_integer (a, tdep->size_ulong,
							  byte_order);
		if (record_full_arch_list_add_mem (tmpaddr, tdep->size_int))
		  return -1;
	      }
	  }
	  break;
	case RECORD_SYS_SEND:
	case RECORD_SYS_SENDTO:
	  break;
	case RECORD_SYS_RECVFROM:
	  regcache_raw_read_unsigned (regcache, tdep->arg2,
				      &tmpulongest);
	  if (tmpulongest)
	    {
	      gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong * 2);
	      ULONGEST len;

	      tmpulongest += tdep->size_ulong * 4;
	      if (target_read_memory ((CORE_ADDR) tmpulongest, a,
				      tdep->size_ulong * 2))
		{
		  if (record_debug)
		    gdb_printf (gdb_stdlog,
				"Process record: error reading "
				"memory at addr = 0x%s len = %d.\n",
				OUTPUT_REG (tmpulongest, tdep->arg2),
				tdep->size_ulong * 2);
		  return -1;
		}
	      tmpulongest = extract_unsigned_integer (a, tdep->size_ulong,
						      byte_order);
	      len = extract_unsigned_integer (a + tdep->size_ulong,
					      tdep->size_ulong, byte_order);
	      if (record_linux_sockaddr (regcache, tdep, tmpulongest, len))
		return -1;
	    }
	  break;
	case RECORD_SYS_RECV:
	  regcache_raw_read_unsigned (regcache, tdep->arg2,
				      &tmpulongest);
	  if (tmpulongest)
	    {
	      gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong * 2);

	      tmpulongest += tdep->size_ulong;
	      if (target_read_memory ((CORE_ADDR) tmpulongest, a,
				      tdep->size_ulong))
		{
		  if (record_debug)
		    gdb_printf (gdb_stdlog,
				"Process record: error reading "
				"memory at addr = 0x%s len = %d.\n",
				OUTPUT_REG (tmpulongest, tdep->arg2),
				tdep->size_ulong);
		  return -1;
		}
	      tmpulongest = extract_unsigned_integer (a, tdep->size_ulong,
						      byte_order);
	      if (tmpulongest)
		{
		  a += tdep->size_ulong;
		  tmpint = (int) extract_unsigned_integer (a, tdep->size_ulong,
							   byte_order);
		  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
						     tmpint))
		    return -1;
		}
	    }
	  break;
	case RECORD_SYS_SHUTDOWN:
	case RECORD_SYS_SETSOCKOPT:
	  break;
	case RECORD_SYS_GETSOCKOPT:
	  {
	    gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong * 2);
	    gdb_byte *av = (gdb_byte *) alloca (tdep->size_int);

	    regcache_raw_read_unsigned (regcache, tdep->arg2,
					&tmpulongest);
	    if (tmpulongest)
	      {
		tmpulongest += tdep->size_ulong * 3;
		if (target_read_memory ((CORE_ADDR) tmpulongest, a,
					tdep->size_ulong * 2))
		  {
		    if (record_debug)
		      gdb_printf (gdb_stdlog,
				  "Process record: error reading "
				  "memory at addr = 0x%s len = %d.\n",
				  OUTPUT_REG (tmpulongest, tdep->arg2),
				  tdep->size_ulong * 2);
		    return -1;
		  }
		tmpulongest = extract_unsigned_integer (a + tdep->size_ulong,
							tdep->size_ulong,
							byte_order);
		if (tmpulongest)
		  {
		    if (target_read_memory ((CORE_ADDR) tmpulongest, av,
					    tdep->size_int))
		      {
			if (record_debug)
			  gdb_printf (gdb_stdlog,
				      "Process record: error reading "
				      "memory at addr = 0x%s "
				      "len = %d.\n",
				      phex_nz (tmpulongest,
					       tdep->size_ulong),
				      tdep->size_int);
			return -1;
		      }
		    tmpaddr
		      = (CORE_ADDR) extract_unsigned_integer (a,
							      tdep->size_ulong,
							      byte_order);
		    tmpint = (int) extract_unsigned_integer (av,
							     tdep->size_int,
							     byte_order);
		    if (record_full_arch_list_add_mem (tmpaddr, tmpint))
		      return -1;
		    a += tdep->size_ulong;
		    tmpaddr
		      = (CORE_ADDR) extract_unsigned_integer (a,
							      tdep->size_ulong,
							      byte_order);
		    if (record_full_arch_list_add_mem (tmpaddr,
						       tdep->size_int))
		      return -1;
		  }
	      }
	  }
	  break;
	case RECORD_SYS_SENDMSG:
	  break;
	case RECORD_SYS_RECVMSG:
	  {
	    gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong);

	    regcache_raw_read_unsigned (regcache, tdep->arg2,
					&tmpulongest);
	    if (tmpulongest)
	      {
		tmpulongest += tdep->size_ulong;
		if (target_read_memory ((CORE_ADDR) tmpulongest, a,
					tdep->size_ulong))
		  {
		    if (record_debug)
		      gdb_printf (gdb_stdlog,
				  "Process record: error reading "
				  "memory at addr = 0x%s len = %d.\n",
				  OUTPUT_REG (tmpulongest, tdep->arg2),
				  tdep->size_ulong);
		    return -1;
		  }
		tmpulongest = extract_unsigned_integer (a, tdep->size_ulong,
							byte_order);
		if (record_linux_msghdr (regcache, tdep, tmpulongest))
		  return -1;
	      }
	  }
	  break;
	default:
	  gdb_printf (gdb_stderr,
		      _("Process record and replay target "
			"doesn't support socketcall call 0x%s\n"),
		      OUTPUT_REG (tmpulongest, tdep->arg1));
	  return -1;
	  break;
	}
      break;

    case gdb_sys_syslog:
      break;

    case gdb_sys_setitimer:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_itimerval))
	return -1;
      break;

    case gdb_sys_getitimer:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_itimerval))
	return -1;
      break;

    case gdb_sys_newstat:
    case gdb_sys_newlstat:
    case gdb_sys_newfstat:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_stat))
	return -1;
      break;

    case gdb_sys_newfstatat:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					 tdep->size_stat))
	return -1;
      break;

    case gdb_sys_statx:
      regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest);
      if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest, 256))
	return -1;
      break;

    case gdb_sys_uname:
      if (record_mem_at_reg (regcache, tdep->arg1,
			     tdep->size_old_utsname))
	return -1;
      break;

    case gdb_sys_iopl:
    case gdb_sys_vhangup:
    case gdb_sys_ni_syscall112:
    case gdb_sys_vm86old:
      break;

    case gdb_sys_wait4:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_int)
	  || record_mem_at_reg (regcache, tdep->arg4, tdep->size_rusage))
	return -1;
      break;

    case gdb_sys_swapoff:
      break;

    case gdb_sys_sysinfo:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_sysinfo))
	return -1;
      break;

    case gdb_sys_shmget:
    case gdb_sys_semget:
    case gdb_sys_semop:
    case gdb_sys_msgget:
      /* XXX maybe need do some record works with sys_shmdt.  */
    case gdb_sys_shmdt:
    case gdb_sys_msgsnd:
    case gdb_sys_semtimedop:
      break;

    case gdb_sys_shmat:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_ulong))
	return -1;
      break;

    case gdb_sys_shmctl:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_shmid_ds))
	return -1;
      break;

      /* XXX sys_semctl 525 still not supported.  */
      /* sys_semctl */

    case gdb_sys_msgrcv:
      {
	LONGEST l;

	regcache_raw_read_signed (regcache, tdep->arg3, &l);
	tmpint = l + tdep->size_long;
	if (record_mem_at_reg (regcache, tdep->arg2, tmpint))
	  return -1;
      }
      break;

    case gdb_sys_msgctl:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_msqid_ds))
	return -1;
      break;

    case gdb_sys_ipc:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      tmpulongest &= 0xffff;
      switch (tmpulongest)
	{
	case RECORD_SEMOP:
	case RECORD_SEMGET:
	case RECORD_SEMTIMEDOP:
	case RECORD_MSGSND:
	case RECORD_MSGGET:
	  /* XXX maybe need do some record works with RECORD_SHMDT.  */
	case RECORD_SHMDT:
	case RECORD_SHMGET:
	  break;
	case RECORD_MSGRCV:
	  {
	    LONGEST second;

	    regcache_raw_read_signed (regcache, tdep->arg3, &second);
	    tmpint = (int) second + tdep->size_long;
	    if (record_mem_at_reg (regcache, tdep->arg5, tmpint))
	      return -1;
	  }
	  break;
	case RECORD_MSGCTL:
	  if (record_mem_at_reg (regcache, tdep->arg5,
				 tdep->size_msqid_ds))
	    return -1;
	  break;
	case RECORD_SHMAT:
	  if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_ulong))
	    return -1;
	  break;
	case RECORD_SHMCTL:
	  if (record_mem_at_reg (regcache, tdep->arg5,
				 tdep->size_shmid_ds))
	    return -1;
	  break;
	default:
	  /* XXX RECORD_SEMCTL still not supported.  */
	  gdb_printf (gdb_stderr,
		      _("Process record and replay target doesn't "
			"support ipc number %s\n"),
		      pulongest (tmpulongest));
	  break;
	}
      break;

    case gdb_sys_fsync:
    case gdb_sys_sigreturn:
    case gdb_sys_clone:
    case gdb_sys_setdomainname:
      break;

    case gdb_sys_newuname:
      if (record_mem_at_reg (regcache, tdep->arg1,
			     tdep->size_new_utsname))
	return -1;
      break;

    case gdb_sys_modify_ldt:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest == 0 || tmpulongest == 2)
	{
	  ULONGEST bytecount;

	  regcache_raw_read_unsigned (regcache, tdep->arg3, &bytecount);
	  if (record_mem_at_reg (regcache, tdep->arg2, (int) bytecount))
	    return -1;
	}
      break;

    case gdb_sys_adjtimex:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_timex))
	return -1;
      break;

    case gdb_sys_mprotect:
      break;

    case gdb_sys_sigprocmask:
      if (record_mem_at_reg (regcache, tdep->arg3,
			     tdep->size_old_sigset_t))
	return -1;
      break;

    case gdb_sys_ni_syscall127:
    case gdb_sys_init_module:
    case gdb_sys_delete_module:
    case gdb_sys_ni_syscall130:
      break;

    case gdb_sys_quotactl:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      switch (tmpulongest)
	{
	case RECORD_Q_GETFMT:
	  /* __u32 */
	  if (record_mem_at_reg (regcache, tdep->arg4, 4))
	    return -1;
	  break;
	case RECORD_Q_GETINFO:
	  if (record_mem_at_reg (regcache, tdep->arg4,
				 tdep->size_mem_dqinfo))
	    return -1;
	  break;
	case RECORD_Q_GETQUOTA:
	  if (record_mem_at_reg (regcache, tdep->arg4,
				 tdep->size_if_dqblk))
	    return -1;
	  break;
	case RECORD_Q_XGETQSTAT:
	case RECORD_Q_XGETQUOTA:
	  if (record_mem_at_reg (regcache, tdep->arg4,
				 tdep->size_fs_quota_stat))
	    return -1;
	  break;
	}
      break;

    case gdb_sys_getpgid:
    case gdb_sys_fchdir:
    case gdb_sys_bdflush:
      break;

    case gdb_sys_sysfs:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest == 2)
	{
	  /*XXX the size of memory is not very clear.  */
	  if (record_mem_at_reg (regcache, tdep->arg3, 10))
	    return -1;
	}
      break;

    case gdb_sys_personality:
    case gdb_sys_ni_syscall137:
    case gdb_sys_setfsuid16:
    case gdb_sys_setfsgid16:
      break;

    case gdb_sys_llseek:
      if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_loff_t))
	return -1;
      break;

    case gdb_sys_getdents:
    case gdb_sys_getdents64:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_mem_at_reg (regcache, tdep->arg2, tmpulongest))
	return -1;
      break;

    case gdb_sys_select:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_fd_set)
	  || record_mem_at_reg (regcache, tdep->arg3, tdep->size_fd_set)
	  || record_mem_at_reg (regcache, tdep->arg4, tdep->size_fd_set)
	  || record_mem_at_reg (regcache, tdep->arg5, tdep->size_timeval))
	return -1;
      break;

    case gdb_sys_flock:
    case gdb_sys_msync:
      break;

    case gdb_sys_readv:
      {
	ULONGEST vec, vlen;

	regcache_raw_read_unsigned (regcache, tdep->arg2, &vec);
	if (vec)
	  {
	    gdb_byte *iov = (gdb_byte *) alloca (tdep->size_iovec);

	    regcache_raw_read_unsigned (regcache, tdep->arg3, &vlen);
	    for (tmpulongest = 0; tmpulongest < vlen; tmpulongest++)
	      {
		if (target_read_memory ((CORE_ADDR) vec, iov,
					tdep->size_iovec))
		  {
		    if (record_debug)
		      gdb_printf (gdb_stdlog,
				  "Process record: error reading "
				  "memory at addr = 0x%s len = %d.\n",
				  OUTPUT_REG (vec, tdep->arg2),
				  tdep->size_iovec);
		    return -1;
		  }
		tmpaddr
		  = (CORE_ADDR) extract_unsigned_integer (iov,
							  tdep->size_pointer,
							  byte_order);
		tmpint
		  = (int) extract_unsigned_integer (iov + tdep->size_pointer,
						    tdep->size_size_t,
						    byte_order);
		if (record_full_arch_list_add_mem (tmpaddr, tmpint))
		  return -1;
		vec += tdep->size_iovec;
	      }
	  }
      }
      break;

    case gdb_sys_writev:
    case gdb_sys_getsid:
    case gdb_sys_fdatasync:
    case gdb_sys_sysctl:
    case gdb_sys_mlock:
    case gdb_sys_munlock:
    case gdb_sys_mlockall:
    case gdb_sys_munlockall:
    case gdb_sys_sched_setparam:
      break;

    case gdb_sys_sched_getparam:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_int))
	return -1;
      break;

    case gdb_sys_sched_setscheduler:
    case gdb_sys_sched_getscheduler:
    case gdb_sys_sched_yield:
    case gdb_sys_sched_get_priority_max:
    case gdb_sys_sched_get_priority_min:
      break;

    case gdb_sys_sched_rr_get_interval:
    case gdb_sys_nanosleep:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_timespec))
	return -1;
      break;

    case gdb_sys_mremap:
    case gdb_sys_setresuid16:
      break;

    case gdb_sys_getresuid16:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_old_uid_t)
	  || record_mem_at_reg (regcache, tdep->arg2,
				tdep->size_old_uid_t)
	  || record_mem_at_reg (regcache, tdep->arg3,
				tdep->size_old_uid_t))
	return -1;
      break;

    case gdb_sys_vm86:
    case gdb_sys_ni_syscall167:
      break;

    case gdb_sys_poll:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST nfds;

	  regcache_raw_read_unsigned (regcache, tdep->arg2, &nfds);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     tdep->size_pollfd * nfds))
	    return -1;
	}
      break;

    case gdb_sys_nfsservctl:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest == 7 || tmpulongest == 8)
	{
	  int rsize;

	  if (tmpulongest == 7)
	    rsize = tdep->size_NFS_FHSIZE;
	  else
	    rsize = tdep->size_knfsd_fh;
	  if (record_mem_at_reg (regcache, tdep->arg3, rsize))
	    return -1;
	}
      break;

    case gdb_sys_setresgid16:
      break;

    case gdb_sys_getresgid16:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_old_gid_t)
	  || record_mem_at_reg (regcache, tdep->arg2,
				tdep->size_old_gid_t)
	  || record_mem_at_reg (regcache, tdep->arg3,
				tdep->size_old_gid_t))
	return -1;
      break;

    case gdb_sys_prctl:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      switch (tmpulongest)
	{
	case 2:
	  if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_int))
	    return -1;
	  break;
	case 16:
	  if (record_mem_at_reg (regcache, tdep->arg2,
				 tdep->size_TASK_COMM_LEN))
	    return -1;
	  break;
	}
      break;

    case gdb_sys_rt_sigreturn:
      break;

    case gdb_sys_rt_sigaction:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_sigaction))
	return -1;
      break;

    case gdb_sys_rt_sigprocmask:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_sigset_t))
	return -1;
      break;

    case gdb_sys_rt_sigpending:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST sigsetsize;

	  regcache_raw_read_unsigned (regcache, tdep->arg2,&sigsetsize);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) sigsetsize))
	    return -1;
	}
      break;

    case gdb_sys_rt_sigtimedwait:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_siginfo_t))
	return -1;
      break;

    case gdb_sys_rt_sigqueueinfo:
    case gdb_sys_rt_sigsuspend:
      break;

    case gdb_sys_pread64:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST count;

	  regcache_raw_read_unsigned (regcache, tdep->arg3,&count);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) count))
	    return -1;
	}
      break;

    case gdb_sys_pwrite64:
    case gdb_sys_chown16:
      break;

    case gdb_sys_getcwd:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST size;

	  regcache_raw_read_unsigned (regcache, tdep->arg2, &size);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) size))
	    return -1;
	}
      break;

    case gdb_sys_capget:
      if (record_mem_at_reg (regcache, tdep->arg2,
			     tdep->size_cap_user_data_t))
	return -1;
      break;

    case gdb_sys_capset:
      break;

    case gdb_sys_sigaltstack:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_stack_t))
	return -1;
      break;

    case gdb_sys_sendfile:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_off_t))
	return -1;
      break;

    case gdb_sys_ni_syscall188:
    case gdb_sys_ni_syscall189:
    case gdb_sys_vfork:
      break;

    case gdb_sys_getrlimit:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_rlimit))
	return -1;
      break;

    case gdb_sys_mmap2:
      break;

    case gdb_sys_truncate64:
    case gdb_sys_ftruncate64:
      break;

    case gdb_sys_stat64:
    case gdb_sys_lstat64:
    case gdb_sys_fstat64:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_stat64))
	return -1;
      break;

    case gdb_sys_lchown:
    case gdb_sys_getuid:
    case gdb_sys_getgid:
    case gdb_sys_geteuid:
    case gdb_sys_getegid:
    case gdb_sys_setreuid:
    case gdb_sys_setregid:
      break;

    case gdb_sys_getgroups:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST gidsetsize;

	  regcache_raw_read_unsigned (regcache, tdep->arg1,
				      &gidsetsize);
	  tmpint = tdep->size_gid_t * (int) gidsetsize;
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest, tmpint))
	    return -1;
	}
      break;

    case gdb_sys_setgroups:
    case gdb_sys_fchown:
    case gdb_sys_setresuid:
      break;

    case gdb_sys_getresuid:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_uid_t)
	  || record_mem_at_reg (regcache, tdep->arg2, tdep->size_uid_t)
	  || record_mem_at_reg (regcache, tdep->arg3, tdep->size_uid_t))
	return -1;
      break;

    case gdb_sys_setresgid:
      break;

    case gdb_sys_getresgid:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_gid_t)
	  || record_mem_at_reg (regcache, tdep->arg2, tdep->size_gid_t)
	  || record_mem_at_reg (regcache, tdep->arg3, tdep->size_gid_t))
	return -1;
      break;

    case gdb_sys_chown:
    case gdb_sys_setuid:
    case gdb_sys_setgid:
    case gdb_sys_setfsuid:
    case gdb_sys_setfsgid:
    case gdb_sys_pivot_root:
      break;

    case gdb_sys_mincore:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_PAGE_SIZE))
	return -1;
      break;

    case gdb_sys_madvise:
      break;

    case gdb_sys_fcntl64:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest == tdep->fcntl_F_GETLK64)
	{
	  if (record_mem_at_reg (regcache, tdep->arg3,
				 tdep->size_flock64))
	    return -1;
	}
      else if (tmpulongest != tdep->fcntl_F_SETLK64
	       && tmpulongest != tdep->fcntl_F_SETLKW64)
	{
	  goto sys_fcntl;
	}
      break;

    case gdb_sys_ni_syscall222:
    case gdb_sys_ni_syscall223:
    case gdb_sys_gettid:
    case gdb_sys_readahead:
    case gdb_sys_setxattr:
    case gdb_sys_lsetxattr:
    case gdb_sys_fsetxattr:
      break;

    case gdb_sys_getxattr:
    case gdb_sys_lgetxattr:
    case gdb_sys_fgetxattr:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST size;

	  regcache_raw_read_unsigned (regcache, tdep->arg4, &size);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) size))
	    return -1;
	}
      break;

    case gdb_sys_listxattr:
    case gdb_sys_llistxattr:
    case gdb_sys_flistxattr:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST size;

	  regcache_raw_read_unsigned (regcache, tdep->arg3, &size);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) size))
	    return -1;
	}
      break;

    case gdb_sys_removexattr:
    case gdb_sys_lremovexattr:
    case gdb_sys_fremovexattr:
    case gdb_sys_tkill:
      break;

    case gdb_sys_sendfile64:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_loff_t))
	return -1;
      break;

    case gdb_sys_futex:
    case gdb_sys_sched_setaffinity:
      break;

    case gdb_sys_sched_getaffinity:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST len;

	  regcache_raw_read_unsigned (regcache, tdep->arg2, &len);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) len))
	    return -1;
	}
      break;

    case gdb_sys_set_thread_area:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int))
	return -1;
      break;

    case gdb_sys_get_thread_area:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_user_desc))
	return -1;
      break;

    case gdb_sys_io_setup:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_long))
	return -1;
      break;

    case gdb_sys_io_destroy:
      break;

    case gdb_sys_io_getevents:
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST nr;

	  regcache_raw_read_unsigned (regcache, tdep->arg3, &nr);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     nr * tdep->size_io_event))
	    return -1;
	}
      break;

    case gdb_sys_io_submit:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST nr, i;
	  gdb_byte *iocbp;

	  regcache_raw_read_unsigned (regcache, tdep->arg2, &nr);
	  iocbp = (gdb_byte *) alloca (nr * tdep->size_pointer);
	  if (target_read_memory ((CORE_ADDR) tmpulongest, iocbp,
				  nr * tdep->size_pointer))
	    {
	      if (record_debug)
		gdb_printf (gdb_stdlog,
			    "Process record: error reading memory "
			    "at addr = 0x%s len = %u.\n",
			    OUTPUT_REG (tmpulongest, tdep->arg2),
			    (int) (nr * tdep->size_pointer));
	      return -1;
	    }
	  for (i = 0; i < nr; i++)
	    {
	      tmpaddr
		= (CORE_ADDR) extract_unsigned_integer (iocbp,
							tdep->size_pointer,
							byte_order);
	      if (record_full_arch_list_add_mem (tmpaddr, tdep->size_iocb))
		return -1;
	      iocbp += tdep->size_pointer;
	    }
	}
      break;

    case gdb_sys_io_cancel:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_io_event))
	return -1;
      break;

    case gdb_sys_fadvise64:
    case gdb_sys_ni_syscall251:
      break;

    case gdb_sys_exit_group:
      if (yquery (_("The next instruction is syscall exit_group.  "
		    "It will make the program exit.  "
		    "Do you want to stop the program?")))
	return 1;
      break;

    case gdb_sys_lookup_dcookie:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST len;

	  regcache_raw_read_unsigned (regcache, tdep->arg3, &len);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) len))
	    return -1;
	}
      break;

    case gdb_sys_epoll_create:
    case gdb_sys_epoll_ctl:
      break;

    case gdb_sys_epoll_wait:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST maxevents;

	  regcache_raw_read_unsigned (regcache, tdep->arg3, &maxevents);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (maxevents
					      * tdep->size_epoll_event)))
	    return -1;
	}
      break;

    case gdb_sys_remap_file_pages:
    case gdb_sys_set_tid_address:
      break;

    case gdb_sys_timer_create:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_int))
	return -1;
      break;

    case gdb_sys_timer_settime:
      if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_itimerspec))
	return -1;
      break;

    case gdb_sys_timer_gettime:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_itimerspec))
	return -1;
      break;

    case gdb_sys_timer_getoverrun:
    case gdb_sys_timer_delete:
    case gdb_sys_clock_settime:
      break;

    case gdb_sys_clock_gettime:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_timespec))
	return -1;
      break;

    case gdb_sys_clock_getres:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_timespec))
	return -1;
      break;

    case gdb_sys_clock_nanosleep:
      if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_timespec))
	return -1;
      break;

    case gdb_sys_statfs64:
    case gdb_sys_fstatfs64:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_statfs64))
	return -1;
      break;

    case gdb_sys_tgkill:
    case gdb_sys_utimes:
    case gdb_sys_fadvise64_64:
    case gdb_sys_ni_syscall273:
    case gdb_sys_mbind:
      break;

    case gdb_sys_get_mempolicy:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int))
	return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST maxnode;

	  regcache_raw_read_unsigned (regcache, tdep->arg3, &maxnode);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     maxnode * tdep->size_long))
	    return -1;
	}
      break;

    case gdb_sys_set_mempolicy:
    case gdb_sys_mq_open:
    case gdb_sys_mq_unlink:
    case gdb_sys_mq_timedsend:
      break;

    case gdb_sys_mq_timedreceive:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST msg_len;

	  regcache_raw_read_unsigned (regcache, tdep->arg3, &msg_len);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) msg_len))
	    return -1;
	}
      if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_int))
	return -1;
      break;

    case gdb_sys_mq_notify:
      break;

    case gdb_sys_mq_getsetattr:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_mq_attr))
	return -1;
      break;

    case gdb_sys_kexec_load:
      break;

    case gdb_sys_waitid:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_siginfo_t)
	  || record_mem_at_reg (regcache, tdep->arg5, tdep->size_rusage))
	return -1;
      break;

    case gdb_sys_ni_syscall285:
    case gdb_sys_add_key:
    case gdb_sys_request_key:
      break;

    case gdb_sys_keyctl:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest == 6 || tmpulongest == 11)
	{
	  regcache_raw_read_unsigned (regcache, tdep->arg3,
				      &tmpulongest);
	  if (tmpulongest)
	    {
	      ULONGEST buflen;

	      regcache_raw_read_unsigned (regcache, tdep->arg4, &buflen);
	      if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
						 (int) buflen))
		return -1;
	    }
	}
      break;

    case gdb_sys_ioprio_set:
    case gdb_sys_ioprio_get:
    case gdb_sys_inotify_init:
    case gdb_sys_inotify_add_watch:
    case gdb_sys_inotify_rm_watch:
    case gdb_sys_migrate_pages:
    case gdb_sys_openat:
    case gdb_sys_mkdirat:
    case gdb_sys_mknodat:
    case gdb_sys_fchownat:
    case gdb_sys_futimesat:
      break;

    case gdb_sys_fstatat64:
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_stat64))
	return -1;
      break;

    case gdb_sys_unlinkat:
    case gdb_sys_renameat:
    case gdb_sys_linkat:
    case gdb_sys_symlinkat:
      break;

    case gdb_sys_readlinkat:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST bufsiz;

	  regcache_raw_read_unsigned (regcache, tdep->arg4, &bufsiz);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     (int) bufsiz))
	    return -1;
	}
      break;

    case gdb_sys_fchmodat:
    case gdb_sys_faccessat:
      break;

    case gdb_sys_pselect6:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_fd_set)
	  || record_mem_at_reg (regcache, tdep->arg3, tdep->size_fd_set)
	  || record_mem_at_reg (regcache, tdep->arg4, tdep->size_fd_set)
	  || record_mem_at_reg (regcache, tdep->arg5, tdep->size_timespec))
	return -1;
      break;

    case gdb_sys_ppoll:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST nfds;

	  regcache_raw_read_unsigned (regcache, tdep->arg2, &nfds);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     tdep->size_pollfd * nfds))
	    return -1;
	}
      if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_timespec))
	return -1;
      break;

    case gdb_sys_unshare:
    case gdb_sys_set_robust_list:
      break;

    case gdb_sys_get_robust_list:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_int)
	  || record_mem_at_reg (regcache, tdep->arg3, tdep->size_int))
	return -1;
      break;

    case gdb_sys_splice:
      if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_loff_t)
	  || record_mem_at_reg (regcache, tdep->arg4, tdep->size_loff_t))
	return -1;
      break;

    case gdb_sys_sync_file_range:
    case gdb_sys_tee:
    case gdb_sys_vmsplice:
      break;

    case gdb_sys_move_pages:
      regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST nr_pages;

	  regcache_raw_read_unsigned (regcache, tdep->arg2, &nr_pages);
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
					     nr_pages * tdep->size_int))
	    return -1;
	}
      break;

    case gdb_sys_getcpu:
      if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int)
	  || record_mem_at_reg (regcache, tdep->arg2, tdep->size_int)
	  || record_mem_at_reg (regcache, tdep->arg3,
				tdep->size_ulong * 2))
	return -1;
      break;

    case gdb_sys_epoll_pwait:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest)
	{
	  ULONGEST maxevents;

	  regcache_raw_read_unsigned (regcache, tdep->arg3, &maxevents);
	  tmpint = (int) maxevents * tdep->size_epoll_event;
	  if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest, tmpint))
	    return -1;
	}
      break;

    case gdb_sys_fallocate:
    case gdb_sys_eventfd2:
    case gdb_sys_epoll_create1:
    case gdb_sys_dup3:
      break;

    case gdb_sys_inotify_init1:
      break;

    default:
      gdb_printf (gdb_stderr,
		  _("Process record and replay target doesn't "
		    "support syscall number %d\n"), syscall);
      return -1;
      break;
    }

  return 0;
}
