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