Module Name: src
Committed By: matt
Date: Sun Mar 29 09:43:26 UTC 2015
Modified Files:
src/sys/arch/riscv/include: lock.h
Log Message:
Use C11 atomic builtins instead of __asm.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/riscv/include/lock.h
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/riscv/include/lock.h
diff -u src/sys/arch/riscv/include/lock.h:1.1 src/sys/arch/riscv/include/lock.h:1.2
--- src/sys/arch/riscv/include/lock.h:1.1 Fri Sep 19 17:36:26 2014
+++ src/sys/arch/riscv/include/lock.h Sun Mar 29 09:43:26 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lock.h,v 1.1 2014/09/19 17:36:26 matt Exp $ */
+/* $NetBSD: lock.h,v 1.2 2015/03/29 09:43:26 matt Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -50,75 +50,51 @@ __SIMPLELOCK_UNLOCKED_P(__cpu_simple_loc
static __inline void
__cpu_simple_lock_clear(__cpu_simple_lock_t *__ptr)
{
-#if 0
- __atomic_clear(__ptr, __ATOMIC_RELAXED);
-#else
+#if 1
*__ptr = __SIMPLELOCK_UNLOCKED;
+#else
+ __atomic_store_n(__ptr, __SIMPLELOCK_UNLOCKED, __ATOMIC_RELAXED);
#endif
}
static __inline void
__cpu_simple_lock_set(__cpu_simple_lock_t *__ptr)
{
-#if 0
- (void)__atomic_test_and_set(__ptr, __ATOMIC_RELAXED);
-#else
+#if 1
*__ptr = __SIMPLELOCK_LOCKED;
+#else
+ __atomic_store_n(__ptr, __SIMPLELOCK_LOCKED, __ATOMIC_RELAXED);
#endif
}
static __inline void __unused
__cpu_simple_lock_init(__cpu_simple_lock_t *__ptr)
{
-#if 0
- __atomic_clear(__ptr, __ATOMIC_RELAXED);
-#else
+#if 1
*__ptr = __SIMPLELOCK_UNLOCKED;
+#else
+ __atomic_store_n(__ptr, __SIMPLELOCK_UNLOCKED, __ATOMIC_RELAXED);
#endif
}
static __inline void __unused
__cpu_simple_lock(__cpu_simple_lock_t *__ptr)
{
-#if 0
- while (__atomic_test_and_set(__ptr, __ATOMIC_ACQUIRE)) {
+ while (__atomic_exchange_n(__ptr, __SIMPLELOCK_LOCKED, __ATOMIC_ACQUIRE) == __SIMPLELOCK_LOCKED) {
/* do nothing */
}
-#else
- int __tmp;
- __asm(
- "\n" "1:"
- "\n\t" "amoswap.w.aq %[__tmp], %[__newval], 0(%[__ptr])"
- "\n\t" "bnez %[__tmp], 1b"
- : [__tmp] "=&r" (__tmp)
- : [__newval] "r" (__SIMPLELOCK_LOCKED),
- [__ptr] "r" (__ptr));
-#endif
}
static __inline int __unused
__cpu_simple_lock_try(__cpu_simple_lock_t *__ptr)
{
-#if 0
- return !__atomic_test_and_set(__ptr, __ATOMIC_ACQUIRE);
-#else
- int __oldval;
- __asm( "amoswap.w.aq\t%[__oldval], %[__newval], 0(%[__ptr])"
- : [__oldval] "=r" (__oldval)
- : [__newval] "r" (__SIMPLELOCK_LOCKED),
- [__ptr] "r" (__ptr));
- return __oldval == __SIMPLELOCK_UNLOCKED;
-#endif
+ return __atomic_exchange_n(__ptr, __SIMPLELOCK_LOCKED, __ATOMIC_ACQUIRE) == __SIMPLELOCK_LOCKED;
}
static __inline void __unused
__cpu_simple_unlock(__cpu_simple_lock_t *__ptr)
{
-#if 0
- __atomic_clear(__ptr, __ATOMIC_RELEASE);
-#else
- __asm("amoswap.w.rl\tx0, x0, 0(%[__ptr])" :: [__ptr] "r" (__ptr));
-#endif
+ __atomic_store_n(__ptr, __SIMPLELOCK_UNLOCKED, __ATOMIC_RELEASE);
}
#endif /* _RISCV_LOCK_H_ */