/* | |
* Copyright (c) 2016, Arm Limited and Contributors. All rights reserved. | |
* | |
* SPDX-License-Identifier: BSD-3-Clause | |
*/ | |
#include <asm_macros.S> | |
.globl spin_lock | |
.globl spin_unlock | |
#if ARM_ARCH_AT_LEAST(8, 0) | |
/* | |
* According to the ARMv8-A Architecture Reference Manual, "when the global | |
* monitor for a PE changes from Exclusive Access state to Open Access state, | |
* an event is generated.". This applies to both AArch32 and AArch64 modes of | |
* ARMv8-A. As a result, no explicit SEV with unlock is required. | |
*/ | |
#define COND_SEV() | |
#else | |
#define COND_SEV() sev | |
#endif | |
func spin_lock | |
mov r2, #1 | |
1: | |
ldrex r1, [r0] | |
cmp r1, #0 | |
wfene | |
strexeq r1, r2, [r0] | |
cmpeq r1, #0 | |
bne 1b | |
dmb | |
bx lr | |
endfunc spin_lock | |
func spin_unlock | |
mov r1, #0 | |
stl r1, [r0] | |
COND_SEV() | |
bx lr | |
endfunc spin_unlock |