1 #include <libcflat.h> 2 #include <asm/spinlock.h> 3 #include <asm/barrier.h> 4 #include <asm/mmu.h> 5 6 void spin_lock(struct spinlock *lock) 7 { 8 u32 val, fail; 9 10 if (!mmu_enabled()) { 11 lock->v = 1; 12 smp_mb(); 13 return; 14 } 15 16 do { 17 asm volatile( 18 "1: ldrex %0, [%2]\n" 19 " teq %0, #0\n" 20 " bne 1b\n" 21 " mov %0, #1\n" 22 " strex %1, %0, [%2]\n" 23 : "=&r" (val), "=&r" (fail) 24 : "r" (&lock->v) 25 : "cc" ); 26 } while (fail); 27 28 smp_mb(); 29 } 30 31 void spin_unlock(struct spinlock *lock) 32 { 33 smp_mb(); 34 lock->v = 0; 35 } 36