Message ID | 1409313190-23768-1-git-send-email-omair.javaid@linaro.org |
---|---|
State | New |
Headers | show |
On 29 August 2014 04:53, Omair Javaid <omair.javaid@linaro.org> wrote: > Suggestion have been incorporated and updated patch is given below. > > gdb: > > 2014-08-28 Omair Javaid <omair.javaid@linaro.org> > > * aarch64-linux-tdep.c (record.h): Include. > (record-full.h): Include. > (struct linux_record_tdep aarch64_linux_record_tdep): Declare. > (aarch64_canonicalize_syscall): New function to translate syscall > numbers from aarch64 to canonical. > (aarch64_all_but_pc_registers_record): New function. > (aarch64_linux_syscall_record): New function. > (aarch64_linux_init_abi): Update to handle syscall recording. > * aarch64-linux-tdep.h (aarch64_syscall): New enum. > * aarch64-tdep.c (aarch64_record_branch_except_sys): Add code to > handle recording of syscalls. > * aarch64-tdep.h > (struct gdbarch_tdep) <aarch64_syscall_record>: Defined. > * linux-record.h (struct linux_record_tdep): Add two more syscall > argument fields. > > --- > gdb/aarch64-linux-tdep.c | 913 +++++++++++++++++++++++++++++++++++++++++++++++ > gdb/aarch64-linux-tdep.h | 266 ++++++++++++++ > gdb/aarch64-tdep.c | 15 +- > gdb/aarch64-tdep.h | 3 + > gdb/linux-record.h | 2 + > 5 files changed, 1198 insertions(+), 1 deletion(-) This one looks ok to me now. > diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c > index 5ab7b37..82b55b6 100644 > --- a/gdb/aarch64-linux-tdep.c > +++ b/gdb/aarch64-linux-tdep.c > @@ -41,6 +41,9 @@ > #include "user-regs.h" > #include <ctype.h> > > +#include "record-full.h" > +#include "linux-record.h" > + > /* Signal frame handling. > > +------------+ ^ > @@ -354,6 +357,752 @@ aarch64_stap_parse_special_token (struct gdbarch *gdbarch, > return 1; > } > > +/* AArch64 process record-replay constructs: syscall, signal etc. */ > + > +struct linux_record_tdep aarch64_linux_record_tdep; > + > +/* aarch64_canonicalize_syscall maps syscall ids from the native AArch64 > + linux set of syscall ids into a canonical set of syscall ids used by > + process record. */ > + > +static enum gdb_syscall > +aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number) > +{ > + switch (syscall_number) { > + case aarch64_sys_read: > + return gdb_sys_read; > + > + case aarch64_sys_write: > + return gdb_sys_write; > + > + case aarch64_sys_open: > + return gdb_sys_open; > + > + case aarch64_sys_close: > + return gdb_sys_close; > + > + case aarch64_sys_lseek: > + return gdb_sys_lseek; > + > + case aarch64_sys_mprotect: > + return gdb_sys_mprotect; > + > + case aarch64_sys_munmap: > + return gdb_sys_munmap; > + > + case aarch64_sys_brk: > + return gdb_sys_brk; > + > + case aarch64_sys_rt_sigaction: > + return gdb_sys_rt_sigaction; > + > + case aarch64_sys_rt_sigprocmask: > + return gdb_sys_rt_sigprocmask; > + > + case aarch64_sys_rt_sigreturn: > + return gdb_sys_rt_sigreturn; > + > + case aarch64_sys_ioctl: > + return gdb_sys_ioctl; > + > + case aarch64_sys_pread64: > + return gdb_sys_pread64; > + > + case aarch64_sys_pwrite64: > + return gdb_sys_pwrite64; > + > + case aarch64_sys_readv: > + return gdb_sys_readv; > + > + case aarch64_sys_writev: > + return gdb_sys_writev; > + > + case aarch64_sys_sched_yield: > + return gdb_sys_sched_yield; > + > + case aarch64_sys_mremap: > + return gdb_sys_mremap; > + > + case aarch64_sys_msync: > + return gdb_sys_msync; > + > + case aarch64_sys_mincore: > + return gdb_sys_mincore; > + > + case aarch64_sys_madvise: > + return gdb_sys_madvise; > + > + case aarch64_sys_shmget: > + return gdb_sys_shmget; > + > + case aarch64_sys_shmat: > + return gdb_sys_shmat; > + > + case aarch64_sys_shmctl: > + return gdb_sys_shmctl; > + > + case aarch64_sys_dup: > + return gdb_sys_dup; > + > + case aarch64_sys_nanosleep: > + return gdb_sys_nanosleep; > + > + case aarch64_sys_getitimer: > + return gdb_sys_getitimer; > + > + case aarch64_sys_setitimer: > + return gdb_sys_setitimer; > + > + case aarch64_sys_getpid: > + return gdb_sys_getpid; > + > + case aarch64_sys_sendfile: > + return gdb_sys_sendfile; > + > + case aarch64_sys_socket: > + return gdb_sys_socket; > + > + case aarch64_sys_connect: > + return gdb_sys_connect; > + > + case aarch64_sys_accept: > + return gdb_sys_accept; > + > + case aarch64_sys_sendto: > + return gdb_sys_sendto; > + > + case aarch64_sys_recvfrom: > + return gdb_sys_recvfrom; > + > + case aarch64_sys_sendmsg: > + return gdb_sys_sendmsg; > + > + case aarch64_sys_recvmsg: > + return gdb_sys_recvmsg; > + > + case aarch64_sys_shutdown: > + return gdb_sys_shutdown; > + > + case aarch64_sys_bind: > + return gdb_sys_bind; > + > + case aarch64_sys_listen: > + return gdb_sys_listen; > + > + case aarch64_sys_getsockname: > + return gdb_sys_getsockname; > + > + case aarch64_sys_getpeername: > + return gdb_sys_getpeername; > + > + case aarch64_sys_socketpair: > + return gdb_sys_socketpair; > + > + case aarch64_sys_setsockopt: > + return gdb_sys_setsockopt; > + > + case aarch64_sys_getsockopt: > + return gdb_sys_getsockopt; > + > + case aarch64_sys_clone: > + return gdb_sys_clone; > + > + case aarch64_sys_execve: > + return gdb_sys_execve; > + > + case aarch64_sys_exit: > + return gdb_sys_exit; > + > + case aarch64_sys_wait4: > + return gdb_sys_wait4; > + > + case aarch64_sys_kill: > + return gdb_sys_kill; > + > + case aarch64_sys_uname: > + return gdb_sys_uname; > + > + case aarch64_sys_semget: > + return gdb_sys_semget; > + > + case aarch64_sys_semop: > + return gdb_sys_semop; > + > + case aarch64_sys_semctl: > + return gdb_sys_semctl; > + > + case aarch64_sys_shmdt: > + return gdb_sys_shmdt; > + > + case aarch64_sys_msgget: > + return gdb_sys_msgget; > + > + case aarch64_sys_msgsnd: > + return gdb_sys_msgsnd; > + > + case aarch64_sys_msgrcv: > + return gdb_sys_msgrcv; > + > + case aarch64_sys_msgctl: > + return gdb_sys_msgctl; > + > + case aarch64_sys_fcntl: > + return gdb_sys_fcntl; > + > + case aarch64_sys_flock: > + return gdb_sys_flock; > + > + case aarch64_sys_fsync: > + return gdb_sys_fsync; > + > + case aarch64_sys_fdatasync: > + return gdb_sys_fdatasync; > + > + case aarch64_sys_truncate: > + return gdb_sys_truncate; > + > + case aarch64_sys_ftruncate: > + return gdb_sys_ftruncate; > + > + case aarch64_sys_getcwd: > + return gdb_sys_getcwd; > + > + case aarch64_sys_chdir: > + return gdb_sys_chdir; > + > + case aarch64_sys_fchdir: > + return gdb_sys_fchdir; > + > + case aarch64_sys_rename: > + return gdb_sys_rename; > + > + case aarch64_sys_mkdir: > + return gdb_sys_mkdir; > + > + case aarch64_sys_link: > + return gdb_sys_link; > + > + case aarch64_sys_unlink: > + return gdb_sys_unlink; > + > + case aarch64_sys_symlink: > + return gdb_sys_symlink; > + > + case aarch64_sys_readlink: > + return gdb_sys_readlink; > + > + case aarch64_sys_fchmodat: > + return gdb_sys_fchmodat; > + > + case aarch64_sys_fchmod: > + return gdb_sys_fchmod; > + > + case aarch64_sys_fchownat: > + return gdb_sys_fchownat; > + > + case aarch64_sys_fchown: > + return gdb_sys_fchown; > + > + case aarch64_sys_umask: > + return gdb_sys_umask; > + > + case aarch64_sys_gettimeofday: > + return gdb_sys_gettimeofday; > + > + case aarch64_sys_getrlimit: > + return gdb_sys_getrlimit; > + > + case aarch64_sys_getrusage: > + return gdb_sys_getrusage; > + > + case aarch64_sys_sysinfo: > + return gdb_sys_sysinfo; > + > + case aarch64_sys_ptrace: > + return gdb_sys_ptrace; > + > + case aarch64_sys_getuid: > + return gdb_sys_getuid; > + > + case aarch64_sys_syslog: > + return gdb_sys_syslog; > + > + case aarch64_sys_getgid: > + return gdb_sys_getgid; > + > + case aarch64_sys_setuid: > + return gdb_sys_setuid; > + > + case aarch64_sys_setgid: > + return gdb_sys_setgid; > + > + case aarch64_sys_geteuid: > + return gdb_sys_geteuid; > + > + case aarch64_sys_getegid: > + return gdb_sys_getegid; > + > + case aarch64_sys_setpgid: > + return gdb_sys_setpgid; > + > + case aarch64_sys_getppid: > + return gdb_sys_getppid; > + > + case aarch64_sys_setsid: > + return gdb_sys_setsid; > + > + case aarch64_sys_setreuid: > + return gdb_sys_setreuid; > + > + case aarch64_sys_setregid: > + return gdb_sys_setregid; > + > + case aarch64_sys_getgroups: > + return gdb_sys_getgroups; > + > + case aarch64_sys_setgroups: > + return gdb_sys_setgroups; > + > + case aarch64_sys_setresuid: > + return gdb_sys_setresuid; > + > + case aarch64_sys_getresuid: > + return gdb_sys_getresuid; > + > + case aarch64_sys_setresgid: > + return gdb_sys_setresgid; > + > + case aarch64_sys_getresgid: > + return gdb_sys_getresgid; > + > + case aarch64_sys_getpgid: > + return gdb_sys_getpgid; > + > + case aarch64_sys_setfsuid: > + return gdb_sys_setfsuid; > + > + case aarch64_sys_setfsgid: > + return gdb_sys_setfsgid; > + > + case aarch64_sys_getsid: > + return gdb_sys_getsid; > + > + case aarch64_sys_capget: > + return gdb_sys_capget; > + > + case aarch64_sys_capset: > + return gdb_sys_capset; > + > + case aarch64_sys_rt_sigpending: > + return gdb_sys_rt_sigpending; > + > + case aarch64_sys_rt_sigtimedwait: > + return gdb_sys_rt_sigtimedwait; > + > + case aarch64_sys_rt_sigqueueinfo: > + return gdb_sys_rt_sigqueueinfo; > + > + case aarch64_sys_rt_sigsuspend: > + return gdb_sys_rt_sigsuspend; > + > + case aarch64_sys_sigaltstack: > + return gdb_sys_sigaltstack; > + > + case aarch64_sys_mknod: > + return gdb_sys_mknod; > + > + case aarch64_sys_personality: > + return gdb_sys_personality; > + > + case aarch64_sys_statfs: > + return gdb_sys_statfs; > + > + case aarch64_sys_fstat: > + return gdb_sys_fstat; > + > + case aarch64_sys_fstatfs: > + return gdb_sys_fstatfs; > + > + case aarch64_sys_getpriority: > + return gdb_sys_getpriority; > + > + case aarch64_sys_setpriority: > + return gdb_sys_setpriority; > + > + case aarch64_sys_sched_setparam: > + return gdb_sys_sched_setparam; > + > + case aarch64_sys_sched_getparam: > + return gdb_sys_sched_getparam; > + > + case aarch64_sys_sched_setscheduler: > + return gdb_sys_sched_setscheduler; > + > + case aarch64_sys_sched_getscheduler: > + return gdb_sys_sched_getscheduler; > + > + case aarch64_sys_sched_get_priority_max: > + return gdb_sys_sched_get_priority_max; > + > + case aarch64_sys_sched_get_priority_min: > + return gdb_sys_sched_get_priority_min; > + > + case aarch64_sys_sched_rr_get_interval: > + return gdb_sys_sched_rr_get_interval; > + > + case aarch64_sys_mlock: > + return gdb_sys_mlock; > + > + case aarch64_sys_munlock: > + return gdb_sys_munlock; > + > + case aarch64_sys_mlockall: > + return gdb_sys_mlockall; > + > + case aarch64_sys_munlockall: > + return gdb_sys_munlockall; > + > + case aarch64_sys_vhangup: > + return gdb_sys_vhangup; > + > + case aarch64_sys_prctl: > + return gdb_sys_prctl; > + > + case aarch64_sys_adjtimex: > + return gdb_sys_adjtimex; > + > + case aarch64_sys_setrlimit: > + return gdb_sys_setrlimit; > + > + case aarch64_sys_chroot: > + return gdb_sys_chroot; > + > + case aarch64_sys_sync: > + return gdb_sys_sync; > + > + case aarch64_sys_acct: > + return gdb_sys_acct; > + > + case aarch64_sys_settimeofday: > + return gdb_sys_settimeofday; > + > + case aarch64_sys_mount: > + return gdb_sys_mount; > + > + case aarch64_sys_swapon: > + return gdb_sys_swapon; > + > + case aarch64_sys_swapoff: > + return gdb_sys_swapoff; > + > + case aarch64_sys_reboot: > + return gdb_sys_reboot; > + > + case aarch64_sys_sethostname: > + return gdb_sys_sethostname; > + > + case aarch64_sys_setdomainname: > + return gdb_sys_setdomainname; > + > + case aarch64_sys_init_module: > + return gdb_sys_init_module; > + > + case aarch64_sys_delete_module: > + return gdb_sys_delete_module; > + > + case aarch64_sys_quotactl: > + return gdb_sys_quotactl; > + > + case aarch64_sys_nfsservctl: > + return gdb_sys_nfsservctl; > + > + case aarch64_sys_gettid: > + return gdb_sys_gettid; > + > + case aarch64_sys_readahead: > + return gdb_sys_readahead; > + > + case aarch64_sys_setxattr: > + return gdb_sys_setxattr; > + > + case aarch64_sys_lsetxattr: > + return gdb_sys_lsetxattr; > + > + case aarch64_sys_fsetxattr: > + return gdb_sys_fsetxattr; > + > + case aarch64_sys_getxattr: > + return gdb_sys_getxattr; > + > + case aarch64_sys_lgetxattr: > + return gdb_sys_lgetxattr; > + > + case aarch64_sys_fgetxattr: > + return gdb_sys_fgetxattr; > + > + case aarch64_sys_listxattr: > + return gdb_sys_listxattr; > + > + case aarch64_sys_llistxattr: > + return gdb_sys_llistxattr; > + > + case aarch64_sys_flistxattr: > + return gdb_sys_flistxattr; > + > + case aarch64_sys_removexattr: > + return gdb_sys_removexattr; > + > + case aarch64_sys_lremovexattr: > + return gdb_sys_lremovexattr; > + > + case aarch64_sys_fremovexattr: > + return gdb_sys_fremovexattr; > + > + case aarch64_sys_tkill: > + return gdb_sys_tkill; > + > + case aarch64_sys_times: > + return gdb_sys_times; > + > + case aarch64_sys_futex: > + return gdb_sys_futex; > + > + case aarch64_sys_sched_setaffinity: > + return gdb_sys_sched_setaffinity; > + > + case aarch64_sys_sched_getaffinity: > + return gdb_sys_sched_getaffinity; > + > + case aarch64_sys_io_setup: > + return gdb_sys_io_setup; > + > + case aarch64_sys_io_destroy: > + return gdb_sys_io_destroy; > + > + case aarch64_sys_io_getevents: > + return gdb_sys_io_getevents; > + > + case aarch64_sys_io_submit: > + return gdb_sys_io_submit; > + > + case aarch64_sys_io_cancel: > + return gdb_sys_io_cancel; > + > + case aarch64_sys_lookup_dcookie: > + return gdb_sys_lookup_dcookie; > + > + case aarch64_sys_epoll_create1: > + return gdb_sys_epoll_create; > + > + case aarch64_sys_remap_file_pages: > + return gdb_sys_remap_file_pages; > + > + case aarch64_sys_getdents64: > + return gdb_sys_getdents64; > + > + case aarch64_sys_set_tid_address: > + return gdb_sys_set_tid_address; > + > + case aarch64_sys_semtimedop: > + return gdb_sys_semtimedop; > + > + case aarch64_sys_fadvise64: > + return gdb_sys_fadvise64; > + > + case aarch64_sys_timer_create: > + return gdb_sys_timer_create; > + > + case aarch64_sys_timer_settime: > + return gdb_sys_timer_settime; > + > + case aarch64_sys_timer_gettime: > + return gdb_sys_timer_gettime; > + > + case aarch64_sys_timer_getoverrun: > + return gdb_sys_timer_getoverrun; > + > + case aarch64_sys_timer_delete: > + return gdb_sys_timer_delete; > + > + case aarch64_sys_clock_settime: > + return gdb_sys_clock_settime; > + > + case aarch64_sys_clock_gettime: > + return gdb_sys_clock_gettime; > + > + case aarch64_sys_clock_getres: > + return gdb_sys_clock_getres; > + > + case aarch64_sys_clock_nanosleep: > + return gdb_sys_clock_nanosleep; > + > + case aarch64_sys_exit_group: > + return gdb_sys_exit_group; > + > + case aarch64_sys_epoll_pwait: > + return gdb_sys_epoll_pwait; > + > + case aarch64_sys_epoll_ctl: > + return gdb_sys_epoll_ctl; > + > + case aarch64_sys_tgkill: > + return gdb_sys_tgkill; > + > + case aarch64_sys_mbind: > + return gdb_sys_mbind; > + > + case aarch64_sys_set_mempolicy: > + return gdb_sys_set_mempolicy; > + > + case aarch64_sys_get_mempolicy: > + return gdb_sys_get_mempolicy; > + > + case aarch64_sys_mq_open: > + return gdb_sys_mq_open; > + > + case aarch64_sys_mq_unlink: > + return gdb_sys_mq_unlink; > + > + case aarch64_sys_mq_timedsend: > + return gdb_sys_mq_timedsend; > + > + case aarch64_sys_mq_timedreceive: > + return gdb_sys_mq_timedreceive; > + > + case aarch64_sys_mq_notify: > + return gdb_sys_mq_notify; > + > + case aarch64_sys_mq_getsetattr: > + return gdb_sys_mq_getsetattr; > + > + case aarch64_sys_kexec_load: > + return gdb_sys_kexec_load; > + > + case aarch64_sys_waitid: > + return gdb_sys_waitid; > + > + case aarch64_sys_add_key: > + return gdb_sys_add_key; > + > + case aarch64_sys_request_key: > + return gdb_sys_request_key; > + > + case aarch64_sys_keyctl: > + return gdb_sys_keyctl; > + > + case aarch64_sys_ioprio_set: > + return gdb_sys_ioprio_set; > + > + case aarch64_sys_ioprio_get: > + return gdb_sys_ioprio_get; > + > + case aarch64_sys_inotify_add_watch: > + return gdb_sys_inotify_add_watch; > + > + case aarch64_sys_inotify_rm_watch: > + return gdb_sys_inotify_rm_watch; > + > + case aarch64_sys_migrate_pages: > + return gdb_sys_migrate_pages; > + > + case aarch64_sys_pselect6: > + return gdb_sys_pselect6; > + > + case aarch64_sys_ppoll: > + return gdb_sys_ppoll; > + > + case aarch64_sys_unshare: > + return gdb_sys_unshare; > + > + case aarch64_sys_set_robust_list: > + return gdb_sys_set_robust_list; > + > + case aarch64_sys_get_robust_list: > + return gdb_sys_get_robust_list; > + > + case aarch64_sys_splice: > + return gdb_sys_splice; > + > + case aarch64_sys_tee: > + return gdb_sys_tee; > + > + case aarch64_sys_sync_file_range: > + return gdb_sys_sync_file_range; > + > + case aarch64_sys_vmsplice: > + return gdb_sys_vmsplice; > + > + case aarch64_sys_move_pages: > + return gdb_sys_move_pages; > + > + default: > + return -1; > + } > +} > + > +/* Record all registers but PC register for process-record. */ > + > +static int > +aarch64_all_but_pc_registers_record (struct regcache *regcache) > +{ > + int i; > + > + for (i = 0; i < AARCH64_PC_REGNUM; i++) > + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM + i)) > + return -1; > + > + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) > + return -1; > + > + return 0; > +} > + > +/* Handler for arm system call instruction recording. */ > + > +static int > +aarch64_linux_syscall_record (struct regcache *regcache, unsigned long svc_number) > +{ > + int ret = 0; > + enum gdb_syscall syscall_gdb; > + > + printf_unfiltered (_("syscall number %s\n"), > + plongest (svc_number)); > + syscall_gdb = aarch64_canonicalize_syscall (svc_number); > + > + if (syscall_gdb < 0) > + { > + printf_unfiltered (_("Process record and replay target doesn't " > + "support syscall number %s\n"), > + plongest (svc_number)); > + return -1; > + } > + > + if (syscall_gdb == gdb_sys_sigreturn > + || syscall_gdb == gdb_sys_rt_sigreturn) > + { > + if (aarch64_all_but_pc_registers_record (regcache)) > + return -1; > + return 0; > + } > + > + ret = record_linux_system_call (syscall_gdb, regcache, > + &aarch64_linux_record_tdep); > + if (ret != 0) > + return ret; > + > + /* Record the return value of the system call. */ > + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM)) > + return -1; > + /* Record LR. */ > + if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM)) > + return -1; > + /* Record CPSR. */ > + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) > + return -1; > + > + return 0; > +} > + > static void > aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) > { > @@ -404,6 +1153,170 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) > > /* Reversible debugging, process record. */ > set_gdbarch_process_record (gdbarch, aarch64_process_record); > + /* Syscall record. */ > + tdep->aarch64_syscall_record = aarch64_linux_syscall_record; > + > + /* Initialize the aarch64_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. */ > + aarch64_linux_record_tdep.size_pointer > + = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; > + aarch64_linux_record_tdep.size__old_kernel_stat = 32; > + aarch64_linux_record_tdep.size_tms = 32; > + aarch64_linux_record_tdep.size_loff_t = 8; > + aarch64_linux_record_tdep.size_flock = 32; > + aarch64_linux_record_tdep.size_oldold_utsname = 45; > + aarch64_linux_record_tdep.size_ustat = 32; > + aarch64_linux_record_tdep.size_old_sigaction = 152; > + aarch64_linux_record_tdep.size_old_sigset_t = 128; > + aarch64_linux_record_tdep.size_rlimit = 16; > + aarch64_linux_record_tdep.size_rusage = 144; > + aarch64_linux_record_tdep.size_timeval = 16; > + aarch64_linux_record_tdep.size_timezone = 8; > + aarch64_linux_record_tdep.size_old_gid_t = 2; > + aarch64_linux_record_tdep.size_old_uid_t = 2; > + aarch64_linux_record_tdep.size_fd_set = 128; > + aarch64_linux_record_tdep.size_dirent = 280; > + aarch64_linux_record_tdep.size_dirent64 = 280; > + aarch64_linux_record_tdep.size_statfs = 120; > + aarch64_linux_record_tdep.size_statfs64 = 120; > + aarch64_linux_record_tdep.size_sockaddr = 16; > + aarch64_linux_record_tdep.size_int > + = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT; > + aarch64_linux_record_tdep.size_long > + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; > + aarch64_linux_record_tdep.size_ulong > + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; > + aarch64_linux_record_tdep.size_msghdr = 56; > + aarch64_linux_record_tdep.size_itimerval = 32; > + aarch64_linux_record_tdep.size_stat = 144; > + aarch64_linux_record_tdep.size_old_utsname = 325; > + aarch64_linux_record_tdep.size_sysinfo = 112; > + aarch64_linux_record_tdep.size_msqid_ds = 120; > + aarch64_linux_record_tdep.size_shmid_ds = 112; > + aarch64_linux_record_tdep.size_new_utsname = 390; > + aarch64_linux_record_tdep.size_timex = 208; > + aarch64_linux_record_tdep.size_mem_dqinfo = 24; > + aarch64_linux_record_tdep.size_if_dqblk = 72; > + aarch64_linux_record_tdep.size_fs_quota_stat = 80; > + aarch64_linux_record_tdep.size_timespec = 16; > + aarch64_linux_record_tdep.size_pollfd = 8; > + aarch64_linux_record_tdep.size_NFS_FHSIZE = 32; > + aarch64_linux_record_tdep.size_knfsd_fh = 132; > + aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16; > + aarch64_linux_record_tdep.size_sigaction = 152; > + aarch64_linux_record_tdep.size_sigset_t = 128; > + aarch64_linux_record_tdep.size_siginfo_t = 128; > + aarch64_linux_record_tdep.size_cap_user_data_t = 8; > + aarch64_linux_record_tdep.size_stack_t = 24; > + aarch64_linux_record_tdep.size_off_t = 8; > + aarch64_linux_record_tdep.size_stat64 = 144; > + aarch64_linux_record_tdep.size_gid_t = 4; > + aarch64_linux_record_tdep.size_uid_t = 4; > + aarch64_linux_record_tdep.size_PAGE_SIZE = 4096; > + aarch64_linux_record_tdep.size_flock64 = 32; > + aarch64_linux_record_tdep.size_user_desc = 16; > + aarch64_linux_record_tdep.size_io_event = 32; > + aarch64_linux_record_tdep.size_iocb = 64; > + aarch64_linux_record_tdep.size_epoll_event = 12; > + aarch64_linux_record_tdep.size_itimerspec = 32; > + aarch64_linux_record_tdep.size_mq_attr = 64; > + aarch64_linux_record_tdep.size_siginfo = 128; > + aarch64_linux_record_tdep.size_termios = 60; > + aarch64_linux_record_tdep.size_termios2 = 44; > + aarch64_linux_record_tdep.size_pid_t = 4; > + aarch64_linux_record_tdep.size_winsize = 8; > + aarch64_linux_record_tdep.size_serial_struct = 72; > + aarch64_linux_record_tdep.size_serial_icounter_struct = 80; > + aarch64_linux_record_tdep.size_hayes_esp_config = 12; > + aarch64_linux_record_tdep.size_size_t = 8; > + aarch64_linux_record_tdep.size_iovec = 16; > + > + /* These values are the second argument of system call "sys_ioctl". > + They are obtained from Linux Kernel source. */ > + aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401; > + aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402; > + aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403; > + aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404; > + aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405; > + aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406; > + aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407; > + aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408; > + aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409; > + aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a; > + aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b; > + aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c; > + aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d; > + aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e; > + aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f; > + aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410; > + aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411; > + aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412; > + aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413; > + aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414; > + aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415; > + aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416; > + aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417; > + aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418; > + aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419; > + aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a; > + aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b; > + aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b; > + aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c; > + aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d; > + aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e; > + aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f; > + aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420; > + aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421; > + aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422; > + aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423; > + aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424; > + aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425; > + aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426; > + aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427; > + aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428; > + aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429; > + aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a; > + aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b; > + aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c; > + aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d; > + aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430; > + aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431; > + aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450; > + aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451; > + aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452; > + aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453; > + aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454; > + aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455; > + aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456; > + aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457; > + aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458; > + aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459; > + aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a; > + aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b; > + aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c; > + aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d; > + aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e; > + aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f; > + aarch64_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. */ > + aarch64_linux_record_tdep.fcntl_F_GETLK = 5; > + aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12; > + aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13; > + aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14; > + > + /* The AArch64 syscall calling convention: reg x0-x7 for arguments, > + reg x8 for syscall number and return value in reg x0. */ > + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0; > + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1; > + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2; > + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; > + aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4; > + aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5; > + aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6; > + aarch64_linux_record_tdep.arg8 = AARCH64_X0_REGNUM + 7; > } > > /* Provide a prototype to silence -Wmissing-prototypes. */ > diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h > index 2e1de60..1ae3786 100644 > --- a/gdb/aarch64-linux-tdep.h > +++ b/gdb/aarch64-linux-tdep.h > @@ -32,3 +32,269 @@ > > extern const struct regset aarch64_linux_gregset; > extern const struct regset aarch64_linux_fpregset; > + > +/* Enum that defines the AArch64 linux specific syscall identifiers used for > + process record/replay. */ > + > +enum aarch64_syscall { > + aarch64_sys_io_setup = 0, > + aarch64_sys_io_destroy = 1, > + aarch64_sys_io_submit = 2, > + aarch64_sys_io_cancel = 3, > + aarch64_sys_io_getevents = 4, > + aarch64_sys_setxattr = 5, > + aarch64_sys_lsetxattr = 6, > + aarch64_sys_fsetxattr = 7, > + aarch64_sys_getxattr = 8, > + aarch64_sys_lgetxattr = 9, > + aarch64_sys_fgetxattr = 10, > + aarch64_sys_listxattr = 11, > + aarch64_sys_llistxattr = 12, > + aarch64_sys_flistxattr = 13, > + aarch64_sys_removexattr = 14, > + aarch64_sys_lremovexattr = 15, > + aarch64_sys_fremovexattr = 16, > + aarch64_sys_getcwd = 17, > + aarch64_sys_lookup_dcookie = 18, > + aarch64_sys_eventfd2 = 19, > + aarch64_sys_epoll_create1 = 20, > + aarch64_sys_epoll_ctl = 21, > + aarch64_sys_epoll_pwait = 22, > + aarch64_sys_dup = 23, > + aarch64_sys_dup3 = 24, > + aarch64_sys_fcntl = 25, > + aarch64_sys_inotify_init1 = 26, > + aarch64_sys_inotify_add_watch = 27, > + aarch64_sys_inotify_rm_watch = 28, > + aarch64_sys_ioctl = 29, > + aarch64_sys_ioprio_set = 30, > + aarch64_sys_ioprio_get = 31, > + aarch64_sys_flock = 32, > + aarch64_sys_mknod = 33, > + aarch64_sys_mkdir = 34, > + aarch64_sys_unlink = 35, > + aarch64_sys_symlink = 36, > + aarch64_sys_link = 37, > + aarch64_sys_rename = 38, > + aarch64_sys_umount2 = 39, > + aarch64_sys_mount = 40, > + aarch64_sys_pivot_root = 41, > + aarch64_sys_nfsservctl = 42, > + aarch64_sys_statfs = 43, > + aarch64_sys_fstatfs = 44, > + aarch64_sys_truncate = 45, > + aarch64_sys_ftruncate = 46, > + aarch64_sys_fallocate = 47, > + aarch64_sys_faccess = 48, > + aarch64_sys_chdir = 49, > + aarch64_sys_fchdir = 50, > + aarch64_sys_chroot = 51, > + aarch64_sys_fchmod = 52, > + aarch64_sys_fchmodat = 53, > + aarch64_sys_fchownat = 54, > + aarch64_sys_fchown = 55, > + aarch64_sys_open = 56, > + aarch64_sys_close = 57, > + aarch64_sys_vhangup = 58, > + aarch64_sys_pipe2 = 59, > + aarch64_sys_quotactl = 60, > + aarch64_sys_getdents64 = 61, > + aarch64_sys_lseek = 62, > + aarch64_sys_read = 63, > + aarch64_sys_write = 64, > + aarch64_sys_readv = 65, > + aarch64_sys_writev = 66, > + aarch64_sys_pread64 = 67, > + aarch64_sys_pwrite64 = 68, > + aarch64_sys_preadv = 69, > + aarch64_sys_pwritev = 70, > + aarch64_sys_sendfile = 71, > + aarch64_sys_pselect6 = 72, > + aarch64_sys_ppoll = 73, > + aarch64_sys_signalfd4 = 74, > + aarch64_sys_vmsplice = 75, > + aarch64_sys_splice = 76, > + aarch64_sys_tee = 77, > + aarch64_sys_readlink = 78, > + aarch64_sys_fstatat = 79, > + aarch64_sys_fstat = 80, > + aarch64_sys_sync = 81, > + aarch64_sys_fsync = 82, > + aarch64_sys_fdatasync = 83, > + aarch64_sys_sync_file_range2 = 84, > + aarch64_sys_sync_file_range = 84, > + aarch64_sys_timerfd_create = 85, > + aarch64_sys_timerfd_settime = 86, > + aarch64_sys_timerfd_gettime = 87, > + aarch64_sys_utimensat = 88, > + aarch64_sys_acct = 89, > + aarch64_sys_capget = 90, > + aarch64_sys_capset = 91, > + aarch64_sys_personality = 92, > + aarch64_sys_exit = 93, > + aarch64_sys_exit_group = 94, > + aarch64_sys_waitid = 95, > + aarch64_sys_set_tid_address = 96, > + aarch64_sys_unshare = 97, > + aarch64_sys_futex = 98, > + aarch64_sys_set_robust_list = 99, > + aarch64_sys_get_robust_list = 100, > + aarch64_sys_nanosleep = 101, > + aarch64_sys_getitimer = 102, > + aarch64_sys_setitimer = 103, > + aarch64_sys_kexec_load = 104, > + aarch64_sys_init_module = 105, > + aarch64_sys_delete_module = 106, > + aarch64_sys_timer_create = 107, > + aarch64_sys_timer_gettime = 108, > + aarch64_sys_timer_getoverrun = 109, > + aarch64_sys_timer_settime = 110, > + aarch64_sys_timer_delete = 111, > + aarch64_sys_clock_settime = 112, > + aarch64_sys_clock_gettime = 113, > + aarch64_sys_clock_getres = 114, > + aarch64_sys_clock_nanosleep = 115, > + aarch64_sys_syslog = 116, > + aarch64_sys_ptrace = 117, > + aarch64_sys_sched_setparam = 118, > + aarch64_sys_sched_setscheduler = 119, > + aarch64_sys_sched_getscheduler = 120, > + aarch64_sys_sched_getparam = 121, > + aarch64_sys_sched_setaffinity = 122, > + aarch64_sys_sched_getaffinity = 123, > + aarch64_sys_sched_yield = 124, > + aarch64_sys_sched_get_priority_max = 125, > + aarch64_sys_sched_get_priority_min = 126, > + aarch64_sys_sched_rr_get_interval = 127, > + aarch64_sys_kill = 129, > + aarch64_sys_tkill = 130, > + aarch64_sys_tgkill = 131, > + aarch64_sys_sigaltstack = 132, > + aarch64_sys_rt_sigsuspend = 133, > + aarch64_sys_rt_sigaction = 134, > + aarch64_sys_rt_sigprocmask = 135, > + aarch64_sys_rt_sigpending = 136, > + aarch64_sys_rt_sigtimedwait = 137, > + aarch64_sys_rt_sigqueueinfo = 138, > + aarch64_sys_rt_sigreturn = 139, > + aarch64_sys_setpriority = 140, > + aarch64_sys_getpriority = 141, > + aarch64_sys_reboot = 142, > + aarch64_sys_setregid = 143, > + aarch64_sys_setgid = 144, > + aarch64_sys_setreuid = 145, > + aarch64_sys_setuid = 146, > + aarch64_sys_setresuid = 147, > + aarch64_sys_getresuid = 148, > + aarch64_sys_setresgid = 149, > + aarch64_sys_getresgid = 150, > + aarch64_sys_setfsuid = 151, > + aarch64_sys_setfsgid = 152, > + aarch64_sys_times = 153, > + aarch64_sys_setpgid = 154, > + aarch64_sys_getpgid = 155, > + aarch64_sys_getsid = 156, > + aarch64_sys_setsid = 157, > + aarch64_sys_getgroups = 158, > + aarch64_sys_setgroups = 159, > + aarch64_sys_uname = 160, > + aarch64_sys_sethostname = 161, > + aarch64_sys_setdomainname = 162, > + aarch64_sys_getrlimit = 163, > + aarch64_sys_setrlimit = 164, > + aarch64_sys_getrusage = 165, > + aarch64_sys_umask = 166, > + aarch64_sys_prctl = 167, > + aarch64_sys_getcpu = 168, > + aarch64_sys_gettimeofday = 169, > + aarch64_sys_settimeofday = 170, > + aarch64_sys_adjtimex = 171, > + aarch64_sys_getpid = 172, > + aarch64_sys_getppid = 173, > + aarch64_sys_getuid = 174, > + aarch64_sys_geteuid = 175, > + aarch64_sys_getgid = 176, > + aarch64_sys_getegid = 177, > + aarch64_sys_gettid = 178, > + aarch64_sys_sysinfo = 179, > + aarch64_sys_mq_open = 180, > + aarch64_sys_mq_unlink = 181, > + aarch64_sys_mq_timedsend = 182, > + aarch64_sys_mq_timedreceive = 183, > + aarch64_sys_mq_notify = 184, > + aarch64_sys_mq_getsetattr = 185, > + aarch64_sys_msgget = 186, > + aarch64_sys_msgctl = 187, > + aarch64_sys_msgrcv = 188, > + aarch64_sys_msgsnd = 189, > + aarch64_sys_semget = 190, > + aarch64_sys_semctl = 191, > + aarch64_sys_semtimedop = 192, > + aarch64_sys_semop = 193, > + aarch64_sys_shmget = 194, > + aarch64_sys_shmctl = 195, > + aarch64_sys_shmat = 196, > + aarch64_sys_shmdt = 197, > + aarch64_sys_socket = 198, > + aarch64_sys_socketpair = 199, > + aarch64_sys_bind = 200, > + aarch64_sys_listen = 201, > + aarch64_sys_accept = 202, > + aarch64_sys_connect = 203, > + aarch64_sys_getsockname = 204, > + aarch64_sys_getpeername = 205, > + aarch64_sys_sendto = 206, > + aarch64_sys_recvfrom = 207, > + aarch64_sys_setsockopt = 208, > + aarch64_sys_getsockopt = 209, > + aarch64_sys_shutdown = 210, > + aarch64_sys_sendmsg = 211, > + aarch64_sys_recvmsg = 212, > + aarch64_sys_readahead = 213, > + aarch64_sys_brk = 214, > + aarch64_sys_munmap = 215, > + aarch64_sys_mremap = 216, > + aarch64_sys_add_key = 217, > + aarch64_sys_request_key = 218, > + aarch64_sys_keyctl = 219, > + aarch64_sys_clone = 220, > + aarch64_sys_execve = 221, > + aarch64_sys_mmap = 222, > + aarch64_sys_fadvise64 = 223, > + aarch64_sys_swapon = 224, > + aarch64_sys_swapoff = 225, > + aarch64_sys_mprotect = 226, > + aarch64_sys_msync = 227, > + aarch64_sys_mlock = 228, > + aarch64_sys_munlock = 229, > + aarch64_sys_mlockall = 230, > + aarch64_sys_munlockall = 231, > + aarch64_sys_mincore = 232, > + aarch64_sys_madvise = 233, > + aarch64_sys_remap_file_pages = 234, > + aarch64_sys_mbind = 235, > + aarch64_sys_get_mempolicy = 236, > + aarch64_sys_set_mempolicy = 237, > + aarch64_sys_migrate_pages = 238, > + aarch64_sys_move_pages = 239, > + aarch64_sys_rt_tgsigqueueinfo = 240, > + aarch64_sys_perf_event_open = 241, > + aarch64_sys_accept4 = 242, > + aarch64_sys_recvmmsg = 243, > + aarch64_sys_wait4 = 260, > + aarch64_sys_prlimit64 = 261, > + aarch64_sys_fanotify_init = 262, > + aarch64_sys_fanotify_mark = 263, > + aarch64_sys_name_to_handle_at = 264, > + aarch64_sys_open_by_handle_at = 265, > + aarch64_sys_clock_adjtime = 266, > + aarch64_sys_syncfs = 267, > + aarch64_sys_setns = 268, > + aarch64_sys_sendmmsg = 269, > + aarch64_sys_process_vm_readv = 270, > + aarch64_sys_process_vm_writev = 271, > + aarch64_sys_kcmp = 272, > + aarch64_sys_finit_module = 273, > + aarch64_sys_sched_setattr = 274, > + aarch64_sys_sched_getattr = 275, > +}; > diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c > index 0847585..c6da25a 100644 > --- a/gdb/aarch64-tdep.c > +++ b/gdb/aarch64-tdep.c > @@ -2941,7 +2941,20 @@ aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r) > { > /* Exception generation instructions. */ > if (insn_bits24_27 == 0x04) > - return AARCH64_RECORD_UNSUPPORTED; > + { > + if (!bits (aarch64_insn_r->aarch64_insn, 2, 4) && > + !bits (aarch64_insn_r->aarch64_insn, 21, 23) && > + bits (aarch64_insn_r->aarch64_insn, 0, 1) == 0x01) > + { > + ULONGEST svc_number; > + regcache_raw_read_unsigned (aarch64_insn_r->regcache, 8, > + &svc_number); > + return tdep->aarch64_syscall_record (aarch64_insn_r->regcache, > + svc_number); > + } > + else > + return AARCH64_RECORD_UNSUPPORTED; > + } > /* System instructions. */ > else if (insn_bits24_27 == 0x05 && insn_bits22_23 == 0x00) > { > diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h > index 1d74ef8..25751fe 100644 > --- a/gdb/aarch64-tdep.h > +++ b/gdb/aarch64-tdep.h > @@ -88,6 +88,9 @@ struct gdbarch_tdep > struct type *vns_type; > struct type *vnh_type; > struct type *vnb_type; > + > + /* syscall record. */ > + int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number); > }; > > /* AArch64 process record-replay related structures, defines etc. */ > diff --git a/gdb/linux-record.h b/gdb/linux-record.h > index 7b5218e..2649ce5 100644 > --- a/gdb/linux-record.h > +++ b/gdb/linux-record.h > @@ -174,6 +174,8 @@ struct linux_record_tdep > int arg4; > int arg5; > int arg6; > + int arg7; > + int arg8; > }; > > /* Enum that defines the gdb-canonical set of Linux syscall identifiers. > -- > 1.9.1 >
On 18 September 2014 05:22, Will Newton <will.newton@linaro.org> wrote: > On 29 August 2014 04:53, Omair Javaid <omair.javaid@linaro.org> wrote: >> Suggestion have been incorporated and updated patch is given below. >> >> gdb: >> >> 2014-08-28 Omair Javaid <omair.javaid@linaro.org> >> >> * aarch64-linux-tdep.c (record.h): Include. >> (record-full.h): Include. >> (struct linux_record_tdep aarch64_linux_record_tdep): Declare. >> (aarch64_canonicalize_syscall): New function to translate syscall >> numbers from aarch64 to canonical. >> (aarch64_all_but_pc_registers_record): New function. >> (aarch64_linux_syscall_record): New function. >> (aarch64_linux_init_abi): Update to handle syscall recording. >> * aarch64-linux-tdep.h (aarch64_syscall): New enum. >> * aarch64-tdep.c (aarch64_record_branch_except_sys): Add code to >> handle recording of syscalls. >> * aarch64-tdep.h >> (struct gdbarch_tdep) <aarch64_syscall_record>: Defined. >> * linux-record.h (struct linux_record_tdep): Add two more syscall >> argument fields. >> >> --- >> gdb/aarch64-linux-tdep.c | 913 +++++++++++++++++++++++++++++++++++++++++++++++ >> gdb/aarch64-linux-tdep.h | 266 ++++++++++++++ >> gdb/aarch64-tdep.c | 15 +- >> gdb/aarch64-tdep.h | 3 + >> gdb/linux-record.h | 2 + >> 5 files changed, 1198 insertions(+), 1 deletion(-) > > This one looks ok to me now. > >> diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c >> index 5ab7b37..82b55b6 100644 >> --- a/gdb/aarch64-linux-tdep.c >> +++ b/gdb/aarch64-linux-tdep.c >> @@ -41,6 +41,9 @@ >> #include "user-regs.h" >> #include <ctype.h> >> >> +#include "record-full.h" >> +#include "linux-record.h" >> + >> /* Signal frame handling. >> >> +------------+ ^ >> @@ -354,6 +357,752 @@ aarch64_stap_parse_special_token (struct gdbarch *gdbarch, >> return 1; >> } >> >> +/* AArch64 process record-replay constructs: syscall, signal etc. */ >> + >> +struct linux_record_tdep aarch64_linux_record_tdep; >> + >> +/* aarch64_canonicalize_syscall maps syscall ids from the native AArch64 >> + linux set of syscall ids into a canonical set of syscall ids used by >> + process record. */ >> + >> +static enum gdb_syscall >> +aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number) >> +{ >> + switch (syscall_number) { >> + case aarch64_sys_read: >> + return gdb_sys_read; >> + >> + case aarch64_sys_write: >> + return gdb_sys_write; >> + >> + case aarch64_sys_open: >> + return gdb_sys_open; >> + >> + case aarch64_sys_close: >> + return gdb_sys_close; >> + >> + case aarch64_sys_lseek: >> + return gdb_sys_lseek; >> + >> + case aarch64_sys_mprotect: >> + return gdb_sys_mprotect; >> + >> + case aarch64_sys_munmap: >> + return gdb_sys_munmap; >> + >> + case aarch64_sys_brk: >> + return gdb_sys_brk; >> + >> + case aarch64_sys_rt_sigaction: >> + return gdb_sys_rt_sigaction; >> + >> + case aarch64_sys_rt_sigprocmask: >> + return gdb_sys_rt_sigprocmask; >> + >> + case aarch64_sys_rt_sigreturn: >> + return gdb_sys_rt_sigreturn; >> + >> + case aarch64_sys_ioctl: >> + return gdb_sys_ioctl; >> + >> + case aarch64_sys_pread64: >> + return gdb_sys_pread64; >> + >> + case aarch64_sys_pwrite64: >> + return gdb_sys_pwrite64; >> + >> + case aarch64_sys_readv: >> + return gdb_sys_readv; >> + >> + case aarch64_sys_writev: >> + return gdb_sys_writev; >> + >> + case aarch64_sys_sched_yield: >> + return gdb_sys_sched_yield; >> + >> + case aarch64_sys_mremap: >> + return gdb_sys_mremap; >> + >> + case aarch64_sys_msync: >> + return gdb_sys_msync; >> + >> + case aarch64_sys_mincore: >> + return gdb_sys_mincore; >> + >> + case aarch64_sys_madvise: >> + return gdb_sys_madvise; >> + >> + case aarch64_sys_shmget: >> + return gdb_sys_shmget; >> + >> + case aarch64_sys_shmat: >> + return gdb_sys_shmat; >> + >> + case aarch64_sys_shmctl: >> + return gdb_sys_shmctl; >> + >> + case aarch64_sys_dup: >> + return gdb_sys_dup; >> + >> + case aarch64_sys_nanosleep: >> + return gdb_sys_nanosleep; >> + >> + case aarch64_sys_getitimer: >> + return gdb_sys_getitimer; >> + >> + case aarch64_sys_setitimer: >> + return gdb_sys_setitimer; >> + >> + case aarch64_sys_getpid: >> + return gdb_sys_getpid; >> + >> + case aarch64_sys_sendfile: >> + return gdb_sys_sendfile; >> + >> + case aarch64_sys_socket: >> + return gdb_sys_socket; >> + >> + case aarch64_sys_connect: >> + return gdb_sys_connect; >> + >> + case aarch64_sys_accept: >> + return gdb_sys_accept; >> + >> + case aarch64_sys_sendto: >> + return gdb_sys_sendto; >> + >> + case aarch64_sys_recvfrom: >> + return gdb_sys_recvfrom; >> + >> + case aarch64_sys_sendmsg: >> + return gdb_sys_sendmsg; >> + >> + case aarch64_sys_recvmsg: >> + return gdb_sys_recvmsg; >> + >> + case aarch64_sys_shutdown: >> + return gdb_sys_shutdown; >> + >> + case aarch64_sys_bind: >> + return gdb_sys_bind; >> + >> + case aarch64_sys_listen: >> + return gdb_sys_listen; >> + >> + case aarch64_sys_getsockname: >> + return gdb_sys_getsockname; >> + >> + case aarch64_sys_getpeername: >> + return gdb_sys_getpeername; >> + >> + case aarch64_sys_socketpair: >> + return gdb_sys_socketpair; >> + >> + case aarch64_sys_setsockopt: >> + return gdb_sys_setsockopt; >> + >> + case aarch64_sys_getsockopt: >> + return gdb_sys_getsockopt; >> + >> + case aarch64_sys_clone: >> + return gdb_sys_clone; >> + >> + case aarch64_sys_execve: >> + return gdb_sys_execve; >> + >> + case aarch64_sys_exit: >> + return gdb_sys_exit; >> + >> + case aarch64_sys_wait4: >> + return gdb_sys_wait4; >> + >> + case aarch64_sys_kill: >> + return gdb_sys_kill; >> + >> + case aarch64_sys_uname: >> + return gdb_sys_uname; >> + >> + case aarch64_sys_semget: >> + return gdb_sys_semget; >> + >> + case aarch64_sys_semop: >> + return gdb_sys_semop; >> + >> + case aarch64_sys_semctl: >> + return gdb_sys_semctl; >> + >> + case aarch64_sys_shmdt: >> + return gdb_sys_shmdt; >> + >> + case aarch64_sys_msgget: >> + return gdb_sys_msgget; >> + >> + case aarch64_sys_msgsnd: >> + return gdb_sys_msgsnd; >> + >> + case aarch64_sys_msgrcv: >> + return gdb_sys_msgrcv; >> + >> + case aarch64_sys_msgctl: >> + return gdb_sys_msgctl; >> + >> + case aarch64_sys_fcntl: >> + return gdb_sys_fcntl; >> + >> + case aarch64_sys_flock: >> + return gdb_sys_flock; >> + >> + case aarch64_sys_fsync: >> + return gdb_sys_fsync; >> + >> + case aarch64_sys_fdatasync: >> + return gdb_sys_fdatasync; >> + >> + case aarch64_sys_truncate: >> + return gdb_sys_truncate; >> + >> + case aarch64_sys_ftruncate: >> + return gdb_sys_ftruncate; >> + >> + case aarch64_sys_getcwd: >> + return gdb_sys_getcwd; >> + >> + case aarch64_sys_chdir: >> + return gdb_sys_chdir; >> + >> + case aarch64_sys_fchdir: >> + return gdb_sys_fchdir; >> + >> + case aarch64_sys_rename: >> + return gdb_sys_rename; >> + >> + case aarch64_sys_mkdir: >> + return gdb_sys_mkdir; >> + >> + case aarch64_sys_link: >> + return gdb_sys_link; >> + >> + case aarch64_sys_unlink: >> + return gdb_sys_unlink; >> + >> + case aarch64_sys_symlink: >> + return gdb_sys_symlink; >> + >> + case aarch64_sys_readlink: >> + return gdb_sys_readlink; >> + >> + case aarch64_sys_fchmodat: >> + return gdb_sys_fchmodat; >> + >> + case aarch64_sys_fchmod: >> + return gdb_sys_fchmod; >> + >> + case aarch64_sys_fchownat: >> + return gdb_sys_fchownat; >> + >> + case aarch64_sys_fchown: >> + return gdb_sys_fchown; >> + >> + case aarch64_sys_umask: >> + return gdb_sys_umask; >> + >> + case aarch64_sys_gettimeofday: >> + return gdb_sys_gettimeofday; >> + >> + case aarch64_sys_getrlimit: >> + return gdb_sys_getrlimit; >> + >> + case aarch64_sys_getrusage: >> + return gdb_sys_getrusage; >> + >> + case aarch64_sys_sysinfo: >> + return gdb_sys_sysinfo; >> + >> + case aarch64_sys_ptrace: >> + return gdb_sys_ptrace; >> + >> + case aarch64_sys_getuid: >> + return gdb_sys_getuid; >> + >> + case aarch64_sys_syslog: >> + return gdb_sys_syslog; >> + >> + case aarch64_sys_getgid: >> + return gdb_sys_getgid; >> + >> + case aarch64_sys_setuid: >> + return gdb_sys_setuid; >> + >> + case aarch64_sys_setgid: >> + return gdb_sys_setgid; >> + >> + case aarch64_sys_geteuid: >> + return gdb_sys_geteuid; >> + >> + case aarch64_sys_getegid: >> + return gdb_sys_getegid; >> + >> + case aarch64_sys_setpgid: >> + return gdb_sys_setpgid; >> + >> + case aarch64_sys_getppid: >> + return gdb_sys_getppid; >> + >> + case aarch64_sys_setsid: >> + return gdb_sys_setsid; >> + >> + case aarch64_sys_setreuid: >> + return gdb_sys_setreuid; >> + >> + case aarch64_sys_setregid: >> + return gdb_sys_setregid; >> + >> + case aarch64_sys_getgroups: >> + return gdb_sys_getgroups; >> + >> + case aarch64_sys_setgroups: >> + return gdb_sys_setgroups; >> + >> + case aarch64_sys_setresuid: >> + return gdb_sys_setresuid; >> + >> + case aarch64_sys_getresuid: >> + return gdb_sys_getresuid; >> + >> + case aarch64_sys_setresgid: >> + return gdb_sys_setresgid; >> + >> + case aarch64_sys_getresgid: >> + return gdb_sys_getresgid; >> + >> + case aarch64_sys_getpgid: >> + return gdb_sys_getpgid; >> + >> + case aarch64_sys_setfsuid: >> + return gdb_sys_setfsuid; >> + >> + case aarch64_sys_setfsgid: >> + return gdb_sys_setfsgid; >> + >> + case aarch64_sys_getsid: >> + return gdb_sys_getsid; >> + >> + case aarch64_sys_capget: >> + return gdb_sys_capget; >> + >> + case aarch64_sys_capset: >> + return gdb_sys_capset; >> + >> + case aarch64_sys_rt_sigpending: >> + return gdb_sys_rt_sigpending; >> + >> + case aarch64_sys_rt_sigtimedwait: >> + return gdb_sys_rt_sigtimedwait; >> + >> + case aarch64_sys_rt_sigqueueinfo: >> + return gdb_sys_rt_sigqueueinfo; >> + >> + case aarch64_sys_rt_sigsuspend: >> + return gdb_sys_rt_sigsuspend; >> + >> + case aarch64_sys_sigaltstack: >> + return gdb_sys_sigaltstack; >> + >> + case aarch64_sys_mknod: >> + return gdb_sys_mknod; >> + >> + case aarch64_sys_personality: >> + return gdb_sys_personality; >> + >> + case aarch64_sys_statfs: >> + return gdb_sys_statfs; >> + >> + case aarch64_sys_fstat: >> + return gdb_sys_fstat; >> + >> + case aarch64_sys_fstatfs: >> + return gdb_sys_fstatfs; >> + >> + case aarch64_sys_getpriority: >> + return gdb_sys_getpriority; >> + >> + case aarch64_sys_setpriority: >> + return gdb_sys_setpriority; >> + >> + case aarch64_sys_sched_setparam: >> + return gdb_sys_sched_setparam; >> + >> + case aarch64_sys_sched_getparam: >> + return gdb_sys_sched_getparam; >> + >> + case aarch64_sys_sched_setscheduler: >> + return gdb_sys_sched_setscheduler; >> + >> + case aarch64_sys_sched_getscheduler: >> + return gdb_sys_sched_getscheduler; >> + >> + case aarch64_sys_sched_get_priority_max: >> + return gdb_sys_sched_get_priority_max; >> + >> + case aarch64_sys_sched_get_priority_min: >> + return gdb_sys_sched_get_priority_min; >> + >> + case aarch64_sys_sched_rr_get_interval: >> + return gdb_sys_sched_rr_get_interval; >> + >> + case aarch64_sys_mlock: >> + return gdb_sys_mlock; >> + >> + case aarch64_sys_munlock: >> + return gdb_sys_munlock; >> + >> + case aarch64_sys_mlockall: >> + return gdb_sys_mlockall; >> + >> + case aarch64_sys_munlockall: >> + return gdb_sys_munlockall; >> + >> + case aarch64_sys_vhangup: >> + return gdb_sys_vhangup; >> + >> + case aarch64_sys_prctl: >> + return gdb_sys_prctl; >> + >> + case aarch64_sys_adjtimex: >> + return gdb_sys_adjtimex; >> + >> + case aarch64_sys_setrlimit: >> + return gdb_sys_setrlimit; >> + >> + case aarch64_sys_chroot: >> + return gdb_sys_chroot; >> + >> + case aarch64_sys_sync: >> + return gdb_sys_sync; >> + >> + case aarch64_sys_acct: >> + return gdb_sys_acct; >> + >> + case aarch64_sys_settimeofday: >> + return gdb_sys_settimeofday; >> + >> + case aarch64_sys_mount: >> + return gdb_sys_mount; >> + >> + case aarch64_sys_swapon: >> + return gdb_sys_swapon; >> + >> + case aarch64_sys_swapoff: >> + return gdb_sys_swapoff; >> + >> + case aarch64_sys_reboot: >> + return gdb_sys_reboot; >> + >> + case aarch64_sys_sethostname: >> + return gdb_sys_sethostname; >> + >> + case aarch64_sys_setdomainname: >> + return gdb_sys_setdomainname; >> + >> + case aarch64_sys_init_module: >> + return gdb_sys_init_module; >> + >> + case aarch64_sys_delete_module: >> + return gdb_sys_delete_module; >> + >> + case aarch64_sys_quotactl: >> + return gdb_sys_quotactl; >> + >> + case aarch64_sys_nfsservctl: >> + return gdb_sys_nfsservctl; >> + >> + case aarch64_sys_gettid: >> + return gdb_sys_gettid; >> + >> + case aarch64_sys_readahead: >> + return gdb_sys_readahead; >> + >> + case aarch64_sys_setxattr: >> + return gdb_sys_setxattr; >> + >> + case aarch64_sys_lsetxattr: >> + return gdb_sys_lsetxattr; >> + >> + case aarch64_sys_fsetxattr: >> + return gdb_sys_fsetxattr; >> + >> + case aarch64_sys_getxattr: >> + return gdb_sys_getxattr; >> + >> + case aarch64_sys_lgetxattr: >> + return gdb_sys_lgetxattr; >> + >> + case aarch64_sys_fgetxattr: >> + return gdb_sys_fgetxattr; >> + >> + case aarch64_sys_listxattr: >> + return gdb_sys_listxattr; >> + >> + case aarch64_sys_llistxattr: >> + return gdb_sys_llistxattr; >> + >> + case aarch64_sys_flistxattr: >> + return gdb_sys_flistxattr; >> + >> + case aarch64_sys_removexattr: >> + return gdb_sys_removexattr; >> + >> + case aarch64_sys_lremovexattr: >> + return gdb_sys_lremovexattr; >> + >> + case aarch64_sys_fremovexattr: >> + return gdb_sys_fremovexattr; >> + >> + case aarch64_sys_tkill: >> + return gdb_sys_tkill; >> + >> + case aarch64_sys_times: >> + return gdb_sys_times; >> + >> + case aarch64_sys_futex: >> + return gdb_sys_futex; >> + >> + case aarch64_sys_sched_setaffinity: >> + return gdb_sys_sched_setaffinity; >> + >> + case aarch64_sys_sched_getaffinity: >> + return gdb_sys_sched_getaffinity; >> + >> + case aarch64_sys_io_setup: >> + return gdb_sys_io_setup; >> + >> + case aarch64_sys_io_destroy: >> + return gdb_sys_io_destroy; >> + >> + case aarch64_sys_io_getevents: >> + return gdb_sys_io_getevents; >> + >> + case aarch64_sys_io_submit: >> + return gdb_sys_io_submit; >> + >> + case aarch64_sys_io_cancel: >> + return gdb_sys_io_cancel; >> + >> + case aarch64_sys_lookup_dcookie: >> + return gdb_sys_lookup_dcookie; >> + >> + case aarch64_sys_epoll_create1: >> + return gdb_sys_epoll_create; >> + >> + case aarch64_sys_remap_file_pages: >> + return gdb_sys_remap_file_pages; >> + >> + case aarch64_sys_getdents64: >> + return gdb_sys_getdents64; >> + >> + case aarch64_sys_set_tid_address: >> + return gdb_sys_set_tid_address; >> + >> + case aarch64_sys_semtimedop: >> + return gdb_sys_semtimedop; >> + >> + case aarch64_sys_fadvise64: >> + return gdb_sys_fadvise64; >> + >> + case aarch64_sys_timer_create: >> + return gdb_sys_timer_create; >> + >> + case aarch64_sys_timer_settime: >> + return gdb_sys_timer_settime; >> + >> + case aarch64_sys_timer_gettime: >> + return gdb_sys_timer_gettime; >> + >> + case aarch64_sys_timer_getoverrun: >> + return gdb_sys_timer_getoverrun; >> + >> + case aarch64_sys_timer_delete: >> + return gdb_sys_timer_delete; >> + >> + case aarch64_sys_clock_settime: >> + return gdb_sys_clock_settime; >> + >> + case aarch64_sys_clock_gettime: >> + return gdb_sys_clock_gettime; >> + >> + case aarch64_sys_clock_getres: >> + return gdb_sys_clock_getres; >> + >> + case aarch64_sys_clock_nanosleep: >> + return gdb_sys_clock_nanosleep; >> + >> + case aarch64_sys_exit_group: >> + return gdb_sys_exit_group; >> + >> + case aarch64_sys_epoll_pwait: >> + return gdb_sys_epoll_pwait; >> + >> + case aarch64_sys_epoll_ctl: >> + return gdb_sys_epoll_ctl; >> + >> + case aarch64_sys_tgkill: >> + return gdb_sys_tgkill; >> + >> + case aarch64_sys_mbind: >> + return gdb_sys_mbind; >> + >> + case aarch64_sys_set_mempolicy: >> + return gdb_sys_set_mempolicy; >> + >> + case aarch64_sys_get_mempolicy: >> + return gdb_sys_get_mempolicy; >> + >> + case aarch64_sys_mq_open: >> + return gdb_sys_mq_open; >> + >> + case aarch64_sys_mq_unlink: >> + return gdb_sys_mq_unlink; >> + >> + case aarch64_sys_mq_timedsend: >> + return gdb_sys_mq_timedsend; >> + >> + case aarch64_sys_mq_timedreceive: >> + return gdb_sys_mq_timedreceive; >> + >> + case aarch64_sys_mq_notify: >> + return gdb_sys_mq_notify; >> + >> + case aarch64_sys_mq_getsetattr: >> + return gdb_sys_mq_getsetattr; >> + >> + case aarch64_sys_kexec_load: >> + return gdb_sys_kexec_load; >> + >> + case aarch64_sys_waitid: >> + return gdb_sys_waitid; >> + >> + case aarch64_sys_add_key: >> + return gdb_sys_add_key; >> + >> + case aarch64_sys_request_key: >> + return gdb_sys_request_key; >> + >> + case aarch64_sys_keyctl: >> + return gdb_sys_keyctl; >> + >> + case aarch64_sys_ioprio_set: >> + return gdb_sys_ioprio_set; >> + >> + case aarch64_sys_ioprio_get: >> + return gdb_sys_ioprio_get; >> + >> + case aarch64_sys_inotify_add_watch: >> + return gdb_sys_inotify_add_watch; >> + >> + case aarch64_sys_inotify_rm_watch: >> + return gdb_sys_inotify_rm_watch; >> + >> + case aarch64_sys_migrate_pages: >> + return gdb_sys_migrate_pages; >> + >> + case aarch64_sys_pselect6: >> + return gdb_sys_pselect6; >> + >> + case aarch64_sys_ppoll: >> + return gdb_sys_ppoll; >> + >> + case aarch64_sys_unshare: >> + return gdb_sys_unshare; >> + >> + case aarch64_sys_set_robust_list: >> + return gdb_sys_set_robust_list; >> + >> + case aarch64_sys_get_robust_list: >> + return gdb_sys_get_robust_list; >> + >> + case aarch64_sys_splice: >> + return gdb_sys_splice; >> + >> + case aarch64_sys_tee: >> + return gdb_sys_tee; >> + >> + case aarch64_sys_sync_file_range: >> + return gdb_sys_sync_file_range; >> + >> + case aarch64_sys_vmsplice: >> + return gdb_sys_vmsplice; >> + >> + case aarch64_sys_move_pages: >> + return gdb_sys_move_pages; >> + >> + default: >> + return -1; >> + } >> +} >> + >> +/* Record all registers but PC register for process-record. */ >> + >> +static int >> +aarch64_all_but_pc_registers_record (struct regcache *regcache) >> +{ >> + int i; >> + >> + for (i = 0; i < AARCH64_PC_REGNUM; i++) >> + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM + i)) >> + return -1; >> + >> + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) >> + return -1; >> + >> + return 0; >> +} >> + >> +/* Handler for arm system call instruction recording. */ >> + >> +static int >> +aarch64_linux_syscall_record (struct regcache *regcache, unsigned long svc_number) >> +{ >> + int ret = 0; >> + enum gdb_syscall syscall_gdb; >> + >> + printf_unfiltered (_("syscall number %s\n"), >> + plongest (svc_number)); >> + syscall_gdb = aarch64_canonicalize_syscall (svc_number); >> + >> + if (syscall_gdb < 0) >> + { >> + printf_unfiltered (_("Process record and replay target doesn't " >> + "support syscall number %s\n"), >> + plongest (svc_number)); >> + return -1; >> + } >> + >> + if (syscall_gdb == gdb_sys_sigreturn >> + || syscall_gdb == gdb_sys_rt_sigreturn) >> + { >> + if (aarch64_all_but_pc_registers_record (regcache)) >> + return -1; >> + return 0; >> + } >> + >> + ret = record_linux_system_call (syscall_gdb, regcache, >> + &aarch64_linux_record_tdep); >> + if (ret != 0) >> + return ret; >> + >> + /* Record the return value of the system call. */ >> + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM)) >> + return -1; >> + /* Record LR. */ >> + if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM)) >> + return -1; >> + /* Record CPSR. */ >> + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) >> + return -1; >> + >> + return 0; >> +} >> + >> static void >> aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >> { >> @@ -404,6 +1153,170 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >> >> /* Reversible debugging, process record. */ >> set_gdbarch_process_record (gdbarch, aarch64_process_record); >> + /* Syscall record. */ >> + tdep->aarch64_syscall_record = aarch64_linux_syscall_record; >> + >> + /* Initialize the aarch64_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. */ >> + aarch64_linux_record_tdep.size_pointer >> + = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; >> + aarch64_linux_record_tdep.size__old_kernel_stat = 32; >> + aarch64_linux_record_tdep.size_tms = 32; >> + aarch64_linux_record_tdep.size_loff_t = 8; >> + aarch64_linux_record_tdep.size_flock = 32; >> + aarch64_linux_record_tdep.size_oldold_utsname = 45; >> + aarch64_linux_record_tdep.size_ustat = 32; >> + aarch64_linux_record_tdep.size_old_sigaction = 152; >> + aarch64_linux_record_tdep.size_old_sigset_t = 128; >> + aarch64_linux_record_tdep.size_rlimit = 16; >> + aarch64_linux_record_tdep.size_rusage = 144; >> + aarch64_linux_record_tdep.size_timeval = 16; >> + aarch64_linux_record_tdep.size_timezone = 8; >> + aarch64_linux_record_tdep.size_old_gid_t = 2; >> + aarch64_linux_record_tdep.size_old_uid_t = 2; >> + aarch64_linux_record_tdep.size_fd_set = 128; >> + aarch64_linux_record_tdep.size_dirent = 280; >> + aarch64_linux_record_tdep.size_dirent64 = 280; >> + aarch64_linux_record_tdep.size_statfs = 120; >> + aarch64_linux_record_tdep.size_statfs64 = 120; >> + aarch64_linux_record_tdep.size_sockaddr = 16; >> + aarch64_linux_record_tdep.size_int >> + = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT; >> + aarch64_linux_record_tdep.size_long >> + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; >> + aarch64_linux_record_tdep.size_ulong >> + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; >> + aarch64_linux_record_tdep.size_msghdr = 56; >> + aarch64_linux_record_tdep.size_itimerval = 32; >> + aarch64_linux_record_tdep.size_stat = 144; >> + aarch64_linux_record_tdep.size_old_utsname = 325; >> + aarch64_linux_record_tdep.size_sysinfo = 112; >> + aarch64_linux_record_tdep.size_msqid_ds = 120; >> + aarch64_linux_record_tdep.size_shmid_ds = 112; >> + aarch64_linux_record_tdep.size_new_utsname = 390; >> + aarch64_linux_record_tdep.size_timex = 208; >> + aarch64_linux_record_tdep.size_mem_dqinfo = 24; >> + aarch64_linux_record_tdep.size_if_dqblk = 72; >> + aarch64_linux_record_tdep.size_fs_quota_stat = 80; >> + aarch64_linux_record_tdep.size_timespec = 16; >> + aarch64_linux_record_tdep.size_pollfd = 8; >> + aarch64_linux_record_tdep.size_NFS_FHSIZE = 32; >> + aarch64_linux_record_tdep.size_knfsd_fh = 132; >> + aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16; >> + aarch64_linux_record_tdep.size_sigaction = 152; >> + aarch64_linux_record_tdep.size_sigset_t = 128; >> + aarch64_linux_record_tdep.size_siginfo_t = 128; >> + aarch64_linux_record_tdep.size_cap_user_data_t = 8; >> + aarch64_linux_record_tdep.size_stack_t = 24; >> + aarch64_linux_record_tdep.size_off_t = 8; >> + aarch64_linux_record_tdep.size_stat64 = 144; >> + aarch64_linux_record_tdep.size_gid_t = 4; >> + aarch64_linux_record_tdep.size_uid_t = 4; >> + aarch64_linux_record_tdep.size_PAGE_SIZE = 4096; >> + aarch64_linux_record_tdep.size_flock64 = 32; >> + aarch64_linux_record_tdep.size_user_desc = 16; >> + aarch64_linux_record_tdep.size_io_event = 32; >> + aarch64_linux_record_tdep.size_iocb = 64; >> + aarch64_linux_record_tdep.size_epoll_event = 12; >> + aarch64_linux_record_tdep.size_itimerspec = 32; >> + aarch64_linux_record_tdep.size_mq_attr = 64; >> + aarch64_linux_record_tdep.size_siginfo = 128; >> + aarch64_linux_record_tdep.size_termios = 60; >> + aarch64_linux_record_tdep.size_termios2 = 44; >> + aarch64_linux_record_tdep.size_pid_t = 4; >> + aarch64_linux_record_tdep.size_winsize = 8; >> + aarch64_linux_record_tdep.size_serial_struct = 72; >> + aarch64_linux_record_tdep.size_serial_icounter_struct = 80; >> + aarch64_linux_record_tdep.size_hayes_esp_config = 12; >> + aarch64_linux_record_tdep.size_size_t = 8; >> + aarch64_linux_record_tdep.size_iovec = 16; >> + >> + /* These values are the second argument of system call "sys_ioctl". >> + They are obtained from Linux Kernel source. */ >> + aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401; >> + aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402; >> + aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403; >> + aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404; >> + aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405; >> + aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406; >> + aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407; >> + aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408; >> + aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409; >> + aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a; >> + aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b; >> + aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c; >> + aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d; >> + aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e; >> + aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f; >> + aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410; >> + aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411; >> + aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412; >> + aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413; >> + aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414; >> + aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415; >> + aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416; >> + aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417; >> + aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418; >> + aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419; >> + aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a; >> + aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b; >> + aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b; >> + aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c; >> + aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d; >> + aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e; >> + aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f; >> + aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420; >> + aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421; >> + aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422; >> + aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423; >> + aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424; >> + aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425; >> + aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426; >> + aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427; >> + aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428; >> + aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429; >> + aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a; >> + aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b; >> + aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c; >> + aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d; >> + aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430; >> + aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431; >> + aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450; >> + aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451; >> + aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452; >> + aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453; >> + aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454; >> + aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455; >> + aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456; >> + aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457; >> + aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458; >> + aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459; >> + aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a; >> + aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b; >> + aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c; >> + aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d; >> + aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e; >> + aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f; >> + aarch64_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. */ >> + aarch64_linux_record_tdep.fcntl_F_GETLK = 5; >> + aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12; >> + aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13; >> + aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14; >> + >> + /* The AArch64 syscall calling convention: reg x0-x7 for arguments, >> + reg x8 for syscall number and return value in reg x0. */ >> + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0; >> + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1; >> + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2; >> + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; >> + aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4; >> + aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5; >> + aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6; >> + aarch64_linux_record_tdep.arg8 = AARCH64_X0_REGNUM + 7; >> } >> >> /* Provide a prototype to silence -Wmissing-prototypes. */ >> diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h >> index 2e1de60..1ae3786 100644 >> --- a/gdb/aarch64-linux-tdep.h >> +++ b/gdb/aarch64-linux-tdep.h >> @@ -32,3 +32,269 @@ >> >> extern const struct regset aarch64_linux_gregset; >> extern const struct regset aarch64_linux_fpregset; >> + >> +/* Enum that defines the AArch64 linux specific syscall identifiers used for >> + process record/replay. */ >> + >> +enum aarch64_syscall { >> + aarch64_sys_io_setup = 0, >> + aarch64_sys_io_destroy = 1, >> + aarch64_sys_io_submit = 2, >> + aarch64_sys_io_cancel = 3, >> + aarch64_sys_io_getevents = 4, >> + aarch64_sys_setxattr = 5, >> + aarch64_sys_lsetxattr = 6, >> + aarch64_sys_fsetxattr = 7, >> + aarch64_sys_getxattr = 8, >> + aarch64_sys_lgetxattr = 9, >> + aarch64_sys_fgetxattr = 10, >> + aarch64_sys_listxattr = 11, >> + aarch64_sys_llistxattr = 12, >> + aarch64_sys_flistxattr = 13, >> + aarch64_sys_removexattr = 14, >> + aarch64_sys_lremovexattr = 15, >> + aarch64_sys_fremovexattr = 16, >> + aarch64_sys_getcwd = 17, >> + aarch64_sys_lookup_dcookie = 18, >> + aarch64_sys_eventfd2 = 19, >> + aarch64_sys_epoll_create1 = 20, >> + aarch64_sys_epoll_ctl = 21, >> + aarch64_sys_epoll_pwait = 22, >> + aarch64_sys_dup = 23, >> + aarch64_sys_dup3 = 24, >> + aarch64_sys_fcntl = 25, >> + aarch64_sys_inotify_init1 = 26, >> + aarch64_sys_inotify_add_watch = 27, >> + aarch64_sys_inotify_rm_watch = 28, >> + aarch64_sys_ioctl = 29, >> + aarch64_sys_ioprio_set = 30, >> + aarch64_sys_ioprio_get = 31, >> + aarch64_sys_flock = 32, >> + aarch64_sys_mknod = 33, >> + aarch64_sys_mkdir = 34, >> + aarch64_sys_unlink = 35, >> + aarch64_sys_symlink = 36, >> + aarch64_sys_link = 37, >> + aarch64_sys_rename = 38, >> + aarch64_sys_umount2 = 39, >> + aarch64_sys_mount = 40, >> + aarch64_sys_pivot_root = 41, >> + aarch64_sys_nfsservctl = 42, >> + aarch64_sys_statfs = 43, >> + aarch64_sys_fstatfs = 44, >> + aarch64_sys_truncate = 45, >> + aarch64_sys_ftruncate = 46, >> + aarch64_sys_fallocate = 47, >> + aarch64_sys_faccess = 48, >> + aarch64_sys_chdir = 49, >> + aarch64_sys_fchdir = 50, >> + aarch64_sys_chroot = 51, >> + aarch64_sys_fchmod = 52, >> + aarch64_sys_fchmodat = 53, >> + aarch64_sys_fchownat = 54, >> + aarch64_sys_fchown = 55, >> + aarch64_sys_open = 56, >> + aarch64_sys_close = 57, >> + aarch64_sys_vhangup = 58, >> + aarch64_sys_pipe2 = 59, >> + aarch64_sys_quotactl = 60, >> + aarch64_sys_getdents64 = 61, >> + aarch64_sys_lseek = 62, >> + aarch64_sys_read = 63, >> + aarch64_sys_write = 64, >> + aarch64_sys_readv = 65, >> + aarch64_sys_writev = 66, >> + aarch64_sys_pread64 = 67, >> + aarch64_sys_pwrite64 = 68, >> + aarch64_sys_preadv = 69, >> + aarch64_sys_pwritev = 70, >> + aarch64_sys_sendfile = 71, >> + aarch64_sys_pselect6 = 72, >> + aarch64_sys_ppoll = 73, >> + aarch64_sys_signalfd4 = 74, >> + aarch64_sys_vmsplice = 75, >> + aarch64_sys_splice = 76, >> + aarch64_sys_tee = 77, >> + aarch64_sys_readlink = 78, >> + aarch64_sys_fstatat = 79, >> + aarch64_sys_fstat = 80, >> + aarch64_sys_sync = 81, >> + aarch64_sys_fsync = 82, >> + aarch64_sys_fdatasync = 83, >> + aarch64_sys_sync_file_range2 = 84, >> + aarch64_sys_sync_file_range = 84, >> + aarch64_sys_timerfd_create = 85, >> + aarch64_sys_timerfd_settime = 86, >> + aarch64_sys_timerfd_gettime = 87, >> + aarch64_sys_utimensat = 88, >> + aarch64_sys_acct = 89, >> + aarch64_sys_capget = 90, >> + aarch64_sys_capset = 91, >> + aarch64_sys_personality = 92, >> + aarch64_sys_exit = 93, >> + aarch64_sys_exit_group = 94, >> + aarch64_sys_waitid = 95, >> + aarch64_sys_set_tid_address = 96, >> + aarch64_sys_unshare = 97, >> + aarch64_sys_futex = 98, >> + aarch64_sys_set_robust_list = 99, >> + aarch64_sys_get_robust_list = 100, >> + aarch64_sys_nanosleep = 101, >> + aarch64_sys_getitimer = 102, >> + aarch64_sys_setitimer = 103, >> + aarch64_sys_kexec_load = 104, >> + aarch64_sys_init_module = 105, >> + aarch64_sys_delete_module = 106, >> + aarch64_sys_timer_create = 107, >> + aarch64_sys_timer_gettime = 108, >> + aarch64_sys_timer_getoverrun = 109, >> + aarch64_sys_timer_settime = 110, >> + aarch64_sys_timer_delete = 111, >> + aarch64_sys_clock_settime = 112, >> + aarch64_sys_clock_gettime = 113, >> + aarch64_sys_clock_getres = 114, >> + aarch64_sys_clock_nanosleep = 115, >> + aarch64_sys_syslog = 116, >> + aarch64_sys_ptrace = 117, >> + aarch64_sys_sched_setparam = 118, >> + aarch64_sys_sched_setscheduler = 119, >> + aarch64_sys_sched_getscheduler = 120, >> + aarch64_sys_sched_getparam = 121, >> + aarch64_sys_sched_setaffinity = 122, >> + aarch64_sys_sched_getaffinity = 123, >> + aarch64_sys_sched_yield = 124, >> + aarch64_sys_sched_get_priority_max = 125, >> + aarch64_sys_sched_get_priority_min = 126, >> + aarch64_sys_sched_rr_get_interval = 127, >> + aarch64_sys_kill = 129, >> + aarch64_sys_tkill = 130, >> + aarch64_sys_tgkill = 131, >> + aarch64_sys_sigaltstack = 132, >> + aarch64_sys_rt_sigsuspend = 133, >> + aarch64_sys_rt_sigaction = 134, >> + aarch64_sys_rt_sigprocmask = 135, >> + aarch64_sys_rt_sigpending = 136, >> + aarch64_sys_rt_sigtimedwait = 137, >> + aarch64_sys_rt_sigqueueinfo = 138, >> + aarch64_sys_rt_sigreturn = 139, >> + aarch64_sys_setpriority = 140, >> + aarch64_sys_getpriority = 141, >> + aarch64_sys_reboot = 142, >> + aarch64_sys_setregid = 143, >> + aarch64_sys_setgid = 144, >> + aarch64_sys_setreuid = 145, >> + aarch64_sys_setuid = 146, >> + aarch64_sys_setresuid = 147, >> + aarch64_sys_getresuid = 148, >> + aarch64_sys_setresgid = 149, >> + aarch64_sys_getresgid = 150, >> + aarch64_sys_setfsuid = 151, >> + aarch64_sys_setfsgid = 152, >> + aarch64_sys_times = 153, >> + aarch64_sys_setpgid = 154, >> + aarch64_sys_getpgid = 155, >> + aarch64_sys_getsid = 156, >> + aarch64_sys_setsid = 157, >> + aarch64_sys_getgroups = 158, >> + aarch64_sys_setgroups = 159, >> + aarch64_sys_uname = 160, >> + aarch64_sys_sethostname = 161, >> + aarch64_sys_setdomainname = 162, >> + aarch64_sys_getrlimit = 163, >> + aarch64_sys_setrlimit = 164, >> + aarch64_sys_getrusage = 165, >> + aarch64_sys_umask = 166, >> + aarch64_sys_prctl = 167, >> + aarch64_sys_getcpu = 168, >> + aarch64_sys_gettimeofday = 169, >> + aarch64_sys_settimeofday = 170, >> + aarch64_sys_adjtimex = 171, >> + aarch64_sys_getpid = 172, >> + aarch64_sys_getppid = 173, >> + aarch64_sys_getuid = 174, >> + aarch64_sys_geteuid = 175, >> + aarch64_sys_getgid = 176, >> + aarch64_sys_getegid = 177, >> + aarch64_sys_gettid = 178, >> + aarch64_sys_sysinfo = 179, >> + aarch64_sys_mq_open = 180, >> + aarch64_sys_mq_unlink = 181, >> + aarch64_sys_mq_timedsend = 182, >> + aarch64_sys_mq_timedreceive = 183, >> + aarch64_sys_mq_notify = 184, >> + aarch64_sys_mq_getsetattr = 185, >> + aarch64_sys_msgget = 186, >> + aarch64_sys_msgctl = 187, >> + aarch64_sys_msgrcv = 188, >> + aarch64_sys_msgsnd = 189, >> + aarch64_sys_semget = 190, >> + aarch64_sys_semctl = 191, >> + aarch64_sys_semtimedop = 192, >> + aarch64_sys_semop = 193, >> + aarch64_sys_shmget = 194, >> + aarch64_sys_shmctl = 195, >> + aarch64_sys_shmat = 196, >> + aarch64_sys_shmdt = 197, >> + aarch64_sys_socket = 198, >> + aarch64_sys_socketpair = 199, >> + aarch64_sys_bind = 200, >> + aarch64_sys_listen = 201, >> + aarch64_sys_accept = 202, >> + aarch64_sys_connect = 203, >> + aarch64_sys_getsockname = 204, >> + aarch64_sys_getpeername = 205, >> + aarch64_sys_sendto = 206, >> + aarch64_sys_recvfrom = 207, >> + aarch64_sys_setsockopt = 208, >> + aarch64_sys_getsockopt = 209, >> + aarch64_sys_shutdown = 210, >> + aarch64_sys_sendmsg = 211, >> + aarch64_sys_recvmsg = 212, >> + aarch64_sys_readahead = 213, >> + aarch64_sys_brk = 214, >> + aarch64_sys_munmap = 215, >> + aarch64_sys_mremap = 216, >> + aarch64_sys_add_key = 217, >> + aarch64_sys_request_key = 218, >> + aarch64_sys_keyctl = 219, >> + aarch64_sys_clone = 220, >> + aarch64_sys_execve = 221, >> + aarch64_sys_mmap = 222, >> + aarch64_sys_fadvise64 = 223, >> + aarch64_sys_swapon = 224, >> + aarch64_sys_swapoff = 225, >> + aarch64_sys_mprotect = 226, >> + aarch64_sys_msync = 227, >> + aarch64_sys_mlock = 228, >> + aarch64_sys_munlock = 229, >> + aarch64_sys_mlockall = 230, >> + aarch64_sys_munlockall = 231, >> + aarch64_sys_mincore = 232, >> + aarch64_sys_madvise = 233, >> + aarch64_sys_remap_file_pages = 234, >> + aarch64_sys_mbind = 235, >> + aarch64_sys_get_mempolicy = 236, >> + aarch64_sys_set_mempolicy = 237, >> + aarch64_sys_migrate_pages = 238, >> + aarch64_sys_move_pages = 239, >> + aarch64_sys_rt_tgsigqueueinfo = 240, >> + aarch64_sys_perf_event_open = 241, >> + aarch64_sys_accept4 = 242, >> + aarch64_sys_recvmmsg = 243, >> + aarch64_sys_wait4 = 260, >> + aarch64_sys_prlimit64 = 261, >> + aarch64_sys_fanotify_init = 262, >> + aarch64_sys_fanotify_mark = 263, >> + aarch64_sys_name_to_handle_at = 264, >> + aarch64_sys_open_by_handle_at = 265, >> + aarch64_sys_clock_adjtime = 266, >> + aarch64_sys_syncfs = 267, >> + aarch64_sys_setns = 268, >> + aarch64_sys_sendmmsg = 269, >> + aarch64_sys_process_vm_readv = 270, >> + aarch64_sys_process_vm_writev = 271, >> + aarch64_sys_kcmp = 272, >> + aarch64_sys_finit_module = 273, >> + aarch64_sys_sched_setattr = 274, >> + aarch64_sys_sched_getattr = 275, >> +}; >> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c >> index 0847585..c6da25a 100644 >> --- a/gdb/aarch64-tdep.c >> +++ b/gdb/aarch64-tdep.c >> @@ -2941,7 +2941,20 @@ aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r) >> { >> /* Exception generation instructions. */ >> if (insn_bits24_27 == 0x04) >> - return AARCH64_RECORD_UNSUPPORTED; >> + { >> + if (!bits (aarch64_insn_r->aarch64_insn, 2, 4) && >> + !bits (aarch64_insn_r->aarch64_insn, 21, 23) && >> + bits (aarch64_insn_r->aarch64_insn, 0, 1) == 0x01) >> + { >> + ULONGEST svc_number; >> + regcache_raw_read_unsigned (aarch64_insn_r->regcache, 8, >> + &svc_number); >> + return tdep->aarch64_syscall_record (aarch64_insn_r->regcache, >> + svc_number); >> + } >> + else >> + return AARCH64_RECORD_UNSUPPORTED; >> + } >> /* System instructions. */ >> else if (insn_bits24_27 == 0x05 && insn_bits22_23 == 0x00) >> { >> diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h >> index 1d74ef8..25751fe 100644 >> --- a/gdb/aarch64-tdep.h >> +++ b/gdb/aarch64-tdep.h >> @@ -88,6 +88,9 @@ struct gdbarch_tdep >> struct type *vns_type; >> struct type *vnh_type; >> struct type *vnb_type; >> + >> + /* syscall record. */ >> + int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number); >> }; >> >> /* AArch64 process record-replay related structures, defines etc. */ >> diff --git a/gdb/linux-record.h b/gdb/linux-record.h >> index 7b5218e..2649ce5 100644 >> --- a/gdb/linux-record.h >> +++ b/gdb/linux-record.h >> @@ -174,6 +174,8 @@ struct linux_record_tdep >> int arg4; >> int arg5; >> int arg6; >> + int arg7; >> + int arg8; >> }; >> >> /* Enum that defines the gdb-canonical set of Linux syscall identifiers. >> -- >> 1.9.1 >> > > > > -- > Will Newton > Toolchain Working Group, Linaro Ping! Kindly help me approve this patch.
On 19 September 2014 03:27, Omair Javaid <omair.javaid@linaro.org> wrote: > On 18 September 2014 05:22, Will Newton <will.newton@linaro.org> wrote: >> On 29 August 2014 04:53, Omair Javaid <omair.javaid@linaro.org> wrote: >>> Suggestion have been incorporated and updated patch is given below. >>> >>> gdb: >>> >>> 2014-08-28 Omair Javaid <omair.javaid@linaro.org> >>> >>> * aarch64-linux-tdep.c (record.h): Include. >>> (record-full.h): Include. >>> (struct linux_record_tdep aarch64_linux_record_tdep): Declare. >>> (aarch64_canonicalize_syscall): New function to translate syscall >>> numbers from aarch64 to canonical. >>> (aarch64_all_but_pc_registers_record): New function. >>> (aarch64_linux_syscall_record): New function. >>> (aarch64_linux_init_abi): Update to handle syscall recording. >>> * aarch64-linux-tdep.h (aarch64_syscall): New enum. >>> * aarch64-tdep.c (aarch64_record_branch_except_sys): Add code to >>> handle recording of syscalls. >>> * aarch64-tdep.h >>> (struct gdbarch_tdep) <aarch64_syscall_record>: Defined. >>> * linux-record.h (struct linux_record_tdep): Add two more syscall >>> argument fields. >>> >>> --- >>> gdb/aarch64-linux-tdep.c | 913 +++++++++++++++++++++++++++++++++++++++++++++++ >>> gdb/aarch64-linux-tdep.h | 266 ++++++++++++++ >>> gdb/aarch64-tdep.c | 15 +- >>> gdb/aarch64-tdep.h | 3 + >>> gdb/linux-record.h | 2 + >>> 5 files changed, 1198 insertions(+), 1 deletion(-) >> >> This one looks ok to me now. >> >>> diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c >>> index 5ab7b37..82b55b6 100644 >>> --- a/gdb/aarch64-linux-tdep.c >>> +++ b/gdb/aarch64-linux-tdep.c >>> @@ -41,6 +41,9 @@ >>> #include "user-regs.h" >>> #include <ctype.h> >>> >>> +#include "record-full.h" >>> +#include "linux-record.h" >>> + >>> /* Signal frame handling. >>> >>> +------------+ ^ >>> @@ -354,6 +357,752 @@ aarch64_stap_parse_special_token (struct gdbarch *gdbarch, >>> return 1; >>> } >>> >>> +/* AArch64 process record-replay constructs: syscall, signal etc. */ >>> + >>> +struct linux_record_tdep aarch64_linux_record_tdep; >>> + >>> +/* aarch64_canonicalize_syscall maps syscall ids from the native AArch64 >>> + linux set of syscall ids into a canonical set of syscall ids used by >>> + process record. */ >>> + >>> +static enum gdb_syscall >>> +aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number) >>> +{ >>> + switch (syscall_number) { >>> + case aarch64_sys_read: >>> + return gdb_sys_read; >>> + >>> + case aarch64_sys_write: >>> + return gdb_sys_write; >>> + >>> + case aarch64_sys_open: >>> + return gdb_sys_open; >>> + >>> + case aarch64_sys_close: >>> + return gdb_sys_close; >>> + >>> + case aarch64_sys_lseek: >>> + return gdb_sys_lseek; >>> + >>> + case aarch64_sys_mprotect: >>> + return gdb_sys_mprotect; >>> + >>> + case aarch64_sys_munmap: >>> + return gdb_sys_munmap; >>> + >>> + case aarch64_sys_brk: >>> + return gdb_sys_brk; >>> + >>> + case aarch64_sys_rt_sigaction: >>> + return gdb_sys_rt_sigaction; >>> + >>> + case aarch64_sys_rt_sigprocmask: >>> + return gdb_sys_rt_sigprocmask; >>> + >>> + case aarch64_sys_rt_sigreturn: >>> + return gdb_sys_rt_sigreturn; >>> + >>> + case aarch64_sys_ioctl: >>> + return gdb_sys_ioctl; >>> + >>> + case aarch64_sys_pread64: >>> + return gdb_sys_pread64; >>> + >>> + case aarch64_sys_pwrite64: >>> + return gdb_sys_pwrite64; >>> + >>> + case aarch64_sys_readv: >>> + return gdb_sys_readv; >>> + >>> + case aarch64_sys_writev: >>> + return gdb_sys_writev; >>> + >>> + case aarch64_sys_sched_yield: >>> + return gdb_sys_sched_yield; >>> + >>> + case aarch64_sys_mremap: >>> + return gdb_sys_mremap; >>> + >>> + case aarch64_sys_msync: >>> + return gdb_sys_msync; >>> + >>> + case aarch64_sys_mincore: >>> + return gdb_sys_mincore; >>> + >>> + case aarch64_sys_madvise: >>> + return gdb_sys_madvise; >>> + >>> + case aarch64_sys_shmget: >>> + return gdb_sys_shmget; >>> + >>> + case aarch64_sys_shmat: >>> + return gdb_sys_shmat; >>> + >>> + case aarch64_sys_shmctl: >>> + return gdb_sys_shmctl; >>> + >>> + case aarch64_sys_dup: >>> + return gdb_sys_dup; >>> + >>> + case aarch64_sys_nanosleep: >>> + return gdb_sys_nanosleep; >>> + >>> + case aarch64_sys_getitimer: >>> + return gdb_sys_getitimer; >>> + >>> + case aarch64_sys_setitimer: >>> + return gdb_sys_setitimer; >>> + >>> + case aarch64_sys_getpid: >>> + return gdb_sys_getpid; >>> + >>> + case aarch64_sys_sendfile: >>> + return gdb_sys_sendfile; >>> + >>> + case aarch64_sys_socket: >>> + return gdb_sys_socket; >>> + >>> + case aarch64_sys_connect: >>> + return gdb_sys_connect; >>> + >>> + case aarch64_sys_accept: >>> + return gdb_sys_accept; >>> + >>> + case aarch64_sys_sendto: >>> + return gdb_sys_sendto; >>> + >>> + case aarch64_sys_recvfrom: >>> + return gdb_sys_recvfrom; >>> + >>> + case aarch64_sys_sendmsg: >>> + return gdb_sys_sendmsg; >>> + >>> + case aarch64_sys_recvmsg: >>> + return gdb_sys_recvmsg; >>> + >>> + case aarch64_sys_shutdown: >>> + return gdb_sys_shutdown; >>> + >>> + case aarch64_sys_bind: >>> + return gdb_sys_bind; >>> + >>> + case aarch64_sys_listen: >>> + return gdb_sys_listen; >>> + >>> + case aarch64_sys_getsockname: >>> + return gdb_sys_getsockname; >>> + >>> + case aarch64_sys_getpeername: >>> + return gdb_sys_getpeername; >>> + >>> + case aarch64_sys_socketpair: >>> + return gdb_sys_socketpair; >>> + >>> + case aarch64_sys_setsockopt: >>> + return gdb_sys_setsockopt; >>> + >>> + case aarch64_sys_getsockopt: >>> + return gdb_sys_getsockopt; >>> + >>> + case aarch64_sys_clone: >>> + return gdb_sys_clone; >>> + >>> + case aarch64_sys_execve: >>> + return gdb_sys_execve; >>> + >>> + case aarch64_sys_exit: >>> + return gdb_sys_exit; >>> + >>> + case aarch64_sys_wait4: >>> + return gdb_sys_wait4; >>> + >>> + case aarch64_sys_kill: >>> + return gdb_sys_kill; >>> + >>> + case aarch64_sys_uname: >>> + return gdb_sys_uname; >>> + >>> + case aarch64_sys_semget: >>> + return gdb_sys_semget; >>> + >>> + case aarch64_sys_semop: >>> + return gdb_sys_semop; >>> + >>> + case aarch64_sys_semctl: >>> + return gdb_sys_semctl; >>> + >>> + case aarch64_sys_shmdt: >>> + return gdb_sys_shmdt; >>> + >>> + case aarch64_sys_msgget: >>> + return gdb_sys_msgget; >>> + >>> + case aarch64_sys_msgsnd: >>> + return gdb_sys_msgsnd; >>> + >>> + case aarch64_sys_msgrcv: >>> + return gdb_sys_msgrcv; >>> + >>> + case aarch64_sys_msgctl: >>> + return gdb_sys_msgctl; >>> + >>> + case aarch64_sys_fcntl: >>> + return gdb_sys_fcntl; >>> + >>> + case aarch64_sys_flock: >>> + return gdb_sys_flock; >>> + >>> + case aarch64_sys_fsync: >>> + return gdb_sys_fsync; >>> + >>> + case aarch64_sys_fdatasync: >>> + return gdb_sys_fdatasync; >>> + >>> + case aarch64_sys_truncate: >>> + return gdb_sys_truncate; >>> + >>> + case aarch64_sys_ftruncate: >>> + return gdb_sys_ftruncate; >>> + >>> + case aarch64_sys_getcwd: >>> + return gdb_sys_getcwd; >>> + >>> + case aarch64_sys_chdir: >>> + return gdb_sys_chdir; >>> + >>> + case aarch64_sys_fchdir: >>> + return gdb_sys_fchdir; >>> + >>> + case aarch64_sys_rename: >>> + return gdb_sys_rename; >>> + >>> + case aarch64_sys_mkdir: >>> + return gdb_sys_mkdir; >>> + >>> + case aarch64_sys_link: >>> + return gdb_sys_link; >>> + >>> + case aarch64_sys_unlink: >>> + return gdb_sys_unlink; >>> + >>> + case aarch64_sys_symlink: >>> + return gdb_sys_symlink; >>> + >>> + case aarch64_sys_readlink: >>> + return gdb_sys_readlink; >>> + >>> + case aarch64_sys_fchmodat: >>> + return gdb_sys_fchmodat; >>> + >>> + case aarch64_sys_fchmod: >>> + return gdb_sys_fchmod; >>> + >>> + case aarch64_sys_fchownat: >>> + return gdb_sys_fchownat; >>> + >>> + case aarch64_sys_fchown: >>> + return gdb_sys_fchown; >>> + >>> + case aarch64_sys_umask: >>> + return gdb_sys_umask; >>> + >>> + case aarch64_sys_gettimeofday: >>> + return gdb_sys_gettimeofday; >>> + >>> + case aarch64_sys_getrlimit: >>> + return gdb_sys_getrlimit; >>> + >>> + case aarch64_sys_getrusage: >>> + return gdb_sys_getrusage; >>> + >>> + case aarch64_sys_sysinfo: >>> + return gdb_sys_sysinfo; >>> + >>> + case aarch64_sys_ptrace: >>> + return gdb_sys_ptrace; >>> + >>> + case aarch64_sys_getuid: >>> + return gdb_sys_getuid; >>> + >>> + case aarch64_sys_syslog: >>> + return gdb_sys_syslog; >>> + >>> + case aarch64_sys_getgid: >>> + return gdb_sys_getgid; >>> + >>> + case aarch64_sys_setuid: >>> + return gdb_sys_setuid; >>> + >>> + case aarch64_sys_setgid: >>> + return gdb_sys_setgid; >>> + >>> + case aarch64_sys_geteuid: >>> + return gdb_sys_geteuid; >>> + >>> + case aarch64_sys_getegid: >>> + return gdb_sys_getegid; >>> + >>> + case aarch64_sys_setpgid: >>> + return gdb_sys_setpgid; >>> + >>> + case aarch64_sys_getppid: >>> + return gdb_sys_getppid; >>> + >>> + case aarch64_sys_setsid: >>> + return gdb_sys_setsid; >>> + >>> + case aarch64_sys_setreuid: >>> + return gdb_sys_setreuid; >>> + >>> + case aarch64_sys_setregid: >>> + return gdb_sys_setregid; >>> + >>> + case aarch64_sys_getgroups: >>> + return gdb_sys_getgroups; >>> + >>> + case aarch64_sys_setgroups: >>> + return gdb_sys_setgroups; >>> + >>> + case aarch64_sys_setresuid: >>> + return gdb_sys_setresuid; >>> + >>> + case aarch64_sys_getresuid: >>> + return gdb_sys_getresuid; >>> + >>> + case aarch64_sys_setresgid: >>> + return gdb_sys_setresgid; >>> + >>> + case aarch64_sys_getresgid: >>> + return gdb_sys_getresgid; >>> + >>> + case aarch64_sys_getpgid: >>> + return gdb_sys_getpgid; >>> + >>> + case aarch64_sys_setfsuid: >>> + return gdb_sys_setfsuid; >>> + >>> + case aarch64_sys_setfsgid: >>> + return gdb_sys_setfsgid; >>> + >>> + case aarch64_sys_getsid: >>> + return gdb_sys_getsid; >>> + >>> + case aarch64_sys_capget: >>> + return gdb_sys_capget; >>> + >>> + case aarch64_sys_capset: >>> + return gdb_sys_capset; >>> + >>> + case aarch64_sys_rt_sigpending: >>> + return gdb_sys_rt_sigpending; >>> + >>> + case aarch64_sys_rt_sigtimedwait: >>> + return gdb_sys_rt_sigtimedwait; >>> + >>> + case aarch64_sys_rt_sigqueueinfo: >>> + return gdb_sys_rt_sigqueueinfo; >>> + >>> + case aarch64_sys_rt_sigsuspend: >>> + return gdb_sys_rt_sigsuspend; >>> + >>> + case aarch64_sys_sigaltstack: >>> + return gdb_sys_sigaltstack; >>> + >>> + case aarch64_sys_mknod: >>> + return gdb_sys_mknod; >>> + >>> + case aarch64_sys_personality: >>> + return gdb_sys_personality; >>> + >>> + case aarch64_sys_statfs: >>> + return gdb_sys_statfs; >>> + >>> + case aarch64_sys_fstat: >>> + return gdb_sys_fstat; >>> + >>> + case aarch64_sys_fstatfs: >>> + return gdb_sys_fstatfs; >>> + >>> + case aarch64_sys_getpriority: >>> + return gdb_sys_getpriority; >>> + >>> + case aarch64_sys_setpriority: >>> + return gdb_sys_setpriority; >>> + >>> + case aarch64_sys_sched_setparam: >>> + return gdb_sys_sched_setparam; >>> + >>> + case aarch64_sys_sched_getparam: >>> + return gdb_sys_sched_getparam; >>> + >>> + case aarch64_sys_sched_setscheduler: >>> + return gdb_sys_sched_setscheduler; >>> + >>> + case aarch64_sys_sched_getscheduler: >>> + return gdb_sys_sched_getscheduler; >>> + >>> + case aarch64_sys_sched_get_priority_max: >>> + return gdb_sys_sched_get_priority_max; >>> + >>> + case aarch64_sys_sched_get_priority_min: >>> + return gdb_sys_sched_get_priority_min; >>> + >>> + case aarch64_sys_sched_rr_get_interval: >>> + return gdb_sys_sched_rr_get_interval; >>> + >>> + case aarch64_sys_mlock: >>> + return gdb_sys_mlock; >>> + >>> + case aarch64_sys_munlock: >>> + return gdb_sys_munlock; >>> + >>> + case aarch64_sys_mlockall: >>> + return gdb_sys_mlockall; >>> + >>> + case aarch64_sys_munlockall: >>> + return gdb_sys_munlockall; >>> + >>> + case aarch64_sys_vhangup: >>> + return gdb_sys_vhangup; >>> + >>> + case aarch64_sys_prctl: >>> + return gdb_sys_prctl; >>> + >>> + case aarch64_sys_adjtimex: >>> + return gdb_sys_adjtimex; >>> + >>> + case aarch64_sys_setrlimit: >>> + return gdb_sys_setrlimit; >>> + >>> + case aarch64_sys_chroot: >>> + return gdb_sys_chroot; >>> + >>> + case aarch64_sys_sync: >>> + return gdb_sys_sync; >>> + >>> + case aarch64_sys_acct: >>> + return gdb_sys_acct; >>> + >>> + case aarch64_sys_settimeofday: >>> + return gdb_sys_settimeofday; >>> + >>> + case aarch64_sys_mount: >>> + return gdb_sys_mount; >>> + >>> + case aarch64_sys_swapon: >>> + return gdb_sys_swapon; >>> + >>> + case aarch64_sys_swapoff: >>> + return gdb_sys_swapoff; >>> + >>> + case aarch64_sys_reboot: >>> + return gdb_sys_reboot; >>> + >>> + case aarch64_sys_sethostname: >>> + return gdb_sys_sethostname; >>> + >>> + case aarch64_sys_setdomainname: >>> + return gdb_sys_setdomainname; >>> + >>> + case aarch64_sys_init_module: >>> + return gdb_sys_init_module; >>> + >>> + case aarch64_sys_delete_module: >>> + return gdb_sys_delete_module; >>> + >>> + case aarch64_sys_quotactl: >>> + return gdb_sys_quotactl; >>> + >>> + case aarch64_sys_nfsservctl: >>> + return gdb_sys_nfsservctl; >>> + >>> + case aarch64_sys_gettid: >>> + return gdb_sys_gettid; >>> + >>> + case aarch64_sys_readahead: >>> + return gdb_sys_readahead; >>> + >>> + case aarch64_sys_setxattr: >>> + return gdb_sys_setxattr; >>> + >>> + case aarch64_sys_lsetxattr: >>> + return gdb_sys_lsetxattr; >>> + >>> + case aarch64_sys_fsetxattr: >>> + return gdb_sys_fsetxattr; >>> + >>> + case aarch64_sys_getxattr: >>> + return gdb_sys_getxattr; >>> + >>> + case aarch64_sys_lgetxattr: >>> + return gdb_sys_lgetxattr; >>> + >>> + case aarch64_sys_fgetxattr: >>> + return gdb_sys_fgetxattr; >>> + >>> + case aarch64_sys_listxattr: >>> + return gdb_sys_listxattr; >>> + >>> + case aarch64_sys_llistxattr: >>> + return gdb_sys_llistxattr; >>> + >>> + case aarch64_sys_flistxattr: >>> + return gdb_sys_flistxattr; >>> + >>> + case aarch64_sys_removexattr: >>> + return gdb_sys_removexattr; >>> + >>> + case aarch64_sys_lremovexattr: >>> + return gdb_sys_lremovexattr; >>> + >>> + case aarch64_sys_fremovexattr: >>> + return gdb_sys_fremovexattr; >>> + >>> + case aarch64_sys_tkill: >>> + return gdb_sys_tkill; >>> + >>> + case aarch64_sys_times: >>> + return gdb_sys_times; >>> + >>> + case aarch64_sys_futex: >>> + return gdb_sys_futex; >>> + >>> + case aarch64_sys_sched_setaffinity: >>> + return gdb_sys_sched_setaffinity; >>> + >>> + case aarch64_sys_sched_getaffinity: >>> + return gdb_sys_sched_getaffinity; >>> + >>> + case aarch64_sys_io_setup: >>> + return gdb_sys_io_setup; >>> + >>> + case aarch64_sys_io_destroy: >>> + return gdb_sys_io_destroy; >>> + >>> + case aarch64_sys_io_getevents: >>> + return gdb_sys_io_getevents; >>> + >>> + case aarch64_sys_io_submit: >>> + return gdb_sys_io_submit; >>> + >>> + case aarch64_sys_io_cancel: >>> + return gdb_sys_io_cancel; >>> + >>> + case aarch64_sys_lookup_dcookie: >>> + return gdb_sys_lookup_dcookie; >>> + >>> + case aarch64_sys_epoll_create1: >>> + return gdb_sys_epoll_create; >>> + >>> + case aarch64_sys_remap_file_pages: >>> + return gdb_sys_remap_file_pages; >>> + >>> + case aarch64_sys_getdents64: >>> + return gdb_sys_getdents64; >>> + >>> + case aarch64_sys_set_tid_address: >>> + return gdb_sys_set_tid_address; >>> + >>> + case aarch64_sys_semtimedop: >>> + return gdb_sys_semtimedop; >>> + >>> + case aarch64_sys_fadvise64: >>> + return gdb_sys_fadvise64; >>> + >>> + case aarch64_sys_timer_create: >>> + return gdb_sys_timer_create; >>> + >>> + case aarch64_sys_timer_settime: >>> + return gdb_sys_timer_settime; >>> + >>> + case aarch64_sys_timer_gettime: >>> + return gdb_sys_timer_gettime; >>> + >>> + case aarch64_sys_timer_getoverrun: >>> + return gdb_sys_timer_getoverrun; >>> + >>> + case aarch64_sys_timer_delete: >>> + return gdb_sys_timer_delete; >>> + >>> + case aarch64_sys_clock_settime: >>> + return gdb_sys_clock_settime; >>> + >>> + case aarch64_sys_clock_gettime: >>> + return gdb_sys_clock_gettime; >>> + >>> + case aarch64_sys_clock_getres: >>> + return gdb_sys_clock_getres; >>> + >>> + case aarch64_sys_clock_nanosleep: >>> + return gdb_sys_clock_nanosleep; >>> + >>> + case aarch64_sys_exit_group: >>> + return gdb_sys_exit_group; >>> + >>> + case aarch64_sys_epoll_pwait: >>> + return gdb_sys_epoll_pwait; >>> + >>> + case aarch64_sys_epoll_ctl: >>> + return gdb_sys_epoll_ctl; >>> + >>> + case aarch64_sys_tgkill: >>> + return gdb_sys_tgkill; >>> + >>> + case aarch64_sys_mbind: >>> + return gdb_sys_mbind; >>> + >>> + case aarch64_sys_set_mempolicy: >>> + return gdb_sys_set_mempolicy; >>> + >>> + case aarch64_sys_get_mempolicy: >>> + return gdb_sys_get_mempolicy; >>> + >>> + case aarch64_sys_mq_open: >>> + return gdb_sys_mq_open; >>> + >>> + case aarch64_sys_mq_unlink: >>> + return gdb_sys_mq_unlink; >>> + >>> + case aarch64_sys_mq_timedsend: >>> + return gdb_sys_mq_timedsend; >>> + >>> + case aarch64_sys_mq_timedreceive: >>> + return gdb_sys_mq_timedreceive; >>> + >>> + case aarch64_sys_mq_notify: >>> + return gdb_sys_mq_notify; >>> + >>> + case aarch64_sys_mq_getsetattr: >>> + return gdb_sys_mq_getsetattr; >>> + >>> + case aarch64_sys_kexec_load: >>> + return gdb_sys_kexec_load; >>> + >>> + case aarch64_sys_waitid: >>> + return gdb_sys_waitid; >>> + >>> + case aarch64_sys_add_key: >>> + return gdb_sys_add_key; >>> + >>> + case aarch64_sys_request_key: >>> + return gdb_sys_request_key; >>> + >>> + case aarch64_sys_keyctl: >>> + return gdb_sys_keyctl; >>> + >>> + case aarch64_sys_ioprio_set: >>> + return gdb_sys_ioprio_set; >>> + >>> + case aarch64_sys_ioprio_get: >>> + return gdb_sys_ioprio_get; >>> + >>> + case aarch64_sys_inotify_add_watch: >>> + return gdb_sys_inotify_add_watch; >>> + >>> + case aarch64_sys_inotify_rm_watch: >>> + return gdb_sys_inotify_rm_watch; >>> + >>> + case aarch64_sys_migrate_pages: >>> + return gdb_sys_migrate_pages; >>> + >>> + case aarch64_sys_pselect6: >>> + return gdb_sys_pselect6; >>> + >>> + case aarch64_sys_ppoll: >>> + return gdb_sys_ppoll; >>> + >>> + case aarch64_sys_unshare: >>> + return gdb_sys_unshare; >>> + >>> + case aarch64_sys_set_robust_list: >>> + return gdb_sys_set_robust_list; >>> + >>> + case aarch64_sys_get_robust_list: >>> + return gdb_sys_get_robust_list; >>> + >>> + case aarch64_sys_splice: >>> + return gdb_sys_splice; >>> + >>> + case aarch64_sys_tee: >>> + return gdb_sys_tee; >>> + >>> + case aarch64_sys_sync_file_range: >>> + return gdb_sys_sync_file_range; >>> + >>> + case aarch64_sys_vmsplice: >>> + return gdb_sys_vmsplice; >>> + >>> + case aarch64_sys_move_pages: >>> + return gdb_sys_move_pages; >>> + >>> + default: >>> + return -1; >>> + } >>> +} >>> + >>> +/* Record all registers but PC register for process-record. */ >>> + >>> +static int >>> +aarch64_all_but_pc_registers_record (struct regcache *regcache) >>> +{ >>> + int i; >>> + >>> + for (i = 0; i < AARCH64_PC_REGNUM; i++) >>> + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM + i)) >>> + return -1; >>> + >>> + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) >>> + return -1; >>> + >>> + return 0; >>> +} >>> + >>> +/* Handler for arm system call instruction recording. */ >>> + >>> +static int >>> +aarch64_linux_syscall_record (struct regcache *regcache, unsigned long svc_number) >>> +{ >>> + int ret = 0; >>> + enum gdb_syscall syscall_gdb; >>> + >>> + printf_unfiltered (_("syscall number %s\n"), >>> + plongest (svc_number)); >>> + syscall_gdb = aarch64_canonicalize_syscall (svc_number); >>> + >>> + if (syscall_gdb < 0) >>> + { >>> + printf_unfiltered (_("Process record and replay target doesn't " >>> + "support syscall number %s\n"), >>> + plongest (svc_number)); >>> + return -1; >>> + } >>> + >>> + if (syscall_gdb == gdb_sys_sigreturn >>> + || syscall_gdb == gdb_sys_rt_sigreturn) >>> + { >>> + if (aarch64_all_but_pc_registers_record (regcache)) >>> + return -1; >>> + return 0; >>> + } >>> + >>> + ret = record_linux_system_call (syscall_gdb, regcache, >>> + &aarch64_linux_record_tdep); >>> + if (ret != 0) >>> + return ret; >>> + >>> + /* Record the return value of the system call. */ >>> + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM)) >>> + return -1; >>> + /* Record LR. */ >>> + if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM)) >>> + return -1; >>> + /* Record CPSR. */ >>> + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) >>> + return -1; >>> + >>> + return 0; >>> +} >>> + >>> static void >>> aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >>> { >>> @@ -404,6 +1153,170 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >>> >>> /* Reversible debugging, process record. */ >>> set_gdbarch_process_record (gdbarch, aarch64_process_record); >>> + /* Syscall record. */ >>> + tdep->aarch64_syscall_record = aarch64_linux_syscall_record; >>> + >>> + /* Initialize the aarch64_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. */ >>> + aarch64_linux_record_tdep.size_pointer >>> + = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; >>> + aarch64_linux_record_tdep.size__old_kernel_stat = 32; >>> + aarch64_linux_record_tdep.size_tms = 32; >>> + aarch64_linux_record_tdep.size_loff_t = 8; >>> + aarch64_linux_record_tdep.size_flock = 32; >>> + aarch64_linux_record_tdep.size_oldold_utsname = 45; >>> + aarch64_linux_record_tdep.size_ustat = 32; >>> + aarch64_linux_record_tdep.size_old_sigaction = 152; >>> + aarch64_linux_record_tdep.size_old_sigset_t = 128; >>> + aarch64_linux_record_tdep.size_rlimit = 16; >>> + aarch64_linux_record_tdep.size_rusage = 144; >>> + aarch64_linux_record_tdep.size_timeval = 16; >>> + aarch64_linux_record_tdep.size_timezone = 8; >>> + aarch64_linux_record_tdep.size_old_gid_t = 2; >>> + aarch64_linux_record_tdep.size_old_uid_t = 2; >>> + aarch64_linux_record_tdep.size_fd_set = 128; >>> + aarch64_linux_record_tdep.size_dirent = 280; >>> + aarch64_linux_record_tdep.size_dirent64 = 280; >>> + aarch64_linux_record_tdep.size_statfs = 120; >>> + aarch64_linux_record_tdep.size_statfs64 = 120; >>> + aarch64_linux_record_tdep.size_sockaddr = 16; >>> + aarch64_linux_record_tdep.size_int >>> + = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT; >>> + aarch64_linux_record_tdep.size_long >>> + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; >>> + aarch64_linux_record_tdep.size_ulong >>> + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; >>> + aarch64_linux_record_tdep.size_msghdr = 56; >>> + aarch64_linux_record_tdep.size_itimerval = 32; >>> + aarch64_linux_record_tdep.size_stat = 144; >>> + aarch64_linux_record_tdep.size_old_utsname = 325; >>> + aarch64_linux_record_tdep.size_sysinfo = 112; >>> + aarch64_linux_record_tdep.size_msqid_ds = 120; >>> + aarch64_linux_record_tdep.size_shmid_ds = 112; >>> + aarch64_linux_record_tdep.size_new_utsname = 390; >>> + aarch64_linux_record_tdep.size_timex = 208; >>> + aarch64_linux_record_tdep.size_mem_dqinfo = 24; >>> + aarch64_linux_record_tdep.size_if_dqblk = 72; >>> + aarch64_linux_record_tdep.size_fs_quota_stat = 80; >>> + aarch64_linux_record_tdep.size_timespec = 16; >>> + aarch64_linux_record_tdep.size_pollfd = 8; >>> + aarch64_linux_record_tdep.size_NFS_FHSIZE = 32; >>> + aarch64_linux_record_tdep.size_knfsd_fh = 132; >>> + aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16; >>> + aarch64_linux_record_tdep.size_sigaction = 152; >>> + aarch64_linux_record_tdep.size_sigset_t = 128; >>> + aarch64_linux_record_tdep.size_siginfo_t = 128; >>> + aarch64_linux_record_tdep.size_cap_user_data_t = 8; >>> + aarch64_linux_record_tdep.size_stack_t = 24; >>> + aarch64_linux_record_tdep.size_off_t = 8; >>> + aarch64_linux_record_tdep.size_stat64 = 144; >>> + aarch64_linux_record_tdep.size_gid_t = 4; >>> + aarch64_linux_record_tdep.size_uid_t = 4; >>> + aarch64_linux_record_tdep.size_PAGE_SIZE = 4096; >>> + aarch64_linux_record_tdep.size_flock64 = 32; >>> + aarch64_linux_record_tdep.size_user_desc = 16; >>> + aarch64_linux_record_tdep.size_io_event = 32; >>> + aarch64_linux_record_tdep.size_iocb = 64; >>> + aarch64_linux_record_tdep.size_epoll_event = 12; >>> + aarch64_linux_record_tdep.size_itimerspec = 32; >>> + aarch64_linux_record_tdep.size_mq_attr = 64; >>> + aarch64_linux_record_tdep.size_siginfo = 128; >>> + aarch64_linux_record_tdep.size_termios = 60; >>> + aarch64_linux_record_tdep.size_termios2 = 44; >>> + aarch64_linux_record_tdep.size_pid_t = 4; >>> + aarch64_linux_record_tdep.size_winsize = 8; >>> + aarch64_linux_record_tdep.size_serial_struct = 72; >>> + aarch64_linux_record_tdep.size_serial_icounter_struct = 80; >>> + aarch64_linux_record_tdep.size_hayes_esp_config = 12; >>> + aarch64_linux_record_tdep.size_size_t = 8; >>> + aarch64_linux_record_tdep.size_iovec = 16; >>> + >>> + /* These values are the second argument of system call "sys_ioctl". >>> + They are obtained from Linux Kernel source. */ >>> + aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401; >>> + aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402; >>> + aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403; >>> + aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404; >>> + aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405; >>> + aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406; >>> + aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407; >>> + aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408; >>> + aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409; >>> + aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a; >>> + aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b; >>> + aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c; >>> + aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d; >>> + aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e; >>> + aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f; >>> + aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410; >>> + aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411; >>> + aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412; >>> + aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413; >>> + aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414; >>> + aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415; >>> + aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416; >>> + aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417; >>> + aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418; >>> + aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419; >>> + aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a; >>> + aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b; >>> + aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b; >>> + aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c; >>> + aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d; >>> + aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e; >>> + aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f; >>> + aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420; >>> + aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421; >>> + aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422; >>> + aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423; >>> + aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424; >>> + aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425; >>> + aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426; >>> + aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427; >>> + aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428; >>> + aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429; >>> + aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a; >>> + aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b; >>> + aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c; >>> + aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d; >>> + aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430; >>> + aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431; >>> + aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450; >>> + aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451; >>> + aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452; >>> + aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453; >>> + aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454; >>> + aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455; >>> + aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456; >>> + aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457; >>> + aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458; >>> + aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459; >>> + aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a; >>> + aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b; >>> + aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c; >>> + aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d; >>> + aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e; >>> + aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f; >>> + aarch64_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. */ >>> + aarch64_linux_record_tdep.fcntl_F_GETLK = 5; >>> + aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12; >>> + aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13; >>> + aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14; >>> + >>> + /* The AArch64 syscall calling convention: reg x0-x7 for arguments, >>> + reg x8 for syscall number and return value in reg x0. */ >>> + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0; >>> + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1; >>> + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2; >>> + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; >>> + aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4; >>> + aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5; >>> + aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6; >>> + aarch64_linux_record_tdep.arg8 = AARCH64_X0_REGNUM + 7; >>> } >>> >>> /* Provide a prototype to silence -Wmissing-prototypes. */ >>> diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h >>> index 2e1de60..1ae3786 100644 >>> --- a/gdb/aarch64-linux-tdep.h >>> +++ b/gdb/aarch64-linux-tdep.h >>> @@ -32,3 +32,269 @@ >>> >>> extern const struct regset aarch64_linux_gregset; >>> extern const struct regset aarch64_linux_fpregset; >>> + >>> +/* Enum that defines the AArch64 linux specific syscall identifiers used for >>> + process record/replay. */ >>> + >>> +enum aarch64_syscall { >>> + aarch64_sys_io_setup = 0, >>> + aarch64_sys_io_destroy = 1, >>> + aarch64_sys_io_submit = 2, >>> + aarch64_sys_io_cancel = 3, >>> + aarch64_sys_io_getevents = 4, >>> + aarch64_sys_setxattr = 5, >>> + aarch64_sys_lsetxattr = 6, >>> + aarch64_sys_fsetxattr = 7, >>> + aarch64_sys_getxattr = 8, >>> + aarch64_sys_lgetxattr = 9, >>> + aarch64_sys_fgetxattr = 10, >>> + aarch64_sys_listxattr = 11, >>> + aarch64_sys_llistxattr = 12, >>> + aarch64_sys_flistxattr = 13, >>> + aarch64_sys_removexattr = 14, >>> + aarch64_sys_lremovexattr = 15, >>> + aarch64_sys_fremovexattr = 16, >>> + aarch64_sys_getcwd = 17, >>> + aarch64_sys_lookup_dcookie = 18, >>> + aarch64_sys_eventfd2 = 19, >>> + aarch64_sys_epoll_create1 = 20, >>> + aarch64_sys_epoll_ctl = 21, >>> + aarch64_sys_epoll_pwait = 22, >>> + aarch64_sys_dup = 23, >>> + aarch64_sys_dup3 = 24, >>> + aarch64_sys_fcntl = 25, >>> + aarch64_sys_inotify_init1 = 26, >>> + aarch64_sys_inotify_add_watch = 27, >>> + aarch64_sys_inotify_rm_watch = 28, >>> + aarch64_sys_ioctl = 29, >>> + aarch64_sys_ioprio_set = 30, >>> + aarch64_sys_ioprio_get = 31, >>> + aarch64_sys_flock = 32, >>> + aarch64_sys_mknod = 33, >>> + aarch64_sys_mkdir = 34, >>> + aarch64_sys_unlink = 35, >>> + aarch64_sys_symlink = 36, >>> + aarch64_sys_link = 37, >>> + aarch64_sys_rename = 38, >>> + aarch64_sys_umount2 = 39, >>> + aarch64_sys_mount = 40, >>> + aarch64_sys_pivot_root = 41, >>> + aarch64_sys_nfsservctl = 42, >>> + aarch64_sys_statfs = 43, >>> + aarch64_sys_fstatfs = 44, >>> + aarch64_sys_truncate = 45, >>> + aarch64_sys_ftruncate = 46, >>> + aarch64_sys_fallocate = 47, >>> + aarch64_sys_faccess = 48, >>> + aarch64_sys_chdir = 49, >>> + aarch64_sys_fchdir = 50, >>> + aarch64_sys_chroot = 51, >>> + aarch64_sys_fchmod = 52, >>> + aarch64_sys_fchmodat = 53, >>> + aarch64_sys_fchownat = 54, >>> + aarch64_sys_fchown = 55, >>> + aarch64_sys_open = 56, >>> + aarch64_sys_close = 57, >>> + aarch64_sys_vhangup = 58, >>> + aarch64_sys_pipe2 = 59, >>> + aarch64_sys_quotactl = 60, >>> + aarch64_sys_getdents64 = 61, >>> + aarch64_sys_lseek = 62, >>> + aarch64_sys_read = 63, >>> + aarch64_sys_write = 64, >>> + aarch64_sys_readv = 65, >>> + aarch64_sys_writev = 66, >>> + aarch64_sys_pread64 = 67, >>> + aarch64_sys_pwrite64 = 68, >>> + aarch64_sys_preadv = 69, >>> + aarch64_sys_pwritev = 70, >>> + aarch64_sys_sendfile = 71, >>> + aarch64_sys_pselect6 = 72, >>> + aarch64_sys_ppoll = 73, >>> + aarch64_sys_signalfd4 = 74, >>> + aarch64_sys_vmsplice = 75, >>> + aarch64_sys_splice = 76, >>> + aarch64_sys_tee = 77, >>> + aarch64_sys_readlink = 78, >>> + aarch64_sys_fstatat = 79, >>> + aarch64_sys_fstat = 80, >>> + aarch64_sys_sync = 81, >>> + aarch64_sys_fsync = 82, >>> + aarch64_sys_fdatasync = 83, >>> + aarch64_sys_sync_file_range2 = 84, >>> + aarch64_sys_sync_file_range = 84, >>> + aarch64_sys_timerfd_create = 85, >>> + aarch64_sys_timerfd_settime = 86, >>> + aarch64_sys_timerfd_gettime = 87, >>> + aarch64_sys_utimensat = 88, >>> + aarch64_sys_acct = 89, >>> + aarch64_sys_capget = 90, >>> + aarch64_sys_capset = 91, >>> + aarch64_sys_personality = 92, >>> + aarch64_sys_exit = 93, >>> + aarch64_sys_exit_group = 94, >>> + aarch64_sys_waitid = 95, >>> + aarch64_sys_set_tid_address = 96, >>> + aarch64_sys_unshare = 97, >>> + aarch64_sys_futex = 98, >>> + aarch64_sys_set_robust_list = 99, >>> + aarch64_sys_get_robust_list = 100, >>> + aarch64_sys_nanosleep = 101, >>> + aarch64_sys_getitimer = 102, >>> + aarch64_sys_setitimer = 103, >>> + aarch64_sys_kexec_load = 104, >>> + aarch64_sys_init_module = 105, >>> + aarch64_sys_delete_module = 106, >>> + aarch64_sys_timer_create = 107, >>> + aarch64_sys_timer_gettime = 108, >>> + aarch64_sys_timer_getoverrun = 109, >>> + aarch64_sys_timer_settime = 110, >>> + aarch64_sys_timer_delete = 111, >>> + aarch64_sys_clock_settime = 112, >>> + aarch64_sys_clock_gettime = 113, >>> + aarch64_sys_clock_getres = 114, >>> + aarch64_sys_clock_nanosleep = 115, >>> + aarch64_sys_syslog = 116, >>> + aarch64_sys_ptrace = 117, >>> + aarch64_sys_sched_setparam = 118, >>> + aarch64_sys_sched_setscheduler = 119, >>> + aarch64_sys_sched_getscheduler = 120, >>> + aarch64_sys_sched_getparam = 121, >>> + aarch64_sys_sched_setaffinity = 122, >>> + aarch64_sys_sched_getaffinity = 123, >>> + aarch64_sys_sched_yield = 124, >>> + aarch64_sys_sched_get_priority_max = 125, >>> + aarch64_sys_sched_get_priority_min = 126, >>> + aarch64_sys_sched_rr_get_interval = 127, >>> + aarch64_sys_kill = 129, >>> + aarch64_sys_tkill = 130, >>> + aarch64_sys_tgkill = 131, >>> + aarch64_sys_sigaltstack = 132, >>> + aarch64_sys_rt_sigsuspend = 133, >>> + aarch64_sys_rt_sigaction = 134, >>> + aarch64_sys_rt_sigprocmask = 135, >>> + aarch64_sys_rt_sigpending = 136, >>> + aarch64_sys_rt_sigtimedwait = 137, >>> + aarch64_sys_rt_sigqueueinfo = 138, >>> + aarch64_sys_rt_sigreturn = 139, >>> + aarch64_sys_setpriority = 140, >>> + aarch64_sys_getpriority = 141, >>> + aarch64_sys_reboot = 142, >>> + aarch64_sys_setregid = 143, >>> + aarch64_sys_setgid = 144, >>> + aarch64_sys_setreuid = 145, >>> + aarch64_sys_setuid = 146, >>> + aarch64_sys_setresuid = 147, >>> + aarch64_sys_getresuid = 148, >>> + aarch64_sys_setresgid = 149, >>> + aarch64_sys_getresgid = 150, >>> + aarch64_sys_setfsuid = 151, >>> + aarch64_sys_setfsgid = 152, >>> + aarch64_sys_times = 153, >>> + aarch64_sys_setpgid = 154, >>> + aarch64_sys_getpgid = 155, >>> + aarch64_sys_getsid = 156, >>> + aarch64_sys_setsid = 157, >>> + aarch64_sys_getgroups = 158, >>> + aarch64_sys_setgroups = 159, >>> + aarch64_sys_uname = 160, >>> + aarch64_sys_sethostname = 161, >>> + aarch64_sys_setdomainname = 162, >>> + aarch64_sys_getrlimit = 163, >>> + aarch64_sys_setrlimit = 164, >>> + aarch64_sys_getrusage = 165, >>> + aarch64_sys_umask = 166, >>> + aarch64_sys_prctl = 167, >>> + aarch64_sys_getcpu = 168, >>> + aarch64_sys_gettimeofday = 169, >>> + aarch64_sys_settimeofday = 170, >>> + aarch64_sys_adjtimex = 171, >>> + aarch64_sys_getpid = 172, >>> + aarch64_sys_getppid = 173, >>> + aarch64_sys_getuid = 174, >>> + aarch64_sys_geteuid = 175, >>> + aarch64_sys_getgid = 176, >>> + aarch64_sys_getegid = 177, >>> + aarch64_sys_gettid = 178, >>> + aarch64_sys_sysinfo = 179, >>> + aarch64_sys_mq_open = 180, >>> + aarch64_sys_mq_unlink = 181, >>> + aarch64_sys_mq_timedsend = 182, >>> + aarch64_sys_mq_timedreceive = 183, >>> + aarch64_sys_mq_notify = 184, >>> + aarch64_sys_mq_getsetattr = 185, >>> + aarch64_sys_msgget = 186, >>> + aarch64_sys_msgctl = 187, >>> + aarch64_sys_msgrcv = 188, >>> + aarch64_sys_msgsnd = 189, >>> + aarch64_sys_semget = 190, >>> + aarch64_sys_semctl = 191, >>> + aarch64_sys_semtimedop = 192, >>> + aarch64_sys_semop = 193, >>> + aarch64_sys_shmget = 194, >>> + aarch64_sys_shmctl = 195, >>> + aarch64_sys_shmat = 196, >>> + aarch64_sys_shmdt = 197, >>> + aarch64_sys_socket = 198, >>> + aarch64_sys_socketpair = 199, >>> + aarch64_sys_bind = 200, >>> + aarch64_sys_listen = 201, >>> + aarch64_sys_accept = 202, >>> + aarch64_sys_connect = 203, >>> + aarch64_sys_getsockname = 204, >>> + aarch64_sys_getpeername = 205, >>> + aarch64_sys_sendto = 206, >>> + aarch64_sys_recvfrom = 207, >>> + aarch64_sys_setsockopt = 208, >>> + aarch64_sys_getsockopt = 209, >>> + aarch64_sys_shutdown = 210, >>> + aarch64_sys_sendmsg = 211, >>> + aarch64_sys_recvmsg = 212, >>> + aarch64_sys_readahead = 213, >>> + aarch64_sys_brk = 214, >>> + aarch64_sys_munmap = 215, >>> + aarch64_sys_mremap = 216, >>> + aarch64_sys_add_key = 217, >>> + aarch64_sys_request_key = 218, >>> + aarch64_sys_keyctl = 219, >>> + aarch64_sys_clone = 220, >>> + aarch64_sys_execve = 221, >>> + aarch64_sys_mmap = 222, >>> + aarch64_sys_fadvise64 = 223, >>> + aarch64_sys_swapon = 224, >>> + aarch64_sys_swapoff = 225, >>> + aarch64_sys_mprotect = 226, >>> + aarch64_sys_msync = 227, >>> + aarch64_sys_mlock = 228, >>> + aarch64_sys_munlock = 229, >>> + aarch64_sys_mlockall = 230, >>> + aarch64_sys_munlockall = 231, >>> + aarch64_sys_mincore = 232, >>> + aarch64_sys_madvise = 233, >>> + aarch64_sys_remap_file_pages = 234, >>> + aarch64_sys_mbind = 235, >>> + aarch64_sys_get_mempolicy = 236, >>> + aarch64_sys_set_mempolicy = 237, >>> + aarch64_sys_migrate_pages = 238, >>> + aarch64_sys_move_pages = 239, >>> + aarch64_sys_rt_tgsigqueueinfo = 240, >>> + aarch64_sys_perf_event_open = 241, >>> + aarch64_sys_accept4 = 242, >>> + aarch64_sys_recvmmsg = 243, >>> + aarch64_sys_wait4 = 260, >>> + aarch64_sys_prlimit64 = 261, >>> + aarch64_sys_fanotify_init = 262, >>> + aarch64_sys_fanotify_mark = 263, >>> + aarch64_sys_name_to_handle_at = 264, >>> + aarch64_sys_open_by_handle_at = 265, >>> + aarch64_sys_clock_adjtime = 266, >>> + aarch64_sys_syncfs = 267, >>> + aarch64_sys_setns = 268, >>> + aarch64_sys_sendmmsg = 269, >>> + aarch64_sys_process_vm_readv = 270, >>> + aarch64_sys_process_vm_writev = 271, >>> + aarch64_sys_kcmp = 272, >>> + aarch64_sys_finit_module = 273, >>> + aarch64_sys_sched_setattr = 274, >>> + aarch64_sys_sched_getattr = 275, >>> +}; >>> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c >>> index 0847585..c6da25a 100644 >>> --- a/gdb/aarch64-tdep.c >>> +++ b/gdb/aarch64-tdep.c >>> @@ -2941,7 +2941,20 @@ aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r) >>> { >>> /* Exception generation instructions. */ >>> if (insn_bits24_27 == 0x04) >>> - return AARCH64_RECORD_UNSUPPORTED; >>> + { >>> + if (!bits (aarch64_insn_r->aarch64_insn, 2, 4) && >>> + !bits (aarch64_insn_r->aarch64_insn, 21, 23) && >>> + bits (aarch64_insn_r->aarch64_insn, 0, 1) == 0x01) >>> + { >>> + ULONGEST svc_number; >>> + regcache_raw_read_unsigned (aarch64_insn_r->regcache, 8, >>> + &svc_number); >>> + return tdep->aarch64_syscall_record (aarch64_insn_r->regcache, >>> + svc_number); >>> + } >>> + else >>> + return AARCH64_RECORD_UNSUPPORTED; >>> + } >>> /* System instructions. */ >>> else if (insn_bits24_27 == 0x05 && insn_bits22_23 == 0x00) >>> { >>> diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h >>> index 1d74ef8..25751fe 100644 >>> --- a/gdb/aarch64-tdep.h >>> +++ b/gdb/aarch64-tdep.h >>> @@ -88,6 +88,9 @@ struct gdbarch_tdep >>> struct type *vns_type; >>> struct type *vnh_type; >>> struct type *vnb_type; >>> + >>> + /* syscall record. */ >>> + int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number); >>> }; >>> >>> /* AArch64 process record-replay related structures, defines etc. */ >>> diff --git a/gdb/linux-record.h b/gdb/linux-record.h >>> index 7b5218e..2649ce5 100644 >>> --- a/gdb/linux-record.h >>> +++ b/gdb/linux-record.h >>> @@ -174,6 +174,8 @@ struct linux_record_tdep >>> int arg4; >>> int arg5; >>> int arg6; >>> + int arg7; >>> + int arg8; >>> }; >>> >>> /* Enum that defines the gdb-canonical set of Linux syscall identifiers. >>> -- >>> 1.9.1 >>> >> >> >> >> -- >> Will Newton >> Toolchain Working Group, Linaro > > Ping! Kindly help me approve this patch. ping!
On 14/10/2014 17:47, Omair Javaid wrote: > On 19 September 2014 03:27, Omair Javaid <omair.javaid@linaro.org> wrote: >> On 18 September 2014 05:22, Will Newton <will.newton@linaro.org> wrote: >>> On 29 August 2014 04:53, Omair Javaid <omair.javaid@linaro.org> wrote: >>>> Suggestion have been incorporated and updated patch is given below. >>>> >>>> gdb: >>>> >>>> 2014-08-28 Omair Javaid <omair.javaid@linaro.org> >>>> >>>> * aarch64-linux-tdep.c (record.h): Include. >>>> (record-full.h): Include. >>>> (struct linux_record_tdep aarch64_linux_record_tdep): Declare. >>>> (aarch64_canonicalize_syscall): New function to translate syscall >>>> numbers from aarch64 to canonical. >>>> (aarch64_all_but_pc_registers_record): New function. >>>> (aarch64_linux_syscall_record): New function. >>>> (aarch64_linux_init_abi): Update to handle syscall recording. >>>> * aarch64-linux-tdep.h (aarch64_syscall): New enum. >>>> * aarch64-tdep.c (aarch64_record_branch_except_sys): Add code to >>>> handle recording of syscalls. >>>> * aarch64-tdep.h >>>> (struct gdbarch_tdep) <aarch64_syscall_record>: Defined. >>>> * linux-record.h (struct linux_record_tdep): Add two more syscall >>>> argument fields. >>>> >>>> --- >>>> gdb/aarch64-linux-tdep.c | 913 +++++++++++++++++++++++++++++++++++++++++++++++ >>>> gdb/aarch64-linux-tdep.h | 266 ++++++++++++++ >>>> gdb/aarch64-tdep.c | 15 +- >>>> gdb/aarch64-tdep.h | 3 + >>>> gdb/linux-record.h | 2 + >>>> 5 files changed, 1198 insertions(+), 1 deletion(-) >>> >>> This one looks ok to me now. >>> >>>> diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c >>>> index 5ab7b37..82b55b6 100644 >>>> --- a/gdb/aarch64-linux-tdep.c >>>> +++ b/gdb/aarch64-linux-tdep.c >>>> @@ -41,6 +41,9 @@ >>>> #include "user-regs.h" >>>> #include <ctype.h> >>>> >>>> +#include "record-full.h" >>>> +#include "linux-record.h" >>>> + >>>> /* Signal frame handling. >>>> >>>> +------------+ ^ >>>> @@ -354,6 +357,752 @@ aarch64_stap_parse_special_token (struct gdbarch *gdbarch, >>>> return 1; >>>> } >>>> >>>> +/* AArch64 process record-replay constructs: syscall, signal etc. */ >>>> + >>>> +struct linux_record_tdep aarch64_linux_record_tdep; >>>> + >>>> +/* aarch64_canonicalize_syscall maps syscall ids from the native AArch64 >>>> + linux set of syscall ids into a canonical set of syscall ids used by >>>> + process record. */ >>>> + >>>> +static enum gdb_syscall >>>> +aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number) >>>> +{ >>>> + switch (syscall_number) { >>>> + case aarch64_sys_read: >>>> + return gdb_sys_read; >>>> + >>>> + case aarch64_sys_write: >>>> + return gdb_sys_write; >>>> + >>>> + case aarch64_sys_open: >>>> + return gdb_sys_open; >>>> + >>>> + case aarch64_sys_close: >>>> + return gdb_sys_close; >>>> + >>>> + case aarch64_sys_lseek: >>>> + return gdb_sys_lseek; >>>> + >>>> + case aarch64_sys_mprotect: >>>> + return gdb_sys_mprotect; >>>> + >>>> + case aarch64_sys_munmap: >>>> + return gdb_sys_munmap; >>>> + >>>> + case aarch64_sys_brk: >>>> + return gdb_sys_brk; >>>> + >>>> + case aarch64_sys_rt_sigaction: >>>> + return gdb_sys_rt_sigaction; >>>> + >>>> + case aarch64_sys_rt_sigprocmask: >>>> + return gdb_sys_rt_sigprocmask; >>>> + >>>> + case aarch64_sys_rt_sigreturn: >>>> + return gdb_sys_rt_sigreturn; >>>> + >>>> + case aarch64_sys_ioctl: >>>> + return gdb_sys_ioctl; >>>> + >>>> + case aarch64_sys_pread64: >>>> + return gdb_sys_pread64; >>>> + >>>> + case aarch64_sys_pwrite64: >>>> + return gdb_sys_pwrite64; >>>> + >>>> + case aarch64_sys_readv: >>>> + return gdb_sys_readv; >>>> + >>>> + case aarch64_sys_writev: >>>> + return gdb_sys_writev; >>>> + >>>> + case aarch64_sys_sched_yield: >>>> + return gdb_sys_sched_yield; >>>> + >>>> + case aarch64_sys_mremap: >>>> + return gdb_sys_mremap; >>>> + >>>> + case aarch64_sys_msync: >>>> + return gdb_sys_msync; >>>> + >>>> + case aarch64_sys_mincore: >>>> + return gdb_sys_mincore; >>>> + >>>> + case aarch64_sys_madvise: >>>> + return gdb_sys_madvise; >>>> + >>>> + case aarch64_sys_shmget: >>>> + return gdb_sys_shmget; >>>> + >>>> + case aarch64_sys_shmat: >>>> + return gdb_sys_shmat; >>>> + >>>> + case aarch64_sys_shmctl: >>>> + return gdb_sys_shmctl; >>>> + >>>> + case aarch64_sys_dup: >>>> + return gdb_sys_dup; >>>> + >>>> + case aarch64_sys_nanosleep: >>>> + return gdb_sys_nanosleep; >>>> + >>>> + case aarch64_sys_getitimer: >>>> + return gdb_sys_getitimer; >>>> + >>>> + case aarch64_sys_setitimer: >>>> + return gdb_sys_setitimer; >>>> + >>>> + case aarch64_sys_getpid: >>>> + return gdb_sys_getpid; >>>> + >>>> + case aarch64_sys_sendfile: >>>> + return gdb_sys_sendfile; >>>> + >>>> + case aarch64_sys_socket: >>>> + return gdb_sys_socket; >>>> + >>>> + case aarch64_sys_connect: >>>> + return gdb_sys_connect; >>>> + >>>> + case aarch64_sys_accept: >>>> + return gdb_sys_accept; >>>> + >>>> + case aarch64_sys_sendto: >>>> + return gdb_sys_sendto; >>>> + >>>> + case aarch64_sys_recvfrom: >>>> + return gdb_sys_recvfrom; >>>> + >>>> + case aarch64_sys_sendmsg: >>>> + return gdb_sys_sendmsg; >>>> + >>>> + case aarch64_sys_recvmsg: >>>> + return gdb_sys_recvmsg; >>>> + >>>> + case aarch64_sys_shutdown: >>>> + return gdb_sys_shutdown; >>>> + >>>> + case aarch64_sys_bind: >>>> + return gdb_sys_bind; >>>> + >>>> + case aarch64_sys_listen: >>>> + return gdb_sys_listen; >>>> + >>>> + case aarch64_sys_getsockname: >>>> + return gdb_sys_getsockname; >>>> + >>>> + case aarch64_sys_getpeername: >>>> + return gdb_sys_getpeername; >>>> + >>>> + case aarch64_sys_socketpair: >>>> + return gdb_sys_socketpair; >>>> + >>>> + case aarch64_sys_setsockopt: >>>> + return gdb_sys_setsockopt; >>>> + >>>> + case aarch64_sys_getsockopt: >>>> + return gdb_sys_getsockopt; >>>> + >>>> + case aarch64_sys_clone: >>>> + return gdb_sys_clone; >>>> + >>>> + case aarch64_sys_execve: >>>> + return gdb_sys_execve; >>>> + >>>> + case aarch64_sys_exit: >>>> + return gdb_sys_exit; >>>> + >>>> + case aarch64_sys_wait4: >>>> + return gdb_sys_wait4; >>>> + >>>> + case aarch64_sys_kill: >>>> + return gdb_sys_kill; >>>> + >>>> + case aarch64_sys_uname: >>>> + return gdb_sys_uname; >>>> + >>>> + case aarch64_sys_semget: >>>> + return gdb_sys_semget; >>>> + >>>> + case aarch64_sys_semop: >>>> + return gdb_sys_semop; >>>> + >>>> + case aarch64_sys_semctl: >>>> + return gdb_sys_semctl; >>>> + >>>> + case aarch64_sys_shmdt: >>>> + return gdb_sys_shmdt; >>>> + >>>> + case aarch64_sys_msgget: >>>> + return gdb_sys_msgget; >>>> + >>>> + case aarch64_sys_msgsnd: >>>> + return gdb_sys_msgsnd; >>>> + >>>> + case aarch64_sys_msgrcv: >>>> + return gdb_sys_msgrcv; >>>> + >>>> + case aarch64_sys_msgctl: >>>> + return gdb_sys_msgctl; >>>> + >>>> + case aarch64_sys_fcntl: >>>> + return gdb_sys_fcntl; >>>> + >>>> + case aarch64_sys_flock: >>>> + return gdb_sys_flock; >>>> + >>>> + case aarch64_sys_fsync: >>>> + return gdb_sys_fsync; >>>> + >>>> + case aarch64_sys_fdatasync: >>>> + return gdb_sys_fdatasync; >>>> + >>>> + case aarch64_sys_truncate: >>>> + return gdb_sys_truncate; >>>> + >>>> + case aarch64_sys_ftruncate: >>>> + return gdb_sys_ftruncate; >>>> + >>>> + case aarch64_sys_getcwd: >>>> + return gdb_sys_getcwd; >>>> + >>>> + case aarch64_sys_chdir: >>>> + return gdb_sys_chdir; >>>> + >>>> + case aarch64_sys_fchdir: >>>> + return gdb_sys_fchdir; >>>> + >>>> + case aarch64_sys_rename: >>>> + return gdb_sys_rename; >>>> + >>>> + case aarch64_sys_mkdir: >>>> + return gdb_sys_mkdir; >>>> + >>>> + case aarch64_sys_link: >>>> + return gdb_sys_link; >>>> + >>>> + case aarch64_sys_unlink: >>>> + return gdb_sys_unlink; >>>> + >>>> + case aarch64_sys_symlink: >>>> + return gdb_sys_symlink; >>>> + >>>> + case aarch64_sys_readlink: >>>> + return gdb_sys_readlink; >>>> + >>>> + case aarch64_sys_fchmodat: >>>> + return gdb_sys_fchmodat; >>>> + >>>> + case aarch64_sys_fchmod: >>>> + return gdb_sys_fchmod; >>>> + >>>> + case aarch64_sys_fchownat: >>>> + return gdb_sys_fchownat; >>>> + >>>> + case aarch64_sys_fchown: >>>> + return gdb_sys_fchown; >>>> + >>>> + case aarch64_sys_umask: >>>> + return gdb_sys_umask; >>>> + >>>> + case aarch64_sys_gettimeofday: >>>> + return gdb_sys_gettimeofday; >>>> + >>>> + case aarch64_sys_getrlimit: >>>> + return gdb_sys_getrlimit; >>>> + >>>> + case aarch64_sys_getrusage: >>>> + return gdb_sys_getrusage; >>>> + >>>> + case aarch64_sys_sysinfo: >>>> + return gdb_sys_sysinfo; >>>> + >>>> + case aarch64_sys_ptrace: >>>> + return gdb_sys_ptrace; >>>> + >>>> + case aarch64_sys_getuid: >>>> + return gdb_sys_getuid; >>>> + >>>> + case aarch64_sys_syslog: >>>> + return gdb_sys_syslog; >>>> + >>>> + case aarch64_sys_getgid: >>>> + return gdb_sys_getgid; >>>> + >>>> + case aarch64_sys_setuid: >>>> + return gdb_sys_setuid; >>>> + >>>> + case aarch64_sys_setgid: >>>> + return gdb_sys_setgid; >>>> + >>>> + case aarch64_sys_geteuid: >>>> + return gdb_sys_geteuid; >>>> + >>>> + case aarch64_sys_getegid: >>>> + return gdb_sys_getegid; >>>> + >>>> + case aarch64_sys_setpgid: >>>> + return gdb_sys_setpgid; >>>> + >>>> + case aarch64_sys_getppid: >>>> + return gdb_sys_getppid; >>>> + >>>> + case aarch64_sys_setsid: >>>> + return gdb_sys_setsid; >>>> + >>>> + case aarch64_sys_setreuid: >>>> + return gdb_sys_setreuid; >>>> + >>>> + case aarch64_sys_setregid: >>>> + return gdb_sys_setregid; >>>> + >>>> + case aarch64_sys_getgroups: >>>> + return gdb_sys_getgroups; >>>> + >>>> + case aarch64_sys_setgroups: >>>> + return gdb_sys_setgroups; >>>> + >>>> + case aarch64_sys_setresuid: >>>> + return gdb_sys_setresuid; >>>> + >>>> + case aarch64_sys_getresuid: >>>> + return gdb_sys_getresuid; >>>> + >>>> + case aarch64_sys_setresgid: >>>> + return gdb_sys_setresgid; >>>> + >>>> + case aarch64_sys_getresgid: >>>> + return gdb_sys_getresgid; >>>> + >>>> + case aarch64_sys_getpgid: >>>> + return gdb_sys_getpgid; >>>> + >>>> + case aarch64_sys_setfsuid: >>>> + return gdb_sys_setfsuid; >>>> + >>>> + case aarch64_sys_setfsgid: >>>> + return gdb_sys_setfsgid; >>>> + >>>> + case aarch64_sys_getsid: >>>> + return gdb_sys_getsid; >>>> + >>>> + case aarch64_sys_capget: >>>> + return gdb_sys_capget; >>>> + >>>> + case aarch64_sys_capset: >>>> + return gdb_sys_capset; >>>> + >>>> + case aarch64_sys_rt_sigpending: >>>> + return gdb_sys_rt_sigpending; >>>> + >>>> + case aarch64_sys_rt_sigtimedwait: >>>> + return gdb_sys_rt_sigtimedwait; >>>> + >>>> + case aarch64_sys_rt_sigqueueinfo: >>>> + return gdb_sys_rt_sigqueueinfo; >>>> + >>>> + case aarch64_sys_rt_sigsuspend: >>>> + return gdb_sys_rt_sigsuspend; >>>> + >>>> + case aarch64_sys_sigaltstack: >>>> + return gdb_sys_sigaltstack; >>>> + >>>> + case aarch64_sys_mknod: >>>> + return gdb_sys_mknod; >>>> + >>>> + case aarch64_sys_personality: >>>> + return gdb_sys_personality; >>>> + >>>> + case aarch64_sys_statfs: >>>> + return gdb_sys_statfs; >>>> + >>>> + case aarch64_sys_fstat: >>>> + return gdb_sys_fstat; >>>> + >>>> + case aarch64_sys_fstatfs: >>>> + return gdb_sys_fstatfs; >>>> + >>>> + case aarch64_sys_getpriority: >>>> + return gdb_sys_getpriority; >>>> + >>>> + case aarch64_sys_setpriority: >>>> + return gdb_sys_setpriority; >>>> + >>>> + case aarch64_sys_sched_setparam: >>>> + return gdb_sys_sched_setparam; >>>> + >>>> + case aarch64_sys_sched_getparam: >>>> + return gdb_sys_sched_getparam; >>>> + >>>> + case aarch64_sys_sched_setscheduler: >>>> + return gdb_sys_sched_setscheduler; >>>> + >>>> + case aarch64_sys_sched_getscheduler: >>>> + return gdb_sys_sched_getscheduler; >>>> + >>>> + case aarch64_sys_sched_get_priority_max: >>>> + return gdb_sys_sched_get_priority_max; >>>> + >>>> + case aarch64_sys_sched_get_priority_min: >>>> + return gdb_sys_sched_get_priority_min; >>>> + >>>> + case aarch64_sys_sched_rr_get_interval: >>>> + return gdb_sys_sched_rr_get_interval; >>>> + >>>> + case aarch64_sys_mlock: >>>> + return gdb_sys_mlock; >>>> + >>>> + case aarch64_sys_munlock: >>>> + return gdb_sys_munlock; >>>> + >>>> + case aarch64_sys_mlockall: >>>> + return gdb_sys_mlockall; >>>> + >>>> + case aarch64_sys_munlockall: >>>> + return gdb_sys_munlockall; >>>> + >>>> + case aarch64_sys_vhangup: >>>> + return gdb_sys_vhangup; >>>> + >>>> + case aarch64_sys_prctl: >>>> + return gdb_sys_prctl; >>>> + >>>> + case aarch64_sys_adjtimex: >>>> + return gdb_sys_adjtimex; >>>> + >>>> + case aarch64_sys_setrlimit: >>>> + return gdb_sys_setrlimit; >>>> + >>>> + case aarch64_sys_chroot: >>>> + return gdb_sys_chroot; >>>> + >>>> + case aarch64_sys_sync: >>>> + return gdb_sys_sync; >>>> + >>>> + case aarch64_sys_acct: >>>> + return gdb_sys_acct; >>>> + >>>> + case aarch64_sys_settimeofday: >>>> + return gdb_sys_settimeofday; >>>> + >>>> + case aarch64_sys_mount: >>>> + return gdb_sys_mount; >>>> + >>>> + case aarch64_sys_swapon: >>>> + return gdb_sys_swapon; >>>> + >>>> + case aarch64_sys_swapoff: >>>> + return gdb_sys_swapoff; >>>> + >>>> + case aarch64_sys_reboot: >>>> + return gdb_sys_reboot; >>>> + >>>> + case aarch64_sys_sethostname: >>>> + return gdb_sys_sethostname; >>>> + >>>> + case aarch64_sys_setdomainname: >>>> + return gdb_sys_setdomainname; >>>> + >>>> + case aarch64_sys_init_module: >>>> + return gdb_sys_init_module; >>>> + >>>> + case aarch64_sys_delete_module: >>>> + return gdb_sys_delete_module; >>>> + >>>> + case aarch64_sys_quotactl: >>>> + return gdb_sys_quotactl; >>>> + >>>> + case aarch64_sys_nfsservctl: >>>> + return gdb_sys_nfsservctl; >>>> + >>>> + case aarch64_sys_gettid: >>>> + return gdb_sys_gettid; >>>> + >>>> + case aarch64_sys_readahead: >>>> + return gdb_sys_readahead; >>>> + >>>> + case aarch64_sys_setxattr: >>>> + return gdb_sys_setxattr; >>>> + >>>> + case aarch64_sys_lsetxattr: >>>> + return gdb_sys_lsetxattr; >>>> + >>>> + case aarch64_sys_fsetxattr: >>>> + return gdb_sys_fsetxattr; >>>> + >>>> + case aarch64_sys_getxattr: >>>> + return gdb_sys_getxattr; >>>> + >>>> + case aarch64_sys_lgetxattr: >>>> + return gdb_sys_lgetxattr; >>>> + >>>> + case aarch64_sys_fgetxattr: >>>> + return gdb_sys_fgetxattr; >>>> + >>>> + case aarch64_sys_listxattr: >>>> + return gdb_sys_listxattr; >>>> + >>>> + case aarch64_sys_llistxattr: >>>> + return gdb_sys_llistxattr; >>>> + >>>> + case aarch64_sys_flistxattr: >>>> + return gdb_sys_flistxattr; >>>> + >>>> + case aarch64_sys_removexattr: >>>> + return gdb_sys_removexattr; >>>> + >>>> + case aarch64_sys_lremovexattr: >>>> + return gdb_sys_lremovexattr; >>>> + >>>> + case aarch64_sys_fremovexattr: >>>> + return gdb_sys_fremovexattr; >>>> + >>>> + case aarch64_sys_tkill: >>>> + return gdb_sys_tkill; >>>> + >>>> + case aarch64_sys_times: >>>> + return gdb_sys_times; >>>> + >>>> + case aarch64_sys_futex: >>>> + return gdb_sys_futex; >>>> + >>>> + case aarch64_sys_sched_setaffinity: >>>> + return gdb_sys_sched_setaffinity; >>>> + >>>> + case aarch64_sys_sched_getaffinity: >>>> + return gdb_sys_sched_getaffinity; >>>> + >>>> + case aarch64_sys_io_setup: >>>> + return gdb_sys_io_setup; >>>> + >>>> + case aarch64_sys_io_destroy: >>>> + return gdb_sys_io_destroy; >>>> + >>>> + case aarch64_sys_io_getevents: >>>> + return gdb_sys_io_getevents; >>>> + >>>> + case aarch64_sys_io_submit: >>>> + return gdb_sys_io_submit; >>>> + >>>> + case aarch64_sys_io_cancel: >>>> + return gdb_sys_io_cancel; >>>> + >>>> + case aarch64_sys_lookup_dcookie: >>>> + return gdb_sys_lookup_dcookie; >>>> + >>>> + case aarch64_sys_epoll_create1: >>>> + return gdb_sys_epoll_create; >>>> + >>>> + case aarch64_sys_remap_file_pages: >>>> + return gdb_sys_remap_file_pages; >>>> + >>>> + case aarch64_sys_getdents64: >>>> + return gdb_sys_getdents64; >>>> + >>>> + case aarch64_sys_set_tid_address: >>>> + return gdb_sys_set_tid_address; >>>> + >>>> + case aarch64_sys_semtimedop: >>>> + return gdb_sys_semtimedop; >>>> + >>>> + case aarch64_sys_fadvise64: >>>> + return gdb_sys_fadvise64; >>>> + >>>> + case aarch64_sys_timer_create: >>>> + return gdb_sys_timer_create; >>>> + >>>> + case aarch64_sys_timer_settime: >>>> + return gdb_sys_timer_settime; >>>> + >>>> + case aarch64_sys_timer_gettime: >>>> + return gdb_sys_timer_gettime; >>>> + >>>> + case aarch64_sys_timer_getoverrun: >>>> + return gdb_sys_timer_getoverrun; >>>> + >>>> + case aarch64_sys_timer_delete: >>>> + return gdb_sys_timer_delete; >>>> + >>>> + case aarch64_sys_clock_settime: >>>> + return gdb_sys_clock_settime; >>>> + >>>> + case aarch64_sys_clock_gettime: >>>> + return gdb_sys_clock_gettime; >>>> + >>>> + case aarch64_sys_clock_getres: >>>> + return gdb_sys_clock_getres; >>>> + >>>> + case aarch64_sys_clock_nanosleep: >>>> + return gdb_sys_clock_nanosleep; >>>> + >>>> + case aarch64_sys_exit_group: >>>> + return gdb_sys_exit_group; >>>> + >>>> + case aarch64_sys_epoll_pwait: >>>> + return gdb_sys_epoll_pwait; >>>> + >>>> + case aarch64_sys_epoll_ctl: >>>> + return gdb_sys_epoll_ctl; >>>> + >>>> + case aarch64_sys_tgkill: >>>> + return gdb_sys_tgkill; >>>> + >>>> + case aarch64_sys_mbind: >>>> + return gdb_sys_mbind; >>>> + >>>> + case aarch64_sys_set_mempolicy: >>>> + return gdb_sys_set_mempolicy; >>>> + >>>> + case aarch64_sys_get_mempolicy: >>>> + return gdb_sys_get_mempolicy; >>>> + >>>> + case aarch64_sys_mq_open: >>>> + return gdb_sys_mq_open; >>>> + >>>> + case aarch64_sys_mq_unlink: >>>> + return gdb_sys_mq_unlink; >>>> + >>>> + case aarch64_sys_mq_timedsend: >>>> + return gdb_sys_mq_timedsend; >>>> + >>>> + case aarch64_sys_mq_timedreceive: >>>> + return gdb_sys_mq_timedreceive; >>>> + >>>> + case aarch64_sys_mq_notify: >>>> + return gdb_sys_mq_notify; >>>> + >>>> + case aarch64_sys_mq_getsetattr: >>>> + return gdb_sys_mq_getsetattr; >>>> + >>>> + case aarch64_sys_kexec_load: >>>> + return gdb_sys_kexec_load; >>>> + >>>> + case aarch64_sys_waitid: >>>> + return gdb_sys_waitid; >>>> + >>>> + case aarch64_sys_add_key: >>>> + return gdb_sys_add_key; >>>> + >>>> + case aarch64_sys_request_key: >>>> + return gdb_sys_request_key; >>>> + >>>> + case aarch64_sys_keyctl: >>>> + return gdb_sys_keyctl; >>>> + >>>> + case aarch64_sys_ioprio_set: >>>> + return gdb_sys_ioprio_set; >>>> + >>>> + case aarch64_sys_ioprio_get: >>>> + return gdb_sys_ioprio_get; >>>> + >>>> + case aarch64_sys_inotify_add_watch: >>>> + return gdb_sys_inotify_add_watch; >>>> + >>>> + case aarch64_sys_inotify_rm_watch: >>>> + return gdb_sys_inotify_rm_watch; >>>> + >>>> + case aarch64_sys_migrate_pages: >>>> + return gdb_sys_migrate_pages; >>>> + >>>> + case aarch64_sys_pselect6: >>>> + return gdb_sys_pselect6; >>>> + >>>> + case aarch64_sys_ppoll: >>>> + return gdb_sys_ppoll; >>>> + >>>> + case aarch64_sys_unshare: >>>> + return gdb_sys_unshare; >>>> + >>>> + case aarch64_sys_set_robust_list: >>>> + return gdb_sys_set_robust_list; >>>> + >>>> + case aarch64_sys_get_robust_list: >>>> + return gdb_sys_get_robust_list; >>>> + >>>> + case aarch64_sys_splice: >>>> + return gdb_sys_splice; >>>> + >>>> + case aarch64_sys_tee: >>>> + return gdb_sys_tee; >>>> + >>>> + case aarch64_sys_sync_file_range: >>>> + return gdb_sys_sync_file_range; >>>> + >>>> + case aarch64_sys_vmsplice: >>>> + return gdb_sys_vmsplice; >>>> + >>>> + case aarch64_sys_move_pages: >>>> + return gdb_sys_move_pages; >>>> + >>>> + default: >>>> + return -1; >>>> + } >>>> +} >>>> + >>>> +/* Record all registers but PC register for process-record. */ >>>> + >>>> +static int >>>> +aarch64_all_but_pc_registers_record (struct regcache *regcache) >>>> +{ >>>> + int i; >>>> + >>>> + for (i = 0; i < AARCH64_PC_REGNUM; i++) >>>> + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM + i)) >>>> + return -1; >>>> + >>>> + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) >>>> + return -1; >>>> + >>>> + return 0; >>>> +} >>>> + >>>> +/* Handler for arm system call instruction recording. */ >>>> + >>>> +static int >>>> +aarch64_linux_syscall_record (struct regcache *regcache, unsigned long svc_number) >>>> +{ >>>> + int ret = 0; >>>> + enum gdb_syscall syscall_gdb; >>>> + >>>> + printf_unfiltered (_("syscall number %s\n"), >>>> + plongest (svc_number)); >>>> + syscall_gdb = aarch64_canonicalize_syscall (svc_number); >>>> + >>>> + if (syscall_gdb < 0) >>>> + { >>>> + printf_unfiltered (_("Process record and replay target doesn't " >>>> + "support syscall number %s\n"), >>>> + plongest (svc_number)); >>>> + return -1; >>>> + } >>>> + >>>> + if (syscall_gdb == gdb_sys_sigreturn >>>> + || syscall_gdb == gdb_sys_rt_sigreturn) >>>> + { >>>> + if (aarch64_all_but_pc_registers_record (regcache)) >>>> + return -1; >>>> + return 0; >>>> + } >>>> + >>>> + ret = record_linux_system_call (syscall_gdb, regcache, >>>> + &aarch64_linux_record_tdep); >>>> + if (ret != 0) >>>> + return ret; >>>> + >>>> + /* Record the return value of the system call. */ >>>> + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM)) >>>> + return -1; >>>> + /* Record LR. */ >>>> + if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM)) >>>> + return -1; >>>> + /* Record CPSR. */ >>>> + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) >>>> + return -1; >>>> + >>>> + return 0; >>>> +} >>>> + >>>> static void >>>> aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >>>> { >>>> @@ -404,6 +1153,170 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >>>> >>>> /* Reversible debugging, process record. */ >>>> set_gdbarch_process_record (gdbarch, aarch64_process_record); >>>> + /* Syscall record. */ >>>> + tdep->aarch64_syscall_record = aarch64_linux_syscall_record; >>>> + >>>> + /* Initialize the aarch64_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. */ >>>> + aarch64_linux_record_tdep.size_pointer >>>> + = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; >>>> + aarch64_linux_record_tdep.size__old_kernel_stat = 32; >>>> + aarch64_linux_record_tdep.size_tms = 32; >>>> + aarch64_linux_record_tdep.size_loff_t = 8; >>>> + aarch64_linux_record_tdep.size_flock = 32; >>>> + aarch64_linux_record_tdep.size_oldold_utsname = 45; >>>> + aarch64_linux_record_tdep.size_ustat = 32; >>>> + aarch64_linux_record_tdep.size_old_sigaction = 152; >>>> + aarch64_linux_record_tdep.size_old_sigset_t = 128; >>>> + aarch64_linux_record_tdep.size_rlimit = 16; >>>> + aarch64_linux_record_tdep.size_rusage = 144; >>>> + aarch64_linux_record_tdep.size_timeval = 16; >>>> + aarch64_linux_record_tdep.size_timezone = 8; >>>> + aarch64_linux_record_tdep.size_old_gid_t = 2; >>>> + aarch64_linux_record_tdep.size_old_uid_t = 2; >>>> + aarch64_linux_record_tdep.size_fd_set = 128; >>>> + aarch64_linux_record_tdep.size_dirent = 280; >>>> + aarch64_linux_record_tdep.size_dirent64 = 280; >>>> + aarch64_linux_record_tdep.size_statfs = 120; >>>> + aarch64_linux_record_tdep.size_statfs64 = 120; >>>> + aarch64_linux_record_tdep.size_sockaddr = 16; >>>> + aarch64_linux_record_tdep.size_int >>>> + = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT; >>>> + aarch64_linux_record_tdep.size_long >>>> + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; >>>> + aarch64_linux_record_tdep.size_ulong >>>> + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; >>>> + aarch64_linux_record_tdep.size_msghdr = 56; >>>> + aarch64_linux_record_tdep.size_itimerval = 32; >>>> + aarch64_linux_record_tdep.size_stat = 144; >>>> + aarch64_linux_record_tdep.size_old_utsname = 325; >>>> + aarch64_linux_record_tdep.size_sysinfo = 112; >>>> + aarch64_linux_record_tdep.size_msqid_ds = 120; >>>> + aarch64_linux_record_tdep.size_shmid_ds = 112; >>>> + aarch64_linux_record_tdep.size_new_utsname = 390; >>>> + aarch64_linux_record_tdep.size_timex = 208; >>>> + aarch64_linux_record_tdep.size_mem_dqinfo = 24; >>>> + aarch64_linux_record_tdep.size_if_dqblk = 72; >>>> + aarch64_linux_record_tdep.size_fs_quota_stat = 80; >>>> + aarch64_linux_record_tdep.size_timespec = 16; >>>> + aarch64_linux_record_tdep.size_pollfd = 8; >>>> + aarch64_linux_record_tdep.size_NFS_FHSIZE = 32; >>>> + aarch64_linux_record_tdep.size_knfsd_fh = 132; >>>> + aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16; >>>> + aarch64_linux_record_tdep.size_sigaction = 152; >>>> + aarch64_linux_record_tdep.size_sigset_t = 128; >>>> + aarch64_linux_record_tdep.size_siginfo_t = 128; >>>> + aarch64_linux_record_tdep.size_cap_user_data_t = 8; >>>> + aarch64_linux_record_tdep.size_stack_t = 24; >>>> + aarch64_linux_record_tdep.size_off_t = 8; >>>> + aarch64_linux_record_tdep.size_stat64 = 144; >>>> + aarch64_linux_record_tdep.size_gid_t = 4; >>>> + aarch64_linux_record_tdep.size_uid_t = 4; >>>> + aarch64_linux_record_tdep.size_PAGE_SIZE = 4096; >>>> + aarch64_linux_record_tdep.size_flock64 = 32; >>>> + aarch64_linux_record_tdep.size_user_desc = 16; >>>> + aarch64_linux_record_tdep.size_io_event = 32; >>>> + aarch64_linux_record_tdep.size_iocb = 64; >>>> + aarch64_linux_record_tdep.size_epoll_event = 12; >>>> + aarch64_linux_record_tdep.size_itimerspec = 32; >>>> + aarch64_linux_record_tdep.size_mq_attr = 64; >>>> + aarch64_linux_record_tdep.size_siginfo = 128; >>>> + aarch64_linux_record_tdep.size_termios = 60; >>>> + aarch64_linux_record_tdep.size_termios2 = 44; >>>> + aarch64_linux_record_tdep.size_pid_t = 4; >>>> + aarch64_linux_record_tdep.size_winsize = 8; >>>> + aarch64_linux_record_tdep.size_serial_struct = 72; >>>> + aarch64_linux_record_tdep.size_serial_icounter_struct = 80; >>>> + aarch64_linux_record_tdep.size_hayes_esp_config = 12; >>>> + aarch64_linux_record_tdep.size_size_t = 8; >>>> + aarch64_linux_record_tdep.size_iovec = 16; >>>> + >>>> + /* These values are the second argument of system call "sys_ioctl". >>>> + They are obtained from Linux Kernel source. */ >>>> + aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401; >>>> + aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402; >>>> + aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403; >>>> + aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404; >>>> + aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405; >>>> + aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406; >>>> + aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407; >>>> + aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408; >>>> + aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409; >>>> + aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a; >>>> + aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b; >>>> + aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c; >>>> + aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410; >>>> + aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414; >>>> + aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415; >>>> + aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416; >>>> + aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417; >>>> + aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a; >>>> + aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b; >>>> + aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b; >>>> + aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c; >>>> + aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f; >>>> + aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420; >>>> + aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421; >>>> + aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424; >>>> + aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425; >>>> + aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427; >>>> + aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429; >>>> + aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a; >>>> + aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b; >>>> + aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c; >>>> + aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431; >>>> + aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450; >>>> + aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451; >>>> + aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b; >>>> + aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d; >>>> + aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e; >>>> + aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f; >>>> + aarch64_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. */ >>>> + aarch64_linux_record_tdep.fcntl_F_GETLK = 5; >>>> + aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12; >>>> + aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13; >>>> + aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14; >>>> + >>>> + /* The AArch64 syscall calling convention: reg x0-x7 for arguments, >>>> + reg x8 for syscall number and return value in reg x0. */ >>>> + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0; >>>> + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1; >>>> + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2; >>>> + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; >>>> + aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4; >>>> + aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5; >>>> + aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6; >>>> + aarch64_linux_record_tdep.arg8 = AARCH64_X0_REGNUM + 7; >>>> } >>>> >>>> /* Provide a prototype to silence -Wmissing-prototypes. */ >>>> diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h >>>> index 2e1de60..1ae3786 100644 >>>> --- a/gdb/aarch64-linux-tdep.h >>>> +++ b/gdb/aarch64-linux-tdep.h >>>> @@ -32,3 +32,269 @@ >>>> >>>> extern const struct regset aarch64_linux_gregset; >>>> extern const struct regset aarch64_linux_fpregset; >>>> + >>>> +/* Enum that defines the AArch64 linux specific syscall identifiers used for >>>> + process record/replay. */ >>>> + >>>> +enum aarch64_syscall { >>>> + aarch64_sys_io_setup = 0, >>>> + aarch64_sys_io_destroy = 1, >>>> + aarch64_sys_io_submit = 2, >>>> + aarch64_sys_io_cancel = 3, >>>> + aarch64_sys_io_getevents = 4, >>>> + aarch64_sys_setxattr = 5, >>>> + aarch64_sys_lsetxattr = 6, >>>> + aarch64_sys_fsetxattr = 7, >>>> + aarch64_sys_getxattr = 8, >>>> + aarch64_sys_lgetxattr = 9, >>>> + aarch64_sys_fgetxattr = 10, >>>> + aarch64_sys_listxattr = 11, >>>> + aarch64_sys_llistxattr = 12, >>>> + aarch64_sys_flistxattr = 13, >>>> + aarch64_sys_removexattr = 14, >>>> + aarch64_sys_lremovexattr = 15, >>>> + aarch64_sys_fremovexattr = 16, >>>> + aarch64_sys_getcwd = 17, >>>> + aarch64_sys_lookup_dcookie = 18, >>>> + aarch64_sys_eventfd2 = 19, >>>> + aarch64_sys_epoll_create1 = 20, >>>> + aarch64_sys_epoll_ctl = 21, >>>> + aarch64_sys_epoll_pwait = 22, >>>> + aarch64_sys_dup = 23, >>>> + aarch64_sys_dup3 = 24, >>>> + aarch64_sys_fcntl = 25, >>>> + aarch64_sys_inotify_init1 = 26, >>>> + aarch64_sys_inotify_add_watch = 27, >>>> + aarch64_sys_inotify_rm_watch = 28, >>>> + aarch64_sys_ioctl = 29, >>>> + aarch64_sys_ioprio_set = 30, >>>> + aarch64_sys_ioprio_get = 31, >>>> + aarch64_sys_flock = 32, >>>> + aarch64_sys_mknod = 33, >>>> + aarch64_sys_mkdir = 34, >>>> + aarch64_sys_unlink = 35, >>>> + aarch64_sys_symlink = 36, >>>> + aarch64_sys_link = 37, >>>> + aarch64_sys_rename = 38, >>>> + aarch64_sys_umount2 = 39, >>>> + aarch64_sys_mount = 40, >>>> + aarch64_sys_pivot_root = 41, >>>> + aarch64_sys_nfsservctl = 42, >>>> + aarch64_sys_statfs = 43, >>>> + aarch64_sys_fstatfs = 44, >>>> + aarch64_sys_truncate = 45, >>>> + aarch64_sys_ftruncate = 46, >>>> + aarch64_sys_fallocate = 47, >>>> + aarch64_sys_faccess = 48, >>>> + aarch64_sys_chdir = 49, >>>> + aarch64_sys_fchdir = 50, >>>> + aarch64_sys_chroot = 51, >>>> + aarch64_sys_fchmod = 52, >>>> + aarch64_sys_fchmodat = 53, >>>> + aarch64_sys_fchownat = 54, >>>> + aarch64_sys_fchown = 55, >>>> + aarch64_sys_open = 56, >>>> + aarch64_sys_close = 57, >>>> + aarch64_sys_vhangup = 58, >>>> + aarch64_sys_pipe2 = 59, >>>> + aarch64_sys_quotactl = 60, >>>> + aarch64_sys_getdents64 = 61, >>>> + aarch64_sys_lseek = 62, >>>> + aarch64_sys_read = 63, >>>> + aarch64_sys_write = 64, >>>> + aarch64_sys_readv = 65, >>>> + aarch64_sys_writev = 66, >>>> + aarch64_sys_pread64 = 67, >>>> + aarch64_sys_pwrite64 = 68, >>>> + aarch64_sys_preadv = 69, >>>> + aarch64_sys_pwritev = 70, >>>> + aarch64_sys_sendfile = 71, >>>> + aarch64_sys_pselect6 = 72, >>>> + aarch64_sys_ppoll = 73, >>>> + aarch64_sys_signalfd4 = 74, >>>> + aarch64_sys_vmsplice = 75, >>>> + aarch64_sys_splice = 76, >>>> + aarch64_sys_tee = 77, >>>> + aarch64_sys_readlink = 78, >>>> + aarch64_sys_fstatat = 79, >>>> + aarch64_sys_fstat = 80, >>>> + aarch64_sys_sync = 81, >>>> + aarch64_sys_fsync = 82, >>>> + aarch64_sys_fdatasync = 83, >>>> + aarch64_sys_sync_file_range2 = 84, >>>> + aarch64_sys_sync_file_range = 84, >>>> + aarch64_sys_timerfd_create = 85, >>>> + aarch64_sys_timerfd_settime = 86, >>>> + aarch64_sys_timerfd_gettime = 87, >>>> + aarch64_sys_utimensat = 88, >>>> + aarch64_sys_acct = 89, >>>> + aarch64_sys_capget = 90, >>>> + aarch64_sys_capset = 91, >>>> + aarch64_sys_personality = 92, >>>> + aarch64_sys_exit = 93, >>>> + aarch64_sys_exit_group = 94, >>>> + aarch64_sys_waitid = 95, >>>> + aarch64_sys_set_tid_address = 96, >>>> + aarch64_sys_unshare = 97, >>>> + aarch64_sys_futex = 98, >>>> + aarch64_sys_set_robust_list = 99, >>>> + aarch64_sys_get_robust_list = 100, >>>> + aarch64_sys_nanosleep = 101, >>>> + aarch64_sys_getitimer = 102, >>>> + aarch64_sys_setitimer = 103, >>>> + aarch64_sys_kexec_load = 104, >>>> + aarch64_sys_init_module = 105, >>>> + aarch64_sys_delete_module = 106, >>>> + aarch64_sys_timer_create = 107, >>>> + aarch64_sys_timer_gettime = 108, >>>> + aarch64_sys_timer_getoverrun = 109, >>>> + aarch64_sys_timer_settime = 110, >>>> + aarch64_sys_timer_delete = 111, >>>> + aarch64_sys_clock_settime = 112, >>>> + aarch64_sys_clock_gettime = 113, >>>> + aarch64_sys_clock_getres = 114, >>>> + aarch64_sys_clock_nanosleep = 115, >>>> + aarch64_sys_syslog = 116, >>>> + aarch64_sys_ptrace = 117, >>>> + aarch64_sys_sched_setparam = 118, >>>> + aarch64_sys_sched_setscheduler = 119, >>>> + aarch64_sys_sched_getscheduler = 120, >>>> + aarch64_sys_sched_getparam = 121, >>>> + aarch64_sys_sched_setaffinity = 122, >>>> + aarch64_sys_sched_getaffinity = 123, >>>> + aarch64_sys_sched_yield = 124, >>>> + aarch64_sys_sched_get_priority_max = 125, >>>> + aarch64_sys_sched_get_priority_min = 126, >>>> + aarch64_sys_sched_rr_get_interval = 127, >>>> + aarch64_sys_kill = 129, >>>> + aarch64_sys_tkill = 130, >>>> + aarch64_sys_tgkill = 131, >>>> + aarch64_sys_sigaltstack = 132, >>>> + aarch64_sys_rt_sigsuspend = 133, >>>> + aarch64_sys_rt_sigaction = 134, >>>> + aarch64_sys_rt_sigprocmask = 135, >>>> + aarch64_sys_rt_sigpending = 136, >>>> + aarch64_sys_rt_sigtimedwait = 137, >>>> + aarch64_sys_rt_sigqueueinfo = 138, >>>> + aarch64_sys_rt_sigreturn = 139, >>>> + aarch64_sys_setpriority = 140, >>>> + aarch64_sys_getpriority = 141, >>>> + aarch64_sys_reboot = 142, >>>> + aarch64_sys_setregid = 143, >>>> + aarch64_sys_setgid = 144, >>>> + aarch64_sys_setreuid = 145, >>>> + aarch64_sys_setuid = 146, >>>> + aarch64_sys_setresuid = 147, >>>> + aarch64_sys_getresuid = 148, >>>> + aarch64_sys_setresgid = 149, >>>> + aarch64_sys_getresgid = 150, >>>> + aarch64_sys_setfsuid = 151, >>>> + aarch64_sys_setfsgid = 152, >>>> + aarch64_sys_times = 153, >>>> + aarch64_sys_setpgid = 154, >>>> + aarch64_sys_getpgid = 155, >>>> + aarch64_sys_getsid = 156, >>>> + aarch64_sys_setsid = 157, >>>> + aarch64_sys_getgroups = 158, >>>> + aarch64_sys_setgroups = 159, >>>> + aarch64_sys_uname = 160, >>>> + aarch64_sys_sethostname = 161, >>>> + aarch64_sys_setdomainname = 162, >>>> + aarch64_sys_getrlimit = 163, >>>> + aarch64_sys_setrlimit = 164, >>>> + aarch64_sys_getrusage = 165, >>>> + aarch64_sys_umask = 166, >>>> + aarch64_sys_prctl = 167, >>>> + aarch64_sys_getcpu = 168, >>>> + aarch64_sys_gettimeofday = 169, >>>> + aarch64_sys_settimeofday = 170, >>>> + aarch64_sys_adjtimex = 171, >>>> + aarch64_sys_getpid = 172, >>>> + aarch64_sys_getppid = 173, >>>> + aarch64_sys_getuid = 174, >>>> + aarch64_sys_geteuid = 175, >>>> + aarch64_sys_getgid = 176, >>>> + aarch64_sys_getegid = 177, >>>> + aarch64_sys_gettid = 178, >>>> + aarch64_sys_sysinfo = 179, >>>> + aarch64_sys_mq_open = 180, >>>> + aarch64_sys_mq_unlink = 181, >>>> + aarch64_sys_mq_timedsend = 182, >>>> + aarch64_sys_mq_timedreceive = 183, >>>> + aarch64_sys_mq_notify = 184, >>>> + aarch64_sys_mq_getsetattr = 185, >>>> + aarch64_sys_msgget = 186, >>>> + aarch64_sys_msgctl = 187, >>>> + aarch64_sys_msgrcv = 188, >>>> + aarch64_sys_msgsnd = 189, >>>> + aarch64_sys_semget = 190, >>>> + aarch64_sys_semctl = 191, >>>> + aarch64_sys_semtimedop = 192, >>>> + aarch64_sys_semop = 193, >>>> + aarch64_sys_shmget = 194, >>>> + aarch64_sys_shmctl = 195, >>>> + aarch64_sys_shmat = 196, >>>> + aarch64_sys_shmdt = 197, >>>> + aarch64_sys_socket = 198, >>>> + aarch64_sys_socketpair = 199, >>>> + aarch64_sys_bind = 200, >>>> + aarch64_sys_listen = 201, >>>> + aarch64_sys_accept = 202, >>>> + aarch64_sys_connect = 203, >>>> + aarch64_sys_getsockname = 204, >>>> + aarch64_sys_getpeername = 205, >>>> + aarch64_sys_sendto = 206, >>>> + aarch64_sys_recvfrom = 207, >>>> + aarch64_sys_setsockopt = 208, >>>> + aarch64_sys_getsockopt = 209, >>>> + aarch64_sys_shutdown = 210, >>>> + aarch64_sys_sendmsg = 211, >>>> + aarch64_sys_recvmsg = 212, >>>> + aarch64_sys_readahead = 213, >>>> + aarch64_sys_brk = 214, >>>> + aarch64_sys_munmap = 215, >>>> + aarch64_sys_mremap = 216, >>>> + aarch64_sys_add_key = 217, >>>> + aarch64_sys_request_key = 218, >>>> + aarch64_sys_keyctl = 219, >>>> + aarch64_sys_clone = 220, >>>> + aarch64_sys_execve = 221, >>>> + aarch64_sys_mmap = 222, >>>> + aarch64_sys_fadvise64 = 223, >>>> + aarch64_sys_swapon = 224, >>>> + aarch64_sys_swapoff = 225, >>>> + aarch64_sys_mprotect = 226, >>>> + aarch64_sys_msync = 227, >>>> + aarch64_sys_mlock = 228, >>>> + aarch64_sys_munlock = 229, >>>> + aarch64_sys_mlockall = 230, >>>> + aarch64_sys_munlockall = 231, >>>> + aarch64_sys_mincore = 232, >>>> + aarch64_sys_madvise = 233, >>>> + aarch64_sys_remap_file_pages = 234, >>>> + aarch64_sys_mbind = 235, >>>> + aarch64_sys_get_mempolicy = 236, >>>> + aarch64_sys_set_mempolicy = 237, >>>> + aarch64_sys_migrate_pages = 238, >>>> + aarch64_sys_move_pages = 239, >>>> + aarch64_sys_rt_tgsigqueueinfo = 240, >>>> + aarch64_sys_perf_event_open = 241, >>>> + aarch64_sys_accept4 = 242, >>>> + aarch64_sys_recvmmsg = 243, >>>> + aarch64_sys_wait4 = 260, >>>> + aarch64_sys_prlimit64 = 261, >>>> + aarch64_sys_fanotify_init = 262, >>>> + aarch64_sys_fanotify_mark = 263, >>>> + aarch64_sys_name_to_handle_at = 264, >>>> + aarch64_sys_open_by_handle_at = 265, >>>> + aarch64_sys_clock_adjtime = 266, >>>> + aarch64_sys_syncfs = 267, >>>> + aarch64_sys_setns = 268, >>>> + aarch64_sys_sendmmsg = 269, >>>> + aarch64_sys_process_vm_readv = 270, >>>> + aarch64_sys_process_vm_writev = 271, >>>> + aarch64_sys_kcmp = 272, >>>> + aarch64_sys_finit_module = 273, >>>> + aarch64_sys_sched_setattr = 274, >>>> + aarch64_sys_sched_getattr = 275, >>>> +}; >>>> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c >>>> index 0847585..c6da25a 100644 >>>> --- a/gdb/aarch64-tdep.c >>>> +++ b/gdb/aarch64-tdep.c >>>> @@ -2941,7 +2941,20 @@ aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r) >>>> { >>>> /* Exception generation instructions. */ >>>> if (insn_bits24_27 == 0x04) >>>> - return AARCH64_RECORD_UNSUPPORTED; >>>> + { >>>> + if (!bits (aarch64_insn_r->aarch64_insn, 2, 4) && >>>> + !bits (aarch64_insn_r->aarch64_insn, 21, 23) && >>>> + bits (aarch64_insn_r->aarch64_insn, 0, 1) == 0x01) >>>> + { >>>> + ULONGEST svc_number; >>>> + regcache_raw_read_unsigned (aarch64_insn_r->regcache, 8, >>>> + &svc_number); >>>> + return tdep->aarch64_syscall_record (aarch64_insn_r->regcache, >>>> + svc_number); >>>> + } >>>> + else >>>> + return AARCH64_RECORD_UNSUPPORTED; >>>> + } >>>> /* System instructions. */ >>>> else if (insn_bits24_27 == 0x05 && insn_bits22_23 == 0x00) >>>> { >>>> diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h >>>> index 1d74ef8..25751fe 100644 >>>> --- a/gdb/aarch64-tdep.h >>>> +++ b/gdb/aarch64-tdep.h >>>> @@ -88,6 +88,9 @@ struct gdbarch_tdep >>>> struct type *vns_type; >>>> struct type *vnh_type; >>>> struct type *vnb_type; >>>> + >>>> + /* syscall record. */ >>>> + int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number); >>>> }; >>>> >>>> /* AArch64 process record-replay related structures, defines etc. */ >>>> diff --git a/gdb/linux-record.h b/gdb/linux-record.h >>>> index 7b5218e..2649ce5 100644 >>>> --- a/gdb/linux-record.h >>>> +++ b/gdb/linux-record.h >>>> @@ -174,6 +174,8 @@ struct linux_record_tdep >>>> int arg4; >>>> int arg5; >>>> int arg6; >>>> + int arg7; >>>> + int arg8; >>>> }; >>>> >>>> /* Enum that defines the gdb-canonical set of Linux syscall identifiers. >>>> -- >>>> 1.9.1 >>>> >>> >>> >>> >>> -- >>> Will Newton >>> Toolchain Working Group, Linaro >> >> Ping! Kindly help me approve this patch. > > ping! > ping!
diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index 5ab7b37..82b55b6 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -41,6 +41,9 @@ #include "user-regs.h" #include <ctype.h> +#include "record-full.h" +#include "linux-record.h" + /* Signal frame handling. +------------+ ^ @@ -354,6 +357,752 @@ aarch64_stap_parse_special_token (struct gdbarch *gdbarch, return 1; } +/* AArch64 process record-replay constructs: syscall, signal etc. */ + +struct linux_record_tdep aarch64_linux_record_tdep; + +/* aarch64_canonicalize_syscall maps syscall ids from the native AArch64 + linux set of syscall ids into a canonical set of syscall ids used by + process record. */ + +static enum gdb_syscall +aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number) +{ + switch (syscall_number) { + case aarch64_sys_read: + return gdb_sys_read; + + case aarch64_sys_write: + return gdb_sys_write; + + case aarch64_sys_open: + return gdb_sys_open; + + case aarch64_sys_close: + return gdb_sys_close; + + case aarch64_sys_lseek: + return gdb_sys_lseek; + + case aarch64_sys_mprotect: + return gdb_sys_mprotect; + + case aarch64_sys_munmap: + return gdb_sys_munmap; + + case aarch64_sys_brk: + return gdb_sys_brk; + + case aarch64_sys_rt_sigaction: + return gdb_sys_rt_sigaction; + + case aarch64_sys_rt_sigprocmask: + return gdb_sys_rt_sigprocmask; + + case aarch64_sys_rt_sigreturn: + return gdb_sys_rt_sigreturn; + + case aarch64_sys_ioctl: + return gdb_sys_ioctl; + + case aarch64_sys_pread64: + return gdb_sys_pread64; + + case aarch64_sys_pwrite64: + return gdb_sys_pwrite64; + + case aarch64_sys_readv: + return gdb_sys_readv; + + case aarch64_sys_writev: + return gdb_sys_writev; + + case aarch64_sys_sched_yield: + return gdb_sys_sched_yield; + + case aarch64_sys_mremap: + return gdb_sys_mremap; + + case aarch64_sys_msync: + return gdb_sys_msync; + + case aarch64_sys_mincore: + return gdb_sys_mincore; + + case aarch64_sys_madvise: + return gdb_sys_madvise; + + case aarch64_sys_shmget: + return gdb_sys_shmget; + + case aarch64_sys_shmat: + return gdb_sys_shmat; + + case aarch64_sys_shmctl: + return gdb_sys_shmctl; + + case aarch64_sys_dup: + return gdb_sys_dup; + + case aarch64_sys_nanosleep: + return gdb_sys_nanosleep; + + case aarch64_sys_getitimer: + return gdb_sys_getitimer; + + case aarch64_sys_setitimer: + return gdb_sys_setitimer; + + case aarch64_sys_getpid: + return gdb_sys_getpid; + + case aarch64_sys_sendfile: + return gdb_sys_sendfile; + + case aarch64_sys_socket: + return gdb_sys_socket; + + case aarch64_sys_connect: + return gdb_sys_connect; + + case aarch64_sys_accept: + return gdb_sys_accept; + + case aarch64_sys_sendto: + return gdb_sys_sendto; + + case aarch64_sys_recvfrom: + return gdb_sys_recvfrom; + + case aarch64_sys_sendmsg: + return gdb_sys_sendmsg; + + case aarch64_sys_recvmsg: + return gdb_sys_recvmsg; + + case aarch64_sys_shutdown: + return gdb_sys_shutdown; + + case aarch64_sys_bind: + return gdb_sys_bind; + + case aarch64_sys_listen: + return gdb_sys_listen; + + case aarch64_sys_getsockname: + return gdb_sys_getsockname; + + case aarch64_sys_getpeername: + return gdb_sys_getpeername; + + case aarch64_sys_socketpair: + return gdb_sys_socketpair; + + case aarch64_sys_setsockopt: + return gdb_sys_setsockopt; + + case aarch64_sys_getsockopt: + return gdb_sys_getsockopt; + + case aarch64_sys_clone: + return gdb_sys_clone; + + case aarch64_sys_execve: + return gdb_sys_execve; + + case aarch64_sys_exit: + return gdb_sys_exit; + + case aarch64_sys_wait4: + return gdb_sys_wait4; + + case aarch64_sys_kill: + return gdb_sys_kill; + + case aarch64_sys_uname: + return gdb_sys_uname; + + case aarch64_sys_semget: + return gdb_sys_semget; + + case aarch64_sys_semop: + return gdb_sys_semop; + + case aarch64_sys_semctl: + return gdb_sys_semctl; + + case aarch64_sys_shmdt: + return gdb_sys_shmdt; + + case aarch64_sys_msgget: + return gdb_sys_msgget; + + case aarch64_sys_msgsnd: + return gdb_sys_msgsnd; + + case aarch64_sys_msgrcv: + return gdb_sys_msgrcv; + + case aarch64_sys_msgctl: + return gdb_sys_msgctl; + + case aarch64_sys_fcntl: + return gdb_sys_fcntl; + + case aarch64_sys_flock: + return gdb_sys_flock; + + case aarch64_sys_fsync: + return gdb_sys_fsync; + + case aarch64_sys_fdatasync: + return gdb_sys_fdatasync; + + case aarch64_sys_truncate: + return gdb_sys_truncate; + + case aarch64_sys_ftruncate: + return gdb_sys_ftruncate; + + case aarch64_sys_getcwd: + return gdb_sys_getcwd; + + case aarch64_sys_chdir: + return gdb_sys_chdir; + + case aarch64_sys_fchdir: + return gdb_sys_fchdir; + + case aarch64_sys_rename: + return gdb_sys_rename; + + case aarch64_sys_mkdir: + return gdb_sys_mkdir; + + case aarch64_sys_link: + return gdb_sys_link; + + case aarch64_sys_unlink: + return gdb_sys_unlink; + + case aarch64_sys_symlink: + return gdb_sys_symlink; + + case aarch64_sys_readlink: + return gdb_sys_readlink; + + case aarch64_sys_fchmodat: + return gdb_sys_fchmodat; + + case aarch64_sys_fchmod: + return gdb_sys_fchmod; + + case aarch64_sys_fchownat: + return gdb_sys_fchownat; + + case aarch64_sys_fchown: + return gdb_sys_fchown; + + case aarch64_sys_umask: + return gdb_sys_umask; + + case aarch64_sys_gettimeofday: + return gdb_sys_gettimeofday; + + case aarch64_sys_getrlimit: + return gdb_sys_getrlimit; + + case aarch64_sys_getrusage: + return gdb_sys_getrusage; + + case aarch64_sys_sysinfo: + return gdb_sys_sysinfo; + + case aarch64_sys_ptrace: + return gdb_sys_ptrace; + + case aarch64_sys_getuid: + return gdb_sys_getuid; + + case aarch64_sys_syslog: + return gdb_sys_syslog; + + case aarch64_sys_getgid: + return gdb_sys_getgid; + + case aarch64_sys_setuid: + return gdb_sys_setuid; + + case aarch64_sys_setgid: + return gdb_sys_setgid; + + case aarch64_sys_geteuid: + return gdb_sys_geteuid; + + case aarch64_sys_getegid: + return gdb_sys_getegid; + + case aarch64_sys_setpgid: + return gdb_sys_setpgid; + + case aarch64_sys_getppid: + return gdb_sys_getppid; + + case aarch64_sys_setsid: + return gdb_sys_setsid; + + case aarch64_sys_setreuid: + return gdb_sys_setreuid; + + case aarch64_sys_setregid: + return gdb_sys_setregid; + + case aarch64_sys_getgroups: + return gdb_sys_getgroups; + + case aarch64_sys_setgroups: + return gdb_sys_setgroups; + + case aarch64_sys_setresuid: + return gdb_sys_setresuid; + + case aarch64_sys_getresuid: + return gdb_sys_getresuid; + + case aarch64_sys_setresgid: + return gdb_sys_setresgid; + + case aarch64_sys_getresgid: + return gdb_sys_getresgid; + + case aarch64_sys_getpgid: + return gdb_sys_getpgid; + + case aarch64_sys_setfsuid: + return gdb_sys_setfsuid; + + case aarch64_sys_setfsgid: + return gdb_sys_setfsgid; + + case aarch64_sys_getsid: + return gdb_sys_getsid; + + case aarch64_sys_capget: + return gdb_sys_capget; + + case aarch64_sys_capset: + return gdb_sys_capset; + + case aarch64_sys_rt_sigpending: + return gdb_sys_rt_sigpending; + + case aarch64_sys_rt_sigtimedwait: + return gdb_sys_rt_sigtimedwait; + + case aarch64_sys_rt_sigqueueinfo: + return gdb_sys_rt_sigqueueinfo; + + case aarch64_sys_rt_sigsuspend: + return gdb_sys_rt_sigsuspend; + + case aarch64_sys_sigaltstack: + return gdb_sys_sigaltstack; + + case aarch64_sys_mknod: + return gdb_sys_mknod; + + case aarch64_sys_personality: + return gdb_sys_personality; + + case aarch64_sys_statfs: + return gdb_sys_statfs; + + case aarch64_sys_fstat: + return gdb_sys_fstat; + + case aarch64_sys_fstatfs: + return gdb_sys_fstatfs; + + case aarch64_sys_getpriority: + return gdb_sys_getpriority; + + case aarch64_sys_setpriority: + return gdb_sys_setpriority; + + case aarch64_sys_sched_setparam: + return gdb_sys_sched_setparam; + + case aarch64_sys_sched_getparam: + return gdb_sys_sched_getparam; + + case aarch64_sys_sched_setscheduler: + return gdb_sys_sched_setscheduler; + + case aarch64_sys_sched_getscheduler: + return gdb_sys_sched_getscheduler; + + case aarch64_sys_sched_get_priority_max: + return gdb_sys_sched_get_priority_max; + + case aarch64_sys_sched_get_priority_min: + return gdb_sys_sched_get_priority_min; + + case aarch64_sys_sched_rr_get_interval: + return gdb_sys_sched_rr_get_interval; + + case aarch64_sys_mlock: + return gdb_sys_mlock; + + case aarch64_sys_munlock: + return gdb_sys_munlock; + + case aarch64_sys_mlockall: + return gdb_sys_mlockall; + + case aarch64_sys_munlockall: + return gdb_sys_munlockall; + + case aarch64_sys_vhangup: + return gdb_sys_vhangup; + + case aarch64_sys_prctl: + return gdb_sys_prctl; + + case aarch64_sys_adjtimex: + return gdb_sys_adjtimex; + + case aarch64_sys_setrlimit: + return gdb_sys_setrlimit; + + case aarch64_sys_chroot: + return gdb_sys_chroot; + + case aarch64_sys_sync: + return gdb_sys_sync; + + case aarch64_sys_acct: + return gdb_sys_acct; + + case aarch64_sys_settimeofday: + return gdb_sys_settimeofday; + + case aarch64_sys_mount: + return gdb_sys_mount; + + case aarch64_sys_swapon: + return gdb_sys_swapon; + + case aarch64_sys_swapoff: + return gdb_sys_swapoff; + + case aarch64_sys_reboot: + return gdb_sys_reboot; + + case aarch64_sys_sethostname: + return gdb_sys_sethostname; + + case aarch64_sys_setdomainname: + return gdb_sys_setdomainname; + + case aarch64_sys_init_module: + return gdb_sys_init_module; + + case aarch64_sys_delete_module: + return gdb_sys_delete_module; + + case aarch64_sys_quotactl: + return gdb_sys_quotactl; + + case aarch64_sys_nfsservctl: + return gdb_sys_nfsservctl; + + case aarch64_sys_gettid: + return gdb_sys_gettid; + + case aarch64_sys_readahead: + return gdb_sys_readahead; + + case aarch64_sys_setxattr: + return gdb_sys_setxattr; + + case aarch64_sys_lsetxattr: + return gdb_sys_lsetxattr; + + case aarch64_sys_fsetxattr: + return gdb_sys_fsetxattr; + + case aarch64_sys_getxattr: + return gdb_sys_getxattr; + + case aarch64_sys_lgetxattr: + return gdb_sys_lgetxattr; + + case aarch64_sys_fgetxattr: + return gdb_sys_fgetxattr; + + case aarch64_sys_listxattr: + return gdb_sys_listxattr; + + case aarch64_sys_llistxattr: + return gdb_sys_llistxattr; + + case aarch64_sys_flistxattr: + return gdb_sys_flistxattr; + + case aarch64_sys_removexattr: + return gdb_sys_removexattr; + + case aarch64_sys_lremovexattr: + return gdb_sys_lremovexattr; + + case aarch64_sys_fremovexattr: + return gdb_sys_fremovexattr; + + case aarch64_sys_tkill: + return gdb_sys_tkill; + + case aarch64_sys_times: + return gdb_sys_times; + + case aarch64_sys_futex: + return gdb_sys_futex; + + case aarch64_sys_sched_setaffinity: + return gdb_sys_sched_setaffinity; + + case aarch64_sys_sched_getaffinity: + return gdb_sys_sched_getaffinity; + + case aarch64_sys_io_setup: + return gdb_sys_io_setup; + + case aarch64_sys_io_destroy: + return gdb_sys_io_destroy; + + case aarch64_sys_io_getevents: + return gdb_sys_io_getevents; + + case aarch64_sys_io_submit: + return gdb_sys_io_submit; + + case aarch64_sys_io_cancel: + return gdb_sys_io_cancel; + + case aarch64_sys_lookup_dcookie: + return gdb_sys_lookup_dcookie; + + case aarch64_sys_epoll_create1: + return gdb_sys_epoll_create; + + case aarch64_sys_remap_file_pages: + return gdb_sys_remap_file_pages; + + case aarch64_sys_getdents64: + return gdb_sys_getdents64; + + case aarch64_sys_set_tid_address: + return gdb_sys_set_tid_address; + + case aarch64_sys_semtimedop: + return gdb_sys_semtimedop; + + case aarch64_sys_fadvise64: + return gdb_sys_fadvise64; + + case aarch64_sys_timer_create: + return gdb_sys_timer_create; + + case aarch64_sys_timer_settime: + return gdb_sys_timer_settime; + + case aarch64_sys_timer_gettime: + return gdb_sys_timer_gettime; + + case aarch64_sys_timer_getoverrun: + return gdb_sys_timer_getoverrun; + + case aarch64_sys_timer_delete: + return gdb_sys_timer_delete; + + case aarch64_sys_clock_settime: + return gdb_sys_clock_settime; + + case aarch64_sys_clock_gettime: + return gdb_sys_clock_gettime; + + case aarch64_sys_clock_getres: + return gdb_sys_clock_getres; + + case aarch64_sys_clock_nanosleep: + return gdb_sys_clock_nanosleep; + + case aarch64_sys_exit_group: + return gdb_sys_exit_group; + + case aarch64_sys_epoll_pwait: + return gdb_sys_epoll_pwait; + + case aarch64_sys_epoll_ctl: + return gdb_sys_epoll_ctl; + + case aarch64_sys_tgkill: + return gdb_sys_tgkill; + + case aarch64_sys_mbind: + return gdb_sys_mbind; + + case aarch64_sys_set_mempolicy: + return gdb_sys_set_mempolicy; + + case aarch64_sys_get_mempolicy: + return gdb_sys_get_mempolicy; + + case aarch64_sys_mq_open: + return gdb_sys_mq_open; + + case aarch64_sys_mq_unlink: + return gdb_sys_mq_unlink; + + case aarch64_sys_mq_timedsend: + return gdb_sys_mq_timedsend; + + case aarch64_sys_mq_timedreceive: + return gdb_sys_mq_timedreceive; + + case aarch64_sys_mq_notify: + return gdb_sys_mq_notify; + + case aarch64_sys_mq_getsetattr: + return gdb_sys_mq_getsetattr; + + case aarch64_sys_kexec_load: + return gdb_sys_kexec_load; + + case aarch64_sys_waitid: + return gdb_sys_waitid; + + case aarch64_sys_add_key: + return gdb_sys_add_key; + + case aarch64_sys_request_key: + return gdb_sys_request_key; + + case aarch64_sys_keyctl: + return gdb_sys_keyctl; + + case aarch64_sys_ioprio_set: + return gdb_sys_ioprio_set; + + case aarch64_sys_ioprio_get: + return gdb_sys_ioprio_get; + + case aarch64_sys_inotify_add_watch: + return gdb_sys_inotify_add_watch; + + case aarch64_sys_inotify_rm_watch: + return gdb_sys_inotify_rm_watch; + + case aarch64_sys_migrate_pages: + return gdb_sys_migrate_pages; + + case aarch64_sys_pselect6: + return gdb_sys_pselect6; + + case aarch64_sys_ppoll: + return gdb_sys_ppoll; + + case aarch64_sys_unshare: + return gdb_sys_unshare; + + case aarch64_sys_set_robust_list: + return gdb_sys_set_robust_list; + + case aarch64_sys_get_robust_list: + return gdb_sys_get_robust_list; + + case aarch64_sys_splice: + return gdb_sys_splice; + + case aarch64_sys_tee: + return gdb_sys_tee; + + case aarch64_sys_sync_file_range: + return gdb_sys_sync_file_range; + + case aarch64_sys_vmsplice: + return gdb_sys_vmsplice; + + case aarch64_sys_move_pages: + return gdb_sys_move_pages; + + default: + return -1; + } +} + +/* Record all registers but PC register for process-record. */ + +static int +aarch64_all_but_pc_registers_record (struct regcache *regcache) +{ + int i; + + for (i = 0; i < AARCH64_PC_REGNUM; i++) + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM + i)) + return -1; + + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) + return -1; + + return 0; +} + +/* Handler for arm system call instruction recording. */ + +static int +aarch64_linux_syscall_record (struct regcache *regcache, unsigned long svc_number) +{ + int ret = 0; + enum gdb_syscall syscall_gdb; + + printf_unfiltered (_("syscall number %s\n"), + plongest (svc_number)); + syscall_gdb = aarch64_canonicalize_syscall (svc_number); + + if (syscall_gdb < 0) + { + printf_unfiltered (_("Process record and replay target doesn't " + "support syscall number %s\n"), + plongest (svc_number)); + return -1; + } + + if (syscall_gdb == gdb_sys_sigreturn + || syscall_gdb == gdb_sys_rt_sigreturn) + { + if (aarch64_all_but_pc_registers_record (regcache)) + return -1; + return 0; + } + + ret = record_linux_system_call (syscall_gdb, regcache, + &aarch64_linux_record_tdep); + if (ret != 0) + return ret; + + /* Record the return value of the system call. */ + if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM)) + return -1; + /* Record LR. */ + if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM)) + return -1; + /* Record CPSR. */ + if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) + return -1; + + return 0; +} + static void aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -404,6 +1153,170 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Reversible debugging, process record. */ set_gdbarch_process_record (gdbarch, aarch64_process_record); + /* Syscall record. */ + tdep->aarch64_syscall_record = aarch64_linux_syscall_record; + + /* Initialize the aarch64_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. */ + aarch64_linux_record_tdep.size_pointer + = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; + aarch64_linux_record_tdep.size__old_kernel_stat = 32; + aarch64_linux_record_tdep.size_tms = 32; + aarch64_linux_record_tdep.size_loff_t = 8; + aarch64_linux_record_tdep.size_flock = 32; + aarch64_linux_record_tdep.size_oldold_utsname = 45; + aarch64_linux_record_tdep.size_ustat = 32; + aarch64_linux_record_tdep.size_old_sigaction = 152; + aarch64_linux_record_tdep.size_old_sigset_t = 128; + aarch64_linux_record_tdep.size_rlimit = 16; + aarch64_linux_record_tdep.size_rusage = 144; + aarch64_linux_record_tdep.size_timeval = 16; + aarch64_linux_record_tdep.size_timezone = 8; + aarch64_linux_record_tdep.size_old_gid_t = 2; + aarch64_linux_record_tdep.size_old_uid_t = 2; + aarch64_linux_record_tdep.size_fd_set = 128; + aarch64_linux_record_tdep.size_dirent = 280; + aarch64_linux_record_tdep.size_dirent64 = 280; + aarch64_linux_record_tdep.size_statfs = 120; + aarch64_linux_record_tdep.size_statfs64 = 120; + aarch64_linux_record_tdep.size_sockaddr = 16; + aarch64_linux_record_tdep.size_int + = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT; + aarch64_linux_record_tdep.size_long + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; + aarch64_linux_record_tdep.size_ulong + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; + aarch64_linux_record_tdep.size_msghdr = 56; + aarch64_linux_record_tdep.size_itimerval = 32; + aarch64_linux_record_tdep.size_stat = 144; + aarch64_linux_record_tdep.size_old_utsname = 325; + aarch64_linux_record_tdep.size_sysinfo = 112; + aarch64_linux_record_tdep.size_msqid_ds = 120; + aarch64_linux_record_tdep.size_shmid_ds = 112; + aarch64_linux_record_tdep.size_new_utsname = 390; + aarch64_linux_record_tdep.size_timex = 208; + aarch64_linux_record_tdep.size_mem_dqinfo = 24; + aarch64_linux_record_tdep.size_if_dqblk = 72; + aarch64_linux_record_tdep.size_fs_quota_stat = 80; + aarch64_linux_record_tdep.size_timespec = 16; + aarch64_linux_record_tdep.size_pollfd = 8; + aarch64_linux_record_tdep.size_NFS_FHSIZE = 32; + aarch64_linux_record_tdep.size_knfsd_fh = 132; + aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16; + aarch64_linux_record_tdep.size_sigaction = 152; + aarch64_linux_record_tdep.size_sigset_t = 128; + aarch64_linux_record_tdep.size_siginfo_t = 128; + aarch64_linux_record_tdep.size_cap_user_data_t = 8; + aarch64_linux_record_tdep.size_stack_t = 24; + aarch64_linux_record_tdep.size_off_t = 8; + aarch64_linux_record_tdep.size_stat64 = 144; + aarch64_linux_record_tdep.size_gid_t = 4; + aarch64_linux_record_tdep.size_uid_t = 4; + aarch64_linux_record_tdep.size_PAGE_SIZE = 4096; + aarch64_linux_record_tdep.size_flock64 = 32; + aarch64_linux_record_tdep.size_user_desc = 16; + aarch64_linux_record_tdep.size_io_event = 32; + aarch64_linux_record_tdep.size_iocb = 64; + aarch64_linux_record_tdep.size_epoll_event = 12; + aarch64_linux_record_tdep.size_itimerspec = 32; + aarch64_linux_record_tdep.size_mq_attr = 64; + aarch64_linux_record_tdep.size_siginfo = 128; + aarch64_linux_record_tdep.size_termios = 60; + aarch64_linux_record_tdep.size_termios2 = 44; + aarch64_linux_record_tdep.size_pid_t = 4; + aarch64_linux_record_tdep.size_winsize = 8; + aarch64_linux_record_tdep.size_serial_struct = 72; + aarch64_linux_record_tdep.size_serial_icounter_struct = 80; + aarch64_linux_record_tdep.size_hayes_esp_config = 12; + aarch64_linux_record_tdep.size_size_t = 8; + aarch64_linux_record_tdep.size_iovec = 16; + + /* These values are the second argument of system call "sys_ioctl". + They are obtained from Linux Kernel source. */ + aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401; + aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402; + aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403; + aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404; + aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405; + aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406; + aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407; + aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408; + aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409; + aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a; + aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b; + aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c; + aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d; + aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e; + aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f; + aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410; + aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411; + aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412; + aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413; + aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414; + aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415; + aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416; + aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417; + aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418; + aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419; + aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a; + aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b; + aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b; + aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c; + aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d; + aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e; + aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f; + aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420; + aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421; + aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422; + aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423; + aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424; + aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425; + aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426; + aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427; + aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428; + aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429; + aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a; + aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b; + aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c; + aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d; + aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430; + aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431; + aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450; + aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451; + aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452; + aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453; + aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454; + aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455; + aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456; + aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457; + aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458; + aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459; + aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a; + aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b; + aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c; + aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d; + aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e; + aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f; + aarch64_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. */ + aarch64_linux_record_tdep.fcntl_F_GETLK = 5; + aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12; + aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13; + aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14; + + /* The AArch64 syscall calling convention: reg x0-x7 for arguments, + reg x8 for syscall number and return value in reg x0. */ + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0; + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1; + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2; + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; + aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4; + aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5; + aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6; + aarch64_linux_record_tdep.arg8 = AARCH64_X0_REGNUM + 7; } /* Provide a prototype to silence -Wmissing-prototypes. */ diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h index 2e1de60..1ae3786 100644 --- a/gdb/aarch64-linux-tdep.h +++ b/gdb/aarch64-linux-tdep.h @@ -32,3 +32,269 @@ extern const struct regset aarch64_linux_gregset; extern const struct regset aarch64_linux_fpregset; + +/* Enum that defines the AArch64 linux specific syscall identifiers used for + process record/replay. */ + +enum aarch64_syscall { + aarch64_sys_io_setup = 0, + aarch64_sys_io_destroy = 1, + aarch64_sys_io_submit = 2, + aarch64_sys_io_cancel = 3, + aarch64_sys_io_getevents = 4, + aarch64_sys_setxattr = 5, + aarch64_sys_lsetxattr = 6, + aarch64_sys_fsetxattr = 7, + aarch64_sys_getxattr = 8, + aarch64_sys_lgetxattr = 9, + aarch64_sys_fgetxattr = 10, + aarch64_sys_listxattr = 11, + aarch64_sys_llistxattr = 12, + aarch64_sys_flistxattr = 13, + aarch64_sys_removexattr = 14, + aarch64_sys_lremovexattr = 15, + aarch64_sys_fremovexattr = 16, + aarch64_sys_getcwd = 17, + aarch64_sys_lookup_dcookie = 18, + aarch64_sys_eventfd2 = 19, + aarch64_sys_epoll_create1 = 20, + aarch64_sys_epoll_ctl = 21, + aarch64_sys_epoll_pwait = 22, + aarch64_sys_dup = 23, + aarch64_sys_dup3 = 24, + aarch64_sys_fcntl = 25, + aarch64_sys_inotify_init1 = 26, + aarch64_sys_inotify_add_watch = 27, + aarch64_sys_inotify_rm_watch = 28, + aarch64_sys_ioctl = 29, + aarch64_sys_ioprio_set = 30, + aarch64_sys_ioprio_get = 31, + aarch64_sys_flock = 32, + aarch64_sys_mknod = 33, + aarch64_sys_mkdir = 34, + aarch64_sys_unlink = 35, + aarch64_sys_symlink = 36, + aarch64_sys_link = 37, + aarch64_sys_rename = 38, + aarch64_sys_umount2 = 39, + aarch64_sys_mount = 40, + aarch64_sys_pivot_root = 41, + aarch64_sys_nfsservctl = 42, + aarch64_sys_statfs = 43, + aarch64_sys_fstatfs = 44, + aarch64_sys_truncate = 45, + aarch64_sys_ftruncate = 46, + aarch64_sys_fallocate = 47, + aarch64_sys_faccess = 48, + aarch64_sys_chdir = 49, + aarch64_sys_fchdir = 50, + aarch64_sys_chroot = 51, + aarch64_sys_fchmod = 52, + aarch64_sys_fchmodat = 53, + aarch64_sys_fchownat = 54, + aarch64_sys_fchown = 55, + aarch64_sys_open = 56, + aarch64_sys_close = 57, + aarch64_sys_vhangup = 58, + aarch64_sys_pipe2 = 59, + aarch64_sys_quotactl = 60, + aarch64_sys_getdents64 = 61, + aarch64_sys_lseek = 62, + aarch64_sys_read = 63, + aarch64_sys_write = 64, + aarch64_sys_readv = 65, + aarch64_sys_writev = 66, + aarch64_sys_pread64 = 67, + aarch64_sys_pwrite64 = 68, + aarch64_sys_preadv = 69, + aarch64_sys_pwritev = 70, + aarch64_sys_sendfile = 71, + aarch64_sys_pselect6 = 72, + aarch64_sys_ppoll = 73, + aarch64_sys_signalfd4 = 74, + aarch64_sys_vmsplice = 75, + aarch64_sys_splice = 76, + aarch64_sys_tee = 77, + aarch64_sys_readlink = 78, + aarch64_sys_fstatat = 79, + aarch64_sys_fstat = 80, + aarch64_sys_sync = 81, + aarch64_sys_fsync = 82, + aarch64_sys_fdatasync = 83, + aarch64_sys_sync_file_range2 = 84, + aarch64_sys_sync_file_range = 84, + aarch64_sys_timerfd_create = 85, + aarch64_sys_timerfd_settime = 86, + aarch64_sys_timerfd_gettime = 87, + aarch64_sys_utimensat = 88, + aarch64_sys_acct = 89, + aarch64_sys_capget = 90, + aarch64_sys_capset = 91, + aarch64_sys_personality = 92, + aarch64_sys_exit = 93, + aarch64_sys_exit_group = 94, + aarch64_sys_waitid = 95, + aarch64_sys_set_tid_address = 96, + aarch64_sys_unshare = 97, + aarch64_sys_futex = 98, + aarch64_sys_set_robust_list = 99, + aarch64_sys_get_robust_list = 100, + aarch64_sys_nanosleep = 101, + aarch64_sys_getitimer = 102, + aarch64_sys_setitimer = 103, + aarch64_sys_kexec_load = 104, + aarch64_sys_init_module = 105, + aarch64_sys_delete_module = 106, + aarch64_sys_timer_create = 107, + aarch64_sys_timer_gettime = 108, + aarch64_sys_timer_getoverrun = 109, + aarch64_sys_timer_settime = 110, + aarch64_sys_timer_delete = 111, + aarch64_sys_clock_settime = 112, + aarch64_sys_clock_gettime = 113, + aarch64_sys_clock_getres = 114, + aarch64_sys_clock_nanosleep = 115, + aarch64_sys_syslog = 116, + aarch64_sys_ptrace = 117, + aarch64_sys_sched_setparam = 118, + aarch64_sys_sched_setscheduler = 119, + aarch64_sys_sched_getscheduler = 120, + aarch64_sys_sched_getparam = 121, + aarch64_sys_sched_setaffinity = 122, + aarch64_sys_sched_getaffinity = 123, + aarch64_sys_sched_yield = 124, + aarch64_sys_sched_get_priority_max = 125, + aarch64_sys_sched_get_priority_min = 126, + aarch64_sys_sched_rr_get_interval = 127, + aarch64_sys_kill = 129, + aarch64_sys_tkill = 130, + aarch64_sys_tgkill = 131, + aarch64_sys_sigaltstack = 132, + aarch64_sys_rt_sigsuspend = 133, + aarch64_sys_rt_sigaction = 134, + aarch64_sys_rt_sigprocmask = 135, + aarch64_sys_rt_sigpending = 136, + aarch64_sys_rt_sigtimedwait = 137, + aarch64_sys_rt_sigqueueinfo = 138, + aarch64_sys_rt_sigreturn = 139, + aarch64_sys_setpriority = 140, + aarch64_sys_getpriority = 141, + aarch64_sys_reboot = 142, + aarch64_sys_setregid = 143, + aarch64_sys_setgid = 144, + aarch64_sys_setreuid = 145, + aarch64_sys_setuid = 146, + aarch64_sys_setresuid = 147, + aarch64_sys_getresuid = 148, + aarch64_sys_setresgid = 149, + aarch64_sys_getresgid = 150, + aarch64_sys_setfsuid = 151, + aarch64_sys_setfsgid = 152, + aarch64_sys_times = 153, + aarch64_sys_setpgid = 154, + aarch64_sys_getpgid = 155, + aarch64_sys_getsid = 156, + aarch64_sys_setsid = 157, + aarch64_sys_getgroups = 158, + aarch64_sys_setgroups = 159, + aarch64_sys_uname = 160, + aarch64_sys_sethostname = 161, + aarch64_sys_setdomainname = 162, + aarch64_sys_getrlimit = 163, + aarch64_sys_setrlimit = 164, + aarch64_sys_getrusage = 165, + aarch64_sys_umask = 166, + aarch64_sys_prctl = 167, + aarch64_sys_getcpu = 168, + aarch64_sys_gettimeofday = 169, + aarch64_sys_settimeofday = 170, + aarch64_sys_adjtimex = 171, + aarch64_sys_getpid = 172, + aarch64_sys_getppid = 173, + aarch64_sys_getuid = 174, + aarch64_sys_geteuid = 175, + aarch64_sys_getgid = 176, + aarch64_sys_getegid = 177, + aarch64_sys_gettid = 178, + aarch64_sys_sysinfo = 179, + aarch64_sys_mq_open = 180, + aarch64_sys_mq_unlink = 181, + aarch64_sys_mq_timedsend = 182, + aarch64_sys_mq_timedreceive = 183, + aarch64_sys_mq_notify = 184, + aarch64_sys_mq_getsetattr = 185, + aarch64_sys_msgget = 186, + aarch64_sys_msgctl = 187, + aarch64_sys_msgrcv = 188, + aarch64_sys_msgsnd = 189, + aarch64_sys_semget = 190, + aarch64_sys_semctl = 191, + aarch64_sys_semtimedop = 192, + aarch64_sys_semop = 193, + aarch64_sys_shmget = 194, + aarch64_sys_shmctl = 195, + aarch64_sys_shmat = 196, + aarch64_sys_shmdt = 197, + aarch64_sys_socket = 198, + aarch64_sys_socketpair = 199, + aarch64_sys_bind = 200, + aarch64_sys_listen = 201, + aarch64_sys_accept = 202, + aarch64_sys_connect = 203, + aarch64_sys_getsockname = 204, + aarch64_sys_getpeername = 205, + aarch64_sys_sendto = 206, + aarch64_sys_recvfrom = 207, + aarch64_sys_setsockopt = 208, + aarch64_sys_getsockopt = 209, + aarch64_sys_shutdown = 210, + aarch64_sys_sendmsg = 211, + aarch64_sys_recvmsg = 212, + aarch64_sys_readahead = 213, + aarch64_sys_brk = 214, + aarch64_sys_munmap = 215, + aarch64_sys_mremap = 216, + aarch64_sys_add_key = 217, + aarch64_sys_request_key = 218, + aarch64_sys_keyctl = 219, + aarch64_sys_clone = 220, + aarch64_sys_execve = 221, + aarch64_sys_mmap = 222, + aarch64_sys_fadvise64 = 223, + aarch64_sys_swapon = 224, + aarch64_sys_swapoff = 225, + aarch64_sys_mprotect = 226, + aarch64_sys_msync = 227, + aarch64_sys_mlock = 228, + aarch64_sys_munlock = 229, + aarch64_sys_mlockall = 230, + aarch64_sys_munlockall = 231, + aarch64_sys_mincore = 232, + aarch64_sys_madvise = 233, + aarch64_sys_remap_file_pages = 234, + aarch64_sys_mbind = 235, + aarch64_sys_get_mempolicy = 236, + aarch64_sys_set_mempolicy = 237, + aarch64_sys_migrate_pages = 238, + aarch64_sys_move_pages = 239, + aarch64_sys_rt_tgsigqueueinfo = 240, + aarch64_sys_perf_event_open = 241, + aarch64_sys_accept4 = 242, + aarch64_sys_recvmmsg = 243, + aarch64_sys_wait4 = 260, + aarch64_sys_prlimit64 = 261, + aarch64_sys_fanotify_init = 262, + aarch64_sys_fanotify_mark = 263, + aarch64_sys_name_to_handle_at = 264, + aarch64_sys_open_by_handle_at = 265, + aarch64_sys_clock_adjtime = 266, + aarch64_sys_syncfs = 267, + aarch64_sys_setns = 268, + aarch64_sys_sendmmsg = 269, + aarch64_sys_process_vm_readv = 270, + aarch64_sys_process_vm_writev = 271, + aarch64_sys_kcmp = 272, + aarch64_sys_finit_module = 273, + aarch64_sys_sched_setattr = 274, + aarch64_sys_sched_getattr = 275, +}; diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 0847585..c6da25a 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -2941,7 +2941,20 @@ aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r) { /* Exception generation instructions. */ if (insn_bits24_27 == 0x04) - return AARCH64_RECORD_UNSUPPORTED; + { + if (!bits (aarch64_insn_r->aarch64_insn, 2, 4) && + !bits (aarch64_insn_r->aarch64_insn, 21, 23) && + bits (aarch64_insn_r->aarch64_insn, 0, 1) == 0x01) + { + ULONGEST svc_number; + regcache_raw_read_unsigned (aarch64_insn_r->regcache, 8, + &svc_number); + return tdep->aarch64_syscall_record (aarch64_insn_r->regcache, + svc_number); + } + else + return AARCH64_RECORD_UNSUPPORTED; + } /* System instructions. */ else if (insn_bits24_27 == 0x05 && insn_bits22_23 == 0x00) { diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index 1d74ef8..25751fe 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -88,6 +88,9 @@ struct gdbarch_tdep struct type *vns_type; struct type *vnh_type; struct type *vnb_type; + + /* syscall record. */ + int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number); }; /* AArch64 process record-replay related structures, defines etc. */ diff --git a/gdb/linux-record.h b/gdb/linux-record.h index 7b5218e..2649ce5 100644 --- a/gdb/linux-record.h +++ b/gdb/linux-record.h @@ -174,6 +174,8 @@ struct linux_record_tdep int arg4; int arg5; int arg6; + int arg7; + int arg8; }; /* Enum that defines the gdb-canonical set of Linux syscall identifiers.