[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