[PATCH 4/4] ARM: vfp: clear fpscr length and stride bits on return from sig handler

Will Deacon will.deacon at arm.com
Fri Jan 27 11:24:03 EST 2012


The ARM PCS mandates that the length and stride bits of the fpscr are
cleared on entry to and return from a public interface.

This patch ensures that the VFP context restored from a signal frame
is made to adhere to this specification.

Reported-by: Peter Maydell <peter.maydell at linaro.org>
Signed-off-by: Will Deacon <will.deacon at arm.com>
---
 arch/arm/kernel/signal.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index 9e617bd..274b8fc 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -216,7 +216,7 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame)
 	struct vfp_hard_struct *h = &thread->vfpstate.hard;
 	unsigned long magic;
 	unsigned long size;
-	unsigned long fpexc;
+	unsigned long fpexc, fpscr;
 	int err = 0;
 
 	__get_user_error(magic, &frame->magic, err);
@@ -238,7 +238,13 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame)
 	/*
 	 * Copy the status and control register.
 	 */
-	__get_user_error(h->fpscr, &frame->ufp.fpscr, err);
+	__get_user_error(fpscr, &frame->ufp.fpscr, err);
+
+	/*
+	 * As per the PCS, clear the length and stride bits.
+	 */
+	fpscr &= ~(FPSCR_LENGTH_MASK | FPSCR_STRIDE_MASK);
+	h->fpscr = fpscr;
 
 	/*
 	 * Sanitise and restore the exception registers.
-- 
1.7.4.1




More information about the linux-arm-kernel mailing list