From: John Baldwin <jhb@FreeBSD.org>
To: Andrew Burgess <aburgess@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [PATCHv2 6/7] gdbserver: update target description creation for x86/linux
Date: Thu, 21 Mar 2024 10:28:41 -0700 [thread overview]
Message-ID: <bb59f4e1-fb2b-4f26-b672-1ef901d7985e@FreeBSD.org> (raw)
In-Reply-To: <87plvqt6jl.fsf@redhat.com>
On 3/19/24 11:34 AM, Andrew Burgess wrote:
> John Baldwin <jhb@FreeBSD.org> writes:
>
>> On 3/5/24 9:00 AM, Andrew Burgess wrote:
>>> This commit is part of a series which aims to share more of the target
>>> description creation between GDB and gdbserver for x86/Linux.
>>>
>>> After some refactoring, the previous commit actually started to share
>>> some code, we added the shared x86_linux_tdesc_for_tid function into
>>> nat/x86-linux-tdesc.c. However, this function still relies on
>>> amd64_linux_read_description and i386_linux_read_description which are
>>> implemented separately for both gdbserver and GDB. Given that at
>>> their core, all these functions to is:
>>>
>>> 1. take an xcr0 value as input,
>>> 2. mask out some feature bits,
>>> 3. look for a cached pre-generated target description and return it
>>> if found,
>>> 4. if no cached target description is found then call either
>>> amd64_create_target_description or
>>> i386_create_target_description to create a new target
>>> description, which is then added to the cache. Return the newly
>>> created target description.
>>>
>>> The inner functions amd64_create_target_description and
>>> i386_create_target_description are already shared between GDB and
>>> gdbserver (in the gdb/arch/ directory), so the only thing that
>>> the *_read_description functions really do is add the caching layer,
>>> and it feels like this really could be shared.
>>>
>>> However, we have a small problem.
>>>
>>> On the GDB side we create target descriptions using a different set of
>>> cpu features than on the gdbserver side! This means that for the
>>> exact same target, we might get a different target description when
>>> using native GDB vs using gdbserver. This surely feels like a
>>> mistake, I would expect to get the same target description on each.
>>>
>>> The table below shows the number of possible different target
>>> descriptions that we can create on the GDB side vs on the gdbserver
>>> side for each target type:
>>>
>>> | GDB | gdbserver
>>> ------|-----|----------
>>> i386 | 64 | 7
>>> amd64 | 32 | 7
>>> x32 | 16 | 7
>>>
>>> So in theory, all I want to do is move the GDB version
>>> of *_read_description into the nat/ directory and have gdbserver use
>>> that, then both GDB and gdbserver would be able to create any of the
>>> possible target descriptions.
>>>
>>> Unfortunately it's a little more complex than that due to the in
>>> process agent (IPA).
>>>
>>> When the IPA is in use, gdbserver sends a target description index to
>>> the IPA, and the IPA uses this to find the correct target description
>>> to use.
>>>
>>> ** START OF AN ASIDE **
>>>
>>> Back in the day I suspect this approach made perfect sense. However
>>> since this commit:
>>>
>>> commit a8806230241d201f808d856eaae4d44088117b0c
>>> Date: Thu Dec 7 17:07:01 2017 +0000
>>>
>>> Initialize target description early in IPA
>>>
>>> I think passing the index is now more trouble than its worth.
>>>
>>> We used to pass the index, and then use that index to lookup which
>>> target description to instantiate and use. However, the above commit
>>> fixed an issue where we can't call malloc() within (certain parts of)
>>> the IPA (apparently), so instead we now pre-compute _every_ possible
>>> target description within the IPA. The index is now only used to
>>> lookup which of the (many) pre-computed target descriptions to use.
>>>
>>> It would (I think) have been easier all around if the IPA just
>>> self-inspected, figured out its own xcr0 value, and used that to
>>> create the one target description that is required. So long as the
>>> xcr0 to target description code is shared (at compile time) with
>>> gdbserver, then we can be sure that the IPA will derive the same
>>> target description as gdbserver, and we would avoid all this index
>>> passing business, which has made this commit so very, very painful.
>>>
>>> ** END OF AN ASIDE **
>>>
>>> Currently then for x86/linux, gdbserver sends a number between 0 and 7
>>> to the IPA, and the IPA uses this to create a target description.
>>>
>>> However, I am proposing that gdbserver should now create one of (up
>>> to) 64 different target descriptions for i386, so this 0 to 7 index
>>> isn't going to be good enough any more (amd64 and x32 have slightly
>>> fewer possible target descriptions, but still more than 8, so the
>>> problem is the same).
>>>
>>> For a while I wondered if I was going to have to try and find some
>>> backward compatible solution for this mess. But after seeing how
>>> lightly the IPA is actually documented, I wonder if it is not the case
>>> that there is a tight coupling between a version of gdbserver and a
>>> version of the IPA? At least I'm hoping so.
>>>
>>> In this commit I have thrown out the old IPA target description index
>>> numbering scheme, and switched to a completely new numbering scheme.
>>> Instead of the index that is passed being arbitrary, the index is
>>> instead calculated from the set of cpu features that are present on
>>> the target. Within the IPA we can then reverse this logic to recreate
>>> the xcr0 value based on the index, and from the xcr0 value we can
>>> create the correct target description.
>>>
>>> With the gdbserver to IPA numbering scheme issue resolved I have then
>>> update the gdbserver versions of amd64_linux_read_description and
>>> i386_linux_read_description so that they create target descriptions
>>> using the same set of cpu features as GDB itself.
>>>
>>> After this gdbserver should now always come up with the same target
>>> description as GDB does on any x86/Linux target.
>>>
>>> This commit does not introduce any new code sharing between GDB and
>>> gdbserver as previous commits in this series does. Instead this
>>> commit is all about bringing GDB and gdbserver into alignment
>>> functionally so that the next commit can merge the GDB and gdbserver
>>> versions of these functions.
>>
>> It does seem like the IPA case should just compute the tdesc it needs
>> if I understand you correctly.
>
> Yes, totally. And it's not like it would even add much code to the IPA,
> I believe it already pulls in all of the target description creation
> code, the only thing that is "saved" is the code that probes the
> hardware to figure out which description we should use.
>
> This whole area seems like it has not aged well :-/
>
>>
>> BTW, on other arches like aarch64 and I believe risc-v, a flat array
>> is not used for the tdesc cache. Now the cache is a std::unordered_map<>
>> and there is a 'struct foo_features' that has an operator== and
>> std::hash<> specialization. It really would be nice if x86 was the same,
>> but that would require abandoning a notion of a portable "index" shared
>> between gdbserver and the IPA.
>
> Indeed. I did the worked on the feature/hash/lookup for RISC-V so I had
> this in mind when looking at this code. Originally I had planned to
> switch to a map style cache, but when I found the IPA/index passing code
> I lost my nerve and tried to find a solution that was inline with what
> we had currently.
>
> I don't really know about the IPA enough to make claims about what
> is/isn't a reasonable change in this area.
I have zero knowledge about the IPA myself. OTOH, if no one else steps
up with a strong opinion here, I would suggest that you go ahead and
fix the IPA as you described so it is more self-contained and then we can
use a saner approach for dealing with tdesc caching for x86.
--
John Baldwin
next prev parent reply other threads:[~2024-03-21 17:29 UTC|newest]
Thread overview: 116+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-01 15:28 [PATCH 0/7] x86/Linux Target Description Changes Andrew Burgess
2024-02-01 15:28 ` [PATCH 1/7] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-02-01 15:28 ` [PATCH 2/7] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-02-01 15:28 ` [PATCH 3/7] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-02-01 15:28 ` [PATCH 4/7] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-02-01 15:28 ` [PATCH 5/7] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-02-01 15:28 ` [PATCH 6/7] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-02-01 15:28 ` [PATCH 7/7] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-03-05 17:00 ` [PATCHv2 0/7] x86/Linux Target Description Changes Andrew Burgess
2024-03-05 17:00 ` [PATCHv2 1/7] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-03-05 17:00 ` [PATCHv2 2/7] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-03-05 17:00 ` [PATCHv2 3/7] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-03-05 17:00 ` [PATCHv2 4/7] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-03-05 17:00 ` [PATCHv2 5/7] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-03-05 17:00 ` [PATCHv2 6/7] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-03-19 16:01 ` John Baldwin
2024-03-19 18:34 ` Andrew Burgess
2024-03-21 17:28 ` John Baldwin [this message]
2024-03-26 10:01 ` Luis Machado
2024-03-26 15:31 ` Tom Tromey
2024-03-05 17:00 ` [PATCHv2 7/7] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-03-19 16:05 ` [PATCHv2 0/7] x86/Linux Target Description Changes John Baldwin
2024-03-23 16:35 ` [PATCHv3 0/8] " Andrew Burgess
2024-03-23 16:35 ` [PATCHv3 1/8] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-03-23 16:35 ` [PATCHv3 2/8] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-03-23 16:35 ` [PATCHv3 3/8] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-03-23 16:35 ` [PATCHv3 4/8] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-03-23 16:35 ` [PATCHv3 5/8] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-03-23 16:35 ` [PATCHv3 6/8] gdb/arch: assert that X86_XSTATE_MPX is not set for x32 Andrew Burgess
2024-03-23 16:35 ` [PATCHv3 7/8] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-03-23 16:35 ` [PATCHv3 8/8] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-03-26 12:17 ` Andrew Burgess
2024-03-25 17:20 ` [PATCHv3 0/8] x86/Linux Target Description Changes Andrew Burgess
2024-03-25 18:26 ` Simon Marchi
2024-03-26 12:15 ` Andrew Burgess
2024-03-26 13:51 ` H.J. Lu
2024-03-26 14:16 ` H.J. Lu
2024-03-26 16:36 ` Andrew Burgess
2024-03-26 19:03 ` Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 00/10] " Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 01/10] gdbserver/ipa/x86: remove unneeded declarations Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 02/10] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 03/10] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 04/10] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 05/10] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 06/10] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 07/10] gdb/arch: assert that X86_XSTATE_MPX is not set for x32 Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 08/10] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 09/10] gdb: move xcr0 == 0 check into i386_linux_core_read_description Andrew Burgess
2024-04-05 12:33 ` [PATCHv4 10/10] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-04-09 18:37 ` [PATCHv4 00/10] x86/Linux Target Description Changes John Baldwin
2024-04-25 13:35 ` Willgerodt, Felix
2024-04-25 16:06 ` Andrew Burgess
2024-04-26 15:01 ` [PATCHv5 00/11] " Andrew Burgess
2024-04-26 15:01 ` [PATCHv5 01/11] gdbserver/ipa/x86: remove unneeded declarations Andrew Burgess
2024-04-29 14:34 ` Willgerodt, Felix
2024-05-07 15:05 ` Andrew Burgess
2024-05-08 7:49 ` Willgerodt, Felix
2024-04-26 15:01 ` [PATCHv5 02/11] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-04-29 14:34 ` Willgerodt, Felix
2024-05-07 15:28 ` Andrew Burgess
2024-04-26 15:01 ` [PATCHv5 03/11] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-04-29 14:34 ` Willgerodt, Felix
2024-04-26 15:01 ` [PATCHv5 04/11] gdb/x86: move have_ptrace_getfpxregs global " Andrew Burgess
2024-04-29 14:34 ` Willgerodt, Felix
2024-04-26 15:01 ` [PATCHv5 05/11] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-04-29 14:34 ` Willgerodt, Felix
2024-05-07 11:55 ` Luis Machado
2024-05-07 15:43 ` Andrew Burgess
2024-05-07 15:56 ` Luis Machado
2024-05-08 7:49 ` Willgerodt, Felix
2024-05-08 13:18 ` Andrew Burgess
2024-04-26 15:01 ` [PATCHv5 06/11] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-04-29 14:34 ` Willgerodt, Felix
2024-04-26 15:01 ` [PATCHv5 07/11] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-04-29 14:34 ` Willgerodt, Felix
2024-05-07 11:40 ` Andrew Burgess
2024-04-26 15:01 ` [PATCHv5 08/11] gdb/arch: assert that X86_XSTATE_MPX is not set for x32 Andrew Burgess
2024-04-29 14:34 ` Willgerodt, Felix
2024-05-07 16:08 ` Andrew Burgess
2024-04-26 15:01 ` [PATCHv5 09/11] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-04-29 14:35 ` Willgerodt, Felix
2024-05-07 14:24 ` Andrew Burgess
2024-05-08 7:47 ` Willgerodt, Felix
2024-05-08 13:28 ` Andrew Burgess
2024-04-26 15:01 ` [PATCHv5 10/11] gdb: move xcr0 == 0 check into i386_linux_core_read_description Andrew Burgess
2024-04-29 14:35 ` Willgerodt, Felix
2024-04-26 15:01 ` [PATCHv5 11/11] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-04-29 14:35 ` Willgerodt, Felix
2024-05-07 14:50 ` Andrew Burgess
2024-05-08 7:49 ` Willgerodt, Felix
2024-05-08 16:09 ` Andrew Burgess
2024-05-08 16:46 ` [PATCHv6 0/9] x86/Linux Target Description Changes Andrew Burgess
2024-05-08 16:46 ` [PATCHv6 1/9] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-05-08 16:46 ` [PATCHv6 2/9] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-05-08 16:46 ` [PATCHv6 3/9] gdb/x86: move have_ptrace_getfpxregs global into gdb/nat directory Andrew Burgess
2024-05-08 22:52 ` John Baldwin
2024-05-08 16:46 ` [PATCHv6 4/9] gdb/x86: move have_ptrace_getregset " Andrew Burgess
2024-05-08 22:53 ` John Baldwin
2024-05-08 16:46 ` [PATCHv6 5/9] gdb/x86: move reading of cs and ds state " Andrew Burgess
2024-05-08 16:46 ` [PATCHv6 6/9] gdb: move xcr0 == 0 check into i386_linux_core_read_description Andrew Burgess
2024-05-08 22:54 ` John Baldwin
2024-05-08 16:46 ` [PATCHv6 7/9] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-05-08 22:58 ` John Baldwin
2024-05-08 16:46 ` [PATCHv6 8/9] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-05-08 16:46 ` [PATCHv6 9/9] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 0/9] x86/Linux Target Description Changes Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 1/9] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 2/9] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 3/9] gdb/x86: move have_ptrace_getfpxregs global into gdb/nat directory Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 4/9] gdb: move have_ptrace_getregset declaration " Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 5/9] gdb/x86: move reading of cs and ds state " Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 6/9] gdb: move xcr0 == 0 check into i386_linux_core_read_description Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 7/9] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 8/9] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-05-11 10:08 ` [PATCHv7 9/9] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
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=bb59f4e1-fb2b-4f26-b672-1ef901d7985e@FreeBSD.org \
--to=jhb@freebsd.org \
--cc=aburgess@redhat.com \
--cc=gdb-patches@sourceware.org \
/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