Message ID | 1401898871-2270-6-git-send-email-omair.javaid@linaro.org |
---|---|
State | New |
Headers | show |
On 4 June 2014 17:21, Omair Javaid <omair.javaid@linaro.org> wrote: > This patch adds support for recording system call instruction on aarch64-linux > targets. > > gdb: > > 2014-06-04 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): Declared. > (aarch64_canonicalize_syscall): New function. > (aarch64_all_but_pc_registers_record): New function. > (aarch64_linux_syscall_record): New function. > (aarch64_linux_init_abi): Updated. > * aarch64-linux-tdep.h (aarch64_syscall): New enum. > * aarch64-tdep.c (aarch64_record_branch_except_sys): Updated. > * aarch64-tdep.h > (struct gdbarch_tdep) <aarch64_syscall_record>: Defined. > > --- > gdb/aarch64-linux-tdep.c | 924 +++++++++++++++++++++++++++++++++++++++++++++++ > gdb/aarch64-linux-tdep.h | 266 ++++++++++++++ > gdb/aarch64-tdep.c | 15 +- > gdb/aarch64-tdep.h | 3 + > 4 files changed, 1207 insertions(+), 1 deletion(-) > > diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c > index dece0c3..6d9a3bf 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" > + > /* The general-purpose regset consists of 31 X registers, plus SP, PC, > and PSTATE registers, as defined in the AArch64 port of the Linux > kernel. */ > @@ -421,6 +424,769 @@ aarch64_stap_parse_special_token (struct gdbarch *gdbarch, > return 1; > } > > +/* Aarch64 process record-replay constructs: syscall, signal etc. */ To be precise it is "AArch64". > + > +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_mmap: > + return gdb_sys_mmap2; > + > + 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_dup3: > + return gdb_sys_dup2; > + > + 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_sendfile64; > + > + 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_chmod; > + > + case aarch64_sys_fchmod: > + return gdb_sys_fchmod; > + > + case aarch64_sys_fchownat: > + return gdb_sys_chown; > + > + 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_umount2: > + return gdb_sys_umount; > + > + 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_time; Should this be 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_wait; > + > + case aarch64_sys_epoll_ctl: > + return gdb_sys_epoll_ctl; > + > + case aarch64_sys_tgkill: > + return gdb_sys_tgkill; > + > + case aarch64_sys_utimensat: > + return gdb_sys_utimes; > + > + 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_fanotify_init: > + return gdb_sys_inotify_init; > + > + 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. */ Comment needs updating. > + > +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) > { > @@ -471,6 +1237,164 @@ 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; > + > + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 1; > + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 2; > + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 3; > + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; Should there be arg5 and arg6 here too? > } > > /* Provide a prototype to silence -Wmissing-prototypes. */ > diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h > index e3d7ed7..b199726 100644 > --- a/gdb/aarch64-linux-tdep.h > +++ b/gdb/aarch64-linux-tdep.h > @@ -38,3 +38,269 @@ extern void aarch64_linux_supply_fpregset (const struct regset *regset, > extern void aarch64_linux_collect_fpregset (const struct regset *regset, > const struct regcache *regcache, > int regnum, void *fpregs_buf, size_t len); > + > +/* 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 bb533b2..2e2dc15 100644 > --- a/gdb/aarch64-tdep.c > +++ b/gdb/aarch64-tdep.c > @@ -2943,7 +2943,20 @@ aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r) > { > /* Exception generation instructions. */ > if (insn_bits24_27 == 0x04) > - return AARCH64_RECORD_USUPPORTED; > + { > + 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_USUPPORTED; > + } > /* 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 8a193f4..21c3bd3 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); Should this use ULONGEST instead of unsigned long? On 32bit architectures they are different sizes.
On Wed, Jun 04 2014, Omair Javaid wrote: > This patch adds support for recording system call instruction on aarch64-linux > targets. > > [...] > @@ -471,6 +1237,164 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) > [...] > + > + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 1; > + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 2; > + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 3; > + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; Is this a typo? Otherwise the reason for this specialty should be documented in a comment here, IMO.
On 6 June 2014 20:58, Andreas Arnez <arnez@linux.vnet.ibm.com> wrote: > On Wed, Jun 04 2014, Omair Javaid wrote: > >> This patch adds support for recording system call instruction on aarch64-linux >> targets. >> >> [...] >> @@ -471,6 +1237,164 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >> [...] >> + >> + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 1; >> + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 2; >> + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 3; >> + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; > > Is this a typo? Otherwise the reason for this specialty should be > documented in a comment here, IMO. > After a bit of digging up found out that AArch64 system calls take between 0 and 7 arguments in register x1 to x7. I will update this change with comment in upcoming update to this patch.
diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index dece0c3..6d9a3bf 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" + /* The general-purpose regset consists of 31 X registers, plus SP, PC, and PSTATE registers, as defined in the AArch64 port of the Linux kernel. */ @@ -421,6 +424,769 @@ 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_mmap: + return gdb_sys_mmap2; + + 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_dup3: + return gdb_sys_dup2; + + 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_sendfile64; + + 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_chmod; + + case aarch64_sys_fchmod: + return gdb_sys_fchmod; + + case aarch64_sys_fchownat: + return gdb_sys_chown; + + 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_umount2: + return gdb_sys_umount; + + 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_time; + + 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_wait; + + case aarch64_sys_epoll_ctl: + return gdb_sys_epoll_ctl; + + case aarch64_sys_tgkill: + return gdb_sys_tgkill; + + case aarch64_sys_utimensat: + return gdb_sys_utimes; + + 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_fanotify_init: + return gdb_sys_inotify_init; + + 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) { @@ -471,6 +1237,164 @@ 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; + + aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 1; + aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 2; + aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 3; + aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3; } /* Provide a prototype to silence -Wmissing-prototypes. */ diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h index e3d7ed7..b199726 100644 --- a/gdb/aarch64-linux-tdep.h +++ b/gdb/aarch64-linux-tdep.h @@ -38,3 +38,269 @@ extern void aarch64_linux_supply_fpregset (const struct regset *regset, extern void aarch64_linux_collect_fpregset (const struct regset *regset, const struct regcache *regcache, int regnum, void *fpregs_buf, size_t len); + +/* 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 bb533b2..2e2dc15 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -2943,7 +2943,20 @@ aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r) { /* Exception generation instructions. */ if (insn_bits24_27 == 0x04) - return AARCH64_RECORD_USUPPORTED; + { + 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_USUPPORTED; + } /* 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 8a193f4..21c3bd3 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. */