summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/sparc64/include/atomic.h55
1 files changed, 45 insertions, 10 deletions
diff --git a/sys/arch/sparc64/include/atomic.h b/sys/arch/sparc64/include/atomic.h
index 74206a35bb3..519b5babefc 100644
--- a/sys/arch/sparc64/include/atomic.h
+++ b/sys/arch/sparc64/include/atomic.h
@@ -1,23 +1,58 @@
-/* $OpenBSD: atomic.h,v 1.2 2007/02/19 17:18:43 deraadt Exp $ */
+/* $OpenBSD: atomic.h,v 1.3 2007/03/13 08:34:03 art Exp $ */
+/*
+ * Copyright (c) 2007 Artur Grabowski <art@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
-/* Public Domain */
-
-#ifndef __SPARC64_ATOMIC_H__
-#define __SPARC64_ATOMIC_H__
+#ifndef _SPARC64_ATOMIC_H_
+#define _SPARC64_ATOMIC_H_
#if defined(_KERNEL)
+static __inline unsigned int
+sparc64_casa(volatile unsigned int *uip, unsigned int expect, unsigned int new)
+{
+ __asm __volatile("casa [%2] %3, %4, %0"
+ : "+r" (new), "=m" (*uip)
+ : "r" (uip), "n" (ASI_N), "r" (expect), "m" (*uip));
+
+ return (new);
+}
+
static __inline void
-atomic_setbits_int(__volatile unsigned int *uip, unsigned int v)
+atomic_setbits_int(volatile unsigned int *uip, unsigned int v)
{
- *uip |= v;
+ volatile unsigned int e, r;
+
+ r = *uip;
+ do {
+ e = r;
+ r = sparc64_casa(uip, e, e | v);
+ } while (r != e);
}
static __inline void
-atomic_clearbits_int(__volatile unsigned int *uip, unsigned int v)
+atomic_clearbits_int(volatile unsigned int *uip, unsigned int v)
{
- *uip &= ~v;
+ volatile unsigned int e, r;
+
+ r = *uip;
+ do {
+ e = r;
+ r = sparc64_casa(uip, e, e & ~v);
+ } while (r != e);
}
#endif /* defined(_KERNEL) */
-#endif /* __SPARC64_ATOMIC_H__ */
+#endif /* _SPARC64_ATOMIC_H_ */