From patchwork Wed Feb 28 03:10:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thiago Jung Bauermann X-Patchwork-Id: 86498 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 631003858C35 for ; Wed, 28 Feb 2024 03:11:10 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by sourceware.org (Postfix) with ESMTPS id 943113858D37 for ; Wed, 28 Feb 2024 03:10:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 943113858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 943113858D37 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::633 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709089849; cv=none; b=vl6qxfxwAzjic3Op8JGwsPLBq3GWaJ+EIHaF8KzabPCQsky6JixS56G90zQKcrW6cIi+1OTJ8xY0Of6qapRqHUdaDT5x0gAFTn/7DKDGlW6W+v1kSIMDmziimSClc1YdAfMNU8w3Coc5dV+tBkIFKAaDpU7R5aDmdGi9m/pQY1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709089849; c=relaxed/simple; bh=ZJ5XhcOeDQNcv5l2F+JnlBr2pElGYNYWmvydpLywW7s=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=LzW7BhgOuHMQ+4ETZEsRk2lDCmeKl3CMLbeIvRJtRvtO84ynemJ8fxiJK7MxX4O38k/3ZrHeMVqED4ET5c36SBi38vt71rRAui0WekpmEEJjRqXIxZicUL5632qR/u7rwuO10GvzrHDP9XMy9s6QDZ+YS3fr5l9Qpt7/KwRdok4= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-1dc418fa351so3228375ad.1 for ; Tue, 27 Feb 2024 19:10:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1709089845; x=1709694645; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=fwrNmL3KSr46Nkh9CZFoFkQW5jESv7t8aFC0Plr7wPk=; b=hGBTQbWtU5WLn1uy8TR7fOeic4WoFE7V79xiYpNMWlcpeezevCFKpMVsgW1UvpkHEr xCB0B+6vzO1VMPUtkgHEFfTjZjGkcJOH6K7Wu9I56V29Wfc8aarYg0XnjeGHR57X5No4 4aYBAEhHtwMYiSH+COW8PSGs4UGukM0KR2dzjEks9n2cTb4X9/wvawyz7zhR08u8H80e axpPZGqEiUVqqTapgZwGugrkLIOgn3E1KvE7HoSqYHq31qgG6sgs49fDFm+O/Y20FwLh Fg4UfheDb2jLBA8JqNIcS7yHltfbVauOQEM36hkOeLlw+ao/Fg1ls3UNkU4BXRZNpyi6 VsEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709089845; x=1709694645; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=fwrNmL3KSr46Nkh9CZFoFkQW5jESv7t8aFC0Plr7wPk=; b=m+m57JOm9YLkCGguTvks3Ym94h2RUk6GG0YsHAUBZx7aFU4hC94vRFumudw9OiUZu0 OFvSjKiw/ZlnC+GYcAb8EAYuyhJXVROetRRWkUB9edyNIQsIopphsKn3zVm5viL1uW1p BNbAiT9cVhjMiDDyoSyKubZ+PjXPdpEaRMRida6K8Jy5UuCGtDJn2v2tWZK/r6qYArRP MxuNXpDXlo21Mmv1BsJqCLHx5zvAQNAgElV7LmJFbsiOD+g6yDgm9KkzZa+eXuDIWwuH YT+cG76xC4QqDa1Jrufjx25OirV0Va68diiv9OR7DMNv60hGqsn1jKyhBUU18CZGlEtz gGtQ== X-Gm-Message-State: AOJu0Yxp6weASGzhYmXILEvUYF46DC9g2eqQBA3K5MjyBNm0qzJfQCP3 nRWh8r/+rRkuBQfAaGMap1d155HDkzHkh6aTBBFWKQBd/RF4ZlzsvWWLaFLT15BXWIM7wjGBWpg RcNg= X-Google-Smtp-Source: AGHT+IHXjmh/Rzb6Vf5JwtWYFILeKtFc7Rmkqip+iVtb9uf9jUxlWqC04PjZEV6dS9S8Y0lpVOxyHA== X-Received: by 2002:a17:902:c951:b0:1dc:a84b:e83c with SMTP id i17-20020a170902c95100b001dca84be83cmr2033551pla.25.1709089845430; Tue, 27 Feb 2024 19:10:45 -0800 (PST) Received: from localhost ([2804:14d:7e39:8470:d617:f08f:e330:49c1]) by smtp.gmail.com with ESMTPSA id lo6-20020a170903434600b001dcc2acde95sm969966plb.57.2024.02.27.19.10.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 19:10:44 -0800 (PST) From: Thiago Jung Bauermann To: gdb-patches@sourceware.org Subject: [PATCH v2] gdb/arm: Remove tpidruro register from non-FreeBSD target descriptions Date: Wed, 28 Feb 2024 00:10:42 -0300 Message-ID: <20240228031042.375726-1-thiago.bauermann@linaro.org> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Commit 92d48a1e4eac ("Add an arm-tls feature which includes the tpidruro register from CP15.") introduced the org.gnu.gdb.arm.tls feature, which adds the tpidruro register, and unconditionally enabled it in aarch32_create_target_description. In Linux, the tpidruro register isn't available via ptrace in the 32-bit kernel but it is available for an aarch32 program running under an arm64 kernel via the ptrace compat interface. This isn't currently implemented however, which causes GDB on arm-linux with 64-bit kernel to list the register but show it as unavailable, as reported by Tom de Vries: $ gdb -q -batch a.out -ex start -ex 'p $tpidruro' Temporary breakpoint 1 at 0x512 Temporary breakpoint 1, 0xaaaaa512 in main () $1 = Simon Marchi then clarified: > The only time we should be seeing some "unavailable" registers or memory > is in the context of tracepoints, for things that are not collected. > Seeing an unavailable register here is a sign that something is not > right. Therefore, disable the TLS feature in aarch32 target descriptions for Linux and NetBSD targets (the latter also doesn't seem to support accessing tpidruro either, based on a quick look at arm-netbsd-nat.c). This patch fixes the following tests: Running gdb.base/inline-frame-cycle-unwind.exp ... FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 3: backtrace when the unwind is broken at frame 3 FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 5: backtrace when the unwind is broken at frame 5 FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 1: backtrace when the unwind is broken at frame 1 Tested with Ubuntu 22.04.3 on armv8l-linux-gnueabihf in native, native-gdbserver and native-extended-gdbserver targets with no regressions. PR tdep/31418 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31418 --- Hello, As often happens, after I sent v1 of this patch I noticed a problem with it: It introduces two variants of aarch32 target description (one with TLS support and one without), but only creates and returns the first one that was requested. This version fixes the problem. The only change compared to v1 is in gdb/aarch32-tdep.c. Changes in v2: - Cache two versions of tdesc_aarch32 in aarch32_read_description, one with TLS support and one without.t gdb/aarch32-tdep.c | 15 ++++++++++----- gdb/aarch32-tdep.h | 2 +- gdb/aarch64-linux-nat.c | 2 +- gdb/arch/aarch32.c | 5 +++-- gdb/arch/aarch32.h | 2 +- gdb/arm-fbsd-tdep.c | 2 +- gdb/arm-linux-nat.c | 2 +- gdb/arm-linux-tdep.c | 2 +- gdb/arm-netbsd-nat.c | 2 +- gdbserver/linux-aarch32-tdesc.cc | 2 +- 10 files changed, 21 insertions(+), 15 deletions(-) base-commit: 407ca654547b100903f7eab44d078a2440736f13 diff --git a/gdb/aarch32-tdep.c b/gdb/aarch32-tdep.c index 9177b47d1481..0b7783c3e15d 100644 --- a/gdb/aarch32-tdep.c +++ b/gdb/aarch32-tdep.c @@ -22,15 +22,20 @@ #include "gdbsupport/common-regcache.h" #include "arch/aarch32.h" -static struct target_desc *tdesc_aarch32; +static struct target_desc *tdesc_aarch32_list[2]; /* See aarch32-tdep.h. */ const target_desc * -aarch32_read_description () +aarch32_read_description (bool tls) { - if (tdesc_aarch32 == nullptr) - tdesc_aarch32 = aarch32_create_target_description (); + struct target_desc *tdesc = tdesc_aarch32_list[tls]; - return tdesc_aarch32; + if (tdesc == nullptr) + { + tdesc = aarch32_create_target_description (tls); + tdesc_aarch32_list[tls] = tdesc; + } + + return tdesc; } diff --git a/gdb/aarch32-tdep.h b/gdb/aarch32-tdep.h index 654483438485..009ee61890e2 100644 --- a/gdb/aarch32-tdep.h +++ b/gdb/aarch32-tdep.h @@ -22,6 +22,6 @@ struct target_desc; /* Get the AArch32 target description. */ -const target_desc *aarch32_read_description (); +const target_desc *aarch32_read_description (bool tls); #endif /* aarch32-tdep.h. */ diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c index 11a41e1afae0..9dc45e1c1d96 100644 --- a/gdb/aarch64-linux-nat.c +++ b/gdb/aarch64-linux-nat.c @@ -887,7 +887,7 @@ aarch64_linux_nat_target::read_description () ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec); if (ret == 0) - return aarch32_read_description (); + return aarch32_read_description (false); CORE_ADDR hwcap = linux_get_hwcap (); CORE_ADDR hwcap2 = linux_get_hwcap2 (); diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c index c910e3b5a388..9f3e25088f41 100644 --- a/gdb/arch/aarch32.c +++ b/gdb/arch/aarch32.c @@ -25,7 +25,7 @@ /* See aarch32.h. */ target_desc * -aarch32_create_target_description () +aarch32_create_target_description (bool tls) { target_desc_up tdesc = allocate_target_description (); @@ -39,7 +39,8 @@ aarch32_create_target_description () /* Create a vfpv3 feature, then a blank NEON feature. */ regnum = create_feature_arm_arm_vfpv3 (tdesc.get (), regnum); tdesc_create_feature (tdesc.get (), "org.gnu.gdb.arm.neon"); - regnum = create_feature_arm_arm_tls (tdesc.get (), regnum); + if (tls) + regnum = create_feature_arm_arm_tls (tdesc.get (), regnum); return tdesc.release (); } diff --git a/gdb/arch/aarch32.h b/gdb/arch/aarch32.h index f7ee6faeea3c..1811b8a7a925 100644 --- a/gdb/arch/aarch32.h +++ b/gdb/arch/aarch32.h @@ -22,6 +22,6 @@ /* Create the AArch32 target description. */ -target_desc *aarch32_create_target_description (); +target_desc *aarch32_create_target_description (bool tls); #endif /* aarch32.h. */ diff --git a/gdb/arm-fbsd-tdep.c b/gdb/arm-fbsd-tdep.c index b485951c3764..7b82de2166b5 100644 --- a/gdb/arm-fbsd-tdep.c +++ b/gdb/arm-fbsd-tdep.c @@ -228,7 +228,7 @@ arm_fbsd_read_description_auxv (const std::optional &auxv, if (arm_hwcap & HWCAP_VFP) { if (arm_hwcap & HWCAP_NEON) - return aarch32_read_description (); + return aarch32_read_description (tls); else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPD32)) == (HWCAP_VFPv3 | HWCAP_VFPD32)) return arm_read_description (ARM_FP_TYPE_VFPV3, tls); diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c index 02994732563a..75f498cd5b3f 100644 --- a/gdb/arm-linux-nat.c +++ b/gdb/arm-linux-nat.c @@ -568,7 +568,7 @@ arm_linux_nat_target::read_description () /* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support Neon with VFPv3-D32. */ if (arm_hwcap & HWCAP_NEON) - return aarch32_read_description (); + return aarch32_read_description (false); else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3) return arm_read_description (ARM_FP_TYPE_VFPV3, false); diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c index cc79247aaf12..a8b27a7463a6 100644 --- a/gdb/arm-linux-tdep.c +++ b/gdb/arm-linux-tdep.c @@ -740,7 +740,7 @@ arm_linux_core_read_description (struct gdbarch *gdbarch, /* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support Neon with VFPv3-D32. */ if (arm_hwcap & HWCAP_NEON) - return aarch32_read_description (); + return aarch32_read_description (false); else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3) return arm_read_description (ARM_FP_TYPE_VFPV3, false); diff --git a/gdb/arm-netbsd-nat.c b/gdb/arm-netbsd-nat.c index df8b5ec7b03c..4b9f92946412 100644 --- a/gdb/arm-netbsd-nat.c +++ b/gdb/arm-netbsd-nat.c @@ -350,7 +350,7 @@ arm_netbsd_nat_target::read_description () len = sizeof(flag); if (sysctlbyname("machdep.neon_present", &flag, &len, NULL, 0) == 0 && flag) - return aarch32_read_description (); + return aarch32_read_description (false); return arm_read_description (ARM_FP_TYPE_VFPV3, false); } diff --git a/gdbserver/linux-aarch32-tdesc.cc b/gdbserver/linux-aarch32-tdesc.cc index a696d8946e29..54c6f62e9965 100644 --- a/gdbserver/linux-aarch32-tdesc.cc +++ b/gdbserver/linux-aarch32-tdesc.cc @@ -32,7 +32,7 @@ aarch32_linux_read_description () { if (tdesc_aarch32 == nullptr) { - tdesc_aarch32 = aarch32_create_target_description (); + tdesc_aarch32 = aarch32_create_target_description (false); static const char *expedite_regs[] = { "r11", "sp", "pc", 0 }; init_target_desc (tdesc_aarch32, expedite_regs);