From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12446 invoked by alias); 29 Apr 2010 13:31:16 -0000 Received: (qmail 12436 invoked by uid 22791); 29 Apr 2010 13:31:15 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=BAYES_00,TW_GJ,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cam-admin0.cambridge.arm.com (HELO cam-admin0.cambridge.arm.com) (217.140.96.50) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 29 Apr 2010 13:31:11 +0000 Received: from cam-owa2.Emea.Arm.com (cam-owa2.emea.arm.com [10.1.105.18]) by cam-admin0.cambridge.arm.com (8.12.6/8.12.6) with ESMTP id o3TDV9eI006012 for ; Thu, 29 Apr 2010 14:31:09 +0100 (BST) Received: from [10.1.79.63] ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 29 Apr 2010 14:31:09 +0100 Subject: [PATCH/ARM] Fix support of longjmp for ARM Linux. From: Matthew Gretton-Dann To: gdb-patches@sourceware.org Content-Type: multipart/mixed; boundary="=-2Dn5888+nhQIWN/eUPAr" Date: Thu, 29 Apr 2010 13:31:00 -0000 Message-Id: <1272547868.19716.13.camel@e102111-lin.cambridge.arm.com> Mime-Version: 1.0 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-04/txt/msg00951.txt.bz2 --=-2Dn5888+nhQIWN/eUPAr Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 821 Hi, Can someone please review and comment on the attached patch? The patch fixes support for longjmp on ARM Linux. Dependent on the FP model in use the location of the PC to use as the long jump return value is stored in different locations in the long jump buffer. Currently gdb uses a hard-coded value which works for only one FP model, this patch corrects this. A suggested ChangeLog is: 2010-04-29 Matthew Gretton-Dann * arm-linux-tdep.c (ARM_LINUX_JB_PC): Remove. (ARM_LINUX_JB_PC_FPA): Add, offset of PC in longjmp buffer for FPA. (ARM_LINUX_JP_PC_EABI): Add, offset of PC in longjmp buffer for EABI. (arm_linux_init_abi): Set up JB_PC field dependent on FP model in use. Thanks, Matt -- Matthew Gretton-Dann Principal Engineer - Tools, PD Software ARM Limited --=-2Dn5888+nhQIWN/eUPAr Content-Disposition: attachment; filename=1004-gdb-longjmp.patch Content-Type: text/x-patch; name=1004-gdb-longjmp.patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-length: 1991 Index: gdb/arm-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/arm-linux-tdep.c,v retrieving revision 1.74 diff -u -p -u -p -r1.74 arm-linux-tdep.c --- gdb/arm-linux-tdep.c 1 Feb 2010 16:13:15 -0000 1.74 +++ gdb/arm-linux-tdep.c 29 Apr 2010 12:49:15 -0000 @@ -82,9 +82,20 @@ static const char arm_linux_thumb2_be_br static const char arm_linux_thumb2_le_breakpoint[] = { 0xf0, 0xf7, 0x00, 0xa0 }; -/* Description of the longjmp buffer. */ +/* Description of the longjmp buffer. The buffer is treated as an array of + elements of size ARM_LINUX_JB_ELEMENT_SIZE. + + The location of saved registers in this buffer (in particular the PC + to use after longjmp is called) varies depending on the ABI (in + particular the FP model) and also (possibly) the C Library. + + For glibc, eglibc, and uclibc the following holds: If the FP model is + SoftVFP or VFP (which implies EABI) then the PC is at offset 9 in the + buffer. This is also true for the SoftFPA model. However, for the FPA + model the PC is at offset 21 in the buffer. */ #define ARM_LINUX_JB_ELEMENT_SIZE INT_REGISTER_SIZE -#define ARM_LINUX_JB_PC 21 +#define ARM_LINUX_JB_PC_FPA 21 +#define ARM_LINUX_JB_PC_EABI 9 /* Dynamic Linking on ARM GNU/Linux @@ -877,7 +888,22 @@ arm_linux_init_abi (struct gdbarch_info if (tdep->fp_model == ARM_FLOAT_AUTO) tdep->fp_model = ARM_FLOAT_FPA; - tdep->jb_pc = ARM_LINUX_JB_PC; + switch (tdep->fp_model) + { + case ARM_FLOAT_FPA: + tdep->jb_pc = ARM_LINUX_JB_PC_FPA; + break; + case ARM_FLOAT_SOFT_FPA: + case ARM_FLOAT_SOFT_VFP: + case ARM_FLOAT_VFP: + tdep->jb_pc = ARM_LINUX_JB_PC_EABI; + break; + default: + internal_error + (__FILE__, __LINE__, + _("arm_linux_init_abi: Floating point model not supported")); + break; + } tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE; set_solib_svr4_fetch_link_map_offsets --=-2Dn5888+nhQIWN/eUPAr--