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