[RFA/RFC Prec] Add Linux AMD64 process record support second version, (AMD64 Linux system call support) 3/3

Hui Zhu
2009-07-07T02:40:45Z

[-- Attachment #1: Type: text/plain, Size: 30779 bytes --]

Add prec support like i386-linux-tdep.c.

2009-07-07 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".

---
amd64-linux-tdep.c | 1290 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1290 insertions(+)

--- a/amd64-linux-tdep.c
+++ b/amd64-linux-tdep.c
@@ -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 *r
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);
+
+ /* Covent 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,172 @@ amd64_linux_init_abi (struct gdbarch_inf
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 = 8;
+ 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 = 4;
+ amd64_linux_record_tdep.size_long = 8;
+ amd64_linux_record_tdep.size_ulong = 8;
+ 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;
}

[-- Attachment #2: prec_amd64_syscall.txt --]
[-- Type: text/plain, Size: 30250 bytes --]

---
amd64-linux-tdep.c | 1290 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1290 insertions(+)

--- a/amd64-linux-tdep.c
+++ b/amd64-linux-tdep.c
@@ -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 *r
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);
+
+ /* Covent 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,172 @@ amd64_linux_init_abi (struct gdbarch_inf
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 = 8;
+ 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 = 4;
+ amd64_linux_record_tdep.size_long = 8;
+ amd64_linux_record_tdep.size_ulong = 8;
+ 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