2009-08-10 Hui Zhu <teawater@gmail.com>
authorHui Zhu <teawater@gmail.com>
Mon, 10 Aug 2009 03:06:34 +0000 (03:06 +0000)
committerHui Zhu <teawater@gmail.com>
Mon, 10 Aug 2009 03:06:34 +0000 (03:06 +0000)
Add Linux AMD64 process record support.

* amd64-linux-tdep.c (amd64_linux_record_tdep): New variable.
This struct has the argument for the function
"record_linux_system_call".
(amd64_linux_syscall_record): New function. Parse the
system call instruction and call function
"record_linux_system_call" to record execute log.
(i386_linux_init_abi): Initialize "amd64_linux_record_tdep".
Set "amd64_linux_syscall_record" to "i386_syscall_record".

gdb/ChangeLog
gdb/amd64-linux-tdep.c

index 930743d..3838927 100644 (file)
@@ -1,5 +1,18 @@
 2009-08-10  Hui Zhu  <teawater@gmail.com>
 
+       Add Linux AMD64 process record support.
+
+       * amd64-linux-tdep.c (amd64_linux_record_tdep): New variable.
+       This struct has the argument for the function
+       "record_linux_system_call".
+       (amd64_linux_syscall_record): New function. Parse the
+       system call instruction and call function
+       "record_linux_system_call" to record execute log.
+       (i386_linux_init_abi): Initialize "amd64_linux_record_tdep".
+       Set "amd64_linux_syscall_record" to "i386_syscall_record".
+
+2009-08-10  Hui Zhu  <teawater@gmail.com>
+
        Add process record Linux system call 64 bits support.
 
         * linux-record.h (linux_record_tdep): Add size_pointer,
index 92f5265..e7f966b 100644 (file)
@@ -36,6 +36,9 @@
 #include "amd64-tdep.h"
 #include "solib-svr4.h"
 
+#include "record.h"
+#include "linux-record.h"
+
 /* Mapping between the general-purpose registers in `struct user'
    format and GDB's register cache layout.  */
 
@@ -260,6 +263,1127 @@ amd64_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
   regcache_cooked_write_unsigned (regcache, AMD64_LINUX_ORIG_RAX_REGNUM, -1);
 }
 
