From patchwork Mon May 11 07:26:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Omair Javaid X-Patchwork-Id: 48222 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-la0-f70.google.com (mail-la0-f70.google.com [209.85.215.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 639632121F for ; Mon, 11 May 2015 07:28:06 +0000 (UTC) Received: by lamp14 with SMTP id p14sf39340749lam.3 for ; Mon, 11 May 2015 00:28:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:mailing-list :precedence:list-id:list-unsubscribe:list-subscribe:list-archive :list-post:list-help:sender:delivered-to:from:to:subject:date :message-id:in-reply-to:references:x-original-sender :x-original-authentication-results; bh=h5RFJ+2u7AKJkeJqFKBVnL5YrrhhQSWWYtkiABxKlf0=; b=BJXhi/cIGUZ5tiNtVKDww0j4Bi8J+do0QYSGsbuGZNtRIXjWyW5upkcZMQHWYW9x7L se7Hm0z7DjhT+n2Mxz3198CoMCnHtHOdDWrsH2RIFW8asgOTGJIFMYa5/rzPCT3C8zLn w3tcJB3YguK/bxaWYbwldtmsB4Ln/PLI0U3jI7tEOsejCpH+LDdfGCsCgmOYpgZ/FXkk w2Hq7UJjIf2LQ/IMRE5j0sa1N/6LfU73ytuxAEYq/AWdaDy6VDf2Mz7SVB27SnPi5Vdd Jt64f3drF53Czo24klYh1rMx/YohBK+hxiz2THM9nADF4rgVX+fyDQ/mk8IC9v7x1OcU lIRg== X-Gm-Message-State: ALoCoQlNw7/4zSeH6Tpxxxwgce17o5iwFXCG+jTds/NTQnqi1seHWaKSbfLNRZHVy9fbXOPLgyPU X-Received: by 10.112.171.41 with SMTP id ar9mr6655026lbc.24.1431329285301; Mon, 11 May 2015 00:28:05 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.204.103 with SMTP id kx7ls610199lac.62.gmail; Mon, 11 May 2015 00:28:05 -0700 (PDT) X-Received: by 10.152.120.106 with SMTP id lb10mr6861781lab.92.1431329285119; Mon, 11 May 2015 00:28:05 -0700 (PDT) Received: from mail-lb0-x22c.google.com (mail-lb0-x22c.google.com. [2a00:1450:4010:c04::22c]) by mx.google.com with ESMTPS id ys9si7879462lab.63.2015.05.11.00.28.05 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 May 2015 00:28:05 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::22c as permitted sender) client-ip=2a00:1450:4010:c04::22c; Received: by lbbqq2 with SMTP id qq2so87696013lbb.3 for ; Mon, 11 May 2015 00:28:05 -0700 (PDT) X-Received: by 10.112.204.104 with SMTP id kx8mr6964115lbc.72.1431329284982; Mon, 11 May 2015 00:28:04 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.108.230 with SMTP id hn6csp1350013lbb; Mon, 11 May 2015 00:28:03 -0700 (PDT) X-Received: by 10.68.69.35 with SMTP id b3mr16986761pbu.96.1431329282473; Mon, 11 May 2015 00:28:02 -0700 (PDT) Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id w2si16880120pdg.162.2015.05.11.00.28.01 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 May 2015 00:28:02 -0700 (PDT) Received-SPF: pass (google.com: domain of gdb-patches-return-122772-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Received: (qmail 29912 invoked by alias); 11 May 2015 07:27:25 -0000 Mailing-List: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org Precedence: list List-Id: List-Unsubscribe: , List-Subscribe: List-Archive: List-Post: , List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 29776 invoked by uid 89); 11 May 2015 07:27:25 -0000 X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-wg0-f50.google.com Received: from mail-wg0-f50.google.com (HELO mail-wg0-f50.google.com) (74.125.82.50) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Mon, 11 May 2015 07:27:18 +0000 Received: by wgin8 with SMTP id n8so119397567wgi.0 for ; Mon, 11 May 2015 00:27:15 -0700 (PDT) X-Received: by 10.194.172.72 with SMTP id ba8mr17711913wjc.136.1431329235133; Mon, 11 May 2015 00:27:15 -0700 (PDT) Received: from localhost.localdomain ([39.34.108.78]) by mx.google.com with ESMTPSA id gj7sm11843691wib.4.2015.05.11.00.27.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 11 May 2015 00:27:14 -0700 (PDT) From: Omair Javaid To: gdb-patches@sourceware.org Subject: [PATCH v5 3/6] Support for recording syscall on aarch64-linux Date: Mon, 11 May 2015 12:26:57 +0500 Message-Id: <1431329220-13019-4-git-send-email-omair.javaid@linaro.org> In-Reply-To: <1431329220-13019-1-git-send-email-omair.javaid@linaro.org> References: <1422967649-17436-1-git-send-email-omair.javaid@linaro.org> <1431329220-13019-1-git-send-email-omair.javaid@linaro.org> X-IsSubscribed: yes X-Original-Sender: omair.javaid@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::22c as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org; dkim=pass header.i=@sourceware.org X-Google-Group-Id: 836684582541 Most of suggestion have been incorporated. However I wasnt able to find a better way to translate syscall numbers from aarch64 to canonical. Also arm v8 abi standard has x7 as an argument register. So i havnt changed that as well. enum aarch64_syscall is still residing in aarch64-linux-tdep.h because if found that similar enums for other architectures are also defined in header files. gdb: 2015-05-11 Omair Javaid * aarch64-linux-tdep.c (linux-record.h): Include. (record-full.h): Include. (struct linux_record_tdep aarch64_linux_record_tdep): Declare. (aarch64_canonicalize_syscall): New function. (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) : Defined. * linux-record.h (struct linux_record_tdep): Add two more syscall argument fields. * configure.tgt: Add linux-record.o to gdb_target_obs. --- gdb/aarch64-linux-tdep.c | 914 +++++++++++++++++++++++++++++++++++++++++++++++ gdb/aarch64-linux-tdep.h | 266 ++++++++++++++ gdb/aarch64-tdep.c | 16 +- gdb/aarch64-tdep.h | 3 + gdb/configure.tgt | 2 +- gdb/linux-record.h | 2 + 6 files changed, 1201 insertions(+), 2 deletions(-) diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index e579858..ad2d0e2 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -42,6 +42,9 @@ #include "xml-syscall.h" #include +#include "record-full.h" +#include "linux-record.h" + /* Signal frame handling. +------------+ ^ @@ -364,6 +367,753 @@ aarch64_linux_get_syscall_number (struct gdbarch *gdbarch, return ret; } +/* 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; + + case aarch64_sys_mmap: + return gdb_sys_mmap2; + + 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 = AARCH64_X0_REGNUM; i < AARCH64_PC_REGNUM; i++) + if (record_full_arch_list_add_reg (regcache, 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; + + 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) { @@ -411,6 +1161,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; /* `catch syscall' */ set_xml_syscall_file_name (gdbarch, "syscalls/aarch64-linux.xml"); diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h index 9d09ae6..4475f2e 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 3c29f43..9905552 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -2991,6 +2991,7 @@ aarch64_record_data_proc_imm (insn_decode_record *aarch64_insn_r) static unsigned int aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r) { + struct gdbarch_tdep *tdep = gdbarch_tdep (aarch64_insn_r->gdbarch); uint8_t insn_bits24_27, insn_bits28_31, insn_bits22_23; uint32_t record_buf[4]; @@ -3002,7 +3003,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 0a8bb26..af209a9 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); }; extern struct target_desc *tdesc_aarch64; diff --git a/gdb/configure.tgt b/gdb/configure.tgt index 8feda7c..4e4d6a9 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -45,7 +45,7 @@ aarch64*-*-linux*) # Target: AArch64 linux gdb_target_obs="aarch64-tdep.o aarch64-linux-tdep.o \ glibc-tdep.o linux-tdep.o solib-svr4.o \ - symfile-mem.o" + symfile-mem.o linux-record.o" build_gdbserver=yes ;; diff --git a/gdb/linux-record.h b/gdb/linux-record.h index ab39cb9..34dad52 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.