window out of the correct stack frame.
* sparc64-linux-tdep.c (sparc64_linux_sigframe_init): Likewise.
* sparc-tdep.c (sparc32_dwarf2_frame_init_reg): New.
(sparc32_gdbarch_init): Pass it to dwarf2_frame_set_init_reg.
* Makefile.in (sparc-tdep.o): Update dependencies.
+ * sparc-linux-tdep.c (sparc32_linux_sigframe_init): Pull register
+ window out of the correct stack frame.
+ * sparc64-linux-tdep.c (sparc64_linux_sigframe_init): Likewise.
2006-04-04 David S. Miller <davem@davemloft.net>
struct trad_frame_cache *this_cache,
CORE_ADDR func)
{
- CORE_ADDR base, addr;
+ CORE_ADDR base, addr, sp_addr;
int regnum;
base = frame_unwind_register_unsigned (next_frame, SPARC_O1_REGNUM);
/* Since %g0 is always zero, keep the identity encoding. */
addr = base + 20;
+ sp_addr = base + 16 + ((SPARC_SP_REGNUM - SPARC_G0_REGNUM) * 4);
for (regnum = SPARC_G1_REGNUM; regnum <= SPARC_O7_REGNUM; regnum++)
{
trad_frame_set_reg_addr (this_cache, regnum, addr);
addr += 4;
}
- base = addr = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
+ base = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
+ addr = get_frame_memory_unsigned (next_frame, sp_addr, 4);
+
for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
{
trad_frame_set_reg_addr (this_cache, regnum, addr);
struct trad_frame_cache *this_cache,
CORE_ADDR func)
{
- CORE_ADDR base, addr;
+ CORE_ADDR base, addr, sp_addr;
int regnum;
base = frame_unwind_register_unsigned (next_frame, SPARC_O1_REGNUM);
/* Since %g0 is always zero, keep the identity encoding. */
addr = base + 8;
+ sp_addr = base + ((SPARC_SP_REGNUM - SPARC_G0_REGNUM) * 8);
for (regnum = SPARC_G1_REGNUM; regnum <= SPARC_O7_REGNUM; regnum++)
{
trad_frame_set_reg_addr (this_cache, regnum, addr);
trad_frame_set_reg_addr (this_cache, SPARC64_Y_REGNUM, addr + 24);
trad_frame_set_reg_addr (this_cache, SPARC64_FPRS_REGNUM, addr + 28);
- addr = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
+ base = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
+ if (base & 1)
+ base += BIAS;
+
+ addr = get_frame_memory_unsigned (next_frame, sp_addr, 8);
if (addr & 1)
addr += BIAS;
- base = addr;
for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
{
trad_frame_set_reg_addr (this_cache, regnum, addr);