Module Name: src
Committed By: martin
Date: Sun May 23 19:54:17 UTC 2010
Modified Files:
src/sys/arch/sparc64/sparc64: copy.S
Log Message:
Add ucas_32 and ucas_64 functions - untested.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/sparc64/sparc64/copy.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/sparc64/copy.S
diff -u src/sys/arch/sparc64/sparc64/copy.S:1.1 src/sys/arch/sparc64/sparc64/copy.S:1.2
--- src/sys/arch/sparc64/sparc64/copy.S:1.1 Sun May 23 18:49:14 2010
+++ src/sys/arch/sparc64/sparc64/copy.S Sun May 23 19:54:17 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: copy.S,v 1.1 2010/05/23 18:49:14 martin Exp $ */
+/* $NetBSD: copy.S,v 1.2 2010/05/23 19:54:17 martin Exp $ */
/*
* Copyright (c) 2006-2010 Matthew R. Green
@@ -612,6 +612,64 @@
retl
wr %g0, ASI_PRIMARY_NOFAULT, %asi ! Restore ASI
+
+STRONG_ALIAS(ucas_int,ucas_32)
+#ifdef _LP64
+STRONG_ALIAS(ucas_ptr,ucas_64)
+#else
+STRONG_ALIAS(ucas_ptr,ucas_32)
+#endif
+
+/*
+ * Compare-and-swap the pointer in the user-space.
+ *
+ * int ucas_32(volatile int32_t *uptr, int32_t old, int32_t new, int32_t *ret);
+ */
+ENTRY(ucas_32)
+ sethi %hi(CPCB), %o4
+ wr %g0, ASI_AIUS, %asi
+ LDPTR [%o4 + %lo(CPCB)], %o4
+ set Lcopyfault, %o5 ! reusing copyin/copyout
+ membar #Sync ! fault handler
+ STPTR %o5, [%o4 + PCB_ONFAULT]
+
+ casa [%o0] %asi, %o1, %o2 ! cas, result in %o2
+
+ sethi %hi(CPCB), %o4
+ LDPTR [%o4 + %lo(CPCB)], %o4
+ membar #Sync
+ STPTR %g0, [%o4 + PCB_ONFAULT]
+ wr %g0, ASI_PRIMARY_NOFAULT, %asi ! Restore ASI
+ membar #StoreStore|#StoreLoad
+ stw %o2, [%o3] ! store the cas result in *result
+ retl
+ clr %o0 ! return 0
+
+/*
+ * Compare-and-swap the 64-bit integer in the user-space.
+ *
+ * int ucas_64(volatile int64_t *uptr, int64_t old, int64_t new, int64_t *ret);
+ */
+ENTRY(ucas_64)
+ sethi %hi(CPCB), %o4
+ wr %g0, ASI_AIUS, %asi
+ LDPTR [%o4 + %lo(CPCB)], %o4
+ set Lcopyfault, %o5 ! reusing copyin/copyout
+ membar #Sync ! fault handler
+ STPTR %o5, [%o4 + PCB_ONFAULT]
+
+ casxa [%o0] %asi, %o1, %o2 ! cas, result in %o2
+
+ sethi %hi(CPCB), %o4
+ LDPTR [%o4 + %lo(CPCB)], %o4
+ membar #Sync
+ STPTR %g0, [%o4 + PCB_ONFAULT]
+ wr %g0, ASI_PRIMARY_NOFAULT, %asi ! Restore ASI
+ membar #StoreStore|#StoreLoad
+ stx %o2, [%o3] ! store the cas result in *result
+ retl
+ clr %o0 ! return 0
+
/*
* {fu,su}{,i}{byte,word}
*/