Skip to content

Commit

Permalink
MIPS: preserve scalar FP CSR when switching vector context
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Paul Burton authored and Ralf Baechle committed Aug 1, 2014
1 parent f7a46fa commit b834067
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
4 changes: 3 additions & 1 deletion arch/mips/kernel/r4k_switch.S
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,10 @@
/* 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. */
Expand Down
5 changes: 5 additions & 0 deletions arch/mips/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -1154,6 +1154,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;
}

Expand Down

0 comments on commit b834067

Please sign in to comment.