From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-eopbgr130074.outbound.protection.outlook.com [40.107.13.74]) by sourceware.org (Postfix) with ESMTPS id 233073858C52 for ; Thu, 10 Nov 2022 01:02:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 233073858C52 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=oAEEmNHybjRSQHGDXnBLsB6tmtR84GK7vO0fWAME8v5d+3XL0W528eyPiL/yAwjkg9E+Yt1VmL1OsPrhFFMgywqkxanRp3C1mrgjzPUhEPmm4YjXh4TWr952X/hlnSMpMDbpNi9FEER/rAtKRwkY+LhP8G0crX/dkeFUEpQ50CUTz3dLtbffOCm5ognJ2gj84Juy7PtEA/1jMpJqE+JTrYXOEJVfwAZmI3ajpbSqXsyVTHvAaSMMV7QQ34Qtw9UrPly0EomTpVNbbpg39+Zl75OhdreAYPRdxtFyO//Rm2SXqHjyuCBt2qdt81c2n51RTXuOjQINScgejpFlabV//A== 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=LLDE3vZvh/usWYzcbG3AqPbBJoX1Lb6245T1rJ6HYthOFGxQphM5MhwnNeo5VAhgo5A8wt/N7UbvhiFBNB18Grdge7bJqWbXjca/k5TC0FVNs5glruL2BQW1QA+xO+mXD+NGAWrrQUFrxJgxPWfELZSM6h2pXO06nzNhZcoOuTy1sBV64LXOP9shcCSmnP8ydZe9E9sS/G5wiYvCrg1pzDlA/KcEXlDlrT99XKOB+rs/QLk9sx3Aed03NEKsX1W7yeFSaPTVjkYJuSXAkX4cy5Du+U4Sw7SB0EPCbRTjOCFKwhY5vnkC5LU87rsdfbf3W4nSyGi3F19pPLccJF2MwA== 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=PKtUtZZtaMj3El36L0WSnkmQHH5zTqnVndkUsGRDhv5DvcWoNABwhEjSxu+5Mcyo20zn77tSE0ws9HbSGZGWh79dUDfCHZHagPcSv9SSTc70m/o2q0oOISWvkCbblhEfJaDkAFgCd2+zqqIYEBVz/AioDfHFb0ArSvXl8hiS3D0= Received: from DB6PR0501CA0036.eurprd05.prod.outlook.com (2603:10a6:4:67::22) by AS8PR08MB6216.eurprd08.prod.outlook.com (2603:10a6:20b:29c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13; Thu, 10 Nov 2022 01:02:36 +0000 Received: from DBAEUR03FT060.eop-EUR03.prod.protection.outlook.com (2603:10a6:4:67:cafe::bb) by DB6PR0501CA0036.outlook.office365.com (2603:10a6:4:67::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5791.22 via Frontend Transport; Thu, 10 Nov 2022 01:02:36 +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 DBAEUR03FT060.mail.protection.outlook.com (100.127.142.238) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.12 via Frontend Transport; Thu, 10 Nov 2022 01:02:36 +0000 Received: ("Tessian outbound 73ab5f36653e:v130"); Thu, 10 Nov 2022 01:02:36 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 918568cc250598cb X-CR-MTA-TID: 64aa7808 Received: from 88aee0292241.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id E61DF0DE-A46F-47AA-BF14-2E699E9CF4E6.1; Thu, 10 Nov 2022 01:02:29 +0000 Received: from EUR03-AM7-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 88aee0292241.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 10 Nov 2022 01:02:29 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=csk2Pq2KN3WnvcRux55yumT+yix8uMbkNnYlkzRztfyU4tEalGNw2zhP05WpmwO6G9S6Qizw8D3WzpQJFer1qdQcZEF8KfxfhKaHT2mkAtgm7Oelzn2YMQ0RBSYGLK1Ygm9pN9cedhIWNeXgvCmy5V0d+Xu7n8Il14nAyWm5ltT4GYdJCxz4WyZGFacCyMLCBn1Xv17R9FhtRW/ncincal9a4PEveUXYppx8wySazrrOfXzapvxb5ZMMHFNDThbStuj2OEu1cbaV/eVrHVCT0la9P0MFoOpux3Hvkqr6W3vxgGsN2kGiwGEejUh2h34NgoLHELoUvUldZaD8y5sxRg== 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=PqdB3p2ltfK0iTqORphHn/sWci+7lvr2ROh8m8BTiO0SgERprlh03ab3zoBWHYYg5+aaICiGonoqbxmf6AmOFIx0dqjubrOhWrcHLXEQnRq4ftYzKlmnqzqcpA0ysiZLXKMqeU7LHgFjTw5omzeinrCVnMBtyfYCOTNv6ezqPCT6mNi/OHSMw9+3U6cZBDJoz/0DSN8jC69MJ4+LbSxTCSW0sFhOrgeCux+O25ftMtd3d13YhYxsnpRjyO94UpYAtFx+bNKwCPyTxVqBfRoGu3zSF0sDYUUdc8QMzCmPWj0eOARG34G5IputJIELemsf4UV4pppAiJpj2C/q7Fe/bg== 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=PKtUtZZtaMj3El36L0WSnkmQHH5zTqnVndkUsGRDhv5DvcWoNABwhEjSxu+5Mcyo20zn77tSE0ws9HbSGZGWh79dUDfCHZHagPcSv9SSTc70m/o2q0oOISWvkCbblhEfJaDkAFgCd2+zqqIYEBVz/AioDfHFb0ArSvXl8hiS3D0= 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 DU0PR08MB8229.eurprd08.prod.outlook.com (2603:10a6:10:3a7::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.11; Thu, 10 Nov 2022 01:02:27 +0000 Received: from VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::f9e6:599b:e673:801]) by VI1PR08MB3919.eurprd08.prod.outlook.com ([fe80::f9e6:599b:e673:801%5]) with mapi id 15.20.5813.012; Thu, 10 Nov 2022 01:02:27 +0000 Message-ID: Date: Thu, 10 Nov 2022 01:01:49 +0000 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: SN4PR0501CA0003.namprd05.prod.outlook.com (2603:10b6:803:40::16) To VI1PR08MB3919.eurprd08.prod.outlook.com (2603:10a6:803:c4::31) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: VI1PR08MB3919:EE_|DU0PR08MB8229:EE_|DBAEUR03FT060:EE_|AS8PR08MB6216:EE_ X-MS-Office365-Filtering-Correlation-Id: 1fe1b81c-a306-468d-9371-08dac2b741ac 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: SPy8IRvvcEttnwDflMKniXgbJnuU0ckDDfQEG28cNrVd3idWjymYhfp/57q6nItFzdd5az0XNzzrQzqQwf0J71mDxIJpe0ZrkZ5sEqflkABgndho3r9x6ydiC4SOoZjh0rM+hYUPjhgmKSvXVzRg6mI4kA0eIhf6HF37I5nCPlBCO8eSNVih0KCOMUm533HLYuAlPn1Dz9kBZwlrlIEShJklaf46BQuiQLllwbNWmlhtOYBe0dJ4AiNenOkKVcKMgaN/ktgPf/AYGNOWLeWm2dCKf3MpMAVBBpFcM3QSjVgSuK2TsPVYUzixS1fIx80ZY0wLFcmPnPrIfl3yP76Sz2bliYecyZrCfmI1wIrfHXAAlf9KhJKbmueWPFVNaShTKZr56G0Xcjz3I/GB82VtINWUOKGsIMtGfCfLkSj21CJO7QP11ZLxhmcw1rtD7skCBBdrShmHRKxms9EZMlThFWoUTW77y5uJ3a6noNqHMdC/cj+Ua3znrGjx6cbIxHDYzo65r5RMVka1BlfhqLTvF+A+A8KsObhgbX5xV1LOorQBtW51ZLa+QOVUSdOBju/4lpTXZJcFrLPvCR/jASM70gsy8251sxcjhyY1CDRuBPM8onkZRMzVqVOq+SlgUUST7exp2qYLyKejB3PWLZj64wvboeWOE2mMysPGqY4pU3toxirVdB9/zQUXl4lOr3bJu4VGCFZy+rWhwwKOrYp+Yygsq0Uvg8O2qccAMjsegvbWPFBLA8ekEQmhFqOJIO+/5tlZiZOVk/EXVixitIDAmdyP+m8WKlI1ERqNBFYObNLkv1clWVTB5tWhjiQHjNTtUM48t6LbS47TYkpdBhWKTii8Ed+f7XzDuU8/IN0Y53WRHkmrtStRL71xz2NGbtCV 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)(376002)(346002)(136003)(39860400002)(396003)(366004)(451199015)(8676002)(44832011)(478600001)(2906002)(66476007)(38100700002)(316002)(41300700001)(966005)(30864003)(5660300002)(6486002)(66556008)(66946007)(83380400001)(6916009)(6666004)(26005)(6506007)(86362001)(31696002)(186003)(2616005)(53546011)(6512007)(21480400003)(8936002)(31686004)(36756003)(2004002)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8229 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: DBAEUR03FT060.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: bd658cc7-3e62-4cb6-6067-08dac2b7272a X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3+t0iDFSHr5XVwHAa7UtUvl507Wgq1KTA3TJrNF2cMQvDnRkE8LHVY6YKzR1XoIyHhUYNWSM0boDB7RauF68TcjZGtiTGRoke4GQYBJu1ViPsUjRbNq2JkEYuEM8j/xaI1/3H2MHxBAYqvBOlFjo+Cg53AC1m2Ejx7OaVAJ8HqsudalpK0i6yGrHFRvoTXuBYW5q8VB/0bWNDVcfxZwVK1Xhv2l41fsplSGXX1b6Iv+i2K1wH75SOWwvRlayqbRMoDLT4BIB5ixJzuSi8+jz7VCHbfCq72zQHoHUEoRoXQR83Ok+fOShs1ZQgENV8h1C1F46CdrQ4vOOgBZsiDEMAfQKk8zZZ69e7qg3beHOAkgiurnweWHRPpUIeUH03w+oVaPSxeXGP4s+3C8OdIuoEeE9eEliz8x+cWhjdIbLCcsk+mrBU9wwcjFRSu2WwYUkVjxb1CZmHt3ZofnaAg11lUFvsRuSL0ElQ9J9v01AR9bevArK9AvW1ovN5yog4M70+I9do+/yNXiNIRO65MRkRQiPwT9ibBP94NJsywRwkR7eLgMW+5+sdWvM9DJ/+nMH0q03TclN5E0Doxc99h2+u9h2J2HNnkN6FotCqL3uz+daYeHfYkXCujkEyiaC4wkZ4VbNQlIGTZnUVASa3cn+kn6hpCaY/uvNUB6cSgNqZ1XTofcbnxmCVA1yM+SnAWP1I3144aIaTjK/P29fmJyw/PsaD4IgFkSk0WC8TK4aVr5ehkZPFp26ltACCAdWiizqmUgwoPhZq7StoC9Hy2FGxCV6CG1bWy45qRcYlqZfZZW0qhUwlzsaquRyUal43fPEmds0h/cnjwoD56lyGX5g9cNPoFa7L8Avj7SqZfuKUj8Us/CERcvHD/DUPYU6q1oQ 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)(376002)(136003)(346002)(39860400002)(396003)(451199015)(36840700001)(46966006)(40470700004)(70206006)(2906002)(30864003)(44832011)(82310400005)(86362001)(31696002)(40460700003)(81166007)(82740400003)(356005)(6666004)(6506007)(2616005)(53546011)(478600001)(6512007)(26005)(316002)(6916009)(70586007)(966005)(8676002)(6486002)(40480700001)(8936002)(36860700001)(5660300002)(47076005)(21480400003)(186003)(336012)(36756003)(41300700001)(83380400001)(31686004)(2004002)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Nov 2022 01:02:36.2979 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1fe1b81c-a306-468d-9371-08dac2b741ac 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: DBAEUR03FT060.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB6216 X-Spam-Status: No, score=-12.3 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);