Fix register save offset for nios2 signal handler trampolines.
authorSandra Loosemore <sandra@codesourcery.com>
Fri, 8 May 2015 19:34:52 +0000 (12:34 -0700)
committerSandra Loosemore <sandra@codesourcery.com>
Fri, 8 May 2015 19:34:52 +0000 (12:34 -0700)
2015-05-08  Sandra Loosemore  <sandra@codesourcery.com>

gdb/
* nios2-linux-tdep.c (NIOS2_SIGRETURN_TRAMP_ADDR): Define.
(NIOS2_SIGRETURN_REGSAVE_OFFSET): Define.
(nios2_linux_rt_sigreturn_init): Adjust base address of
register save area.

gdb/ChangeLog
gdb/nios2-linux-tdep.c

index f895f9ccafb42a5d6cf322432749ae483287dccb..b7a29e6396d304977d5f188a326d872d9399dde1 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-08  Sandra Loosemore  <sandra@codesourcery.com>
+
+       * nios2-linux-tdep.c (NIOS2_SIGRETURN_TRAMP_ADDR): Define.
+       (NIOS2_SIGRETURN_REGSAVE_OFFSET): Define.
+       (nios2_linux_rt_sigreturn_init): Adjust base address of
+       register save area.
+
 2015-05-08  Sandra Loosemore  <sandra@codesourcery.com>
 
        * nios2-tdep.c (nios2_breakpoint_from_pc): Revert to using
index b829569c9c43694bc21c1ee23d1321325af27aca..0a837b0a0931bdd644d083eb4fcce5855ea65839 100644 (file)
@@ -114,7 +114,25 @@ nios2_iterate_over_regset_sections (struct gdbarch *gdbarch,
 }
 
 /* Initialize a trad-frame cache corresponding to the tramp-frame.
-   FUNC is the address of the instruction TRAMP[0] in memory.  */
+   FUNC is the address of the instruction TRAMP[0] in memory.
+
+   This ABI is not documented.  It corresponds to rt_setup_ucontext in
+   the kernel arch/nios2/kernel/signal.c file.
+
+   The key points are:
+   - The kernel creates a trampoline at the hard-wired address 0x1044.
+   - The stack pointer points to an object of type struct rt_sigframe.
+     The definition of this structure is not exported from the kernel.
+     The register save area is located at offset 152 bytes (as determined
+     by inspection of the stack contents in the debugger), and the
+     registers are saved as r1-r23, ra, fp, gp, ea, sp.
+
+   This interface was implemented with kernel version 3.19 (the first
+   official mainline kernel).  Older unofficial kernel versions used
+   incompatible conventions; we do not support those here.  */
+
+#define NIOS2_SIGRETURN_TRAMP_ADDR 0x1044
+#define NIOS2_SIGRETURN_REGSAVE_OFFSET 152
 
 static void
 nios2_linux_rt_sigreturn_init (const struct tramp_frame *self,
@@ -122,7 +140,8 @@ nios2_linux_rt_sigreturn_init (const struct tramp_frame *self,
                               struct trad_frame_cache *this_cache,
                               CORE_ADDR func)
 {
-  CORE_ADDR base = func + 41 * 4;
+  CORE_ADDR sp = get_frame_register_unsigned (next_frame, NIOS2_SP_REGNUM);
+  CORE_ADDR base = sp + NIOS2_SIGRETURN_REGSAVE_OFFSET;
   int i;
 
   for (i = 0; i < 23; i++)