summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--backends/ChangeLog7
-rw-r--r--backends/Makefile.am3
-rw-r--r--backends/aarch64_corenote.c3
-rw-r--r--backends/aarch64_init.c6
-rw-r--r--backends/aarch64_initreg.c87
-rw-r--r--tests/ChangeLog7
-rw-r--r--tests/Makefile.am3
-rw-r--r--tests/backtrace.aarch64.core.bz2bin0 -> 7865 bytes
-rwxr-xr-xtests/backtrace.aarch64.exec.bz2bin0 -> 370058 bytes
-rwxr-xr-xtests/run-backtrace-core-aarch64.sh23
10 files changed, 137 insertions, 2 deletions
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 38a433d8..bfe23019 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,10 @@
+2014-04-09 Mark Wielaard <[email protected]>
+
+ * Makefile.am (aarch64_SRCS): Add aarch64_initreg.c.
+ * aarch64_corenote.c (prstatus_regs): Mark pc_register.
+ * aarch64_init.c: Assign frame_nregs. Hook set_initial_registers_tid.
+ * aarch64_initreg: New file.
+
2014-03-28 Jean Pihet <[email protected]>
* arm_initreg.c (arm_set_initial_registers_tid): Handle compat mode.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 4129eee5..49593ac0 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -83,7 +83,8 @@ libebl_arm_pic_a_SOURCES = $(arm_SRCS)
am_libebl_arm_pic_a_OBJECTS = $(arm_SRCS:.c=.os)
aarch64_SRCS = aarch64_init.c aarch64_regs.c aarch64_symbol.c \
- aarch64_corenote.c aarch64_retval.c aarch64_cfi.c
+ aarch64_corenote.c aarch64_retval.c aarch64_cfi.c \
+ aarch64_initreg.c
libebl_aarch64_pic_a_SOURCES = $(aarch64_SRCS)
am_libebl_aarch64_pic_a_OBJECTS = $(aarch64_SRCS:.c=.os)
diff --git a/backends/aarch64_corenote.c b/backends/aarch64_corenote.c
index 8f5b9d5d..9b424859 100644
--- a/backends/aarch64_corenote.c
+++ b/backends/aarch64_corenote.c
@@ -64,7 +64,8 @@ static const Ebl_Register_Location prstatus_regs[] =
.name = "pc", .type = ELF_T_XWORD, .format = 'x', \
.offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \
+ PRSTATUS_REGS_SIZE - 16), \
- .group = "register" \
+ .group = "register", \
+ .pc_register = true \
}, \
{ \
.name = "pstate", .type = ELF_T_XWORD, .format = 'x', \
diff --git a/backends/aarch64_init.c b/backends/aarch64_init.c
index a1a70606..b0fd17a7 100644
--- a/backends/aarch64_init.c
+++ b/backends/aarch64_init.c
@@ -59,5 +59,11 @@ aarch64_init (elf, machine, eh, ehlen)
HOOK (eh, check_special_symbol);
HOOK (eh, abi_cfi);
+ /* X0-X30 (31 regs) + SP + 1 Reserved + ELR, 30 Reserved regs (34-43)
+ + V0-V31 (32 regs, least significant 64 bits only)
+ + ALT_FRAME_RETURN_COLUMN (used when LR isn't used) = 97 DWARF regs. */
+ eh->frame_nregs = 97;
+ HOOK (eh, set_initial_registers_tid);
+
return MODVERSION;
}
diff --git a/backends/aarch64_initreg.c b/backends/aarch64_initreg.c
new file mode 100644
index 00000000..2492d561
--- /dev/null
+++ b/backends/aarch64_initreg.c
@@ -0,0 +1,87 @@
+/* Fetch live process registers from TID.
+ Copyright (C) 2013 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "system.h"
+#include <assert.h>
+#ifdef __aarch64__
+# include <linux/uio.h>
+# include <sys/user.h>
+# include <sys/ptrace.h>
+#endif
+
+#define BACKEND aarch64_
+#include "libebl_CPU.h"
+
+bool
+aarch64_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
+ ebl_tid_registers_t *setfunc __attribute__ ((unused)),
+ void *arg __attribute__ ((unused)))
+{
+#ifndef __aarch64__
+ return false;
+#else /* __aarch64__ */
+
+ /* General registers. */
+ struct user_pt_regs gregs;
+ struct iovec iovec;
+ iovec.iov_base = &gregs;
+ iovec.iov_len = sizeof (gregs);
+ if (ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iovec) != 0)
+ return false;
+
+ /* X0..X30 plus SP. */
+ if (! setfunc (0, 32, (Dwarf_Word *) &gregs.regs[0], arg))
+ return false;
+
+ /* PC. */
+ if (! setfunc (-1, 1, (Dwarf_Word *) &gregs.pc, arg))
+ return false;
+
+ /* ELR cannot be found. */
+
+ /* FP registers (only 64bits are used). */
+ struct user_fpsimd_state fregs;
+ iovec.iov_base = &fregs;
+ iovec.iov_len = sizeof (fregs);
+ if (ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iovec) != 0)
+ return false;
+
+ Dwarf_Word dwarf_fregs[32];
+ for (int r = 0; r < 32; r++)
+ dwarf_fregs[r] = fregs.vregs[r] & 0xFFFFFFFF;
+
+ if (! setfunc (64, 32, dwarf_fregs, arg))
+ return false;
+
+ return true;
+#endif /* __aarch64__ */
+}
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 9b0e7ace..776ea66f 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,10 @@
+2014-04-09 Mark Wielaard <[email protected]>
+
+ * Makefile.am (TESTS): Add run-backtrace-core-aarch64.sh.
+ (EXTRA_DIST): Add run-backtrace-core-aarch64.sh,
+ backtrace.aarch64.core.bz2 and backtrace.aarch64.exec.bz2.
+ * run-backtrace-core-aarch64.sh: New test.
+
2014-03-11 Josh Stone <[email protected]>
* testfilebaxmin.bz2: New testfile.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5e640955..698e2cfa 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -108,6 +108,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
run-backtrace-native-core-biarch.sh run-backtrace-core-x86_64.sh \
run-backtrace-core-i386.sh run-backtrace-core-ppc.sh \
run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \
+ run-backtrace-core-aarch64.sh \
run-backtrace-demangle.sh run-stack-d-test.sh run-stack-i-test.sh
if !BIARCH
@@ -262,6 +263,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
backtrace.s390x.core.bz2 backtrace.s390x.exec.bz2 \
backtrace.s390.core.bz2 backtrace.s390.exec.bz2 \
run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \
+ run-backtrace-core-aarch64.sh \
+ backtrace.aarch64.core.bz2 backtrace.aarch64.exec.bz2 \
run-backtrace-demangle.sh testfile-backtrace-demangle.bz2 \
testfile-backtrace-demangle.cc \
testfile-backtrace-demangle.core.bz2 \
diff --git a/tests/backtrace.aarch64.core.bz2 b/tests/backtrace.aarch64.core.bz2
new file mode 100644
index 00000000..3082a5ac
--- /dev/null
+++ b/tests/backtrace.aarch64.core.bz2
Binary files differ
diff --git a/tests/backtrace.aarch64.exec.bz2 b/tests/backtrace.aarch64.exec.bz2
new file mode 100755
index 00000000..66216b52
--- /dev/null
+++ b/tests/backtrace.aarch64.exec.bz2
Binary files differ
diff --git a/tests/run-backtrace-core-aarch64.sh b/tests/run-backtrace-core-aarch64.sh
new file mode 100755
index 00000000..a29a6613
--- /dev/null
+++ b/tests/run-backtrace-core-aarch64.sh
@@ -0,0 +1,23 @@
+#! /bin/bash
+# Copyright (C) 2013 Red Hat, Inc.
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# elfutils is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/backtrace-subr.sh
+
+# backtrace.aarch64.exe is a -static binary of backtrace-child.
+# backtrace.aarch64.core was generated by running the static backtrace-child
+# with --gencore.
+check_core aarch64