6#ifndef ZEPHYR_INCLUDE_ATOMIC_XTENSA_H_
7#define ZEPHYR_INCLUDE_ATOMIC_XTENSA_H_
11#include <xtensa/config/core-isa.h>
30 __asm__
volatile(
"l32ai %0, %1, 0"
31 :
"=r"(ret) :
"r"(target) :
"memory");
48#if XCHAL_HAVE_EXCLUSIVE || defined(__DOXYGEN__)
63 __asm__
volatile(
"l32ex %0, %1" :
"=r"(mem_val) :
"r"(addr));
65 if (mem_val == oldval) {
68 __asm__
volatile(
"s32ex %1, %2; getex %0" :
"=r"(result),
"+r"(v) :
"r"(addr));
74 return (result == 1U) ? oldval : newval;
85#elif XCHAL_HAVE_S32C1I
98 __asm__
volatile(
"wsr %1, SCOMPARE1; s32c1i %0, %2, 0"
99 :
"+r"(newval),
"+r"(oldval) :
"r"(addr) :
"memory");
105#error "No available hardware support for atomic operations"
112 return oldval ==
xtensa_cas(target, oldval, newval);
129#define Z__GEN_ATOMXCHG(expr) ({ \
130 atomic_val_t res, cur; \
133 res = xtensa_cas(target, cur, (expr)); \
134 } while (res != cur); \
141 return Z__GEN_ATOMXCHG(value);
148 return Z__GEN_ATOMXCHG(cur + value);
155 return Z__GEN_ATOMXCHG(cur - value);
162 return Z__GEN_ATOMXCHG(cur + 1);
169 return Z__GEN_ATOMXCHG(cur - 1);
176 return Z__GEN_ATOMXCHG(cur | value);
183 return Z__GEN_ATOMXCHG(cur ^ value);
190 return Z__GEN_ATOMXCHG(cur & value);
197 return Z__GEN_ATOMXCHG(~(cur & value));
static ALWAYS_INLINE void * atomic_ptr_set(atomic_ptr_t *target, void *value)
Implementation of atomic_ptr_set.
Definition atomic_xtensa.h:207
static ALWAYS_INLINE atomic_val_t atomic_inc(atomic_t *target)
Implementation of atomic_inc.
Definition atomic_xtensa.h:160
static ALWAYS_INLINE atomic_val_t atomic_and(atomic_t *target, atomic_val_t value)
Implementation of atomic_and.
Definition atomic_xtensa.h:187
static ALWAYS_INLINE atomic_val_t xtensa_cas(atomic_t *addr, atomic_val_t oldval, atomic_val_t newval)
Xtensa specific atomic compare-and-set (CAS).
Definition atomic_xtensa.h:56
static ALWAYS_INLINE atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value)
Implementation of atomic_sub.
Definition atomic_xtensa.h:153
static ALWAYS_INLINE atomic_val_t atomic_set(atomic_t *target, atomic_val_t value)
Implementation of atomic_set.
Definition atomic_xtensa.h:139
static ALWAYS_INLINE void * atomic_ptr_get(const atomic_ptr_t *target)
Implementation of atomic_ptr_get.
Definition atomic_xtensa.h:201
static ALWAYS_INLINE bool atomic_cas(atomic_t *target, atomic_val_t oldval, atomic_val_t newval)
Implementation of atomic_cas.
Definition atomic_xtensa.h:110
static ALWAYS_INLINE atomic_val_t atomic_get(const atomic_t *target)
Implementation of atomic_get.
Definition atomic_xtensa.h:20
static ALWAYS_INLINE atomic_val_t atomic_add(atomic_t *target, atomic_val_t value)
Implementation of atomic_add.
Definition atomic_xtensa.h:146
static ALWAYS_INLINE atomic_val_t atomic_clear(atomic_t *target)
Implementation of atomic_clear.
Definition atomic_xtensa.h:213
static ALWAYS_INLINE atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value)
Implementation of atomic_xor.
Definition atomic_xtensa.h:180
static ALWAYS_INLINE atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value)
Implementation of atomic_nand.
Definition atomic_xtensa.h:194
static ALWAYS_INLINE bool atomic_ptr_cas(atomic_ptr_t *target, void *oldval, void *newval)
Implementation of atomic_ptr_cas.
Definition atomic_xtensa.h:117
static ALWAYS_INLINE atomic_val_t atomic_or(atomic_t *target, atomic_val_t value)
Implementation of atomic_or.
Definition atomic_xtensa.h:173
static ALWAYS_INLINE atomic_val_t atomic_dec(atomic_t *target)
Implementation of atomic_dec.
Definition atomic_xtensa.h:167
static ALWAYS_INLINE void * atomic_ptr_clear(atomic_ptr_t *target)
Implementation of atomic_ptr_clear.
Definition atomic_xtensa.h:219
long atomic_t
Atomic integer variable.
Definition atomic_types.h:31
atomic_t atomic_val_t
Value type for atomic integer variables.
Definition atomic_types.h:38
void * atomic_ptr_t
Atomic pointer variable.
Definition atomic_types.h:46
__UINT32_TYPE__ uint32_t
Definition stdint.h:90