From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-eopbgr150050.outbound.protection.outlook.com [40.107.15.50]) by sourceware.org (Postfix) with ESMTPS id 0958D3854149 for ; Tue, 4 Oct 2022 08:54:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0958D3854149 ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=DgsBGpKQ8h8Ne/xX95BHzCvWYuaneEo+lX4RwzVOMowKKP6GSPNdzVk2KQ8hvkAauwx0jDKf6PFgMU2tCNKK9e2IiM5424nq1Mc1jQf0spfNTzw4jLszU7bcoGkIfXBfYQxGzrbTXha6Aa1Wie/UIRJzHi3BlTClBkKSmfg/pC6xjgqu+qd0yuPH5b2omuq/wQU4sUgz4eIMSl9CdaFebCHOb2fzKY2uWDMA58/w7HsoZ0yKpSfzk4q21WhiB4hT/Ol5ZhEEau5C6mXOQZ7JUvju7PibnQX+nUbfO4cRanrTHQMTpI9uJTVNwA5R/yVhFeoQq1xHO/gZLeQrB2ZXKQ== 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=3LkRBGvyE9rbs92HLXhk611HzHc/r7LIGo9JBgXH5jg=; b=Wpix/se5PKxJEaj0zhoXDycFFvUdf/ww+6bCXUXWLfLtf3BeH5akmk3TMflj3slpkn1w2fArhaVmWBHqSCy6sJB16M1QeKRJG+apIrncV+/xqWv8I2oq+XOGxyXWakdBxIxa3L5M2CD5uHOvB99pOhxBLgZd99Rjq2Jk0r8g0aPGkX14MKXuXtgv6BiFgSM22K7LN8Yx4mXsyNdpLqYElB/O5Jng2dgFv2fp0V2LYNgKndWIEJ/7xoHuKOim1wuxC3m3WNMzBPFldEztlBXwymH6QvC1g518ltJfFkEcZxWLpr1X5VuN1Q2oFfAoDn8mst5qSHH2gTkFmoot964NGg== 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 FR3P281CA0109.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a3::9) by PA4PR08MB6272.eurprd08.prod.outlook.com (2603:10a6:102:ef::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5676.28; Tue, 4 Oct 2022 08:54:15 +0000 Received: from VE1EUR03FT029.eop-EUR03.prod.protection.outlook.com (2603:10a6:d10:a3:cafe::be) by FR3P281CA0109.outlook.office365.com (2603:10a6:d10:a3::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5676.31 via Frontend Transport; Tue, 4 Oct 2022 08:54:15 +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 VE1EUR03FT029.mail.protection.outlook.com (10.152.18.107) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5676.17 via Frontend Transport; Tue, 4 Oct 2022 08:54:15 +0000 Received: ("Tessian outbound 86cf7f935b1b:v128"); Tue, 04 Oct 2022 08:54:14 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 81a5174f937524ce X-CR-MTA-TID: 64aa7808 Received: from a1c7959355ce.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id F8BC8C23-FAFF-4D6E-8CF1-7A0DC0151931.1; Tue, 04 Oct 2022 08:54:07 +0000 Received: from EUR04-HE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id a1c7959355ce.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 04 Oct 2022 08:54:07 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jpUEF0vTWZPcGZH1P+SFTOnmCLr1FRe8Jexxq8HJLonJzAvzKCzszUnvT0FyQ3DQN9AZcjbReXx2i87gAonuKik7G1frS1yFkWJ06V9Yor1NUfpVC/W9W2FSaf9kVax3z3JZDnvfcv0jT2knGDRoKj712sr13FYKG4fc7LiQ+qMApHDJ2Pj59Y+3h8d+O5k9biQXCVvX1r8858Ygp4iQfYaP8yaoSvbDxmlWv/mgk35TSZEqXxo/irL3DOwyqGkaQJaOU4YXH+WXj9LwOzaq7iGR93HUPHuj6+iaipEJKGC/1hHx1j/gMg+rkPUO5OVzWl/z25gDMQ5XkpZ+23khHA== 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=3LkRBGvyE9rbs92HLXhk611HzHc/r7LIGo9JBgXH5jg=; b=Irmn877qaEorSlElDVbJZIp68KRXFZ9kL97haKcckWbrzm19s/3ghxx2LHjGb7WYven9k6tJ+UlannE4R0R79VfGppg7UikFME8lYQYy1UpXe/LRMYtcDJcj4EvrgyGmFU5IwDuR62X/eeynr9caWGISv1ofw9hRsTlympKrXpfwVYJGDNC/yweXVtQmWgRYp0DYn7k2BuB4fqPMTeuzszIe7mXXyGVimR9KECAZPxlLduBvYaolYRgxIK4fZmCK9PTLN+jLW0o9yMNwvjs/jkcx6Hj6yLIC+H2kCciC0H+w0JqZqmQ79ZFhC+wKS3f2vnZq0wiN1qZMTbyowtkSAA== 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 PAXPR08MB7599.eurprd08.prod.outlook.com (2603:10a6:102:23e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5676.23; Tue, 4 Oct 2022 08:54:04 +0000 Received: from VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::c5f9:a25b:a5f2:6094]) by VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::c5f9:a25b:a5f2:6094%5]) with mapi id 15.20.5676.028; Tue, 4 Oct 2022 08:54:03 +0000 Message-ID: <9150b49d-d5b4-21b9-f4ea-effdedd3fbe3@arm.com> Date: Tue, 4 Oct 2022 09:53:58 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Subject: [PING][PATCH] [AArch64] Add TPIDR2 register support for Linux Content-Language: en-US To: gdb-patches@sourceware.org References: <20220923134648.114930-1-luis.machado@arm.com> From: Luis Machado In-Reply-To: <20220923134648.114930-1-luis.machado@arm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO4P123CA0129.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:193::8) To VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: VI1PR08MB3919:EE_|PAXPR08MB7599:EE_|VE1EUR03FT029:EE_|PA4PR08MB6272:EE_ X-MS-Office365-Filtering-Correlation-Id: 6a3d96df-abc7-468c-753a-08daa5e603e5 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: cJ05mKKAANuE/qPnjkll+kKj+QR5/mfd0Y+okrUNtJewTR6BmaBpuDz5I60cuDJ20N4zmTCdfZM09LxnlDKlwf0xJgqyVBjYMCe+EoO7skVArxGkE1iyZ48iXDWQnr5fBETazAE7wsK9ktcKT0cV5E2g2JGHHvafoDuU/E8v9ykLVJyiQLxY4uHds1tmLBCJmYrNIbNz6FCCLTNCbgXnEUp5wn/QpWnYlkjKVfvJA5Qnn6FB/C44mus2n6/VVta6IIuqceUOjYMCVghW0Cj2syuzkAytyL2QxiPVMI4iGQAb7pUQ9WKMktRNa2QLFGBW5RMyHSqN+lp4ThstbWpLrSHRf7tG0yJIoQgS2iGr2jsBhQh0MjlWaNnMjQO+zgcCV7vNbcAQSOjB1vwwyxdtK8nSu90BxbI+pF/DxdXWey9IYyn3f6JCwZVC2XHR2cV9T7e037ZamIX3+VHUJy7hZU5lyh/NfjiDUIQzAgNWio2RaicqsLVvQaE7NkUDwYgruNuq9d7RuXXKddusvuSsh6GhGZHQAp7pqQp7+dCJWAPz4Q8tqGaYBRyYE2nrMtMYiQ3cFn7UlYb47UiXYLFOufKpHRRVVtqiIOfS5Eb6UoXZUPmg9HH0QnAhfohgdDdoAPRXh/J+rpfU4987Toxw0LsqxUnMwgiyi6aKTI2HHezFqYC9Jv8vWDA6o0tjTERTT+N1+UPGw0gJqaUI1Fw3oqNIzJE7t5IYdYBL63BhctgxgZjVkZKTaNb9jApUZcHr67OwLsR2YbrCT2vb9G8byuX97A5XVdKzarbrUSg32bKU8cN7iunUNWYLXbRicokHgOtVtSr4bG/oaBsrwgZQfRzZv1/1jlV4sLmrCpwdKTb6JqtSBujpahb9pkG7nNV/ 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:(13230022)(4636009)(366004)(39860400002)(396003)(136003)(376002)(346002)(451199015)(2616005)(21480400003)(83380400001)(38100700002)(5660300002)(966005)(2906002)(44832011)(186003)(41300700001)(8936002)(6486002)(26005)(478600001)(53546011)(66476007)(6512007)(6506007)(66946007)(316002)(8676002)(30864003)(6666004)(66556008)(6916009)(36756003)(31686004)(31696002)(86362001)(2004002)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR08MB7599 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: VE1EUR03FT029.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 169ad1fb-5016-4dba-b2d5-08daa5e5fcbd X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /eRXetfmBNSXGT0U4/DI2MfX43P2Zu0zCdQDAWV3zjxez5tQmxoxLELKMEuI83gOx39SQj8StoE8W6LEqZgN3YDWsSdN7PCSY88QNGfdHa4To74oe3hztnYmAWufQvhjYaqFUMb5IUocJ/HVU1I31uP8i5dHV8KzRKdiwdaJ0eLSLJTezx8b/QZ44UmNsuf4sq3UvQvPLaZSBf525R3bOiaETKr/VXYd5MY7GvSuczaC+NogErtCOIV5kSEGIxyJS9fgHZ/rmoqvjFKq2JUPb/nX6Dk5DGXjcGAAiom6KvI4DCCJvXcs/Ap6SRckGpeQjPzsUeZORjeB/9C9Mq49BKAGt7GjZTS6REBaSNJocDZooCCYzO/YlSbaC6fVMB1gS9f4kY4cb1evVAPa2F0/YSnQsMneSJ4mpZmpHSUvgjmPPa+T9IHiSdp9hR9+3F6Mo2DOhTF8coGpNdizVNmlx6M9Z212Zaf87U1o7jI5vjZS2SuQl/FQLGoBOZW2jwyT1xvWMpvO9mPm02uyGcpO63LD/8XlB50pCcdWFtN/k6Se1qjqk4JPsegfVEfyi0O9bx+IsTpM9xbLVELUQeU6bnwy3QiDngJf9zZT7PlbDazkfKf1ER33JTvxMsBEDH2y0PtUJcayxmIC3tD4mJHLqXwiQlkh9H52/HGf3IHO2FT+Jvlx1xgmQJmFAQR1u9mbvINO+8CrXW2VM8vsmyj/Ir94bDiy3QN3cnajvPzoISMEJSyEe24+bqDMp3rhYthOKeXN/aE98QZLDGKQ+E4XIia6u1wh1nJ4yAsPzAVjCGvmWALZakgFuiINdaZO38r1ipIRTK4d/p+K945vI8V83IiAydqBYt+1SzbelLfnT6QN81M6ljm3VTl13LLWBpou 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:(13230022)(4636009)(396003)(136003)(346002)(376002)(39860400002)(451199015)(36840700001)(46966006)(40470700004)(26005)(6512007)(2616005)(6666004)(53546011)(6506007)(6916009)(70586007)(316002)(70206006)(8676002)(36756003)(478600001)(82310400005)(40480700001)(966005)(82740400003)(31696002)(86362001)(356005)(40460700003)(6486002)(83380400001)(21480400003)(336012)(47076005)(81166007)(186003)(36860700001)(31686004)(5660300002)(8936002)(44832011)(30864003)(41300700001)(2906002)(2004002)(43740500002); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Oct 2022 08:54:15.1370 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6a3d96df-abc7-468c-753a-08daa5e603e5 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: VE1EUR03FT029.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR08MB6272 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, 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: Tue, 04 Oct 2022 08:54:30 -0000 Looking for a global maintainer review of the generic code bits. On 9/23/22 14:46, Luis Machado via Gdb-patches wrote: > With the AArch64 Scalable Matrix Extension we have a new TPIDR2 register, and > it will be added to the existing NT_ARM_TLS register set. Kernel patches are > being reviewed here: > > https://lore.kernel.org/linux-arm-kernel/20220818170111.351889-1-broonie@kernel.org/ > >>From GDB's perspective, we handle it in a similar way to the existing TPIDR > register. But we need to consider cases of systems that only have TPIDR and > systems that have both TPIDR and TPIDR2. > > With that in mind, the following patch adds the required code to support > TPIDR2 and turns the org.gnu.gdb.aarch64.tls feature into a > dynamically-generated target description as opposed to a static target > description containing only TPIDR. > > That means we can remove the gdb/features/aarch64-tls.xml file and replace the > existing gdb/features/aarch64-tls.c auto-generated file with a new file that > dynamically generates the target description containing either TPIDR alone or > TPIDR and TPIDR2. > > In the future, when *BSD's start to support this register, they can just > enable it as is being done for the AArch64 Linux target. > > The core file read/write code has been updated to support TPIDR2 as well. > > On GDBserver's side, there is a small change to the find_regno function to > expose a non-throwing version of it. > > It always seemed strange to me how find_regno causes the whole operation to > abort if it doesn't find a particular register name. The patch moves code > from find_regno into find_regno_no_throw and makes find_regno call > find_regno_no_throw instead. > > This allows us to do register name lookups to find a particular register > number without risking erroring out if nothing is found. > > The patch also adjusts the feature detection code for aarch64-fbsd, since > the infrastructure is shared amongst all aarch64 targets. I haven't added > code to support TPIDR2 in aarch64-fbsd though, as I'm not sure when/if > that will happen. > --- > gdb/aarch64-fbsd-nat.c | 2 +- > gdb/aarch64-fbsd-tdep.c | 2 +- > gdb/aarch64-linux-nat.c | 38 +++++++++++++++------------- > gdb/aarch64-linux-tdep.c | 25 ++++++++++++++----- > gdb/aarch64-linux-tdep.h | 3 --- > gdb/aarch64-tdep.c | 45 ++++++++++++++++++++++++++-------- > gdb/aarch64-tdep.h | 3 ++- > gdb/arch/aarch64.c | 5 ++-- > gdb/arch/aarch64.h | 14 +++++++---- > gdb/features/Makefile | 1 - > gdb/features/aarch64-tls.c | 35 +++++++++++++++++++++++--- > gdb/features/aarch64-tls.xml | 11 --------- > gdb/nat/aarch64-linux.c | 17 +++++++++++++ > gdb/nat/aarch64-linux.h | 4 +++ > gdbserver/linux-aarch64-low.cc | 24 ++++++++++++++---- > gdbserver/regcache.cc | 17 +++++++++++-- > gdbserver/regcache.h | 5 ++++ > 17 files changed, 183 insertions(+), 68 deletions(-) > delete mode 100644 gdb/features/aarch64-tls.xml > > diff --git a/gdb/aarch64-fbsd-nat.c b/gdb/aarch64-fbsd-nat.c > index 708ddc40d58..40941f138d9 100644 > --- a/gdb/aarch64-fbsd-nat.c > +++ b/gdb/aarch64-fbsd-nat.c > @@ -149,7 +149,7 @@ const struct target_desc * > aarch64_fbsd_nat_target::read_description () > { > aarch64_features features; > - features.tls = have_regset (inferior_ptid, NT_ARM_TLS) != 0; > + features.tls = have_regset (inferior_ptid, NT_ARM_TLS)? 1 : 0; > return aarch64_read_description (features); > } > > diff --git a/gdb/aarch64-fbsd-tdep.c b/gdb/aarch64-fbsd-tdep.c > index 4a6b4115234..c9971434777 100644 > --- a/gdb/aarch64-fbsd-tdep.c > +++ b/gdb/aarch64-fbsd-tdep.c > @@ -179,7 +179,7 @@ aarch64_fbsd_core_read_description (struct gdbarch *gdbarch, > asection *tls = bfd_get_section_by_name (abfd, ".reg-aarch-tls"); > > aarch64_features features; > - features.tls = tls != nullptr; > + features.tls = tls != nullptr? 1 : 0; > > return aarch64_read_description (features); > } > diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c > index eda79ec6d35..03eec37a6c4 100644 > --- a/gdb/aarch64-linux-nat.c > +++ b/gdb/aarch64-linux-nat.c > @@ -442,19 +442,19 @@ fetch_tlsregs_from_thread (struct regcache *regcache) > = gdbarch_tdep (regcache->arch ()); > int regno = tdep->tls_regnum; > > - gdb_assert (regno != -1); > + gdb_assert (regno != -1 && tdep->tls_register_count > 0); > > - uint64_t tpidr = 0; > + uint64_t tpidrs[tdep->tls_register_count] = { 0 }; > struct iovec iovec; > - > - iovec.iov_base = &tpidr; > - iovec.iov_len = sizeof (tpidr); > + iovec.iov_base = tpidrs; > + iovec.iov_len = sizeof (tpidrs); > > int tid = get_ptrace_pid (regcache->ptid ()); > if (ptrace (PTRACE_GETREGSET, tid, NT_ARM_TLS, &iovec) != 0) > - perror_with_name (_("unable to fetch TLS register")); > + perror_with_name (_("unable to fetch TLS registers")); > > - regcache->raw_supply (regno, &tpidr); > + for (int i = 0; i < tdep->tls_register_count; i++) > + regcache->raw_supply (regno + i, &tpidrs[i]); > } > > /* Store to the current thread the valid TLS register set in GDB's > @@ -467,19 +467,21 @@ store_tlsregs_to_thread (struct regcache *regcache) > = gdbarch_tdep (regcache->arch ()); > int regno = tdep->tls_regnum; > > - gdb_assert (regno != -1); > + gdb_assert (regno != -1 && tdep->tls_register_count > 0); > > - uint64_t tpidr = 0; > + uint64_t tpidrs[tdep->tls_register_count] = { 0 }; > > - if (REG_VALID != regcache->get_register_status (regno)) > - return; > + for (int i = 0; i < tdep->tls_register_count; i++) > + { > + if (REG_VALID != regcache->get_register_status (regno + i)) > + continue; > > - regcache->raw_collect (regno, (char *) &tpidr); > + regcache->raw_collect (regno + i, (char *) &tpidrs[i]); > + } > > struct iovec iovec; > - > - iovec.iov_base = &tpidr; > - iovec.iov_len = sizeof (tpidr); > + iovec.iov_base = &tpidrs; > + iovec.iov_len = sizeof (tpidrs); > > int tid = get_ptrace_pid (regcache->ptid ()); > if (ptrace (PTRACE_SETREGSET, tid, NT_ARM_TLS, &iovec) != 0) > @@ -607,7 +609,9 @@ aarch64_store_registers (struct regcache *regcache, int regno) > && (regno == tdep->mte_reg_base)) > store_mteregs_to_thread (regcache); > > - if (tdep->has_tls () && regno == tdep->tls_regnum) > + if (tdep->has_tls () > + && regno >= tdep->tls_regnum > + && regno < tdep->tls_regnum + tdep->tls_register_count) > store_tlsregs_to_thread (regcache); > } > > @@ -788,7 +792,7 @@ aarch64_linux_nat_target::read_description () > features.vq = aarch64_sve_get_vq (tid); > features.pauth = hwcap & AARCH64_HWCAP_PACA; > features.mte = hwcap2 & HWCAP2_MTE; > - features.tls = true; > + features.tls = aarch64_tls_register_count (tid); > > return aarch64_read_description (features); > } > diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c > index 15773c75da8..d6ca3ae7228 100644 > --- a/gdb/aarch64-linux-tdep.c > +++ b/gdb/aarch64-linux-tdep.c > @@ -753,11 +753,17 @@ aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, > "MTE registers", cb_data); > } > > + /* Handle the TLS registers. */ > if (tdep->has_tls ()) > { > + gdb_assert (tdep->tls_regnum != -1 && tdep->tls_register_count > 0); > + int sizeof_tls_regset > + = AARCH64_TLS_REGISTER_SIZE * tdep->tls_register_count; > + > const struct regcache_map_entry tls_regmap[] = > { > - { 1, tdep->tls_regnum, 8 }, > + { tdep->tls_register_count, tdep->tls_regnum, > + AARCH64_TLS_REGISTER_SIZE }, > { 0 } > }; > > @@ -766,9 +772,8 @@ aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, > tls_regmap, regcache_supply_regset, regcache_collect_regset > }; > > - cb (".reg-aarch-tls", AARCH64_LINUX_SIZEOF_TLSREGSET, > - AARCH64_LINUX_SIZEOF_TLSREGSET, &aarch64_linux_tls_regset, > - "TLS register", cb_data); > + cb (".reg-aarch-tls", sizeof_tls_regset, sizeof_tls_regset, > + &aarch64_linux_tls_regset, "TLS register", cb_data); > } > } > > @@ -778,7 +783,6 @@ static const struct target_desc * > aarch64_linux_core_read_description (struct gdbarch *gdbarch, > struct target_ops *target, bfd *abfd) > { > - asection *tls = bfd_get_section_by_name (abfd, ".reg-aarch-tls"); > CORE_ADDR hwcap = linux_get_hwcap (target); > CORE_ADDR hwcap2 = linux_get_hwcap2 (target); > > @@ -786,7 +790,16 @@ aarch64_linux_core_read_description (struct gdbarch *gdbarch, > features.vq = aarch64_linux_core_read_vq (gdbarch, abfd); > features.pauth = hwcap & AARCH64_HWCAP_PACA; > features.mte = hwcap2 & HWCAP2_MTE; > - features.tls = tls != nullptr; > + > + /* Handle the TLS section. */ > + asection *tls = bfd_get_section_by_name (abfd, ".reg-aarch-tls"); > + if (tls != nullptr) > + { > + size_t size = bfd_section_size (tls); > + /* Convert the size to the number of actual registers, by > + dividing by 8. */ > + features.tls = size >> 3; > + } > > return aarch64_read_description (features); > } > diff --git a/gdb/aarch64-linux-tdep.h b/gdb/aarch64-linux-tdep.h > index 9a7e4339dba..8ae33efc605 100644 > --- a/gdb/aarch64-linux-tdep.h > +++ b/gdb/aarch64-linux-tdep.h > @@ -39,9 +39,6 @@ > /* The MTE regset consists of a 64-bit register. */ > #define AARCH64_LINUX_SIZEOF_MTE_REGSET (8) > > -/* The TLS regset consists of a single register. */ > -#define AARCH64_LINUX_SIZEOF_TLSREGSET (X_REGISTER_SIZE) > - > extern const struct regset aarch64_linux_gregset; > extern const struct regset aarch64_linux_fpregset; > > diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c > index d0387044934..5d82f1993a4 100644 > --- a/gdb/aarch64-tdep.c > +++ b/gdb/aarch64-tdep.c > @@ -3399,8 +3399,18 @@ aarch64_features_from_target_desc (const struct target_desc *tdesc) > = (tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.pauth") != nullptr); > features.mte > = (tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.mte") != nullptr); > - features.tls > - = (tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.tls") != nullptr); > + > + const struct tdesc_feature *tls_feature > + = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.tls"); > + > + if (tls_feature != nullptr) > + { > + /* We have TLS registers. Find out how many. */ > + if (tdesc_unnumbered_register (tls_feature, "tpidr2")) > + features.tls = 2; > + else > + features.tls = 1; > + } > > return features; > } > @@ -3454,7 +3464,8 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) > bool valid_p = true; > int i, num_regs = 0, num_pseudo_regs = 0; > int first_pauth_regnum = -1, ra_sign_state_offset = -1; > - int first_mte_regnum = -1, tls_regnum = -1; > + int first_mte_regnum = -1, first_tls_regnum = -1; > + int tls_register_count = 0; > uint64_t vq = aarch64_get_tdesc_vq (info.target_desc); > > if (vq > AARCH64_MAX_SVE_VQ) > @@ -3544,13 +3555,26 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) > /* Add the TLS register. */ > if (feature_tls != nullptr) > { > - tls_regnum = num_regs; > - /* Validate the descriptor provides the mandatory TLS register > - and allocate its number. */ > - valid_p = tdesc_numbered_register (feature_tls, tdesc_data.get (), > - tls_regnum, "tpidr"); > + const char *tls_register_names[2] = { "tpidr", "tpidr2" }; > + first_tls_regnum = num_regs; > + > + /* Look for the TLS registers. */ > + for (i = 0; i < ARRAY_SIZE (tls_register_names); i++) > + { > + valid_p > + = tdesc_numbered_register (feature_tls, tdesc_data.get (), > + first_tls_regnum + tls_register_count, > + tls_register_names[i]); > + if (valid_p) > + tls_register_count++; > + } > + valid_p = true; > + > + if (tls_register_count == 0) > + warning (_("Provided TLS register feature doesn't contain " > + "any registers.")); > > - num_regs++; > + num_regs += tls_register_count; > } > > /* Add the pauth registers. */ > @@ -3601,7 +3625,8 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) > tdep->ra_sign_state_regnum = (feature_pauth == NULL) ? -1 > : ra_sign_state_offset + num_regs; > tdep->mte_reg_base = first_mte_regnum; > - tdep->tls_regnum = tls_regnum; > + tdep->tls_regnum = first_tls_regnum; > + tdep->tls_register_count = tls_register_count; > > set_gdbarch_push_dummy_call (gdbarch, aarch64_push_dummy_call); > set_gdbarch_frame_align (gdbarch, aarch64_frame_align); > diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h > index d8513023c37..8166df0ada8 100644 > --- a/gdb/aarch64-tdep.h > +++ b/gdb/aarch64-tdep.h > @@ -111,8 +111,9 @@ struct aarch64_gdbarch_tdep : gdbarch_tdep_base > return mte_reg_base != -1; > } > > - /* TLS register. This is -1 if the TLS register is not available. */ > + /* TLS registers. This is -1 if the TLS registers are not available. */ > int tls_regnum = 0; > + int tls_register_count = 0; > > bool has_tls() const > { > diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c > index 0f73286f145..565c5e7a81c 100644 > --- a/gdb/arch/aarch64.c > +++ b/gdb/arch/aarch64.c > @@ -53,8 +53,9 @@ aarch64_create_target_description (const aarch64_features &features) > if (features.mte) > regnum = create_feature_aarch64_mte (tdesc.get (), regnum); > > - if (features.tls) > - regnum = create_feature_aarch64_tls (tdesc.get (), regnum); > + /* TLS registers. */ > + if (features.tls > 0) > + regnum = create_feature_aarch64_tls (tdesc.get (), regnum, features.tls); > > return tdesc.release (); > } > diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h > index 8e3fd36726a..b1a6ce3ef0e 100644 > --- a/gdb/arch/aarch64.h > +++ b/gdb/arch/aarch64.h > @@ -33,7 +33,9 @@ struct aarch64_features > > bool pauth = false; > bool mte = false; > - bool tls = false; > + > + /* A positive TLS value indicates the number of TLS registers available. */ > + uint8_t tls = 0; > }; > > inline bool operator==(const aarch64_features &lhs, const aarch64_features &rhs) > @@ -56,7 +58,9 @@ namespace std > h = features.vq; > h = h << 1 | features.pauth; > h = h << 1 | features.mte; > - h = h << 1 | features.tls; > + /* Shift by two bits for now. We may need to increase this in the future > + if more TLS registers get added. */ > + h = h << 2 | features.tls; > return h; > } > }; > @@ -96,7 +100,9 @@ enum aarch64_regnum > AARCH64_LAST_V_ARG_REGNUM = AARCH64_V0_REGNUM + 7 > }; > > -#define V_REGISTER_SIZE 16 > +/* Sizes of various AArch64 registers. */ > +#define AARCH64_TLS_REGISTER_SIZE 8 > +#define V_REGISTER_SIZE 16 > > /* Pseudo register base numbers. */ > #define AARCH64_Q0_REGNUM 0 > @@ -117,8 +123,6 @@ enum aarch64_regnum > #define AARCH64_NUM_REGS AARCH64_FPCR_REGNUM + 1 > #define AARCH64_SVE_NUM_REGS AARCH64_SVE_VG_REGNUM + 1 > > -#define AARCH64_TLS_REGS_SIZE (8) > - > /* There are a number of ways of expressing the current SVE vector size: > > VL : Vector Length. > diff --git a/gdb/features/Makefile b/gdb/features/Makefile > index 4bc85962dfe..037f900b58b 100644 > --- a/gdb/features/Makefile > +++ b/gdb/features/Makefile > @@ -198,7 +198,6 @@ FEATURE_XMLFILES = aarch64-core.xml \ > aarch64-fpu.xml \ > aarch64-pauth.xml \ > aarch64-mte.xml \ > - aarch64-tls.xml \ > arc/v1-core.xml \ > arc/v1-aux.xml \ > arc/v2-core.xml \ > diff --git a/gdb/features/aarch64-tls.c b/gdb/features/aarch64-tls.c > index 30d730dffba..8a59d26b353 100644 > --- a/gdb/features/aarch64-tls.c > +++ b/gdb/features/aarch64-tls.c > @@ -1,14 +1,43 @@ > -/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: > - Original: aarch64-tls.xml */ > +/* Copyright (C) 2022 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 "gdbsupport/tdesc.h" > > +/* This function is NOT auto generated from xml. > + > + Create the aarch64 description containing the TLS registers. TPIDR is > + always available, but TPIDR2 is only available on some systems. > + > + COUNT is the number of registers in this set. The minimum is 1. */ > + > static int > -create_feature_aarch64_tls (struct target_desc *result, long regnum) > +create_feature_aarch64_tls (struct target_desc *result, long regnum, int count) > { > + /* TPIDR is always present. */ > + gdb_assert (count >= 1); > + > struct tdesc_feature *feature; > > feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.tls"); > tdesc_create_reg (feature, "tpidr", regnum++, 1, NULL, 64, "data_ptr"); > + > + /* Add TPIDR2. */ > + if (count > 1) > + tdesc_create_reg (feature, "tpidr2", regnum++, 1, NULL, 64, "data_ptr"); > + > return regnum; > } > diff --git a/gdb/features/aarch64-tls.xml b/gdb/features/aarch64-tls.xml > deleted file mode 100644 > index f6437785f71..00000000000 > --- a/gdb/features/aarch64-tls.xml > +++ /dev/null > @@ -1,11 +0,0 @@ > - > - > - > - > - > - > - > diff --git a/gdb/nat/aarch64-linux.c b/gdb/nat/aarch64-linux.c > index 421d1ecb53c..017c30948a9 100644 > --- a/gdb/nat/aarch64-linux.c > +++ b/gdb/nat/aarch64-linux.c > @@ -250,3 +250,20 @@ aarch64_ps_get_thread_area (struct ps_prochandle *ph, > > return PS_OK; > } > + > +/* See nat/aarch64-linux.h */ > + > +int > +aarch64_tls_register_count (int tid) > +{ > + uint64_t tls_regs[2]; > + struct iovec iovec; > + iovec.iov_base = tls_regs; > + iovec.iov_len = sizeof (tls_regs); > + > + if (ptrace (PTRACE_GETREGSET, tid, NT_ARM_TLS, &iovec) != 0) > + return 1; > + > + /* TPIDR2 is available. */ > + return 2; > +} > diff --git a/gdb/nat/aarch64-linux.h b/gdb/nat/aarch64-linux.h > index 1777ce32522..517cbb33963 100644 > --- a/gdb/nat/aarch64-linux.h > +++ b/gdb/nat/aarch64-linux.h > @@ -129,4 +129,8 @@ ps_err_e aarch64_ps_get_thread_area (struct ps_prochandle *ph, > lwpid_t lwpid, int idx, void **base, > int is_64bit_p); > > +/* Return the number of TLS registers in the NT_ARM_TLS set. This is only > + used for aarch64 state. */ > +int aarch64_tls_register_count (int tid); > + > #endif /* NAT_AARCH64_LINUX_H */ > diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc > index db508696261..b657a265ee7 100644 > --- a/gdbserver/linux-aarch64-low.cc > +++ b/gdbserver/linux-aarch64-low.cc > @@ -292,9 +292,16 @@ aarch64_store_mteregset (struct regcache *regcache, const void *buf) > static void > aarch64_fill_tlsregset (struct regcache *regcache, void *buf) > { > + gdb_byte *tls_buf = (gdb_byte *) buf; > int tls_regnum = find_regno (regcache->tdesc, "tpidr"); > > - collect_register (regcache, tls_regnum, buf); > + collect_register (regcache, tls_regnum, tls_buf); > + > + /* Read TPIDR2, if it exists. */ > + gdb::optional regnum = find_regno_no_throw (regcache->tdesc, "tpidr2"); > + > + if (regnum.has_value ()) > + collect_register (regcache, *regnum, tls_buf + sizeof (uint64_t)); > } > > /* Store TLS register to regcache. */ > @@ -302,9 +309,16 @@ aarch64_fill_tlsregset (struct regcache *regcache, void *buf) > static void > aarch64_store_tlsregset (struct regcache *regcache, const void *buf) > { > + gdb_byte *tls_buf = (gdb_byte *) buf; > int tls_regnum = find_regno (regcache->tdesc, "tpidr"); > > - supply_register (regcache, tls_regnum, buf); > + supply_register (regcache, tls_regnum, tls_buf); > + > + /* Write TPIDR2, if it exists. */ > + gdb::optional regnum = find_regno_no_throw (regcache->tdesc, "tpidr2"); > + > + if (regnum.has_value ()) > + supply_register (regcache, *regnum, tls_buf + sizeof (uint64_t)); > } > > bool > @@ -795,8 +809,8 @@ aarch64_adjust_register_sets (const struct aarch64_features &features) > regset->size = AARCH64_LINUX_SIZEOF_MTE; > break; > case NT_ARM_TLS: > - if (features.tls) > - regset->size = AARCH64_TLS_REGS_SIZE; > + if (features.tls > 0) > + regset->size = AARCH64_TLS_REGISTER_SIZE * features.tls; > break; > default: > gdb_assert_not_reached ("Unknown register set found."); > @@ -829,7 +843,7 @@ aarch64_target::low_arch_setup () > features.pauth = linux_get_hwcap (8) & AARCH64_HWCAP_PACA; > /* A-profile MTE is 64-bit only. */ > features.mte = linux_get_hwcap2 (8) & HWCAP2_MTE; > - features.tls = true; > + features.tls = aarch64_tls_register_count (tid); > > current_process ()->tdesc = aarch64_linux_read_description (features); > > diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc > index 27491efc52d..0b0d0855db3 100644 > --- a/gdbserver/regcache.cc > +++ b/gdbserver/regcache.cc > @@ -244,14 +244,27 @@ registers_from_string (struct regcache *regcache, char *buf) > hex2bin (buf, registers, len / 2); > } > > -int > -find_regno (const struct target_desc *tdesc, const char *name) > +/* See regcache.h */ > + > +gdb::optional > +find_regno_no_throw (const struct target_desc *tdesc, const char *name) > { > for (int i = 0; i < tdesc->reg_defs.size (); ++i) > { > if (strcmp (name, find_register_by_number (tdesc, i).name) == 0) > return i; > } > + return {}; > +} > + > +int > +find_regno (const struct target_desc *tdesc, const char *name) > +{ > + gdb::optional regnum = find_regno_no_throw (tdesc, name); > + > + if (regnum.has_value ()) > + return *regnum; > + > internal_error (__FILE__, __LINE__, "Unknown register %s requested", > name); > } > diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h > index 731c18d16e2..b67eefbe04b 100644 > --- a/gdbserver/regcache.h > +++ b/gdbserver/regcache.h > @@ -110,6 +110,11 @@ int register_cache_size (const struct target_desc *tdesc); > > int register_size (const struct target_desc *tdesc, int n); > > +/* No throw version of find_regno. If NAME is not a known register, return > + an empty value. */ > +gdb::optional find_regno_no_throw (const struct target_desc *tdesc, > + const char *name); > + > int find_regno (const struct target_desc *tdesc, const char *name); > > void supply_register (struct regcache *regcache, int n, const void *buf);