xref: /kvm-unit-tests/lib/arm/spinlock.c (revision d3aacb4f57d05f74f2030dbe12e7dfd6aa1b273d)
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