public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: John Baldwin <jhb@FreeBSD.org>
To: gdb-patches@sourceware.org
Cc: Willgerodt, Felix <felix.willgerodt@intel.com>,
	George, Jini Susan <JiniSusan.George@amd.com>,
	Simon Marchi <simon.marchi@polymtl.ca>
Subject: [RFC 00/13] Proposal for a new NT_X86_CPUID core dump note
Date: Mon,  9 Oct 2023 11:36:02 -0700	[thread overview]
Message-ID: <20231009183617.24862-1-jhb@FreeBSD.org> (raw)

One of the shortcomings of the previous XSAVE patch series is that it
depends on heuristics based on the total XSAVE register set size and
XCR0 mask to infer layouts of the various register blocks for core
dumps.  This series introduces a new x86-specific core dump note
intended to supplant these heuristics by storing the raw CPUID leaves
describing the XSAVE layout in core dumps.

This series proposes a new core dump note, NT_X86_CPUID (0x205), which
contains an array of structures.  Each structure describes an invidual
CPUID sub-leaf containing both the inputs to CPUID (%eax and %ecx) and
the outputs (%eax, %ebx, %ecx, and %edx) in a format roughly matching
the follow C structure:

struct cpuid_leaf
{
    uint32_t leaf;
    uint32_t subleaf;
    uint32_t eax;
    uint32_t ebx;
    uint32_t ecx;
    uint32_t edx;
};

This format is not XSAVE-specific and implementations could choose to
add additional CPUID leaves to this structure if needed in the future.
Consumers of this note should lookup the value of required leaves and
ignore any unneeded leaves.

An alternate approach might be to write out a more XSAVE-specific note
that is an array containing the offset and size of each XSAVE region.

Note that either approach would enable storing XSAVE notes in the
"compact" format at some point in the future.

This series adds support for reading/writing the note to binutils as
well as suport for parsing and generating the note in GDB.  It also
hooks this into both the FreeBSD and Linux x86 architectures in GDB to
read the XSAVE layout from this note when present, and to write out a
note when generating a core via `gcore'.  I've done some limited
testing on FreeBSD/amd64 and Linux/x86-64, but it could probably use
some more testing on Linux in particular.  (I know Simon has an AMD
machine with a layout not handled by the current heuristics for
example.)

For the gcore side, a new TARGET_OBJECT_X86_CPUID is used to fetch the
current note contents from a native target.  There is still one gap
even with this patch series which is that if you are connected to a
remote target (e.g. gdbserver), we currently do not have a known XSAVE
layout to use when writing out a core via `gcore'.  One option that
would close this gap would be to extend the remote protocol to permit
reading this new object from a debug server.  The remote target could
then implement fetching this object and also make use of this object
to implement the target::fetch_x86_xsave_layout method which would
close that gap.  Another possibility would be to just pick a "known"
XSAVE format that matches one of the heuristics.

