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 bringa 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
|