xref: /openbsd-src/lib/libc/arch/mips64/gen/_atomic_lock.c (revision 7e321ac128fdcd388c62dfa54aca790ebbd73ce1)
1*7e321ac1Sguenther /*	$OpenBSD: _atomic_lock.c,v 1.1 2017/08/15 06:13:24 guenther Exp $	*/
2*7e321ac1Sguenther 
3*7e321ac1Sguenther /*
4*7e321ac1Sguenther  * Atomic lock for mips
5*7e321ac1Sguenther  * Written by Miodrag Vallat <miod@openbsd.org> - placed in the public domain.
6*7e321ac1Sguenther  */
7*7e321ac1Sguenther 
8*7e321ac1Sguenther #include <machine/spinlock.h>
9*7e321ac1Sguenther 
10*7e321ac1Sguenther int
_atomic_lock(volatile _atomic_lock_t * lock)11*7e321ac1Sguenther _atomic_lock(volatile _atomic_lock_t *lock)
12*7e321ac1Sguenther {
13*7e321ac1Sguenther 	_atomic_lock_t old;
14*7e321ac1Sguenther 
15*7e321ac1Sguenther 	__asm__ volatile (
16*7e321ac1Sguenther 	".set	noreorder\n"
17*7e321ac1Sguenther 	"1:	ll	%0,	0(%1)\n"
18*7e321ac1Sguenther 	"	sc	%2,	0(%1)\n"
19*7e321ac1Sguenther 	"	beqz	%2,	1b\n"
20*7e321ac1Sguenther 	"	 addi	%2,	$0, %3\n"
21*7e321ac1Sguenther 	".set	reorder\n"
22*7e321ac1Sguenther 		: "=&r"(old)
23*7e321ac1Sguenther 		: "r"(lock), "r"(_ATOMIC_LOCK_LOCKED), "i"(_ATOMIC_LOCK_LOCKED)
24*7e321ac1Sguenther 		: "memory");
25*7e321ac1Sguenther 
26*7e321ac1Sguenther 	return (old != _ATOMIC_LOCK_UNLOCKED);
27*7e321ac1Sguenther }
28