xref: /aosp_15_r20/external/arm-trusted-firmware/lib/locks/exclusive/aarch32/spinlock.S (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park/*
2*54fd6939SJiyong Park * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park *
4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park */
6*54fd6939SJiyong Park
7*54fd6939SJiyong Park#include <asm_macros.S>
8*54fd6939SJiyong Park
9*54fd6939SJiyong Park	.globl	spin_lock
10*54fd6939SJiyong Park	.globl	spin_unlock
11*54fd6939SJiyong Park
12*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 0)
13*54fd6939SJiyong Park/*
14*54fd6939SJiyong Park * According to the ARMv8-A Architecture Reference Manual, "when the global
15*54fd6939SJiyong Park * monitor for a PE changes from Exclusive Access state to Open Access state,
16*54fd6939SJiyong Park * an event is generated.". This applies to both AArch32 and AArch64 modes of
17*54fd6939SJiyong Park * ARMv8-A. As a result, no explicit SEV with unlock is required.
18*54fd6939SJiyong Park */
19*54fd6939SJiyong Park#define COND_SEV()
20*54fd6939SJiyong Park#else
21*54fd6939SJiyong Park#define COND_SEV()	sev
22*54fd6939SJiyong Park#endif
23*54fd6939SJiyong Park
24*54fd6939SJiyong Parkfunc spin_lock
25*54fd6939SJiyong Park	mov	r2, #1
26*54fd6939SJiyong Park1:
27*54fd6939SJiyong Park	ldrex	r1, [r0]
28*54fd6939SJiyong Park	cmp	r1, #0
29*54fd6939SJiyong Park	wfene
30*54fd6939SJiyong Park	strexeq	r1, r2, [r0]
31*54fd6939SJiyong Park	cmpeq	r1, #0
32*54fd6939SJiyong Park	bne	1b
33*54fd6939SJiyong Park	dmb
34*54fd6939SJiyong Park	bx	lr
35*54fd6939SJiyong Parkendfunc spin_lock
36*54fd6939SJiyong Park
37*54fd6939SJiyong Park
38*54fd6939SJiyong Parkfunc spin_unlock
39*54fd6939SJiyong Park	mov	r1, #0
40*54fd6939SJiyong Park	stl	r1, [r0]
41*54fd6939SJiyong Park	COND_SEV()
42*54fd6939SJiyong Park	bx	lr
43*54fd6939SJiyong Parkendfunc spin_unlock
44