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

   Copyright (C) 2008, 2009, 2010, 2011 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 "linux-record.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), \
    TYPE_LENGTH (gdbarch_register_type (get_regcache_arch (regcache), (num))))

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 = get_regcache_arch (regcache);
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);

  if (!addr)
    return 0;

  a = alloca (tdep->size_int);

  if (record_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)
        fprintf_unfiltered (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_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 = get_regcache_arch (regcache);
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  CORE_ADDR tmpaddr;
  int tmpint;

  if (!addr)
    return 0;

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

  a = alloca (tdep->size_msghdr);
  if (target_read_memory ((CORE_ADDR) addr, a, tdep->size_msghdr))
    {
      if (record_debug)
        fprintf_unfiltered (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_arch_list_add_mem ((CORE_ADDR) addr,
                                (int) extract_unsigned_integer (a,
				                                tdep->size_int,
				                                byte_order)))
    return -1;
  a += tdep->size_int;

  /* 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 = alloca (tdep->size_iovec);

      for (i = 0; i < len; i++)
        {
          if (target_read_memory ((CORE_ADDR) addr, iov, tdep->size_iovec))
            {
              if (record_debug)
                fprintf_unfiltered (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_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_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 = get_regcache_arch (regcache);
  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:
      {
        int q;

        target_terminal_ours ();
        q = yquery (_("The next instruction is syscall exit.  "
                      "It will make the program exit.  "
                      "Do you want to stop the program?"));
        target_terminal_inferior ();
        if (q)
          return 1;
      }
      break;

    case gdb_sys_fork:
      break;

    case gdb_sys_read:
      {
        ULONGEST addr, count;

        regcache_raw_read_unsigned (regcache, tdep->arg2, &addr);
        regcache_raw_read_unsigned (regcache, tdep->arg3, &count);
        if (record_arch_list_add_mem ((CORE_ADDR) addr, (int) count))
          return -1;
      }
      break;

    case gdb_sys_write:
    case gdb_sys_open:
    case gdb_sys_close:
    case gdb_sys_waitpid:
    case gdb_sys_creat:
    case gdb_sys_link:
    case gdb_sys_unlink:
    case gdb_sys_execve:
    case gdb_sys_chdir:
    case gdb_sys_time:
    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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg4,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 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:
    case gdb_sys_pipe:
      break;

    case gdb_sys_times:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 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)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_termios))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_TIOCGPGRP
               || tmpulongest == tdep->ioctl_TIOCGSID)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        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)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_int))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_TIOCGWINSZ)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_winsize))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_TIOCLINUX)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
	  /* This syscall affects a char-size memory.  */
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 1))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_TIOCGSERIAL)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_serial_struct))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_TCGETS2)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_termios2))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_FIOQSIZE)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_loff_t))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_TIOCGICOUNT)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_serial_icounter_struct))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_TIOCGHAYESESP)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_hayes_esp_config))
            return -1;
        }
      else if (tmpulongest == tdep->ioctl_TIOCSERGSTRUCT)
        {
          printf_unfiltered (_("Process record and replay target doesn't "
                               "support ioctl request TIOCSERGSTRUCT\n"));
          return 1;
        }
      else
        {
          printf_unfiltered (_("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)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        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:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_oldold_utsname))
        return -1;
      break;

    case gdb_sys_umask:
    case gdb_sys_chroot:
      break;

    case gdb_sys_ustat:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_old_sigset_t))
        return -1;
      break;

    case gdb_sys_sethostname:
    case gdb_sys_setrlimit:
      break;

    case gdb_sys_old_getrlimit:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_rlimit))
        return -1;
      break;

    case gdb_sys_getrusage:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_rusage))
        return -1;
      break;

    case gdb_sys_gettimeofday:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_timeval))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_timezone))
        return -1;
      break;

    case gdb_sys_settimeofday:
      break;

    case gdb_sys_getgroups16:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_old_gid_t))
        return -1;
      break;

    case gdb_sys_setgroups16:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_old_gid_t))
        return -1;
      break;

    case gdb_old_select:
      {
        struct sel_arg_struct
        {
          CORE_ADDR n;
          CORE_ADDR inp;
          CORE_ADDR outp;
          CORE_ADDR exp;
          CORE_ADDR tvp;
        } sel;

        regcache_raw_read_unsigned (regcache, tdep->arg1,
                                    &tmpulongest);
        if (tmpulongest)
          {
            if (target_read_memory (tmpulongest, (gdb_byte *) &sel,
                                    sizeof(sel)))
              {
                if (record_debug)
                  fprintf_unfiltered (gdb_stdlog,
                                      "Process record: error reading memory "
                                      "at addr = 0x%s len = %lu.\n",
                                      OUTPUT_REG (tmpulongest, tdep->arg1),
                                      (unsigned long) sizeof (sel));
                return -1;
              }
            if (record_arch_list_add_mem (sel.inp, tdep->size_fd_set))
              return -1;
            if (record_arch_list_add_mem (sel.outp, tdep->size_fd_set))
              return -1;
            if (record_arch_list_add_mem (sel.exp, tdep->size_fd_set))
              return -1;
            if (record_arch_list_add_mem (sel.tvp, tdep->size_timeval))
              return -1;
          }
      }
      break;

    case gdb_sys_symlink:
      break;

    case gdb_sys_readlink:
      {
        ULONGEST len;

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

    case gdb_sys_uselib:
    case gdb_sys_swapon:
      break;

    case gdb_sys_reboot:
      {
        int q;

        target_terminal_ours ();
        q = yquery (_("The next instruction is syscall reboot.  "
		      "It will restart the computer.  "
		      "Do you want to stop the program?"));
        target_terminal_inferior ();
        if (q)
          return 1;
      }
      break;

    case gdb_old_readdir:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_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_memory_query)
          {
	    int q;

            target_terminal_ours ();
            q = 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);
            target_terminal_inferior ();
            if (q)
              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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_recv:
      {
        ULONGEST size;

        regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
        regcache_raw_read_unsigned (regcache, tdep->arg3, &size);
        if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) size))
          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:
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 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 = alloca (tdep->size_int);

          if (target_read_memory ((CORE_ADDR) tmpulongest, optlenp,
                                  tdep->size_int))
            {
              if (record_debug)
                fprintf_unfiltered (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_arch_list_add_mem ((CORE_ADDR) optvalp, tmpint))
            return -1;
          if (record_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 = 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)
                      fprintf_unfiltered (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 = 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)
                      fprintf_unfiltered (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_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 = 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)
                    fprintf_unfiltered (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;
            }
        case RECORD_SYS_RECV:
          regcache_raw_read_unsigned (regcache, tdep->arg2,
                                      &tmpulongest);
          if (tmpulongest)
            {
              gdb_byte *a = alloca (tdep->size_ulong * 2);

              tmpulongest += tdep->size_ulong;
              if (target_read_memory ((CORE_ADDR) tmpulongest, a,
                                      tdep->size_ulong))
                {
                  if (record_debug)
                    fprintf_unfiltered (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_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 = alloca (tdep->size_ulong * 2);
            gdb_byte *av = 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)
                      fprintf_unfiltered (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)
                          fprintf_unfiltered (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_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_arch_list_add_mem (tmpaddr, tdep->size_int))
                      return -1;
                  }
              }
          }
          break;
        case RECORD_SYS_SENDMSG:
          break;
        case RECORD_SYS_RECVMSG:
          {
            gdb_byte *a = 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)
                      fprintf_unfiltered (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:
          printf_unfiltered (_("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:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_itimerval))
        return -1;
      break;

    case gdb_sys_getitimer:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_itimerval))
        return -1;
      break;

    case gdb_sys_newstat:
    case gdb_sys_newlstat:
    case gdb_sys_newfstat:
    case gdb_sys_newfstatat:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_stat))
        return -1;
      break;

    case gdb_sys_uname:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_int))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_rusage))
        return -1;
      break;

    case gdb_sys_swapoff:
      break;

    case gdb_sys_sysinfo:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_ulong))
        return -1;
      break;

    case gdb_sys_shmctl:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_shmid_ds))
        return -1;
      break;

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

    case gdb_sys_msgrcv:
      {
        ULONGEST msgp;

        regcache_raw_read_signed (regcache, tdep->arg3, &tmpulongest);
        regcache_raw_read_unsigned (regcache, tdep->arg2, &msgp);
        tmpint = (int) tmpulongest + tdep->size_long;
        if (record_arch_list_add_mem ((CORE_ADDR) msgp, tmpint))
          return -1;
      }
      break;

    case gdb_sys_msgctl:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
          {
            ULONGEST second;
            ULONGEST ptr;

            regcache_raw_read_signed (regcache, tdep->arg3, &second);
            regcache_raw_read_unsigned (regcache, tdep->arg5, &ptr);
            tmpint = (int) second + tdep->size_long;
            if (record_arch_list_add_mem ((CORE_ADDR) ptr, tmpint))
              return -1;
          }
          break;
        case RECORD_MSGCTL:
          regcache_raw_read_unsigned (regcache, tdep->arg5,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_msqid_ds))
            return -1;
          break;
        case RECORD_SHMAT:
          regcache_raw_read_unsigned (regcache, tdep->arg4,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_ulong))
            return -1;
          break;
        case RECORD_SHMCTL:
          regcache_raw_read_unsigned (regcache, tdep->arg5,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_shmid_ds))
            return -1;
          break;
        default:
	  /* XXX RECORD_SEMCTL still not supported.  */
          printf_unfiltered (_("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:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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 ptr, bytecount;

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

    case gdb_sys_adjtimex:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_timex))
        return -1;
      break;

    case gdb_sys_mprotect:
      break;

    case gdb_sys_sigprocmask:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
          regcache_raw_read_unsigned (regcache, tdep->arg4,
                                      &tmpulongest);
          /* __u32 */
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 4))
            return -1;
          break;
        case RECORD_Q_GETINFO:
          regcache_raw_read_unsigned (regcache, tdep->arg4,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_mem_dqinfo))
            return -1;
          break;
        case RECORD_Q_GETQUOTA:
          regcache_raw_read_unsigned (regcache, tdep->arg4,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_if_dqblk))
            return -1;
          break;
        case RECORD_Q_XGETQSTAT:
        case RECORD_Q_XGETQUOTA:
          regcache_raw_read_unsigned (regcache, tdep->arg4,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        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)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
	  /*XXX the size of memory is not very clear.  */
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 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:
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_loff_t))
        return -1;
      break;

    case gdb_sys_getdents:
      {
        ULONGEST count;

        regcache_raw_read_unsigned (regcache, tdep->arg2,
                                    &tmpulongest);
        regcache_raw_read_unsigned (regcache, tdep->arg3, &count);
        if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                      tdep->size_dirent * count))
          return -1;
      }
      break;

    case gdb_sys_select:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_fd_set))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_fd_set))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_fd_set))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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 = 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)
                      fprintf_unfiltered (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_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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_timespec))
        return -1;
      break;

    case gdb_sys_mremap:
    case gdb_sys_setresuid16:
      break;

    case gdb_sys_getresuid16:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_old_uid_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_old_uid_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_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;
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, rsize))
            return -1;
        }
      break;

    case gdb_sys_setresgid16:
      break;

    case gdb_sys_getresgid16:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_old_gid_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_old_gid_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_old_gid_t))
        return -1;
      break;

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

    case gdb_sys_rt_sigreturn:
      break;

    case gdb_sys_rt_sigaction:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_sigaction))
        return -1;
      break;

    case gdb_sys_rt_sigprocmask:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        (int) sigsetsize))
            return -1;
        }
      break;

    case gdb_sys_rt_sigtimedwait:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_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_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) size))
            return -1;
        }
      break;

    case gdb_sys_capget:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_cap_user_data_t))
        return -1;
      break;

    case gdb_sys_capset:
      break;

    case gdb_sys_sigaltstack:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_stack_t))
        return -1;
      break;

    case gdb_sys_sendfile:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_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:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_uid_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_uid_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_uid_t))
        return -1;
      break;

    case gdb_sys_setresgid:
      break;

    case gdb_sys_getresgid:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_gid_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_gid_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 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:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_PAGE_SIZE))
        return -1;
      break;

    case gdb_sys_madvise:
      break;

    case gdb_sys_getdents64:
      {
        ULONGEST count;

        regcache_raw_read_unsigned (regcache, tdep->arg2,
                                    &tmpulongest);
        regcache_raw_read_unsigned (regcache, tdep->arg3, &count);
        if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                      tdep->size_dirent64 * count))
          return -1;
      }
      break;

    case gdb_sys_fcntl64:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (tmpulongest == tdep->fcntl_F_GETLK64)
        {
          regcache_raw_read_unsigned (regcache, tdep->arg3,
                                      &tmpulongest);
          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        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_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_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:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) len))
            return -1;
        }
      break;

    case gdb_sys_set_thread_area:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int))
        return -1;
      break;

    case gdb_sys_get_thread_area:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_user_desc))
        return -1;
      break;

    case gdb_sys_io_setup:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 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_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 = alloca (nr * tdep->size_pointer);
          if (target_read_memory ((CORE_ADDR) tmpulongest, iocbp,
                                  nr * tdep->size_pointer))
            {
              if (record_debug)
                fprintf_unfiltered (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_arch_list_add_mem (tmpaddr, tdep->size_iocb))
                return -1;
              iocbp += tdep->size_pointer;
            }
        }
      break;

    case gdb_sys_io_cancel:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_io_event))
        return -1;
      break;

    case gdb_sys_fadvise64:
    case gdb_sys_ni_syscall251:
      break;

    case gdb_sys_exit_group:
      {
        int q;

        target_terminal_ours ();
        q = yquery (_("The next instruction is syscall exit_group.  "
                      "It will make the program exit.  "
                      "Do you want to stop the program?"));
        target_terminal_inferior ();
        if (q)
          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_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_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:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int))
        return -1;
      break;

    case gdb_sys_timer_settime:
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_itimerspec))
        return -1;
      break;

    case gdb_sys_timer_gettime:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_timespec))
        return -1;
      break;

    case gdb_sys_clock_getres:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_timespec))
        return -1;
      break;

    case gdb_sys_clock_nanosleep:
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_timespec))
        return -1;
      break;

    case gdb_sys_statfs64:
    case gdb_sys_fstatfs64:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 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_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_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        (int) msg_len))
            return -1;
        }
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int))
        return -1;
      break;

    case gdb_sys_mq_notify:
      break;

    case gdb_sys_mq_getsetattr:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_mq_attr))
        return -1;
      break;

    case gdb_sys_kexec_load:
      break;

    case gdb_sys_waitid:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_siginfo))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_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:
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_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:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_fd_set))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_fd_set))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_fd_set))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        tdep->size_pollfd * nfds))
            return -1;
        }
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_timespec))
        return -1;
      break;

    case gdb_sys_unshare:
    case gdb_sys_set_robust_list:
      break;

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

    case gdb_sys_splice:
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    tdep->size_loff_t))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                        nr_pages * tdep->size_int))
            return -1;
        }
      break;

    case gdb_sys_getcpu:
      regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int))
        return -1;
      regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
      if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
                                    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_arch_list_add_mem ((CORE_ADDR) tmpulongest, tmpint))
            return -1;
        }
      break;

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

  return 0;
}
