diff options
author | 1998-11-20 11:15:35 +0000 | |
---|---|---|
committer | 1998-11-20 11:15:35 +0000 | |
commit | ea03e63fbd0d2b427542c2481ae506ce9e278791 (patch) | |
tree | 6a43235671adbd8289e0d0a14275441a0d653748 /lib/libpthread/arch/i386/_atomic_lock.c | |
parent | fix strcat usage; deraadt (diff) | |
download | wireguard-openbsd-ea03e63fbd0d2b427542c2481ae506ce9e278791.tar.xz wireguard-openbsd-ea03e63fbd0d2b427542c2481ae506ce9e278791.zip |
Move atomic_lock code from asm to C with inline asm;
Add m68k, mips and sparc. (needs more careful checking)
Add 'slow_atomic_lock' for crippled archs.
Diffstat (limited to 'lib/libpthread/arch/i386/_atomic_lock.c')
-rw-r--r-- | lib/libpthread/arch/i386/_atomic_lock.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/libpthread/arch/i386/_atomic_lock.c b/lib/libpthread/arch/i386/_atomic_lock.c new file mode 100644 index 00000000000..609dc42fb01 --- /dev/null +++ b/lib/libpthread/arch/i386/_atomic_lock.c @@ -0,0 +1,26 @@ +/* $OpenBSD: _atomic_lock.c,v 1.1 1998/11/20 11:15:36 d Exp $ */ +/* + * Atomic lock aquire for i386. + */ + +#include "spinlock.h" + +register_t +_atomic_lock(volatile register_t *lock) +{ + register_t old; + + /* + * Use the eXCHanGe instruction to swap the lock value with + * a local variable containg '1' (the locked state). + */ + old = 1; + __asm__("xchg %0, %1" + : "=r" (old), "=m" (*lock) : "0"(old), "1" (*lock) ); + /* + * So now there is a 1 in *lock and 'old' contains what + * used to be in the lock. We return 0 if the lock was acquired, + * (ie its old value was 0) or 1 otherwise. + */ + return old; +} |