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