Index: kernel/generic/src/synch/spinlock.c
===================================================================
--- kernel/generic/src/synch/spinlock.c	(revision 0abc2aea144199fee5fb2b5b1ffcf9f0ac6528ce)
+++ kernel/generic/src/synch/spinlock.c	(revision 78de83de52a9115dc77b09bb7029403dad8c2fb0)
@@ -56,5 +56,5 @@
 void spinlock_initialize(spinlock_t *lock, const char *name)
 {
-	atomic_set(&lock->val, 0);
+	atomic_flag_clear_explicit(&lock->flag, memory_order_relaxed);
 #ifdef CONFIG_DEBUG_SPINLOCK
 	lock->name = name;
@@ -79,5 +79,5 @@
 
 	preemption_disable();
-	while (test_and_set(&lock->val)) {
+	while (atomic_flag_test_and_set_explicit(&lock->flag, memory_order_acquire)) {
 		/*
 		 * We need to be careful about particular locks
@@ -115,9 +115,4 @@
 	if (deadlock_reported)
 		printf("cpu%u: not deadlocked\n", CPU->id);
-
-	/*
-	 * Prevent critical section code from bleeding out this way up.
-	 */
-	CS_ENTER_BARRIER();
 }
 
@@ -132,10 +127,5 @@
 	ASSERT_SPINLOCK(spinlock_locked(lock), lock);
 
-	/*
-	 * Prevent critical section code from bleeding out this way down.
-	 */
-	CS_LEAVE_BARRIER();
-
-	atomic_set(&lock->val, 0);
+	atomic_flag_clear_explicit(&lock->flag, memory_order_release);
 	preemption_enable();
 }
@@ -156,10 +146,5 @@
 {
 	preemption_disable();
-	bool ret = !test_and_set(&lock->val);
-
-	/*
-	 * Prevent critical section code from bleeding out this way up.
-	 */
-	CS_ENTER_BARRIER();
+	bool ret = !atomic_flag_test_and_set_explicit(&lock->flag, memory_order_acquire);
 
 	if (!ret)
@@ -176,5 +161,13 @@
 bool spinlock_locked(spinlock_t *lock)
 {
-	return atomic_get(&lock->val) != 0;
+	// XXX: Atomic flag doesn't support simple atomic read (by design),
+	//      so instead we test_and_set and then clear if necessary.
+	//      This function is only used inside assert, so we don't need
+	//      any preemption_disable/enable here.
+
+	bool ret = atomic_flag_test_and_set_explicit(&lock->flag, memory_order_relaxed);
+	if (!ret)
+		atomic_flag_clear_explicit(&lock->flag, memory_order_relaxed);
+	return ret;
 }
 
