summaryrefslogtreecommitdiff
path: root/demo/lock.S
blob: 3ec276589fce7b2d0f581da88a98a1cd64fdfdd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
.global spin_init
spin_init:
	mov     r1, #0
	str     r1, [r0]
	mov     pc, lr

.global spin_lock
spin_lock:
	mrs     r2, cpsr
	str     r2, [r1]
	orr     r2, r2, #0xc0 @ Levanta I, F
	msr     cpsr_c, r2
	mov     r3, #1
1:	ldrex   r2, [r0]
	teq     r2, #0
	strexeq r2, r3, [r0]
	teqeq   r2, #0
	bne     1b
	mov     pc, lr

.global spin_unlock
spin_unlock:
	mov     r2, #0
	str     r2, [r0]
	msr     cpsr_c, r1
	mov     pc, lr