[PATCH/SPARC] Fix SPARC GNU/Linux sigtramp unwinder

Mark Kettenis kettenis@chello.nl
Sat Nov 15 13:42:00 GMT 2003


What I checked in yesterday, didn't quite work correctly.  Fixed by
the attached patch.

Committed to the SPARC branch.

Mark


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* sparc-linux-tdep.c (sparc32_linux_sigtramp_frame_cache): Fix.

Index: sparc-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/Attic/sparc-linux-tdep.c,v
retrieving revision 1.1.2.3
diff -u -p -r1.1.2.3 sparc-linux-tdep.c
--- sparc-linux-tdep.c 14 Nov 2003 22:10:33 -0000 1.1.2.3
+++ sparc-linux-tdep.c 15 Nov 2003 13:30:15 -0000
@@ -163,12 +163,28 @@ sparc32_linux_sigtramp_frame_cache (stru
   cache = sparc32_frame_cache (next_frame, this_cache);
   gdb_assert (cache == *this_cache);
 
-  cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
+  /* ??? What about signal trampolines that aren't frameless?  */
+  regnum = SPARC_SP_REGNUM;
+  cache->base = frame_unwind_register_unsigned (next_frame, regnum);
 
   regnum = SPARC_O1_REGNUM;
   sigcontext_addr = frame_unwind_register_unsigned (next_frame, regnum);
-  if (sparc32_linux_rt_sigtramp_start (cache->pc) != 0)
-    sigcontext_addr += 128;
+
+  cache->pc = frame_pc_unwind (next_frame);
+  addr = sparc32_linux_sigtramp_start (cache->pc);
+  if (addr == 0)
+    {
+      /* If this is a RT signal trampoline, adjust SIGCONTEXT_ADDR
+         accordingly.  */
+      addr = sparc32_linux_rt_sigtramp_start (cache->pc);
+      if (addr)
+	sigcontext_addr += 128;
+      else
+	addr = frame_func_unwind (next_frame);
+    }
+  cache->pc = addr;
+
+  cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
 
   cache->saved_regs[SPARC32_PSR_REGNUM].addr = sigcontext_addr + 0;
   cache->saved_regs[SPARC32_PC_REGNUM].addr = sigcontext_addr + 4;
@@ -176,7 +192,7 @@ sparc32_linux_sigtramp_frame_cache (stru
   cache->saved_regs[SPARC32_Y_REGNUM].addr = sigcontext_addr + 12;
 
   /* Since %g0 is always zero, keep the identity encoding.  */
-  for (regnum = SPARC_G1_REGNUM, addr = sigcontext_addr + 16;
+  for (regnum = SPARC_G1_REGNUM, addr = sigcontext_addr + 20;
        regnum <= SPARC_O7_REGNUM; regnum++, addr += 4)
     cache->saved_regs[regnum].addr = addr;
 



More information about the Gdb-patches mailing list