aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Burton <[email protected]>2015-07-27 12:58:17 -0700
committerRalf Baechle <[email protected]>2015-09-03 12:07:56 +0200
commit6f0aba63bfb3eb33b68cf746c44b6ab302599180 (patch)
tree01c394a504d3e87ab500c9e826f7602facb896ef
parent64243c2a945640392b59fe1dc66c30ee1ca04170 (diff)
MIPS: Skip odd double FP registers when copying FP32 sigcontext
When a task uses 32 bit floating point, the odd indexed 32b register values are stored in bits 63:32 of the preceding even indexed 64b FP register field in saved context. Thus there is no point in preserving the odd indexed 64b register fields since they hold no valid context. This patch will cause them to be skipped, as is already done in arch/mips/kernel/signal32.c. [[email protected]: Fixed reject.] Signed-off-by: Paul Burton <[email protected]> Cc: [email protected] Cc: Guenter Roeck <[email protected]> Cc: Matthew Fortune <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: [email protected] Cc: Richard Weinberger <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Maciej W. Rozycki <[email protected]> Cc: Andrew Morton <[email protected]> Patchwork: https://patchwork.linux-mips.org/patch/10791/ Signed-off-by: Ralf Baechle <[email protected]>
-rw-r--r--arch/mips/kernel/signal.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c
index 9c42c500134e..cc3a01f5c5af 100644
--- a/arch/mips/kernel/signal.c
+++ b/arch/mips/kernel/signal.c
@@ -69,8 +69,9 @@ static int copy_fp_to_sigcontext(void __user *sc)
uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
int i;
int err = 0;
+ int inc = test_thread_flag(TIF_32BIT_FPREGS) ? 2 : 1;
- for (i = 0; i < NUM_FPU_REGS; i++) {
+ for (i = 0; i < NUM_FPU_REGS; i += inc) {
err |=
__put_user(get_fpr64(&current->thread.fpu.fpr[i], 0),
&fpregs[i]);
@@ -87,9 +88,10 @@ static int copy_fp_from_sigcontext(void __user *sc)
uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
int i;
int err = 0;
+ int inc = test_thread_flag(TIF_32BIT_FPREGS) ? 2 : 1;
u64 fpr_val;
- for (i = 0; i < NUM_FPU_REGS; i++) {
+ for (i = 0; i < NUM_FPU_REGS; i += inc) {
err |= __get_user(fpr_val, &fpregs[i]);
set_fpr64(&current->thread.fpu.fpr[i], 0, fpr_val);
}