/* Process record and replay target code for GNU/Linux. Copyright (C) 2008 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 2 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 . */ #include "defs.h" #include "target.h" #include "regcache.h" #include "record.h" #include "linux-record.h" #include /* These macros are the values of the first argument of system call "sys_ptrace". The values of these macros are gotten 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 are gotten 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 are gotten 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 are gotten 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)) /* 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, linux_record_tdep_t * 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 (record_regcache, tdep->arg2, (gdb_byte *) & addr); regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32 == RECORD_PTRACE_PEEKTEXT || tmpu32 == RECORD_PTRACE_PEEKDATA || tmpu32 == RECORD_PTRACE_PEEKUSR) { regcache_raw_read (record_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 (record_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 there need add a lot of support of other ioctl requests. */ regcache_raw_read (record_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 (record_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 (record_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 (record_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 (record_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 (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_char)) { return (-1); } } else if (tmpu32 == tdep->ioctl_TIOCGSERIAL) { regcache_raw_read (record_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 (record_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 (record_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 (record_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 (record_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 (_ ("Record: record and reverse target doesn't support ioctl request TIOCSERGSTRUCT\n")); return (1); } else { printf_unfiltered (_ ("Record: record and reverse target doesn't support ioctl request 0x%08x.\n"), tmpu32); return (1); } break; /* sys_fcntl */ case 55: /* XXX */ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); sys_fcntl: if (tmpu32 == F_GETLK) { regcache_raw_read (record_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 (record_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 (record_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 (record_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 (record_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 (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_timeval)) { return (-1); } regcache_raw_read (record_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 (record_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 (record_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 { unsigned long n; fd_set *inp; fd_set *outp; fd_set *exp; struct timeval *tvp; }; */ struct sel_arg_struct { uint32_t n; uint32_t inp; uint32_t outp; uint32_t exp; uint32_t tvp; } sel; regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32) { if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (tmpu32), 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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); regcache_raw_read (record_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 = %d. It will make record target get error. Do you want to stop the program."), paddr_nz (tmpu32), 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 (record_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 (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (tmpu32), 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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (tmpu32), 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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (tmpu32), sizeof (a)); return (-1); } if (a[2]) { if (target_read_memory (a[2], (gdb_byte *) & (a[2]), sizeof (a[2]))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (a[2]), 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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (tmpu32), sizeof (a)); return (-1); } if (a[2]) { if (target_read_memory (a[2], (gdb_byte *) & (a[2]), sizeof (a[2]))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (a[2]), 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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (tmpu32), sizeof (a)); return (-1); } if (a[4]) { if (target_read_memory (a[4], (gdb_byte *) & av, sizeof (av))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (a[4]), 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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (tmpu32), 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))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (a[1]), 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))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (rec.msg_iov), 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 (_ ("Record: record and reverse function doesn't support socketcall call 0x%08x\n"), tmpu32); return (-1); break; } break; /* sys_syslog */ case 103: break; /* sys_setitimer */ case 104: regcache_raw_read (record_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 (record_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 (record_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 (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_int)) { return (-1); } regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); switch (tmpu32) { case RECORD_MSGRCV: { int32_t second; uint32_t ptr; regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & second); regcache_raw_read (record_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 (record_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 (record_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 (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32 == 0 || tmpu32 == 2) { uint32_t ptr, bytecount; regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & ptr); regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & bytecount); if (record_arch_list_add_mem (ptr, bytecount)) { return (-1); } } break; /* sys_adjtimex */ case 124: regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); switch (tmpu32) { case RECORD_Q_GETFMT: regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, 4)) { return (-1); } break; case RECORD_Q_GETINFO: regcache_raw_read (record_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 (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32 == 2) { regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & vec); if (vec) { regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & vlen); for (tmpu32 = 0; tmpu32 < vlen; tmpu32++) { if (target_read_memory (vec, (gdb_byte *) & iov, sizeof (struct record_iovec))) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (vec), 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 (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t nfds; regcache_raw_read (record_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 (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); switch (tmpu32) { case 2: regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_int)) { return (-1); } break; case 16: regcache_raw_read (record_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 (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t sigsetsize; regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t count; regcache_raw_read (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t size; regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & size); if (record_arch_list_add_mem (tmpu32, size)) { return (-1); } } break; /* sys_capget */ case 184: regcache_raw_read (record_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 (record_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 (record_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 (record_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 (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { int gidsetsize; regcache_raw_read (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t)) { return (-1); } regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); switch (tmpu32) { case F_GETLK64: regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_flock64)) { return (-1); } break; case F_SETLK64: case F_SETLKW64: break; default: goto sys_fcntl; break; } 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 (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t size; regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t size; regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t len; regcache_raw_read (record_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 (record_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 (record_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 (record_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 (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32); if (tmpu32) { int32_t nr; regcache_raw_read (record_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 (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (tmpu32) { int32_t i, nr; uint32_t *iocbp; regcache_raw_read (record_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)) { fprintf_unfiltered (gdb_stdlog, "Record: read memory addr = 0x%s len = %d error.\n", paddr_nz (tmpu32), 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 (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t len; regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { int32_t maxevents; regcache_raw_read (record_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 (record_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 (record_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 (record_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 (record_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 (record_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 (record_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 (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_int)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t maxnode; regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t msg_len; regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & msg_len); if (record_arch_list_add_mem (tmpu32, msg_len)) { return (-1); } } regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32 == 6 || tmpu32 == 11) { regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t buflen; regcache_raw_read (record_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 (record_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 (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (tmpu32) { int32_t bufsiz; regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t nfds; regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & nfds); if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds)) { return (-1); } } regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_int)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32); if (tmpu32) { uint32_t nr_pages; regcache_raw_read (record_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 (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_int)) { return (-1); } regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (record_arch_list_add_mem (tmpu32, tdep->size_int)) { return (-1); } regcache_raw_read (record_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 (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32); if (tmpu32) { int32_t maxevents; regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & maxevents); if (record_arch_list_add_mem (tmpu32, maxevents * tdep->size_epoll_event)) { return (-1); } } break; default: printf_unfiltered (_ ("Record: record and reverse function doesn't support syscall number 0x%08x\n"), tmpu32); return (-1); break; } return (0); }