From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-eopbgr140045.outbound.protection.outlook.com [40.107.14.45]) by sourceware.org (Postfix) with ESMTPS id E74E3385735A for ; Tue, 9 Aug 2022 13:02:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E74E3385735A ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=NCGBa302a8vjZVgFk9h11GSEz6dQDeVhqfrjHl/da4z9u5KW2Yj0Vk0HPBPmlTAZ/8VfA5NdV9EIU/EQKAzA+SuR8br+X49K9Z0NQx15sgqlsQtZyLKitxDFy3FdVL29FWnpULBMiU8ymVX2mZGTmY9y6KN1qJMN9ORCDOOgcADCyp5NemzP4mYrVJ2Tt6VFMdFSraRW7PlrvRdpcYlu0bnOFkpTK3ntWEhZqJcl1Pf60gjpjKlHcoPJ0GQB9vcBOywstZd0iCponomY98QtWZtBMc7b8vHh/7nelvFozBNY4B3lp2pFpIqPZZ/1AubgFcoeeHR4zt53uZBBCbpVWw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hKgSVw08f3uUrkseloVpxZOWdVdd0jEOmhSffWA573c=; b=fwh3O5/EscSVV6hoWcUHgxCuc2yYdeGILsLmkLBQD48ncMRXa9uOeKkcTGLlciTpEAHBWBW6NTBvx5XFMybyQxEdWsfslOq7J+OvN3+pPfJ9dnNypKtpHRd9ZrnLx/0xr97Vn8NtGjqqWlDi6cWSC2fdAliPL4rE286wmE+SQ6fkacSTh+t5Su3rDqX8jAX02LDdpM3U7RuA/TKsIsa6FUjWYY/fiY7vyqExKS5jdf5mW4CRsA7CZpyLYyUAdUmlooyUfp4STrFdjlaIZWDFt8hHiVriO52P15LSCwu4sX+jPaKo7E4v87P0oe0ofUwWBDy87RFh9WX1CDcBtlD9pQ== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=sourceware.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) Received: from DB6P192CA0016.EURP192.PROD.OUTLOOK.COM (2603:10a6:4:b8::26) by DB7PR08MB3388.eurprd08.prod.outlook.com (2603:10a6:10:41::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.14; Tue, 9 Aug 2022 13:02:40 +0000 Received: from DBAEUR03FT006.eop-EUR03.prod.protection.outlook.com (2603:10a6:4:b8:cafe::38) by DB6P192CA0016.outlook.office365.com (2603:10a6:4:b8::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.14 via Frontend Transport; Tue, 9 Aug 2022 13:02:40 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DBAEUR03FT006.mail.protection.outlook.com (100.127.142.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.16 via Frontend Transport; Tue, 9 Aug 2022 13:02:40 +0000 Received: ("Tessian outbound fccf984e7173:v123"); Tue, 09 Aug 2022 13:02:40 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 28d05bc3ff1eabb3 X-CR-MTA-TID: 64aa7808 Received: from 84ddbc2002da.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 809CCE04-7DCB-4315-B6FA-0C8505E53A10.1; Tue, 09 Aug 2022 13:02:33 +0000 Received: from EUR03-VE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 84ddbc2002da.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 09 Aug 2022 13:02:33 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AeIhFO/zLuKGfzrGHwvO8h2N2kvm+6y74SH/9djoRZQ36Ayabv5I2vjbaDIQIGExDP1HKwVpBy45Q3fsOrmGEEedlrLEQ8MzZyRJuy4L8LXOibGBBAlCkup4OQMUXNZU9wYVyh0msOtMxC4t7+Ok/RWwWgtgGXRhR69h76kneG31SU6rQbSQOA9NZIk0RncAjSKfTzFzTw2QIMwFjoLllRpB5VaxSJmLodgSt0R7qRCl2fXPRVUhwMEt0gQLuSIU+B15VgcO5BS0Bt4S38VEgnJvjMmbMfUelr3tutQ57/tpAuj9m0ujCONT21w/AhP0JazWmN8T2NknxizGUBErYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hKgSVw08f3uUrkseloVpxZOWdVdd0jEOmhSffWA573c=; b=GVD5CEWtC3KXAsKmoeBsQq7Kb8jxwfCo0tmQr2JIxXQ20O6TYHHOXc5/N1D8HhlPXYlTLx3QA8osDzRbZ/RZXT2EtUkj1MvR1C2KGa/FSgkh0JoM2QPwBu+OsV0do+OilhvRR6drSMhfXBFAANOT9IRpxzFd+LzkLbI4CcVsDHPn4fWJei58tdrTwTPnlD1R+k2lsdNvdK98ax5SqDnU1iEHNQhxpqc1wd9x1zjp9BTG6tL10x7S+uz6uNLZC2nUfe5KoURuEDdV3xFp6H2SLhTFGYEv0YofDLN7Q8jz9NlY2wBsm8QBzBHbFfQ9B8F9ju1gJqeTqKV0Tq1uLlzkOQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) by AS4PR08MB8142.eurprd08.prod.outlook.com (2603:10a6:20b:58d::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.20; Tue, 9 Aug 2022 13:02:31 +0000 Received: from VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::cc64:9170:b12d:de8]) by VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::cc64:9170:b12d:de8%4]) with mapi id 15.20.5504.019; Tue, 9 Aug 2022 13:02:31 +0000 Message-ID: <3e0260c4-8bfe-b398-2fd2-3af15a55b3d5@arm.com> Date: Tue, 9 Aug 2022 14:02:29 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 From: Luis Machado Subject: Re: [PATCH] gdb/arm: Cleanup of arm_m_exception_cache To: =?UTF-8?Q?Torbj=c3=b6rn_SVENSSON?= , gdb-patches@sourceware.org References: <20220808075624.3126293-1-torbjorn.svensson@foss.st.com> Content-Language: en-US In-Reply-To: <20220808075624.3126293-1-torbjorn.svensson@foss.st.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: LO2P123CA0025.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600::13) To VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 74732bd4-20d1-497b-4f6e-08da7a0770ed X-MS-TrafficTypeDiagnostic: AS4PR08MB8142:EE_|DBAEUR03FT006:EE_|DB7PR08MB3388:EE_ x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: IUyzAiHeWnhVslnaH2mhU8yphjAfSr4tt+W7s4IUSm++R/nU5KaA7ohYnXLIlb+JC/uY1S47jS8o/mtu0XFUHOVdqPZBBWaTPRIP6Ut4M7T8yG8aTUGgFZLCnPEiLkjkTGOG9CjyZfcBHOWAQCoLYD1LAOYXcdWmLHQMjmZyj1k93haEw5RpCLXwYqJmWM7382DZJlL3qbroe6R/Jrwe6P8pL2tVVOJIjamiOvJ0mo+tKo19tjifIiIC4yaZPYeOM5hyaFJIgxG/ufA0ZxpL/z8i1lldx+rlPrfrBmsGWdNvuQHjAJPbHP5f8SHyIQ2MNeo3WHyfO2wLUYtKYkwZVMGLsNxcbgZhbDo+BkoutSsvOnpD2dtOcfff/pDez+9LxxA5z9IdWTpL6Mc4MHnAdElwzUtyj7X5m1V+JrqLRMu5IoRJ+MtlW0BY/fqFji60s/kbfc2B7Yd3FOXzr++cHLa6OsyhJ4tjOIdaufVkPCMxxzglSEQxjdA4ZFuWIead1aC/RU8/TeKl52+O4h3W2IVO5R9hIF6yOCJ9bPoQJvlPcdkFceTo+Y0GpJzyJwQDWDbpG05FFKj9hwm/zMsdpYxgdYKysiDxRQcgxCEv7dPS0NgL/ANzJyLdv2K4fWk57xNZNgmJLtiQFuo7An8Xg/j4Q/4RMYCI66vttubrHJ12v/X8TFxWOPSGDLCP8csJmNt2EUnszodLAqvirU5Urh2U3jkHr4Soi5H2DcixsC2EeHmaC7IWLUMLzrSgpL9ssq2FjusKJsHOLbPcXSLtSQh79AzPMR+KEEMkyCEPq+IN87L1n+TNb1HNR52KREACE5rqEVANErTHvgllRtz07A== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR08MB3919.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(4636009)(376002)(366004)(396003)(346002)(39860400002)(136003)(5660300002)(2906002)(86362001)(31696002)(66556008)(66946007)(38100700002)(66476007)(53546011)(8676002)(6512007)(6506007)(26005)(6486002)(478600001)(316002)(41300700001)(186003)(2616005)(8936002)(66574015)(36756003)(83380400001)(31686004)(30864003)(44832011)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB8142 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DBAEUR03FT006.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 8d1e0114-82ab-4fb9-1a87-08da7a076b69 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VQ50XPlPLunkeB9d26qzo8dxZgvzjC3UkyOfNtp+wAgRz/WIODZnkwbtynaeOTybmUUaOk3o1lbSU82Ti/gX/0cBHqe5SN8flIatmyEQuGSjSdL68WwDM/DlChbe3CtFVff4KW+wL9oNvXoswpMbcG9oy9tswosYE+ryEpw4udVY8Cd1LvziBDXH/815Ahnsk3NCAULr5LeCJHB4bb0qP77J2jLYGuahQtfC0iF4fktgHVKitK1P3J6H4bc72mpaXVUhJu+kd224Lo9mVX3DdvGfhjI+dRpCBCKTXaJzdps37S6pt6ZQy6kG1jjVEyxIbdmAtM4lw9m/DiOd5iU8CETa6lFwcaaElEXhFd/8RZLyT3OgltR3MdOp3AqdglyMdkztUHuiDUJ4JUuLlHc26gLS5w0kjqrmfII7ql8/1jVZZa65LUYdSTj0b9i4KN3lAYlP7utnMOZnFdW6fVYERVIpxKxPZE5CYdUG/k9okX7VOwPygIeoidU9Bn3A+hHTVlRCpQcM8Keos1wrpE2VhqLOcQrDEtnp1OAXUfP5x1E9aAyiTLRJN/Gw/NbOIffqGE7/qFOJt6/Ih42QNHR8eiBHxhNz9mh5IFwm74p9fI7CG4dNGAolqhLaf4CGGiR6OSKjH9m1pnhlvGsnaTctcy5CKRhq2NAsPqPwyT1YQjcMy5xsSVX3NPUW5GUt9n4M3/xta9tGU6cYXz9sXvK1Exacn+MfYvpxH/lOufLY0EdQvvZ+aWRJ3Hgftq5I9U6y/zYKwNzXo9J6KFxPkPRFV4MR6KHypsKV+AGqCgQCSRKy2emr1DYZSRLSF0WNjr1Y6PlaQOPy1t3PBiJUKUFJ1A== X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFS:(13230016)(4636009)(39860400002)(346002)(396003)(376002)(136003)(40470700004)(46966006)(36840700001)(316002)(6486002)(478600001)(2906002)(41300700001)(40460700003)(40480700001)(82310400005)(8676002)(70586007)(70206006)(5660300002)(44832011)(30864003)(8936002)(82740400003)(36860700001)(31686004)(81166007)(356005)(36756003)(31696002)(83380400001)(86362001)(336012)(47076005)(66574015)(2616005)(6506007)(26005)(186003)(6512007)(53546011)(43740500002); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Aug 2022 13:02:40.4150 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 74732bd4-20d1-497b-4f6e-08da7a0770ed X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DBAEUR03FT006.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR08MB3388 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_NONE, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Aug 2022 13:02:47 -0000 Hi, On 8/8/22 08:56, Torbjörn SVENSSON via Gdb-patches wrote: > With this change, only valid content of LR is accepted for the current > target. If the content for LR is anything but EXC_RETURN or FNC_RETURN > will cause GDB to assert since it's an invalid state for the unwinder. > FNC_RETURN pattern requires Security Extensions to be enabled or GDB > will assert due to the bad state of the unwinder. If we have corrupt data, do we risk running into this assertion? > > Signed-off-by: Torbjörn SVENSSON > --- > gdb/arm-tdep.c | 343 ++++++++++++++++++++++++++----------------------- > 1 file changed, 183 insertions(+), 160 deletions(-) > > diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c > index 7d8d040f8f1..ad5ada39aea 100644 > --- a/gdb/arm-tdep.c > +++ b/gdb/arm-tdep.c > @@ -3345,19 +3345,13 @@ arm_m_exception_cache (struct frame_info *this_frame) > { > struct gdbarch *gdbarch = get_frame_arch (this_frame); > arm_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); > - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); > struct arm_prologue_cache *cache; > CORE_ADDR lr; > CORE_ADDR sp; > CORE_ADDR unwound_sp; > - uint32_t sp_r0_offset = 0; > - LONGEST xpsr; > - uint32_t exc_return; > + ULONGEST xpsr; > + bool exc_return; > bool fnc_return; > - uint32_t extended_frame_used; > - bool secure_stack_used = false; > - bool default_callee_register_stacking = false; > - bool exception_domain_is_secure = false; > > cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache); > arm_cache_init (cache, this_frame); > @@ -3380,9 +3374,13 @@ arm_m_exception_cache (struct frame_info *this_frame) > return cache; > } > > + /* Check FNC_RETURN indicator bits (24-31). */ > fnc_return = (((lr >> 24) & 0xff) == 0xfe); > - if (tdep->have_sec_ext && fnc_return) > + if (fnc_return) > { > + /* FNC_RETURN is only valid for targets with Security Extension. */ > + gdb_assert (tdep->have_sec_ext); > + An assertion is a bit of a strong hand here. It will crash GDB, essentially. Should we go for an error instead? That will stop the unwinder dead in its tracks and return. Unwinders may get corrupt data, so it is hard to rule out issues, even if GDB is doing the right thing. > if (!arm_unwind_secure_frames) > { > warning (_("Non-secure to secure stack unwinding disabled.")); > @@ -3428,6 +3426,14 @@ arm_m_exception_cache (struct frame_info *this_frame) > exc_return = (((lr >> 24) & 0xff) == 0xff); > if (exc_return) > { > + int sp_regnum; > + uint32_t sp_r0_offset = 0; > + bool extended_frame_used; extended_frame_used could be defined further down or removed. Since we're touching this code, it would be nice to get the variable declarations closer to where they're used. This makes things cleaner now that we can do it. > + bool secure_stack_used = false; > + bool default_callee_register_stacking = false; > + bool exception_domain_is_secure = false; > + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); > + > /* Check EXC_RETURN bit SPSEL if Main or Thread (process) stack used. */ > bool process_stack_used = ((lr & (1 << 2)) != 0); > > @@ -3455,188 +3461,205 @@ arm_m_exception_cache (struct frame_info *this_frame) > { > if (secure_stack_used) > /* Secure thread (process) stack used, use PSP_S as SP. */ > - arm_cache_switch_prev_sp (cache, tdep, tdep->m_profile_psp_s_regnum); > + sp_regnum = tdep->m_profile_psp_s_regnum; > else > /* Non-secure thread (process) stack used, use PSP_NS as SP. */ > - arm_cache_switch_prev_sp (cache, tdep, tdep->m_profile_psp_ns_regnum); > + sp_regnum = tdep->m_profile_psp_ns_regnum; > } > else > { > if (secure_stack_used) > /* Secure main stack used, use MSP_S as SP. */ > - arm_cache_switch_prev_sp (cache, tdep, tdep->m_profile_msp_s_regnum); > + sp_regnum = tdep->m_profile_msp_s_regnum; > else > /* Non-secure main stack used, use MSP_NS as SP. */ > - arm_cache_switch_prev_sp (cache, tdep, tdep->m_profile_msp_ns_regnum); > + sp_regnum = tdep->m_profile_msp_ns_regnum; > } > } > else > { > if (process_stack_used) > /* Thread (process) stack used, use PSP as SP. */ > - arm_cache_switch_prev_sp (cache, tdep, tdep->m_profile_psp_regnum); > + sp_regnum = tdep->m_profile_psp_regnum; > else > /* Main stack used, use MSP as SP. */ > - arm_cache_switch_prev_sp (cache, tdep, tdep->m_profile_msp_regnum); > - } > - } > - > - /* Fetch the SP to use for this frame. */ > - unwound_sp = arm_cache_get_prev_sp_value (cache, tdep); > - > - /* Exception entry context stacking are described in ARMv8-M (section B3.19) > - and ARMv7-M (sections B1.5.6 and B1.5.7) Architecture Reference Manuals. > - > - The following figure shows the structure of the stack frame when Security > - and Floating-point extensions are present. > - > - SP Offsets > - Without With > - Callee Regs Callee Regs > - (Secure -> Non-Secure) > - +-------------------+ > - 0xA8 | | 0xD0 > - +===================+ --+ <-- Original SP > - 0xA4 | S31 | 0xCC | > - +-------------------+ | > - ... | Additional FP context > - +-------------------+ | > - 0x68 | S16 | 0x90 | > - +===================+ --+ > - 0x64 | Reserved | 0x8C | > - +-------------------+ | > - 0x60 | FPSCR | 0x88 | > - +-------------------+ | > - 0x5C | S15 | 0x84 | FP context > - +-------------------+ | > - ... | > - +-------------------+ | > - 0x20 | S0 | 0x48 | > - +===================+ --+ > - 0x1C | xPSR | 0x44 | > - +-------------------+ | > - 0x18 | Return address | 0x40 | > - +-------------------+ | > - 0x14 | LR(R14) | 0x3C | > - +-------------------+ | > - 0x10 | R12 | 0x38 | State context > - +-------------------+ | > - 0x0C | R3 | 0x34 | > - +-------------------+ | > - ... | > - +-------------------+ | > - 0x00 | R0 | 0x28 | > - +===================+ --+ > - | R11 | 0x24 | > - +-------------------+ | > - ... | > - +-------------------+ | Additional state context > - | R4 | 0x08 | when transitioning from > - +-------------------+ | Secure to Non-Secure > - | Reserved | 0x04 | > - +-------------------+ | > - | Magic signature | 0x00 | > - +===================+ --+ <-- New SP */ > - > - /* With the Security extension, the hardware saves R4..R11 too. */ > - if (exc_return && tdep->have_sec_ext && secure_stack_used > - && (!default_callee_register_stacking || exception_domain_is_secure)) > - { > - /* Read R4..R11 from the integer callee registers. */ > - cache->saved_regs[4].set_addr (unwound_sp + 0x08); > - cache->saved_regs[5].set_addr (unwound_sp + 0x0C); > - cache->saved_regs[6].set_addr (unwound_sp + 0x10); > - cache->saved_regs[7].set_addr (unwound_sp + 0x14); > - cache->saved_regs[8].set_addr (unwound_sp + 0x18); > - cache->saved_regs[9].set_addr (unwound_sp + 0x1C); > - cache->saved_regs[10].set_addr (unwound_sp + 0x20); > - cache->saved_regs[11].set_addr (unwound_sp + 0x24); > - sp_r0_offset = 0x28; > - } > - > - /* The hardware saves eight 32-bit words, comprising xPSR, > - ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in > - "B1.5.6 Exception entry behavior" in > - "ARMv7-M Architecture Reference Manual". */ > - cache->saved_regs[0].set_addr (unwound_sp + sp_r0_offset); > - cache->saved_regs[1].set_addr (unwound_sp + sp_r0_offset + 0x04); > - cache->saved_regs[2].set_addr (unwound_sp + sp_r0_offset + 0x08); > - cache->saved_regs[3].set_addr (unwound_sp + sp_r0_offset + 0x0C); > - cache->saved_regs[ARM_IP_REGNUM].set_addr (unwound_sp + sp_r0_offset + 0x10); > - cache->saved_regs[ARM_LR_REGNUM].set_addr (unwound_sp + sp_r0_offset + 0x14); > - cache->saved_regs[ARM_PC_REGNUM].set_addr (unwound_sp + sp_r0_offset + 0x18); > - cache->saved_regs[ARM_PS_REGNUM].set_addr (unwound_sp + sp_r0_offset + 0x1C); > - > - /* Check EXC_RETURN bit FTYPE if extended stack frame (FPU regs stored) > - type used. */ > - extended_frame_used = ((lr & (1 << 4)) == 0); > - if (exc_return && extended_frame_used) > - { > - int i; > - int fpu_regs_stack_offset; > - ULONGEST fpccr; > - > - /* Read FPCCR register. */ > - gdb_assert (safe_read_memory_unsigned_integer (FPCCR, > - ARM_INT_REGISTER_SIZE, > - byte_order, &fpccr)); > - bool fpccr_ts = bit (fpccr,26); > + sp_regnum = tdep->m_profile_msp_regnum; > + } > > - /* This code does not take into account the lazy stacking, see "Lazy > - context save of FP state", in B1.5.7, also ARM AN298, supported > - by Cortex-M4F architecture. > - To fully handle this the FPCCR register (Floating-point Context > - Control Register) needs to be read out and the bits ASPEN and LSPEN > - could be checked to setup correct lazy stacked FP registers. > - This register is located at address 0xE000EF34. */ > + /* Set the active SP regnum. */ > + arm_cache_switch_prev_sp (cache, tdep, sp_regnum); > > - /* Extended stack frame type used. */ > - fpu_regs_stack_offset = unwound_sp + sp_r0_offset + 0x20; > - for (i = 0; i < 8; i++) > - { > - cache->saved_regs[ARM_D0_REGNUM + i].set_addr (fpu_regs_stack_offset); > - fpu_regs_stack_offset += 8; > - } > - cache->saved_regs[ARM_FPSCR_REGNUM].set_addr (unwound_sp + sp_r0_offset + 0x60); > - fpu_regs_stack_offset += 4; > + /* Fetch the SP to use for this frame. */ > + unwound_sp = arm_cache_get_prev_sp_value (cache, tdep); > > - if (tdep->have_sec_ext && !default_callee_register_stacking && fpccr_ts) > + /* Exception entry context stacking are described in ARMv8-M (section > + B3.19) and ARMv7-M (sections B1.5.6 and B1.5.7) Architecture Reference > + Manuals. > + > + The following figure shows the structure of the stack frame when > + Security and Floating-point extensions are present. > + > + SP Offsets > + Without With > + Callee Regs Callee Regs > + (Secure -> Non-Secure) > + +-------------------+ > + 0xA8 | | 0xD0 > + +===================+ --+ <-- Original SP > + 0xA4 | S31 | 0xCC | > + +-------------------+ | > + ... | Additional FP context > + +-------------------+ | > + 0x68 | S16 | 0x90 | > + +===================+ --+ > + 0x64 | Reserved | 0x8C | > + +-------------------+ | > + 0x60 | FPSCR | 0x88 | > + +-------------------+ | > + 0x5C | S15 | 0x84 | FP context > + +-------------------+ | > + ... | > + +-------------------+ | > + 0x20 | S0 | 0x48 | > + +===================+ --+ > + 0x1C | xPSR | 0x44 | > + +-------------------+ | > + 0x18 | Return address | 0x40 | > + +-------------------+ | > + 0x14 | LR(R14) | 0x3C | > + +-------------------+ | > + 0x10 | R12 | 0x38 | State context > + +-------------------+ | > + 0x0C | R3 | 0x34 | > + +-------------------+ | > + ... | > + +-------------------+ | > + 0x00 | R0 | 0x28 | > + +===================+ --+ > + | R11 | 0x24 | > + +-------------------+ | > + ... | > + +-------------------+ | Additional state > + | R4 | 0x08 | context when > + +-------------------+ | transitioning from > + | Reserved | 0x04 | Secure to Non-Secure > + +-------------------+ | > + | Magic signature | 0x00 | > + +===================+ --+ <-- New SP */ > + > + /* With the Security extension, the hardware saves R4..R11 too. */ > + if (tdep->have_sec_ext && secure_stack_used > + && (!default_callee_register_stacking || exception_domain_is_secure)) > + { > + /* Read R4..R11 from the integer callee registers. */ > + cache->saved_regs[4].set_addr (unwound_sp + 0x08); > + cache->saved_regs[5].set_addr (unwound_sp + 0x0C); > + cache->saved_regs[6].set_addr (unwound_sp + 0x10); > + cache->saved_regs[7].set_addr (unwound_sp + 0x14); > + cache->saved_regs[8].set_addr (unwound_sp + 0x18); > + cache->saved_regs[9].set_addr (unwound_sp + 0x1C); > + cache->saved_regs[10].set_addr (unwound_sp + 0x20); > + cache->saved_regs[11].set_addr (unwound_sp + 0x24); > + sp_r0_offset = 0x28; > + } > + > + /* The hardware saves eight 32-bit words, comprising xPSR, > + ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in > + "B1.5.6 Exception entry behavior" in > + "ARMv7-M Architecture Reference Manual". */ > + cache->saved_regs[0].set_addr (unwound_sp + sp_r0_offset); > + cache->saved_regs[1].set_addr (unwound_sp + sp_r0_offset + 0x04); > + cache->saved_regs[2].set_addr (unwound_sp + sp_r0_offset + 0x08); > + cache->saved_regs[3].set_addr (unwound_sp + sp_r0_offset + 0x0C); > + cache->saved_regs[ARM_IP_REGNUM].set_addr (unwound_sp + sp_r0_offset > + + 0x10); > + cache->saved_regs[ARM_LR_REGNUM].set_addr (unwound_sp + sp_r0_offset > + + 0x14); > + cache->saved_regs[ARM_PC_REGNUM].set_addr (unwound_sp + sp_r0_offset > + + 0x18); > + cache->saved_regs[ARM_PS_REGNUM].set_addr (unwound_sp + sp_r0_offset > + + 0x1C); > + > + /* Check EXC_RETURN bit FTYPE if extended stack frame (FPU regs stored) > + type used. */ > + extended_frame_used = ((lr & (1 << 4)) == 0); Declaring extended_frame_used here would be nice. That's the only place where it is used. Alternatively, you could check for bit 4 in the conditional expression below and add a comment explaining this is checking if the extended frame is being used. > + if (extended_frame_used) > { > - /* Handle floating-point callee saved registers. */ > - fpu_regs_stack_offset = unwound_sp + sp_r0_offset + 0x68; > - for (i = 8; i < 16; i++) > - { > - cache->saved_regs[ARM_D0_REGNUM + i].set_addr (fpu_regs_stack_offset); > + int i; > + int fpu_regs_stack_offset; > + ULONGEST fpccr; > + > + /* Read FPCCR register. */ > + gdb_assert (safe_read_memory_unsigned_integer (FPCCR, > + ARM_INT_REGISTER_SIZE, > + byte_order, &fpccr)); > + bool fpccr_ts = bit (fpccr,26); > + > + /* This code does not take into account the lazy stacking, see "Lazy > + context save of FP state", in B1.5.7, also ARM AN298, supported > + by Cortex-M4F architecture. > + To fully handle this the FPCCR register (Floating-point Context > + Control Register) needs to be read out and the bits ASPEN and > + LSPEN could be checked to setup correct lazy stacked FP registers. > + This register is located at address 0xE000EF34. */ > + > + /* Extended stack frame type used. */ > + fpu_regs_stack_offset = unwound_sp + sp_r0_offset + 0x20; > + for (i = 0; i < 8; i++) > + { > + cache->saved_regs[ARM_D0_REGNUM + i] > + .set_addr (fpu_regs_stack_offset); > fpu_regs_stack_offset += 8; > } > + cache->saved_regs[ARM_FPSCR_REGNUM].set_addr (unwound_sp > + + sp_r0_offset + 0x60); > + fpu_regs_stack_offset += 4; > > - arm_cache_set_active_sp_value (cache, tdep, > - unwound_sp + sp_r0_offset + 0xA8); > + if (tdep->have_sec_ext && !default_callee_register_stacking > + && fpccr_ts) > + { > + /* Handle floating-point callee saved registers. */ > + fpu_regs_stack_offset = unwound_sp + sp_r0_offset + 0x68; > + for (i = 8; i < 16; i++) > + { > + cache->saved_regs[ARM_D0_REGNUM + i] > + .set_addr (fpu_regs_stack_offset); > + fpu_regs_stack_offset += 8; > + } > + > + arm_cache_set_active_sp_value (cache, tdep, > + unwound_sp + sp_r0_offset + 0xA8); > + } > + else > + { > + /* Offset 0x64 is reserved. */ > + arm_cache_set_active_sp_value (cache, tdep, > + unwound_sp + sp_r0_offset + 0x68); > + } > } > else > { > - /* Offset 0x64 is reserved. */ > + /* Standard stack frame type used. */ > arm_cache_set_active_sp_value (cache, tdep, > - unwound_sp + sp_r0_offset + 0x68); > + unwound_sp + sp_r0_offset + 0x20); > } > - } > - else > - { > - /* Standard stack frame type used. */ > - arm_cache_set_active_sp_value (cache, tdep, > - unwound_sp + sp_r0_offset + 0x20); > - } > > - /* If bit 9 of the saved xPSR is set, then there is a four-byte > - aligner between the top of the 32-byte stack frame and the > - previous context's stack pointer. */ > - if (safe_read_memory_integer (unwound_sp + sp_r0_offset + 0x1C, 4, > - byte_order, &xpsr) > - && (xpsr & (1 << 9)) != 0) > - arm_cache_set_active_sp_value (cache, tdep, > - arm_cache_get_prev_sp_value (cache, tdep) + 4); > + /* If bit 9 of the saved xPSR is set, then there is a four-byte > + aligner between the top of the 32-byte stack frame and the > + previous context's stack pointer. */ > + gdb_assert (safe_read_memory_unsigned_integer (cache->saved_regs[ > + ARM_PS_REGNUM].addr (), 4, > + byte_order, &xpsr)); > + if ((xpsr & (1 << 9)) != 0) > + { > + CORE_ADDR new_sp = arm_cache_get_prev_sp_value (cache, tdep) + 4; > + arm_cache_set_active_sp_value (cache, tdep, new_sp); > + } > > - return cache; > + return cache; > + } > + > + gdb_assert_not_reached ("Invalid LR contet"); "content". Again, this will crash GDB. Should we error out instead? > } > > /* Implementation of function hook 'this_id' in