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 <alan.hayward@arm.com> Signed-off-by:
Dave 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.
Loading
Please register or sign in to comment