Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1233567
| From | Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 4.2 032/134] arm64: compat: fix vfp save/restore across signal handlers in big-endian |
| Date | 2015-09-27 00:20 +0200 |
| Message-ID | <qd5Z0-4Gv-27@gated-at.bofh.it> (permalink) |
| References | <qd4Jz-2Ha-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <will.deacon@arm.com>
commit bdec97a855ef1e239f130f7a11584721c9a1bf04 upstream.
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.
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/arm64/kernel/signal32.c | 47 ++++++++++++++++++++++++++++++++-----------
1 file changed, 36 insertions(+), 11 deletions(-)
--- a/arch/arm64/kernel/signal32.c
+++ b/arch/arm64/kernel/signal32.c
@@ -212,14 +212,32 @@ int copy_siginfo_from_user32(siginfo_t *
/*
* VFP save/restore code.
+ *
+ * We have to be careful with endianness, since the fpsimd context-switch
+ * code operates on 128-bit (Q) register values whereas the compat ABI
+ * uses an array of 64-bit (D) registers. Consequently, we need to swap
+ * the two halves of each Q register when running on a big-endian CPU.
*/
+union __fpsimd_vreg {
+ __uint128_t raw;
+ struct {
+#ifdef __AARCH64EB__
+ u64 hi;
+ u64 lo;
+#else
+ u64 lo;
+ u64 hi;
+#endif
+ };
+};
+
static int compat_preserve_vfp_context(struct compat_vfp_sigframe __user *frame)
{
struct fpsimd_state *fpsimd = ¤t->thread.fpsimd_state;
compat_ulong_t magic = VFP_MAGIC;
compat_ulong_t size = VFP_STORAGE_SIZE;
compat_ulong_t fpscr, fpexc;
- int err = 0;
+ int i, err = 0;
/*
* Save the hardware registers to the fpsimd_state structure.
@@ -235,10 +253,15 @@ static int compat_preserve_vfp_context(s
/*
* Now copy the FP registers. Since the registers are packed,
* we can copy the prefix we want (V0-V15) as it is.
- * FIXME: Won't work if big endian.
*/
- err |= __copy_to_user(&frame->ufp.fpregs, fpsimd->vregs,
- sizeof(frame->ufp.fpregs));
+ for (i = 0; i < ARRAY_SIZE(frame->ufp.fpregs); i += 2) {
+ union __fpsimd_vreg vreg = {
+ .raw = fpsimd->vregs[i >> 1],
+ };
+
+ __put_user_error(vreg.lo, &frame->ufp.fpregs[i], err);
+ __put_user_error(vreg.hi, &frame->ufp.fpregs[i + 1], err);
+ }
/* Create an AArch32 fpscr from the fpsr and the fpcr. */
fpscr = (fpsimd->fpsr & VFP_FPSCR_STAT_MASK) |
@@ -263,7 +286,7 @@ static int compat_restore_vfp_context(st
compat_ulong_t magic = VFP_MAGIC;
compat_ulong_t size = VFP_STORAGE_SIZE;
compat_ulong_t fpscr;
- int err = 0;
+ int i, err = 0;
__get_user_error(magic, &frame->magic, err);
__get_user_error(size, &frame->size, err);
@@ -273,12 +296,14 @@ static int compat_restore_vfp_context(st
if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE)
return -EINVAL;
- /*
- * Copy the FP registers into the start of the fpsimd_state.
- * FIXME: Won't work if big endian.
- */
- err |= __copy_from_user(fpsimd.vregs, frame->ufp.fpregs,
- sizeof(frame->ufp.fpregs));
+ /* Copy the FP registers into the start of the fpsimd_state. */
+ for (i = 0; i < ARRAY_SIZE(frame->ufp.fpregs); i += 2) {
+ union __fpsimd_vreg vreg;
+
+ __get_user_error(vreg.lo, &frame->ufp.fpregs[i], err);
+ __get_user_error(vreg.hi, &frame->ufp.fpregs[i + 1], err);
+ fpsimd.vregs[i >> 1] = vreg.raw;
+ }
/* Extract the fpsr and the fpcr from the fpscr */
__get_user_error(fpscr, &frame->ufp.fpscr, err);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH 4.2 000/134] 4.2.2-stable review Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 049/134] powerpc/eeh: Probe after unbalanced kref check Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 018/134] MIPS: CPS: use 32b accesses to GCRs Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 032/134] arm64: compat: fix vfp save/restore across signal handlers in big-endian Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 047/134] pinctrl: at91: fix null pointer dereference Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 006/134] nfc: st-nci: Remove data from ack_pending_q when receiving a SYNC_ACK Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 015/134] rtlwifi: rtl8821ae: Fix an expression that is always false Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 030/134] of/fdt: make memblock maximum physical address arch configurable Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 035/134] arm/arm64: KVM: vgic: Check for !irqchip_in_kernel() when mapping resources Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 050/134] powerpc/eeh: Fix fenced PHB caused by eeh_slot_error_detail() Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 007/134] nfc: st-nci: Free data with irrelevant NDLC PCB_SYNC value Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 017/134] tg3: Fix temperature reporting Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 053/134] powerpc: Uncomment and make enable_kernel_vsx() routine available Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 003/134] nfc: st-nci: Fix non accurate comment for st_nci_i2c_read Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 036/134] KVM: arm64: add workaround for Cortex-A57 erratum #852523 Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 004/134] NFC: st21nfca: fix use of uninitialized variables in error path Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 037/134] arm64: KVM: Disable virtual timer even if the guest is not using it Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 008/134] nfc: netlink: Add check on NFC_ATTR_VENDOR_DATA Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 048/134] powerpc/pseries: Fix corrupted pdn list Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 059/134] powerpc/mm: Recompute hash value after a failed update Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:20 +0200
[PATCH 4.2 021/134] mac80211: enable assoc check for mesh interfaces Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 029/134] arm64: flush FP/SIMD state correctly after execve() Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 019/134] MIPS: math-emu: Allow m{f,t}hc emulation on MIPS R6 Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 024/134] cxl: Fix unbalanced pci_dev_get in cxl_probe Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 002/134] nfc: st-nci: Fix typo when changing from st21nfcb to st-nci Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 022/134] cxl: Allow release of contexts which have been OPENED but not STARTED Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 027/134] arm64: kconfig: Move LIST_POISON to a safe value Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 020/134] MIPS: math-emu: Emulate missing BC1{EQ,NE}Z instructions Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 025/134] ext4: dont manipulate recovery flag when freezing no-journal fs Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 028/134] arm64: entry: always restore x0 from the stack on syscall return Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 010/134] nfc: nci: hci: Add check on skb nci_hci_send_cmd parameter Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 026/134] Revert "ext4: remove block_device_ejected" Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
[PATCH 4.2 023/134] cxl: Remove racy attempt to force EEH invocation in reset Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 00:30 +0200
Re: [PATCH 4.2 000/134] 4.2.2-stable review Guenter Roeck <linux@roeck-us.net> - 2015-09-27 20:20 +0200
Re: [PATCH 4.2 000/134] 4.2.2-stable review Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-27 20:40 +0200
Re: [PATCH 4.2 000/134] 4.2.2-stable review Sudip Mukherjee <sudipm.mukherjee@gmail.com> - 2015-09-28 08:00 +0200
Re: [PATCH 4.2 000/134] 4.2.2-stable review Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-09-28 16:30 +0200
Re: [PATCH 4.2 000/134] 4.2.2-stable review Sudip Mukherjee <sudipm.mukherjee@gmail.com> - 2015-09-28 17:10 +0200
Re: [PATCH 4.2 000/134] 4.2.2-stable review Guenter Roeck <linux@roeck-us.net> - 2015-09-28 17:10 +0200
Re: [PATCH 4.2 000/134] 4.2.2-stable review Shuah Khan <shuahkh@osg.samsung.com> - 2015-09-28 19:40 +0200
csiph-web