summaryrefslogtreecommitdiffstats
path: root/sys/arm/include
diff options
context:
space:
mode:
authormmel <mmel@FreeBSD.org>2016-11-05 04:36:12 +0000
committermmel <mmel@FreeBSD.org>2016-11-05 04:36:12 +0000
commita498231f427054a2261b8d3b6b8943a40e35127d (patch)
treebca6758c7fba32d6f3d8b8ed00618aecce7eaad3 /sys/arm/include
parent448c6f9c78f1869e20237a895d1b69ec74e0a797 (diff)
downloadFreeBSD-src-a498231f427054a2261b8d3b6b8943a40e35127d.zip
FreeBSD-src-a498231f427054a2261b8d3b6b8943a40e35127d.tar.gz
MFC r306667,r306668:
r306667: ARM: Add atomic_swap_64(). It's need by linuxkpi and drm-next-4.7. r306668: ARM: Add mising early clobber modifier in atomic_swap_32().
Diffstat (limited to 'sys/arm/include')
-rw-r--r--sys/arm/include/atomic-v6.h22
1 files changed, 21 insertions, 1 deletions
diff --git a/sys/arm/include/atomic-v6.h b/sys/arm/include/atomic-v6.h
index 06cb507..507a1d081 100644
--- a/sys/arm/include/atomic-v6.h
+++ b/sys/arm/include/atomic-v6.h
@@ -652,7 +652,7 @@ atomic_swap_32(volatile uint32_t *p, uint32_t v)
" teq %[exf], #0 \n"
" it ne \n"
" bne 1b \n"
- : [ret] "=r" (ret),
+ : [ret] "=&r" (ret),
[exf] "=&r" (exflag)
: [val] "r" (v),
[ptr] "r" (p)
@@ -660,6 +660,26 @@ atomic_swap_32(volatile uint32_t *p, uint32_t v)
return (ret);
}
+static __inline uint64_t
+atomic_swap_64(volatile uint64_t *p, uint64_t v)
+{
+ uint64_t ret;
+ uint32_t exflag;
+
+ __asm __volatile(
+ "1: ldrexd %Q[ret], %R[ret], [%[ptr]] \n"
+ " strexd %[exf], %Q[val], %R[val], [%[ptr]] \n"
+ " teq %[exf], #0 \n"
+ " it ne \n"
+ " bne 1b \n"
+ : [ret] "=&r" (ret),
+ [exf] "=&r" (exflag)
+ : [val] "r" (v),
+ [ptr] "r" (p)
+ : "cc", "memory");
+ return (ret);
+}
+
#undef ATOMIC_ACQ_REL
#undef ATOMIC_ACQ_REL_LONG
OpenPOWER on IntegriCloud