public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: John Baldwin <jhb@FreeBSD.org>
To: Simon Marchi <simark@simark.ca>, gdb-patches@sourceware.org
Subject: Re: [PATCH v4 06/13] gdb: Support XSAVE layouts for the current host in the FreeBSD x86 targets.
Date: Tue, 11 Apr 2023 14:37:14 -0700	[thread overview]
Message-ID: <a686adf6-cb27-e503-1c8d-e0b95ec4cda6@FreeBSD.org> (raw)
In-Reply-To: <a0359b62-aaba-f1d5-3d81-532ee6712d13@simark.ca>

On 4/11/23 9:46 AM, Simon Marchi wrote:
> On 4/11/23 12:19, John Baldwin wrote:
>> On 4/10/23 7:23 PM, Simon Marchi wrote:
>>> On 4/10/23 17:27, John Baldwin wrote:
>>>> On 4/6/23 1:18 PM, Simon Marchi wrote:
>>>>>> @@ -43,3 +46,51 @@ x86_fbsd_nat_target::low_new_fork (ptid_t parent, pid_t child)
>>>>>>       child_state = x86_debug_reg_state (child);
>>>>>>       *child_state = *parent_state;
>>>>>>     }
>>>>>> +
>>>>>> +#ifdef PT_GETXSTATE_INFO
>>>>>> +/* Implement the "xfer_partial" target_ops method.  */
>>>>>> +
>>>>>> +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_XSAVE_LAYOUT:
>>>>>> +      if (xsave_layout.sizeof_xsave == 0)
>>>>>> +    return TARGET_XFER_E_IO;
>>>>>
>>>>> I'm wondering why you don't call probe_xsave_layout before using
>>>>> xsave_layout here.  I guess because you assume that the child class will
>>>>> have called probe_xsave_layout at some point before?
>>>>
>>>> Yes.  Note that the default value of xsave_layout (all zeroes) will result
>>>> in this failing to read the object if it hasn't been called (rather than
>>>> undefined behavior).
>>>>
>>>>> To make that more robust, could we access xsave_layout through a method
>>>>> like:
>>>>>
>>>>>      const x86_xsave_layout &xsave_layout ();
>>>>>
>>>>> which would take care of the caching?  Callers wouldn't have to worry
>>>>> about calling probe_xsave_layout before.  There could be another method
>>>>> to access xsave_info.
>>>>
>>>> Well, part of the trick here is that probe_xsave_layout takes a pid
>>>> argument that it passes to ptrace () to fetch the layout, but at the
>>>> point of xfer_partial I don't necessarily have a pid.  It's true that
>>>> the only callers (the target ::read_description methods) all use
>>>> inferior_ptid's pid, so I could perhaps use inferior_ptid directly,
>>>> but that seems somewhat dubious.
>>>
>>> Using inferior_ptid would probably be fine... I think?  It's how targets
>>> know which thread's memory to read from or write to, for the
>>> TARGET_OBJECT_MEMORY object.  The question is, will all calls to
>>> xfer_partial with the TARGET_OBJECT_X86_XSAVE_LAYOUT object be done with
>>> inferior_ptid set to a stopped thread that you can used to do the ptrace
>>> query?
>>>
>>> Ok, that made me think about an unlikely (but still possible
>>> scenario) where the read_description target method can be called with
>>> inferior_ptid == null_ptid:
>>>
>>> (gdb) target native  # push the native target
>>> (gdb) unset tdesc filename
>>>
>>> I think the code as it is in this patch would try to call ptrace with
>>> pid 0.
>>>
>>> The approach of fetching the xsave layout using ptrace has this
>>> particularity that you need a stopped thread to access it.  I'm
>>> wondering, is there an advantage in fetching the xsave layout using
>>> ptrace instead of the cpuid method?  The latter has the advantage of
>>> working at any time.
>>
>> Well, you need the value of xcr0 as well as the total size, though it
>> is possible to execute XGETBV in userspace I believe.  I had wanted to
>> ensure we were using the same mask ptrace is going to export vs assuming
>> that the mask of the running GDB process will match the mask of all
>> target processes.  I guess in practice we are assuming that though via
>> the caching.
> 
> Who sets xcr0, the kernel or the userspace?  In theory could we have
> xcr0 values that differ per process?  Could the xcr0 value for a process
> change over time?  To be clear, I'm just asking to understand better, I
> don't suggest to support these cases if they don't happen in reality.

Only the kernel sets it because the kernel is the one that allocates
space for the XSAVE area for each thread to save/restore state during
context switches.  Also, the relevant instruction (XSETBV) is kernel
only.  Possibly a kernel could choose to alter it between processes, but
if that were the case that would be an argument to not do any caching
and always check it in read_description() for the relevant inferior.
Neither Linux nor FreeBSD do this though, both determine a value to use
at boot and then never change it.  (Well, not in a way relevant to GDB,
FreeBSD can choose to use a smaller mask for guest VMs while the guest
is running, but that value of XCR0 is never visible to GDB, and even if
GDB is debugging the userspace portion of the hypervisor it always sees
the "host" values of XSAVE registers, not guest values.)