+/* Parse the arguments of current system call instruction and record
+   the values of the registers and memory that will be changed into
+   "record_arch_list".  This instruction is "syscall".
+
+   Return -1 if something wrong.  */
+
+static struct linux_record_tdep amd64_linux_record_tdep;
+
+#define RECORD_ARCH_GET_FS     0x1003
+#define RECORD_ARCH_GET_GS     0x1004
+
+static int
+amd64_linux_syscall_record (struct regcache *regcache)
+{
+  int ret, num = -1;
+  ULONGEST tmpulongest;
+
+  regcache_raw_read_unsigned (regcache, AMD64_RAX_REGNUM, &tmpulongest);
+
+  /* Convert tmpulongest to number in record_linux_system_call.  */
+  switch (tmpulongest)
+    {
+      /* sys_read */
+    case 0:
+      num = 3;
+      break;
+      /* sys_write */
+    case 1:
+      num = 4;
+      break;
+      /* sys_open */
+    case 2:
+      num = 5;
+      break;
+      /* sys_close */
+    case 3:
+      num = 6;
+      break;
+      /* sys_newstat */
+    case 4:
+      num = 106;
+      break;
+      /* sys_newfstat */
+    case 5:
+      num = 108;
+      break;
+      /* sys_newlstat */
+    case 6:
+      num = 107;
+      break;
+      /* sys_poll */
+    case 7:
+      num = 168;
+      break;
+      /* sys_lseek */
+    case 8:
+      num = 19;
+      break;
+      /* sys_mmap */
+    case 9:
+      num = 192;
+      break;
+      /* sys_mprotect */
+    case 10:
+      num = 125;
+      break;
+      /* sys_munmap */
+    case 11:
+      num = 91;
+      break;
+      /* sys_brk */
+    case 12:
+      num = 45;
+      break;
+      /* sys_rt_sigaction */
+    case 13:
+      num = 174;
+      break;
+      /* sys_rt_sigprocmask */
+    case 14:
+      num = 175;
+      break;
+      /* sys_rt_sigreturn */
+    case 15:
+      num = 173;
+      break;
+      /* sys_ioctl */
+    case 16:
+      num = 54;
+      break;
+      /* sys_pread64 */
+    case 17:
+      num = 180;
+      break;
+      /* sys_pwrite64 */
+    case 18:
+      num = 181;
+      break;
+      /* sys_readv */
+    case 19:
+      num = 145;
+      break;
+      /* sys_writev */
+    case 20:
+      num = 146;
+      break;
+      /* sys_access */
+    case 21:
+      num = 33;
+      break;
+      /* sys_pipe */
+    case 22:
+      num = 42;
+      break;
+      /* sys_select */
+    case 23:
+      num = 142;
+      break;
+      /* sys_sched_yield */
+    case 24:
+      num = 158;
+      break;
+      /* sys_mremap */
+    case 25:
+      num = 163;
+      break;
+      /* sys_msync */
+    case 26:
+      num = 144;
+      break;
+      /* sys_mincore */
+    case 27:
+      num = 218;
+      break;
+      /* sys_madvise */
+    case 28:
+      num = 219;
+      break;
+      /* sys_shmget */
+    case 29:
+      num = 520;
+      break;
+      /* sys_shmat */
+    case 30:
+      num = 521;
+      break;
+      /* sys_shmctl */
+    case 31:
+      num = 522;
+      break;
+      /* sys_dup */
+    case 32:
+      num = 41;
+      break;
+      /* sys_dup2 */
+    case 33:
+      num = 63;
+      break;
+      /* sys_pause */
+    case 34:
+      num = 29;
+      break;
+      /* sys_nanosleep */
+    case 35:
+      num = 162;
+      break;
+      /* sys_getitimer */
+    case 36:
+      num = 105;
+      break;
+      /* sys_alarm */
+    case 37:
+      num = 27;
+      break;
+      /* sys_setitimer */
+    case 38:
+      num = 104;
+      break;
+      /* sys_getpid */
+    case 39:
+      num = 20;
+      break;
+      /* sys_sendfile64 */
+    case 40:
+      num = 239;
+      break;
+      /* sys_socket */
+    case 41:
+      num = 500;
+      break;
+      /* sys_connect */
+    case 42:
+      num = 501;
+      break;
+      /* sys_accept */
+    case 43:
+      num = 502;
+      break;
+      /* sys_sendto */
+    case 44:
+      num = 503;
+      break;
+      /* sys_recvfrom */
+    case 45:
+      num = 504;
+      break;
+      /* sys_sendmsg */
+    case 46:
+      num = 505;
+      break;
+      /* sys_recvmsg */
+    case 47:
+      num = 506;
+      break;
+      /* sys_shutdown */
+    case 48:
+      num = 507;
+      break;
+      /* sys_bind */
+    case 49:
+      num = 508;
+      break;
+      /* sys_listen */
+    case 50:
+      num = 509;
+      break;
+      /* sys_getsockname */
+    case 51:
+      num = 510;
+      break;
+      /* sys_getpeername */
+    case 52:
+      num = 511;
+      break;
+      /* sys_socketpair */
+    case 53:
+      num = 512;
+      break;
+      /* sys_setsockopt */
+    case 54:
+      num = 513;
+      break;
+      /* sys_getsockopt */
+    case 55:
+      num = 514;
+      break;
+      /* sys_clone */
+    case 56:
+      num = 120;
+      break;
+      /* sys_fork */
+    case 57:
+      num = 2;
+      break;
+      /* sys_vfork */
+    case 58:
+      num = 190;
+      break;
+      /* sys_execve */
+    case 59:
+      num = 11;
+      break;
+      /* sys_exit */
+    case 60:
+      num = 1;
+      break;
+      /* sys_wait4 */
+    case 61:
+      num = 114;
+      break;
+      /* sys_kill */
+    case 62:
+      num = 37;
+      break;
+      /* sys_uname */
+    case 63:
+      num = 109;
+      break;
+      /* sys_semget */
+    case 64:
+      num = 523;
+      break;
+      /* sys_semop */
+    case 65:
+      num = 524;
+      break;
+      /* sys_semctl */
+    case 66:
+      num = 525;
+      break;
+      /* sys_shmdt */
+    case 67:
+      num = 527;
+      break;
+      /* sys_msgget */
+    case 68:
+      num = 528;
+      break;
+      /* sys_msgsnd */
+    case 69:
+      num = 529;
+      break;
+      /* sys_msgrcv */
+    case 70:
+      num = 530;
+      break;
+      /* sys_msgctl */
+    case 71:
+      num = 531;
+      break;
+      /* sys_fcntl */
+    case 72:
+      num = 55;
+      break;
+      /* sys_flock */
+    case 73:
+      num = 143;
+      break;
+      /* sys_fsync */
+    case 74:
+      num = 118;
+      break;
+      /* sys_fdatasync */
+    case 75:
+      num = 148;
+      break;
+      /* sys_truncate */
+    case 76:
+      num = 92;
+      break;
+      /* sys_ftruncate */
+    case 77:
+      num = 93;
+      break;
+      /* sys_getdents */
+    case 78:
+      num = 141;
+      break;
+      /* sys_getcwd */
+    case 79:
+      num = 183;
+      break;
+      /* sys_chdir */
+    case 80:
+      num = 12;
+      break;
+      /* sys_fchdir */
+    case 81:
+      num = 133;
+      break;
+      /* sys_rename */
+    case 82:
+      num = 38;
+      break;
+      /* sys_mkdir */
+    case 83:
+      num = 39;
+      break;
+      /* sys_rmdir */
+    case 84:
+      num = 40;
+      break;
+      /* sys_creat */
+    case 85:
+      num = 8;
+      break;
+      /* sys_link */
+    case 86:
+      num = 9;
+      break;
+      /* sys_unlink */
+    case 87:
+      num = 10;
+      break;
+      /* sys_symlink */
+    case 88:
+      num = 83;
+      break;
+      /* sys_readlink */
+    case 89:
+      num = 85;
+      break;
+      /* sys_chmod */
+    case 90:
+      num = 15;
+      break;
+      /* sys_fchmod */
+    case 91:
+      num = 94;
+      break;
+      /* sys_chown */
+    case 92:
+      num = 212;
+      break;
+      /* sys_fchown */
+    case 93:
+      num = 207;
+      break;
+      /* sys_lchown */
+    case 94:
+      num = 198;
+      break;
+      /* sys_umask */
+    case 95:
+      num = 60;
+      break;
+      /* sys_gettimeofday */
+    case 96:
+      num = 78;
+      break;
+      /* sys_getrlimit */
+    case 97:
+      num = 191;
+      break;
+      /* sys_getrusage */
+    case 98:
+      num = 77;
+      break;
+      /* sys_sysinfo */
+    case 99:
+      num = 116;
+      break;
+      /* sys_times */
+    case 100:
+      num = 43;
+      break;
+      /* sys_ptrace */
+    case 101:
+      num = 26;
+      break;
+      /* sys_getuid */
+    case 102:
+      num = 199;
+      break;
+      /* sys_syslog */
+    case 103:
+      num = 103;
+      break;
+      /* sys_getgid */
+    case 104:
+      num = 200;
+      break;
+      /* sys_setuid */
+    case 105:
+      num = 213;
+      break;
+      /* sys_setgid */
+    case 106:
+      num = 214;
+      break;
+      /* sys_geteuid */
+    case 107:
+      num = 201;
+      break;
+      /* sys_getegid */
+    case 108:
+      num = 202;
+      break;
+      /* sys_setpgid */
+    case 109:
+      num = 57;
+      break;
+      /* sys_getppid */
+    case 110:
+      num = 64;
+      break;
+      /* sys_getpgrp */
+    case 111:
+      num = 65;
+      break;
+      /* sys_setsid */
+    case 112:
+      num = 66;
+      break;
+      /* sys_setreuid */
+    case 113:
+      num = 203;
+      break;
+      /* sys_setregid */
+    case 114:
+      num = 204;
+      break;
+      /* sys_getgroups */
+    case 115:
+      num = 205;
+      break;
+      /* sys_setgroups */
+    case 116:
+      num = 206;
+      break;
+      /* sys_setresuid */
+    case 117:
+      num = 208;
+      break;
+      /* sys_getresuid */
+    case 118:
+      num = 209;
+      break;
+      /* sys_setresgid */
+    case 119:
+      num = 210;
+      break;
+      /* sys_getresgid */
+    case 120:
+      num = 211;
+      break;
+      /* sys_getpgid */
+    case 121:
+      num = 132;
+      break;
+      /* sys_setfsuid */
+    case 122:
+      num = 215;
+      break;
+      /* sys_setfsgid */
+    case 123:
+      num = 216;
+      break;
+      /* sys_getsid */
+    case 124:
+      num = 147;
+      break;
+      /* sys_capget */
+    case 125:
+      num = 184;
+      break;
+      /* sys_capset */
+    case 126:
+      num = 185;
+      break;
+      /* sys_rt_sigpending */
+    case 127:
+      num = 176;
+      break;
+      /* sys_rt_sigtimedwait */
+    case 128:
+      num = 177;
+      break;
+      /* sys_rt_sigqueueinfo */
+    case 129:
+      num = 178;
+      break;
+      /* sys_rt_sigsuspend */
+    case 130:
+      num = 179;
+      break;
+      /* sys_sigaltstack */
+    case 131:
+      num = 186;
+      break;
+      /* sys_utime */
+    case 132:
+      num = 30;
+      break;
+      /* sys_mknod */
+    case 133:
+      num = 14;
+      break;
+      /* sys_personality */
+    case 135:
+      num = 136;
+      break;
+      /* sys_ustat */
+    case 136:
+      num = 62;
+      break;
+      /* sys_statfs */
+    case 137:
+      num = 99;
+      break;
+      /* sys_fstatfs */
+    case 138:
+      num = 100;
+      break;
+      /* sys_sysfs */
+    case 139:
+      num = 135;
+      break;
+      /* sys_getpriority */
+    case 140:
+      num = 96;
+      break;
+      /* sys_setpriority */
+    case 141:
+      num = 97;
+      break;
+      /* sys_sched_setparam */
+    case 142:
+      num = 154;
+      break;
+      /* sys_sched_getparam */
+    case 143:
+      num = 155;
+      break;
+      /* sys_sched_setscheduler */
+    case 144:
+      num = 156;
+      break;
+      /* sys_sched_getscheduler */
+    case 145:
+      num = 157;
+      break;
+      /* sys_sched_get_priority_max */
+    case 146:
+      num = 159;
+      break;
+      /* sys_sched_get_priority_min */
+    case 147:
+      num = 160;
+      break;
+      /* sys_sched_rr_get_interval */
+    case 148:
+      num = 161;
+      break;
+      /* sys_mlock */
+    case 149:
+      num = 150;
+      break;
+      /* sys_munlock */
+    case 150:
+      num = 151;
+      break;
+      /* sys_mlockall */
+    case 151:
+      num = 152;
+      break;
+      /* sys_munlockall */
+    case 152:
+      num = 153;
+      break;
+      /* sys_vhangup */
+    case 153:
+      num = 111;
+      break;
+      /* sys_modify_ldt */
+    case 154:
+      num = 123;
+      break;
+      /* sys_pivot_root */
+    case 155:
+      num = 217;
+      break;
+      /* sys_sysctl */
+    case 156:
+      num = 149;
+      break;
+      /* sys_prctl */
+    case 157:
+      num = 172;
+      break;
+      /* sys_arch_prctl */
+    case 158:
+      regcache_raw_read_unsigned (regcache, amd64_linux_record_tdep.arg3,
+                                  &tmpulongest);
+      if (tmpulongest == RECORD_ARCH_GET_FS
+          || tmpulongest == RECORD_ARCH_GET_GS)
+        {
+          regcache_raw_read_unsigned (regcache, amd64_linux_record_tdep.arg2,
+                                      &tmpulongest);
+          if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest,
+                                        amd64_linux_record_tdep.size_ulong))
+            return -1;
+        }
+      break;
+      /* sys_adjtimex */
+    case 159:
+      num = 124;
+      break;
+      /* sys_setrlimit */
+    case 160:
+      num = 75;
+      break;
+      /* sys_chroot */
+    case 161:
+      num = 61;
+      break;
+      /* sys_sync */
+    case 162:
+      num = 36;
+      break;
+      /* sys_acct */
+    case 163:
+      num = 51;
+      break;
+      /* sys_settimeofday */
+    case 164:
+      num = 79;
+      break;
+      /* sys_mount */
+    case 165:
+      num = 21;
+      break;
+      /* sys_umount */
+    case 166:
+      num = 52;
+      break;
+      /* sys_swapon */
+    case 167:
+      num = 87;
+      break;
+      /* sys_swapoff */
+    case 168:
+      num = 115;
+      break;
+      /* sys_reboot */
+    case 169:
+      num = 88;
+      break;
+      /* sys_sethostname */
+    case 170:
+      num = 74;
+      break;
+      /* sys_setdomainname */
+    case 171:
+      num = 121;
+      break;
+      /* sys_iopl */
+    case 172:
+      num = 110;
+      break;
+      /* sys_ioperm */
+    case 173:
+      num = 101;
+      break;
+      /* sys_init_module */
+    case 175:
+      num = 128;
+      break;
+      /* sys_delete_module */
+    case 176:
+      num = 129;
+      break;
+      /* sys_quotactl */
+    case 179:
+      num = 131;
+      break;
+      /* sys_nfsservctl */
+    case 180:
+      num = 169;
+      break;
+      /* sys_gettid */
+    case 186:
+      num = 224;
+      break;
+      /* sys_readahead */
+    case 187:
+      num = 225;
+      break;
+      /* sys_setxattr */
+    case 188:
+      num = 226;
+      break;
+      /* sys_lsetxattr */
+    case 189:
+      num = 227;
+      break;
+      /* sys_fsetxattr */
+    case 190:
+      num = 228;
+      break;
+      /* sys_getxattr */
+    case 191:
+      num = 229;
+      break;
+      /* sys_lgetxattr */
+    case 192:
+      num = 230;
+      break;
+      /* sys_fgetxattr */
+    case 193:
+      num = 231;
+      break;
+      /* sys_listxattr */
+    case 194:
+      num = 232;
+      break;
+      /* sys_llistxattr */
+    case 195:
+      num = 233;
+      break;
+      /* sys_flistxattr */
+    case 196:
+      num = 234;
+      break;
+      /* sys_removexattr */
+    case 197:
+      num = 235;
+      break;
+      /* sys_lremovexattr */
+    case 198:
+      num = 236;
+      break;
+      /* sys_fremovexattr */
+    case 199:
+      num = 237;
+      break;
+      /* sys_tkill */
+    case 200:
+      num = 238;
+      break;
+      /* sys_time */
+    case 201:
+      num = 13;
+      break;
+      /* sys_futex */
+    case 202:
+      num = 240;
+      break;
+      /* sys_sched_setaffinity */
+    case 203:
+      num = 241;
+      break;
+      /* sys_sched_getaffinity */
+    case 204:
+      num = 242;
+      break;
+      /* sys_io_setup */
+    case 206:
+      num = 245;
+      break;
+      /* sys_io_destroy */
+    case 207:
+      num = 246;
+      break;
+      /* sys_io_getevents */
+    case 208:
+      num = 247;
+      break;
+      /* sys_io_submit */
+    case 209:
+      num = 248;
+      break;
+      /* sys_io_cancel */
+    case 210:
+      num = 249;
+      break;
+      /* sys_lookup_dcookie */
+    case 212:
+      num = 253;
+      break;
+      /* sys_epoll_create */
+    case 213:
+      num = 254;
+      break;
+      /* sys_remap_file_pages */
+    case 216:
+      num = 257;
+      break;
+      /* sys_getdents64 */
+    case 217:
+      num = 220;
+      break;
+      /* sys_set_tid_address */
+    case 218:
+      num = 258;
+      break;
+      /* sys_restart_syscall */
+    case 219:
+      num = 0;
+      break;
+      /* sys_semtimedop */
+    case 220:
+      num = 532;
+      break;
+      /* sys_fadvise64 */
+    case 221:
+      num = 250;
+      break;
+      /* sys_timer_create */
+    case 222:
+      num = 259;
+      break;
+      /* sys_timer_settime */
+    case 223:
+      num = 260;
+      break;
+      /* sys_timer_gettime */
+    case 224:
+      num = 261;
+      break;
+      /* sys_timer_getoverrun */
+    case 225:
+      num = 262;
+      break;
+      /* sys_timer_delete */
+    case 226:
+      num = 263;
+      break;
+      /* sys_clock_settime */
+    case 227:
+      num = 264;
+      break;
+      /* sys_clock_gettime */
+    case 228:
+      num = 265;
+      break;
+      /* sys_clock_getres */
+    case 229:
+      num = 266;
+      break;
+      /* sys_clock_nanosleep */
+    case 230:
+      num = 267;
+      break;
+      /* sys_exit_group */
+    case 231:
+      num = 252;
+      break;
+      /* sys_epoll_wait */
+    case 232:
+      num = 256;
+      break;
+      /* sys_epoll_ctl */
+    case 233:
+      num = 255;
+      break;
+      /* sys_tgkill */
+    case 234:
+      num = 270;
+      break;
+      /* sys_utimes */
+    case 235:
+      num = 271;
+      break;
+      /* sys_mbind */
+    case 237:
+      num = 274;
+      break;
+      /* sys_set_mempolicy */
+    case 238:
+      num = 276;
+      break;
+      /* sys_get_mempolicy */
+    case 239:
+      num = 275;
+      break;
+      /* sys_mq_open */
+    case 240:
+      num = 277;
+      break;
+      /* sys_mq_unlink */
+    case 241:
+      num = 278;
+      break;
+      /* sys_mq_timedsend */
+    case 242:
+      num = 279;
+      break;
+      /* sys_mq_timedreceive */
+    case 243:
+      num = 280;
+      break;
+      /* sys_mq_notify */
+    case 244:
+      num = 281;
+      break;
+      /* sys_mq_getsetattr */
+    case 245:
+      num = 282;
+      break;
+      /* sys_kexec_load */
+    case 246:
+      num = 283;
+      break;
+      /* sys_waitid */
+    case 247:
+      num = 284;
+      break;
+      /* sys_add_key */
+    case 248:
+      num = 286;
+      break;
+      /* sys_request_key */
+    case 249:
+      num = 287;
+      break;
+      /* sys_keyctl */
+    case 250:
+      num = 288;
+      break;
+      /* sys_ioprio_set */
+    case 251:
+      num = 289;
+      break;
+      /* sys_ioprio_get */
+    case 252:
+      num = 290;
+      break;
+      /* sys_inotify_init */
+    case 253:
+      num = 291;
+      break;
+      /* sys_inotify_add_watch */
+    case 254:
+      num = 292;
+      break;
+      /* sys_inotify_rm_watch */
+    case 255:
+      num = 293;
+      break;
+      /* sys_migrate_pages */
+    case 256:
+      num = 294;
+      break;
+      /* sys_openat */
+    case 257:
+      num = 295;
+      break;
+      /* sys_mkdirat */
+    case 258:
+      num = 296;
+      break;
+      /* sys_mknodat */
+    case 259:
+      num = 297;
+      break;
+      /* sys_fchownat */
+    case 260:
+      num = 298;
+      break;
+      /* sys_futimesat */
+    case 261:
+      num = 299;
+      break;
+      /* sys_newfstatat */
+    case 262:
+      num = 540;
+      break;
+      /* sys_unlinkat */
+    case 263:
+      num = 301;
+      break;
+      /* sys_renameat */
+    case 264:
+      num = 302;
+      break;
+      /* sys_linkat */
+    case 265:
+      num = 303;
+      break;
+      /* sys_symlinkat */
+    case 266:
+      num = 304;
+      break;
+      /* sys_readlinkat */
+    case 267:
+      num = 305;
+      break;
+      /* sys_fchmodat */
+    case 268:
+      num = 306;
+      break;
+      /* sys_faccessat */
+    case 269:
+      num = 307;
+      break;
+      /* sys_pselect6 */
+    case 270:
+      num = 308;
+      break;
+      /* sys_ppoll */
+    case 271:
+      num = 309;
+      break;
+      /* sys_unshare */
+    case 272:
+      num = 310;
+      break;
+      /* sys_set_robust_list */
+    case 273:
+      num = 311;
+      break;
+      /* sys_get_robust_list */
+    case 274:
+      num = 312;
+      break;
+      /* sys_splice */
+    case 275:
+      num = 313;
+      break;
+      /* sys_tee */
+    case 276:
+      num = 315;
+      break;
+      /* sys_sync_file_range */
+    case 277:
+      num = 314;
+      break;
+      /* sys_vmsplice */
+    case 278:
+      num = 316;
+      break;
+      /* sys_move_pages */
+    case 279:
+      num = 317;
+      break;
+    default:
+      printf_unfiltered (_("Process record and replay target doesn't "
+                           "support syscall number %d\n"), (int) tmpulongest);
+      return -1;
+      break;
+    }
+
+  if (num >= 0)
+    {
+      ret = record_linux_system_call (num, regcache,
+                                      &amd64_linux_record_tdep);
+      if (ret)
+        return ret;
+    }
+
+  /* Record the return value of the system call.  */
+  if (record_arch_list_add_reg (regcache, AMD64_RCX_REGNUM))
+    return -1;
+  if (record_arch_list_add_reg (regcache, AMD64_R11_REGNUM))
+    return -1;
+
+
+  return 0;
+}
+
 static void
 amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -301,6 +1425,177 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
                                        displaced_step_at_entry_point);
 
   set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type);
