blob: 7d681c84e85b6bad1a4fb61b63976ca513fb2219 [file] [log] [blame]
MODULE ?mutex
//// Forward declaration of sections.
SECTION IRQ_STACK:DATA:NOROOT(2)
SECTION CSTACK:DATA:NOROOT(3)
#define LOCKED 0x1
#define FREE 0x0
#define SUCCESS 0x1
#define FAILURE 0x0
/* try to lock mutex */
SECTION .mutex_try_lock:CODE:NOROOT(2)
PUBLIC mutex_try_lock
mutex_try_lock:
push {r1,r2,r3}
mov r1, #LOCKED
mov r3, #SUCCESS
ldrex r2, [r0]
cmp r2, r1 /* Test if mutex is locked or unlocked */
moveq r3, #FAILURE /* If locked */
beq lbl1 /* return failure */
strexne r2, r1, [r0] /* Not locked, attempt to lock it */
cmp r2, #LOCKED /* Check if Store-Exclusive failed */
movne r3, #FAILURE /* If failed - return failure */
lbl1:
dmb /* Required before accessing protected resource */
mov r0, r3
pop {r1,r2,r3}
bx lr
/* free mutex */
SECTION .mutex_free:CODE:NOROOT(2)
PUBLIC mutex_free
mutex_free:
push {r1}
mov r1, #FREE
dmb /* Required before releasing protected resource */
str r1, [r0] /* Unlock mutex */
pop {r1}
bx lr
/* Check if mutex is locked or not */
SECTION .mutex_is_locked:CODE:NOROOT(2)
PUBLIC mutex_is_locked
mutex_is_locked:
push {r1, r2}
mov r1, #LOCKED
ldrex r2, [r0]
cmp r2, r1 /* Test if mutex is locked or unlocked */
moveq r0, #SUCCESS
movne r0, #FAILURE
pop {r1, r2}
bx lr
END