Skip to content
Commit e4e2a304 authored by Dave Martin's avatar Dave Martin
Browse files

arm64/sve: ptrace and ELF coredump support



This patch defines and implements a new regset NT_ARM_SVE, which
describes a thread's SVE register state.  This allows a debugger to
manipulate the SVE state, as well as being included in ELF
coredumps for post-mortem debugging.

Because the regset size and layout are dependent on the thread's
current vector length, it is not possible to define a C struct to
describe the regset contents as is done for existing regsets.
Instead, and for the same reasons, NT_ARM_SVE is based on the
freeform variable-layout approach used for the SVE signal frame.

Additionally, to reduce debug overhead when debugging threads that
might or might not have live SVE register state, NT_ARM_SVE may be
presented in one of two different formats: the old struct
user_fpsimd_state format is embedded for describing the state of a
thread with no live SVE state, whereas a new variable-layout
structure is embedded for describing live SVE state.  This avoids a
debugger needing to poll NT_PRFPREG in addition to NT_ARM_SVE, and
allows existing userspace code to handle the non-SVE case without
too much modification.

For this to work, NT_ARM_SVE is defined with a fixed-format header
of type struct user_sve_header, which the recipient can use to
figure out the content, size and layout of the reset of the regset.
Accessor macros are defined to allow the vector-length-dependent
parts of the regset to be manipulated.

Signed-off-by: Alan Hayward's avatarAlan Hayward <alan.hayward@arm.com>
Signed-off-by: default avatarDave Martin <Dave.Martin@arm.com>
Cc: Alex Bennée <alex.bennee@linaro.org>
Cc: "Okamoto, Takayuki" <tokamoto@jp.fujitsu.com>

---

Dropped Alex Bennée's reviewed-by, since bug fixes have been applied.

Changes since v2
----------------

Bug fixes:

 * Initialised user_sve_header.sve_max_vl properly in
   sve_init_header_from_task().  (Reported by Okamoto Takayuki.)

   This bug was introduced by the refactoring since v1 to remove
   BUG_ON()s.  A WARN_ON() was introduced to fix up the error case
   here, but the code for the non-error case was lost.

   This resulted in userspace seeing max_size == 0 when reading
   NT_ARM_SVE with PTRACE_GETREGSET.  NT_ARM_SVE would also get
   truncated in coredmups (though I've not tested that).

   This fix ensures that max_size is initialised, and only overrides
   the value written if it would be garbage.

 * In sve_set(), the flags for sve_set_vector_length() are shifted
   into the correct position.  Without this, a PTRACE_SETREGSET for
   NT_ARM_SVE may reject valid flags (including flags read via
   PTRACE_GETREGSET) with -EINVAL: thus, legitimate uses including
   save/restore may not work.

Miscellaneous:

 * Clarified comment in ptrace.h about keeping flags in sync with
   prctl.h so that it won't be misinterpreted as applying to
   SVE_PT_REGS_{MASK, FPSIMD,SVE} (which deliberately have no prctl
   equivalent).

 * Added comments explaining the intent, purpose and basic constraints
   for fpsimd.c helpers.
parent 09740f7f
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment