aboutsummaryrefslogtreecommitdiff
path: root/gdb/nat/aarch64-linux.c
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2015-09-15 10:25:51 +0100
committerYao Qi <yao.qi@linaro.org>2015-09-15 10:25:51 +0100
commitade90bdeb78ccaeb294e34af04751f2f649a324f (patch)
tree6e287b95a6130b9c3cf4fa4438edc01b6d169e74 /gdb/nat/aarch64-linux.c
parentafa18d267a8cdc61b2c96b98af8c217f92516dc6 (diff)
downloadgdb-ade90bdeb78ccaeb294e34af04751f2f649a324f.zip
gdb-ade90bdeb78ccaeb294e34af04751f2f649a324f.tar.gz
gdb-ade90bdeb78ccaeb294e34af04751f2f649a324f.tar.bz2
aarch64 multi-arch support (part 2): siginfo fixup
This patch is to fixup the siginfo_t when aarch64 gdb or gdbserver read from or write to the arm inferior. It is to convert the "struct siginfo_t" between aarch64 and arm, which is quite mechanical. gdb/gdbserver: 2015-09-15 Yao Qi <yao.qi@linaro.org> * linux-aarch64-low.c (aarch64_linux_siginfo_fixup): New function. (struct linux_target_ops the_low_target): Install aarch64_linux_siginfo_fixup. gdb: 2015-09-15 Yao Qi <yao.qi@linaro.org> * aarch64-linux-nat.c (aarch64_linux_siginfo_fixup): New function. (_initialize_aarch64_linux_nat): Call linux_nat_set_siginfo_fixup. * nat/aarch64-linux.c (aarch64_compat_siginfo_from_siginfo): New function. (aarch64_siginfo_from_compat_siginfo): New function. * nat/aarch64-linux.h: Include signal.h. (compat_int_t, compat_uptr_t, compat_time_t): Typedef. (compat_timer_t, compat_clock_t): Likewise. (struct compat_timeval): New. (union compat_sigval): New. (struct compat_siginfo): New. (cpt_si_pid, cpt_si_uid, cpt_si_timerid): New macros. (cpt_si_overrun, cpt_si_status, cpt_si_utime): Likewise. (cpt_si_stime, cpt_si_ptr, cpt_si_addr): Likewise. (cpt_si_band, cpt_si_fd): Likewise.
Diffstat (limited to 'gdb/nat/aarch64-linux.c')
-rw-r--r--gdb/nat/aarch64-linux.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/gdb/nat/aarch64-linux.c b/gdb/nat/aarch64-linux.c
index ba94b00..0634094 100644
--- a/gdb/nat/aarch64-linux.c
+++ b/gdb/nat/aarch64-linux.c
@@ -78,3 +78,120 @@ aarch64_linux_new_thread (struct lwp_info *lwp)
lwp_set_arch_private_info (lwp, info);
}
+
+/* Convert native siginfo FROM to the siginfo in the layout of the
+ inferior's architecture TO. */
+
+void
+aarch64_compat_siginfo_from_siginfo (compat_siginfo_t *to, siginfo_t *from)
+{
+ memset (to, 0, sizeof (*to));
+
+ to->si_signo = from->si_signo;
+ to->si_errno = from->si_errno;
+ to->si_code = from->si_code;
+
+ if (to->si_code == SI_TIMER)
+ {
+ to->cpt_si_timerid = from->si_timerid;
+ to->cpt_si_overrun = from->si_overrun;
+ to->cpt_si_ptr = (intptr_t) from->si_ptr;
+ }
+ else if (to->si_code == SI_USER)
+ {
+ to->cpt_si_pid = from->si_pid;
+ to->cpt_si_uid = from->si_uid;
+ }
+ else if (to->si_code < 0)
+ {
+ to->cpt_si_pid = from->si_pid;
+ to->cpt_si_uid = from->si_uid;
+ to->cpt_si_ptr = (intptr_t) from->si_ptr;
+ }
+ else
+ {
+ switch (to->si_signo)
+ {
+ case SIGCHLD:
+ to->cpt_si_pid = from->si_pid;
+ to->cpt_si_uid = from->si_uid;
+ to->cpt_si_status = from->si_status;
+ to->cpt_si_utime = from->si_utime;
+ to->cpt_si_stime = from->si_stime;
+ break;
+ case SIGILL:
+ case SIGFPE:
+ case SIGSEGV:
+ case SIGBUS:
+ to->cpt_si_addr = (intptr_t) from->si_addr;
+ break;
+ case SIGPOLL:
+ to->cpt_si_band = from->si_band;
+ to->cpt_si_fd = from->si_fd;
+ break;
+ default:
+ to->cpt_si_pid = from->si_pid;
+ to->cpt_si_uid = from->si_uid;
+ to->cpt_si_ptr = (intptr_t) from->si_ptr;
+ break;
+ }
+ }
+}
+
+/* Convert inferior's architecture siginfo FROM to native siginfo TO. */
+
+void
+aarch64_siginfo_from_compat_siginfo (siginfo_t *to, compat_siginfo_t *from)
+{
+ memset (to, 0, sizeof (*to));
+
+ to->si_signo = from->si_signo;
+ to->si_errno = from->si_errno;
+ to->si_code = from->si_code;
+
+ if (to->si_code == SI_TIMER)
+ {
+ to->si_timerid = from->cpt_si_timerid;
+ to->si_overrun = from->cpt_si_overrun;
+ to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
+ }
+ else if (to->si_code == SI_USER)
+ {
+ to->si_pid = from->cpt_si_pid;
+ to->si_uid = from->cpt_si_uid;
+ }
+ if (to->si_code < 0)
+ {
+ to->si_pid = from->cpt_si_pid;
+ to->si_uid = from->cpt_si_uid;
+ to->si_ptr = (void *) (intptr_t) from->cpt_si_ptr;
+ }
+ else
+ {
+ switch (to->si_signo)
+ {
+ case SIGCHLD:
+ to->si_pid = from->cpt_si_pid;
+ to->si_uid = from->cpt_si_uid;
+ to->si_status = from->cpt_si_status;
+ to->si_utime = from->cpt_si_utime;
+ to->si_stime = from->cpt_si_stime;
+ break;
+ case SIGILL:
+ case SIGFPE:
+ case SIGSEGV:
+ case SIGBUS:
+ to->si_addr = (void *) (intptr_t) from->cpt_si_addr;
+ break;
+ case SIGPOLL:
+ to->si_band = from->cpt_si_band;
+ to->si_fd = from->cpt_si_fd;
+ break;
+ default:
+ to->si_pid = from->cpt_si_pid;
+ to->si_uid = from->cpt_si_uid;
+ to->si_ptr = (void* ) (intptr_t) from->cpt_si_ptr;
+ break;
+ }
+ }
+}