From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 6YHZAkGPNmmcByMAWB0awg (envelope-from ) for ; Mon, 08 Dec 2025 03:41:37 -0500 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=amd.com header.i=@amd.com header.a=rsa-sha256 header.s=selector1 header.b=X2t/iXLh; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 0727D1E0B3; Mon, 08 Dec 2025 03:41:37 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_SBL_CSS,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=no autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 44E811E048 for ; Mon, 08 Dec 2025 03:41:36 -0500 (EST) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D6FA74CF319C for ; Mon, 8 Dec 2025 08:41:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D6FA74CF319C Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=amd.com header.i=@amd.com header.a=rsa-sha256 header.s=selector1 header.b=X2t/iXLh Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010061.outbound.protection.outlook.com [52.101.46.61]) by sourceware.org (Postfix) with ESMTPS id A16974CF3191 for ; Mon, 8 Dec 2025 08:41:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A16974CF3191 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=amd.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A16974CF3191 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=52.101.46.61 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1765183267; cv=pass; b=d1P0WOd9NVeF/xZY+7a/6J64HHeWhE1FG/hoMC6e4ZYaQ/Fp/A6MhteYvJGL/Qviwp2IEe14QtUMOvgVdc0EJRaDRztQPXnkpnPNg/xcO6Ty4snhCcMb4ctOdhe4QZINmtfkLDmA6kyuAh9uRskznWe8524f5pLJdnbsqs4HP9c= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1765183267; c=relaxed/simple; bh=okDtRG3pNbv5/m07MMem8QXyOM6SwditraMtlaAUh6U=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=pMiXagk5PSIfttfR3J3xJvX0U/4z1VJrufcgpMuLunQ1FxtPb4ZLacHg+qqscoBuvAjruId/ahaJszo0Il2CKp0nCvh5G3BTFOFonXgpAGGQvAu9ltL6bQAS0cm/gyUfJJsNttI94/uvKu9sOYCOj/FPZwGmG+YwKrj92Fw/wyg= ARC-Authentication-Results: i=2; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A16974CF3191 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=s3MWYaL8Nvqan+jLJzxpGIXft9UcXVGy+TT5TZLLuAJxFDGomwRCJ9z1lQYXG6XKo/BPpwodO2mu5JOgaOVzOt89RZHYYyGpEm6XLdrB37PG7wK2ghYqVACfd/c1i82l9StzcO0yXjCd4fRXjgFOoAYDUkIb0HDASzoLQooNI6zRPksuIr5ryS1F12Yow24iDhKMms9X1zO4NbrRlAt4GLMxwhzTcjyneQmMBSERDzN3rq/W6UCZWfwOAfzcb+7iRQocSf2jfpw/F+ip1recGMzmRbFwYCteRxwVnTdb9QOwpR7IIUDm3bVPRkt+udtA12xeEoBT60V6D78puwtP3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=MTjgQLHo5K6ySgQklCVks7mhnnNu+INo858u+qUVPcU=; b=xUV0sPRWF6iOoikPv1Sp1GbSumLpka6BhLRHqyUwn97MEmYz6GY1W+1kdAtC2igqG2st3iZ6PnWlwdwLoQWOrM5ZoorsK5AcA+XWm2HtLN8ShmPO+sshPRr/63WtjSNAQbgIECTdqk0/nDCciJVTjPTeeAvBtkbWy29F1gKhCiopB8d2O9+TD/ednZBwe1DxVZ8c85pd291ktydPAHAn7+SzRr/6eRBGJRrkgSOwA7UFUILbIfYf1qaALD00wjMqe4Fphj8f3o8xOBnt7AYTShBHRkyYoFTuV7dnXhHbpTnJQLxnvQ8u0+qAAYzo4yL8utmKcqQVRFUSBMzNxCLoAw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=sourceware.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MTjgQLHo5K6ySgQklCVks7mhnnNu+INo858u+qUVPcU=; b=X2t/iXLhPoNv3H5ZDTwWYXNTNzYrEVLuyShZn92wLX6o4XL6eyHo/mX1tvfcjLhatH60uHXmj2RCdmieJB7VGDRVXhaSUqvgtwYOYHcCzgPOEEWqkCYqpkGVBXIa55LstbM12spV8vs/N+/Ia7hEiz/mtpkorADCfm3pvhD7IC4= Received: from PH8PR07CA0018.namprd07.prod.outlook.com (2603:10b6:510:2cd::15) by IA1PR12MB6626.namprd12.prod.outlook.com (2603:10b6:208:3a2::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Mon, 8 Dec 2025 08:41:02 +0000 Received: from CY4PEPF0000EE37.namprd05.prod.outlook.com (2603:10b6:510:2cd:cafe::2d) by PH8PR07CA0018.outlook.office365.com (2603:10b6:510:2cd::15) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9388.14 via Frontend Transport; Mon, 8 Dec 2025 08:40:54 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by CY4PEPF0000EE37.mail.protection.outlook.com (10.167.242.43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.4 via Frontend Transport; Mon, 8 Dec 2025 08:41:00 +0000 Received: from amd-System-Product-Name.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 8 Dec 2025 02:40:58 -0600 From: Vignesh Balasubramanian To: , , , , , CC: Vignesh Balasubramanian Subject: [PATCH 32 1/2] core: Consume the new .note section that contains descriptions of xsave layout Date: Mon, 8 Dec 2025 14:08:19 +0530 Message-ID: <20251208083819.2560894-2-vigbalas@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251208083819.2560894-1-vigbalas@amd.com> References: <20251208083819.2560894-1-vigbalas@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000EE37:EE_|IA1PR12MB6626:EE_ X-MS-Office365-Filtering-Correlation-Id: 97059078-851a-4655-210c-08de3635841d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|36860700013|376014|1800799024|13003099007; X-Microsoft-Antispam-Message-Info: =?utf-8?B?aWZISzVjbTV5Z2t3OEltS0QzaGs2MzAzWkh3WWFaN1N2RkZGVWlJOWdTSEE5?= =?utf-8?B?TDlqcXV2S0pjVWtzTUcraUF3eVpwZVhpekFWRk5EVXV2WS9WRnlGbzJhS21Y?= =?utf-8?B?cEppQVk0eGlGakVWN0w5WUVKb1ZqTHBudnpmeDJVaVZvZDRGVTFKMWV6NUxZ?= =?utf-8?B?TXhHK2ZDbkQ1OUZKT2VMQ1M0L0dHRmpyM0tranlYcHdRTFVsckdiUXFMeTVP?= =?utf-8?B?NlFzY2kwZUVQcDh3MW8vMmNHUnVIMFZreW0vYklSRng5YzBDUlpvbzdsanh5?= =?utf-8?B?YWk3RGl5dFgraXJoRjJGd3I0bHpTZVZYUGJRZ3hrcW5KcHRBYTBodVcrWkZa?= =?utf-8?B?UW1TMjdRTFdtWTRYd1QxYmZ1Z0NYSk4rSVpKVEFkVHFucG82b0poYnNhc3Jz?= =?utf-8?B?ZHY2ZE9YNWNxMjZZY1NKdXdWTW5XTXAvdGRNbkdJUnEydTBEODdHVHYyaTdp?= =?utf-8?B?eERZMFZ0eHNLL3JQK01tL1hyWUVyV2tyVTZQWDYwOFp2NHI2bWhFT25uT0Q2?= =?utf-8?B?bWcvaWdVeVVFbjhzRzJySUxkME9DSEIxcXpkbHpZS1NQaklmL1JsYStucElu?= =?utf-8?B?T1ZKWllXeUM2ekwrY3BRcmR1aUNGdWR0bEE3Z2lWYjZrNTFWMXVvaGRKcGxI?= =?utf-8?B?bldRc3Vyb1RUcnJEdlVDOVdYK1B5WkhFWGVWY1hIT2l2aUVObHpqYllXZjVs?= =?utf-8?B?cWFzMGtPWkdZQkFuRW1XeC8xSUNpQUd0WU1TWnNGZlBQWE8wZjVBdjA0L2xr?= =?utf-8?B?cE5JME8wWmwrMFlEbVpQRG8rUXhFVHVON04yRkZ1NEZub24yRWplN09oNU5u?= =?utf-8?B?eGgzSjA1THhkQk5vT3JKL0pIT0Y4MjRtcjZpdXhiZ2U2MXJxbFptaUN2RXl0?= =?utf-8?B?S08yT1QxOEVKUm1FL0lMelQ2bTY0Q1B3cEQybDdKUmRJTUR0azNuSnoyT2V6?= =?utf-8?B?Z2NQME9lK1VoMTRhTGVqQXJ6dDB2ajVnYm05R3owSW9OSU4zTjZVa3R1WUVR?= =?utf-8?B?WnJEZmFlRmZmSmF5TmQ5MUxCdE9MSFM1UEJkMnp3bTVUa0gzaURKdDdFOGp0?= =?utf-8?B?V0NuUnZZdjNzTnNHbXFOTFpFckFUakZOWnRaakl5R3lzSzBUOXljdG50cEln?= =?utf-8?B?eDExTml2UU4xclJ6YnM4YTBFQ0VOYmg3MFF0cVZKT05YTHliaDV4NjNVei9Q?= =?utf-8?B?YU1FalExYktMcTVyNUJvT2c5WlAxVkFGcmduMXlpK3ptZ1hjdWN1Z01sZ0F2?= =?utf-8?B?TXhOblc5NHdrRkxQcE9qTmdsZThNL1k5UHE1SU1YOG0zekVvdytiY3IybHlo?= =?utf-8?B?U1hPdkF5emsvTCtnRWtsVXpLaVZZcVJCaktxcFZIY3RMUldqSW8wY0NlcVEv?= =?utf-8?B?L2d5MmsyS09uaWRFQnZqT0c0NDM2WUxHMEFmQ01pR2RIYWR2Y3MrMSsyT0Vq?= =?utf-8?B?Uk5RRkxlUldqU3hwZFIrREd2NVFtRlE4b2dESi9QWjdwR1NhcG4yakNiMUc3?= =?utf-8?B?ZVg1VnZPRW5WVEozMEJ5a2d2cjNWNHdzcUp0UWRtVnJJMldaNGVMQ01pV1FZ?= =?utf-8?B?R2ZOempOdm9DaEV2Y0lPZktJTkR1U0ZjWmw0b2JqN1UxbWhvWVpPajB5L0VZ?= =?utf-8?B?SFBjOWNmTlpsT2RsMTk0eTVzYjY4Wlh2TkhWUjdva3ZRMjFXWlpjRlR6dFUx?= =?utf-8?B?ZzNWaUVBekQyeUFFT0plZi9VMHQ4RmVpWG11bzdXYkVGSytaaDNJNmZ4Nkxv?= =?utf-8?B?Z2I0ZkdBaTJwNDF6N0I5RktYMjlZcjVvSlZlRkJla3dXelloSnhKWGxUczBS?= =?utf-8?B?dzROR0sraUc5MnMzaXY3NW9DUU15b1l0bnBZNUhPclByWUdnZ214RlFxdXdU?= =?utf-8?B?VGlpWFJORURBbXVWOEU3a1VXa01aVlRSSVZnaS8vUnhzZlhBUEV6OVJYSzRm?= =?utf-8?B?bDRtdEtDSEJ3OWFSODVXbSt2bzlqWTcyNG9TL29YNm5saE5hVWVoeGRFTVVM?= =?utf-8?B?OTFvNkZCR0lnNDZLbEdJNnBkUXFJQXlNcVQ3WUlxUkU5Z0ZJSWg0VG1yaGZq?= =?utf-8?B?RXI0Z21YWEpFMG9YcWJNVXBkeXFQSmVkcnBHM1V3N2x5RzV3YXY4dEp0bm4r?= =?utf-8?Q?rZyF74TbL/3FgejCaQpTVbDmn?= X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:satlexmb07.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(82310400026)(36860700013)(376014)(1800799024)(13003099007); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2025 08:41:00.9989 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 97059078-851a-4655-210c-08de3635841d X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000EE37.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6626 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org Currently, we use some heuristics [1] to find the offsets of the xsave features present in the xsave layouts of core files using XCR0 value. While GDB can currently access the values of AVX-512 and PKRU registers on AMD and Intel CPUs using existing heuristics, this approach may fail if the XSAVE register offsets vary — even with the same XCR0 value. Additionally, the current implementation may not scale effectively if a new XSAVE state is introduced that matches the size of the existing states. Linux kernel from 6.12 [2] creates a new .note section "NT_X86_XSAVE_LAYOUT" which contains information on the size, offset and flags of each xsave feature present when core is dumped. [1] https://github.com/bminor/binutils-gdb/commit/c689d1fe58b2c0faf51e4f574d50271f1d0648e3 [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/arch/x86/kernel/fpu/xstate.c?id=ba386777a30b38dabcc7fb8a89ec2869a09915f7 Co-Authored-By: Jini Susan George V2 -> V3: Removed "struct x86_xfeat_component" and used "extract_unsigned_integer". "if conditions" of i386_linux_core_read_xsave_info is modified. Renamed macro "X86_XSTATE_TILE_DATA " and X86_XSTATE_PASID". Some NITs --- gdb/amd64-linux-tdep.c | 2 +- gdb/i386-linux-tdep.c | 25 +++++++++--- gdb/i386-linux-tdep.h | 3 +- gdb/i387-tdep.c | 86 +++++++++++++++++++++++++++++++++++++++++ gdb/i387-tdep.h | 12 ++++++ gdbsupport/x86-xstate.h | 4 ++ 6 files changed, 124 insertions(+), 8 deletions(-) diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index 284c956cd9b..393c0fd2adc 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -1614,7 +1614,7 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch, { /* Linux/x86-64. */ x86_xsave_layout layout; - uint64_t xstate_bv = i386_linux_core_read_xsave_info (abfd, layout); + uint64_t xstate_bv = i386_linux_core_read_xsave_info (gdbarch, abfd, layout); if (xstate_bv == 0) xstate_bv = X86_XSTATE_SSE_MASK; diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c index 1d6abe2f546..8a7f416fb66 100644 --- a/gdb/i386-linux-tdep.c +++ b/gdb/i386-linux-tdep.c @@ -1077,7 +1077,8 @@ static int i386_linux_sc_reg_offset[] = /* See i386-linux-tdep.h. */ uint64_t -i386_linux_core_read_xsave_info (bfd *abfd, x86_xsave_layout &layout) +i386_linux_core_read_xsave_info (struct gdbarch *gdbarch, bfd *abfd, + x86_xsave_layout &layout) { asection *xstate = bfd_get_section_by_name (abfd, ".reg-xstate"); if (xstate == nullptr) @@ -1099,10 +1100,22 @@ i386_linux_core_read_xsave_info (bfd *abfd, x86_xsave_layout &layout) uint64_t xcr0 = bfd_get_64 (abfd, contents); - if (!i387_guess_xsave_layout (xcr0, size, layout)) - return 0; + /* Try using the note describing the XSAVE layout, if present. */ + if (asection *xsave_layout_desc + = bfd_get_section_by_name (abfd, ".reg-xsave-layout"); + xsave_layout_desc != nullptr) + { + if (i387_read_xsave_layout_desc (gdbarch, abfd, size, + layout, xsave_layout_desc)) + return xcr0; + } - return xcr0; + /* Otherwise, fallback to guessing the layout based on the size of the XSAVE + buffer. */ + if (i387_guess_xsave_layout (xcr0, size, layout)) + return xcr0; + + return 0; } /* See i386-linux-tdep.h. */ @@ -1111,7 +1124,7 @@ bool i386_linux_core_read_x86_xsave_layout (struct gdbarch *gdbarch, bfd &cbfd, x86_xsave_layout &layout) { - return i386_linux_core_read_xsave_info (&cbfd, layout) != 0; + return i386_linux_core_read_xsave_info (gdbarch, &cbfd, layout) != 0; } /* See arch/x86-linux-tdesc.h. */ @@ -1131,7 +1144,7 @@ i386_linux_core_read_description (struct gdbarch *gdbarch, { /* Linux/i386. */ x86_xsave_layout layout; - uint64_t xcr0 = i386_linux_core_read_xsave_info (abfd, layout); + uint64_t xcr0 = i386_linux_core_read_xsave_info (gdbarch, abfd, layout); if (xcr0 == 0) { diff --git a/gdb/i386-linux-tdep.h b/gdb/i386-linux-tdep.h index e75e53aba95..73c3729e885 100644 --- a/gdb/i386-linux-tdep.h +++ b/gdb/i386-linux-tdep.h @@ -58,7 +58,8 @@ enum i386_linux_regnum Otherwise, return 0 to indicate no state was found and leave LAYOUT untouched. */ -extern uint64_t i386_linux_core_read_xsave_info (bfd *abfd, +extern uint64_t i386_linux_core_read_xsave_info (struct gdbarch *gdbarch, + bfd *abfd, x86_xsave_layout &layout); /* Implement the core_read_x86_xsave_layout gdbarch method. */ diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c index ff66712ed0d..f6bee42fc7d 100644 --- a/gdb/i387-tdep.c +++ b/gdb/i387-tdep.c @@ -959,6 +959,92 @@ i387_guess_xsave_layout (uint64_t xcr0, size_t xsave_size, /* See i387-tdep.h. */ +bool +i387_read_xsave_layout_desc (struct gdbarch *gdbarch, bfd *abfd, + size_t xsave_size, + x86_xsave_layout &layout, + asection* xsave_layout_desc) +{ + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + gdb_byte *buf = (gdb_byte *) xmalloc(bfd_section_size(xsave_layout_desc)); + + if (!bfd_get_section_contents (abfd, xsave_layout_desc, buf, 0, + xsave_layout_desc->size)) + { + warning (_("Couldn't read XSAVE Layout description records from" + "'.reg-xsave-layout' section in core file.")); + return false; + } + + /* This note section in linux is an array of below struct: + struct x86_xfeat_component + { + uint32_t type; + uint32_t size; + uint32_t offset; + uint32_t flags; + }; + 16 bytes for each record. + We are interested in type (0th byte) and offset (8th byte). */ + + #define SIZEOF_XFEAT_TYPE 4 + #define SIZEOF_XFEAT_OFFSET 4 + #define OFFSET_AT_RECORD 8 + #define SIZE_OF_RECORD 16 + + for (int i = 0; i < xsave_layout_desc->size; ) + { + switch (extract_unsigned_integer(buf + i, SIZEOF_XFEAT_TYPE, byte_order)) + { + case X86_XSTATE_AVX_ID: + layout.avx_offset = extract_unsigned_integer(buf + (i + OFFSET_AT_RECORD), + SIZEOF_XFEAT_OFFSET, + byte_order); + break; + case X86_XSTATE_BNDREGS_ID: + case X86_XSTATE_BNDCFG_ID: + /* MPX support in GDB is deprecated from GDB 15.2 Release. */ + continue; + case X86_XSTATE_K_ID: + layout.k_offset = extract_unsigned_integer(buf + (i + OFFSET_AT_RECORD), + SIZEOF_XFEAT_OFFSET, + byte_order); + break; + case X86_XSTATE_ZMM_H_ID: + layout.zmm_h_offset = extract_unsigned_integer(buf + (i + OFFSET_AT_RECORD), + SIZEOF_XFEAT_OFFSET, + byte_order); + break; + case X86_XSTATE_ZMM_ID: + layout.zmm_offset = extract_unsigned_integer(buf + (i + OFFSET_AT_RECORD), + SIZEOF_XFEAT_OFFSET, + byte_order); + break; + case X86_XSTATE_PKRU_ID: + layout.pkru_offset = extract_unsigned_integer(buf + (i + OFFSET_AT_RECORD), + SIZEOF_XFEAT_OFFSET, + byte_order); + break; + case X86_XSTATE_PASID_ID ... X86_XSTATE_TILEDATA_ID: + /* These IDs are not part of x86_xsave_layout currently, + so we ignore. */ + continue; + default: + /* 19 - 31 are reserved, shouldn't be any record with these IDs. */ + warning (_("Unhandled xsave feature record type.")); + break; + } + + i += SIZE_OF_RECORD; + } + + xfree (buf); + layout.sizeof_xsave = xsave_size; + return true; +} + +/* See i387-tdep.h. */ + x86_xsave_layout i387_fallback_xsave_layout (uint64_t xcr0) { diff --git a/gdb/i387-tdep.h b/gdb/i387-tdep.h index ed4df1d2458..becbed92260 100644 --- a/gdb/i387-tdep.h +++ b/gdb/i387-tdep.h @@ -139,6 +139,18 @@ extern void i387_supply_fxsave (struct regcache *regcache, int regnum, extern bool i387_guess_xsave_layout (uint64_t xcr0, size_t xsave_size, x86_xsave_layout &layout); +/* Read offsets of xsave features in XSAVE Layout from the .note + section generated by Linux. + This .note section contains offset and size information of xsave + feature present in the machine where core file is dumped and it helps + to avoid guessing or hardcoding the offsets. + This feature is available from Linux 6.12. */ + +extern bool i387_read_xsave_layout_desc (struct gdbarch *gdbarch, bfd *abfd, + size_t xsave_size, + x86_xsave_layout &layout, + asection *xsave_layout_desc); + /* Compute an XSAVE layout based on the XCR0 bitmask. This is used as a fallback if a target does not provide an XSAVE layout. */ diff --git a/gdbsupport/x86-xstate.h b/gdbsupport/x86-xstate.h index 6657c450c88..a9ab39152ad 100644 --- a/gdbsupport/x86-xstate.h +++ b/gdbsupport/x86-xstate.h @@ -24,11 +24,15 @@ #define X86_XSTATE_X87_ID 0 #define X86_XSTATE_SSE_ID 1 #define X86_XSTATE_AVX_ID 2 +#define X86_XSTATE_BNDREGS_ID 3 +#define X86_XSTATE_BNDCFG_ID 4 #define X86_XSTATE_K_ID 5 #define X86_XSTATE_ZMM_H_ID 6 #define X86_XSTATE_ZMM_ID 7 #define X86_XSTATE_PKRU_ID 9 +#define X86_XSTATE_PASID_ID 10 #define X86_XSTATE_CET_U_ID 11 +#define X86_XSTATE_TILEDATA_ID 18 /* The extended state feature bits. */ #define X86_XSTATE_X87 (1ULL << X86_XSTATE_X87_ID) -- 2.34.1