Main Page   File List  

atomic_arch.h File Reference

i386 atomic operations More...

Go to the source code of this file.

Defines

#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG64
#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG32
#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG16
#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG8
#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG
#define __L4UTIL_ATOMIC_HAVE_ARCH_XCHG32
#define __L4UTIL_ATOMIC_HAVE_ARCH_XCHG16
#define __L4UTIL_ATOMIC_HAVE_ARCH_XCHG8
#define __L4UTIL_ATOMIC_HAVE_ARCH_XCHG
#define l4util_gen_allop(args...)
#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG8_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG16_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG32_RES
#define l4util_genop(bit, mod, op1, opname, opchar)
#define __L4UTIL_ATOMIC_HAVE_ARCH_CMPXCHG_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_ADD8
#define __L4UTIL_ATOMIC_HAVE_ARCH_ADD16
#define __L4UTIL_ATOMIC_HAVE_ARCH_ADD32
#define __L4UTIL_ATOMIC_HAVE_ARCH_SUB8
#define __L4UTIL_ATOMIC_HAVE_ARCH_SUB16
#define __L4UTIL_ATOMIC_HAVE_ARCH_SUB32
#define __L4UTIL_ATOMIC_HAVE_ARCH_AND8
#define __L4UTIL_ATOMIC_HAVE_ARCH_AND16
#define __L4UTIL_ATOMIC_HAVE_ARCH_AND32
#define __L4UTIL_ATOMIC_HAVE_ARCH_OR8
#define __L4UTIL_ATOMIC_HAVE_ARCH_OR16
#define __L4UTIL_ATOMIC_HAVE_ARCH_OR32
#define l4util_genop(bit, mod, op1, opname)
#define __L4UTIL_ATOMIC_HAVE_ARCH_ADD8_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_ADD16_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_ADD32_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_SUB8_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_SUB16_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_SUB32_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_AND8_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_AND16_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_AND32_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_OR8_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_OR16_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_OR32_RES
#define l4util_genop(bit, mod, op1, opname, opchar)
#define __L4UTIL_ATOMIC_HAVE_ARCH_INC8
#define __L4UTIL_ATOMIC_HAVE_ARCH_INC16
#define __L4UTIL_ATOMIC_HAVE_ARCH_INC32
#define __L4UTIL_ATOMIC_HAVE_ARCH_DEC8
#define __L4UTIL_ATOMIC_HAVE_ARCH_DEC16
#define __L4UTIL_ATOMIC_HAVE_ARCH_DEC32
#define l4util_genop(bit, mod, op1, opname)
#define __L4UTIL_ATOMIC_HAVE_ARCH_INC8_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_INC16_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_INC32_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_DEC8_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_DEC16_RES
#define __L4UTIL_ATOMIC_HAVE_ARCH_DEC32_RES
#define l4util_genop(bit, mod, op1, opname, opchar)
#define __L4UTIL_ATOMIC_HAVE_ARCH_ADD
#define __L4UTIL_ATOMIC_HAVE_ARCH_INC

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_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_cmpxchg16 (volatile l4_uint16_t *dest, l4_uint16_t cmp_val, l4_uint16_t new_val)
 Atomic compare and exchange (16 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).
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_uint32_t l4util_xchg32 (volatile l4_uint32_t *dest, l4_uint32_t val)
 Atomic exchange (32 bit version).
l4_uint16_t l4util_xchg16 (volatile l4_uint16_t *dest, l4_uint16_t val)
 Atomic exchange (16 bit version).
l4_uint8_t l4util_xchg8 (volatile l4_uint8_t *dest, l4_uint8_t val)
 Atomic exchange (8 bit version).
l4_umword_t l4util_xchg (volatile l4_umword_t *dest, l4_umword_t val)
 Atomic exchange (machine wide fields).
