From: Yao Qi <qiyaoltc@gmail.com>
To: Bhushan Attarde <bhushan.attarde@imgtec.com>
Cc: "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>,
Maciej.Rozycki@imgtec.com, Matthew.Fortune@imgtec.com,
James.Hogan@imgtec.com, Andrew.Bennett@imgtec.com,
Jaydeep.Patil@imgtec.com
Subject: Re: [PATCH 01/24] MIPS: Handle run-time reconfigurable FPR size
Date: Tue, 08 Nov 2016 19:46:00 -0000 [thread overview]
Message-ID: <CAH=s-POALmism689z+D2R63=WvYkkT7mdwiEpzWuo2PAmQtt5g@mail.gmail.com> (raw)
In-Reply-To: <1467038991-6600-1-git-send-email-bhushan.attarde@imgtec.com>
Hi Bhushan,
On Mon, Jun 27, 2016 at 3:49 PM, Bhushan Attarde
<bhushan.attarde@imgtec.com> wrote:
> Many MIPS architecture processors can reconfigure the size of their
> floating-point registers at the run time. The file comprising 32
> registers can be either 32-bit or 64-bit wide depending on whether CP0
> Status register's bit FR is zero or one, respectively. Fortunately access
> to Status is available on all targets.
>
> Here's a change to handle this property. It requires the generic register
> access code to raise the target backend's attention whenever a new
> register set has been retrieved so that it can examine the state of
> CP0.Status.FR and act accordingly. I have added this hook to
> get_thread_regcache, the backend has then an opportunity to switch gdbarch
> as necessary and let the caller know if it did so. If that indeed
> happened, then the register cache originally retrieved is then discarded
> and another one obtained using the newly-selected gdbarch. This new
> register cache is not revalidated.
>
>
> This is implemented by retaining the raw register size for the FPRs at its
> native size (64-bits; this is required for remote packet offsets to work
> out correctly) and then truncating the cooked register size or not as
> required. I have skipped `maintenance print registers' dumps here for
> brevity, the types flip between "double" and "float" as expected.
>
If I understand you correctly, 64-bits are still transferred in remote protocol
if FPRs are 32-bit.
> This change supports bare-iron, Linux and IRIX targets. For Linux and
> IRIX the width of the floating-point registers is set by the ABI of the
> program being run by the OS kernel and the kernel is responsible for
> setting CP0.Status.FR correctly; the image of Status accessible via
> ptrace(2) is read-only. Therefore the respective backends mark the width
> as fixed and cause the run-time check to be skipped for efficiency. I
> have verified that the Linux target does that correctly; the change for
> IRIX is the same and is expected to be all right, but I have no access to
> such a system (I will appreciate anyone verifying that).
>
> The change currently supports 64-bit processors only as GDB has no way to
> access upper halves of floating-point registers on 32-bit processors that
> have a 64-bit FPU (i.e. MIPS32r2 and newer processors); this is mentioned
> in the explanatory notes included with the change itself.
>
> The change also supports both XML and non-XML targets, but currently
> bare-iron targets for which this update has any significant meaning do not
> really support XML. Any XML target is supposed to always provide an FPU
> description that matches the current setting of CP0.Status.FR, the new
> code verifies this is always the case and rejects the description as
> invalid otherwise.
How do I understand "Any XML target is supposed to always provide
an FPU description that matches the current setting of CP0.Status.FR"?
I don't see how it is done in current GDB/GDBserver.
"reconfigure FPRs" is a target description change to me, instead of a
regcache change. I'd like GDB can deal with "target description of
process is changed in runtime" in general, because this requirement
exists in other places as well,
- x86 kernel booting, the arch is 16-bit at the beginning, and switch to
32-bit or 64-bit later,
https://sourceware.org/ml/gdb/2016-11/msg00003.html
- ARM SVE vector registers length can be changed,
There are two different ways to support handling target description
change in general. Other thoughts are welcome too.
1)
- Implement target hook to_thread_architecture in ARCH-linux-nat.c,
in which we can use ptrace to read the register A which indicates
the target description is changed or not. In MIPS, register A is
CP0.Status. Create target info and return the right gdbarch.
[In MIPS, we have one gdbarch for 32-bit FPR and one gdbarch for
64-bit FPR]
- Add register A to expedited registers, which is included in the stop
reply from GDBserver.
- Add new gdbarch method target_description_changed_p, and its
parameter is a vector of expedited registers got in
remote.c:process_stop_reply. In default, it returns false. In
MIPS, we can tell whether target description is changed by the
value of and current gdbarch.
- In remote.c:process_stop_reply, if
gdbarch_target_description_changed_p returns true, invalidate all
regcaches, request target description from gdbserver again, and get
the updated target description.
2)
- Add enum TARGET_WAITKIND_ARCH_CHANGED,
- In ARCH-linux-nat.c, interpret/override linux_nat_wait. If
linux_nat_wait returns, and there is a real event of stop, call
ptrace to get the register A value, if it is different from what we
remember in current gdbarch, mark the event pending and return
TARGET_WAITKIND_ARCH_CHANGED,
- In remote, add a new stop reply, T00arch, for example,
https://sourceware.org/gdb/onlinedocs/gdb/Stop-Reply-Packets.html
If remote.c:process_stop_reply sees T00arch, return
TARGET_WAITKIND_ARCH_CHANGED.
- In gdb core, if TARGET_WAITKIND_ARCH_CHANGED is reported by
target_wait, call target_find_description, to update target
description.
- In gdbserver, add target method target_stopped_by_changed_arch,
and use it in remote-utils.c:prepare_resume_reply. Get register A
value by ptrace too, and return true if it is different from the
knowledge in process_info.tdesc.
--
Yao (齐尧)
next prev parent reply other threads:[~2016-11-08 19:46 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-27 14:50 Bhushan Attarde
2016-06-27 14:50 ` [PATCH 03/24] regcache: handle invalidated regcache Bhushan Attarde
2016-10-21 22:42 ` Maciej W. Rozycki
2016-06-27 14:50 ` [PATCH 10/24] MIPS: override fscr/fir types and print control registers specially Bhushan Attarde
2016-06-27 14:50 ` [PATCH 08/24] MIPS: Convert FP mode to enum and put fp registers into fp reggroup Bhushan Attarde
2016-06-27 14:50 ` [PATCH 11/24] MIPS: Add support for hybrid fp32/fp64 mode Bhushan Attarde
2016-06-27 14:50 ` [PATCH 06/24] mips-linux-nat: pick fp64 target description when appropriate Bhushan Attarde
2016-06-27 14:51 ` [PATCH 21/24] MIPSR6 support for GDB Bhushan Attarde
2016-07-29 21:10 ` Maciej W. Rozycki
2016-06-27 14:51 ` [PATCH 23/24] MIPS R6 opcode table shuffle for LDC2/SDC2 Bhushan Attarde
2016-06-27 14:51 ` [PATCH 02/24] Add MIPS32 FPU64 GDB target descriptions Bhushan Attarde
2016-10-12 12:42 ` Maciej W. Rozycki
2016-10-12 13:58 ` James Hogan
2016-10-12 16:30 ` Maciej W. Rozycki
2016-10-12 18:05 ` James Hogan
2016-10-12 22:04 ` Maciej W. Rozycki
2016-10-13 10:09 ` Matthew Fortune
2016-10-21 19:17 ` Maciej W. Rozycki
2016-10-21 19:24 ` Maciej W. Rozycki
2016-06-27 14:51 ` [PATCH 04/24] Add MIPS Config5 register related support Bhushan Attarde
2016-06-27 14:51 ` [PATCH 18/24] mips-linux-nat: get msa registers Bhushan Attarde
2016-06-27 14:51 ` [PATCH 13/24] Add MIPS MSA GDB target descriptions Bhushan Attarde
2016-06-27 14:51 ` [PATCH 07/24] MIPS: Make Linux restart register more dynamic Bhushan Attarde
2016-06-27 14:51 ` [PATCH 09/24] MIPS: Enhance cooked FP format Bhushan Attarde
2016-06-27 14:51 ` [PATCH 19/24] Add MIPS MSA vector branch instruction support Bhushan Attarde
2016-06-27 14:51 ` [PATCH 22/24] Support all new ABIs when detecting if an FPU is present Bhushan Attarde
2016-06-27 14:51 ` [PATCH 20/24] Drop FP and MSA control registers from default info registers Bhushan Attarde
2016-06-27 14:51 ` [PATCH 14/24] Implement core MSA stuff Bhushan Attarde
2016-06-27 14:51 ` [PATCH 12/24] o32 sigframe unwinding with FR1 Bhushan Attarde
2016-06-27 14:51 ` [PATCH 24/24] MIPS R6 forbidden slot support Bhushan Attarde
2016-06-27 14:51 ` [PATCH 05/24] MIPS: Add config5 to MIPS GDB target descriptions Bhushan Attarde
2016-07-25 14:03 ` [PATCH 01/24] MIPS: Handle run-time reconfigurable FPR size Maciej W. Rozycki
2016-10-18 17:37 ` Maciej W. Rozycki
2016-11-08 19:46 ` Yao Qi [this message]
2016-11-10 12:43 ` Maciej W. Rozycki
2016-11-11 12:29 ` Yao Qi
2016-12-02 2:31 ` Maciej W. Rozycki
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='CAH=s-POALmism689z+D2R63=WvYkkT7mdwiEpzWuo2PAmQtt5g@mail.gmail.com' \
--to=qiyaoltc@gmail.com \
--cc=Andrew.Bennett@imgtec.com \
--cc=James.Hogan@imgtec.com \
--cc=Jaydeep.Patil@imgtec.com \
--cc=Maciej.Rozycki@imgtec.com \
--cc=Matthew.Fortune@imgtec.com \
--cc=bhushan.attarde@imgtec.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