From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2065.outbound.protection.outlook.com [40.107.20.65]) by sourceware.org (Postfix) with ESMTPS id 3991E385AC11 for ; Tue, 25 Oct 2022 13:53:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3991E385AC11 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-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=GdcDddRcBga3B4dQZjSm5ryYAQcnDoHSUSX7YagBIQIL8Phs0tvifcbhH8t+ZSIs1QAjzvm+MeCOn54p0cyApRKjpdSZWBiWOxZTZX+oQH6l7TMLXTLVRZzYWh+rECOgQZYfAOG2Sof89Q0v9cx9BLFZIodql6T1cOd51doJYEsZtFZ0EZziMqAammwplBgBHAMbq0KyIJcICr7EfEyEoptkNStw6+1GSVXJU1ngc7WlEJ6qI/dY/uD0OFDpK38hSt3cnXbAQbcdppBLiiWpUZUFrzBUGev7jOCeyEGavpK/mpupKTS8Pe3g1N5OxoJT7BFHvuDrv6Goaq7UmeRjNg== 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=wisfY39K3cBOnF9C01vaUH8UG9gzjwrbghXNsFE0hVE=; b=CEVN5b1n74u0rkPuI/YRhcy02ctEpCALlkwLquhstxZFfMldi9XzRQ8qk+CXCxT1YKoghLF6ezA/eA5UHpR8vbjsACLxkpgu9LYGrvsFVUn8hEAhIjen7gEObBcZ/6+losWE53qeGCLvk7pJJuwWrLORzuYYQ1Vp0aYq30+ZtEeLO67F+T5aks0kqjaBhMWCwzxRUVwPIjJWRy+9fM5b8/qbLmvMdvRAlWGzlsSai8J574tI9vRnoSda0TtzmQzx2E2Evh6+YTNTV9L8veViEt35wYSRVj6FhPAZRuN4HgnQAvEOGFMXppjJTTGS7/mpDinK7H+OB9wXULnzvzV+Ng== 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]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wisfY39K3cBOnF9C01vaUH8UG9gzjwrbghXNsFE0hVE=; b=SvWfFhoqIAqch+k3yADloIXSP1Wszy1FgyCxk+bMevGbzxFeFM4qnTw5QM8Zni4PKTxnjsb7cyrSnzbr8W3J4jY6eozIKn2B79DKDpcfEj0gwM7+qBi3BP4BluEBwDXJI+HqqKRzpblQgDdjTCiyhrquFuHPe6DnogAo7ncxQ5A= Received: from ZR0P278CA0010.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:16::20) by DB9PR08MB8360.eurprd08.prod.outlook.com (2603:10a6:10:3d8::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5746.21; Tue, 25 Oct 2022 13:53:04 +0000 Received: from VI1EUR03FT039.eop-EUR03.prod.protection.outlook.com (2603:10a6:910:16:cafe::87) by ZR0P278CA0010.outlook.office365.com (2603:10a6:910:16::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5746.28 via Frontend Transport; Tue, 25 Oct 2022 13:53:04 +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 VI1EUR03FT039.mail.protection.outlook.com (100.127.144.77) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.32 via Frontend Transport; Tue, 25 Oct 2022 13:53:03 +0000 Received: ("Tessian outbound 2ff13c8f2c05:v130"); Tue, 25 Oct 2022 13:53:03 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 9bc1b15e31e67037 X-CR-MTA-TID: 64aa7808 Received: from cf80d05e256f.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 3F48729A-8587-4054-892A-276C64266507.1; Tue, 25 Oct 2022 13:52:53 +0000 Received: from EUR02-DB5-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id cf80d05e256f.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 25 Oct 2022 13:52:53 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cuTOClxaRb9WB6I9DF1l8byPJ9OJvMlzoQDItbn0/qQ2NlbHch1DxXdDvnE6acUTFNqTMU9Yd0klgWDFGj5Ypz+Oh/0CgI60IRZeOH3PfCVHauvSDDpJ4Xvg9WqCIZNdL1wz34G5hweVjW3tc6rYMYJRl2aq8RAjbv/hKIccEEF3cyMs8VKXWEgbbe6+XavLH4qFDI4pkROXTLq3VaYiTxJkqERMx39HFDP5IvBxeQ5+nH1X7/QO1cBj3b7p6mP3T0ENpOss0Q43uS+buZRf8lYQJ05pl5CF6GKwp3geM1YOBuYnpWm4tPw18TKM9C+cGp6oWFAgLlRZGgKtdSL3eA== 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=wisfY39K3cBOnF9C01vaUH8UG9gzjwrbghXNsFE0hVE=; b=OP92eWxR4BIlrGIJA3Fz7qbAlv0pvdUG9elohFtmDmunBfYJbTDjBgh701QlJNbD5XqcKD7v/QAK9N9/cjRFsuMgQMsFVAndBAln/XoDRJZChN8pNic6rgpkwp/y00qtLPXu5nSUb3WWi3NYBTlxr9eDIUPo90cfkPxgLRgjMmG97GrRtWxbhRgowvRhnN8SI+owkgsVgK/HD4tMxmgAvRqHN+s9ayJ3Dbl4rSbKUpIsc+KeIli7ni054lVKSR5T00sg5guiu7G4XVQMmYf/nGxV//KnvsI1UqpAtslJXlFoMTugTvEh5xCzQteRWMmVsFgDbioVtxCKEbU52kWRsA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wisfY39K3cBOnF9C01vaUH8UG9gzjwrbghXNsFE0hVE=; b=SvWfFhoqIAqch+k3yADloIXSP1Wszy1FgyCxk+bMevGbzxFeFM4qnTw5QM8Zni4PKTxnjsb7cyrSnzbr8W3J4jY6eozIKn2B79DKDpcfEj0gwM7+qBi3BP4BluEBwDXJI+HqqKRzpblQgDdjTCiyhrquFuHPe6DnogAo7ncxQ5A= 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 DU2PR08MB10160.eurprd08.prod.outlook.com (2603:10a6:10:496::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5746.28; Tue, 25 Oct 2022 13:52:51 +0000 Received: from VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::7f57:1601:9b18:7529]) by VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::7f57:1601:9b18:7529%7]) with mapi id 15.20.5746.028; Tue, 25 Oct 2022 13:52:51 +0000 Message-ID: Date: Tue, 25 Oct 2022 14:52:50 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.2 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: LO4P123CA0081.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:190::14) To VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: VI1PR08MB3919:EE_|DU2PR08MB10160:EE_|VI1EUR03FT039:EE_|DB9PR08MB8360:EE_ X-MS-Office365-Filtering-Correlation-Id: 60d77941-2e1e-40ff-a165-08dab6903d00 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: qrw/SoCanOTO9xqSNyBAUHhdRXr75AY1bs/Iu5D9in8LkIViou1Zb9mVCr+QL0FQLwty0lz7H5SpaTcWvflTbTTsTV/ZEw4t1BmtyK0Kt2gmH8HBYRollk+xY6NAGHDJTIxT/MvBHLbXm72MUyJGgebOadOucqdS6iWtD+XXuByQGKFwkWaiZ+iA0+ObS+YDgCjrH7YAbe+rNMTa6xIhl2iNlvo9OpogT5uuq9awtxGqvZOPyIsDBCtwxwDDfcsgOHBZhNzIgHNsa9SSYc2DX6lZ3OZ3+11fOsJRtVYBQtbPNcTg0hGSZj7JI+q8Y9l0jQf4kS6R8zMtNBguQONnhBVRK6nu78TULdLe+JwL26SkdketNLjx/r15isYDGCDXsLPO9tnxhh3DLs/vaQhWFsUDexwp4597loZk5N73i1IGw0zEiaNjA3JUPlxMjD86NyTLKaZ9FHFPNbWSWJpdzkV0cKHjijdtKdT4U4qrU8H92ADLP6AQwkmAgBw+PaHFOAV1M5Z2AnUwDvlzA33iGKjayZRT/xsAwroho63bUFeXePv4iZ5xaljH+91aTVheqT2kVT1subHWQ54jWn2zoZ1EIiZqmn3qHMYPeqpXLZALQLCNbjiJbhL9KV5rTaIOy+jMSrAwrflasVCTwZ2w4SE5y1qjf4tLunqx5U/5jrVeD7tyFX1CwbWLctKuyIMJ+aJQ+mdj7WQa4y/wLUoKm7kUJEFqeQYor2Xun8dB3WTH6yzNu/+4MgrnMKEnSUBE9ah1hCcbHjsgxE5D3wkz3aSin2QrwqgNPll8X6qpWbJ6HGw0YEOXNsHx5JS65naEGsx0EhC4EP+vOX/9Q86Cm3qlwgB/GhCI+BhQWUWNjNmVIaMoJFr5eaXqKtjhpdBW 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)(136003)(366004)(39860400002)(376002)(396003)(346002)(451199015)(21480400003)(66946007)(8676002)(38100700002)(5660300002)(2906002)(44832011)(66476007)(86362001)(66556008)(6916009)(8936002)(316002)(41300700001)(31696002)(30864003)(26005)(6512007)(36756003)(186003)(2616005)(966005)(6486002)(83380400001)(478600001)(53546011)(6506007)(31686004)(2004002)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU2PR08MB10160 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: VI1EUR03FT039.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 17edf98a-cc33-4ed4-6c65-08dab6903564 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dbCNU+uqJQ/7zK4YBfGGKe0QihWYfV65NgMQiNN6gZfxJ4TpJlIcyUJvsMIXxNeD4j59vSeaEA5YTxFfOsklGtlS5odVUjsOSEjrroQAAIlpyWhFm+54mUWCaht2kRP2CM3/w1+/3nHQxGz7ZdvpAg85s2UlJGQ2MtGTGtiqsypBSyxgLBlbNPR3OiTvOAtaS7do+zJJtETQ7JBecJX25Q5kOAbZqieGiBkA6K4eu+Ph2xUGOmA5btNgFXfmq5X4051eWpejqIGETuTkgbnhNJwwqR40gxuQs0tzqKFS7hEsfE3mFrmj/uH8ACxM62sHUa7/+cHfEBuy9scCctuYKLvJFtK0Txrbm4UF8lS+jUGZYqYH8h2XVf8hOMyZuLV9PnD7t0+YhVj28UmnxPXcE8tY25/Fua9bIJt4JTb2naGzab2Y/8caF8WjCSTuouhbqTE5rur3BXTpa67DE0tcWYLY6pr0rw3D+N4Xx1r9ET0YGdR2glXCCMtmoXIU/5EPx5CO/3FXWeDlrcdgxqp/FyHBWrKl50fZSTmlPyOB2M6j5bGiu8M4YqMO+k0J/R1LDHbUEzT2IiW6ILR5CDlQGepjohSWRd6gsZa4UNV4ew2/owGkHDUlCtlY5mcoyCNsQLszAQ+L/F/TeLRk5ovZPuDrXTNqyFfZBAttZFMO4pQKd20aCtxu6Ur9m3YHH8GfOGeUdELQQmwJXE0mHMn3lS5t4RI35Y6frsduRl3QT4UfJR9Rti5XgCQ2jO1iVBCQpNT7MoTnNQAV+Pgc4gDq1s9NrS+fOJVCpIdOYgpQ/edAz7M6PMZc/SLbhOe6PT8mEtYOcfhYItr80SzpbyCNkEiwIi+YNnPvEPjS/to2YRswtMHxdPJn80a+Tdgvi4li 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)(136003)(346002)(39860400002)(376002)(396003)(451199015)(40470700004)(46966006)(36840700001)(53546011)(81166007)(6506007)(8676002)(40480700001)(356005)(70206006)(30864003)(83380400001)(2906002)(2616005)(44832011)(21480400003)(36756003)(47076005)(336012)(41300700001)(6512007)(82310400005)(26005)(5660300002)(186003)(8936002)(31696002)(478600001)(70586007)(86362001)(31686004)(6486002)(316002)(966005)(6916009)(82740400003)(36860700001)(40460700003)(2004002)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Oct 2022 13:53:03.9937 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 60d77941-2e1e-40ff-a165-08dab6903d00 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: VI1EUR03FT039.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB8360 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 List-Id: 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);