l4_uint8_t l4util_cmpxchg8_res (volatile l4_uint8_t *dest, l4_uint8_t cmp_val, l4_uint8_t new_val)
 l4util_genop (16,"w","", cmpxchg, cmpxchg) l4util_genop(32
l4_umword_t l4util_cmpxchg_res (volatile l4_umword_t *dest, l4_umword_t cmp_val, l4_umword_t new_val)
void l4util_add8 (volatile l4_uint8_t *dest, l4_uint8_t val)
void l4util_add16 (volatile l4_uint16_t *dest, l4_uint16_t val)
void l4util_add32 (volatile l4_uint32_t *dest, l4_uint32_t val)
void l4util_sub8 (volatile l4_uint8_t *dest, l4_uint8_t val)
void l4util_sub16 (volatile l4_uint16_t *dest, l4_uint16_t val)
void l4util_sub32 (volatile l4_uint32_t *dest, l4_uint32_t val)
void l4util_and8 (volatile l4_uint8_t *dest, l4_uint8_t val)
void l4util_and16 (volatile l4_uint16_t *dest, l4_uint16_t val)
void l4util_and32 (volatile l4_uint32_t *dest, l4_uint32_t val)
void l4util_or8 (volatile l4_uint8_t *dest, l4_uint8_t val)
void l4util_or16 (volatile l4_uint16_t *dest, l4_uint16_t val)
void l4util_or32 (volatile l4_uint32_t *dest, l4_uint32_t val)
l4_uint8_t l4util_add8_res (volatile l4_uint8_t *dest, l4_uint8_t val)
l4_uint16_t l4util_add16_res (volatile l4_uint16_t *dest, l4_uint16_t val)
l4_uint32_t l4util_add32_res (volatile l4_uint32_t *dest, l4_uint32_t val)
l4_uint8_t l4util_sub8_res (volatile l4_uint8_t *dest, l4_uint8_t val)
l4_uint16_t l4util_sub16_res (volatile l4_uint16_t *dest, l4_uint16_t val)
l4_uint32_t l4util_sub32_res (volatile l4_uint32_t *dest, l4_uint32_t val)
l4_uint8_t l4util_and8_res (volatile l4_uint8_t *dest, l4_uint8_t val)
l4_uint16_t l4util_and16_res (volatile l4_uint16_t *dest, l4_uint16_t val)
l4_uint32_t l4util_and32_res (volatile l4_uint32_t *dest, l4_uint32_t val)
l4_uint8_t l4util_or8_res (volatile l4_uint8_t *dest, l4_uint8_t val)
l4_uint16_t l4util_or16_res (volatile l4_uint16_t *dest, l4_uint16_t val)
l4_uint32_t l4util_or32_res (volatile l4_uint32_t *dest, l4_uint32_t val)
void l4util_inc8 (volatile l4_uint8_t *dest)
void l4util_inc16 (volatile l4_uint16_t *dest)
void l4util_inc32 (volatile l4_uint32_t *dest)
void l4util_dec8 (volatile l4_uint8_t *dest)
void l4util_dec16 (volatile l4_uint16_t *dest)
void l4util_dec32 (volatile l4_uint32_t *dest)
l4_uint8_t l4util_inc8_res (volatile l4_uint8_t *dest)
l4_uint16_t l4util_inc16_res (volatile l4_uint16_t *dest)
l4_uint32_t l4util_inc32_res (volatile l4_uint32_t *dest)
l4_uint8_t l4util_dec8_res (volatile l4_uint8_t *dest)
l4_uint16_t l4util_dec16_res (volatile l4_uint16_t *dest)
l4_uint32_t l4util_dec32_res (volatile l4_uint32_t *dest)
void l4util_atomic_add (volatile long *dest, long val)
 Atomic add.
void l4util_atomic_inc (volatile long *dest)
 Atomic increment.

Variables

 l
 cmpxchg


Detailed Description

i386 atomic operations

Date:
10/20/2000
Author:
Lars Reuther <reuther@os.inf.tu-dresden.de>, Jork Loeser <jork@os.inf.tu-dresden.de>

Definition in file ARCH-x86/atomic_arch.h.


Define Documentation

#define l4util_gen_allop ( args...   ) 

Value:

l4util_genop( 8,"b", "", args)  \
l4util_genop(16,"w", "", args)  \
l4util_genop(32,"l", "", args)

Definition at line 222 of file ARCH-x86/atomic_arch.h.

#define l4util_genop ( bit,
mod,
op1,
opname,
opchar   ) 

