| From: Paul Burton <paul.burton@imgtec.com> |
| Date: Fri, 11 Jul 2014 16:44:28 +0100 |
| Subject: MIPS: save/restore MSACSR register on context switch |
| |
| commit f7a46fa7bb0047d3e226702a0c4b786862fe6843 upstream. |
| |
| I added a field for the MSACSR register in struct mips_fpu_struct, but |
| never actually made use of it... This is a clear bug. Save and restore |
| the MSACSR register along with the vector registers. |
| |
| Signed-off-by: Paul Burton <paul.burton@imgtec.com> |
| Cc: linux-mips@linux-mips.org |
| Patchwork: https://patchwork.linux-mips.org/patch/7300/ |
| 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/include/asm/asmmacro.h | 11 +++++++++++ |
| arch/mips/kernel/asm-offsets.c | 1 + |
| 2 files changed, 12 insertions(+) |
| |
| --- a/arch/mips/include/asm/asmmacro.h |
| +++ b/arch/mips/include/asm/asmmacro.h |
| @@ -10,6 +10,7 @@ |
| |
| #include <asm/hazards.h> |
| #include <asm/asm-offsets.h> |
| +#include <asm/msa.h> |
| |
| #ifdef CONFIG_32BIT |
| #include <asm/asmmacro-32.h> |
| @@ -378,9 +379,19 @@ |
| st_d 29, THREAD_FPR29, \thread |
| st_d 30, THREAD_FPR30, \thread |
| st_d 31, THREAD_FPR31, \thread |
| + .set push |
| + .set noat |
| + cfcmsa $1, MSA_CSR |
| + sw $1, THREAD_MSA_CSR(\thread) |
| + .set pop |
| .endm |
| |
| .macro msa_restore_all thread |
| + .set push |
| + .set noat |
| + lw $1, THREAD_MSA_CSR(\thread) |
| + ctcmsa MSA_CSR, $1 |
| + .set pop |
| ld_d 0, THREAD_FPR0, \thread |
| ld_d 1, THREAD_FPR1, \thread |
| ld_d 2, THREAD_FPR2, \thread |
| --- a/arch/mips/kernel/asm-offsets.c |
| +++ b/arch/mips/kernel/asm-offsets.c |
| @@ -234,6 +234,7 @@ void output_thread_fpu_defines(void) |
| thread.fpu.fpr[31].val64[FPR_IDX(64, 0)]); |
| |
| OFFSET(THREAD_FCR31, task_struct, thread.fpu.fcr31); |
| + OFFSET(THREAD_MSA_CSR, task_struct, thread.fpu.msacsr); |
| BLANK(); |
| } |
| |