From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.baldwin.cx (bigwig.baldwin.cx [IPv6:2607:f138:0:13::2]) by sourceware.org (Postfix) with ESMTPS id 759B2385782B for ; Mon, 9 Oct 2023 18:36:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 759B2385782B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=FreeBSD.org Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=FreeBSD.org Received: from ralph.baldwin.net (unknown [98.47.15.113]) by mail.baldwin.cx (Postfix) with ESMTPSA id 6CFDA1A84E35; Mon, 9 Oct 2023 14:36:46 -0400 (EDT) From: John Baldwin To: gdb-patches@sourceware.org Cc: Willgerodt, Felix , George, Jini Susan , Simon Marchi Subject: [RFC 08/13] x86-fbsd-nat: Support fetching TARGET_OBJECT_X86_CPUID objects Date: Mon, 9 Oct 2023 11:36:10 -0700 Message-ID: <20231009183617.24862-9-jhb@FreeBSD.org> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231009183617.24862-1-jhb@FreeBSD.org> References: <20231009183617.24862-1-jhb@FreeBSD.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.6.4 (mail.baldwin.cx [0.0.0.0]); Mon, 09 Oct 2023 14:36:47 -0400 (EDT) X-Virus-Scanned: clamav-milter 0.103.1 at mail.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_STATUS,KHOP_HELO_FCRDNS,SPF_HELO_PASS,SPF_SOFTFAIL,TXREP 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: When probing for the cached XSAVE layout, fetch the CPUID note data and cache it until needed for a future fetch via ::xfer_partial. --- gdb/configure.nat | 6 ++++-- gdb/x86-fbsd-nat.c | 37 +++++++++++++++++++++++++++++++++++++ gdb/x86-fbsd-nat.h | 9 +++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/gdb/configure.nat b/gdb/configure.nat index 1dc4206b69c..4ed71d8619d 100644 --- a/gdb/configure.nat +++ b/gdb/configure.nat @@ -165,7 +165,8 @@ case ${gdb_host} in ;; i386) # Host: FreeBSD/i386 - NATDEPFILES="${NATDEPFILES} x86-nat.o nat/x86-dregs.o \ + NATDEPFILES="${NATDEPFILES} x86-nat.o nat/x86-cpuid.o \ + nat/x86-dregs.o nat/x86-xstate.o x86-bsd-nat.o x86-fbsd-nat.o i386-fbsd-nat.o \ bsd-kvm.o" ;; @@ -195,7 +196,8 @@ case ${gdb_host} in i386) # Host: FreeBSD/amd64 NATDEPFILES="${NATDEPFILES} amd64-nat.o \ - amd64-fbsd-nat.o bsd-kvm.o x86-nat.o nat/x86-dregs.o \ + amd64-fbsd-nat.o bsd-kvm.o x86-nat.o nat/x86-cpuid.o \ + nat/x86-dregs.o \ nat/x86-xstate.o x86-bsd-nat.o x86-fbsd-nat.o" ;; esac diff --git a/gdb/x86-fbsd-nat.c b/gdb/x86-fbsd-nat.c index 240e228976c..14fd323a7fb 100644 --- a/gdb/x86-fbsd-nat.c +++ b/gdb/x86-fbsd-nat.c @@ -20,6 +20,7 @@ #include "defs.h" #include "x86-fbsd-nat.h" #ifdef PT_GETXSTATE_INFO +#include "nat/x86-cpuid.h" #include "nat/x86-xstate.h" #endif @@ -48,6 +49,40 @@ x86_fbsd_nat_target::low_new_fork (ptid_t parent, pid_t child) } #ifdef PT_GETXSTATE_INFO +enum target_xfer_status +x86_fbsd_nat_target::xfer_partial (enum target_object object, + const char *annex, gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) +{ + switch (object) + { + case TARGET_OBJECT_X86_CPUID: + if (readbuf) + { + size_t size = m_cpuid_note_len; + if (offset >= size) + return TARGET_XFER_EOF; + size -= offset; + if (size > len) + size = len; + + if (size == 0) + return TARGET_XFER_EOF; + + memcpy (readbuf, m_cpuid_note.get () + offset, size); + *xfered_len = size; + return TARGET_XFER_OK; + } + return TARGET_XFER_E_IO; + default: + return fbsd_nat_target::xfer_partial (object, annex, readbuf, + writebuf, offset, len, + xfered_len); + } +} + void x86_fbsd_nat_target::probe_xsave_layout (pid_t pid) { @@ -56,6 +91,8 @@ x86_fbsd_nat_target::probe_xsave_layout (pid_t pid) m_xsave_probed = true; + x86_cpuid_note (m_cpuid_note, m_cpuid_note_len); + if (ptrace (PT_GETXSTATE_INFO, pid, (PTRACE_TYPE_ARG3) &m_xsave_info, sizeof (m_xsave_info)) != 0) return; diff --git a/gdb/x86-fbsd-nat.h b/gdb/x86-fbsd-nat.h index 723bb6cf305..71b6ad09916 100644 --- a/gdb/x86-fbsd-nat.h +++ b/gdb/x86-fbsd-nat.h @@ -42,6 +42,13 @@ class x86_fbsd_nat_target : public x86bsd_nat_target x86_xsave_layout fetch_x86_xsave_layout () override { return m_xsave_layout; } + enum target_xfer_status xfer_partial (enum target_object object, + const char *annex, + gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) override; + protected: void probe_xsave_layout (pid_t pid); @@ -49,6 +56,8 @@ class x86_fbsd_nat_target : public x86bsd_nat_target x86_xsave_layout m_xsave_layout; private: + gdb::unique_xmalloc_ptr m_cpuid_note; + size_t m_cpuid_note_len; bool m_xsave_probed; #endif }; -- 2.41.0