+
+  set_gdbarch_process_record (gdbarch, i386_process_record);
+
+  /* Initialize the amd64_linux_record_tdep.  */
+  /* These values are the size of the type that will be used in a system
+     call.  They are obtained from Linux Kernel source.  */
+  amd64_linux_record_tdep.size_pointer
+    = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
+  amd64_linux_record_tdep.size__old_kernel_stat = 32;
+  amd64_linux_record_tdep.size_tms = 32;
+  amd64_linux_record_tdep.size_loff_t = 8;
+  amd64_linux_record_tdep.size_flock = 32;
+  amd64_linux_record_tdep.size_oldold_utsname = 45;
+  amd64_linux_record_tdep.size_ustat = 32;
+  /* ADM64 doesn't need this size because it doesn't have sys_sigaction
+     but sys_rt_sigaction.  */
+  amd64_linux_record_tdep.size_old_sigaction = 152;
+  /* ADM64 doesn't need this size because it doesn't have sys_sigpending
+     but sys_rt_sigpending.  */
+  amd64_linux_record_tdep.size_old_sigset_t = 128;
+  amd64_linux_record_tdep.size_rlimit = 16;
+  amd64_linux_record_tdep.size_rusage = 144;
+  amd64_linux_record_tdep.size_timeval = 16;
+  amd64_linux_record_tdep.size_timezone = 8;
+  /* ADM64 doesn't need this size because it doesn't have sys_getgroups16
+     but sys_getgroups.  */
+  amd64_linux_record_tdep.size_old_gid_t = 2;
+  /* ADM64 doesn't need this size because it doesn't have sys_getresuid16
+     but sys_getresuid.  */
+  amd64_linux_record_tdep.size_old_uid_t = 2;
+  amd64_linux_record_tdep.size_fd_set = 128;
+  amd64_linux_record_tdep.size_dirent = 280;
+  amd64_linux_record_tdep.size_dirent64 = 280;
+  amd64_linux_record_tdep.size_statfs = 120;
+  amd64_linux_record_tdep.size_statfs64 = 120;
+  amd64_linux_record_tdep.size_sockaddr = 16;
+  amd64_linux_record_tdep.size_int
+    = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT;
+  amd64_linux_record_tdep.size_long
+    = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
+  amd64_linux_record_tdep.size_ulong
+    = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
+  amd64_linux_record_tdep.size_msghdr = 56;
+  amd64_linux_record_tdep.size_itimerval = 32;
+  amd64_linux_record_tdep.size_stat = 144;
+  amd64_linux_record_tdep.size_old_utsname = 325;
+  amd64_linux_record_tdep.size_sysinfo = 112;
+  amd64_linux_record_tdep.size_msqid_ds = 120;
+  amd64_linux_record_tdep.size_shmid_ds = 112;
+  amd64_linux_record_tdep.size_new_utsname = 390;
+  amd64_linux_record_tdep.size_timex = 208;
+  amd64_linux_record_tdep.size_mem_dqinfo = 24;
+  amd64_linux_record_tdep.size_if_dqblk = 72;
+  amd64_linux_record_tdep.size_fs_quota_stat = 80;
+  amd64_linux_record_tdep.size_timespec = 16;
+  amd64_linux_record_tdep.size_pollfd = 8;
+  amd64_linux_record_tdep.size_NFS_FHSIZE = 32;
+  amd64_linux_record_tdep.size_knfsd_fh = 132;
+  amd64_linux_record_tdep.size_TASK_COMM_LEN = 16;
+  amd64_linux_record_tdep.size_sigaction = 152;
+  amd64_linux_record_tdep.size_sigset_t = 128;
+  amd64_linux_record_tdep.size_siginfo_t = 128;
+  amd64_linux_record_tdep.size_cap_user_data_t = 8;
+  amd64_linux_record_tdep.size_stack_t = 24;
+  amd64_linux_record_tdep.size_off_t = 8;
+  amd64_linux_record_tdep.size_stat64 = 144;
+  amd64_linux_record_tdep.size_gid_t = 4;
+  amd64_linux_record_tdep.size_uid_t = 4;
+  amd64_linux_record_tdep.size_PAGE_SIZE = 4096;
+  amd64_linux_record_tdep.size_flock64 = 32;
+  amd64_linux_record_tdep.size_user_desc = 16;
+  amd64_linux_record_tdep.size_io_event = 32;
+  amd64_linux_record_tdep.size_iocb = 64;
+  amd64_linux_record_tdep.size_epoll_event = 12;
+  amd64_linux_record_tdep.size_itimerspec = 32;
+  amd64_linux_record_tdep.size_mq_attr = 64;
+  amd64_linux_record_tdep.size_siginfo = 128;
+  amd64_linux_record_tdep.size_termios = 60;
+  amd64_linux_record_tdep.size_termios2 = 44;
+  amd64_linux_record_tdep.size_pid_t = 4;
+  amd64_linux_record_tdep.size_winsize = 8;
+  amd64_linux_record_tdep.size_serial_struct = 72;
+  amd64_linux_record_tdep.size_serial_icounter_struct = 80;
+  amd64_linux_record_tdep.size_hayes_esp_config = 12;
+  amd64_linux_record_tdep.size_size_t = 8;
+  amd64_linux_record_tdep.size_iovec = 16;
+
+  /* These values are the second argument of system call "sys_ioctl".
+     They are obtained from Linux Kernel source.  */
+  amd64_linux_record_tdep.ioctl_TCGETS = 0x5401;
+  amd64_linux_record_tdep.ioctl_TCSETS = 0x5402;
+  amd64_linux_record_tdep.ioctl_TCSETSW = 0x5403;
+  amd64_linux_record_tdep.ioctl_TCSETSF = 0x5404;
+  amd64_linux_record_tdep.ioctl_TCGETA = 0x5405;
+  amd64_linux_record_tdep.ioctl_TCSETA = 0x5406;
+  amd64_linux_record_tdep.ioctl_TCSETAW = 0x5407;
+  amd64_linux_record_tdep.ioctl_TCSETAF = 0x5408;
+  amd64_linux_record_tdep.ioctl_TCSBRK = 0x5409;
+  amd64_linux_record_tdep.ioctl_TCXONC = 0x540A;
+  amd64_linux_record_tdep.ioctl_TCFLSH = 0x540B;
+  amd64_linux_record_tdep.ioctl_TIOCEXCL = 0x540C;
+  amd64_linux_record_tdep.ioctl_TIOCNXCL = 0x540D;
+  amd64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540E;
+  amd64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540F;
+  amd64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410;
+  amd64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411;
+  amd64_linux_record_tdep.ioctl_TIOCSTI = 0x5412;
+  amd64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413;
+  amd64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414;
+  amd64_linux_record_tdep.ioctl_TIOCMGET = 0x5415;
+  amd64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416;
+  amd64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417;
+  amd64_linux_record_tdep.ioctl_TIOCMSET = 0x5418;
+  amd64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419;
+  amd64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541A;
+  amd64_linux_record_tdep.ioctl_FIONREAD = 0x541B;
+  amd64_linux_record_tdep.ioctl_TIOCINQ
+    = amd64_linux_record_tdep.ioctl_FIONREAD;
+  amd64_linux_record_tdep.ioctl_TIOCLINUX = 0x541C;
+  amd64_linux_record_tdep.ioctl_TIOCCONS = 0x541D;
+  amd64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541E;
+  amd64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541F;
+  amd64_linux_record_tdep.ioctl_TIOCPKT = 0x5420;
+  amd64_linux_record_tdep.ioctl_FIONBIO = 0x5421;
+  amd64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422;
+  amd64_linux_record_tdep.ioctl_TIOCSETD = 0x5423;
+  amd64_linux_record_tdep.ioctl_TIOCGETD = 0x5424;
+  amd64_linux_record_tdep.ioctl_TCSBRKP = 0x5425;
+  amd64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426;
+  amd64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427;
+  amd64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428;
+  amd64_linux_record_tdep.ioctl_TIOCGSID = 0x5429;
+  amd64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a;
+  amd64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b;
+  amd64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c;
+  amd64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d;
+  amd64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430;
+  amd64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431;
+  amd64_linux_record_tdep.ioctl_FIONCLEX = 0x5450;
+  amd64_linux_record_tdep.ioctl_FIOCLEX = 0x5451;
+  amd64_linux_record_tdep.ioctl_FIOASYNC = 0x5452;
+  amd64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453;
+  amd64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454;
+  amd64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455;
+  amd64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456;
+  amd64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457;
+  amd64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458;
+  amd64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459;
+  amd64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545A;
+  amd64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545B;
+  amd64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545C;
+  amd64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545D;
+  amd64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545E;
+  amd64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545F;
+  amd64_linux_record_tdep.ioctl_FIOQSIZE = 0x5460;
+
+  /* These values are the second argument of system call "sys_fcntl"
+     and "sys_fcntl64".  They are obtained from Linux Kernel source.  */
+  amd64_linux_record_tdep.fcntl_F_GETLK = 5;
+  amd64_linux_record_tdep.fcntl_F_GETLK64 = 12;
+  amd64_linux_record_tdep.fcntl_F_SETLK64 = 13;
+  amd64_linux_record_tdep.fcntl_F_SETLKW64 = 14;
+
+  amd64_linux_record_tdep.arg1 = AMD64_RDI_REGNUM;
+  amd64_linux_record_tdep.arg2 = AMD64_RSI_REGNUM;
+  amd64_linux_record_tdep.arg3 = AMD64_RDX_REGNUM;
+  amd64_linux_record_tdep.arg4 = AMD64_R10_REGNUM;
+  amd64_linux_record_tdep.arg5 = AMD64_R8_REGNUM;
+  amd64_linux_record_tdep.arg6 = AMD64_R9_REGNUM;
+
+  tdep->i386_syscall_record = amd64_linux_syscall_record;
 }
 \f