From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id sVbLAJEv2mpWmwsAWB0awg (envelope-from ) for ; Thu, 22 Oct 2026 11:45:21 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=FO05vwTA; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id E6664378003; Thu, 22 Oct 2026 11:45:20 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 57EA8378002 for ; Thu, 22 Oct 2026 11:45:05 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6EBF74BA23FE for ; Thu, 22 Oct 2026 15:45:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6EBF74BA23FE Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=FO05vwTA Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by sourceware.org (Postfix) with ESMTPS id 6FE4B4BA2E3F for ; Thu, 22 Oct 2026 15:44:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6FE4B4BA2E3F Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6FE4B4BA2E3F Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::135 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1792683867; cv=none; b=uDJSCZjh4LQ540WG0byys1EwG/fizTvJ5yegkRPhmODqDtV+6C/p2cBqYnZSOcQ3JkTXC3hA8ZT2txMtD8LAiVjCbcNo+4NbLmGsHSIvqa9xivtotBeSuaebY5MlAn9QEtclrFvAH9JyYQTQ5rA7o7IqML5xgtgH2gF233ZmgE4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1792683867; c=relaxed/simple; bh=ofdcxPNkZ3DdGVoyHh8uNYWVjQSTHxqFW5rImOE6eUE=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=l+33gootX6Fzt2iZmSEj0evo+uFcEPKbqSWrFkVXD+MykPSHj6Ha596qx3Zoy7EYoachHMvVaNqtpNjRWCgGNEkrtEsZ7u+oLsjvbGlk2gDB+DCtz2G/DJW7y/mg2Bu5cJNufF15si7fgL1+QbNytW+R1Eb+JFHBN/MAJ0jG2l4= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=FO05vwTA DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6FE4B4BA2E3F Received: by mail-lf1-x135.google.com with SMTP id 2adb3069b0e04-5be4d648aacso1645667e87.3 for ; Thu, 22 Oct 2026 08:44:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792683866; x=1793288666; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=faSsgDgFQPu+E9kWtSgY/B61925AY3QfNPHnKTmIDKU=; b=FO05vwTAMHEJZD86bbdoLJsU1mcWzuhtkMZ2aPZH03WJd8FBtCyy2kG5F9ilxZm3SE AgT1GexPpqeyXwstgQVBI6X578DoCGUkNNXsO4+GyEB9FnBPtAaQ6XX20JZQRFIc3OuU g4sKKWSnJ1Ko7EEwti8pVzvCmByWj07PN07XvFfRTcBsmgb2J6Mkj96DPviDHGjk/psE MpIXn+1XEdD09u4Nhk8h7HsOlhiz7o3KJa7zv7eDWO8CgYcy/XwhHe18pId0RBt8eZOa /rd/eEJ90JgXJevpQGnFrIV9HtKE7cZn35HkwGq1TOdQIT7IWkn3xJdmpXbIvC23RzMt 6T1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792683866; x=1793288666; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=faSsgDgFQPu+E9kWtSgY/B61925AY3QfNPHnKTmIDKU=; b=C6IcYPaQl5Z+cfGGQ6irpxFIuXflqdmfszaGUGbGKmpErNu7sLq5k2/vQVV4lWlXt2 oyqEdSKKkoouhNwKVrQG5JfEaDLj1cTKXimmfZ3bDGoXGXjZT58753wBbYLmNSTdQ87a 2RNZM/mJKW23n+ufjnWX/Q77Ypkxtf2sA7n+Q+eX1SS2rg+G+Q8uZ3lu8tDILGxDjXmU RCQqCNV6+FmXc1kYbSuOcJSUNHMKlpZoowT4ljpuWFNhqXnJ4awYs8N3DSPh2uBEDZRu fYArgXuFZ+Xm60IULYUFIf3MPqMe8co9kK5x2zFEdWzMqa7QAC8D8tDGM0QVFZUJnlHB csyw== X-Gm-Message-State: AFq9FYInK0qcfiA21HWPd6bF9llTRy0FVg4spbFdXlj9EaaJIaTHhfVB dnSHmRVypq5hGm0GgI1+AflEsjkDuhObvjzPX1MyWGXY13Ya9y1GDiOZiK4YOV1nIZusTQ== X-Gm-Gg: AYBFou0YDHpVNchIXJsrGDc42vW1zFoPBY7BtEiZCj3T3QXeXk2vz8N9uRuFLaT/vXi 5OMwztBqeDwKCVEwdwg6bM+VpFd8DfRd97iBS8KfMX8MOkxPJYORsPEAZNOmPA9TS/t9Deh7cQw 4zR5QfBpnj8atrqa4cgQCTuM03Efnl52lw7Pz746PwTns+ZU6opWl153/jI171ou+BK/mcxHoRo 0xXmUDYMwtlQuiFYcy8QSBTBaQ1mbiyLfmdJtwaDaKBbfMswEmwr+ccPGNAO5tdbewmqW2veVl4 QXQ39DDGX7+Mvv1aBc9MP29aHQS7hxmgyBI1ZwBfEyUcGdAeFttLVfqcJoMt3+2j9aZu+R1hHBq AbWcwiw+CRAxDVpX5tzRGNCTwwp0H8wTPu1aen5SEDriOFWH4JKhd1sqqkwhWiXHD3N/Z7B8U5U mkxIKOI39M4JmpFYRcMDo6oI1Kof387zU/KweH8vpsycia8qa1LTPdP/LMuTzLXTIDjkBWXK1mY DKsb3GBp94K2nC6ci1BGZqBFx0e8067Sqe2wk0goiupv0GnbsM6yMRdivrjerEA+7P98fKRpWtT aVtAL1uB+IR7RqupHaytkLvSHfRGdm2GqybPupNHjuep3oasf6KoOECPQIZmfKxwlNV4xZg= X-Received: by 2002:a05:6512:3984:b0:5bf:9fc6:84a6 with SMTP id 2adb3069b0e04-5bfa1b95f59mr2066087e87.3.1792683865688; Thu, 22 Oct 2026 08:44:25 -0700 (PDT) Received: from localhost.localdomain ([176.15.140.8]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5bfa11f60d9sm1205912e87.17.2026.10.22.08.44.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Oct 2026 08:44:25 -0700 (PDT) From: Farid Khaidari To: gdb-patches@sourceware.org Cc: Farid Khaidari , Andrew Burgess , Palmer Dabbelt , Timur Golubovich Subject: [PATCH 2/4] gdb/riscv: recover core file ISA features from AT_HWCAP Date: Thu, 22 Oct 2026 18:44:15 +0300 Message-ID: <20261022154417.235510-3-khaidari.fg@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261022154417.235510-1-khaidari.fg@gmail.com> References: <20261022154417.235510-1-khaidari.fg@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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~public-inbox=simark.ca@sourceware.org Add a core_read_description hook for RISC-V Linux. It reads AT_HWCAP from the core's auxv and takes FLEN from the F and D bits, on top of what riscv_features_from_bfd finds (the function is now exported). A core with an NT_GDB_TDESC note still uses that note. The V bit is ignored. AT_HWCAP gives no vector length, and a guessed vlenb would give the vector registers the wrong size. The test core is a real kernel dump with NT_FPREGSET removed, so AT_HWCAP (0x20112d, rv64imafdcv) is the only source of FP information. Its V bit also lets the test check that GDB adds no vector registers. Signed-off-by: Farid Khaidari --- gdb/riscv-linux-tdep.c | 120 ++++++++++++++++++ gdb/riscv-tdep.c | 8 +- gdb/riscv-tdep.h | 9 ++ .../gdb.arch/riscv-core-hwcap.core.bz2 | Bin 0 -> 15122 bytes gdb/testsuite/gdb.arch/riscv-core-hwcap.exp | 72 +++++++++++ 5 files changed, 203 insertions(+), 6 deletions(-) create mode 100644 gdb/testsuite/gdb.arch/riscv-core-hwcap.core.bz2 create mode 100644 gdb/testsuite/gdb.arch/riscv-core-hwcap.exp diff --git a/gdb/riscv-linux-tdep.c b/gdb/riscv-linux-tdep.c index fcfa5f98ea4..d7cf6fcfd53 100644 --- a/gdb/riscv-linux-tdep.c +++ b/gdb/riscv-linux-tdep.c @@ -31,6 +31,8 @@ #include "linux-record.h" #include "riscv-linux-tdep.h" #include "inferior.h" +#include "auxv.h" +#include "gdbsupport/selftest.h" extern unsigned int record_debug; @@ -523,6 +525,57 @@ riscv_linux_get_syscall_number (struct gdbarch *gdbarch, thread_info *thread) return ret; } +/* The AT_HWCAP bit for a single-letter ISA extension (COMPAT_HWCAP_ISA_* + in arch/riscv/include/asm/hwcap.h). */ + +static constexpr ULONGEST +riscv_hwcap_isa (char ext) +{ + gdb_assert (ext >= 'a' && ext <= 'z'); + return ULONGEST{ 1 } << (ext - 'a'); +} + +/* Refine FEATURES with the F and D bits of the AT_HWCAP mask HWCAP, + which imply the FLEN. Only fields still at their unknown value (0) + are filled in, so a width already recovered from the core wins. + + The V bit is deliberately ignored: AT_HWCAP carries no vector + length, and a target description with a guessed vlen would + misrepresent the vector registers. The vector state is recovered + from the NT_RISCV_VECTOR note instead. */ + +static void +riscv_apply_hwcap (struct riscv_gdbarch_features &features, ULONGEST hwcap) +{ + if (features.flen == 0) + { + if ((hwcap & riscv_hwcap_isa ('d')) != 0) + features.flen = riscv_flen_d; + else if ((hwcap & riscv_hwcap_isa ('f')) != 0) + features.flen = riscv_flen_f; + } +} + +/* Implement the "core_read_description" gdbarch method. + + Sources in decreasing order of precedence: an NT_GDB_TDESC note is + used by the core target directly and this hook is never consulted; + then the ELF header and the notes via riscv_features_from_bfd; + finally AT_HWCAP, which only fills in what is still unknown. */ + +static const struct target_desc * +riscv_linux_core_read_description (struct gdbarch *gdbarch, + struct target_ops *target, bfd *abfd) +{ + auto features = riscv_features_from_bfd (abfd); + + auto auxv = target_read_auxv_raw (target); + auto hwcap = linux_get_hwcap (auxv, target, gdbarch); + riscv_apply_hwcap (features, hwcap); + + return riscv_lookup_target_description (features); +} + /* Initialize RISC-V Linux ABI info. */ static void @@ -555,6 +608,9 @@ riscv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_iterate_over_regset_sections (gdbarch, riscv_linux_iterate_over_regset_sections); + set_gdbarch_core_read_description (gdbarch, + riscv_linux_core_read_description); + tramp_frame_prepend_unwinder (gdbarch, &riscv_linux_sigframe); tdep->syscall_next_pc = riscv_linux_syscall_next_pc; @@ -567,10 +623,74 @@ riscv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_get_syscall_number (gdbarch, riscv_linux_get_syscall_number); } +#if GDB_SELF_TEST +namespace selftests +{ + +/* Check that AT_HWCAP bits refine the ISA features as expected. */ + +static void +riscv_apply_hwcap_test () +{ + const ULONGEST hwcap_f = riscv_hwcap_isa ('f'); + const ULONGEST hwcap_d = riscv_hwcap_isa ('d'); + const ULONGEST hwcap_v = riscv_hwcap_isa ('v'); + + /* The 'd' bit implies double precision, 'f' single precision. */ + { + riscv_gdbarch_features features; + riscv_apply_hwcap (features, hwcap_d); + SELF_CHECK (features.flen == riscv_flen_d); + } + { + riscv_gdbarch_features features; + riscv_apply_hwcap (features, hwcap_f); + SELF_CHECK (features.flen == riscv_flen_f); + } + + /* 'd' wins over 'f' when both are set. */ + { + riscv_gdbarch_features features; + riscv_apply_hwcap (features, hwcap_d | hwcap_f); + SELF_CHECK (features.flen == riscv_flen_d); + } + + /* An flen already recovered from the core is not overwritten. */ + { + riscv_gdbarch_features features; + features.flen = riscv_flen_f; + riscv_apply_hwcap (features, hwcap_d); + SELF_CHECK (features.flen == riscv_flen_f); + } + + /* The 'v' bit is ignored: AT_HWCAP carries no vector length. */ + { + riscv_gdbarch_features features; + riscv_apply_hwcap (features, hwcap_v); + SELF_CHECK (features.vlen == 0); + } + + /* No relevant bits leaves the features untouched. */ + { + riscv_gdbarch_features features; + riscv_apply_hwcap (features, 0); + SELF_CHECK (features.flen == 0); + SELF_CHECK (features.vlen == 0); + } +} + +} /* namespace selftests */ +#endif /* GDB_SELF_TEST */ + /* Initialize RISC-V Linux target support. */ INIT_GDB_FILE (riscv_linux_tdep) { gdbarch_register_osabi (bfd_arch_riscv, 0, GDB_OSABI_LINUX, riscv_linux_init_abi); + +#if GDB_SELF_TEST + selftests::register_test ("riscv-apply-hwcap", + selftests::riscv_apply_hwcap_test); +#endif } diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c index 1af4be77091..1801b042de3 100644 --- a/gdb/riscv-tdep.c +++ b/gdb/riscv-tdep.c @@ -3924,9 +3924,6 @@ static const struct frame_unwind_legacy riscv_frame_unwind ( /*.prev_arch =*/ NULL ); -/* FP register width, in bytes, implied by the D and F extensions. */ -static constexpr int riscv_flen_d = 8; -static constexpr int riscv_flen_f = 4; /* Return the FLEN implied by SIZE, the size of an NT_FPREGSET note, or 0 if SIZE matches no known layout. The note holds 32 FP registers of @@ -3971,10 +3968,9 @@ riscv_flen_from_core_fpregset (bfd *abfd) return flen; } -/* Extract a set of required target features out of ABFD. If ABFD is - nullptr then a RISCV_GDBARCH_FEATURES is returned in its default state. */ +/* See riscv-tdep.h. */ -static struct riscv_gdbarch_features +struct riscv_gdbarch_features riscv_features_from_bfd (bfd *abfd) { struct riscv_gdbarch_features features; diff --git a/gdb/riscv-tdep.h b/gdb/riscv-tdep.h index 344a995a680..5fe91b7287c 100644 --- a/gdb/riscv-tdep.h +++ b/gdb/riscv-tdep.h @@ -158,6 +158,15 @@ extern int riscv_abi_flen (struct gdbarch *gdbarch); argument registers. */ extern bool riscv_abi_embedded (struct gdbarch *gdbarch); +/* FP register width, in bytes, implied by the D and F extensions. */ +constexpr int riscv_flen_d = 8; +constexpr int riscv_flen_f = 4; + +/* Extract a set of required target features out of ABFD. If ABFD is + nullptr then a RISCV_GDBARCH_FEATURES is returned in its default + state. */ +extern struct riscv_gdbarch_features riscv_features_from_bfd (bfd *abfd); + /* Single step based on where the current instruction will take us. */ extern std::vector riscv_software_single_step (struct regcache *regcache); diff --git a/gdb/testsuite/gdb.arch/riscv-core-hwcap.core.bz2 b/gdb/testsuite/gdb.arch/riscv-core-hwcap.core.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c557362d69cf483e16c370c0ecd3fe974b882e69 GIT binary patch literal 15122 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 AiU0rr literal 0 HcmV?d00001 diff --git a/gdb/testsuite/gdb.arch/riscv-core-hwcap.exp b/gdb/testsuite/gdb.arch/riscv-core-hwcap.exp new file mode 100644 index 00000000000..84f09c04b3a --- /dev/null +++ b/gdb/testsuite/gdb.arch/riscv-core-hwcap.exp @@ -0,0 +1,72 @@ +# Copyright 2026 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Check that GDB recovers the ISA features of a core file from the +# AT_HWCAP entry of the NT_AUXV note: the kernel publishes the +# single-letter ISA extensions of the machine there, so a kernel core +# opened without the executable still reveals the F and D extensions. +# +# The bundled core (riscv-core-hwcap.core.bz2) is a real kernel core +# (e_flags = 0, no NT_GDB_TDESC, no RISC-V attributes) whose +# NT_FPREGSET note has been stripped, leaving AT_HWCAP = 0x20112d +# (rv64acdfimv) as the only evidence of the FP extension. The F-only +# mapping and the precedence rules are covered by the +# "riscv-apply-hwcap" selftest. +# +# How to regenerate the fixture: take the riscv-core-fpregset.core.bz2 +# kernel core and remove the NT_FPREGSET note from PT_NOTE: rewrite the +# note blob without the CORE/type-2 entry, zero-pad the segment to keep +# file offsets stable, shrink p_filesz/p_memsz of the PT_NOTE program +# header accordingly, and bzip2 the result. + +# The fixture is an ELF64 core and the FLEN assertions are +# RV64-specific. +require {istarget "riscv64-*-*"} + +if {![istarget *-*-linux*]} { + unsupported "linux only" + return -1 +} + +set core [decompress_bz2 $srcdir/$subdir/riscv-core-hwcap.core.bz2] +if {$core == ""} { + untested "failed to decompress core file" + return -1 +} +set core [gdb_remote_download host $core] + +clean_restart + +# Before the core is loaded there is no target, so nothing to prove +# that the FP and vector registers below really come from the core. +gdb_test "info registers \$fa0" "The program has no registers now\\." \ + "no registers before the core is loaded" + +if {![gdb_core_cmd $core "load kernel core without executable"]} { + return -1 +} + +# The D bit of AT_HWCAP gives us the FP registers. +gdb_test "info registers \$fa0" "fa0\[ \t\]+.*" \ + "fp registers recovered from hwcap" + +# ... and implies FLEN = 8. +gdb_test "print sizeof (\$fa0)" "= 8" \ + "flen recovered from hwcap" + +# The V bit of AT_HWCAP is deliberately ignored: it carries no vector +# length, so no vector registers are invented. +gdb_test "info registers \$v0" "Invalid register .v0." \ + "no vector registers invented from hwcap" -- 2.43.0