summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/common
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2007-06-08 12:26:30 +0000
committerpjd <pjd@FreeBSD.org>2007-06-08 12:26:30 +0000
commitf25cc1ca4c9929dff27e1d0db4c78685b01657c9 (patch)
treec8531b7ae44c3ab563dfe8884e5ab76b841c6341 /sys/cddl/contrib/opensolaris/common
parent2e820ecea1f23a01a478cfd63092b1bf76e57b9c (diff)
downloadFreeBSD-src-f25cc1ca4c9929dff27e1d0db4c78685b01657c9.zip
FreeBSD-src-f25cc1ca4c9929dff27e1d0db4c78685b01657c9.tar.gz
Missing atomic operations for ZFS/ia64.
Submitted by: marcel
Diffstat (limited to 'sys/cddl/contrib/opensolaris/common')
-rw-r--r--sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S54
1 files changed, 54 insertions, 0 deletions
diff --git a/sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S b/sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S
new file mode 100644
index 0000000..827232b
--- /dev/null
+++ b/sys/cddl/contrib/opensolaris/common/atomic/ia64/atomic.S
@@ -0,0 +1,54 @@
+#include <machine/asm.h>
+
+ .text
+
+/*
+ * uint64_t atomic_cas_64(volatile uint64_t *p, uint64_t cmp, uint64_t v)
+ */
+ENTRY(atomic_cas_64, 3)
+ mov ar.ccv = r33
+ ;;
+ cmpxchg8.acq r8 = [r32], r34, ar.ccv
+ ;;
+ br.ret.sptk rp
+END(atomic_cas_64)
+
+/*
+ * uint64_t atomic_add_64_nv(volatile uint64_t *p, uint64_t v)
+ */
+ENTRY(atomic_add_64_nv, 2)
+1:
+ ld8 r16 = [r32]
+ ;;
+ mov ar.ccv = r16
+ add r8 = r16, r33
+ ;;
+ cmpxchg8.acq r17 = [r32], r8, ar.ccv
+ ;;
+ cmp.eq p6, p7 = r16, r17
+(p6) br.ret.sptk rp
+(p7) br.cond.spnt 1b
+END(atomic_add_64_nv)
+
+/*
+ * uint8_t atomic_or_8_nv(volatile uint8_t *p, uint8_t v)
+ */
+ENTRY(atomic_or_8_nv, 2)
+1:
+ ld8 r16 = [r32]
+ ;;
+ mov ar.ccv = r16
+ or r8 = r16, r33
+ ;;
+ cmpxchg1.acq r17 = [r32], r8, ar.ccv
+ ;;
+ cmp.eq p6, p7 = r16, r17
+(p6) br.ret.sptk rp
+(p7) br.cond.spnt 1b
+END(atomic_or_8_nv)
+
+ENTRY(membar_producer, 0)
+ mf.a
+ ;;
+ br.ret.sptk rp
+END(membar_producer)
OpenPOWER on IntegriCloud