12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- /*
- * 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
|