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

   Copyright (C) 2008, 2009 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 "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)

/* 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 (int num, struct regcache *regcache,
			  struct linux_record_tdep *tdep)
{
  uint32_t tmpu32;

  switch (num)
    {
      /* sys_restart_syscall */
    case 0:
      break;

      /* sys_exit */
    case 1:
      {
	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;

      /* sys_fork */
    case 2:
      break;

      /* sys_read */
    case 3:
      {
	uint32_t addr, count;
	regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & addr);
	regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & count);
	if (record_arch_list_add_mem (addr, count))
	  return -1;
      }
      break;

      /* sys_write */
    case 4:
      /* sys_open */
    case 5:
      /* sys_close */
    case 6:
      /* sys_waitpid */
    case 7:
      /* sys_creat */
    case 8:
      /* sys_link */
    case 9:
      /* sys_unlink */
    case 10:
      /* sys_execve */
    case 11:
      /* sys_chdir */
    case 12:
      /* sys_time */
    case 13:
      /* sys_mknod */
    case 14:
      /* sys_chmod */
    case 15:
      /* sys_lchown16 */
    case 16:
      /* sys_ni_syscall */
    case 17:
      break;

      /* sys_stat */
    case 18:
      /* sys_fstat */
    case 28:
      /* sys_lstat */
    case 84:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size__old_kernel_stat))
	return -1;
      break;

      /* sys_lseek */
    case 19:
      /* sys_getpid */
    case 20:
      /* sys_mount */
    case 21:
      /* sys_oldumount */
    case 22:
      /* sys_setuid16 */
    case 23:
      /* sys_getuid16 */
    case 24:
      /* sys_stime */
    case 25:
      break;

      /* sys_ptrace */
    case 26:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32 == RECORD_PTRACE_PEEKTEXT
	  || tmpu32 == RECORD_PTRACE_PEEKDATA
	  || tmpu32 == RECORD_PTRACE_PEEKUSR)
	{
	  regcache_raw_read (regcache, tdep->arg4,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, 4))
	    return -1;
	}
      break;

      /* sys_alarm */
    case 27:
      /* sys_pause */
    case 29:
      /* sys_utime    */
    case 30:
      /* sys_ni_syscall */
    case 31:
      /* sys_ni_syscall */
    case 32:
      /* sys_access */
    case 33:
      /* sys_nice */
    case 34:
      /* sys_ni_syscall */
    case 35:
      /* sys_sync */
    case 36:
      /* sys_kill */
    case 37:
      /* sys_rename */
    case 38:
      /* sys_mkdir */
    case 39:
      /* sys_rmdir */
    case 40:
      /* sys_dup */
    case 41:
      /* sys_pipe */
    case 42:
      break;

      /* sys_times */
    case 43:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_tms))
	return -1;
      break;

      /* sys_ni_syscall */
    case 44:
      /* sys_brk */
    case 45:
      /* sys_setgid16 */
    case 46:
      /* sys_getgid16 */
    case 47:
      /* sys_signal */
    case 48:
      /* sys_geteuid16 */
    case 49:
      /* sys_getegid16 */
    case 50:
      /* sys_acct */
    case 51:
      /* sys_umount */
    case 52:
      /* sys_ni_syscall */
    case 53:
      break;

      /* sys_ioctl */
    case 54:
      /* XXX Need to add a lot of support of other ioctl requests.  */
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32 == tdep->ioctl_FIOCLEX || tmpu32 == tdep->ioctl_FIONCLEX
	  || tmpu32 == tdep->ioctl_FIONBIO || tmpu32 == tdep->ioctl_FIOASYNC
	  || tmpu32 == tdep->ioctl_TCSETS || tmpu32 == tdep->ioctl_TCSETSW
	  || tmpu32 == tdep->ioctl_TCSETSF || tmpu32 == tdep->ioctl_TCSETA
	  || tmpu32 == tdep->ioctl_TCSETAW || tmpu32 == tdep->ioctl_TCSETAF
	  || tmpu32 == tdep->ioctl_TCSBRK || tmpu32 == tdep->ioctl_TCXONC
	  || tmpu32 == tdep->ioctl_TCFLSH || tmpu32 == tdep->ioctl_TIOCEXCL
	  || tmpu32 == tdep->ioctl_TIOCNXCL
	  || tmpu32 == tdep->ioctl_TIOCSCTTY
	  || tmpu32 == tdep->ioctl_TIOCSPGRP || tmpu32 == tdep->ioctl_TIOCSTI
	  || tmpu32 == tdep->ioctl_TIOCSWINSZ
	  || tmpu32 == tdep->ioctl_TIOCMBIS || tmpu32 == tdep->ioctl_TIOCMBIC
	  || tmpu32 == tdep->ioctl_TIOCMSET
	  || tmpu32 == tdep->ioctl_TIOCSSOFTCAR
	  || tmpu32 == tdep->ioctl_TIOCCONS
	  || tmpu32 == tdep->ioctl_TIOCSSERIAL
	  || tmpu32 == tdep->ioctl_TIOCPKT || tmpu32 == tdep->ioctl_TIOCNOTTY
	  || tmpu32 == tdep->ioctl_TIOCSETD || tmpu32 == tdep->ioctl_TCSBRKP
	  || tmpu32 == tdep->ioctl_TIOCTTYGSTRUCT
	  || tmpu32 == tdep->ioctl_TIOCSBRK || tmpu32 == tdep->ioctl_TIOCCBRK
	  || tmpu32 == tdep->ioctl_TCSETS2 || tmpu32 == tdep->ioctl_TCSETSW2
	  || tmpu32 == tdep->ioctl_TCSETSF2
	  || tmpu32 == tdep->ioctl_TIOCSPTLCK
	  || tmpu32 == tdep->ioctl_TIOCSERCONFIG
	  || tmpu32 == tdep->ioctl_TIOCSERGWILD
	  || tmpu32 == tdep->ioctl_TIOCSERSWILD
	  || tmpu32 == tdep->ioctl_TIOCSLCKTRMIOS
	  || tmpu32 == tdep->ioctl_TIOCSERGETMULTI
	  || tmpu32 == tdep->ioctl_TIOCSERSETMULTI
	  || tmpu32 == tdep->ioctl_TIOCMIWAIT
	  || tmpu32 == tdep->ioctl_TIOCSHAYESESP)
	{
	  /* Nothing to do.  */
	}
      else if (tmpu32 == tdep->ioctl_TCGETS || tmpu32 == tdep->ioctl_TCGETA
	       || tmpu32 == tdep->ioctl_TIOCGLCKTRMIOS)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_termios))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_TIOCGPGRP
	       || tmpu32 == tdep->ioctl_TIOCGSID)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_pid_t))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_TIOCOUTQ
	       || tmpu32 == tdep->ioctl_TIOCMGET
	       || tmpu32 == tdep->ioctl_TIOCGSOFTCAR
	       || tmpu32 == tdep->ioctl_FIONREAD
	       || tmpu32 == tdep->ioctl_TIOCINQ
	       || tmpu32 == tdep->ioctl_TIOCGETD
	       || tmpu32 == tdep->ioctl_TIOCGPTN
	       || tmpu32 == tdep->ioctl_TIOCSERGETLSR)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_TIOCGWINSZ)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_winsize))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_TIOCLINUX)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
          /* This syscall affect a char size memory.  */
	  if (record_arch_list_add_mem (tmpu32, 1))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_TIOCGSERIAL)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_serial_struct))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_TCGETS2)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_termios2))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_FIOQSIZE)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_TIOCGICOUNT)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem
	      (tmpu32, tdep->size_serial_icounter_struct))
	    return -1;
	}
      else if (tmpu32 == tdep->ioctl_TIOCGHAYESESP)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_hayes_esp_config))
	    return -1;
	}
      else if (tmpu32 == 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"),
			     phex_nz (tmpu32, 4));
	  return 1;
	}
      break;

      /* sys_fcntl */
    case 55:
      /* XXX */
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
    sys_fcntl:
      if (tmpu32 == tdep->fcntl_F_GETLK)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_flock))
	    return -1;
	}
      break;

      /* sys_ni_syscall */
    case 56:
      /* sys_setpgid */
    case 57:
      /* sys_ni_syscall */
    case 58:
      break;

      /* sys_olduname */
    case 59:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_oldold_utsname))
	return -1;
      break;

      /* sys_umask */
    case 60:
      /* sys_chroot */
    case 61:
      break;

      /* sys_ustat */
    case 62:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_ustat))
	return -1;
      break;

      /* sys_dup2 */
    case 63:
      /* sys_getppid */
    case 64:
      /* sys_getpgrp */
    case 65:
      /* sys_setsid */
    case 66:
      break;

      /* sys_sigaction */
    case 67:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigaction))
	return -1;
      break;

      /* sys_sgetmask */
    case 68:
      /* sys_ssetmask */
    case 69:
      /* sys_setreuid16 */
    case 70:
      /* sys_setregid16 */
    case 71:
      /* sys_sigsuspend */
    case 72:
      break;

      /* sys_sigpending */
    case 73:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t))
	return -1;
      break;

      /* sys_sethostname */
    case 74:
      /* sys_setrlimit */
    case 75:
      break;

      /* sys_old_getrlimit */
    case 76:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit))
	return -1;
      break;

      /* sys_getrusage */
    case 77:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
	return -1;
      break;

      /* sys_gettimeofday */
    case 78:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timeval))
	return -1;
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timezone))
	return -1;
      break;

      /* sys_settimeofday */
    case 79:
      break;

      /* sys_getgroups16 */
    case 80:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
	return -1;
      break;

      /* sys_setgroups16 */
    case 81:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
	return -1;
      break;

      /* old_select */
    case 82:
      {
	struct sel_arg_struct
	{
	  CORE_ADDR n;
	  CORE_ADDR inp;
	  CORE_ADDR outp;
	  CORE_ADDR exp;
	  CORE_ADDR tvp;
	} sel;

	regcache_raw_read (regcache, tdep->arg1,
			   (gdb_byte *) & tmpu32);
	if (tmpu32)
	  {
	    if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel)))
	      {
		if (record_debug)
		  fprintf_unfiltered (gdb_stdlog,
				      "Process record: error reading memory "
				      "at addr = 0x%s len = %lu.\n",
				      paddr_nz (tmpu32),
				      (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;

      /* sys_symlink */
    case 83:
      break;

      /* sys_readlink */
    case 85:
      {
	uint32_t len;
	regcache_raw_read (regcache, tdep->arg2,
			   (gdb_byte *) & tmpu32);
	regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & len);
	if (record_arch_list_add_mem (tmpu32, len))
	  return -1;
      }
      break;

      /* sys_uselib */
    case 86:
      /* sys_swapon */
    case 87:
      break;

      /* sys_reboot */
    case 88:
      {
	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;

      /* old_readdir */
    case 89:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_dirent))
	return -1;
      break;

      /* old_mmap */
    case 90:
      break;

      /* sys_munmap */
    case 91:
      {
	int q;
	uint32_t len;

	regcache_raw_read (regcache, tdep->arg1,
			   (gdb_byte *) & tmpu32);
	regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & len);
	target_terminal_ours ();
	q =
	  yquery (_("The next instruction is syscall munmap.  "
		    "It will free the memory addr = 0x%s len = %u.  "
		    "It will make record target get error.  "
		    "Do you want to stop the program?"),
		  paddr_nz (tmpu32), (int)len);
	target_terminal_inferior ();
	if (q)
	  return 1;
      }
      break;

      /* sys_truncate */
    case 92:
      /* sys_ftruncate */
    case 93:
      /* sys_fchmod */
    case 94:
      /* sys_fchown16 */
    case 95:
      /* sys_getpriority */
    case 96:
      /* sys_setpriority */
    case 97:
      /* sys_ni_syscall */
    case 98:
      break;

      /* sys_statfs */
    case 99:
      /* sys_fstatfs */
    case 100:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_statfs))
	return -1;
      break;

      /* sys_ioperm */
    case 101:
      break;

      /* sys_socketcall */
    case 102:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      switch (tmpu32)
	{
	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:
	  {
	    uint32_t a[3];
	    regcache_raw_read (regcache, tdep->arg2,
			       (gdb_byte *) & tmpu32);
	    if (tmpu32)
	      {
		if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
		  {
		    if (record_debug)
		      fprintf_unfiltered (gdb_stdlog,
					  "Process record: error reading "
					  "memory at addr = 0x%s len = %lu.\n",
					  paddr_nz (tmpu32),
					  (unsigned long)sizeof (a));
		    return -1;
		  }
		if (record_arch_list_add_mem (a[1], tdep->size_sockaddr))
		  return -1;
		if (record_arch_list_add_mem (a[2], tdep->size_int))
		  return -1;
	      }
	  }
	  break;

	case RECORD_SYS_SOCKETPAIR:
	  {
	    uint32_t a[4];
	    regcache_raw_read (regcache, tdep->arg2,
			       (gdb_byte *) & tmpu32);
	    if (tmpu32)
	      {
		if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
		  {
		    if (record_debug)
		      fprintf_unfiltered (gdb_stdlog,
					  "Process record: error reading "
					  "memory at addr = 0x%s len = %lu.\n",
					  paddr_nz (tmpu32),
				          (unsigned long)sizeof (a));
		    return -1;
		  }
		if (record_arch_list_add_mem (a[3], tdep->size_int))
		  return -1;
	      }
	  }
	  break;
	case RECORD_SYS_SEND:
	case RECORD_SYS_SENDTO:
	  break;
	case RECORD_SYS_RECV:
	  {
	    uint32_t a[3];
	    regcache_raw_read (regcache, tdep->arg2,
			       (gdb_byte *) & tmpu32);
	    if (tmpu32)
	      {
		if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
		  {
		    if (record_debug)
		      fprintf_unfiltered (gdb_stdlog,
					  "Process record: error reading "
					  "memory at addr = 0x%s len = %lu.\n",
					  paddr_nz (tmpu32),
					  (unsigned long)sizeof (a));
		    return -1;
		  }
		if (a[2])
		  {
		    if (target_read_memory
			(a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
		      {
			if (record_debug)
			  fprintf_unfiltered (gdb_stdlog,
					      "Process record: error reading "
					      "memory at addr = 0x%s "
					      "len = %lu.\n",
					      paddr_nz (a[2]),
					      (unsigned long)sizeof (a[2]));
			return -1;
		      }
		    if (record_arch_list_add_mem (a[1], a[2]))
		      return -1;
		  }
	      }
	  }
	  break;
	case RECORD_SYS_RECVFROM:
	  {
	    uint32_t a[6];
	    regcache_raw_read (regcache, tdep->arg2,
			       (gdb_byte *) & tmpu32);
	    if (tmpu32)
	      {
		if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
		  {
		    if (record_debug)
		      fprintf_unfiltered (gdb_stdlog,
					  "Process record: error reading "
					  "memory at addr = 0x%s len = %lu.\n",
					  paddr_nz (tmpu32),
					  (unsigned long)sizeof (a));
		    return -1;
		  }
		if (a[2])
		  {
		    if (target_read_memory
			(a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
		      {
			if (record_debug)
			  fprintf_unfiltered (gdb_stdlog,
					      "Process record: error reading "
					      "memory at addr = 0x%s "
					      "len = %lu.\n",
					      paddr_nz (a[2]),
					      (unsigned long)sizeof (a[2]));
			return -1;
		      }
		    if (record_arch_list_add_mem (a[1], a[2]))
		      return -1;
		    if (record_arch_list_add_mem (a[4], tdep->size_sockaddr))
		      return -1;
		    if (record_arch_list_add_mem (a[5], tdep->size_int))
		      return -1;
		  }
	      }
	  }
	  break;
	case RECORD_SYS_SHUTDOWN:
	case RECORD_SYS_SETSOCKOPT:
	  break;
	case RECORD_SYS_GETSOCKOPT:
	  {
	    uint32_t a[5];
	    uint32_t av;

	    regcache_raw_read (regcache, tdep->arg2,
			       (gdb_byte *) & tmpu32);
	    if (tmpu32)
	      {
		if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
		  {
		    if (record_debug)
		      fprintf_unfiltered (gdb_stdlog,
					  "Process record: error reading "
					  "memory at addr = 0x%s len = %lu.\n",
					  paddr_nz (tmpu32),
					  (unsigned long)sizeof (a));
		    return -1;
		  }
		if (a[4])
		  {
		    if (target_read_memory
			(a[4], (gdb_byte *) & av, sizeof (av)))
		      {
			if (record_debug)
			  fprintf_unfiltered (gdb_stdlog,
					      "Process record: error reading "
					      "memory at addr = 0x%s "
					      "len = %lu.\n",
					      paddr_nz (a[4]),
					      (unsigned long)sizeof (av));
			return -1;
		      }
		    if (record_arch_list_add_mem (a[3], av))
		      return -1;
		    if (record_arch_list_add_mem (a[4], tdep->size_int))
		      return -1;
		  }
	      }
	  }
	  break;
	case RECORD_SYS_SENDMSG:
	  break;
	case RECORD_SYS_RECVMSG:
	  {
	    uint32_t a[2], i;
	    struct record_msghdr
	    {
	      uint32_t msg_name;
	      uint32_t msg_namelen;
	      uint32_t msg_iov;
	      uint32_t msg_iovlen;
	      uint32_t msg_control;
	      uint32_t msg_controllen;
	      uint32_t msg_flags;
	    } rec;
	    struct record_iovec
	    {
	      uint32_t iov_base;
	      uint32_t iov_len;
	    } iov;

	    regcache_raw_read (regcache, tdep->arg2,
			       (gdb_byte *) & tmpu32);
	    if (tmpu32)
	      {
		if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
		  {
		    if (record_debug)
		      fprintf_unfiltered (gdb_stdlog,
					  "Process record: error reading "
					  "memory at addr = 0x%s len = %lu.\n",
					  paddr_nz (tmpu32),
					  (unsigned long)sizeof (a));
		    return -1;
		  }
		if (record_arch_list_add_mem (a[1], tdep->size_msghdr))
		  return -1;
		if (a[1])
		  {
		    if (target_read_memory
			(a[1], (gdb_byte *) & rec, sizeof (rec)))
		      {
			if (record_debug)
			  fprintf_unfiltered (gdb_stdlog,
					      "Process record: error reading "
					      "memory at addr = 0x%s "
					      "len = %lu.\n",
					      paddr_nz (a[1]),
					      (unsigned long)sizeof (rec));
			return -1;
		      }
		    if (record_arch_list_add_mem
			(rec.msg_name, rec.msg_namelen))
		      return -1;
		    if (record_arch_list_add_mem
			(rec.msg_control, rec.msg_controllen))
		      return -1;
		    if (rec.msg_iov)
		      {
			for (i = 0; i < rec.msg_iovlen; i++)
			  {
			    if (target_read_memory
				(rec.msg_iov, (gdb_byte *) & iov,
				 sizeof (iov)))
			      {
				if (record_debug)
				  fprintf_unfiltered (gdb_stdlog,
						      "Process record: error "
						      "reading memory at "
						      "addr = 0x%s "
						      "len = %lu.\n",
						      paddr_nz (rec.
								msg_iov),
						      (unsigned long)sizeof (iov));
				return -1;
			      }
			    if (record_arch_list_add_mem
				(iov.iov_base, iov.iov_len))
			      return -1;
			    rec.msg_iov += sizeof (struct record_iovec);
			  }
		      }
		  }
	      }
	  }
	  break;
	default:
	  printf_unfiltered (_("Process record and replay target "
			       "doesn't support socketcall call 0x%s\n"),
			     phex_nz (tmpu32, 4));
	  return -1;
	  break;
	}
      break;

      /* sys_syslog */
    case 103:
      break;

      /* sys_setitimer */
    case 104:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval))
	return -1;
      break;

      /* sys_getitimer */
    case 105:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval))
	return -1;
      break;

      /* sys_newstat */
    case 106:
      /* sys_newlstat */
    case 107:
      /* sys_newfstat */
    case 108:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_stat))
	return -1;
      break;

      /* sys_uname */
    case 109:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_utsname))
	return -1;
      break;

      /* sys_iopl */
    case 110:
      /* sys_vhangup */
    case 111:
      /* sys_ni_syscall */
    case 112:
      /* sys_vm86old */
    case 113:
      break;

      /* sys_wait4 */
    case 114:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
	return -1;
      break;

      /* sys_swapoff */
    case 115:
      break;

      /* sys_sysinfo */
    case 116:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_sysinfo))
	return -1;
      break;

      /* sys_ipc */
    case 117:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      switch (tmpu32)
	{
	case RECORD_MSGRCV:
	  {
	    int32_t second;
	    uint32_t ptr;
	    regcache_raw_read (regcache, tdep->arg3,
			       (gdb_byte *) & second);
	    regcache_raw_read (regcache, tdep->arg5,
			       (gdb_byte *) & ptr);
	    if (record_arch_list_add_mem (ptr, second + tdep->size_long))
	      return -1;
	  }
	  break;
	case RECORD_MSGCTL:
	  regcache_raw_read (regcache, tdep->arg5,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_msqid_ds))
	    return -1;
	  break;
	case RECORD_SHMAT:
	  regcache_raw_read (regcache, tdep->arg4,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_ulong))
	    return -1;
	  break;
	case RECORD_SHMCTL:
	  regcache_raw_read (regcache, tdep->arg5,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_shmid_ds))
	    return -1;
	  break;
	}
      break;

      /* sys_fsync */
    case 118:
      /* sys_sigreturn */
    case 119:
      /* sys_clone */
    case 120:
      /* sys_setdomainname */
    case 121:
      break;

      /* sys_newuname */
    case 122:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_new_utsname))
	return -1;
      break;

      /* sys_modify_ldt */
    case 123:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32 == 0 || tmpu32 == 2)
	{
	  uint32_t ptr, bytecount;
	  regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & ptr);
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & bytecount);
	  if (record_arch_list_add_mem (ptr, bytecount))
	    return -1;
	}
      break;

      /* sys_adjtimex */
    case 124:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timex))
	return -1;
      break;

      /* sys_mprotect */
    case 125:
      break;

      /* sys_sigprocmask */
    case 126:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t))
	return -1;
      break;

      /* sys_ni_syscall */
    case 127:
      /* sys_init_module */
    case 128:
      /* sys_delete_module */
    case 129:
      /* sys_ni_syscall */
    case 130:
      break;

      /* sys_quotactl */
    case 131:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      switch (tmpu32)
	{
	case RECORD_Q_GETFMT:
	  regcache_raw_read (regcache, tdep->arg4,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, 4))
	    return -1;
	  break;
	case RECORD_Q_GETINFO:
	  regcache_raw_read (regcache, tdep->arg4,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_mem_dqinfo))
	    return -1;
	  break;
	case RECORD_Q_GETQUOTA:
	  regcache_raw_read (regcache, tdep->arg4,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_if_dqblk))
	    return -1;
	  break;
	case RECORD_Q_XGETQSTAT:
	case RECORD_Q_XGETQUOTA:
	  regcache_raw_read (regcache, tdep->arg4,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_fs_quota_stat))
	    return -1;
	  break;
	}
      break;

      /* sys_getpgid */
    case 132:
      /* sys_fchdir */
    case 133:
      /* sys_bdflush */
    case 134:
      break;

      /* sys_sysfs */
    case 135:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32 == 2)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  /*XXX the size of memory is not very clear.  */
	  if (record_arch_list_add_mem (tmpu32, 10))
	    return -1;
	}
      break;

      /* sys_personality */
    case 136:
      /* sys_ni_syscall */
    case 137:
      /* sys_setfsuid16 */
    case 138:
      /* sys_setfsgid16 */
    case 139:
      break;

      /* sys_llseek */
    case 140:
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
	return -1;
      break;

      /* sys_getdents */
    case 141:
      {
	uint32_t count;
	regcache_raw_read (regcache, tdep->arg2,
			   (gdb_byte *) & tmpu32);
	regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & count);
	if (record_arch_list_add_mem (tmpu32, tdep->size_dirent * count))
	  return -1;
      }
      break;

      /* sys_select */
    case 142:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
	return -1;
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
	return -1;
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
	return -1;
      regcache_raw_read (regcache, tdep->arg5, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timeval))
	return -1;
      break;

      /* sys_flock */
    case 143:
      /* sys_msync */
    case 144:
      break;

      /* sys_readv */
    case 145:
      {
	uint32_t vec;
	uint32_t vlen;
	struct record_iovec
	{
	  uint32_t iov_base;
	  uint32_t iov_len;
	} iov;
	regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & vec);
	if (vec)
	  {
	    regcache_raw_read (regcache, tdep->arg3,
			       (gdb_byte *) & vlen);
	    for (tmpu32 = 0; tmpu32 < vlen; tmpu32++)
	      {
		if (target_read_memory
		    (vec, (gdb_byte *) & iov, sizeof (struct record_iovec)))
		  {
		    if (record_debug)
		      fprintf_unfiltered (gdb_stdlog,
					  "Process record: error reading "
					  "memory at addr = 0x%s len = %lu.\n",
					  paddr_nz (vec),
					  (unsigned long)sizeof (struct record_iovec));
		    return -1;
		  }
		if (record_arch_list_add_mem (iov.iov_base, iov.iov_len))
		  return -1;
		vec += sizeof (struct record_iovec);
	      }
	  }
      }
      break;

      /* sys_writev */
    case 146:
      /* sys_getsid */
    case 147:
      /* sys_fdatasync */
    case 148:
      /* sys_sysctl */
    case 149:
      /* sys_mlock */
    case 150:
      /* sys_munlock */
    case 151:
      /* sys_mlockall */
    case 152:
      /* sys_munlockall */
    case 153:
      /* sys_sched_setparam */
    case 154:
      break;

      /* sys_sched_getparam */
    case 155:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      break;

      /* sys_sched_setscheduler */
    case 156:
      /* sys_sched_getscheduler */
    case 157:
      /* sys_sched_yield */
    case 158:
      /* sys_sched_get_priority_max */
    case 159:
      /* sys_sched_get_priority_min */
    case 160:
      break;

      /* sys_sched_rr_get_interval */
    case 161:
      /* sys_nanosleep */
    case 162:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
	return -1;
      break;

      /* sys_mremap */
    case 163:
      /* sys_setresuid16 */
    case 164:
      break;

      /* sys_getresuid16 */
    case 165:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
	return -1;
      break;

      /* sys_vm86 */
    case 166:
      /* sys_ni_syscall */
    case 167:
      break;

      /* sys_poll */
    case 168:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t nfds;
	  regcache_raw_read (regcache, tdep->arg2,
			     (gdb_byte *) & nfds);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds))
	    return -1;
	}
      break;

      /* sys_nfsservctl */
    case 169:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32 == 7 || tmpu32 == 8)
	{
	  uint32_t rsize;
	  if (tmpu32 == 7)
	    rsize = tdep->size_NFS_FHSIZE;
	  else
	    rsize = tdep->size_knfsd_fh;
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, rsize))
	    return -1;
	}
      break;

      /* sys_setresgid16 */
    case 170:
      break;

      /* sys_getresgid16 */
    case 171:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
	return -1;
      break;

      /* sys_prctl */
    case 172:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      switch (tmpu32)
	{
	case 2:
	  regcache_raw_read (regcache, tdep->arg2,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	    return -1;
	  break;
	case 16:
	  regcache_raw_read (regcache, tdep->arg2,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_TASK_COMM_LEN))
	    return -1;
	  break;
	}
      break;

      /* sys_rt_sigreturn */
    case 173:
      break;

      /* sys_rt_sigaction */
    case 174:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_sigaction))
	return -1;
      break;

      /* sys_rt_sigprocmask */
    case 175:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_sigset_t))
	return -1;
      break;

      /* sys_rt_sigpending */
    case 176:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t sigsetsize;
	  regcache_raw_read (regcache, tdep->arg2,
			     (gdb_byte *) & sigsetsize);
	  if (record_arch_list_add_mem (tmpu32, sigsetsize))
	    return -1;
	}
      break;

      /* sys_rt_sigtimedwait */
    case 177:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo_t))
	return -1;
      break;

      /* sys_rt_sigqueueinfo */
    case 178:
      /* sys_rt_sigsuspend */
    case 179:
      break;

      /* sys_pread64 */
    case 180:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t count;
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & count);
	  if (record_arch_list_add_mem (tmpu32, count))
	    return -1;
	}
      break;

      /* sys_pwrite64 */
    case 181:
      /* sys_chown16 */
    case 182:
      break;

      /* sys_getcwd */
    case 183:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t size;
	  regcache_raw_read (regcache, tdep->arg2,
			     (gdb_byte *) & size);
	  if (record_arch_list_add_mem (tmpu32, size))
	    return -1;
	}
      break;

      /* sys_capget */
    case 184:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_cap_user_data_t))
	return -1;
      break;

      /* sys_capset */
    case 185:
      break;

      /* sys_sigaltstack */
    case 186:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_stack_t))
	return -1;
      break;

      /* sys_sendfile */
    case 187:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_off_t))
	return -1;
      break;

      /* sys_ni_syscall */
    case 188:
      /* sys_ni_syscall */
    case 189:
      /* sys_vfork */
    case 190:
      break;

      /* sys_getrlimit */
    case 191:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit))
	return -1;
      break;

      /* sys_mmap2 */
    case 192:
      break;

      /* sys_truncate64 */
    case 193:
      /* sys_ftruncate64 */
    case 194:
      break;

      /* sys_stat64 */
    case 195:
      /* sys_lstat64 */
    case 196:
      /* sys_fstat64 */
    case 197:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_stat64))
	return -1;
      break;

      /* sys_lchown */
    case 198:
      /* sys_getuid */
    case 199:
      /* sys_getgid */
    case 200:
      /* sys_geteuid */
    case 201:
      /* sys_getegid */
    case 202:
      /* sys_setreuid */
    case 203:
      /* sys_setregid */
    case 204:
      break;

      /* sys_getgroups */
    case 205:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  int gidsetsize;
	  regcache_raw_read (regcache, tdep->arg1,
			     (gdb_byte *) & gidsetsize);
	  if (record_arch_list_add_mem
	      (tmpu32, tdep->size_gid_t * gidsetsize))
	    return -1;
	}
      break;

      /* sys_setgroups */
    case 206:
      /* sys_fchown */
    case 207:
      /* sys_setresuid */
    case 208:
      break;

      /* sys_getresuid */
    case 209:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
	return -1;
      break;

      /* sys_setresgid */
    case 210:
      break;

      /* sys_getresgid */
    case 211:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
	return -1;
      break;

      /* sys_chown */
    case 212:
      /* sys_setuid */
    case 213:
      /* sys_setgid */
    case 214:
      /* sys_setfsuid */
    case 215:
      /* sys_setfsgid */
    case 216:
      /* sys_pivot_root */
    case 217:
      break;

      /* sys_mincore */
    case 218:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_PAGE_SIZE))
	return -1;
      break;

      /* sys_madvise */
    case 219:
      break;

      /* sys_getdents64 */
    case 220:
      {
	uint32_t count;
	regcache_raw_read (regcache, tdep->arg2,
			   (gdb_byte *) & tmpu32);
	regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & count);
	if (record_arch_list_add_mem (tmpu32, tdep->size_dirent64 * count))
	  return -1;
      }
      break;

      /* sys_fcntl64 */
    case 221:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32 == tdep->fcntl_F_GETLK64)
        {
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_flock64))
	    return -1;
	}
      else if (tmpu32 != tdep->fcntl_F_SETLK64
	       && tmpu32 != tdep->fcntl_F_SETLKW64)
        {
	  goto sys_fcntl;
	}
      break;

      /* sys_ni_syscall */
    case 222:
      /* sys_ni_syscall */
    case 223:
      /* sys_gettid */
    case 224:
      /* sys_readahead */
    case 225:
      /* sys_setxattr */
    case 226:
      /* sys_lsetxattr */
    case 227:
      /* sys_fsetxattr */
    case 228:
      break;

      /* sys_getxattr */
    case 229:
      /* sys_lgetxattr */
    case 230:
      /* sys_fgetxattr */
    case 231:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t size;
	  regcache_raw_read (regcache, tdep->arg4,
			     (gdb_byte *) & size);
	  if (record_arch_list_add_mem (tmpu32, size))
	    return -1;
	}
      break;

      /* sys_listxattr */
    case 232:
      /* sys_llistxattr */
    case 233:
      /* sys_flistxattr */
    case 234:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t size;
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & size);
	  if (record_arch_list_add_mem (tmpu32, size))
	    return -1;
	}
      break;

      /* sys_removexattr */
    case 235:
      /* sys_lremovexattr */
    case 236:
      /* sys_fremovexattr */
    case 237:
      /* sys_tkill */
    case 238:
      break;

      /* sys_sendfile64 */
    case 239:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
	return -1;
      break;

      /* sys_futex */
    case 240:
      /* sys_sched_setaffinity */
    case 241:
      break;

      /* sys_sched_getaffinity */
    case 242:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t len;
	  regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & len);
	  if (record_arch_list_add_mem (tmpu32, len))
	    return -1;
	}
      break;

      /* sys_set_thread_area */
    case 243:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      break;

      /* sys_get_thread_area */
    case 244:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_user_desc))
	return -1;
      break;

      /* sys_io_setup */
    case 245:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_long))
	return -1;
      break;

      /* sys_io_destroy */
    case 246:
      break;

      /* sys_io_getevents */
    case 247:
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  int32_t nr;
	  regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & nr);
	  if (record_arch_list_add_mem (tmpu32, nr * tdep->size_io_event))
	    return -1;
	}
      break;

      /* sys_io_submit */
    case 248:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  int32_t i, nr;
	  uint32_t *iocbp;
	  regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & nr);
	  iocbp = (uint32_t *) alloca (nr * tdep->size_int);
	  if (target_read_memory
	      (tmpu32, (gdb_byte *) iocbp, nr * tdep->size_int))
	    {
	      if (record_debug)
		fprintf_unfiltered (gdb_stdlog,
				    "Process record: error reading memory "
				    "at addr = 0x%s len = %u.\n",
				    paddr_nz (tmpu32),
				    (int)(nr * tdep->size_int));
	      return -1;
	    }
	  for (i = 0; i < nr; i++)
	    {
	      if (record_arch_list_add_mem (iocbp[i], tdep->size_iocb))
		return -1;
	    }
	}
      break;

      /* sys_io_cancel */
    case 249:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_io_event))
	return -1;
      break;

      /* sys_fadvise64 */
    case 250:
      /* sys_ni_syscall */
    case 251:
      break;

      /* sys_exit_group */
    case 252:
      {
	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;

      /* sys_lookup_dcookie */
    case 253:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t len;
	  regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & len);
	  if (record_arch_list_add_mem (tmpu32, len))
	    return -1;
	}
      break;

      /* sys_epoll_create */
    case 254:
      /* sys_epoll_ctl */
    case 255:
      break;

      /* sys_epoll_wait */
    case 256:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  int32_t maxevents;
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & maxevents);
	  if (record_arch_list_add_mem
	      (tmpu32, maxevents * tdep->size_epoll_event))
	    return -1;
	}
      break;

      /* sys_remap_file_pages */
    case 257:
      /* sys_set_tid_address */
    case 258:
      break;

      /* sys_timer_create */
    case 259:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      break;

      /* sys_timer_settime */
    case 260:
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec))
	return -1;
      break;

      /* sys_timer_gettime */
    case 261:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec))
	return -1;
      break;

      /* sys_timer_getoverrun */
    case 262:
      /* sys_timer_delete */
    case 263:
      /* sys_clock_settime */
    case 264:
      break;

      /* sys_clock_gettime */
    case 265:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
	return -1;
      break;

      /* sys_clock_getres */
    case 266:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
	return -1;
      break;

      /* sys_clock_nanosleep */
    case 267:
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
	return -1;
      break;

      /* sys_statfs64 */
    case 268:
      /* sys_fstatfs64 */
    case 269:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_statfs64))
	return -1;
      break;

      /* sys_tgkill */
    case 270:
      /* sys_utimes */
    case 271:
      /* sys_fadvise64_64 */
    case 272:
      /* sys_ni_syscall */
    case 273:
      /* sys_mbind */
    case 274:
      break;

      /* sys_get_mempolicy */
    case 275:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t maxnode;
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & maxnode);
	  if (record_arch_list_add_mem (tmpu32, maxnode * tdep->size_long))
	    return -1;
	}
      break;

      /* sys_set_mempolicy */
    case 276:
      /* sys_mq_open */
    case 277:
      /* sys_mq_unlink */
    case 278:
      /* sys_mq_timedsend */
    case 279:
      break;

      /* sys_mq_timedreceive */
    case 280:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t msg_len;
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & msg_len);
	  if (record_arch_list_add_mem (tmpu32, msg_len))
	    return -1;
	}
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      break;

      /* sys_mq_notify */
    case 281:
      break;

      /* sys_mq_getsetattr */
    case 282:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_mq_attr))
	return -1;
      break;

      /* sys_kexec_load */
    case 283:
      break;

      /* sys_waitid */
    case 284:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo))
	return -1;
      regcache_raw_read (regcache, tdep->arg5, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
	return -1;
      break;

      /* sys_ni_syscall */
    case 285:
      /* sys_add_key */
    case 286:
      /* sys_request_key */
    case 287:
      break;

      /* sys_keyctl */
    case 288:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32 == 6 || tmpu32 == 11)
	{
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & tmpu32);
	  if (tmpu32)
	    {
	      uint32_t buflen;
	      regcache_raw_read (regcache, tdep->arg4,
				 (gdb_byte *) & buflen);
	      if (record_arch_list_add_mem (tmpu32, buflen))
		return -1;
	    }
	}
      break;

      /* sys_ioprio_set */
    case 289:
      /* sys_ioprio_get */
    case 290:
      /* sys_inotify_init */
    case 291:
      /* sys_inotify_add_watch */
    case 292:
      /* sys_inotify_rm_watch */
    case 293:
      /* sys_migrate_pages */
    case 294:
      /* sys_openat */
    case 295:
      /* sys_mkdirat */
    case 296:
      /* sys_mknodat */
    case 297:
      /* sys_fchownat */
    case 298:
      /* sys_futimesat */
    case 299:
      break;

      /* sys_fstatat64 */
    case 300:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_stat64))
	return -1;
      break;

      /* sys_unlinkat */
    case 301:
      /* sys_renameat */
    case 302:
      /* sys_linkat */
    case 303:
      /* sys_symlinkat */
    case 304:
      break;

      /* sys_readlinkat */
    case 305:
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  int32_t bufsiz;
	  regcache_raw_read (regcache, tdep->arg4,
			     (gdb_byte *) & bufsiz);
	  if (record_arch_list_add_mem (tmpu32, bufsiz))
	    return -1;
	}
      break;

      /* sys_fchmodat */
    case 306:
      /* sys_faccessat */
    case 307:
      break;

      /* sys_pselect6 */
    case 308:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
	return -1;
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
	return -1;
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
	return -1;
      regcache_raw_read (regcache, tdep->arg5, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
	return -1;
      break;

      /* sys_ppoll */
    case 309:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t nfds;
	  regcache_raw_read (regcache, tdep->arg2,
			     (gdb_byte *) & nfds);
	  if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds))
	    return -1;
	}
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
	return -1;
      break;

      /* sys_unshare */
    case 310:
      /* sys_set_robust_list */
    case 311:
      break;

      /* sys_get_robust_list */
    case 312:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      break;

      /* sys_splice */
    case 313:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
	return -1;
      regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
	return -1;
      break;

      /* sys_sync_file_range */
    case 314:
      /* sys_tee */
    case 315:
      /* sys_vmsplice */
    case 316:
      break;

      /* sys_move_pages */
    case 317:
      regcache_raw_read (regcache, tdep->arg5, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  uint32_t nr_pages;
	  regcache_raw_read (regcache, tdep->arg2,
			     (gdb_byte *) & nr_pages);
	  if (record_arch_list_add_mem (tmpu32, nr_pages * tdep->size_int))
	    return -1;
	}
      break;

      /* sys_getcpu */
    case 318:
      regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_int))
	return -1;
      regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32);
      if (record_arch_list_add_mem (tmpu32, tdep->size_ulong * 2))
	return -1;
      break;

      /* sys_epoll_pwait */
    case 319:
      regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32);
      if (tmpu32)
	{
	  int32_t maxevents;
	  regcache_raw_read (regcache, tdep->arg3,
			     (gdb_byte *) & maxevents);
	  if (record_arch_list_add_mem
	      (tmpu32, maxevents * tdep->size_epoll_event))
	    return -1;
	}
      break;

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

  return 0;
}
