From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id ycGvDGKXlmoUQxoAWB0awg (envelope-from ) for ; Tue, 01 Sep 2026 05:14:10 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=j+Z7r5fI; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=j+Z7r5fI; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 2A20B1E166; Tue, 01 Sep 2026 05:14:10 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=unavailable autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::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 4AC1A1E09B for ; Tue, 01 Sep 2026 05:14:07 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B15844BA2E0B for ; Tue, 1 Sep 2026 09:14:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B15844BA2E0B Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=j+Z7r5fI; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=j+Z7r5fI Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11010067.outbound.protection.outlook.com [52.101.69.67]) by sourceware.org (Postfix) with ESMTPS id 1BFE34BA9030 for ; Tue, 1 Sep 2026 09:13:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1BFE34BA9030 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1BFE34BA9030 Authentication-Results: sourceware.org; arc=pass smtp.remote-ip=52.101.69.67 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1788253994; cv=pass; b=uBXudfp66bO1gLcGSURagbjwx8Tc/9TBPXD6QH1ZlVx40yQ08HDknkseIPa5Gra3BpRAn2d+lstV7L7SPI3WsHVv7RhW5mgu0K/Iq8NLmHR3WlOgp2Kt1wog4OHPrjUgkfqDqJ4tHO+mmuzd+JtGUKp5bwhyJG+BXanaFZKy764= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1788253994; c=relaxed/simple; bh=fKmsUni7Xmlfg3BCPv/J1QY9sbbK4fD3TllZqJQo26A=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=nSDAMCYoCA6l/Tgcl7Mrp5ly6OrR/tWHcnrriNUtS90iAZoqaQoBgK5wbNZvF9rxQVmLzTxyc3PV4lHWR9p3+HNPOYwO0p9Xx8BMVczAfLy4fjtR979Ss9BzKPPYr5d+6JlqEbZ3xNLo/VvDgZ0cWGoqMdLPjbi7xUYiAqj1aZw= ARC-Authentication-Results: i=3; sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=j+Z7r5fI; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=j+Z7r5fI DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1BFE34BA9030 ARC-Seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=mJg+FMgO5qjoCyVo1s+UF+OrkKEM3A3CIBDj1Xxugor4LVN1QgUEhtU8SnIFAJK5i4r23pufBoHYZK2DADUY5dAyxD5wXfVFPgPXzueecYTAUiZeWwGpTD8Q3Q/ymqqNFRQ8R+Xi11X4Zn5PkEOzYV6XPs+95HbfosUl+bA4l2dXpcYlO5j/ZvwxUOUDztJqfzb8A1DLCnGEL3lsIJHoZu5Y/M17KykY/VUrlXwqLXlwizTgJwdd6LBgfHkK92giWC3PnEQuMsqb7P2x6jbeU8QdaEMQIfc0q3VNcmovg8SkKjq2HyIvqaq1zEFUsJE3F/ua3VHDRb3X1Zodm4aS7g== ARC-Message-Signature: i=2; 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=1Q8WUMoVy1kmSksBXw/xYOLtR6Bnl4P6pDCYUOAOfzY=; b=Rppbgrh7WmJn/E31PPRpHHAp5XI4nO1C7TR0Wr0+qyAFNMBG2tT7xjl7DA8xLihCuvkHXsNIRftfcgCE1msbae91+h0SnMo6LC9sZB89fkHP511HnpaR3pe9ocRPD5yTL19h1HeYBOGjQXH/6kOHI29ZeWZHVj990GoiIleq82wDubgcol0m+/4rDfRbk3UkElox/O6AKgZx3jrNuVF4yX3uMnP4PT6Pp6Mlx3VBW3ya/lNStJ/q1DhUcHglTECKU5t+RRPLU1R05AH0qRgIMEGL0hOca5Zcdbc8vO+95sZRE546tXlHDEvAdQk2jx3oWWgCfFO6+rvGyJYRZJCcFg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 4.158.2.129) 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=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dmarc=[1,1,header.from=arm.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1Q8WUMoVy1kmSksBXw/xYOLtR6Bnl4P6pDCYUOAOfzY=; b=j+Z7r5fImlTFqldcotL5KthsrrS0eIXyCWULMiIb4BGOv8vaI16sph+VFdl7UUE2A+fZyHbDe8HvKcWY2BQMsRlJqwlWElXjd+gRMNcPQnJ/OgdMvIdlJcqcDkAkSXMyKFbI7jMJkxsCHrTlX/W1t4bnf3j0xKrFs//dn+PjIzk= Received: from AM8P191CA0019.EURP191.PROD.OUTLOOK.COM (2603:10a6:20b:21a::24) by PA4PR08MB6048.eurprd08.prod.outlook.com (2603:10a6:102:e6::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Tue, 1 Sep 2026 09:12:57 +0000 Received: from AMS0EPF00000198.eurprd05.prod.outlook.com (2603:10a6:20b:21a:cafe::82) by AM8P191CA0019.outlook.office365.com (2603:10a6:20b:21a::24) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.13 via Frontend Transport; Tue, 1 Sep 2026 09:12:57 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 4.158.2.129) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=arm.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 4.158.2.129 as permitted sender) receiver=protection.outlook.com; client-ip=4.158.2.129; helo=outbound-uk1.az.dlp.m.darktrace.com; pr=C Received: from outbound-uk1.az.dlp.m.darktrace.com (4.158.2.129) by AMS0EPF00000198.mail.protection.outlook.com (10.167.16.244) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Tue, 1 Sep 2026 09:12:56 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=skS0h22CzLX4zu1A/QdHTayXQonKXsAxNgvGJZeY0lgaciY3nVCWNvoIU+LG7zbM+WA5N0Ic7MU1jbwk0gwzZg+3goz0IifNMmVTeHB1LOOpaPwMPmTj/CP/LIk8MdvT17BTMR7mVolyO6SuTVLzhE6t3ADNXWJ4B7jnrNJgflywFTVK9jdVaE7m91JwRt1kNQhx8ByAV4d4/+6Eo3EXOqGDPeAqzf7gAJn5VNrKzUUNgZSr4d5Y7gJdSfpQEI44tMOVixirqHQaQThhMAvOTfrYLZJItt+Hy5Tz1vElbh6tdaO2cAZa9cmO3hHOZHVv0JslkPtST9QZ6TjkCVvx/Q== 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=1Q8WUMoVy1kmSksBXw/xYOLtR6Bnl4P6pDCYUOAOfzY=; b=hVhTK3MX022qQaCH2qou1+3ysDvTSK0f3CY7tGjz85qEpuMzCN/aPJMcxsX7jaWl4jbe9nP8mfrZEwNFC7QzMJjFBWJNaxoTzVivbvLE2rMFTqYwv+Gckw4yVt4oqieluZwabnZM6TcAmkG6175Qybs0N8HuO2B7BZP03Szszud3Mv1Q56W/FSiQet5b82CFeoRkNAQ+YRJSudHlmrXxp/EUCWENTBAK2dlLM1rpb4RSKj37KTpOOubv2VqndC6nCw24qAGxo0uHQ3No7IPy8/BEEV4eBnVm6UVrmWZjK75gSAkgMGr0RpjGXouXRjSMFClgRPHXmDhRV9uw5Fo7DA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 172.205.89.229) smtp.rcpttodomain=sourceware.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1Q8WUMoVy1kmSksBXw/xYOLtR6Bnl4P6pDCYUOAOfzY=; b=j+Z7r5fImlTFqldcotL5KthsrrS0eIXyCWULMiIb4BGOv8vaI16sph+VFdl7UUE2A+fZyHbDe8HvKcWY2BQMsRlJqwlWElXjd+gRMNcPQnJ/OgdMvIdlJcqcDkAkSXMyKFbI7jMJkxsCHrTlX/W1t4bnf3j0xKrFs//dn+PjIzk= Received: from AM0PR10CA0006.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:17c::16) by GV2PR08MB10353.eurprd08.prod.outlook.com (2603:10a6:150:db::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.9; Tue, 1 Sep 2026 09:12:19 +0000 Received: from DB5PEPF00014B8D.eurprd02.prod.outlook.com (2603:10a6:208:17c:cafe::9a) by AM0PR10CA0006.outlook.office365.com (2603:10a6:208:17c::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.10 via Frontend Transport; Tue, 1 Sep 2026 09:12:19 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 172.205.89.229) smtp.mailfrom=arm.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 172.205.89.229 as permitted sender) receiver=protection.outlook.com; client-ip=172.205.89.229; helo=nebula.arm.com; pr=C Received: from nebula.arm.com (172.205.89.229) by DB5PEPF00014B8D.mail.protection.outlook.com (10.167.8.201) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Tue, 1 Sep 2026 09:12:19 +0000 Received: from AZ-NEU-EX04.Arm.com (10.240.25.138) by AZ-NEU-EX04.Arm.com (10.240.25.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Tue, 1 Sep 2026 09:12:18 +0000 Received: from ip-10-249-56-67.eu-west-1.compute.internal (10.249.56.67) by mail.arm.com (10.240.25.138) with Microsoft SMTP Server id 15.2.2562.29 via Frontend Transport; Tue, 1 Sep 2026 09:12:18 +0000 From: To: CC: , , , , , , , Srinath Parvathaneni Subject: [PATCH v4 1/5] gdb/aarch64: Add POR_EL0 register support for FEAT_S1POE Date: Tue, 1 Sep 2026 09:12:12 +0000 Message-ID: <20260901091216.5711-2-srinath.parvathaneni@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260901091216.5711-1-srinath.parvathaneni@arm.com> References: <20260901091216.5711-1-srinath.parvathaneni@arm.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------2.43.0" Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 1 X-MS-TrafficTypeDiagnostic: DB5PEPF00014B8D:EE_|GV2PR08MB10353:EE_|AMS0EPF00000198:EE_|PA4PR08MB6048:EE_ X-MS-Office365-Filtering-Correlation-Id: 1b785f8c-cbb6-4a43-5374-08df0809365e x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; ARA:13230040|376014|23010399003|36860700016|82310400026|1800799024|6049299003|4053099003|10067099003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info-Original: JIHHqevqJSUG8eWoTWo/ZLOTnZtvSYctnDlzd2lc1exHCFIDplT/5/3KLjnfQb3g16y7pwUIF7Ledm9JjNEOC/j75F5ikZ16n+qKZQL/35TrGDLGQY4Ma5khs6WHVWCQ5HJqhG1cfu8lVZ+pazOltEKu3eB8CkJ6l4IzuaxVMKtj+mWVOfzpMt44oyAjPjlOKLmkgUm3ZCyjvZgoU3KtRpPcxBYFOxShstv0/BUonn4YOkJuj6ic/bRbbKPjwi8wgDgTLRYPrOheceaaf2/+tGHiB1y4W780MdxpJqEr/xd30ofWAGxe1Vps85EiI4EUJ50PSPY8iOk42M0VvzOsLAA9sJUxyYSuT+Gls5SLdK6DJVUg2a1QK+DR+uQrMvqFWXsuF3zx3ReoOsC0SD5+iqi9p+Tu2jur1sVy2fOyv14apXFlrCq63UzNmYarMzxoTTSo1YQO1yvzUjjiXduhmWt1MBqPuipY30HAtNGkqwDYj7Skqzo6u/luyDDnyCe0dyjtD7dS+6WJebR4p6g/BFIp2bLUhm6IHcQJsbD6Co4JBq2I/J9JoSSmY0trNxwg/Q9RbRgHiK9bpPDererwm8FtzhJZWI7JIgZTHgpqWoUoHWCEMJNVf/lN7dVksQ3w6xwCzn28C9/bzNQ9lph6NhDXh69OUu/DZbv/VGbwQ3A4Hg+q0GKq0MezVPzbBOEtuvHs4Og2ujJt9SCERGWZwA== X-Forefront-Antispam-Report-Untrusted: CIP:172.205.89.229; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:nebula.arm.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(376014)(23010399003)(36860700016)(82310400026)(1800799024)(6049299003)(4053099003)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003); DIR:OUT; SFP:1101; X-Exchange-RoutingPolicyChecked: zigeNadov0uU+oVy5YiEf4F2ghZc7L3qxN+Y7509K6m9tUxlNx7s0Y5T/pvXgyD7LLuXoQSl+tYuhE9MIFYfHPJCnePc7LjDfcH1f1F/NYjAHyqjLY9VEC1Q29FN9M/yLNMl6EGUas5QmOI657TlEv+MZ+MDHPu6pfw0MdMtTDDyiz9JK4XYWpTpfnPbYZECMJDMxGEQCzmnuEm/5nyL18BYW5AQdbMU8LV6X1/A3M+D/xOgjJhMFrgrWFKJkY+GxvBeQGt/m4CR0dUN17f3EgZCV4xkX6LpXpKvXuY5qpBHwVKOMgH6lNrKQz/TcWAhmvYye5fSzIzE2BEts2q61Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB10353 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS0EPF00000198.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 36717d40-aa3f-448c-bf11-08df08091ff3 X-Microsoft-Antispam: BCL:0; ARA:13230040|23010399003|36860700016|82310400026|376014|6049299003|35042699022|1800799024|14060799003|4053099003|56012099006|10067099003|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: jc53FLFxAZZTXpQrU24QXo73sJEWI9nzppJkYrT8SL2twqYnic9B1M8LOuBIpZypjijeXguwH9kRwR9gfnBriCe79R9PzopzqkhNQ5PBhGcCt/D92q1WNbQmDezLw4b+INa6dzZNmuHmUfoUul2loPxEcd+wULbSBRkydJPG3VPKnsrE4+nMxV7fsdq/zDisooFRTxASk14msbpLnTZ5KsRSR3JZNXKJIlSJrRk6GAEp3pUqsxTjnaJwCgJQD4A2Uos3IovbOuy6kqV/Wx/jmkP+pGL7UVnSWvl4bMbUhPbCj9ZUeWI5hDkMpUf1dERE+BWfvLCBAW2MfDdutLsazLjYGvVhBiqRGdqu5ZN45IjUFSq3THQj7p4SXaVprmeXnyGY0mAQzo9gLauYiuZWCVaQi/uZNYYyHWqQOryxKKFFCw8KkMX2u9IUYtQlanRKPZhQM5Snl9XTejPADvGB5WPDLmycU23CtxMyL69R9yU5pzxpvR8rMRpxABRLcbSxJTsiyA/8Qn5IdTbdjPpyeECI1NUbuldfe2sOYfwanFYlU86p7TgNtxHdBOmbeomSjS49ImPA9V4THywvCdE2K43gNFFWw1lD47JEkgFN3Ej+CTSrgBrXyFa8gkNaj7g76XRJhIPj5lj/55/c9uu4BQMUiePXwpPVqjAohrfZDAiYFj9Zj64zIYLWqUTohKXt0IaFmukxKG3rj9mSx8238A== X-Forefront-Antispam-Report: CIP:4.158.2.129; CTRY:GB; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:outbound-uk1.az.dlp.m.darktrace.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(23010399003)(36860700016)(82310400026)(376014)(6049299003)(35042699022)(1800799024)(14060799003)(4053099003)(56012099006)(10067099003)(11063799006)(22082099003)(18002099003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: venNNUg6rSKo2OgM658/+7qW2ZQO3hjy3+TpeK1sR9Pup/G2Bct2xfAEPFU7umZqh5PEsFZ3U/8q8fsriFiLj3/ER7frqwaa252mNixiVXPNyS4FDjCJbqjheRmA9/d85Wp0mpc4XTCRNjvoWG04m5CviqKbEr18c5/40bLqvpFKYPlpdrznJp2kasff/BJvAqfJJoeXcuJ4p9v0fZpZJu2Al5Kw2Qv9vKcf6WVcf6IIn/8YerF4M7pejshPFjt4lgeXcAVPwx9DxSE1VeVl523adXgzq3Whs5rKcJaF7nJhFLtTzN0wZ9R0SXdQvzodnqEJsDMXbK1bEIqwDdRKoUyPrOo6iMx7DN3Mqx7l3EzMv2dXXgs4DMK2Sn+2yBWJsmuVvXKN4B2PsFIpM5nOP2sRB/u10LZKO7P5W3hrRrNvPAC2QsOLfWpZE4ogWZ/R X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 09:12:56.8804 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1b785f8c-cbb6-4a43-5374-08df0809365e X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[4.158.2.129]; Helo=[outbound-uk1.az.dlp.m.darktrace.com] X-MS-Exchange-CrossTenant-AuthSource: AMS0EPF00000198.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR08MB6048 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 --------------2.43.0 Content-Type: text/plain; charset="UTF-8"; format=fixed Content-Transfer-Encoding: 8bit Add support for the FEAT_S1POE POR_EL0 register on AArch64. This patch adds POR_EL0 to the AArch64 register set and reads/writes it using the NT_ARM_POE ptrace regset. It also adds POE pseudo-registers por_p0 through por_p15, with each pseudo-register mapping to a 4-bit field in POR_EL0, starting from the least-significant nibble. POR_EL0 and the POE pseudo-registers are added to the "por" register group, allowing them to be displayed together using the "info registers por" command. With this change, POR_EL0 is accessible through: * info registers * info registers por_el0 * info registers por * p $por_el0 * p/x $por_el0 * set $por_el0 = The individual POE fields can also be accessed and modified through $por_p0 to $por_p15. Example: (gdb) info register por_el0 por_el0 0x7 [ P0=rwx ] (gdb) set $por_el0=0xffffffff77777777 (gdb) info registers por_el0 por_el0 0xffffffff77777777 [ P15=??? P14=??? P13=??? P12=??? P11=??? P10=??? P9=??? P8=??? P7=rwx P6=rwx P5=rwx P4=rwx P3=rwx P2=rwx P1=rwx P0=rwx ] (gdb) info registers por por_el0 0xffffffff77777777 [ P15=??? P14=??? P13=??? P12=??? P11=??? P10=??? P9=??? P8=??? P7=rwx P6=rwx P5=rwx P4=rwx P3=rwx P2=rwx P1=rwx P0=rwx ] por_p0 0x7 rwx por_p1 0x7 rwx por_p2 0x7 rwx por_p3 0x7 rwx por_p4 0x7 rwx por_p5 0x7 rwx por_p6 0x7 rwx por_p7 0x7 rwx por_p8 0xf ??? por_p9 0xf ??? por_p10 0xf ??? por_p11 0xf ??? por_p12 0xf ??? por_p13 0xf ??? por_p14 0xf ??? por_p15 0xf ??? Individual POE pseudo-registers can be written independently, with the corresponding 4-bit field in POR_EL0 updated accordingly. For example: (gdb) set $por_el0=0x7 (gdb) info registers por_el0 por_el0 0x0000000000000007 [ P0=rwx ] (gdb) set $por_p1=0x7 (gdb) info registers por_el0 por_el0 0x0000000000000077 [ P1=rwx P0=rwx ] --- gdb/Makefile.in | 2 + gdb/aarch64-linux-nat.c | 64 ++++++++ gdb/aarch64-tdep.c | 274 +++++++++++++++++++++++++++++++++++ gdb/aarch64-tdep.h | 12 ++ gdb/arch/aarch64-poe-linux.h | 29 ++++ gdb/arch/aarch64.c | 4 + gdb/arch/aarch64.h | 8 +- gdb/features/Makefile | 1 + gdb/features/aarch64-poe.c | 14 ++ gdb/features/aarch64-poe.xml | 11 ++ gdb/nat/aarch64-poe-linux.h | 29 ++++ 11 files changed, 447 insertions(+), 1 deletion(-) create mode 100644 gdb/arch/aarch64-poe-linux.h create mode 100644 gdb/features/aarch64-poe.c create mode 100644 gdb/features/aarch64-poe.xml create mode 100644 gdb/nat/aarch64-poe-linux.h --------------2.43.0 Content-Type: text/x-patch; name="v4-0001-PATCH-1-5-gdb-aarch64-Add-POR_EL0-register-suppor.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="v4-0001-PATCH-1-5-gdb-aarch64-Add-POR_EL0-register-suppor.patch" diff --git a/gdb/Makefile.in b/gdb/Makefile.in index c6bfc2949fc..0b5bf45545a 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1292,6 +1292,7 @@ HFILES_NO_SRCDIR = \ arch/aarch32.h \ arch/aarch64-fpmr-linux.h \ arch/aarch64-gcs-linux.h \ + arch/aarch64-poe-linux.h \ arch/aarch64.h \ arch/aarch64-insn.h \ arch/aarch64-mte.h \ @@ -1540,6 +1541,7 @@ HFILES_NO_SRCDIR = \ namespace.h \ nat/aarch64-fpmr-linux.h \ nat/aarch64-gcs-linux.h \ + nat/aarch64-poe-linux.h \ nat/aarch64-hw-point.h \ nat/aarch64-linux.h \ nat/aarch64-linux-hw-point.h \ diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c index 52ace4aab41..8e29c42908c 100644 --- a/gdb/aarch64-linux-nat.c +++ b/gdb/aarch64-linux-nat.c @@ -34,6 +34,7 @@ #include "arch/arm.h" #include "nat/aarch64-fpmr-linux.h" #include "nat/aarch64-gcs-linux.h" +#include "nat/aarch64-poe-linux.h" #include "nat/aarch64-linux.h" #include "nat/aarch64-linux-hw-point.h" #include "nat/aarch64-mte-linux-ptrace.h" @@ -602,6 +603,54 @@ store_gcsregs_to_thread (regcache *regcache) perror_with_name (_("Unable to store GCS registers")); } +/* Fill GDB's register array with the POE register value from the current + thread. */ + +static void +fetch_poeregs_from_thread (regcache *regcache) +{ + aarch64_gdbarch_tdep *tdep + = gdbarch_tdep (regcache->arch ()); + + gdb_assert (tdep->has_poe ()); + + uint64_t user_poe; + iovec iovec; + + iovec.iov_base = &user_poe; + iovec.iov_len = sizeof (user_poe); + + int tid = get_ptrace_pid (regcache->ptid ()); + if (ptrace (PTRACE_GETREGSET, tid, NT_ARM_POE, &iovec) != 0) + perror_with_name (_("Unable to fetch POE register")); + + regcache->raw_supply (tdep->poe_regnum, &user_poe); +} + +/* Store the NT_ARM_POE register contents from GDB's REGCACHE to the + thread associated with REGCACHE. */ + +static void +store_poeregs_to_thread (struct regcache *regcache) +{ + aarch64_gdbarch_tdep *tdep + = gdbarch_tdep (regcache->arch ()); + + gdb_assert (tdep->has_poe ()); + + int tid = regcache->ptid ().lwp (); + + iovec iovec; + uint64_t user_poe; + iovec.iov_base = &user_poe; + iovec.iov_len = sizeof (user_poe); + + regcache->raw_collect (tdep->poe_regnum, &user_poe); + + if (ptrace (PTRACE_SETREGSET, tid, NT_ARM_POE, &iovec) != 0) + perror_with_name (_("Unable to store POE register")); +} + /* Fill GDB's REGCACHE with the FPMR register set content from the thread associated with REGCACHE. */ @@ -683,6 +732,9 @@ aarch64_fetch_registers (struct regcache *regcache, int regno) if (tdep->has_gcs_linux ()) fetch_gcsregs_from_thread (regcache); + if (tdep->has_poe ()) + fetch_poeregs_from_thread (regcache); + if (tdep->has_fpmr ()) fetch_fpmr_from_thread (regcache); } @@ -722,6 +774,9 @@ aarch64_fetch_registers (struct regcache *regcache, int regno) && (regno == tdep->gcs_reg_base || regno == tdep->gcs_linux_reg_base || regno == tdep->gcs_linux_reg_base + 1)) fetch_gcsregs_from_thread (regcache); + /* POE register? */ + else if (tdep->has_poe () && (regno == tdep->poe_regnum)) + fetch_poeregs_from_thread (regcache); /* FPMR? */ else if (tdep->has_fpmr () && (regno == tdep->fpmr_regnum)) fetch_fpmr_from_thread (regcache); @@ -802,6 +857,9 @@ aarch64_store_registers (struct regcache *regcache, int regno) if (tdep->has_fpmr ()) store_fpmr_to_thread (regcache); + + if (tdep->has_poe ()) + store_poeregs_to_thread (regcache); } /* General purpose register? */ else if (regno < AARCH64_V0_REGNUM) @@ -836,6 +894,9 @@ aarch64_store_registers (struct regcache *regcache, int regno) /* FPMR? */ else if (tdep->has_fpmr () && regno == tdep->fpmr_regnum) store_fpmr_to_thread (regcache); + /* POE register? */ + else if (tdep->has_poe () && regno == tdep->poe_regnum) + store_poeregs_to_thread (regcache); /* PAuth registers are read-only. */ } @@ -1024,6 +1085,9 @@ aarch64_linux_nat_target::read_description () /* Check for FPMR. */ features.fpmr = hwcap2 & HWCAP2_FPMR; + /* Check for POE support. */ + features.poe = hwcap2 & HWCAP2_POE; + return aarch64_read_description (features); } diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 950ad4f6aae..763321bdcb4 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -164,6 +164,11 @@ static const char *const aarch64_gcs_register_names[] = { "gcspr" }; +static const char *const aarch64_poe_register_names[] = { + /* Permission Overlay Extension Register. */ + "por_el0" +}; + static const char *const aarch64_gcs_linux_register_names[] = { /* Field in struct user_gcs. */ "gcs_features_enabled", @@ -2892,6 +2897,21 @@ is_w_pseudo_register (struct gdbarch *gdbarch, int regnum) return false; } +/* Return TRUE if REGNUM is a POE pseudo-register number. Return FALSE + otherwise. */ + +static bool +is_poe_pseudo_register (struct gdbarch *gdbarch, int regnum) +{ + aarch64_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (tdep->poe_pseudo_base <= regnum + && regnum < tdep->poe_pseudo_base + tdep->poe_pseudo_count) + return true; + + return false; +} + /* Return TRUE if REGNUM is a SME pseudo-register number. Return FALSE otherwise. */ @@ -3088,6 +3108,21 @@ aarch64_pseudo_register_name (struct gdbarch *gdbarch, int regnum) if (tdep->has_pauth () && regnum == tdep->ra_sign_state_regnum) return ""; + if (tdep->has_poe ()) + { + static const char *const poe_name[] = + { + "por_p0", "por_p1", "por_p2", "por_p3", + "por_p4", "por_p5", "por_p6", "por_p7", + "por_p8", "por_p9", "por_p10", "por_p11", + "por_p12", "por_p13", "por_p14", "por_p15", + }; + + /* POE pseudo-registers. */ + if (is_poe_pseudo_register (gdbarch, regnum)) + return poe_name[regnum - tdep->poe_pseudo_base]; + } + internal_error (_("aarch64_pseudo_register_name: bad register number %d"), p_regnum); } @@ -3130,10 +3165,132 @@ aarch64_pseudo_register_type (struct gdbarch *gdbarch, int regnum) if (tdep->has_pauth () && regnum == tdep->ra_sign_state_regnum) return builtin_type (gdbarch)->builtin_uint64; + /* POE pseudo-registers are 8-bit. */ + if (is_poe_pseudo_register (gdbarch, regnum)) + return builtin_type (gdbarch)->builtin_uint8; + internal_error (_("aarch64_pseudo_register_type: bad register number %d"), p_regnum); } +/* Convert a POR_EL0 Perm overlay permission encoding into rwx-style string. + For example: + 0b0011 -> "r-x" (3) + 0b0101 -> "rw-" (5) + 0b0111 -> "rwx" (7) + 0b0000 -> "---" (0) + Reserved encodings (0b1xxx) are returned as "???". */ + +static const char * +aarch64_perm_overlay_decode (unsigned int perm) +{ + switch (perm) + { + case 0: return "---"; + case 1: return "r--"; + case 2: return "--x"; + case 3: return "r-x"; + case 4: return "-w-"; + case 5: return "rw-"; + case 6: return "-wx"; + case 7: return "rwx"; + default: return "???"; + } +} + +/* Display POE register POR_EL0 in the following format for the 'info registers' + and 'info all-registers' commands: + [] */ + +static void +aarch64_print_poe_register_info (struct ui_file *file, + int regnum, const char *name, + const frame_info_ptr &frame) +{ + value *val = value_of_register (regnum, get_next_frame_sentinel_okay (frame)); + ULONGEST por_el0 = (ULONGEST) value_as_long (val); + gdb_printf (file, "%-14s 0x%s [ ", name, phex (por_el0, 8)); + const int line_wrap_count = 36; + + for (int i = 15, line_wrap = 0; i >= 0; --i) + { + unsigned int perm = (por_el0 >> (i * 4)) & 0xf; + if (perm) + { + if (line_wrap != 0 && (line_wrap % 4) == 0) + gdb_printf (file, "\n%*s", line_wrap_count, ""); + gdb_printf (file, "P%d=%s ", i, aarch64_perm_overlay_decode (perm)); + line_wrap++; + } + } + gdb_puts ("]\n", file); +} + +/* Custom display for POE pseudo registers. */ + +static void +aarch64_print_poe_pseudo_register_info (struct ui_file *file, int regnum, + const char *name, + const frame_info_ptr &frame) +{ + value *val = value_of_register (regnum, get_next_frame_sentinel_okay (frame)); + struct gdbarch *gdbarch = get_frame_arch (frame); + unsigned int perm = extract_unsigned_integer (val->contents (), + gdbarch_byte_order (gdbarch)); + + /* Extract only the least significant 4 bits. */ + perm &= 0xf; + + gdb_printf (file, "%-14s 0x%-16x %s\n", name, (unsigned) perm, + aarch64_perm_overlay_decode (perm)); +} + +/* For 'info registers' and 'info all-registers', print POE POR_EL0 register and + POE pseudo registers using the custom register printer and all other + registers using the default register printer. */ + +static void +aarch64_print_registers_info (struct gdbarch *gdbarch, + struct ui_file *file, + const frame_info_ptr &frame, + int regnum, + bool print_all) +{ + const int numregs = gdbarch_num_cooked_regs (gdbarch); + aarch64_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + /* When no register is specified. */ + if (regnum == -1) + { + for (int i = 0; i < numregs; i++) + { + if (i == tdep->poe_regnum) + { + aarch64_print_poe_register_info + (file, i, gdbarch_register_name (gdbarch, i), frame); + continue; + } + else if (is_poe_pseudo_register (gdbarch, i)) + { + aarch64_print_poe_pseudo_register_info + (file, i, gdbarch_register_name (gdbarch, i), frame); + continue; + } + default_print_registers_info (gdbarch, file, frame, i, print_all); + } + } + /* When POE por_el0 register is specified. */ + else if (regnum == tdep->poe_regnum) + aarch64_print_poe_register_info + (file, regnum, gdbarch_register_name (gdbarch, regnum), frame); + /* When individual POE pseudo register is specified. */ + else if (is_poe_pseudo_register (gdbarch, regnum)) + aarch64_print_poe_pseudo_register_info + (file, regnum, gdbarch_register_name (gdbarch, regnum), frame); + else + default_print_registers_info (gdbarch, file, frame, regnum, print_all); +} + /* Implement the "pseudo_register_reggroup_p" tdesc_arch_data method. */ static bool @@ -3161,6 +3318,8 @@ aarch64_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum, return group == all_reggroup || group == vector_reggroup; else if (is_sme_pseudo_register (gdbarch, regnum)) return group == all_reggroup || group == vector_reggroup; + else if (is_poe_pseudo_register (gdbarch, regnum)) + return group == all_reggroup || group == reggroup_find (gdbarch, "por"); /* RA_STATE is used for unwinding only. Do not assign it to any groups. */ if (tdep->has_pauth () && regnum == tdep->ra_sign_state_regnum) return false; @@ -3290,7 +3449,38 @@ aarch64_sme_pseudo_register_read (gdbarch *gdbarch, const frame_info_ptr &next_f za_value->contents_copy (result, dst_offset, src_offset, offsets.chunk_size); } + return result; +} + +/* Given REGNUM, a POE pseudo-register number, return its value in RESULT. */ + +static value * +aarch64_poe_pseudo_register_read (gdbarch *gdbarch, + const frame_info_ptr &next_frame, + const int pseudo_reg_num) +{ + aarch64_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + gdb_assert (tdep->has_poe ()); + gdb_assert (tdep->poe_pseudo_base <= pseudo_reg_num); + gdb_assert (pseudo_reg_num < tdep->poe_pseudo_base + tdep->poe_pseudo_count); + + unsigned int pkey = pseudo_reg_num - tdep->poe_pseudo_base; + unsigned int shift = pkey * 4; + + value *por_value = value_of_register (tdep->poe_regnum, next_frame); + value *result = value::allocate_register (next_frame, pseudo_reg_num); + ULONGEST por_el0 + = extract_unsigned_integer (por_value->contents (), + gdbarch_byte_order (gdbarch)); + + ULONGEST pseudo_reg_value = (por_el0 >> shift) & 0xf; + + store_unsigned_integer (result->contents_raw ().data (), + result->type ()->length (), + gdbarch_byte_order (gdbarch), + pseudo_reg_value); return result; } @@ -3322,6 +3512,9 @@ aarch64_pseudo_read_value (gdbarch *gdbarch, const frame_info_ptr &next_frame, else if (is_sme_pseudo_register (gdbarch, pseudo_reg_num)) return aarch64_sme_pseudo_register_read (gdbarch, next_frame, pseudo_reg_num); + else if (is_poe_pseudo_register (gdbarch, pseudo_reg_num)) + return aarch64_poe_pseudo_register_read (gdbarch, next_frame, + pseudo_reg_num); /* Offset in the "pseudo-register space". */ int pseudo_offset = pseudo_reg_num - gdbarch_num_regs (gdbarch); @@ -3428,6 +3621,50 @@ aarch64_sme_pseudo_register_write (gdbarch *gdbarch, const frame_info_ptr &next_ za_value->contents_raw ()); } +/* Given PSEUDO_REG_NUM, a POE pseudo-register number, store DATA in the + corresponding field of POR_EL0. */ + +static void +aarch64_poe_pseudo_register_write (gdbarch *gdbarch, + const frame_info_ptr &next_frame, + const int pseudo_reg_num, + gdb::array_view data) +{ + aarch64_gdbarch_tdep *tdep + = gdbarch_tdep (gdbarch); + + gdb_assert (tdep->has_poe ()); + gdb_assert (tdep->poe_pseudo_base <= pseudo_reg_num); + gdb_assert (pseudo_reg_num < tdep->poe_pseudo_base + tdep->poe_pseudo_count); + + unsigned int pkey = pseudo_reg_num - tdep->poe_pseudo_base; + unsigned int shift = pkey * 4; + + ULONGEST pseudo_reg_value + = extract_unsigned_integer (data, gdbarch_byte_order (gdbarch)); + + if (pseudo_reg_value > 0xf) + error (_("POE pseudo-register value must be between 0 and 15.")); + + /* Fetch the current POR_EL0 value. */ + value *por_value = value_of_register (tdep->poe_regnum, next_frame); + + ULONGEST por_el0 + = extract_unsigned_integer (por_value->contents (), + gdbarch_byte_order (gdbarch)); + + ULONGEST mask = ULONGEST (0xf) << shift; + + por_el0 = (por_el0 & ~mask) | (pseudo_reg_value << shift); + + store_unsigned_integer (por_value->contents_writeable ().data (), + por_value->type ()->length (), + gdbarch_byte_order (gdbarch), + por_el0); + + put_frame_register (next_frame, tdep->poe_regnum, por_value->contents_raw ()); +} + /* Implement the "pseudo_register_write" gdbarch method. */ static void @@ -3464,6 +3701,12 @@ aarch64_pseudo_write (gdbarch *gdbarch, const frame_info_ptr &next_frame, buf); return; } + else if (is_poe_pseudo_register (gdbarch, pseudo_reg_num)) + { + aarch64_poe_pseudo_register_write (gdbarch, next_frame, pseudo_reg_num, + buf); + return; + } /* Offset in the "pseudo-register space". */ int pseudo_offset = pseudo_reg_num - gdbarch_num_regs (gdbarch); @@ -4140,6 +4383,10 @@ aarch64_features_from_target_desc (const struct target_desc *tdesc) features.fpmr = (tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.fpmr") != nullptr); + /* Check for POE feature. */ + features.poe = (tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.poe") + != nullptr); + return features; } @@ -4560,6 +4807,24 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) fpmr_regnum, "fpmr"); } + int poe_regnum = -1; + int first_poe_pseudo_regnum = -1; + const struct tdesc_feature *feature_poe + = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.poe"); + if (feature_poe != nullptr) + { + poe_regnum = num_regs; + for (i = 0; i < ARRAY_SIZE (aarch64_poe_register_names); i++) + valid_p &= tdesc_numbered_register (feature_poe, tdesc_data.get (), + poe_regnum + i, + aarch64_poe_register_names[i]); + + /* POE pseudo-registers. */ + first_poe_pseudo_regnum = num_pseudo_regs; + num_pseudo_regs += 16; + num_regs++; + } + int first_sme_regnum = -1; int first_sme2_regnum = -1; int first_sme_pseudo_regnum = -1; @@ -4760,6 +5025,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->gcs_reg_base = first_gcs_regnum; tdep->gcs_linux_reg_base = first_gcs_linux_regnum; tdep->fpmr_regnum = fpmr_regnum; + tdep->poe_regnum = poe_regnum; /* Set the SME register set details. The pseudo-registers will be adjusted later. */ @@ -4802,6 +5068,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_tdesc_pseudo_register_reggroup_p (gdbarch, aarch64_pseudo_register_reggroup_p); set_gdbarch_cannot_store_register (gdbarch, aarch64_cannot_store_register); + set_gdbarch_print_registers_info (gdbarch, aarch64_print_registers_info); /* Set the allocation tag granule size to 16 bytes. */ set_gdbarch_memtag_granule_size (gdbarch, AARCH64_MTE_GRANULE_SIZE); @@ -4899,6 +5166,13 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->w_pseudo_base = first_w_regnum + num_regs; tdep->w_pseudo_count = 31; + /* Setup POE pseudo-register numbers. */ + if (tdep->has_poe () && first_poe_pseudo_regnum != -1) + { + tdep->poe_pseudo_base = first_poe_pseudo_regnum + num_regs; + tdep->poe_pseudo_count = 16; + } + /* Pointer authentication pseudo-registers. */ if (tdep->has_pauth ()) tdep->ra_sign_state_regnum = ra_sign_state_offset + num_regs; diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index dff05a08f84..3e6320740d1 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -208,6 +208,18 @@ struct aarch64_gdbarch_tdep : gdbarch_tdep_base return gcs_linux_reg_base != -1; } + /* POE register. This is -1 if no POE feature is available. */ + int poe_regnum = -1; + int poe_pseudo_base = 0; + int poe_pseudo_count = 0; + + /* Returns true if the target supports the POE feature. */ + bool + has_poe () const + { + return poe_regnum != -1; + } + /* First FPMR register. This is -1 if FPMR is not supported. */ int fpmr_regnum = -1; diff --git a/gdb/arch/aarch64-poe-linux.h b/gdb/arch/aarch64-poe-linux.h new file mode 100644 index 00000000000..8623fa43b54 --- /dev/null +++ b/gdb/arch/aarch64-poe-linux.h @@ -0,0 +1,29 @@ +/* Common Linux target-dependent definitions for AArch64 POE + + Copyright (C) 2026 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef GDB_ARCH_AARCH64_POE_LINUX_H +#define GDB_ARCH_AARCH64_POE_LINUX_H + +/* Feature check for Permission Overlay Extension. */ +#define AARCH64_HWCAP2_POE (1ULL << 63) + +/* Data or instruction abort caused by Protection Key Violation. */ +#define AARCH64_SEGV_PKUERR 4 + +#endif /* GDB_ARCH_AARCH64_POE_LINUX_H. */ diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c index 2401a325b7b..a567938d06d 100644 --- a/gdb/arch/aarch64.c +++ b/gdb/arch/aarch64.c @@ -28,6 +28,7 @@ #include "../features/aarch64-sme2.c" #include "../features/aarch64-tls.c" #include "../features/aarch64-gcs.c" +#include "../features/aarch64-poe.c" #include "../features/aarch64-gcs-linux.c" /* See arch/aarch64.h. */ @@ -77,6 +78,9 @@ aarch64_create_target_description (const aarch64_features &features) if (features.fpmr) regnum = create_feature_aarch64_fpmr (tdesc.get (), regnum); + if (features.poe) + regnum = create_feature_aarch64_poe (tdesc.get (), regnum); + return tdesc; } diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h index cf7318cbe74..ba90d55c3bb 100644 --- a/gdb/arch/aarch64.h +++ b/gdb/arch/aarch64.h @@ -35,6 +35,8 @@ struct aarch64_features bool pauth = false; bool mte = false; bool fpmr = false; + /* Whether the Permission Overlay Extension (FEAT_S1POE) is supported. */ + bool poe = false; /* A positive TLS value indicates the number of TLS registers available. */ uint8_t tls = 0; @@ -70,7 +72,8 @@ inline bool operator==(const aarch64_features &lhs, const aarch64_features &rhs) && lhs.sme2 == rhs.sme2 && lhs.gcs == rhs.gcs && lhs.gcs_linux == rhs.gcs_linux - && lhs.fpmr == rhs.fpmr; + && lhs.fpmr == rhs.fpmr + && lhs.poe == rhs.poe; } namespace std @@ -103,6 +106,9 @@ namespace std /* FPMR feature. */ h = h << 1 | features.fpmr; + + /* POE feature. */ + h = h << 1 | features.poe; return h; } }; diff --git a/gdb/features/Makefile b/gdb/features/Makefile index 161a7453d66..cc77e5bb652 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -207,6 +207,7 @@ FEATURE_XMLFILES = aarch64-core.xml \ aarch64-pauth.xml \ aarch64-mte.xml \ aarch64-gcs.xml \ + aarch64-poe.xml \ aarch64-gcs-linux.xml \ arc/v1-core.xml \ arc/v1-aux.xml \ diff --git a/gdb/features/aarch64-poe.c b/gdb/features/aarch64-poe.c new file mode 100644 index 00000000000..9222d026a6d --- /dev/null +++ b/gdb/features/aarch64-poe.c @@ -0,0 +1,14 @@ +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: + Original: aarch64-poe.xml */ + +#include "gdbsupport/tdesc.h" + +static int +create_feature_aarch64_poe (struct target_desc *result, long regnum) +{ + struct tdesc_feature *feature; + + feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.poe"); + tdesc_create_reg (feature, "por_el0", regnum++, 1, "por", 64, "uint64"); + return regnum; +} diff --git a/gdb/features/aarch64-poe.xml b/gdb/features/aarch64-poe.xml new file mode 100644 index 00000000000..aa2a2713ac8 --- /dev/null +++ b/gdb/features/aarch64-poe.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/gdb/nat/aarch64-poe-linux.h b/gdb/nat/aarch64-poe-linux.h new file mode 100644 index 00000000000..f3d0256da3f --- /dev/null +++ b/gdb/nat/aarch64-poe-linux.h @@ -0,0 +1,29 @@ +/* Common native Linux definitions for AArch64 Permission Overlay Extension. + + Copyright (C) 2026 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#ifndef GDB_NAT_AARCH64_POE_LINUX_H +#define GDB_NAT_AARCH64_POE_LINUX_H + +/* Feature check for Permission Overlay Extension. */ +#ifndef HWCAP2_POE +#define HWCAP2_POE (1ULL << 63) +#endif /* HWCAP2_POE. */ + +#endif /* GDB_NAT_AARCH64_POE_LINUX_H. */ --------------2.43.0--