Index: generic/src/proc/scheduler.c
===================================================================
--- generic/src/proc/scheduler.c	(revision 7e4e5323698b3059ed08f14198db2c9c1fbc746a)
+++ generic/src/proc/scheduler.c	(revision fe050b782a8daa5c00ef507564f23db6dc0704cc)
@@ -56,4 +56,6 @@
  * tread is passed control.
  *
+ * THREAD->lock is locked on entry
+ *
  */
 void before_thread_runs(void)
@@ -70,5 +72,5 @@
 		fpu_context_restore(&(THREAD->saved_fpu_context));
 	else {
-		fpu_init();
+		fpu_init(&(THREAD->saved_fpu_context));
 		THREAD->fpu_context_exists=1;
 	}
@@ -80,17 +82,27 @@
 {
 	fpu_enable();
+	spinlock_lock(&CPU->lock);
+
+	/* Save old context */
 	if (CPU->fpu_owner != NULL) {  
+		spinlock_lock(&CPU->fpu_owner->lock);
 		fpu_context_save(&CPU->fpu_owner->saved_fpu_context);
 		/* don't prevent migration */
 		CPU->fpu_owner->fpu_context_engaged=0; 
-	}
+		spinlock_unlock(&CPU->fpu_owner->lock);
+	}
+
+	spinlock_lock(&THREAD->lock);
 	if (THREAD->fpu_context_exists)
 		fpu_context_restore(&THREAD->saved_fpu_context);
 	else {
-		fpu_init();
+		fpu_init(&(THREAD->saved_fpu_context));
 		THREAD->fpu_context_exists=1;
 	}
 	CPU->fpu_owner=THREAD;
 	THREAD->fpu_context_engaged = 1;
+
+	spinlock_unlock(&THREAD->lock);
+	spinlock_unlock(&CPU->lock);
 }
 #endif
