diff options
author | Weimin Pan <weimin.pan@oracle.com> | 2017-08-23 10:57:37 +0200 |
---|---|---|
committer | Jose E. Marchesi <jose.marchesi@oracle.com> | 2017-08-23 10:57:37 +0200 |
commit | 58afddc6c7c5eaacdb68cdc3cacd0f76a3d01490 (patch) | |
tree | f930d2376581ff96b671a185dbe7c1c2164d8c26 /gdb/doc | |
parent | 98973784dc4775dbce3470b0933d1cb13f8c5a87 (diff) | |
download | binutils-58afddc6c7c5eaacdb68cdc3cacd0f76a3d01490.zip binutils-58afddc6c7c5eaacdb68cdc3cacd0f76a3d01490.tar.gz binutils-58afddc6c7c5eaacdb68cdc3cacd0f76a3d01490.tar.bz2 |
gdb: SPARC ADI support
The M7 processor supports an Application Data Integrity (ADI) feature
that detects invalid data accesses. When software allocates data, it
chooses a 4-bit version number, sets the version in the upper 4 bits
of the 64-bit pointer to that data, and stores the 4-bit version in
every cacheline of the object. Hardware saves the latter in spare
bits in the cache and memory hierarchy. On each load and store, the
processor compares the upper 4 VA (virtual address) bits to the
cacheline's version. If there is a mismatch, the processor generates a
version mismatch trap which can be either precise or disrupting. The
trap is an error condition which the kernel delivers to the process as
a SIGSEGV signal.
The upper 4 bits of the VA represent a version and are not part of the
true address. The processor clears these bits and sign extends bit 59
to generate the true address.
Note that 32-bit applications cannot use ADI.
This patch adds ADI support in gdb which allows the user to examine
current version tags and assign new version tags in the program. It
also catches and reports precise or disrupting memory corruption
traps.
gdb/ChangeLog:
2017-08-07 Weimin Pan <weimin.pan@oracle.com>
* sparc64-tdep.h: (adi_normalize_address): New export.
* sparc-nat.h: (open_adi_tag_fd): New export.
* sparc64-linux-nat.c: (open_adi_tag_fd): New function.
* sparc64-linux-tdep.c:
(SEGV_ACCADI, SEGV_ADIDERR, SEGV_ADIPERR) New defines.
(sparc64_linux_handle_segmentation_fault): New function.
(sparc64_linux_init_abi): Register
sparc64_linux_handle_segmentation_fault
* sparc64-tdep.c: Include cli-utils.h,gdbcmd.h,auxv.h.
(sparc64_addr_bits_remove): New function.
(sparc64_init_abi): Register sparc64_addr_bits_remove.
(MAX_PROC_NAME_SIZE): New macro.
(AT_ADI_BLKSZ, AT_ADI_NBITS, AT_ADI_UEONADI) New defines.
(sparc64adilist): New variable.
(adi_proc_list): New variable.
(find_adi_info): New function.
(add_adi_info): New function.
(get_adi_info_proc): New function.
(get_adi_info): New function.
(info_adi_command): New function.
(read_maps_entry): New function.
(adi_available): New function.
(adi_normalize_address): New function.
(adi_align_address): New function.
(adi_convert_byte_count): New function.
(adi_tag_fd): New function.
(adi_is_addr_mapped): New function.
(adi_read_versions): New function.
(adi_write_versions): New function.
(adi_print_versions): New function.
(do_examine): New function.
(do_assign): New function.
(adi_examine_command): New function.
(adi_assign_command): New function.
(_initialize_sparc64_adi_tdep): New function.
gdb/doc/ChangeLog:
2017-08-07 Weimin Pan <weimin.pan@oracle.com>
* gdb.texinfo (Architectures): Add new Sparc64 section to document
ADI support.
* NEWS: Add "adi examine" and "adi assign" commands.
gdb/testsuite/ChangeLog:
2017-08-07 Weimin Pan <weimin.pan@oracle.com>
* gdb.arch/sparc64-adi.exp: New file.
* gdb.arch/sparc64-adi.c: New file.
Diffstat (limited to 'gdb/doc')
-rw-r--r-- | gdb/doc/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 73 |
2 files changed, 79 insertions, 0 deletions
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 32c9425..40b0e40 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2017-08-07 Weimin Pan <weimin.pan@oracle.com> + + * gdb.texinfo (Architectures): Add new Sparc64 section to document + ADI support. + * NEWS: Add "adi examine" and "adi assign" commands. + 2017-08-18 Yao Qi <yao.qi@linaro.org> * gdb.texinfo (Server): Document "--selftest". diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 620d11d..d0d5d96 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -22474,6 +22474,7 @@ all uses of @value{GDBN} with the architecture, both native and cross. * SPU:: Cell Broadband Engine SPU architecture * PowerPC:: * Nios II:: +* Sparc64:: @end menu @node AArch64 @@ -22858,6 +22859,78 @@ target code in @value{GDBN}. Show the current setting of Nios II debugging messages. @end table +@node Sparc64 +@subsection Sparc64 +@cindex Sparc64 support +@cindex Application Data Integrity +@subsubsection ADI Support + +The M7 processor supports an Application Data Integrity (ADI) feature that +detects invalid data accesses. When software allocates memory and enables +ADI on the allocated memory, it chooses a 4-bit version number, sets the +version in the upper 4 bits of the 64-bit pointer to that data, and stores +the 4-bit version in every cacheline of that data. Hardware saves the latter +in spare bits in the cache and memory hierarchy. On each load and store, +the processor compares the upper 4 VA (virtual address) bits to the +cacheline's version. If there is a mismatch, the processor generates a +version mismatch trap which can be either precise or disrupting. The trap +is an error condition which the kernel delivers to the process as a SIGSEGV +signal. + +Note that only 64-bit applications can use ADI and need to be built with +ADI-enabled. + +Values of the ADI version tags, which are in granularity of a +cacheline (64 bytes), can be viewed or modified. + + +@table @code +@kindex adi examine +@item adi (examine | x) [ / @var{n} ] @var{addr} + +The @code{adi examine} command displays the value of one ADI version tag per +cacheline. + +@var{n} is a decimal integer specifying the number in bytes; the default +is 1. It specifies how much ADI version information, at the ratio of 1:ADI +block size, to display. + +@var{addr} is the address in user address space where you want @value{GDBN} +to begin displaying the ADI version tags. + +Below is an example of displaying ADI versions of variable "shmaddr". + +@smallexample +(@value{GDBP}) adi x/100 shmaddr + 0xfff800010002c000: 0 0 +@end smallexample + +@kindex adi assign +@item adi (assign | a) [ / @var{n} ] @var{addr} = @var{tag} + +The @code{adi assign} command is used to assign new ADI version tag +to an address. + +@var{n} is a decimal integer specifying the number in bytes; +the default is 1. It specifies how much ADI version information, at the +ratio of 1:ADI block size, to modify. + +@var{addr} is the address in user address space where you want @value{GDBN} +to begin modifying the ADI version tags. + +@var{tag} is the new ADI version tag. + +For example, do the following to modify then verify ADI versions of +variable "shmaddr": + +@smallexample +(@value{GDBP}) adi a/100 shmaddr = 7 +(@value{GDBP}) adi x/100 shmaddr + 0xfff800010002c000: 7 7 +@end smallexample + +@end table + @node Controlling GDB @chapter Controlling @value{GDBN} |