diff options
author | Will Deacon <will.deacon@arm.com> | 2015-09-15 12:07:06 +0100 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2015-09-17 11:57:03 +0100 |
commit | bdec97a855ef1e239f130f7a11584721c9a1bf04 (patch) | |
tree | cfd363982a2b114bd734829d886e33fe669e9944 /arch/arm64/Kconfig | |
parent | e56d82a116176f7af9d642b560abbbd3a2b68013 (diff) | |
download | lwn-bdec97a855ef1e239f130f7a11584721c9a1bf04.tar.gz lwn-bdec97a855ef1e239f130f7a11584721c9a1bf04.zip |
arm64: compat: fix vfp save/restore across signal handlers in big-endian
When saving/restoring the VFP registers from a compat (AArch32)
signal frame, we rely on the compat registers forming a prefix of the
native register file and therefore make use of copy_{to,from}_user to
transfer between the native fpsimd_state and the compat_vfp_sigframe.
Unfortunately, this doesn't work so well in a big-endian environment.
Our fpsimd save/restore code operates directly on 128-bit quantities
(Q registers) whereas the compat_vfp_sigframe represents the registers
as an array of 64-bit (D) registers. The architecture packs the compat D
registers into the Q registers, with the least significant bytes holding
the lower register. Consequently, we need to swap the 64-bit halves when
converting between these two representations on a big-endian machine.
This patch replaces the __copy_{to,from}_user invocations in our
compat VFP signal handling code with explicit __put_user loops that
operate on 64-bit values and swap them accordingly.
Cc: <stable@vger.kernel.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64/Kconfig')
0 files changed, 0 insertions, 0 deletions