69 lines
2.3 KiB
ReStructuredText
69 lines
2.3 KiB
ReStructuredText
=========================================
|
|
Tagged virtual addresses in AArch64 Linux
|
|
=========================================
|
|
|
|
Author: Will Deacon <will.deacon@arm.com>
|
|
|
|
Date : 12 June 2013
|
|
|
|
This document briefly describes the provision of tagged virtual
|
|
addresses in the AArch64 translation system and their potential uses
|
|
in AArch64 Linux.
|
|
|
|
The kernel configures the translation tables so that translations made
|
|
via TTBR0 (i.e. userspace mappings) have the top byte (bits 63:56) of
|
|
the virtual address ignored by the translation hardware. This frees up
|
|
this byte for application use.
|
|
|
|
|
|
Passing tagged addresses to the kernel
|
|
--------------------------------------
|
|
|
|
All interpretation of userspace memory addresses by the kernel assumes
|
|
an address tag of 0x00.
|
|
|
|
This includes, but is not limited to, addresses found in:
|
|
|
|
- pointer arguments to system calls, including pointers in structures
|
|
passed to system calls,
|
|
|
|
- the stack pointer (sp), e.g. when interpreting it to deliver a
|
|
signal,
|
|
|
|
- the frame pointer (x29) and frame records, e.g. when interpreting
|
|
them to generate a backtrace or call graph.
|
|
|
|
Using non-zero address tags in any of these locations may result in an
|
|
error code being returned, a (fatal) signal being raised, or other modes
|
|
of failure.
|
|
|
|
For these reasons, passing non-zero address tags to the kernel via
|
|
system calls is forbidden, and using a non-zero address tag for sp is
|
|
strongly discouraged.
|
|
|
|
Programs maintaining a frame pointer and frame records that use non-zero
|
|
address tags may suffer impaired or inaccurate debug and profiling
|
|
visibility.
|
|
|
|
|
|
Preserving tags
|
|
---------------
|
|
|
|
Non-zero tags are not preserved when delivering signals. This means that
|
|
signal handlers in applications making use of tags cannot rely on the
|
|
tag information for user virtual addresses being maintained for fields
|
|
inside siginfo_t. One exception to this rule is for signals raised in
|
|
response to watchpoint debug exceptions, where the tag information will
|
|
be preserved.
|
|
|
|
The architecture prevents the use of a tagged PC, so the upper byte will
|
|
be set to a sign-extension of bit 55 on exception return.
|
|
|
|
|
|
Other considerations
|
|
--------------------
|
|
|
|
Special care should be taken when using tagged pointers, since it is
|
|
likely that C compilers will not hazard two virtual addresses differing
|
|
only in the upper byte.
|