diff options
author | mmel <mmel@FreeBSD.org> | 2016-11-05 04:36:12 +0000 |
---|---|---|
committer | mmel <mmel@FreeBSD.org> | 2016-11-05 04:36:12 +0000 |
commit | a498231f427054a2261b8d3b6b8943a40e35127d (patch) | |
tree | bca6758c7fba32d6f3d8b8ed00618aecce7eaad3 /sys/arm/include | |
parent | 448c6f9c78f1869e20237a895d1b69ec74e0a797 (diff) | |
download | FreeBSD-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.h | 22 |
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 |