summaryrefslogtreecommitdiff
path: root/demo
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--demo/lock.S18
1 files changed, 11 insertions, 7 deletions
diff --git a/demo/lock.S b/demo/lock.S
index 3ec2765..120728b 100644
--- a/demo/lock.S
+++ b/demo/lock.S
@@ -11,13 +11,17 @@ spin_lock:
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
-
+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