]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
backends: add ARM compatible mode to AARCH64
authorJean Pihet <jean.pihet@linaro.org>
Fri, 28 Mar 2014 14:13:10 +0000 (15:13 +0100)
committerMark Wielaard <mjw@redhat.com>
Sun, 30 Mar 2014 11:07:55 +0000 (13:07 +0200)
Add the initial register setup for AARCH64 running ARM code (so
called compat mode). This makes 'eu-stack -p' happy on ARM binaries
while running on a AARCH64 kernel.

Signed-off-by: Jean Pihet <jean.pihet@linaro.org>
Signed-off-by: Mark Wielaard <mjw@redhat.com>
backends/ChangeLog
backends/arm_initreg.c

index 958b34cbbb0f5d2c5107ba5c36d88a13e813a04c..38a433d8c6badd3caa43428239f089ffe3e86fd9 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-28  Jean Pihet  <jean.pihet@linaro.org>
+
+       * arm_initreg.c (arm_set_initial_registers_tid): Handle compat mode.
+       ARM compatible code running on AARCH64.
+
 2014-03-19  Mark Wielaard  <mjw@redhat.com>
 
        * aarch64_reloc.def: AARCH64_ABS32 and AARCH64_ABS64 are also valid
index c03146eb9f299eac023cf33c9a894cb32dee2e7b..5837383a8c310b7061f393729b1ea3c0e1d07019 100644 (file)
 # include <sys/ptrace.h>
 #endif
 
+#ifdef __aarch64__
+# include <linux/uio.h>
+# include <sys/user.h>
+# include <sys/ptrace.h>
+#endif
+
 #define BACKEND arm_
 #include "libebl_CPU.h"
 
@@ -44,15 +50,39 @@ arm_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
                          ebl_tid_registers_t *setfunc __attribute__ ((unused)),
                               void *arg __attribute__ ((unused)))
 {
-#if ! defined __arm__
+#if !defined __arm__ && !defined __aarch64__
   return false;
-#else
+#else  /* __arm__ || __aarch64__ */
+#if defined __arm__
   struct user_regs user_regs;
   if (ptrace (PTRACE_GETREGS, tid, NULL, &user_regs) != 0)
     return false;
+
   Dwarf_Word dwarf_regs[16];
+  /* R0..R12 SP LR PC */
   for (int i = 0; i < 16; i++)
     dwarf_regs[i] = user_regs.uregs[i];
+
   return setfunc (0, 16, dwarf_regs, arg);
+#elif defined __aarch64__
+  /* Compat mode: arm compatible code running on aarch64 */
+  int i;
+  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;
+
+  Dwarf_Word dwarf_regs[16];
+  /* R0..R12 SP LR PC, encoded as 32 bit quantities */
+  uint32_t *u32_ptr = (uint32_t *) &gregs.regs[0];
+  for (i = 0; i < 16; i++)
+    dwarf_regs[i] = u32_ptr[i];
+
+  return setfunc (0, 16, dwarf_regs, arg);
+#else
+# error "source file error, it cannot happen"
+#endif
 #endif
 }