diff options
author | Walfred Tedeschi <walfred.tedeschi@intel.com> | 2016-02-18 17:24:59 +0100 |
---|---|---|
committer | Walfred Tedeschi <walfred.tedeschi@intel.com> | 2016-02-18 17:25:49 +0100 |
commit | 012b3a217a60cc74b802b059029c72a25d77808c (patch) | |
tree | 63f0e9fb65406b6de748f61eb83a158bab54a021 /gdb/doc | |
parent | 5f034a78b986d30a90030b2409c61a8660b9b48c (diff) | |
download | gdb-012b3a217a60cc74b802b059029c72a25d77808c.zip gdb-012b3a217a60cc74b802b059029c72a25d77808c.tar.gz gdb-012b3a217a60cc74b802b059029c72a25d77808c.tar.bz2 |
Intel MPX bound violation handling
With Intel Memory Protection Extensions it was introduced the concept of
boundary violation. A boundary violations is presented to the inferior as
a segmentation fault having SIGCODE 3. This patch adds a
handler for a boundary violation extending the information displayed
when a bound violation is presented to the inferior. In the stop mode
case the debugger will also display the kind of violation: "upper" or
"lower", bounds and the address accessed.
On no stop mode the information will still remain unchanged. Additional
information about bound violations are not meaningful in that case user
does not know the line in which violation occurred as well.
When the segmentation fault handler is stop mode the out puts will be
changed as exemplified below.
The usual output of a segfault is:
Program received signal SIGSEGV, Segmentation fault
0x0000000000400d7c in upper (p=0x603010, a=0x603030, b=0x603050,
c=0x603070, d=0x603090, len=7) at i386-mpx-sigsegv.c:68
68 value = *(p + len);
In case it is a bound violation it will be presented as:
Program received signal SIGSEGV, Segmentation fault
Upper bound violation while accessing address 0x7fffffffc3b3
Bounds: [lower = 0x7fffffffc390, upper = 0x7fffffffc3a3]
0x0000000000400d7c in upper (p=0x603010, a=0x603030, b=0x603050,
c=0x603070, d=0x603090, len=7) at i386-mpx-sigsegv.c:68
68 value = *(p + len);
In mi mode the output of a segfault is:
*stopped,reason="signal-received",signal-name="SIGSEGV",
signal-meaning="Segmentation fault", frame={addr="0x0000000000400d7c",
func="upper",args=[{name="p", value="0x603010"},{name="a",value="0x603030"}
,{name="b",value="0x603050"}, {name="c",value="0x603070"},
{name="d",value="0x603090"},{name="len",value="7"}],
file="i386-mpx-sigsegv.c",fullname="i386-mpx-sigsegv.c",line="68"},
thread-id="1",stopped-threads="all",core="6"
in the case of a bound violation:
*stopped,reason="signal-received",signal-name="SIGSEGV",
signal-meaning="Segmentation fault",
sigcode-meaning="Upper bound violation",
lower-bound="0x603010",upper-bound="0x603023",bound-access="0x60302f",
frame={addr="0x0000000000400d7c",func="upper",args=[{name="p",
value="0x603010"},{name="a",value="0x603030"},{name="b",value="0x603050"},
{name="c",value="0x603070"},{name="d",value="0x603090"},
{name="len",value="7"}],file="i386-mpx-sigsegv.c",
fullname="i386-mpx-sigsegv.c",line="68"},thread-id="1",
stopped-threads="all",core="6"
2016-02-18 Walfred Tedeschi <walfred.tedeschi@intel.com>
gdb/ChangeLog:
* NEWS: Add entry for bound violation.
* amd64-linux-tdep.c (amd64_linux_init_abi_common):
Add handler for segmentation fault.
* gdbarch.sh (handle_segmentation_fault): New.
* gdbarch.c: Regenerate.
* gdbarch.h: Regenerate.
* i386-linux-tdep.c (i386_linux_handle_segmentation_fault): New.
(SIG_CODE_BONDARY_FAULT): New define.
(i386_linux_init_abi): Use i386_mpx_bound_violation_handler.
* i386-linux-tdep.h (i386_linux_handle_segmentation_fault) New.
* i386-tdep.c (i386_mpx_enabled): Add as external.
* i386-tdep.c (i386_mpx_enabled): Add as external.
* infrun.c (handle_segmentation_fault): New function.
(print_signal_received_reason): Use handle_segmentation_fault.
gdb/testsuite/ChangeLog:
* gdb.arch/i386-mpx-sigsegv.c: New file.
* gdb.arch/i386-mpx-sigsegv.exp: New file.
* gdb.arch/i386-mpx-simple_segv.c: New file.
* gdb.arch/i386-mpx-simple_segv.exp: New file.
gdb/doc/ChangeLog:
* gdb.texinfo (Signals): Add bound violation display hints for
a SIGSEGV.
Diffstat (limited to 'gdb/doc')
-rw-r--r-- | gdb/doc/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 27 |
2 files changed, 32 insertions, 0 deletions
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 8106d82..189dfdc 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2016-02-18 Walfred Tedeschi <walfred.tedeschi@intel.com> + + * gdb.texinfo (Signals): Add bound violation display hints for + a SIGSEGV. + 2016-02-18 Marcin KoĆcielnicki <koriakin@0x04.net> * gdb.texinfo (Trace File Format): Add documentation for description diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 0028eda8..5db7cf2 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -5852,6 +5852,33 @@ $1 = (void *) 0x7ffff7ff7000 Depending on target support, @code{$_siginfo} may also be writable. +@cindex Intel MPX boundary violations +@cindex boundary violations, Intel MPX +On some targets, a @code{SIGSEGV} can be caused by a boundary +violation, i.e., accessing an address outside of the allowed range. +In those cases @value{GDBN} may displays additional information, +depending on how @value{GDBN} has been told to handle the signal. +With @code{handle stop SIGSEGV}, @value{GDBN} displays the violation +kind: "Upper" or "Lower", the memory address accessed and the +bounds, while with @code{handle nostop SIGSEGV} no additional +information is displayed. + +The usual output of a segfault is: +@smallexample +Program received signal SIGSEGV, Segmentation fault +0x0000000000400d7c in upper () at i386-mpx-sigsegv.c:68 +68 value = *(p + len); +@end smallexample + +While a bound violation is presented as: +@smallexample +Program received signal SIGSEGV, Segmentation fault +Upper bound violation while accessing address 0x7fffffffc3b3 +Bounds: [lower = 0x7fffffffc390, upper = 0x7fffffffc3a3] +0x0000000000400d7c in upper () at i386-mpx-sigsegv.c:68 +68 value = *(p + len); +@end smallexample + @node Thread Stops @section Stopping and Starting Multi-thread Programs |