summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2014-03-27 10:24:41 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2014-03-27 10:24:41 +0000
commit4765a9879f097c62db1f6524a69875dbee6ee423 (patch)
tree07f763cda7374ad9af655b1f7b8a680613be811c
parent978f5503e18817525bb661b9f8c39025db8c88e9 (diff)
replace x86_atomic_cas_things with atomic_cas_foo equivalents.
ok kettenis@
-rw-r--r--sys/arch/amd64/amd64/acpi_machdep.c6
-rw-r--r--sys/arch/amd64/amd64/pmap.c8
-rw-r--r--sys/arch/amd64/include/atomic.h60
-rw-r--r--sys/arch/amd64/include/lock.h4
4 files changed, 46 insertions, 32 deletions
diff --git a/sys/arch/amd64/amd64/acpi_machdep.c b/sys/arch/amd64/amd64/acpi_machdep.c
index 76bd120b04a..ec4be74cfa7 100644
--- a/sys/arch/amd64/amd64/acpi_machdep.c
+++ b/sys/arch/amd64/amd64/acpi_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpi_machdep.c,v 1.58 2014/03/13 03:52:55 dlg Exp $ */
+/* $OpenBSD: acpi_machdep.c,v 1.59 2014/03/27 10:24:40 dlg Exp $ */
/*
* Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
*
@@ -183,7 +183,7 @@ acpi_acquire_glk(uint32_t *lock)
new = (old & ~GL_BIT_PENDING) | GL_BIT_OWNED;
if ((old & GL_BIT_OWNED) != 0)
new |= GL_BIT_PENDING;
- } while (x86_atomic_cas_int32(lock, old, new) != old);
+ } while (atomic_cas_uint(lock, old, new) != old);
return ((new & GL_BIT_PENDING) == 0);
}
@@ -201,7 +201,7 @@ acpi_release_glk(uint32_t *lock)
do {
old = *lock;
new = old & ~(GL_BIT_PENDING | GL_BIT_OWNED);
- } while (x86_atomic_cas_int32(lock, old, new) != old);
+ } while (atomic_cas_uint(lock, old, new) != old);
return ((old & GL_BIT_PENDING) != 0);
}
diff --git a/sys/arch/amd64/amd64/pmap.c b/sys/arch/amd64/amd64/pmap.c
index e5a2bbf3503..b35066d202f 100644
--- a/sys/arch/amd64/amd64/pmap.c
+++ b/sys/arch/amd64/amd64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.68 2014/03/07 16:56:57 guenther Exp $ */
+/* $OpenBSD: pmap.c,v 1.69 2014/03/27 10:24:40 dlg Exp $ */
/* $NetBSD: pmap.c,v 1.3 2003/05/08 18:13:13 thorpej Exp $ */
/*
@@ -2442,7 +2442,7 @@ pmap_tlb_shootpage(struct pmap *pm, vaddr_t va)
if (wait > 0) {
int s = splvm();
- while (x86_atomic_cas_ul(&tlb_shoot_wait, 0, wait) != 0) {
+ while (atomic_cas_ulong(&tlb_shoot_wait, 0, wait) != 0) {
while (tlb_shoot_wait != 0)
SPINLOCK_SPIN_HOOK;
}
@@ -2480,7 +2480,7 @@ pmap_tlb_shootrange(struct pmap *pm, vaddr_t sva, vaddr_t eva)
if (wait > 0) {
int s = splvm();
- while (x86_atomic_cas_ul(&tlb_shoot_wait, 0, wait) != 0) {
+ while (atomic_cas_ulong(&tlb_shoot_wait, 0, wait) != 0) {
while (tlb_shoot_wait != 0)
SPINLOCK_SPIN_HOOK;
}
@@ -2518,7 +2518,7 @@ pmap_tlb_shoottlb(void)
if (wait) {
int s = splvm();
- while (x86_atomic_cas_ul(&tlb_shoot_wait, 0, wait) != 0) {
+ while (atomic_cas_ulong(&tlb_shoot_wait, 0, wait) != 0) {
while (tlb_shoot_wait != 0)
SPINLOCK_SPIN_HOOK;
}
diff --git a/sys/arch/amd64/include/atomic.h b/sys/arch/amd64/include/atomic.h
index 200d042f9c1..55360123f0c 100644
--- a/sys/arch/amd64/include/atomic.h
+++ b/sys/arch/amd64/include/atomic.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: atomic.h,v 1.10 2014/02/17 10:01:32 dlg Exp $ */
+/* $OpenBSD: atomic.h,v 1.11 2014/03/27 10:24:40 dlg Exp $ */
/* $NetBSD: atomic.h,v 1.1 2003/04/26 18:39:37 fvdl Exp $ */
/*
@@ -55,6 +55,42 @@
#define LOCK
#endif
+static inline unsigned int
+_atomic_cas_uint(volatile unsigned int *p, unsigned int e, unsigned int n)
+{
+ __asm __volatile(LOCK " cmpxchgl %2, %1"
+ : "=a" (n), "=m" (*p)
+ : "r" (n), "a" (e), "m" (*p)
+ : "memory");
+
+ return (n);
+}
+#define atomic_cas_uint(_p, _e, _n) _atomic_cas_uint((_p), (_e), (_n))
+
+static inline unsigned long
+_atomic_cas_ulong(volatile unsigned long *p, unsigned long e, unsigned long n)
+{
+ __asm __volatile(LOCK " cmpxchgq %2, %1"
+ : "=a" (n), "=m" (*p)
+ : "r" (n), "a" (e), "m" (*p)
+ : "memory");
+
+ return (n);
+}
+#define atomic_cas_ulong(_p, _e, _n) _atomic_cas_ulong((_p), (_e), (_n))
+
+static inline void *
+_atomic_cas_ptr(volatile void **p, void *e, void *n)
+{
+ __asm __volatile(LOCK " cmpxchgq %2, %1"
+ : "=a" (n), "=m" (*p)
+ : "r" (n), "a" (e), "m" (*p)
+ : "memory");
+
+ return (n);
+}
+#define atomic_cas_ptr(_p, _e, _n) _atomic_cas_ptr((_p), (_e), (_n))
+
static __inline u_int64_t
x86_atomic_testset_u64(volatile u_int64_t *ptr, u_int64_t val)
{
@@ -82,28 +118,6 @@ x86_atomic_clearbits_u32(volatile u_int32_t *ptr, u_int32_t bits)
__asm __volatile(LOCK " andl %1,%0" : "=m" (*ptr) : "ir" (~bits));
}
-static __inline int
-x86_atomic_cas_int32(volatile int32_t *ptr, int32_t expect, int32_t set)
-{
- int res;
-
- __asm volatile(LOCK " cmpxchgl %2, %1" : "=a" (res), "=m" (*ptr)
- : "r" (set), "a" (expect), "m" (*ptr) : "memory");
-
- return (res);
-}
-
-static __inline u_long
-x86_atomic_cas_ul(volatile u_long *ptr, u_long expect, u_long set)
-{
- u_long res;
-
- __asm volatile(LOCK " cmpxchgq %2, %1" : "=a" (res), "=m" (*ptr)
- : "r" (set), "a" (expect), "m" (*ptr) : "memory");
-
- return (res);
-}
-
/*
* XXX XXX XXX
* theoretically 64bit cannot be used as
diff --git a/sys/arch/amd64/include/lock.h b/sys/arch/amd64/include/lock.h
index ec38788f12c..2f63ae4b833 100644
--- a/sys/arch/amd64/include/lock.h
+++ b/sys/arch/amd64/include/lock.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: lock.h,v 1.7 2013/05/21 20:05:30 tedu Exp $ */
+/* $OpenBSD: lock.h,v 1.8 2014/03/27 10:24:40 dlg Exp $ */
/* $NetBSD: lock.h,v 1.1.2.2 2000/05/03 14:40:55 sommerfeld Exp $ */
/*-
@@ -50,6 +50,6 @@
#include <machine/atomic.h>
-#define rw_cas(p, o, n) (x86_atomic_cas_ul(p, o, n) != o)
+#define rw_cas(p, o, n) (atomic_cas_ulong(p, o, n) != o)
#endif /* _MACHINE_LOCK_H_ */