summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorsewardj <sewardj@a5019735-40e9-0310-863c-91ae7b9d1cf9>2011-05-31 07:14:42 +0000
committersewardj <sewardj@a5019735-40e9-0310-863c-91ae7b9d1cf9>2011-05-31 07:14:42 +0000
commitde92fef91f52bdd1664b09f1bbb787ee3f9363c9 (patch)
tree821d1ff451a3072148dc1d3c5facb69d104a0cd1 /docs
parent762918075005524a8398870b4bae71787f1a4007 (diff)
Add file missing from r11791 due to insufficient coffee.
#214909 c 101. (Philippe Waroquiers, philippe.waroquiers@skynet.be) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11792 a5019735-40e9-0310-863c-91ae7b9d1cf9
Diffstat (limited to 'docs')
-rw-r--r--docs/Makefile.am1
-rw-r--r--docs/internals/arm_thumb_notes_gdbserver.txt90
2 files changed, 91 insertions, 0 deletions
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 62dd4798..43641d3a 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -25,6 +25,7 @@ EXTRA_DIST = \
internals/3_3_BUGSTATUS.txt \
internals/3_4_BUGSTATUS.txt \
internals/3_5_BUGSTATUS.txt \
+ internals/arm_thumb_notes_gdbserver.txt \
internals/BIG_APP_NOTES.txt \
internals/Darwin-notes.txt \
internals/directory-structure.txt \
diff --git a/docs/internals/arm_thumb_notes_gdbserver.txt b/docs/internals/arm_thumb_notes_gdbserver.txt
new file mode 100644
index 00000000..e8d308e8
--- /dev/null
+++ b/docs/internals/arm_thumb_notes_gdbserver.txt
@@ -0,0 +1,90 @@
+(for general information
+ about gdbserver, read coregrind/m_gdbserver/README_DEVELOPPERS
+ about gdbserver tests, read gdbserver_tests/README_DEVELOPPERS).
+
+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 preferrably reference the real address range of
+ instructions, not an adress 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 functionnality'.
+ * 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.