]> git.hungrycats.org Git - linux/commitdiff
MIPS: preserve scalar FP CSR when switching vector context
authorPaul Burton <paul.burton@imgtec.com>
Fri, 11 Jul 2014 15:44:29 +0000 (16:44 +0100)
committerBen Hutchings <ben@decadent.org.uk>
Tue, 4 Apr 2017 21:21:52 +0000 (22:21 +0100)
commit b83406735a4ae0aff4b614664d6a64a0fd6b9917 upstream.

Switching the vector context implicitly saves & restores the state of
the aliased scalar FP data registers, however the scalar FP control
& status register is distinct from the MSA control & status register.
In order to allow scalar FP to function correctly in programs using
MSA, the scalar CSR needs to be saved & restored along with the MSA
vector context.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7301/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Cc: Arnd Bergmann <arnd@arndb.de>
arch/mips/kernel/r4k_switch.S
arch/mips/kernel/traps.c

index 81ca3f70fe29a701d37c5e0db0fc427520c44f51..1a1aef04312d370e9c9601365b3428a78ac53c17 100644 (file)
        /* Check whether we're saving scalar or vector context. */
        bgtz    a3, 1f
 
-       /* Save 128b MSA vector context. */
+       /* Save 128b MSA vector context + scalar FP control & status. */
+       cfc1    t1, fcr31
        msa_save_all    a0
+       sw      t1, THREAD_FCR31(a0)
        b       2f
 
 1:     /* Save 32b/64b scalar FP context. */
index 2868b3927cb4c0e3f4a8e0bd4f228111bd302fae..e0d9757a845935f3558c4614b87a3de951e42e84 100644 (file)
@@ -1159,6 +1159,11 @@ static int enable_restore_fp_context(int msa)
 
        /* We need to restore the vector context. */
        restore_msa(current);
+
+       /* Restore the scalar FP control & status register */
+       if (!was_fpu_owner)
+               asm volatile("ctc1 %0, $31" : : "r"(current->thread.fpu.fcr31));
+
        return 0;
 }