The series is available from git@github.com:bsdjhb/gdb.git on the
`nt_x86_cpuid' branch.

I also have an implementation of this core dump note available for
FreeBSD's kernel, though I won't merge it until we've collectively
settled on the format: https://reviews.freebsd.org/D42136

Things I have not done and could use help with:

- Implementation for the Linux kernel

- Coordination with folks from LLDB

John Baldwin (13):
  binutils: Support for the NT_X86_CPUID core dump note
  i387-tdep: Add function to read XSAVE layout from NT_X86_CPUID
  gdb: Use NT_X86_CPUID in x86 FreeBSD architectures to read XSAVE
    layouts
  gdb: Use NT_X86_CPUID in x86 FreeBSD architectures to read XSAVE
    layouts
  nat/x86-cpuid.h: Remove non-x86 fallbacks
  nat/x86-cpuid: Add a function to build the contents of a NT_X86_CPUID
    note
  x86_elf_make_cpuid_note: Helper routine to build NT_X86_CPUID ELF note
  x86-fbsd-nat: Support fetching TARGET_OBJECT_X86_CPUID objects
  fbsd-tdep: Export fbsd_make_corefile_notes
  {amd64,i386}-fbsd-tdep: Include NT_X86_CPUID notes in core dumps from
    gcore
  x86-linux-nat: Support fetching TARGET_OBJECT_X86_CPUID objects
  linux-tdep: Export linux_make_corefile_notes
  {amd64,i386}-linux-tdep: Include NT_X86_CPUID notes in core dumps from
    gcore

 bfd/elf-bfd.h          |   2 +
 bfd/elf.c              |  35 +++++++++++
 binutils/readelf.c     |   2 +
 gdb/amd64-fbsd-tdep.c  |   1 +
 gdb/amd64-linux-tdep.c |   1 +
 gdb/configure.nat      |  13 ++--
 gdb/fbsd-tdep.c        |   5 +-
 gdb/fbsd-tdep.h        |   7 +++
 gdb/i386-fbsd-tdep.c   |  18 +++++-
 gdb/i386-fbsd-tdep.h   |   7 +++
 gdb/i386-linux-tdep.c  |  18 +++++-
 gdb/i386-linux-tdep.h  |   7 +++
 gdb/i387-tdep.c        | 132 +++++++++++++++++++++++++++++++++++++++++
 gdb/i387-tdep.h        |   8 +++
 gdb/linux-tdep.c       |   5 +-
 gdb/linux-tdep.h       |   7 +++
 gdb/nat/x86-cpuid.c    |  91 ++++++++++++++++++++++++++++
 gdb/nat/x86-cpuid.h    |  29 +++------
 gdb/target.h           |   2 +
 gdb/x86-fbsd-nat.c     |  37 ++++++++++++
 gdb/x86-fbsd-nat.h     |   9 +++
 gdb/x86-linux-nat.c    |  37 ++++++++++++
 gdb/x86-linux-nat.h    |   9 +++
 gdb/x86-tdep.c         |  22 +++++++
 gdb/x86-tdep.h         |   9 +++
 include/elf/common.h   |   2 +
 26 files changed, 480 insertions(+), 35 deletions(-)
 create mode 100644 gdb/nat/x86-cpuid.c

-- 
2.41.0


             reply	other threads:[~2023-10-09 18:36 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-09 18:36 John Baldwin [this message]
2023-10-09 18:36 ` [RFC 01/13] binutils: Support for the " John Baldwin
2023-10-16  9:23   ` Lancelot SIX
2023-10-16 23:23     ` John Baldwin
2023-10-09 18:36 ` [RFC 02/13] i387-tdep: Add function to read XSAVE layout from NT_X86_CPUID John Baldwin
2023-10-12  4:27   ` Simon Marchi
2023-10-16 23:52     ` John Baldwin
2023-10-16  9:17   ` Lancelot SIX
2023-10-17  0:04     ` John Baldwin
2023-10-09 18:36 ` [RFC 03/13] gdb: Use NT_X86_CPUID in x86 FreeBSD architectures to read XSAVE layouts John Baldwin
2023-10-09 18:36 ` [RFC 04/13] " John Baldwin
2023-10-12  4:28   ` Simon Marchi
2023-10-17  0:07     ` John Baldwin
2023-10-09 18:36 ` [RFC 05/13] nat/x86-cpuid.h: Remove non-x86 fallbacks John Baldwin
2023-10-12  4:29   ` Simon Marchi
2023-10-09 18:36 ` [RFC 06/13] nat/x86-cpuid: Add a function to build the contents of a NT_X86_CPUID note John Baldwin
2023-10-12  4:41   ` Simon Marchi
2023-10-17  0:22     ` John Baldwin
2023-10-09 18:36 ` [RFC 07/13] x86_elf_make_cpuid_note: Helper routine to build NT_X86_CPUID ELF note John Baldwin
2023-10-09 18:36 ` [RFC 08/13] x86-fbsd-nat: Support fetching TARGET_OBJECT_X86_CPUID objects John Baldwin
2023-10-09 18:36 ` [RFC 09/13] fbsd-tdep: Export fbsd_make_corefile_notes John Baldwin
2023-10-09 18:36 ` [RFC 10/13] {amd64,i386}-fbsd-tdep: Include NT_X86_CPUID notes in core dumps from gcore John Baldwin
2023-10-16  9:31   ` [RFC 10/13] {amd64, i386}-fbsd-tdep: " Lancelot SIX
2023-10-17  0:26     ` John Baldwin
2023-10-09 18:36 ` [RFC 11/13] x86-linux-nat: Support fetching TARGET_OBJECT_X86_CPUID objects John Baldwin
2023-10-09 18:36 ` [RFC 12/13] linux-tdep: Export linux_make_corefile_notes John Baldwin
2023-10-09 18:36 ` [RFC 13/13] {amd64,i386}-linux-tdep: Include NT_X86_CPUID notes in core dumps from gcore John Baldwin
2023-10-10 16:30 ` [RFC 00/13] Proposal for a new NT_X86_CPUID core dump note George, Jini Susan
2023-10-12  4:01 ` Simon Marchi
2023-10-12 14:33 ` Simon Marchi
2023-10-12 17:18   ` John Baldwin
2023-10-13  9:38     ` George, Jini Susan
2023-10-17  0:36       ` John Baldwin
2023-10-26 16:18         ` George, Jini Susan
2023-10-27  2:53           ` John Baldwin
2023-10-27 11:11             ` George, Jini Susan
2023-10-31 16:41               ` John Baldwin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231009183617.24862-1-jhb@FreeBSD.org \
    --to=jhb@freebsd.org \
    --cc=JiniSusan.George@amd.com \
    --cc=felix.willgerodt@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=simon.marchi@polymtl.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).