[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