19 #ifndef __L4UTIL__INCLUDE__ATOMIC_H__ 20 #define __L4UTIL__INCLUDE__ATOMIC_H__ 22 #include <l4/sys/l4int.h> 306 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
307 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
314 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
315 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
322 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
323 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
330 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
331 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
338 return __atomic_compare_exchange_n(dest, &cmp_val, new_val, 0,
339 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
345 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
351 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
357 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
363 return __atomic_exchange_n(dest, val, __ATOMIC_SEQ_CST);
368 { __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
372 { __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
376 { __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
380 { __atomic_fetch_add(dest, 1, __ATOMIC_SEQ_CST); }
384 { __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
388 { __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
392 { __atomic_fetch_sub(dest, 1, __ATOMIC_SEQ_CST); }
397 {
return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
401 {
return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
405 {
return __atomic_add_fetch(dest, 1, __ATOMIC_SEQ_CST); }
409 {
return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
413 {
return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
417 {
return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
421 {
return __atomic_sub_fetch(dest, 1, __ATOMIC_SEQ_CST); }
425 { __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
429 { __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
433 { __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
437 { __atomic_fetch_add(dest, val, __ATOMIC_SEQ_CST); }
441 { __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
445 { __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
449 { __atomic_fetch_sub(dest, val, __ATOMIC_SEQ_CST); }
453 { __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
457 { __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
461 { __atomic_fetch_and(dest, val, __ATOMIC_SEQ_CST); }
465 { __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
469 { __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
473 { __atomic_fetch_or(dest, val, __ATOMIC_SEQ_CST); }
477 {
return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
481 {
return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
485 {
return __atomic_add_fetch(dest, val, __ATOMIC_SEQ_CST); }
489 {
return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
493 {
return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
497 {
return __atomic_sub_fetch(dest, val, __ATOMIC_SEQ_CST); }
501 {
return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
505 {
return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
509 {
return __atomic_and_fetch(dest, val, __ATOMIC_SEQ_CST); }
513 {
return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
517 {
return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
521 {
return __atomic_or_fetch(dest, val, __ATOMIC_SEQ_CST); }
l4_umword_t l4util_xchg(volatile l4_umword_t *dest, l4_umword_t val)
Atomic exchange (machine wide fields)
l4_uint32_t l4util_xchg32(volatile l4_uint32_t *dest, l4_uint32_t val)
Atomic exchange (32 bit version)
unsigned short int l4_uint16_t
Unsigned 16bit value.
l4_uint8_t l4util_inc8_res(volatile l4_uint8_t *dest)
#define EXTERN_C_END
End section with C types and functions.
int l4util_cmpxchg64(volatile l4_uint64_t *dest, l4_uint64_t cmp_val, l4_uint64_t new_val)
Atomic compare and exchange (64 bit version)
int l4util_cmpxchg(volatile l4_umword_t *dest, l4_umword_t cmp_val, l4_umword_t new_val)
Atomic compare and exchange (machine wide fields)
L4 compiler related defines.
l4_uint16_t l4util_xchg16(volatile l4_uint16_t *dest, l4_uint16_t val)
Atomic exchange (16 bit version)
int l4util_cmpxchg32(volatile l4_uint32_t *dest, l4_uint32_t cmp_val, l4_uint32_t new_val)
Atomic compare and exchange (32 bit version)
int l4util_cmpxchg8(volatile l4_uint8_t *dest, l4_uint8_t cmp_val, l4_uint8_t new_val)
Atomic compare and exchange (8 bit version)
l4_uint8_t l4util_xchg8(volatile l4_uint8_t *dest, l4_uint8_t val)
Atomic exchange (8 bit version)
void l4util_atomic_inc(volatile long *dest)
Atomic increment.
unsigned long l4_umword_t
Unsigned machine word.
#define EXTERN_C_BEGIN
Start section with C types and functions.
void l4util_atomic_add(volatile long *dest, long val)
Atomic add.
unsigned char l4_uint8_t
Unsigned 8bit value.
int l4util_cmpxchg16(volatile l4_uint16_t *dest, l4_uint16_t cmp_val, l4_uint16_t new_val)
Atomic compare and exchange (16 bit version)
void l4util_inc8(volatile l4_uint8_t *dest)
unsigned long long l4_uint64_t
Unsigned 64bit value.
l4_uint8_t l4util_add8_res(volatile l4_uint8_t *dest, l4_uint8_t val)
unsigned int l4_uint32_t
Unsigned 32bit value.
void l4util_add8(volatile l4_uint8_t *dest, l4_uint8_t val)