From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2088.outbound.protection.outlook.com [40.107.21.88]) by sourceware.org (Postfix) with ESMTPS id 021B63858D1E for ; Fri, 8 Sep 2023 11:08:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 021B63858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CRcrdYLXFEE28oYgy6ytx9awL+FdZl9/zCQ0/+zVdks=; b=KOHKIXl5/V6tSjaPT8Jt1VwK052mdFCN3dtqkCnYDeTwFBz6raBj/7SbkpztOm5u8yKL0ef2V1c1+cAIKisAOTvFclED8Mz4UZNk2A6NpvGF2Rqi7sLZNSdowy+t834oUyw9v0FQOuK6AhqYghirC8/FLKhOK+trtASqWuwR/Go= Received: from AM6P192CA0037.EURP192.PROD.OUTLOOK.COM (2603:10a6:209:82::14) by DU0PR08MB7664.eurprd08.prod.outlook.com (2603:10a6:10:315::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6768.30; Fri, 8 Sep 2023 11:08:16 +0000 Received: from AM7EUR03FT049.eop-EUR03.prod.protection.outlook.com (2603:10a6:209:82:cafe::fa) by AM6P192CA0037.outlook.office365.com (2603:10a6:209:82::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6768.30 via Frontend Transport; Fri, 8 Sep 2023 11:08:16 +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 AM7EUR03FT049.mail.protection.outlook.com (100.127.140.234) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6768.30 via Frontend Transport; Fri, 8 Sep 2023 11:08:16 +0000 Received: ("Tessian outbound 30c9f5e988c5:v175"); Fri, 08 Sep 2023 11:08:16 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 6688d61c66eb91ad X-CR-MTA-TID: 64aa7808 Received: from eb31ef35ba51.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id C36C126C-C10A-44A9-A5C5-B78ED61CF10E.1; Fri, 08 Sep 2023 11:08:08 +0000 Received: from EUR05-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id eb31ef35ba51.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 08 Sep 2023 11:08:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=azokBzByln3oOBuCznrGNVepjMBe+c4/kWQU9ruRnd2KD8VZM9crumotMvhi4Kw6FVcyFV+oS4UK5Ku/5JD2LKQqQRdwaPseB9BU/Kvp3SLgoo6lZvy8hoTFLd69f+tPyzKEgMRhvvm9MCI0QUVOziLbp4GqRMEMTcTYw6qDAtMnljXu2n1TcKjBkp/8eYzh3mSWV782b+p2ORmIx7DxIV6rdaF/NhbFQ8K9dr8J0/a6VEzzA2lZRde/epFchwrFwNK285bQ1QP5KdnYJmvxw/KWGfdX8Y7cKoQbEnCs5fL8QPRiSmtnukSwXE1q13GV2oygHlj41c3NtKNNves5jQ== 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=CRcrdYLXFEE28oYgy6ytx9awL+FdZl9/zCQ0/+zVdks=; b=JDWLqjcIlC8ApvYPKHLsNqvHlC/s8fK/3xIhynfKbFOm7DRMD6W52Z3fcAkPi/ykwV2mFL2ZUsF+YMod/Xgh7wnRE7sXK9fU5hOid0cWR4GnpbId14KejTIv24/u4dc3eALsLbZ/9PE2bn2pWeDB+vARpDxCV195GVJyV7y8mV24mR8ChWaMNJRV9+vQj84WL87XdGjdMqHf8XxpOmdHx8GjMOU7B/uuFSbqhLlwDfY0RzWqmc+MLVGN6JT3O83kvukZy6zHzuFwxF/CkGezRhas3FHQUr1kSKwHYw4MudtuLeL7ys/kT6XP0TEXCepg+tAM1ynewEBKEMBDibFAqA== 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 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CRcrdYLXFEE28oYgy6ytx9awL+FdZl9/zCQ0/+zVdks=; b=KOHKIXl5/V6tSjaPT8Jt1VwK052mdFCN3dtqkCnYDeTwFBz6raBj/7SbkpztOm5u8yKL0ef2V1c1+cAIKisAOTvFclED8Mz4UZNk2A6NpvGF2Rqi7sLZNSdowy+t834oUyw9v0FQOuK6AhqYghirC8/FLKhOK+trtASqWuwR/Go= 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 AS8PR08MB9410.eurprd08.prod.outlook.com (2603:10a6:20b:5a9::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6768.30; Fri, 8 Sep 2023 11:08:06 +0000 Received: from VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::7743:60fe:4859:2df2]) by VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::7743:60fe:4859:2df2%6]) with mapi id 15.20.6768.029; Fri, 8 Sep 2023 11:08:05 +0000 Message-ID: <76297091-3417-0086-b1b7-4ecb438d9cd8@arm.com> Date: Fri, 8 Sep 2023 12:08:00 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.15.0 Subject: Re: [PATCH v5 10/16] [gdb/aarch64] sme: Fixup sigframe gdbarch when vg/svg changes To: gdb-patches@sourceware.org Cc: thiago.bauermann@linaro.org References: <20230907152018.1031257-1-luis.machado@arm.com> <20230907152018.1031257-11-luis.machado@arm.com> Content-Language: en-US From: Luis Machado In-Reply-To: <20230907152018.1031257-11-luis.machado@arm.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO4P265CA0027.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2ae::17) To VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: VI1PR08MB3919:EE_|AS8PR08MB9410:EE_|AM7EUR03FT049:EE_|DU0PR08MB7664:EE_ X-MS-Office365-Filtering-Correlation-Id: 3389cfd6-196e-406b-b417-08dbb05be6e6 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: jfUXhrPjEJdHuN4ud2yooPzR9bNKOLGJxcYD0cjg098HCql5a/1MK1272XBu2cm+5QMEWPYcqTv9Jo5gUkL0n4jN/xHlV07OXAvTDGpQLQk/IfxPaSZLpcBqYuIYvkm1dwdFguCRx7OI8Nh9xc/mzbyvI3UJYG8KcwjANNKYdqqh3tWZmDlIXU/oPd+hqTAR4tr5icluwuADMwuJq0Wys2u0ikBvyLhI5MfczM8wfiMxjsIjlx2LHUCjOPL0lYRuu/9Ed9KWZ+gMMtya/ftW/crA90xn2Kg1QfQ2f1pmfunzANa/QJGG+aMjfzH1WizR3r6j/PN0ZhIrdbF4yKnZ1PVw8zTpJohccYE0hkYufVon7wHiaBXFKUCT/YYAG3y4id6Dg+IQ7Pq5O4X3r60GG16UVUb2nCtA4QseZWK+5IDK+DhJeaq6kCpZaU3x5xAqN7vaYD0IRVPJZL27dwimHCt7lCuiwEnCzI2Qr/XmKQFWr6Y7he9bo6i7WNLfpmK0YddyXpvWBLgNYI5g/VXj+dtTYklrzxJ241IWnRqTsf0gYl8lodbpoBPobT9KRy5lZyzJ6NRvuIo4REeFPs2E6ZGmXZYtXx/TFWghAf5mxt7qQ62gVNmJpNF5v5E/Z+8F4NXgK9kUccQSipzYGQ7wAQ== 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:(13230031)(376002)(39860400002)(346002)(136003)(396003)(366004)(1800799009)(186009)(451199024)(66899024)(38100700002)(36756003)(86362001)(31696002)(478600001)(6512007)(53546011)(6666004)(8676002)(8936002)(6506007)(6486002)(4326008)(44832011)(5660300002)(41300700001)(31686004)(66556008)(66946007)(66476007)(2906002)(30864003)(316002)(6916009)(83380400001)(26005)(2616005)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB9410 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: AM7EUR03FT049.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 5d542151-58cd-4f02-b617-08dbb05bdfe4 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: V6uzjaGTEggtyBPNAd8JqMxLpOD4/1tuTEkP2C7g8qrdtti+PHLrwcGg2nLnmAorBaPSS1lYEwkJK+6B/OTDq2lPEtOFuHElnFHMvxSzluOkWvRHAQrOfxRSs+motwZDTiClDCv4qLm9nZzffHGM9U7CCZAyEF7PvMesnWCaxgIwPHFaPOd7LyJTnqPFrfD3n7fDuUS9ozma6Aj1P5D/krjpkzXbaIok0XSXAq4pPzY4Pgkz/pnrB4XW2jehhPdSi2ZLj9938GPZBWzHxCsWCkfgIqshrefdL7wLEBSTZEax8t0pDOF8Zo54J65HIYTD1TKkIUZ1Qj8s0clfoAN6OvZe5WxpxfINs2EfDxZD7EHO8hJXQd3WDvGmHXkekKLxnYzi1UnY4eNq4KvNNj4w50y1qfCCwJ9bV7w5LDQUicZTaGABQxF7XU4cIBm+f6fll/P0DUyeFFtWVTfWeHtV0InHFssyOvbIKfCKRwkNM4cvt2peNcgg450PP7W5STrp7lvq1jlqCr9CRRyGi/RdU8qeMx/pQe40aAAaLMzdBJ4aJagFhnIUx4q2G0uVkCOhtkGlsunVhXzDdR87n2rS0kbebAU8Xh6ck1c1R0ll1rCf4QXSQpST7Hvmzr3HspDd8VlMMKE3m2PYEydfpW5Efq6gO4ERV/ktUOtIojAthZgRYgUQ90bG49nRP7OWydJeuO7F/COWP1RHy4TT8WBP6bL6OjHkunQAJyQRS/RO4/UgW9ZIgqBIUf32unaBHpoD2Yrd05U8aBSLcaTAdtC/VA== 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:(13230031)(4636009)(346002)(136003)(396003)(376002)(39860400002)(451199024)(1800799009)(186009)(82310400011)(36840700001)(40470700004)(46966006)(82740400003)(66899024)(356005)(81166007)(31686004)(6666004)(6486002)(53546011)(6506007)(36756003)(31696002)(86362001)(36860700001)(40480700001)(47076005)(107886003)(2616005)(26005)(30864003)(336012)(6512007)(83380400001)(478600001)(8676002)(70586007)(70206006)(40460700003)(8936002)(41300700001)(4326008)(5660300002)(2906002)(44832011)(316002)(6916009)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Sep 2023 11:08:16.4511 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3389cfd6-196e-406b-b417-08dbb05be6e6 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: AM7EUR03FT049.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB7664 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,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 List-Id: It would be nice to have a global maintainer go through this one, as it touches a small part of generic gdb code. On 9/7/23 16:20, Luis Machado via Gdb-patches wrote: > Updates in v4: > > - Addressed review comments > > --- > > With SME, where you have two different vector lengths (vl and svl), it may be > the case that the current frame has a set of vector lengths (A) but the signal > context has a distinct set of vector lengths (B). > > In this case, we may run into a situation where GDB attempts to use a gdbarch > created for set A, but it is really dealing with a frame that was using set > B. > > This is problematic, specially with SME, because now we have a different > number of pseudo-registers and types that gets cached on creation of each > gdbarch variation. > > For AArch64 we really need to be able to use the correct gdbarch for each > frame, and I noticed the signal frame (tramp-frame) doesn't have a settable > prev_arch field. So it ends up using the default frame_unwind_arch function > and eventually calling get_frame_arch (next_frame). That means the previous > frame will always have the same gdbarch as the current frame. > > This patch first refactors the AArch64/Linux signal context code, simplifying > it and making it reusable for our purposes of calculating the previous frame's > gdbarch. > > I introduced a struct that holds information that we have found in the signal > context, and with which we can make various decisions. > > Finally, a small change to tramp-frame.c and tramp-frame.h to expose a > prev_arch hook that the architecture can set. > > With this new field, AArch64/Linux can implement a hook that looks at the > signal context and infers the gdbarch for the previous frame. > > Regression-tested on aarch64-linux Ubuntu 22.04/20.04. > --- > gdb/aarch64-linux-tdep.c | 278 +++++++++++++++++++++++++++------------ > gdb/tramp-frame.c | 1 + > gdb/tramp-frame.h | 11 ++ > 3 files changed, 204 insertions(+), 86 deletions(-) > > diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c > index f76d1888072..39855844ad0 100644 > --- a/gdb/aarch64-linux-tdep.c > +++ b/gdb/aarch64-linux-tdep.c > @@ -184,6 +184,39 @@ > #define AARCH64_SME_CONTEXT_SIZE(svq) \ > (AARCH64_SME_CONTEXT_REGS_OFFSET + AARCH64_SME_CONTEXT_ZA_SIZE (svq)) > > +/* Holds information about the signal frame. */ > +struct aarch64_linux_sigframe > +{ > + /* The stack pointer value. */ > + CORE_ADDR sp = 0; > + /* The sigcontext address. */ > + CORE_ADDR sigcontext_address = 0; > + /* The start/end signal frame section addresses. */ > + CORE_ADDR section = 0; > + CORE_ADDR section_end = 0; > + > + /* Starting address of the section containing the general purpose > + registers. */ > + CORE_ADDR gpr_section = 0; > + /* Starting address of the section containing the FPSIMD registers. */ > + CORE_ADDR fpsimd_section = 0; > + /* Starting address of the section containing the SVE registers. */ > + CORE_ADDR sve_section = 0; > + /* Starting address of the section containing the ZA register. */ > + CORE_ADDR za_section = 0; > + /* Starting address of the section containing extra information. */ > + CORE_ADDR extra_section = 0; > + > + /* The vector length (SVE or SSVE). */ > + ULONGEST vl = 0; > + /* The streaming vector length (SSVE/ZA). */ > + ULONGEST svl = 0; > + /* True if we are in streaming mode, false otherwise. */ > + bool streaming_mode = false; > + /* True if we have a ZA payload, false otherwise. */ > + bool za_payload = false; > +}; > + > /* Read an aarch64_ctx, returning the magic value, and setting *SIZE to the > size, or return 0 on error. */ > > @@ -318,129 +351,115 @@ aarch64_linux_restore_vregs (struct gdbarch *gdbarch, > } > } > > -/* Implement the "init" method of struct tramp_frame. */ > +/* Given a signal frame THIS_FRAME, read the signal frame information into > + SIGNAL_FRAME. */ > > static void > -aarch64_linux_sigframe_init (const struct tramp_frame *self, > - frame_info_ptr this_frame, > - struct trad_frame_cache *this_cache, > - CORE_ADDR func) > +aarch64_linux_read_signal_frame_info (frame_info_ptr this_frame, > + struct aarch64_linux_sigframe &signal_frame) > { > - struct gdbarch *gdbarch = get_frame_arch (this_frame); > - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); > - aarch64_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); > - CORE_ADDR sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM); > - CORE_ADDR sigcontext_addr = (sp + AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET > - + AARCH64_UCONTEXT_SIGCONTEXT_OFFSET ); > - CORE_ADDR section = sigcontext_addr + AARCH64_SIGCONTEXT_RESERVED_OFFSET; > - CORE_ADDR section_end = section + AARCH64_SIGCONTEXT_RESERVED_SIZE; > - CORE_ADDR fpsimd = 0; > - CORE_ADDR sve_regs = 0; > - CORE_ADDR za_state = 0; > - uint64_t svcr = 0; > + signal_frame.sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM); > + signal_frame.sigcontext_address > + = signal_frame.sp + AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET > + + AARCH64_UCONTEXT_SIGCONTEXT_OFFSET; > + signal_frame.section > + = signal_frame.sigcontext_address + AARCH64_SIGCONTEXT_RESERVED_OFFSET; > + signal_frame.section_end > + = signal_frame.section + AARCH64_SIGCONTEXT_RESERVED_SIZE; > + > + signal_frame.gpr_section > + = signal_frame.sigcontext_address + AARCH64_SIGCONTEXT_XO_OFFSET; > + > + /* Search for all the other sections, stopping at null. */ > + CORE_ADDR section = signal_frame.section; > + CORE_ADDR section_end = signal_frame.section_end; > uint32_t size, magic; > - size_t vq = 0, svq = 0; > bool extra_found = false; > - int num_regs = gdbarch_num_regs (gdbarch); > - > - /* Read in the integer registers. */ > + enum bfd_endian byte_order > + = gdbarch_byte_order (get_frame_arch (this_frame)); > > - for (int i = 0; i < 31; i++) > - { > - trad_frame_set_reg_addr (this_cache, > - AARCH64_X0_REGNUM + i, > - sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET > - + i * AARCH64_SIGCONTEXT_REG_SIZE); > - } > - trad_frame_set_reg_addr (this_cache, AARCH64_SP_REGNUM, > - sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET > - + 31 * AARCH64_SIGCONTEXT_REG_SIZE); > - trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM, > - sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET > - + 32 * AARCH64_SIGCONTEXT_REG_SIZE); > - > - /* Search for the FP and SVE sections, stopping at null. */ > while ((magic = read_aarch64_ctx (section, byte_order, &size)) != 0 > && size != 0) > { > switch (magic) > { > case AARCH64_FPSIMD_MAGIC: > - fpsimd = section; > - section += size; > - break; > + { > + signal_frame.fpsimd_section = section; > + section += size; > + break; > + } > > case AARCH64_SVE_MAGIC: > { > /* Check if the section is followed by a full SVE dump, and set > sve_regs if it is. */ > gdb_byte buf[4]; > - uint16_t flags; > - > - if (!tdep->has_sve ()) > - break; > > + /* Extract the vector length. */ > if (target_read_memory (section + AARCH64_SVE_CONTEXT_VL_OFFSET, > buf, 2) != 0) > { > + warning (_("Failed to read the vector length from the SVE " > + "signal frame context.")); > section += size; > break; > } > - vq = sve_vq_from_vl (extract_unsigned_integer (buf, 2, byte_order)); > > - /* If SME is supported, also read the flags field. It may > - indicate if this SVE context is for streaming mode (SSVE). */ > - if (tdep->has_sme ()) > + signal_frame.vl = extract_unsigned_integer (buf, 2, byte_order); > + > + /* Extract the flags to check if we are in streaming mode. */ > + if (target_read_memory (section > + + AARCH64_SVE_CONTEXT_FLAGS_OFFSET, > + buf, 2) != 0) > { > - if (target_read_memory (section > - + AARCH64_SVE_CONTEXT_FLAGS_OFFSET, > - buf, 2) != 0) > - { > - section += size; > - break; > - } > - flags = extract_unsigned_integer (buf, 2, byte_order); > - > - /* Is this SSVE data? If so, enable the SM bit in SVCR. */ > - if (flags & SVE_SIG_FLAG_SM) > - svcr |= SVCR_SM_BIT; > + warning (_("Failed to read the flags from the SVE signal frame" > + " context.")); > + section += size; > + break; > } > > - if (size >= AARCH64_SVE_CONTEXT_SIZE (vq)) > - sve_regs = section + AARCH64_SVE_CONTEXT_REGS_OFFSET; > + uint16_t flags = extract_unsigned_integer (buf, 2, byte_order); > > + /* Is this SSVE data? If so, we are in streaming mode. */ > + signal_frame.streaming_mode > + = (flags & SVE_SIG_FLAG_SM) ? true : false; > + > + ULONGEST vq = sve_vq_from_vl (signal_frame.vl); > + if (size >= AARCH64_SVE_CONTEXT_SIZE (vq)) > + { > + signal_frame.sve_section > + = section + AARCH64_SVE_CONTEXT_REGS_OFFSET; > + } > section += size; > break; > } > > case AARCH64_ZA_MAGIC: > { > - if (!tdep->has_sme ()) > - { > - section += size; > - break; > - } > - > /* Check if the section is followed by a full ZA dump, and set > za_state if it is. */ > gdb_byte buf[2]; > > + /* Extract the streaming vector length. */ > if (target_read_memory (section + AARCH64_SME_CONTEXT_SVL_OFFSET, > buf, 2) != 0) > { > + warning (_("Failed to read the streaming vector length from " > + "ZA signal frame context.")); > section += size; > break; > } > - svq = sve_vq_from_vl (extract_unsigned_integer (buf, 2, > - byte_order)); > + > + signal_frame.svl = extract_unsigned_integer (buf, 2, byte_order); > + ULONGEST svq = sve_vq_from_vl (signal_frame.svl); > > if (size >= AARCH64_SME_CONTEXT_SIZE (svq)) > { > - za_state = section + AARCH64_SME_CONTEXT_REGS_OFFSET; > - /* We have ZA data. Enable the ZA bit in SVCR. */ > - svcr |= SVCR_ZA_BIT; > + signal_frame.za_section > + = section + AARCH64_SME_CONTEXT_REGS_OFFSET; > + signal_frame.za_payload = true; > } > - > section += size; > break; > } > @@ -456,11 +475,14 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self, > if (target_read_memory (section + AARCH64_EXTRA_DATAP_OFFSET, > buf, 8) != 0) > { > + warning (_("Failed to read the extra section address from the" > + " signal frame context.")); > section += size; > break; > } > > section = extract_unsigned_integer (buf, 8, byte_order); > + signal_frame.extra_section = section; > extra_found = true; > break; > } > @@ -476,11 +498,48 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self, > if (!extra_found && section > section_end) > break; > } > +} > + > +/* Implement the "init" method of struct tramp_frame. */ > + > +static void > +aarch64_linux_sigframe_init (const struct tramp_frame *self, > + frame_info_ptr this_frame, > + struct trad_frame_cache *this_cache, > + CORE_ADDR func) > +{ > + /* Read the signal context information. */ > + struct aarch64_linux_sigframe signal_frame; > + aarch64_linux_read_signal_frame_info (this_frame, signal_frame); > + > + /* Now we have all the data required to restore the registers from the > + signal frame. */ > + > + /* Restore the general purpose registers. */ > + CORE_ADDR offset = signal_frame.gpr_section; > + for (int i = 0; i < 31; i++) > + { > + trad_frame_set_reg_addr (this_cache, AARCH64_X0_REGNUM + i, offset); > + offset += AARCH64_SIGCONTEXT_REG_SIZE; > + } > + trad_frame_set_reg_addr (this_cache, AARCH64_SP_REGNUM, offset); > + offset += AARCH64_SIGCONTEXT_REG_SIZE; > + trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM, offset); > > - if (sve_regs != 0) > + struct gdbarch *gdbarch = get_frame_arch (this_frame); > + aarch64_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); > + > + /* Restore the SVE / FPSIMD registers. */ > + if (tdep->has_sve () && signal_frame.sve_section != 0) > { > - CORE_ADDR offset; > + ULONGEST vq = sve_vq_from_vl (signal_frame.vl); > + CORE_ADDR sve_regs = signal_frame.sve_section; > + > + /* Restore VG. */ > + trad_frame_set_reg_value (this_cache, AARCH64_SVE_VG_REGNUM, > + sve_vg_from_vl (signal_frame.vl)); > > + int num_regs = gdbarch_num_regs (gdbarch); > for (int i = 0; i < 32; i++) > { > offset = sve_regs + (i * vq * 16); > @@ -510,30 +569,75 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self, > trad_frame_set_reg_addr (this_cache, AARCH64_SVE_FFR_REGNUM, offset); > } > > - if (fpsimd != 0) > + /* Restore the FPSIMD registers. */ > + if (signal_frame.fpsimd_section != 0) > { > + CORE_ADDR fpsimd = signal_frame.fpsimd_section; > + > trad_frame_set_reg_addr (this_cache, AARCH64_FPSR_REGNUM, > fpsimd + AARCH64_FPSIMD_FPSR_OFFSET); > trad_frame_set_reg_addr (this_cache, AARCH64_FPCR_REGNUM, > fpsimd + AARCH64_FPSIMD_FPCR_OFFSET); > > /* If there was no SVE section then set up the V registers. */ > - if (sve_regs == 0) > + if (!tdep->has_sve () || signal_frame.sve_section == 0) > aarch64_linux_restore_vregs (gdbarch, this_cache, fpsimd); > } > > - if (za_state != 0) > + /* Restore the SME registers. */ > + if (tdep->has_sme ()) > { > - /* Restore the ZA state. */ > - trad_frame_set_reg_addr (this_cache, tdep->sme_za_regnum, > - za_state); > + if (signal_frame.za_section != 0) > + { > + /* Restore the ZA state. */ > + trad_frame_set_reg_addr (this_cache, tdep->sme_za_regnum, > + signal_frame.za_section); > + } > + > + /* Restore/Reconstruct SVCR. */ > + ULONGEST svcr = 0; > + svcr |= signal_frame.za_payload ? SVCR_ZA_BIT : 0; > + svcr |= signal_frame.streaming_mode ? SVCR_SM_BIT : 0; > + trad_frame_set_reg_value (this_cache, tdep->sme_svcr_regnum, svcr); > + > + /* Restore SVG. */ > + trad_frame_set_reg_value (this_cache, tdep->sme_svg_regnum, > + sve_vg_from_vl (signal_frame.svl)); > } > > - /* If SME is supported, set SVCR as well. */ > - if (tdep->has_sme ()) > - trad_frame_set_reg_value (this_cache, tdep->sme_svcr_regnum, svcr); > + trad_frame_set_id (this_cache, frame_id_build (signal_frame.sp, func)); > +} > > - trad_frame_set_id (this_cache, frame_id_build (sp, func)); > +/* Implements the "prev_arch" method of struct tramp_frame. */ > + > +static struct gdbarch * > +aarch64_linux_sigframe_prev_arch (frame_info_ptr this_frame, > + void **frame_cache) > +{ > + struct trad_frame_cache *cache > + = (struct trad_frame_cache *) *frame_cache; > + > + gdb_assert (cache != nullptr); > + > + struct aarch64_linux_sigframe signal_frame; > + aarch64_linux_read_signal_frame_info (this_frame, signal_frame); > + > + /* The SVE vector length and the SME vector length may change from frame to > + frame. Make sure we report the correct architecture to the previous > + frame. > + > + We can reuse the next frame's architecture here, as it should be mostly > + the same, except for potential different vg and svg values. */ > + const struct target_desc *tdesc > + = gdbarch_target_desc (get_frame_arch (this_frame)); > + aarch64_features features = aarch64_features_from_target_desc (tdesc); > + features.vq = sve_vq_from_vl (signal_frame.vl); > + features.svq = (uint8_t) sve_vq_from_vl (signal_frame.svl); > + > + struct gdbarch_info info; > + info.bfd_arch_info = bfd_lookup_arch (bfd_arch_aarch64, bfd_mach_aarch64); > + info.target_desc = aarch64_read_description (features); > + return gdbarch_find_by_info (info); > } > > static const struct tramp_frame aarch64_linux_rt_sigframe = > @@ -550,7 +654,9 @@ static const struct tramp_frame aarch64_linux_rt_sigframe = > {0xd4000001, ULONGEST_MAX}, > {TRAMP_SENTINEL_INSN, ULONGEST_MAX} > }, > - aarch64_linux_sigframe_init > + aarch64_linux_sigframe_init, > + nullptr, /* validate */ > + aarch64_linux_sigframe_prev_arch, /* prev_arch */ > }; > > /* Register maps. */ > diff --git a/gdb/tramp-frame.c b/gdb/tramp-frame.c > index c69ee6efc2c..94e42e9fec1 100644 > --- a/gdb/tramp-frame.c > +++ b/gdb/tramp-frame.c > @@ -170,5 +170,6 @@ tramp_frame_prepend_unwinder (struct gdbarch *gdbarch, > unwinder->stop_reason = default_frame_unwind_stop_reason; > unwinder->this_id = tramp_frame_this_id; > unwinder->prev_register = tramp_frame_prev_register; > + unwinder->prev_arch = tramp_frame->prev_arch; > frame_unwind_prepend_unwinder (gdbarch, unwinder); > } > diff --git a/gdb/tramp-frame.h b/gdb/tramp-frame.h > index fa0241acb2d..9b43d5e1a36 100644 > --- a/gdb/tramp-frame.h > +++ b/gdb/tramp-frame.h > @@ -42,6 +42,13 @@ struct trad_frame_cache; > instruction sequence. */ > #define TRAMP_SENTINEL_INSN ULONGEST_MAX > > +/* Assuming the frame chain: (outer) prev <-> this <-> next (inner); > + use THIS frame, and implicitly the NEXT frame's register unwind > + method, to return PREV frame's architecture. */ > + > +typedef struct gdbarch *(frame_prev_arch_ftype) (frame_info_ptr this_frame, > + void **this_prologue_cache); > + > struct tramp_frame > { > /* The trampoline's type, some a signal trampolines, some are normal > @@ -75,6 +82,10 @@ struct tramp_frame > int (*validate) (const struct tramp_frame *self, > frame_info_ptr this_frame, > CORE_ADDR *pc); > + > + /* Given the current frame in THIS_FRAME and a frame cache in FRAME_CACHE, > + return the architecture of the previous frame. */ > + frame_prev_arch_ftype *prev_arch; > }; > > void tramp_frame_prepend_unwinder (struct gdbarch *gdbarch,