mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
Fixes BZ#374719 Patch by: klemens <ka7@la-evento.com> git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16336
91 lines
4.5 KiB
Plaintext
91 lines
4.5 KiB
Plaintext
(for general information
|
|
about gdbserver, read coregrind/m_gdbserver/README_DEVELOPERS
|
|
about gdbserver tests, read gdbserver_tests/README_DEVELOPERS).
|
|
|
|
ARM thumb and gdbserver
|
|
-----------------------
|
|
|
|
When executing thumb code, the ARM cpu program counter value is
|
|
not equal to the address of the instruction being executed: the fact
|
|
that the instruction being executed is a thumb instruction is
|
|
encoded in the bit0 of the program counter.
|
|
For more information about this, see VEX/pub/libvex_guest_arm.h.
|
|
|
|
This additional bit set in the ARM guest_IP caused some difficulties
|
|
at several places in the gdbserver code.
|
|
|
|
|
|
* breakpoint handling:
|
|
gdbsrv code detects that a breakpoint is reached
|
|
by comparing the current guest_IP with the breakpoint addresses given
|
|
by gdb. As gdb is giving breakpoints without the thumb bit set,
|
|
the gdbsrv code has to ensure breakpoint comparisons are done without
|
|
the thumb bit.
|
|
=> the breakpoints are stored in the gdbserver breakpoints hash table
|
|
without the thumb bit.
|
|
=> when the guest_IP is compared with these breakpoints, the thumb bit
|
|
must be masked.
|
|
|
|
* Thumb bit in IstMark:
|
|
When instrumenting a SB for gdbserver, a PUT of the current instruction
|
|
address is done to the IP, to ensure that the gdbserver helper call
|
|
sees the correct IP. This PUT must be done with the thumb bit set,
|
|
as this value will be given back to gdb. gdb uses the thumb bit a.o.
|
|
to guess the next program counter after this instruction.
|
|
Such a guess is needed for gdb commands such as next/step/...
|
|
If the thumb bit is not properly set, these commands are not working.
|
|
As gdbserver instrumentation code uses the IstMark to find the IP
|
|
of the instruction being instrumented, the thumb bit must be accessible
|
|
or found. Multiple approaches were tried (see below) before the
|
|
current one (which is to have a field Delta in IstMark which encodes
|
|
the thumb bit).
|
|
|
|
* Thumb bit in extents
|
|
When a breakpoint is placed at an instruction, the translation for this
|
|
instruction must be discarded to have the SB re-instrumented for gdbserver.
|
|
At least at this moment (r2155/r11786), the extents for ARM/thumb blocks
|
|
contains addresses with the thumb bit set. It is not clear that this is
|
|
a good thing: extents should preferably reference the real address range of
|
|
instructions, not an address range which can be "off by one" due to the
|
|
fact that the instruction is a thumb instruction.
|
|
|
|
Due to this "off by one", gdbserver is discarding a range of two bytes
|
|
to ensure it is not sensitive to the presence (or not) of the thumb
|
|
bit in the range being discarded.
|
|
|
|
* Handling of monitor vg.translate
|
|
When the translation is requested, the thumb bit must be properly set
|
|
in the address, as this bit is used by the Valgrind translator
|
|
to decide to decode in ARM or in thumb mode.
|
|
The monitor command guesses the thumb bit based on the debug information.
|
|
|
|
* gdb 7.0 is buggy with thumb code
|
|
The logic of gdb to guess the next PC in thumb code is not working
|
|
properly in version gdb 7.0. Several gdbserver tests are disabled
|
|
on ARM if gdb version is < 7.1.
|
|
|
|
* The (historical) list of difficulties encountered is the following:
|
|
- initially, IstMark contained the thumb bit in the addr.
|
|
This caused the breakpoints to not work (comparison between
|
|
gdb address and gdbserver failed).
|
|
(see breakpoint handling above).
|
|
- A change was done to mask the thumb bit in the IstMark
|
|
This made breakpoints work, but then gdb next/step/... was then failing
|
|
(see Thumb bit in IstMark above).
|
|
- So, it was needed to have the thumb bit when instrumenting an
|
|
IstMark. 3 solutions were looked at:
|
|
* use the debug info : this solution was discarded as often debug
|
|
info does not allow a 100% correct solution. debug info is acceptable
|
|
for vg.translate (which is only for internal valgrind debugging),
|
|
but is better not used for 'end user functionality'.
|
|
* Derive the thumb bit for a SB from the extent address.
|
|
This was discarded as this implies that an SB cannot mix thumb
|
|
and ARM code. This implied to disable chasing at transition between
|
|
ARM/thumb code, which potentially decreases performance.
|
|
Also, it would oblige to keep the thumb bit in the extents, which
|
|
seems not nice.
|
|
* the final solution implemented was to add a Delta fied in IstMark.
|
|
This Delta field gives the delta to add to the IstMark addr field
|
|
to obtain the guest_IP : for thumb code, this field is 1,
|
|
and is 0 for ARM code and for all other architectures.
|