]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
backends: Add aarch64 native and core unwind support.
authorMark Wielaard <mjw@redhat.com>
Wed, 9 Apr 2014 09:48:23 +0000 (11:48 +0200)
committerMark Wielaard <mjw@redhat.com>
Mon, 14 Apr 2014 09:31:28 +0000 (11:31 +0200)
Add aarch64 backend functions frame_nregs and set_initial_registers_tid.
Mark pc_register in aarch64 prstatus_regs as pc_register.
Add backtrace-core-aarch64 testcase.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
backends/ChangeLog
backends/Makefile.am
backends/aarch64_corenote.c
backends/aarch64_init.c
backends/aarch64_initreg.c [new file with mode: 0644]
tests/ChangeLog
tests/Makefile.am
tests/backtrace.aarch64.core.bz2 [new file with mode: 0644]
tests/backtrace.aarch64.exec.bz2 [new file with mode: 0755]
tests/run-backtrace-core-aarch64.sh [new file with mode: 0755]

index 38a433d8c6badd3caa43428239f089ffe3e86fd9..bfe230192c0411ff8b332ba4524edb7436e02848 100644 (file)
@@ -1,3 +1,10 @@
+2014-04-09  Mark Wielaard  <mjw@redhat.com>
+
+       * 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  <jean.pihet@linaro.org>
 
        * arm_initreg.c (arm_set_initial_registers_tid): Handle compat mode.
index 4129eee529efc6527eb4a29452a3459d49d766fd..49593ac0c1ee73f2d272fe7a600b7120a404d755 100644 (file)
@@ -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)
 
index 8f5b9d5d263ad436c146822f3ab0a9dcf211dd05..9b424859e6c81bdc0e11f000cae564bb4fab56da 100644 (file)
@@ -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',              \
index a1a70606e6d356d05fabc24e0ead230805e573d7..b0fd17a7a0b373a55cfe4d46e34199e7151d28af 100644 (file)
@@ -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 (file)
index 0000000..2492d56
--- /dev/null
@@ -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__ */
+}
index 9b0e7aceb5515d9784ee167cc6119d5707754fb3..776ea66fbe29f1abf22e28f03378a7f29206c8d4 100644 (file)
@@ -1,3 +1,10 @@
+2014-04-09  Mark Wielaard  <mjw@redhat.com>
+
+       * 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  <jistone@redhat.com>
 
        * testfilebaxmin.bz2: New testfile.
index 5e640955a1fe7f9d4097642b493ec07a3c47e182..698e2cfa2a92a47f210844a45f307a2fae36f130 100644 (file)
@@ -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 (file)
index 0000000..3082a5a
Binary files /dev/null and b/tests/backtrace.aarch64.core.bz2 differ
diff --git a/tests/backtrace.aarch64.exec.bz2 b/tests/backtrace.aarch64.exec.bz2
new file mode 100755 (executable)
index 0000000..66216b5
Binary files /dev/null and b/tests/backtrace.aarch64.exec.bz2 differ
diff --git a/tests/run-backtrace-core-aarch64.sh b/tests/run-backtrace-core-aarch64.sh
new file mode 100755 (executable)
index 0000000..a29a661
--- /dev/null
@@ -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