patch-2.1.97 linux/arch/ppc/kernel/signal.c

Next file: linux/arch/ppc/kernel/smp.c
Previous file: linux/arch/ppc/kernel/setup.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.96/linux/arch/ppc/kernel/signal.c linux/arch/ppc/kernel/signal.c
@@ -201,8 +201,13 @@
 	if (sc == (struct sigcontext_struct *)(sigctx.regs)) {
 		/* Last stacked signal - restore registers */
 		sr = (struct sigregs *) sigctx.regs;
+#ifdef __SMP__
+		if ( regs->msr & MSR_FP  )
+			smp_giveup_fpu(current);
+#else	
 		if (last_task_used_math == current)
 			giveup_fpu();
+#endif		
 		if (copy_from_user(saved_regs, &sr->gp_regs,
 				   sizeof(sr->gp_regs)))
 			goto badframe;
@@ -249,8 +254,13 @@
 
 	if (verify_area(VERIFY_WRITE, frame, sizeof(*frame)))
 		goto badframe;
-	if (last_task_used_math == current)
-		giveup_fpu();
+#ifdef __SMP__
+		if ( regs->msr & MSR_FP  )
+			smp_giveup_fpu(current);
+#else	
+		if (last_task_used_math == current)
+			giveup_fpu();
+#endif		
 	if (__copy_to_user(&frame->gp_regs, regs, GP_REGS_SIZE)
 	    || __copy_to_user(&frame->fp_regs, current->tss.fpr,
 			      ELF_NFPREG * sizeof(double))

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov