This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] backends: Add aarch64 native and core unwind support.


Hi,

I finally got access to an aarch64 setup to test the mjw/aarch64-unwind
branch. There was one small issue with core file unwinding fixed by setting
the pc_register flag in the prstatus_regs aarch64 notes. I also added
an explicit test case for a aarch64 core file so it can be tested on
none-aarch64 arches too. The branch has been rebased to master. With
the attached patch (minus the the test binaries, see branch and test
file how to generate them) native and core unwinding works on aarch64
and there are no FAILs in the testsuite.

I think it is good to push to master now.

Cheers,

Mark

<- snip ->

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                  |    7 +++
 backends/Makefile.am                |    3 +-
 backends/aarch64_corenote.c         |    3 +-
 backends/aarch64_init.c             |    6 ++
 backends/aarch64_initreg.c          |   87 +++++++++++++++++++++++++++++++++++
 tests/ChangeLog                     |    7 +++
 tests/Makefile.am                   |    3 +
 tests/backtrace.aarch64.core.bz2    |  Bin 0 -> 7865 bytes
 tests/backtrace.aarch64.exec.bz2    |  Bin 0 -> 370058 bytes
 tests/run-backtrace-core-aarch64.sh |   23 +++++++++
 10 files changed, 137 insertions(+), 2 deletions(-)
 create mode 100644 backends/aarch64_initreg.c
 create mode 100644 tests/backtrace.aarch64.core.bz2
 create mode 100755 tests/backtrace.aarch64.exec.bz2
 create mode 100755 tests/run-backtrace-core-aarch64.sh

diff --git a/backends/ChangeLog b/backends/ChangeLog
index 38a433d..bfe2301 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -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.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 4129eee..49593ac 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 8f5b9d5..9b42485 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 a1a7060..b0fd17a 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 0000000..2492d56
--- /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 9b0e7ac..776ea66 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -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.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5e64095..698e2cf 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/run-backtrace-core-aarch64.sh b/tests/run-backtrace-core-aarch64.sh
new file mode 100755
index 0000000..a29a661
--- /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
-- 
1.7.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]