This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[PATCH/SPARC] Fix SPARC GNU/Linux sigtramp unwinder
- From: Mark Kettenis <kettenis at chello dot nl>
- To: gdb-patches at sources dot redhat dot com
- Date: Sat, 15 Nov 2003 14:42:27 +0100 (CET)
- Subject: [PATCH/SPARC] Fix SPARC GNU/Linux sigtramp unwinder
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;