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