[PATCH 0/5] arm64: signal: Signal frame expansion support
Dave Martin
Dave.Martin at arm.com
Thu Jun 15 07:03:37 PDT 2017
This series supersedes a prior RFC [1].
This series refactors the arm64 signal handling implementation in order
to make it easier to add support for new CPU architecture extensions,
which may require new records in the signal frame and may require the
signal frame to grow beyond its current size.
This series provides infrastructure that will be needed in order to
support the Scalable Vector Extension (SVE) [2] (patches to be posted
separately).
LTP testing is ongoing -- I will ping this series when I have results.
Changes since RFC v2:
* The frame link record has been moved back to the end of the full
signal frame, instead of fixing its position at the end of
__reserved[], after Catalin raised concerns about the space otherwise
wasted by putting the extended signal frame data after it.
Previous versions of the series had this behaviour, but concerns were
expressed by reviewers about the potential ABI impact.
This change has been informally tested for ABI impacts using the
libgcc unwinder (exercised by throwing exceptions from a signal
handler with g++ -fnon-call-exceptions) and gdb backtracing, neither
of which showed any problem. Review of the libgcc and libunwind
implementations and discussion with gdb developers suggest that no
breakage is expected as a result of the change.
(See patch 1 of this posting.)
* Patches 4 (Allocate extra sigcontext space as needed) and 5 (Parse
extra_context during sigreturn) of RFC v2 have been merged, since
they are not fully bisectable and make more sense as a single patch.
* Patch 6 (Report signal frame size to userspace via auxv) of RFC v2
has been dropped from the series, because this creates ABI that we
don't need yet, and can benefit from further discussion. This patch
will become relevant when merging support for SVE.
* struct extra_context is explicitly padded up to a multiple of 16 bytes.
This fixes a bug whereby a non-extra_context-aware unwinder would
skip the wrong amount of data after extra_context and miss the
terminator record.
There is a de facto assumption that unwinders do not need to round
_aarch64_ctx.size up to a multiple of 16 when stepping through the
records in the signal frame, though this isn't documented anywhere.
Original blurb:
An architecture advertises the maximum possible signal frame size via
the MINSIGSTKSZ #define (mandated by POSIX).
However, CPU architecture extensions may increase the amount of space
required to store the interrupted context when a signal is delivered.
Eventually the amount of space needed in the signal frame may exceed
MINSIGSTKSZ -- whether and when this happens is largely a matter of
luck, depending on the initial guess for MINSIGSTKSZ and the evolution
of that particular CPU architecture. Unfortunately MINSIGSTKSZ cannot
be changed without an ABI break, and POSIX provides no mechanism for
migration.
arm64 initially reserved 4KB of space in the signal frame for
extensions, of which about 0.5KB is allocated to the FP/SIMD registers
initially.
Depending on the vector length supported by the hardware, SVE requires
up to around 8KB of space to store the full SIMD register context, which
is too large to fit in the existing frame.
This series adds a mechanism for optionally enlarging the signal frame
(patches 4-5) and reporting the actual maximum signal frame size to
userspace (patch 6). Patches 1-3 do some refactoring to support this
change by abstracting the way signal frame records are allocated onto
the user stack.
Full backwards compatibility is not possible -- there is no way to hide
the fact that the signal frame has grown -- so it is expected that
support for new architecture extensions that can cause the signal frame
to grow will be opt-in for userspace, in addition to using the extension
mechanism defined by this series.
[1] [RFC PATCH v2 0/6] Signal frame expansion support
http://lists.infradead.org/pipermail/linux-arm-kernel/2017-April/501163.html
[2] ARM Scalable Vector Extension
https://community.arm.com/groups/processors/blog/2016/08/22/technology-update-the-scalable-vector-extension-sve-for-the-armv8-a-architecture
https://developer.arm.com/docs/ddi0584/latest/arm-architecture-reference-manual-supplement-the-scalable-vector-extension-sve-for-armv8-a
Dave Martin (5):
arm64: signal: split frame link record from sigcontext structure
arm64: signal: Refactor sigcontext parsing in rt_sigreturn
arm64: signal: factor frame layout and population into separate passes
arm64: signal: factor out signal frame record allocation
arm64: signal: Allow expansion of the signal frame
arch/arm64/include/uapi/asm/sigcontext.h | 55 +++++
arch/arm64/kernel/signal.c | 408 ++++++++++++++++++++++++++++---
2 files changed, 427 insertions(+), 36 deletions(-)
--
2.1.4
More information about the linux-arm-kernel
mailing list