Index: include/synch/spinlock.h
===================================================================
--- include/synch/spinlock.h	(revision f9447155de20c5cfd68a01025fa1a2b19595bcdd)
+++ include/synch/spinlock.h	(revision c842f04b1c7925e69d92562d35a6a60a14223647)
@@ -32,4 +32,5 @@
 #include <arch/types.h>
 #include <typedefs.h>
+#include <preemption.h>
 
 #ifdef __SMP__
@@ -49,7 +50,7 @@
 
 #define spinlock_initialize(x)
-#define spinlock_lock(x)
-#define spinlock_trylock(x) 1
-#define spinlock_unlock(x)
+#define spinlock_lock(x)		preemption_disable()
+#define spinlock_trylock(x) 		(preemption_disable(), 1)
+#define spinlock_unlock(x)		preemption_enable()
 
 #endif
Index: src/synch/spinlock.c
===================================================================
--- src/synch/spinlock.c	(revision f9447155de20c5cfd68a01025fa1a2b19595bcdd)
+++ src/synch/spinlock.c	(revision c842f04b1c7925e69d92562d35a6a60a14223647)
@@ -32,4 +32,5 @@
 #include <arch/barrier.h>
 #include <synch/spinlock.h>
+#include <preemption.h>
 #include <print.h>
 
@@ -47,4 +48,5 @@
 	__address caller = ((__u32 *) &sl)[-1];
 
+	preemption_disable();
 	while (test_and_set(&sl->val)) {
 		if (i++ > 300000) {
@@ -59,4 +61,6 @@
 void spinlock_lock(spinlock_t *sl)
 {
+	preemption_disable();
+
 	/*
 	 * Each architecture has its own efficient/recommended
@@ -72,6 +76,10 @@
 	int rc;
 	
+	preemption_disable();
 	rc = !test_and_set(&sl->val);
 	CS_ENTER_BARRIER();
+
+	if (!rc)
+		preemption_enable();
 	
 	return rc;
@@ -82,4 +90,5 @@
 	CS_LEAVE_BARRIER();
 	sl->val = 0;
+	preemption_enable();
 }
 