Value:

L4_INLINE l4_uint##bit##_t                                      \
l4util_##opname##bit##_res(volatile l4_uint##bit##_t* dest,     \
                           l4_uint##bit##_t cmp_val,            \
                           l4_uint##bit##_t new_val)            \
{                                                               \
  l4_uint##bit##_t old_val;                                     \
  __asm__ __volatile__                                          \
    (                                                           \
     #opname mod " %"op1"1,%3   \n\t"                           \
     :                                                          \
     "=a"(old_val)                                              \
     :                                                          \
     "r"(new_val), "a"(cmp_val), "m" (*dest)                    \
     :                                                          \
     "memory"                                                   \
    );                                                          \
  return old_val;                                               \
}

Definition at line 363 of file ARCH-x86/atomic_arch.h.

#define l4util_genop ( bit,
mod,
op1,
opname   ) 

Value:

L4_INLINE void                                                  \
l4util_##opname##bit(volatile l4_uint##bit##_t* dest, l4_uint##bit##_t val) \
{                                                               \
  __asm__ __volatile__                                          \
    (                                                           \
     #opname mod " %1,%0        \n\t"                           \
     :                                                          \
     :                                                          \
     "m" (*dest), "ir" (val)                                    \
     :                                                          \
     "memory"                                                   \
    );                                                          \
}

Definition at line 363 of file ARCH-x86/atomic_arch.h.

#define l4util_genop ( bit,
mod,
op1,
opname,
opchar   ) 

Value:

L4_INLINE l4_uint##bit##_t                                      \
l4util_##opname##bit##_res(volatile l4_uint##bit##_t* dest,     \
                           l4_uint##bit##_t val)                \
{                                                               \
  l4_uint##bit##_t res, old;                                    \
                                                                \
  do                                                            \
    {                                                           \
      old = *dest;                                              \
      res = old opchar val;                                     \
    }                                                           \
  while (!l4util_cmpxchg##bit(dest, old, res));                 \
                                                                \
  return res;                                                   \
}

Definition at line 363 of file ARCH-x86/atomic_arch.h.

#define l4util_genop ( bit,
mod,
op1,
opname   ) 

Value:

L4_INLINE void                                                  \
l4util_##opname##bit(volatile l4_uint##bit##_t* dest)           \
{                                                               \
  __asm__ __volatile__                                          \
    (                                                           \
     #opname mod " %0   \n\t"                                   \
     :                                                          \
     :                                                          \
     "m" (*dest)                                                \
     :                                                          \
     "memory"                                                   \
    );                                                          \
}

Definition at line 363 of file ARCH-x86/atomic_arch.h.

#define l4util_genop ( bit,
mod,
op1,
opname,
opchar   ) 

Value:

L4_INLINE l4_uint##bit##_t                                      \
l4util_##opname##bit##_res(volatile l4_uint##bit##_t* dest)     \
{                                                               \
  l4_uint##bit##_t res, old;                                    \
                                                                \
  do                                                            \
    {                                                           \
      res = *dest;                                              \
      old = res opchar;                                         \
    }                                                           \
  while (!l4util_cmpxchg##bit(dest, old, res));                 \
                                                                \
  return res;                                                   \
}

Definition at line 363 of file ARCH-x86/atomic_arch.h.


L4 Utilities, part of DROPS  © 2000-2003