summaryrefslogtreecommitdiff
path: root/demo/lock.S
blob: 51805f2b6dea843fd0b33cc36daba9bc46b1d1bd (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
27
28
29
30
.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]				@ se carga el valor del lock
	teq     r2, #0					@ se revisa si el valor del lock, si es 1, se brinca al jump
	strexeq r2, r3, [r0]			@ trata de guardar r3 en r0, pero solo si el monitor se lo permite
	teqeq   r2, #0					@ revisa si en efecto se hizo el store o no
	bne     1b						@ regresa al inicio
	mov     pc, lr					@ retorna de la función
									@ 
									@ la implicación de esto es que si dos
									@  cores intentan hacer accesar al mismo
									@  recurso, el monitor solo va a dejar a uno
									@  de ellos hacerlo
.global spin_unlock
spin_unlock:
	mov     r2, #0
	str     r2, [r0]
	msr     cpsr_c, r1
	mov     pc, lr