[PATCH 1/1] Revert UBUNTU Fix ARM VFP state corruption due to preemption

Brad Figg brad at tpi.com
Thu Mar 12 18:04:34 UTC 2009


diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S
index 365aa37..ba592a9 100644
--- a/arch/arm/vfp/entry.S
+++ b/arch/arm/vfp/entry.S
@@ -18,29 +18,18 @@
 #include <linux/linkage.h>
 #include <linux/init.h>
 #include <asm/asm-offsets.h>
-#include <asm/thread_info.h>
+#include <asm/assembler.h>
 #include <asm/vfpmacros.h>
-#include "../kernel/entry-header.S"

 ENTRY(do_vfp)
-#ifdef CONFIG_PREEMPT
-	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count
-	add	r11, r4, #1		@ increment it
-	str	r11, [r10, #TI_PREEMPT]
-#endif
 	enable_irq
  	ldr	r4, .LCvfp
 	ldr	r11, [r10, #TI_CPU]	@ CPU number
+	add	r10, r10, #TI_VFPSTATE	@ r10 = workspace
 	ldr	pc, [r4]		@ call VFP entry point
 ENDPROC(do_vfp)

 ENTRY(vfp_null_entry)
-#ifdef CONFIG_PREEMPT
-	get_thread_info	r10
-	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count
-	sub	r11, r4, #1		@ decrement it
-	str	r11, [r10, #TI_PREEMPT]
-#endif
 	mov	pc, lr
 ENDPROC(vfp_null_entry)

@@ -52,12 +41,6 @@ ENDPROC(vfp_null_entry)

 	__INIT
 ENTRY(vfp_testing_entry)
-#ifdef CONFIG_PREEMPT
-	get_thread_info	r10
-	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count
-	sub	r11, r4, #1		@ decrement it
-	str	r11, [r10, #TI_PREEMPT]
-#endif
 	ldr	r0, VFP_arch_address
 	str	r5, [r0]		@ known non-zero value
 	mov	pc, r9			@ we have handled the fault
diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S
index 565a5b7..2da59a3 100644
--- a/arch/arm/vfp/vfphw.S
+++ b/arch/arm/vfp/vfphw.S
@@ -153,12 +153,6 @@ look_for_VFP_exceptions:
 	@ not recognised by VFP

 	DBGSTR	"not VFP"
-#ifdef CONFIG_PREEMPT
-	get_thread_info	r10
-	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count
-	sub	r11, r4, #1		@ decrement it
-	str	r11, [r10, #TI_PREEMPT]
-#endif
 	mov	pc, lr

 process_exception:
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index 385f2fb..606283f 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -268,7 +268,7 @@ void VFP_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs)
 		 * on VFP subarch 1.
 		 */
 		 vfp_raise_exceptions(VFP_EXCEPTION_ERROR, trigger, fpscr, regs);
-		 goto exit;
+		 return;
 	}

 	/*
@@ -299,7 +299,7 @@ void VFP_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs)
 	 * the FPEXC.FP2V bit is valid only if FPEXC.EX is 1.
 	 */
 	if (fpexc ^ (FPEXC_EX | FPEXC_FP2V))
-		goto exit;
+		return;

 	/*
 	 * The barrier() here prevents fpinst2 being read
@@ -312,8 +312,6 @@ void VFP_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs)
 	exceptions = vfp_emulate_instruction(trigger, orig_fpscr, regs);
 	if (exceptions)
 		vfp_raise_exceptions(exceptions, trigger, orig_fpscr, regs);
- exit:
-	preempt_enable();
 }

 static void vfp_enable(void *unused)
-- 
1.6.1.3

-- 
Brad Figg brad at tpi.com http://www.tpi.com
Ph: 503-601-0235 ext. 105




More information about the kernel-team mailing list