Author: marius
Date: Tue Nov 27 12:31:58 2018
New Revision: 341039
URL: https://svnweb.freebsd.org/changeset/base/341039

Log:
  Import CK as of 21d3e319407d19dece16ee317c757ffc54a452bc, which makes its
  sparcv9 atomics compatible with the FreeBSD kernel by using instructions
  which access the appropriate address space.

Modified:
  vendor-sys/ck/dist/include/gcc/sparcv9/ck_pr.h

Modified: vendor-sys/ck/dist/include/gcc/sparcv9/ck_pr.h
==============================================================================
--- vendor-sys/ck/dist/include/gcc/sparcv9/ck_pr.h      Tue Nov 27 12:23:01 
2018        (r341038)
+++ vendor-sys/ck/dist/include/gcc/sparcv9/ck_pr.h      Tue Nov 27 12:31:58 
2018        (r341039)
@@ -136,11 +136,26 @@ CK_PR_STORE_S(int, int, "stsw")
 #undef CK_PR_STORE_S
 #undef CK_PR_STORE
 
+/* Use the appropriate address space for atomics within the FreeBSD kernel. */
+#if defined(__FreeBSD__) && defined(_KERNEL)
+#include <sys/cdefs.h>
+#include <machine/atomic.h>
+#define CK_PR_INS_CAS "casa"
+#define CK_PR_INS_CASX "casxa"
+#define CK_PR_INS_SWAP "swapa"
+#define CK_PR_ASI_ATOMIC __XSTRING(__ASI_ATOMIC)
+#else
+#define CK_PR_INS_CAS "cas"
+#define CK_PR_INS_CASX "casx"
+#define CK_PR_INS_SWAP "swap"
+#define CK_PR_ASI_ATOMIC ""
+#endif
+
 CK_CC_INLINE static bool
 ck_pr_cas_64_value(uint64_t *target, uint64_t compare, uint64_t set, uint64_t 
*value)
 {
 
-       __asm__ __volatile__("casx [%1], %2, %0"
+       __asm__ __volatile__(CK_PR_INS_CASX " [%1] " CK_PR_ASI_ATOMIC ", %2, %0"
                                : "+&r" (set)
                                : "r"   (target),
                                  "r"   (compare)
@@ -154,7 +169,7 @@ CK_CC_INLINE static bool
 ck_pr_cas_64(uint64_t *target, uint64_t compare, uint64_t set)
 {
 
-       __asm__ __volatile__("casx [%1], %2, %0"
+       __asm__ __volatile__(CK_PR_INS_CASX " [%1] " CK_PR_ASI_ATOMIC ", %2, %0"
                                : "+&r" (set)
                                : "r" (target),
                                  "r" (compare)
@@ -181,7 +196,7 @@ ck_pr_cas_ptr_value(void *target, void *compare, void 
        CK_CC_INLINE static bool                                        \
        ck_pr_cas_##N##_value(T *target, T compare, T set, T *value)    \
        {                                                               \
-               __asm__ __volatile__("cas [%1], %2, %0"                 \
+               __asm__ __volatile__(CK_PR_INS_CAS " [%1] " CK_PR_ASI_ATOMIC ", 
%2, %0" \
                                        : "+&r" (set)                   \
                                        : "r"   (target),               \
                                          "r"   (compare)               \
@@ -192,7 +207,7 @@ ck_pr_cas_ptr_value(void *target, void *compare, void 
        CK_CC_INLINE static bool                                        \
        ck_pr_cas_##N(T *target, T compare, T set)                      \
        {                                                               \
-               __asm__ __volatile__("cas [%1], %2, %0"                 \
+               __asm__ __volatile__(CK_PR_INS_CAS " [%1] " CK_PR_ASI_ATOMIC ", 
%2, %0" \
                                        : "+&r" (set)                   \
                                        : "r" (target),                 \
                                          "r" (compare)                 \
@@ -211,7 +226,7 @@ CK_PR_CAS(int, int)
        ck_pr_fas_##N(T *target, T update)                      \
        {                                                       \
                                                                \
-               __asm__ __volatile__("swap [%1], %0"            \
+               __asm__ __volatile__(CK_PR_INS_SWAP " [%1] " CK_PR_ASI_ATOMIC 
", %0"            \
                                        : "+&r" (update)        \
                                        : "r"   (target)        \
                                        : "memory");            \
@@ -223,6 +238,11 @@ CK_PR_FAS(uint, unsigned int)
 CK_PR_FAS(32, uint32_t)
 
 #undef CK_PR_FAS
+
+#undef CK_PR_INS_CAS
+#undef CK_PR_INS_CASX
+#undef CK_PR_INS_SWAP
+#undef CK_PR_ASI_ATOMIC
 
 #endif /* CK_PR_SPARCV9_H */
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to