From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15793 invoked by alias); 22 Feb 2010 18:36:59 -0000 Received: (qmail 15772 invoked by uid 22791); 22 Feb 2010 18:36:58 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mail3.caviumnetworks.com (HELO mail3.caviumnetworks.com) (12.108.191.235) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 22 Feb 2010 18:36:54 +0000 Received: from caexch01.caveonetworks.com (Not Verified[192.168.16.9]) by mail3.caviumnetworks.com with MailMarshal (v6,7,2,8378) id ; Mon, 22 Feb 2010 10:37:03 -0800 Received: from caexch01.caveonetworks.com ([192.168.16.9]) by caexch01.caveonetworks.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 22 Feb 2010 10:36:52 -0800 Received: from dd1.caveonetworks.com ([12.108.191.236]) by caexch01.caveonetworks.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Mon, 22 Feb 2010 10:36:52 -0800 Message-ID: <4B82CEC4.2010607@caviumnetworks.com> Date: Mon, 22 Feb 2010 18:36:00 -0000 From: David Daney User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.7) Gecko/20100120 Fedora/3.0.1-1.fc12 Thunderbird/3.0.1 MIME-Version: 1.0 To: gdb-patches@sourceware.org CC: "Pinski, Andrew" Subject: [PATCH] Make mips-linux signal frame unwinding more robust. Content-Type: multipart/mixed; boundary="------------060301080307050108010806" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-02/txt/msg00546.txt.bz2 This is a multi-part message in MIME format. --------------060301080307050108010806 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1070 Greetings, The current signal frame unwinding code in mips-linux-tdep.c assumes a constant offset from the signal return trampoline to the signal frame. The assumption does not hold for all kernels. Specifically those that have to be compiled with ICACHE_REFILLS_WORKAROUND_WAR set (SGI O2 for example). In the near future, it is likely that the assumption will cease to hold universally, as we are attempting to move the signal return trampoline off the stack entirely. The libgcc unwinder already gets this right by using the signal frame's SP to locate the sigcontext. This patch makes gdb follow suit and find the sigcontext_base using the signal frame's SP rather than an offset from the trampoline. Tested on mips64-linux with no regressions (and more than 100 improvements). OK to commit? How about on the 7.1 branch? 2010-02-22 David Daney * mips-linux-tdep.c: Update struct sigframe comments. (mips_linux_o32_sigframe_init): Set sigcontext_base using this_frame's sp. (mips_linux_n32n64_sigframe_init): Same. --------------060301080307050108010806 Content-Type: text/plain; name="gdb.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="gdb.patch" Content-length: 1691 Index: gdb/mips-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-linux-tdep.c,v retrieving revision 1.81 diff -u -p -r1.81 mips-linux-tdep.c --- gdb/mips-linux-tdep.c 1 Jan 2010 07:31:37 -0000 1.81 +++ gdb/mips-linux-tdep.c 19 Feb 2010 21:58:32 -0000 @@ -797,7 +797,7 @@ static const struct tramp_frame mips_lin struct sigframe { u32 sf_ass[4]; [argument save space for o32] - u32 sf_code[2]; [signal trampoline] + u32 sf_code[2]; [signal trampoline or fill] struct sigcontext sf_sc; sigset_t sf_mask; }; @@ -827,7 +827,7 @@ static const struct tramp_frame mips_lin struct rt_sigframe { u32 rs_ass[4]; [argument save space for o32] - u32 rs_code[2] [signal trampoline] + u32 rs_code[2] [signal trampoline or fill] struct siginfo rs_info; struct ucontext rs_uc; }; @@ -871,7 +871,7 @@ mips_linux_o32_sigframe_init (const stru { struct gdbarch *gdbarch = get_frame_arch (this_frame); int ireg, reg_position; - CORE_ADDR sigcontext_base = func - SIGFRAME_CODE_OFFSET; + CORE_ADDR sigcontext_base = get_frame_sp (this_frame); const struct mips_regnum *regs = mips_regnum (gdbarch); CORE_ADDR regs_base; @@ -1038,7 +1038,7 @@ mips_linux_n32n64_sigframe_init (const s { struct gdbarch *gdbarch = get_frame_arch (this_frame); int ireg, reg_position; - CORE_ADDR sigcontext_base = func - SIGFRAME_CODE_OFFSET; + CORE_ADDR sigcontext_base = get_frame_sp (this_frame); const struct mips_regnum *regs = mips_regnum (gdbarch); if (self == &mips_linux_n32_rt_sigframe) --------------060301080307050108010806--