Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm/include/atomic-v6.h
Show First 20 Lines • Show All 203 Lines • ▼ Show 20 Lines | __asm __volatile( | ||||
" it eq \n" | " it eq \n" | ||||
" strexeq %0, %4, [%2] \n" | " strexeq %0, %4, [%2] \n" | ||||
: "=&r" (ret), "=&r" (tmp), "+r" (p), "+r" (_cmpval), "+r" (newval) | : "=&r" (ret), "=&r" (tmp), "+r" (p), "+r" (_cmpval), "+r" (newval) | ||||
: : "cc", "memory"); | : : "cc", "memory"); | ||||
*cmpval = tmp; | *cmpval = tmp; | ||||
return (!ret); | return (!ret); | ||||
} | } | ||||
static __inline uint64_t | static __inline int | ||||
atomic_fcmpset_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) | atomic_fcmpset_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) | ||||
{ | { | ||||
uint64_t tmp; | uint64_t tmp; | ||||
uint64_t _cmpval = *cmpval; | uint64_t _cmpval = *cmpval; | ||||
int ret; | int ret; | ||||
__asm __volatile( | __asm __volatile( | ||||
"1: mov %[ret], #1 \n" | "1: mov %[ret], #1 \n" | ||||
Show All 9 Lines | __asm __volatile( | ||||
: [ptr] "r" (p), | : [ptr] "r" (p), | ||||
[_cmpval] "r" (_cmpval), | [_cmpval] "r" (_cmpval), | ||||
[newval] "r" (newval) | [newval] "r" (newval) | ||||
: "cc", "memory"); | : "cc", "memory"); | ||||
*cmpval = tmp; | *cmpval = tmp; | ||||
return (!ret); | return (!ret); | ||||
} | } | ||||
static __inline u_long | static __inline int | ||||
atomic_fcmpset_long(volatile u_long *p, u_long *cmpval, u_long newval) | atomic_fcmpset_long(volatile u_long *p, u_long *cmpval, u_long newval) | ||||
{ | { | ||||
return (atomic_fcmpset_32((volatile uint32_t *)p, | return (atomic_fcmpset_32((volatile uint32_t *)p, | ||||
(uint32_t *)cmpval, newval)); | (uint32_t *)cmpval, newval)); | ||||
} | } | ||||
static __inline uint64_t | static __inline int | ||||
atomic_fcmpset_acq_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) | atomic_fcmpset_acq_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) | ||||
{ | { | ||||
uint64_t ret; | int ret; | ||||
ret = atomic_fcmpset_64(p, cmpval, newval); | ret = atomic_fcmpset_64(p, cmpval, newval); | ||||
dmb(); | dmb(); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static __inline u_long | static __inline int | ||||
atomic_fcmpset_acq_long(volatile u_long *p, u_long *cmpval, u_long newval) | atomic_fcmpset_acq_long(volatile u_long *p, u_long *cmpval, u_long newval) | ||||
{ | { | ||||
u_long ret; | int ret; | ||||
ret = atomic_fcmpset_long(p, cmpval, newval); | ret = atomic_fcmpset_long(p, cmpval, newval); | ||||
dmb(); | dmb(); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static __inline uint32_t | static __inline int | ||||
atomic_fcmpset_acq_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) | atomic_fcmpset_acq_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) | ||||
{ | { | ||||
uint32_t ret; | int ret; | ||||
ret = atomic_fcmpset_32(p, cmpval, newval); | ret = atomic_fcmpset_32(p, cmpval, newval); | ||||
dmb(); | dmb(); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static __inline uint32_t | static __inline int | ||||
atomic_fcmpset_rel_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) | atomic_fcmpset_rel_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) | ||||
{ | { | ||||
dmb(); | dmb(); | ||||
return (atomic_fcmpset_32(p, cmpval, newval)); | return (atomic_fcmpset_32(p, cmpval, newval)); | ||||
} | } | ||||
static __inline uint64_t | static __inline int | ||||
atomic_fcmpset_rel_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) | atomic_fcmpset_rel_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) | ||||
{ | { | ||||
dmb(); | dmb(); | ||||
return (atomic_fcmpset_64(p, cmpval, newval)); | return (atomic_fcmpset_64(p, cmpval, newval)); | ||||
} | } | ||||
static __inline u_long | static __inline int | ||||
atomic_fcmpset_rel_long(volatile u_long *p, u_long *cmpval, u_long newval) | atomic_fcmpset_rel_long(volatile u_long *p, u_long *cmpval, u_long newval) | ||||
{ | { | ||||
dmb(); | dmb(); | ||||
return (atomic_fcmpset_long(p, cmpval, newval)); | return (atomic_fcmpset_long(p, cmpval, newval)); | ||||
} | } | ||||
static __inline uint32_t | static __inline int | ||||
atomic_cmpset_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) | atomic_cmpset_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) | ||||
{ | { | ||||
uint32_t ret; | int ret; | ||||
__asm __volatile( | __asm __volatile( | ||||
"1: ldrex %0, [%1] \n" | "1: ldrex %0, [%1] \n" | ||||
" cmp %0, %2 \n" | " cmp %0, %2 \n" | ||||
" itt ne \n" | " itt ne \n" | ||||
" movne %0, #0 \n" | " movne %0, #0 \n" | ||||
" bne 2f \n" | " bne 2f \n" | ||||
" strex %0, %3, [%1] \n" | " strex %0, %3, [%1] \n" | ||||
Show All 31 Lines | __asm __volatile( | ||||
[tmp] "=&r" (tmp) | [tmp] "=&r" (tmp) | ||||
: [ptr] "r" (p), | : [ptr] "r" (p), | ||||
[cmpval] "r" (cmpval), | [cmpval] "r" (cmpval), | ||||
[newval] "r" (newval) | [newval] "r" (newval) | ||||
: "cc", "memory"); | : "cc", "memory"); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static __inline u_long | static __inline int | ||||
atomic_cmpset_long(volatile u_long *p, u_long cmpval, u_long newval) | atomic_cmpset_long(volatile u_long *p, u_long cmpval, u_long newval) | ||||
{ | { | ||||
return (atomic_cmpset_32((volatile uint32_t *)p, cmpval, newval)); | return (atomic_cmpset_32((volatile uint32_t *)p, cmpval, newval)); | ||||
} | } | ||||
static __inline uint32_t | static __inline int | ||||
atomic_cmpset_acq_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) | atomic_cmpset_acq_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) | ||||
{ | { | ||||
uint32_t ret; | int ret; | ||||
ret = atomic_cmpset_32(p, cmpval, newval); | ret = atomic_cmpset_32(p, cmpval, newval); | ||||
dmb(); | dmb(); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static __inline uint64_t | static __inline int | ||||
atomic_cmpset_acq_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) | atomic_cmpset_acq_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) | ||||
{ | { | ||||
uint64_t ret; | int ret; | ||||
ret = atomic_cmpset_64(p, cmpval, newval); | ret = atomic_cmpset_64(p, cmpval, newval); | ||||
dmb(); | dmb(); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static __inline u_long | static __inline int | ||||
atomic_cmpset_acq_long(volatile u_long *p, u_long cmpval, u_long newval) | atomic_cmpset_acq_long(volatile u_long *p, u_long cmpval, u_long newval) | ||||
{ | { | ||||
u_long ret; | int ret; | ||||
ret = atomic_cmpset_long(p, cmpval, newval); | ret = atomic_cmpset_long(p, cmpval, newval); | ||||
dmb(); | dmb(); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static __inline uint32_t | static __inline int | ||||
atomic_cmpset_rel_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) | atomic_cmpset_rel_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) | ||||
{ | { | ||||
dmb(); | dmb(); | ||||
return (atomic_cmpset_32(p, cmpval, newval)); | return (atomic_cmpset_32(p, cmpval, newval)); | ||||
} | } | ||||
static __inline uint64_t | static __inline int | ||||
atomic_cmpset_rel_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) | atomic_cmpset_rel_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) | ||||
{ | { | ||||
dmb(); | dmb(); | ||||
return (atomic_cmpset_64(p, cmpval, newval)); | return (atomic_cmpset_64(p, cmpval, newval)); | ||||
} | } | ||||
static __inline u_long | static __inline int | ||||
atomic_cmpset_rel_long(volatile u_long *p, u_long cmpval, u_long newval) | atomic_cmpset_rel_long(volatile u_long *p, u_long cmpval, u_long newval) | ||||
{ | { | ||||
dmb(); | dmb(); | ||||
return (atomic_cmpset_long(p, cmpval, newval)); | return (atomic_cmpset_long(p, cmpval, newval)); | ||||
} | } | ||||
static __inline uint32_t | static __inline uint32_t | ||||
▲ Show 20 Lines • Show All 409 Lines • Show Last 20 Lines |