aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/signal32.c
diff options
context:
space:
mode:
authorAtsushi Nemoto <anemo@mba.ocn.ne.jp>2007-04-13 13:37:26 -0400
committerRalf Baechle <ralf@linux-mips.org>2007-04-20 09:58:37 -0400
commit5323180db75d562a287cb2020b07c9422df13df6 (patch)
tree71039fd0a03f89ebb3172d75a9e594d4f9f56fd6 /arch/mips/kernel/signal32.c
parent9a9943575ade643368849e2c963094ac637867e0 (diff)
[MIPS] Disallow CpU exception in kernel again.
The commit 4d40bff7110e9e1a97ff8c01bdd6350e9867cc10 ("Allow CpU exception in kernel partially") was broken. The commit was to fix theoretical problem but broke usual case. Revert it for now. Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/signal32.c')
-rw-r--r--arch/mips/kernel/signal32.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c
index 151fd2f0893a..53a337cfeb66 100644
--- a/arch/mips/kernel/signal32.c
+++ b/arch/mips/kernel/signal32.c
@@ -209,10 +209,10 @@ static int setup_sigcontext32(struct pt_regs *regs,
209 * Save FPU state to signal context. Signal handler 209 * Save FPU state to signal context. Signal handler
210 * will "inherit" current FPU state. 210 * will "inherit" current FPU state.
211 */ 211 */
212 preempt_disable();
212 own_fpu(1); 213 own_fpu(1);
213 enable_fp_in_kernel();
214 err |= save_fp_context32(sc); 214 err |= save_fp_context32(sc);
215 disable_fp_in_kernel(); 215 preempt_enable();
216 } 216 }
217 return err; 217 return err;
218} 218}
@@ -225,7 +225,10 @@ check_and_restore_fp_context32(struct sigcontext32 __user *sc)
225 err = sig = fpcsr_pending(&sc->sc_fpc_csr); 225 err = sig = fpcsr_pending(&sc->sc_fpc_csr);
226 if (err > 0) 226 if (err > 0)
227 err = 0; 227 err = 0;
228 preempt_disable();
229 own_fpu(0);
228 err |= restore_fp_context32(sc); 230 err |= restore_fp_context32(sc);
231 preempt_enable();
229 return err ?: sig; 232 return err ?: sig;
230} 233}
231 234
@@ -261,11 +264,8 @@ static int restore_sigcontext32(struct pt_regs *regs,
261 264
262 if (used_math) { 265 if (used_math) {
263 /* restore fpu context if we have used it before */ 266 /* restore fpu context if we have used it before */
264 own_fpu(0);
265 enable_fp_in_kernel();
266 if (!err) 267 if (!err)
267 err = check_and_restore_fp_context32(sc); 268 err = check_and_restore_fp_context32(sc);
268 disable_fp_in_kernel();
269 } else { 269 } else {
270 /* signal handler may have used FPU. Give it up. */ 270 /* signal handler may have used FPU. Give it up. */
271 lose_fpu(0); 271 lose_fpu(0);