From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10043.outbound.protection.outlook.com [40.107.1.43]) by sourceware.org (Postfix) with ESMTPS id 7B24E3858D39 for ; Mon, 1 Aug 2022 11:09:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7B24E3858D39 ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=WfmNthepzp9VWYErL1al17z/hqRIaM/J+bHydfz0XjUZEGfKyYwKJE1t+uclz/E4ZYzVg/jjX3l2ZywA+jn+pkEbn8P8yeFKGchrXwp5s/AMSdUb3yjJ+Ag+sE4oZSjeWLtQdo1/0eHXk26MXMXL8Siea94NDkIn3fBfZJ/ZuIFJ1SM22jbIpDErEsbEgjfOEQbX4Q/JU2gTsI6zpw/1X7a+/FU5UH32w1C13KFGMfupRG1oNPLHjMtUiJbAIvdUK4i1MYIbxVSS2TeuCbCIhpsliUz3kvpNFSXcYxre8MAfSrFxwJ+EFx/9LNe9n8l7PJKqZGiE1j8a8so9KFnSbQ== 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=ufyYYfNy8bReZNvi876lCqBYKrb9f4/J9janIqOD92A=; b=Y0XZhbucCp0QIfSOp1eO9g9oY3PHw/723Mz2qb8NzrzWsj+ghvetL+KWK1Ga3Nt9T3TXUkL957ZpKWhO5M4KysNmPHWVz4jisbABJlU6JfPq1x01B0TmZl+33UBaglYB0V4D2qVPhqCtKUWBuUJ3DyBoRqQWB5M77/sX+uB0J/5YTll+LruVk7kfNwYdzauzga+Wc2txQgQxWwSkMOfsetvfypxCXYxGgAHnsbZmOKxDK03Up4OTsnuLmLrJha5RAKRz2ojbHqBOsNGdyXnAooI8xzU4lK2YFPv3LHeeop5HIFi4n6wrT96fkorLlo4PLzyBfFXDSXhNXTZ2QL0LhQ== 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 AM6PR0202CA0053.eurprd02.prod.outlook.com (2603:10a6:20b:3a::30) by GV1PR08MB8644.eurprd08.prod.outlook.com (2603:10a6:150:85::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5482.14; Mon, 1 Aug 2022 11:09:28 +0000 Received: from AM5EUR03FT020.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:3a:cafe::f1) by AM6PR0202CA0053.outlook.office365.com (2603:10a6:20b:3a::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5482.16 via Frontend Transport; Mon, 1 Aug 2022 11:09:28 +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 AM5EUR03FT020.mail.protection.outlook.com (10.152.16.116) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5482.12 via Frontend Transport; Mon, 1 Aug 2022 11:09:26 +0000 Received: ("Tessian outbound 73dd6a25223d:v123"); Mon, 01 Aug 2022 11:09:26 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: b5840131b12b1c31 X-CR-MTA-TID: 64aa7808 Received: from ea82169cec6a.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 82D1438C-4ADA-4F30-8937-3B042A4F1E40.1; Mon, 01 Aug 2022 11:09:18 +0000 Received: from EUR04-DB3-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id ea82169cec6a.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 01 Aug 2022 11:09:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kZ0LAS1YyZW0yzy5a8XRkxon6xSXIzL2ouJh5Ifo7Xcash1VMsUjs7o7/gx8m+lNUyZK6c3Ibf1pjcqI7sQDKKDsk8miBQMzNgWutfY2nEtjc0X1DsL8JeqKIK9O1ZYrimxu10bg7+PtSVZfmMB9cmyVW/ChOUvrTm1Q2nIrPJTmIiBpqdTqHo0ay93rHhq1JGAD9HTdgkH9oqqg7OrtgWQwldfbF0JNtLjSOGhfT5JFEMLQs7/hc411BlQC5zmoGOWOnfGdW/HCRZIFIP5qHjr72iaYqipXF7FruLmlgEe2cuqcLF5Ks7mlbgI4vGpoJi+geQzHPxkGV8285e35PA== 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=ufyYYfNy8bReZNvi876lCqBYKrb9f4/J9janIqOD92A=; b=bdvlOgkAmIo/pk0UdwObPOBeVQyHjlFAczxKBWwSffuFsxHmpMQeyEZDE2Wv/OLzfUv3l7/chsrAwm1p+x3LQ62jnxCmQNV2ZcP6UWyTioWtkB1XkM6MI2zOwRmGggXIDGY9aebinrKeRSg7h9Wq8YjQ3w8kGACH+XWo1Z74hbtmq+ZQ+ot52nkp5OIcC4geawWiH/9OCtqVwGp6kCnzVNEqzfZxnlKCVaZ7x53LtjgLiJZ7aFer5/CJgYya+/aaNAXPN6NUq9eNOyHJIMiiRE6Fqg6BMLdaqtuBzrVmhr6nJJMbCMmX3hRNYbkYEaH9XfxSW4fSM9qo5Alv2Ivb9A== 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 HE1PR0802MB2585.eurprd08.prod.outlook.com (2603:10a6:3:d4::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5482.11; Mon, 1 Aug 2022 11:09:16 +0000 Received: from VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::e866:af0e:2168:5ca7]) by VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::e866:af0e:2168:5ca7%5]) with mapi id 15.20.5482.014; Mon, 1 Aug 2022 11:09:15 +0000 Message-ID: Date: Mon, 1 Aug 2022 12:09:13 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Subject: [Ping v2][PATCH,v2] [aarch64] Fix removal of non-address bits for PAuth Content-Language: en-US From: Luis Machado To: gdb-patches@sourceware.org Cc: lsix@lancelotsix.com References: <20220705140037.135012-1-luis.machado@arm.com> <20220711115534.23810-1-luis.machado@arm.com> <0a729c27-3f70-181a-f26d-14cbc0a2fdab@arm.com> In-Reply-To: <0a729c27-3f70-181a-f26d-14cbc0a2fdab@arm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: LO2P265CA0473.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a2::29) To VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: d82450ae-6ae4-49d6-6b97-08da73ae4c10 X-MS-TrafficTypeDiagnostic: HE1PR0802MB2585:EE_|AM5EUR03FT020:EE_|GV1PR08MB8644: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: 2CHSwcmkMIPgjjo49dtbJcBId3Z4Xu3Oo9t+UZ4Nlvu1SY3V31LCttFXozSZmof7y58QnluUI6PgaOXNr9MXh+F1fKEAFAfoztpVvTp9sUiHQYNjzQFJeKUfSKheO8il6QIATRNwt04CeeIxM5oNKJfWL562v60HiaMWSatpjtZYcsBx9IdG82rWSKzCcd9rGU29tJ7bnKkVluvnRoYGK9smEk/uz87nPx9owms1JQMgYUY3P78Pvvcfxde7N+p63lNJXZ9jJsplZkZ0KJ5kHb3E7EPaIWtG91M1M+3vqEpmWwuzrrEiGuR4jHeeddwCunMr6WrAlH1PKEPtoL2noLGtNZR1MYwYUbJwvXtzGGm7AbT4u0m0Su2fZvnqbVMY/ZYns1QtyQnX5sQ/M2DmGa4OKMn33kC7kSoj5ZoEimGRGkG/ItSI8OtNe3oM6ksz/4iZpR6bQkzGUm/wKCrAWTZ3C0vQ70Z2owIVaUzar7szBRwTfGwDsBzvnFgHVHoUToUzJVubf7pOEXKIJk6O4L8yw1EgcOp821R4cd+OmyGxREFvPa0mcPqVRtKzg/yeElMOCoZRAfa7hGU3S1hpw4GOEmDnKhhIxKp+ve+EHuukWueL07WTDH3O3HfMl7bJ01Yi4KKCCUQ+2WaiyUlfa9zQTj567kY1qV39N83l2gTfbpsCLo8h1GD2beXSrtgPGb/NdmGtfvhX6tQksfm0zFhiPm8K0oz67skHWVJvInf/pJEdeY3QP8pH5vKaEnth0tpN4d4KNV7I4rNoKutrlC3opnp1oNqCILmwh3V+q7PFr48h7FCTJ7liZrszU6qDRjgxgkALUpKYAYOeWO0eOr+yvHrXbHHZV5gqt1GxlnFqaV5xv8ueK7RUz29usUjfc4Ux8yy+yzzKIILbJmyzOtw6RSUlrPxeoo2sOwUrwBg= 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)(366004)(39860400002)(396003)(376002)(346002)(136003)(53546011)(6506007)(186003)(84970400001)(2906002)(26005)(2616005)(6512007)(86362001)(38100700002)(31696002)(83380400001)(41300700001)(31686004)(66946007)(8676002)(66556008)(4326008)(66476007)(30864003)(44832011)(36756003)(5660300002)(8936002)(478600001)(966005)(6486002)(316002)(6916009)(2004002)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0802MB2585 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: AM5EUR03FT020.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 0d01bc69-f953-4de6-6fc7-08da73ae4524 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZWPjLAKzNcL43xvzv+C/OG7fuCS89zajvtzjLrDtN4gugBsuDU6/Yr9m4zKk+8H5qbIsVsQkwb0rIFHGGY7BHMuvAqcEEk5q/ABYxq4oIKesnk7AIcys+8S4OLOVlq7zGpPCG0w08GRjd9wjgEShdeqZeCg6viL9nSJDkOpO2PE2i9+LKqzhESsTxSayPib1vsAM+WYjxvHa826NaGxJDhlxqEITlV+De2t052Z7cxvadVBuH6gdooq6DaD3DVmsetOV2lx+89h80jiIm/D6v7vRGWzBwb7uRoyKF4ERg61DEEYUZzcW7Q9aiu1VAi/2DwQ/GQdWzecFlip8+h0uq/C11zpVty5jtNCeEuhL/1B6sJAbJWrVNlnIhGMZFUVbhqk9K+zYzmShvM+idtVqsY50m8XYpj46ndtG/gCRzUy2GGNRWsobA4cb5R45ycoe13B2Axkz+KhwIHHalWqnYG2JjuYX3YhDFzJBeGx+xxMKub5NqtXwl/Ne83+MiTyDgvLizzTTm3WWs+I/Uit9EhN5L3Ack9sWua1sdADI5lr6w3Q+7ZSNio1I/yVtAFNG+OZ/StwQbep3PjH1wUTJMSr/63B5RXvfPyG96xgPYQZo4DdCstVZTH5uba9JBVI283KiwJG/aqY+hjW5T7v24f8C29w3Gtkk4HAglkcA0W+zvFHPKKeuplkY7Cc1BLc8YCRncTWZQ9OExlcqHKdjgLqrCSbBJXUDDr1+LQ19zxe+poHGBp+Fcwpc0UoPDAg/OipWvGTCZL8gTcnEYBcJnw7Z0W2mfEJ+rdHfwAbvlyumqzJBv0zuCP8eXIhSzeGrhpIc87Xvf1Ij6CYWv5OLMixYEuc+D9KwidQNNx6CjbVM4WexDUhYwOqaowS5BsYE/09T4pKc1TntA3pqO2zOfu50RlXTM4OXK9BbsRDLXgc= 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)(376002)(39860400002)(396003)(346002)(136003)(36840700001)(46966006)(40470700004)(53546011)(47076005)(83380400001)(336012)(6506007)(82740400003)(81166007)(26005)(356005)(6512007)(2616005)(186003)(40480700001)(31686004)(36756003)(107886003)(6916009)(316002)(36860700001)(82310400005)(84970400001)(70206006)(4326008)(8676002)(70586007)(40460700003)(31696002)(966005)(6486002)(5660300002)(30864003)(8936002)(44832011)(86362001)(41300700001)(2906002)(478600001)(2004002)(43740500002); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Aug 2022 11:09:26.3213 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d82450ae-6ae4-49d6-6b97-08da73ae4c10 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: AM5EUR03FT020.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR08MB8644 X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_NONE, KAM_SHORT, 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 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: Mon, 01 Aug 2022 11:09:36 -0000 On 7/18/22 09:16, Luis Machado wrote: > On 7/11/22 12:55, Luis Machado via Gdb-patches wrote: >> v2: >> >> - Renamed aarch64_remove_top_bytes to aarch64_remove_top_bits >> - Formatting issues. >> >> -- >> >> The address_significant gdbarch setting was introduced as a way to remove >> non-address bits from pointers, and it is specified by a constant.  This >> constant represents the number of address bits in a pointer. >> >> Right now AArch64 is the only architecture that uses it, and 56 was a >> correct option so far. >> >> But if we are using Pointer Authentication (PAuth), we might use up to 2 bytes >> from the address space to store the required information.  We could also have >> cases where we're using both PAuth and MTE. >> >> We could adjust the constant to 48 to cover those cases, but this doesn't >> cover the case where GDB needs to sign-extend kernel addresses after removal >> of the non-address bits. >> >> This has worked so far because bit 55 is used to select between kernel-space >> and user-space addresses.  But trying to clear a range of bits crossing the >> bit 55 boundary requires the hook to be smarter. >> >> The following patch renames the gdbarch hook from significant_addr_bit to >> remove_non_address_bits and passes a pointer as opposed to the number of >> bits.  The hook is now responsible for removing the required non-address bits >> and sign-extending the address if needed. >> >> While at it, make GDB and GDBServer share some more code for aarch64 and add a >> new arch-specific testcase gdb.arch/aarch64-non-address-bits.exp. >> >> Bug-url: https://sourceware.org/bugzilla/show_bug.cgi?id=28947 >> --- >>   gdb/aarch64-linux-nat.c                       |   2 +- >>   gdb/aarch64-linux-tdep.c                      |  57 ++++++++- >>   gdb/arch-utils.c                              |   8 ++ >>   gdb/arch-utils.h                              |   4 + >>   gdb/arch/aarch64.c                            |  19 +++ >>   gdb/arch/aarch64.h                            |   9 ++ >>   gdb/breakpoint.c                              |   6 +- >>   gdb/gdbarch-components.py                     |  20 ++- >>   gdb/gdbarch-gen.h                             |  19 ++- >>   gdb/gdbarch.c                                 |  25 ++-- >>   gdb/target.c                                  |   2 +- >>   .../gdb.arch/aarch64-non-address-bits.c       |  25 ++++ >>   .../gdb.arch/aarch64-non-address-bits.exp     | 121 ++++++++++++++++++ >>   gdb/utils.c                                   |  22 ---- >>   gdb/utils.h                                   |   3 - >>   gdbserver/linux-aarch64-low.cc                |  40 ++++-- >>   16 files changed, 309 insertions(+), 73 deletions(-) >>   create mode 100644 gdb/testsuite/gdb.arch/aarch64-non-address-bits.c >>   create mode 100644 gdb/testsuite/gdb.arch/aarch64-non-address-bits.exp >> >> diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c >> index d58ad0143a2..3f41aae188e 100644 >> --- a/gdb/aarch64-linux-nat.c >> +++ b/gdb/aarch64-linux-nat.c >> @@ -843,7 +843,7 @@ aarch64_linux_nat_target::stopped_data_address (CORE_ADDR *addr_p) >>        kernel can potentially be tagged addresses.  */ >>     struct gdbarch *gdbarch = thread_architecture (inferior_ptid); >>     const CORE_ADDR addr_trap >> -    = address_significant (gdbarch, (CORE_ADDR) siginfo.si_addr); >> +    = gdbarch_remove_non_address_bits (gdbarch, (CORE_ADDR) siginfo.si_addr); >>     /* Check if the address matches any watched address.  */ >>     state = aarch64_get_debug_reg_state (inferior_ptid.pid ()); >> diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c >> index 453692df2f4..fffeb6f3df7 100644 >> --- a/gdb/aarch64-linux-tdep.c >> +++ b/gdb/aarch64-linux-tdep.c >> @@ -1586,7 +1586,7 @@ aarch64_linux_tagged_address_p (struct gdbarch *gdbarch, struct value *address) >>     CORE_ADDR addr = value_as_address (address); >>     /* Remove the top byte for the memory range check.  */ >> -  addr = address_significant (gdbarch, addr); >> +  addr = gdbarch_remove_non_address_bits (gdbarch, addr); >>     /* Check if the page that contains ADDRESS is mapped with PROT_MTE.  */ >>     if (!linux_address_in_memtag_page (addr)) >> @@ -1612,7 +1612,7 @@ aarch64_linux_memtag_matches_p (struct gdbarch *gdbarch, >>     /* Fetch the allocation tag for ADDRESS.  */ >>     gdb::optional atag >> -    = aarch64_mte_get_atag (address_significant (gdbarch, addr)); >> +    = aarch64_mte_get_atag (gdbarch_remove_non_address_bits (gdbarch, addr)); >>     if (!atag.has_value ()) >>       return true; >> @@ -1651,7 +1651,7 @@ aarch64_linux_set_memtags (struct gdbarch *gdbarch, struct value *address, >>     else >>       { >>         /* Remove the top byte.  */ >> -      addr = address_significant (gdbarch, addr); >> +      addr = gdbarch_remove_non_address_bits (gdbarch, addr); >>         /* Make sure we are dealing with a tagged address to begin with.  */ >>         if (!aarch64_linux_tagged_address_p (gdbarch, address)) >> @@ -1708,7 +1708,7 @@ aarch64_linux_get_memtag (struct gdbarch *gdbarch, struct value *address, >>       return nullptr; >>         /* Remove the top byte.  */ >> -      addr = address_significant (gdbarch, addr); >> +      addr = gdbarch_remove_non_address_bits (gdbarch, addr); >>         gdb::optional atag = aarch64_mte_get_atag (addr); >>         if (!atag.has_value ()) >> @@ -1782,7 +1782,8 @@ aarch64_linux_report_signal_info (struct gdbarch *gdbarch, >>         uiout->text ("\n"); >>         gdb::optional atag >> -    = aarch64_mte_get_atag (address_significant (gdbarch, fault_addr)); >> +    = aarch64_mte_get_atag (gdbarch_remove_non_address_bits (gdbarch, >> +                                 fault_addr)); >>         gdb_byte ltag = aarch64_mte_get_ltag (fault_addr); >>         if (!atag.has_value ()) >> @@ -1803,6 +1804,49 @@ aarch64_linux_report_signal_info (struct gdbarch *gdbarch, >>       } >>   } >> +/* AArch64 implementation of the remove_non_address_bits gdbarch hook.  Remove >> +   non address bits from a pointer value.  */ >> + >> +static CORE_ADDR >> +aarch64_remove_non_address_bits (struct gdbarch *gdbarch, CORE_ADDR pointer) >> +{ >> +  aarch64_gdbarch_tdep *tdep >> +    = (aarch64_gdbarch_tdep *) gdbarch_tdep (gdbarch); >> + >> +  /* By default, we assume TBI and discard the top 8 bits plus the VA range >> +     select bit (55).  */ >> +  CORE_ADDR mask = (((CORE_ADDR) 1) << (64 - 9)) - 1; >> +  mask = ~mask; >> + >> +  if (tdep->has_pauth ()) >> +    { >> +      /* Fetch the PAC masks.  These masks are per-process, so we can just >> +     fetch data from whatever thread we have at the moment. >> + >> +     Also, we have both a code mask and a data mask.  For now they are the >> +     same, but this may change in the future.  */ >> +      struct regcache *regs = get_current_regcache (); >> +      CORE_ADDR cmask, dmask; >> + >> +      if (regs->cooked_read (tdep->pauth_reg_base, &dmask) != REG_VALID) >> +    dmask = mask; >> + >> +      if (regs->cooked_read (tdep->pauth_reg_base + 1, &cmask) != REG_VALID) >> +    cmask = mask; >> + >> +      if (dmask != cmask) >> +    { >> +      /* Warn if the masks are different.  */ >> +      warning (_("C mask and D mask differ")); >> +      mask |= dmask > cmask? dmask : cmask; >> +    } >> +      else >> +    mask |= cmask; >> +    } >> + >> +  return aarch64_remove_top_bits (pointer, mask); >> +} >> + >>   static void >>   aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >>   { >> @@ -1858,7 +1902,8 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) >>     /* The top byte of a user space address known as the "tag", >>        is ignored by the kernel and can be regarded as additional >>        data associated with the address.  */ >> -  set_gdbarch_significant_addr_bit (gdbarch, 56); >> +  set_gdbarch_remove_non_address_bits (gdbarch, >> +                       aarch64_remove_non_address_bits); >>     /* MTE-specific settings and hooks.  */ >>     if (tdep->has_mte ()) >> diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c >> index ff946ee3767..db77dc44c74 100644 >> --- a/gdb/arch-utils.c >> +++ b/gdb/arch-utils.c >> @@ -82,6 +82,14 @@ legacy_register_sim_regno (struct gdbarch *gdbarch, int regnum) >>       return LEGACY_SIM_REGNO_IGNORE; >>   } >> +/* See arch-utils.h */ >> + >> +CORE_ADDR >> +default_remove_non_address_bits (struct gdbarch *gdbarch, CORE_ADDR pointer) >> +{ >> +  /* By default, just return the pointer value.  */ >> +  return pointer; >> +} >>   /* See arch-utils.h */ >> diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h >> index f850e5fd6e7..e117599b171 100644 >> --- a/gdb/arch-utils.h >> +++ b/gdb/arch-utils.h >> @@ -132,6 +132,10 @@ extern const struct floatformat ** >>     default_floatformat_for_type (struct gdbarch *gdbarch, >>                   const char *name, int len); >> +/* Default implementation of gdbarch_remove_non_address_bits.  */ >> +CORE_ADDR default_remove_non_address_bits (struct gdbarch *gdbarch, >> +                       CORE_ADDR pointer); >> + >>   /* Default implementation of gdbarch_memtag_to_string.  */ >>   extern std::string default_memtag_to_string (struct gdbarch *gdbarch, >>                            struct value *tag); >> diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c >> index 0f73286f145..120664b5fdf 100644 >> --- a/gdb/arch/aarch64.c >> +++ b/gdb/arch/aarch64.c >> @@ -58,3 +58,22 @@ aarch64_create_target_description (const aarch64_features &features) >>     return tdesc.release (); >>   } >> + >> +/* See arch/aarch64.h.  */ >> + >> +CORE_ADDR >> +aarch64_remove_top_bits (CORE_ADDR pointer, CORE_ADDR mask) >> +{ >> +  /* The VA range select bit is 55.  This bit tells us if we have a >> +     kernel-space address or a user-space address.  */ >> +  bool kernel_address = (pointer & VA_RANGE_SELECT_BIT_MASK) != 0; >> + >> +  /* Remove the top non-address bits.  */ >> +  pointer &= ~mask; >> + >> +  /* Sign-extend if we have a kernel-space address.  */ >> +  if (kernel_address) >> +    pointer |= mask; >> + >> +  return pointer; >> +} >> diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h >> index 8e3fd36726a..f2589666a1e 100644 >> --- a/gdb/arch/aarch64.h >> +++ b/gdb/arch/aarch64.h >> @@ -67,6 +67,12 @@ namespace std >>   target_desc * >>     aarch64_create_target_description (const aarch64_features &features); >> +/* Given a pointer value POINTER and a MASK of non-address bits, remove the >> +   non-address bits from the pointer and sign-extend the result if required. >> +   The sign-extension is required so we can handle kernel addresses >> +   correctly.  */ >> +CORE_ADDR aarch64_remove_top_bits (CORE_ADDR pointer, CORE_ADDR mask); >> + >>   /* Register numbers of various important registers. >>      Note that on SVE, the Z registers reuse the V register numbers and the V >>      registers become pseudo registers.  */ >> @@ -96,6 +102,9 @@ enum aarch64_regnum >>     AARCH64_LAST_V_ARG_REGNUM = AARCH64_V0_REGNUM + 7 >>   }; >> +/* Bit 55 is used to select between a kernel-space and user-space address.  */ >> +#define VA_RANGE_SELECT_BIT_MASK 0x80000000000000 >> + >>   #define V_REGISTER_SIZE 16 >>   /* Pseudo register base numbers.  */ >> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c >> index a3be12557f6..c7ccb6c4f0d 100644 >> --- a/gdb/breakpoint.c >> +++ b/gdb/breakpoint.c >> @@ -2113,7 +2113,8 @@ update_watchpoint (struct watchpoint *b, int reparse) >>             loc->gdbarch = value_type (v)->arch (); >>             loc->pspace = frame_pspace; >> -          loc->address = address_significant (loc->gdbarch, addr); >> +          loc->address >> +            = gdbarch_remove_non_address_bits (loc->gdbarch, addr); >>             if (bitsize != 0) >>               { >> @@ -7136,7 +7137,8 @@ adjust_breakpoint_address (struct gdbarch *gdbarch, >>         adjusted_bpaddr = gdbarch_adjust_breakpoint_address (gdbarch, bpaddr); >>       } >> -      adjusted_bpaddr = address_significant (gdbarch, adjusted_bpaddr); >> +      adjusted_bpaddr >> +    = gdbarch_remove_non_address_bits (gdbarch, adjusted_bpaddr); >>         /* An adjusted breakpoint address can significantly alter >>        a user's expectations.  Print a warning if an adjustment >> diff --git a/gdb/gdbarch-components.py b/gdb/gdbarch-components.py >> index fc10e8600ba..c6836b63c50 100644 >> --- a/gdb/gdbarch-components.py >> +++ b/gdb/gdbarch-components.py >> @@ -1116,15 +1116,21 @@ possible it should be in TARGET_READ_PC instead). >>       invalid=False, >>   ) >> -Value( >> +Method( >>       comment=""" >> -On some machines, not all bits of an address word are significant. >> -For example, on AArch64, the top bits of an address known as the "tag" >> -are ignored by the kernel, the hardware, etc. and can be regarded as >> -additional data associated with the address. >> +On some architectures, not all bits of a pointer are significant. >> +On AArch64, for example, the top bits of a pointer may carry a "tag", which >> +can be ignored by the kernel and the hardware. The "tag" can be regarded as >> +additional data associated with the pointer, but it is not part of the address. >> + >> +Given a pointer for the architecture, this hook removes all the >> +non-significant bits and sign-extends things as needed. It is used mostly >> +for data pointers, as opposed to code pointers. >>   """, >> -    type="int", >> -    name="significant_addr_bit", >> +    type="CORE_ADDR", >> +    name="remove_non_address_bits", >> +    params=[("CORE_ADDR", "pointer")], >> +    predefault="default_remove_non_address_bits", >>       invalid=False, >>   ) >> diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h >> index ddcb4c55615..64930f7f239 100644 >> --- a/gdb/gdbarch-gen.h >> +++ b/gdb/gdbarch-gen.h >> @@ -609,13 +609,18 @@ typedef CORE_ADDR (gdbarch_addr_bits_remove_ftype) (struct gdbarch *gdbarch, COR >>   extern CORE_ADDR gdbarch_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr); >>   extern void set_gdbarch_addr_bits_remove (struct gdbarch *gdbarch, gdbarch_addr_bits_remove_ftype *addr_bits_remove); >> -/* On some machines, not all bits of an address word are significant. >> -   For example, on AArch64, the top bits of an address known as the "tag" >> -   are ignored by the kernel, the hardware, etc. and can be regarded as >> -   additional data associated with the address. */ >> - >> -extern int gdbarch_significant_addr_bit (struct gdbarch *gdbarch); >> -extern void set_gdbarch_significant_addr_bit (struct gdbarch *gdbarch, int significant_addr_bit); >> +/* On some architectures, not all bits of a pointer are significant. >> +   On AArch64, for example, the top bits of a pointer may carry a "tag", which >> +   can be ignored by the kernel and the hardware. The "tag" can be regarded as >> +   additional data associated with the pointer, but it is not part of the address. >> + >> +   Given a pointer for the architecture, this hook removes all the >> +   non-significant bits and sign-extends things as needed. It is used mostly >> +   for data pointers, as opposed to code pointers. */ >> + >> +typedef CORE_ADDR (gdbarch_remove_non_address_bits_ftype) (struct gdbarch *gdbarch, CORE_ADDR pointer); >> +extern CORE_ADDR gdbarch_remove_non_address_bits (struct gdbarch *gdbarch, CORE_ADDR pointer); >> +extern void set_gdbarch_remove_non_address_bits (struct gdbarch *gdbarch, gdbarch_remove_non_address_bits_ftype *remove_non_address_bits); >>   /* Return a string representation of the memory tag TAG. */ >> diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c >> index 68ef0480219..d536d8578af 100644 >> --- a/gdb/gdbarch.c >> +++ b/gdb/gdbarch.c >> @@ -140,7 +140,7 @@ struct gdbarch >>     int frame_red_zone_size; >>     gdbarch_convert_from_func_ptr_addr_ftype *convert_from_func_ptr_addr; >>     gdbarch_addr_bits_remove_ftype *addr_bits_remove; >> -  int significant_addr_bit; >> +  gdbarch_remove_non_address_bits_ftype *remove_non_address_bits; >>     gdbarch_memtag_to_string_ftype *memtag_to_string; >>     gdbarch_tagged_address_p_ftype *tagged_address_p; >>     gdbarch_memtag_matches_p_ftype *memtag_matches_p; >> @@ -327,6 +327,7 @@ gdbarch_alloc (const struct gdbarch_info *info, >>     gdbarch->stabs_argument_has_addr = default_stabs_argument_has_addr; >>     gdbarch->convert_from_func_ptr_addr = convert_from_func_ptr_addr_identity; >>     gdbarch->addr_bits_remove = core_addr_identity; >> +  gdbarch->remove_non_address_bits = default_remove_non_address_bits; >>     gdbarch->memtag_to_string = default_memtag_to_string; >>     gdbarch->tagged_address_p = default_tagged_address_p; >>     gdbarch->memtag_matches_p = default_memtag_matches_p; >> @@ -496,7 +497,7 @@ verify_gdbarch (struct gdbarch *gdbarch) >>     /* Skip verify of frame_red_zone_size, invalid_p == 0 */ >>     /* Skip verify of convert_from_func_ptr_addr, invalid_p == 0 */ >>     /* Skip verify of addr_bits_remove, invalid_p == 0 */ >> -  /* Skip verify of significant_addr_bit, invalid_p == 0 */ >> +  /* Skip verify of remove_non_address_bits, invalid_p == 0 */ >>     /* Skip verify of memtag_to_string, invalid_p == 0 */ >>     /* Skip verify of tagged_address_p, invalid_p == 0 */ >>     /* Skip verify of memtag_matches_p, invalid_p == 0 */ >> @@ -974,8 +975,8 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) >>                         "gdbarch_dump: addr_bits_remove = <%s>\n", >>                         host_address_to_string (gdbarch->addr_bits_remove)); >>     gdb_printf (file, >> -                      "gdbarch_dump: significant_addr_bit = %s\n", >> -                      plongest (gdbarch->significant_addr_bit)); >> +                      "gdbarch_dump: remove_non_address_bits = <%s>\n", >> +                      host_address_to_string (gdbarch->remove_non_address_bits)); >>     gdb_printf (file, >>                         "gdbarch_dump: memtag_to_string = <%s>\n", >>                         host_address_to_string (gdbarch->memtag_to_string)); >> @@ -3147,21 +3148,21 @@ set_gdbarch_addr_bits_remove (struct gdbarch *gdbarch, >>     gdbarch->addr_bits_remove = addr_bits_remove; >>   } >> -int >> -gdbarch_significant_addr_bit (struct gdbarch *gdbarch) >> +CORE_ADDR >> +gdbarch_remove_non_address_bits (struct gdbarch *gdbarch, CORE_ADDR pointer) >>   { >>     gdb_assert (gdbarch != NULL); >> -  /* Skip verify of significant_addr_bit, invalid_p == 0 */ >> +  gdb_assert (gdbarch->remove_non_address_bits != NULL); >>     if (gdbarch_debug >= 2) >> -    gdb_printf (gdb_stdlog, "gdbarch_significant_addr_bit called\n"); >> -  return gdbarch->significant_addr_bit; >> +    gdb_printf (gdb_stdlog, "gdbarch_remove_non_address_bits called\n"); >> +  return gdbarch->remove_non_address_bits (gdbarch, pointer); >>   } >>   void >> -set_gdbarch_significant_addr_bit (struct gdbarch *gdbarch, >> -                                  int significant_addr_bit) >> +set_gdbarch_remove_non_address_bits (struct gdbarch *gdbarch, >> +                                     gdbarch_remove_non_address_bits_ftype remove_non_address_bits) >>   { >> -  gdbarch->significant_addr_bit = significant_addr_bit; >> +  gdbarch->remove_non_address_bits = remove_non_address_bits; >>   } >>   std::string >> diff --git a/gdb/target.c b/gdb/target.c >> index 18e53aa5d27..4ce1b9451a0 100644 >> --- a/gdb/target.c >> +++ b/gdb/target.c >> @@ -1644,7 +1644,7 @@ memory_xfer_partial (struct target_ops *ops, enum target_object object, >>     if (len == 0) >>       return TARGET_XFER_EOF; >> -  memaddr = address_significant (target_gdbarch (), memaddr); >> +  memaddr = gdbarch_remove_non_address_bits (target_gdbarch (), memaddr); >>     /* Fill in READBUF with breakpoint shadows, or WRITEBUF with >>        breakpoint insns, thus hiding out from higher layers whether >> diff --git a/gdb/testsuite/gdb.arch/aarch64-non-address-bits.c b/gdb/testsuite/gdb.arch/aarch64-non-address-bits.c >> new file mode 100644 >> index 00000000000..3cf6d63da17 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.arch/aarch64-non-address-bits.c >> @@ -0,0 +1,25 @@ >> +/* This file is part of GDB, the GNU debugger. >> + >> +   Copyright 2022 Free Software Foundation, Inc. >> + >> +   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 .  */ >> + >> +static long l = 0; >> +static long *l_ptr = &l; >> + >> +int >> +main (int argc, char **argv) >> +{ >> +  return *l_ptr; >> +} >> diff --git a/gdb/testsuite/gdb.arch/aarch64-non-address-bits.exp b/gdb/testsuite/gdb.arch/aarch64-non-address-bits.exp >> new file mode 100644 >> index 00000000000..2b5a7b2f517 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.arch/aarch64-non-address-bits.exp >> @@ -0,0 +1,121 @@ >> +# Copyright 2022 Free Software Foundation, Inc. >> +# >> +# 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 . >> +# >> +# This file is part of the gdb testsuite. >> +# >> +# Test that GDB for AArch64/Linux can properly handle pointers with >> +# the upper 16 bits (PAC) or 8 bits (Tag) set, as well as the >> +# VA_RANGE_SELECT bit (55). >> + >> +if {![is_aarch64_target]} { >> +    verbose "Skipping ${gdb_test_file_name}." >> +    return >> +} >> + >> +global hex >> +global decimal >> + >> +standard_testfile >> +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { >> +    return -1 >> +} >> + >> +if ![runto_main] { >> +    return -1 >> +} >> + >> +# We need to iterate over two distinct ranges, separated by a single bit. >> +# This bit is 55 (VA_RANGE_SELECT) which tells us if we have a kernel-space >> +# address or a user-space address. >> + >> +# The tag field has 8 bits. >> +set tag_bits_count 8 >> + >> +# The pac field has 7 bits. >> +set pac_bits_count 7 >> + >> +# A couple patterns that we reuse for the tests later.  One is for a successful >> +# memory read and the other is for a memory read failure. >> +set memory_read_ok_pattern "$hex\( \)?:\[ \t\]+$hex" >> +set memory_read_fail_pattern "$hex:\[ \t\]+Cannot access memory at address $hex" >> + >> +set pac_enabled 0 >> + >> +# Check if PAC is enabled. >> +gdb_test_multiple "ptype \$pauth_cmask" "fetch PAC cmask" { >> +    -re "type = long\r\n$gdb_prompt" { >> +    set pac_enabled 1 >> +    } >> +    -re "type = void\r\n$gdb_prompt" { >> +    } >> +    -re ".*$gdb_prompt $" { >> +    fail $gdb_test_name >> +    return 1 >> +    } >> +} >> + >> +# Value of the cmask register. >> +set cmask 0 >> + >> +# If there are PAC registers, GDB uses those to unmask the PAC bits. >> +if {$pac_enabled} { >> +    set cmask [get_valueof "" "\$pauth_cmask >> 48" "0" "fetch PAC cmask"] >> +} >> + >> +# Cycle through the tag and pac bit ranges and check how GDB >> +# behaves when trying to access these addresses. >> +foreach upper_bits {"0x0" "0x1" "0x2" "0x4" "0x8" "0x10" "0x20" "0x40" "0x80"} { >> +    foreach lower_bits {"0x0" "0x1" "0x2" "0x4" "0x8" "0x10" "0x20" "0x40"} { >> + >> +    # A successful memory read pattern >> +    set pattern $memory_read_ok_pattern >> + >> +    if {!$pac_enabled} { >> +        # If PAC is not supported, memory reads will fail if >> +        # lower_bits != 0x0 >> +        if {$lower_bits != "0x0"} { >> +        set pattern $memory_read_fail_pattern >> +        } >> +    } else { >> +        # Otherwise, figure out if the memory read will succeed or not by >> +        # checking cmask. >> +        gdb_test_multiple "p/x (~${cmask}ULL & (${lower_bits}ULL))" "" { >> +        -re "= 0x0\r\n$gdb_prompt" { >> +            # Either cmask is 0x7F or lower_bits is 0x0. Either way, the >> +            # memory read should succeed. >> +        } >> +        -re "= $hex\r\n$gdb_prompt" { >> +            if {$lower_bits != "0x0"} { >> +            # cmask doesn't mask off all the PAC bits, which >> +            # results in a memory read failure, with the actual >> +            # address being accessed differing from the one we >> +            # passed. >> +            set pattern $memory_read_fail_pattern >> +            } >> +        } >> +        } >> +    } >> + >> +    # Test without the VA_RANGE_SELECT bit set. >> +    gdb_test "x/gx ((unsigned long) l_ptr | ((${upper_bits}ULL << 56) | (${lower_bits}ULL << 48)))" \ >> +        $pattern \ >> +        "user-space memory access tag bits $upper_bits and pac bits $lower_bits" >> + >> +    # Now test with the VA_RANGE_SELECT bit set. >> +    gdb_test "x/gx ((unsigned long) l_ptr | ((${upper_bits}ULL << 56) | (${lower_bits}ULL << 48) | (1ULL << 55))) " \ >> +        $memory_read_fail_pattern \ >> +        "kernel-space memory access tag bits $upper_bits and pac bits $lower_bits" >> +    } >> +} >> diff --git a/gdb/utils.c b/gdb/utils.c >> index 413a4f4d53b..f88d669c016 100644 >> --- a/gdb/utils.c >> +++ b/gdb/utils.c >> @@ -3139,28 +3139,6 @@ show_debug_timestamp (struct ui_file *file, int from_tty, >>   } >>   >> -/* See utils.h.  */ >> - >> -CORE_ADDR >> -address_significant (gdbarch *gdbarch, CORE_ADDR addr) >> -{ >> -  /* Clear insignificant bits of a target address and sign extend resulting >> -     address, avoiding shifts larger or equal than the width of a CORE_ADDR. >> -     The local variable ADDR_BIT stops the compiler reporting a shift overflow >> -     when it won't occur.  Skip updating of target address if current target >> -     has not set gdbarch significant_addr_bit.  */ >> -  int addr_bit = gdbarch_significant_addr_bit (gdbarch); >> - >> -  if (addr_bit && (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))) >> -    { >> -      CORE_ADDR sign = (CORE_ADDR) 1 << (addr_bit - 1); >> -      addr &= ((CORE_ADDR) 1 << addr_bit) - 1; >> -      addr = (addr ^ sign) - sign; >> -    } >> - >> -  return addr; >> -} >> - >>   const char * >>   paddress (struct gdbarch *gdbarch, CORE_ADDR addr) >>   { >> diff --git a/gdb/utils.h b/gdb/utils.h >> index d2acf899ba2..237ef0a5d99 100644 >> --- a/gdb/utils.h >> +++ b/gdb/utils.h >> @@ -278,9 +278,6 @@ extern void fputs_styled (const char *linebuffer, >>   extern void fputs_highlighted (const char *str, const compiled_regex &highlight, >>                      struct ui_file *stream); >> -/* Return the address only having significant bits.  */ >> -extern CORE_ADDR address_significant (gdbarch *gdbarch, CORE_ADDR addr); >> - >>   /* Convert CORE_ADDR to string in platform-specific manner. >>      This is usually formatted similar to 0x%lx.  */ >>   extern const char *paddress (struct gdbarch *gdbarch, CORE_ADDR addr); >> diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc >> index db508696261..8a6077b6c76 100644 >> --- a/gdbserver/linux-aarch64-low.cc >> +++ b/gdbserver/linux-aarch64-low.cc >> @@ -508,21 +508,37 @@ aarch64_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, >>     return ret; >>   } >> -/* Return the address only having significant bits.  This is used to ignore >> -   the top byte (TBI).  */ >> - >>   static CORE_ADDR >> -address_significant (CORE_ADDR addr) >> +aarch64_remove_non_address_bits (CORE_ADDR pointer) >>   { >> -  /* Clear insignificant bits of a target address and sign extend resulting >> -     address.  */ >> -  int addr_bit = 56; >> +  /* By default, we assume TBI and discard the top 8 bits plus the >> +     VA range select bit (55).  */ >> +  CORE_ADDR mask = (((CORE_ADDR) 1) << (64 - 9)) - 1; >> +  mask = ~mask; >> + >> +  /* Check if PAC is available for this target.  */ >> +  if (tdesc_contains_feature (current_process ()->tdesc, >> +                  "org.gnu.gdb.aarch64.pauth")) >> +    { >> +      /* Fetch the PAC masks.  These masks are per-process, so we can just >> +     fetch data from whatever thread we have at the moment. >> + >> +     Also, we have both a code mask and a data mask.  For now they are the >> +     same, but this may change in the future.  */ >> -  CORE_ADDR sign = (CORE_ADDR) 1 << (addr_bit - 1); >> -  addr &= ((CORE_ADDR) 1 << addr_bit) - 1; >> -  addr = (addr ^ sign) - sign; >> +      struct regcache *regs = get_thread_regcache (current_thread, 1); >> +      CORE_ADDR dmask = regcache_raw_get_unsigned_by_name (regs, "pauth_dmask"); >> +      CORE_ADDR cmask = regcache_raw_get_unsigned_by_name (regs, "pauth_cmask"); >> + >> +      if (dmask != cmask && dmask != 0 && cmask != 0) >> +    { >> +      /* Warn if the masks are different.  */ >> +      warning (_("C mask and D mask differ")); >> +      mask |= (dmask > cmask)? dmask : cmask; >> +    } >> +    } >> -  return addr; >> +  return aarch64_remove_top_bits (pointer, mask); >>   } >>   /* Implementation of linux target ops method "low_stopped_data_address".  */ >> @@ -549,7 +565,7 @@ aarch64_target::low_stopped_data_address () >>        hardware watchpoint hit.  The stopped data addresses coming from the >>        kernel can potentially be tagged addresses.  */ >>     const CORE_ADDR addr_trap >> -    = address_significant ((CORE_ADDR) siginfo.si_addr); >> +    = aarch64_remove_non_address_bits ((CORE_ADDR) siginfo.si_addr); >>     /* Check if the address matches any watched address.  */ >>     state = aarch64_get_debug_reg_state (pid_of (current_thread)); >