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