[RFT PATCH v1 2/7] arm64: restore FPSIMD to default state for kernel and signal contexts
From: Jiang Liu <hidden>
Date: 2013-09-27 13:20:14
Also in:
lkml
On 09/27/2013 07:35 PM, Catalin Marinas wrote:
On Fri, Sep 27, 2013 at 09:04:42AM +0100, Jiang Liu wrote:quoted
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index bb785d2..12a25e5 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c@@ -80,9 +80,14 @@ void fpsimd_thread_switch(struct task_struct *next) void fpsimd_flush_thread(void) { + struct fpsimd_state *state = ¤t->thread.fpsimd_state; + preempt_disable(); - memset(¤t->thread.fpsimd_state, 0, sizeof(struct fpsimd_state)); - fpsimd_load_state(¤t->thread.fpsimd_state); + memset(state, 0, sizeof(struct fpsimd_state)); +#if (AARCH64_FPCR_DEFAULT_VAL != 0) + state->fpcr = AARCH64_FPCR_DEFAULT_VAL; +#endif + fpsimd_load_state(state); preempt_enable();We can leave this to 0 as the default for user. Glibc already programs this register.
OK, will drop it.
quoted
}@@ -99,6 +104,8 @@ void kernel_neon_begin(void) if (current->mm) fpsimd_save_state(¤t->thread.fpsimd_state); + + fpsimd_init_hw_state();This function should indeed do some initialisation rather than relying on whatever the user set for FPCR.quoted
diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 890a591..6d80612 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c@@ -52,6 +52,7 @@ static int preserve_fpsimd_context(struct fpsimd_context __user *ctx) /* dump the hardware registers to the fpsimd_state structure */ fpsimd_save_state(fpsimd); + fpsimd_init_hw_state();Here I think we need to leave the default user setting for fpcr as decided by glibc (or libgcc) when an application starts.
OK, will keep FPCR and clear FPSR.
quoted
/* copy the FP and status/control registers */ err = __copy_to_user(ctx->vregs, fpsimd->vregs, sizeof(fpsimd->vregs));diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index e393174..cb2cb41 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c@@ -248,6 +248,7 @@ static int compat_preserve_vfp_context(struct compat_vfp_sigframe __user *frame) * in AArch32. */ fpsimd_save_state(fpsimd); + fpsimd_init_hw_state();Same here.