>> Note that the read_description methods for both Linux and
>> FreeBSD already use ptrace for other things.  Both use ptrace to decide
>> if the inferior is using a 64-bit vs 32-bit tdesc.  For 32-bit both use
>> ptrace to determine if there is support for a custom ptrace op to fetch
>> SSE/XMM register state (PTRACE_GETFPXREGS on Linux, PT_GETXMMREGS on
>> FreeBSD), so this case is already quite broken.
> 
> Heh, you're right, I ran those commands on x86 Linux and didn't even
> notice the error message!
> 
>      (gdb) target native
>      Done.  Use the "run" command to start a process.
>      (gdb) unset tdesc filename
>      Couldn't get CS register: No such process.
> 
> So yeah, perhaps make sure this corner case is relatively correctly
> handled.  That probably means skipping over the ptrace check if
> inferior_ptid is null_ptid, and make sure you don't cache that value (so
> we actually probe it next time around).

I think the right answer for theses cases is that the read_description
methods need to just return a specific base-line description if
inferior_ptid == null_ptid before doing any of the ptrace, etc. checks.
Probably for 64-bit it means a simple 64-bit tdesc with SSE for example.

-- 
John Baldwin


  reply	other threads:[~2023-04-11 21:37 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-18  1:08 [PATCH v4 00/13] Handle variable XSAVE layouts John Baldwin
2023-03-18  1:08 ` [PATCH v4 01/13] x86: Add an x86_xsave_layout structure to handle " John Baldwin
2023-03-28 11:35   ` George, Jini Susan
2023-04-10 19:28     ` John Baldwin
2023-04-06 19:09   ` Simon Marchi
2023-04-10 20:03     ` John Baldwin
2023-04-11  1:19       ` Simon Marchi
2023-04-11 14:23     ` Pedro Alves
2023-04-11 16:02       ` John Baldwin
2023-03-18  1:08 ` [PATCH v4 02/13] core: Support fetching TARGET_OBJECT_X86_XSAVE_LAYOUT from architectures John Baldwin
2023-04-06 19:28   ` Simon Marchi
2023-04-10 20:42     ` John Baldwin
2023-04-11  1:49       ` Simon Marchi
2023-04-11 16:06         ` John Baldwin
2023-04-11 16:21           ` Simon Marchi
2023-04-11 23:59             ` John Baldwin
2023-03-18  1:08 ` [PATCH v4 03/13] nat/x86-cpuid.h: Add x86_cpuid_count wrapper around __get_cpuid_count John Baldwin
2023-04-06 19:33   ` Simon Marchi
2023-04-10 20:49     ` John Baldwin
2023-04-11  1:49       ` Simon Marchi
2023-03-18  1:08 ` [PATCH v4 04/13] x86 nat: Add helper functions to save the XSAVE layout for the host John Baldwin
2023-04-06 19:40   ` Simon Marchi
2023-04-10 21:00     ` John Baldwin
2023-04-11  1:51       ` Simon Marchi
2023-03-18  1:08 ` [PATCH v4 05/13] gdb: Update x86 FreeBSD architectures to support XSAVE layouts John Baldwin
2023-04-06 19:54   ` Simon Marchi
2023-04-10 21:02     ` John Baldwin
2023-04-11  1:55       ` Simon Marchi
2023-03-18  1:08 ` [PATCH v4 06/13] gdb: Support XSAVE layouts for the current host in the FreeBSD x86 targets John Baldwin
2023-04-06 20:18   ` Simon Marchi
2023-04-10 21:27     ` John Baldwin
2023-04-11  2:23       ` Simon Marchi
2023-04-11 16:19         ` John Baldwin
2023-04-11 16:46           ` Simon Marchi
2023-04-11 21:37             ` John Baldwin [this message]
2023-04-11 22:35               ` John Baldwin
2023-04-12 14:35                 ` Simon Marchi
2023-03-18  1:08 ` [PATCH v4 07/13] gdb: Update x86 Linux architectures to support XSAVE layouts John Baldwin
2023-04-07  1:43   ` Simon Marchi
2023-04-10 21:29     ` John Baldwin
2023-03-18  1:09 ` [PATCH v4 08/13] gdb: Support XSAVE layouts for the current host in the Linux x86 targets John Baldwin
2023-04-07  1:54   ` Simon Marchi
2023-03-18  1:09 ` [PATCH v4 09/13] gdb: Use x86_xstate_layout to parse the XSAVE extended state area John Baldwin
2023-04-07  2:13   ` Simon Marchi
2023-04-10 21:40     ` John Baldwin
2023-03-18  1:09 ` [PATCH v4 10/13] gdbserver: Add a function to set the XSAVE mask and size John Baldwin
2023-04-12 15:08   ` Simon Marchi
2023-04-27 17:24     ` John Baldwin
2023-03-18  1:09 ` [PATCH v4 11/13] gdbserver: Refactor the legacy region within the xsave struct John Baldwin
2023-04-12 18:34   ` Simon Marchi
2023-04-27 19:51     ` John Baldwin
2023-03-18  1:09 ` [PATCH v4 12/13] gdbserver: Read offsets of the XSAVE extended region via CPUID John Baldwin
2023-04-11 14:46   ` Pedro Alves
2023-04-11 16:25     ` John Baldwin
2023-04-12 19:11   ` Simon Marchi
2023-04-12 21:07     ` John Baldwin
2023-04-13 15:07       ` Simon Marchi
2023-03-18  1:09 ` [PATCH v4 13/13] x86: Remove X86_XSTATE_SIZE and related constants 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=a686adf6-cb27-e503-1c8d-e0b95ec4cda6@FreeBSD.org \
    --to=jhb@freebsd.org \
    --cc=gdb-patches@sourceware.org \
    --cc=simark@simark.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).