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 dmb(); 11 12 if (!mmu_enabled()) { 13 lock->v = 1; 14 return; 15 } 16 17 do { 18 asm volatile( 19 "1: ldrex %0, [%2]\n" 20 " teq %0, #0\n" 21 " bne 1b\n" 22 " mov %0, #1\n" 23 " strex %1, %0, [%2]\n" 24 : "=&r" (val), "=&r" (fail) 25 : "r" (&lock->v) 26 : "cc" ); 27 } while (fail); 28 dmb(); 29 } 30 31 void spin_unlock(struct spinlock *lock) 32 { 33 lock->v = 0; 34 dmb(); 35 } 36