From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32303 invoked by alias); 4 Apr 2006 23:44:28 -0000 Received: (qmail 32293 invoked by uid 22791); 4 Apr 2006 23:44:27 -0000 X-Spam-Check-By: sourceware.org Received: from dsl027-180-168.sfo1.dsl.speakeasy.net (HELO sunset.davemloft.net) (216.27.180.168) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 04 Apr 2006 23:44:27 +0000 Received: from localhost ([127.0.0.1] ident=davem) by sunset.davemloft.net with esmtp (Exim 4.60) (envelope-from ) id 1FQvCP-0004qZ-9S for gdb-patches@sources.redhat.com; Tue, 04 Apr 2006 16:44:37 -0700 Date: Tue, 04 Apr 2006 23:44:00 -0000 Message-Id: <20060404.164437.83533654.davem@davemloft.net> To: gdb-patches@sources.redhat.com Subject: [PATCH]: Fix signal frames on sparc*-*-linux* From: "David S. Miller" Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-04/txt/msg00046.txt.bz2 The current code is pulling the register window out of the trampoline's stack frame, not the signal stack frame. The other targets were getting this right. This fixes that. Any objections? 2006-04-04 David S. Miller * 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. --- sparc-linux-tdep.c.~1~ 2005-04-22 12:52:21.000000000 -0700 +++ sparc-linux-tdep.c 2006-04-04 15:19:24.000000000 -0700 @@ -91,7 +91,7 @@ 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); @@ -107,13 +107,16 @@ /* 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); --- sparc64-linux-tdep.c.~1~ 2005-04-22 16:08:06.000000000 -0700 +++ sparc64-linux-tdep.c 2006-04-04 16:06:41.000000000 -0700 @@ -59,7 +59,7 @@ 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); @@ -69,6 +69,7 @@ /* 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); @@ -81,11 +82,14 @@ 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);