diff options
author | tmm <tmm@FreeBSD.org> | 2003-01-05 22:23:11 +0000 |
---|---|---|
committer | tmm <tmm@FreeBSD.org> | 2003-01-05 22:23:11 +0000 |
commit | 7089000c6ca3697d08856b96bbe0f65eb943e9f5 (patch) | |
tree | 788871a0d4c7ba3cdddfb558c28fc40721b0c89d /lib | |
parent | 6e68a2b1ca0c29fc620a29364a84c465b0d72314 (diff) | |
download | FreeBSD-src-7089000c6ca3697d08856b96bbe0f65eb943e9f5.zip FreeBSD-src-7089000c6ca3697d08856b96bbe0f65eb943e9f5.tar.gz |
Add an implementation of _atomic_lock for sparc64. This was submitted by
des; I tweaked it slightly by extending the membar and making it match
the style of the rest of the sparc64 assembler code.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc_r/arch/sparc64/_atomic_lock.S | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/libc_r/arch/sparc64/_atomic_lock.S b/lib/libc_r/arch/sparc64/_atomic_lock.S new file mode 100644 index 0000000..ce931df --- /dev/null +++ b/lib/libc_r/arch/sparc64/_atomic_lock.S @@ -0,0 +1,45 @@ +/*- + * Copyright (c) 2002 Dag-Erling Coïdan Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <machine/asm.h> + +__FBSDID("$FreeBSD$"); + +/* + * long _atomic_lock(long *) + * + * Atomically acquire a lock by storing a non-zero value in its + * location, provided it is not already locked. Note that we only use + * the first byte of the location provided. + */ +ENTRY(_atomic_lock) + ldstub [%o0], %o1 + membar #LoadLoad | #StoreStore + retl + mov %o1, %o0 +END(_atomic_lock) |