From: Mark Wielaard Date: Wed, 9 Apr 2014 09:48:23 +0000 (+0200) Subject: backends: Add aarch64 native and core unwind support. X-Git-Tag: elfutils-0.159~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=66637fa21044ac0058b25522f473669e73de328b;p=thirdparty%2Felfutils.git backends: Add aarch64 native and core unwind support. 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 --- diff --git a/backends/ChangeLog b/backends/ChangeLog index 38a433d8c..bfe230192 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,10 @@ +2014-04-09 Mark Wielaard + + * 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 * arm_initreg.c (arm_set_initial_registers_tid): Handle compat mode. diff --git a/backends/Makefile.am b/backends/Makefile.am index 4129eee52..49593ac0c 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 8f5b9d5d2..9b424859e 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 a1a70606e..b0fd17a7a 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 000000000..2492d5619 --- /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 . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "system.h" +#include +#ifdef __aarch64__ +# include +# include +# include +#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 9b0e7aceb..776ea66fb 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,10 @@ +2014-04-09 Mark Wielaard + + * 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 * testfilebaxmin.bz2: New testfile. diff --git a/tests/Makefile.am b/tests/Makefile.am index 5e640955a..698e2cfa2 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 000000000..3082a5ac0 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 index 000000000..66216b525 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 index 000000000..a29a6613d --- /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 . + +. $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