criu/arch/x86/include/asm/atomic.h
Alexander Kartashov 6f61488f21 x86: moved x86-specific files into the directory arch/x86.
* The following files goes into the directory arch/x86/include/asm unmodified:
  - include/atomic.h,
  - include/linkage.h,
  - include/memcpy_64.h,
  - include/types.h,
  - include/bitops.h,
  - pie/parasite-head-x86-64.S,
  - include/processor-flags.h,
  - include/syscall-x86-64.def.

* Changed include directives in the source files that include the headers
  listed above.

* Modified build scripts to reflect the source moves.

Signed-off-by: Alexander Kartashov <alekskartashov@parallels.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2013-01-09 17:02:47 +04:00

60 lines
1.2 KiB
C

#ifndef __CR_ATOMIC_H__
#define __CR_ATOMIC_H__
#include "asm/types.h"
typedef struct {
u32 counter;
} atomic_t;
#define atomic_set(mem, v) \
({ \
u32 ret__ = v; \
asm volatile ("lock xchg %0, %1\n" \
: "+r" (ret__), "+m" ((mem)->counter) \
: \
: "cc", "memory"); \
})
#define atomic_get(mem) \
({ \
u32 ret__ = 0; \
asm volatile ("lock xadd %0, %1\n" \
: "+r" (ret__), "+m" ((mem)->counter) \
: \
: "cc", "memory"); \
ret__; \
})
#define atomic_inc(mem) \
({ \
u32 ret__ = 1; \
asm volatile ("lock xadd %0, %1\n" \
: "+r" (ret__), "+m" ((mem)->counter) \
: \
: "cc", "memory"); \
ret__; \
})
#define atomic_dec(mem) \
({ \
u32 ret__ = -1; \
asm volatile ("lock xadd %0, %1\n" \
: "+r" (ret__), "+m" ((mem)->counter) \
: \
: "cc", "memory"); \
ret__; \
})
/* true if the result is 0, or false for all other cases. */
#define atomic_dec_and_test(mem) \
({ \
unsigned char ret__; \
asm volatile ("lock decl %0; sete %1\n" \
: "+m" ((mem)->counter), "=qm" (ret__) \
: \
: "cc", "memory"); \
ret__ != 0; \
})
#endif /* __CR_ATOMIC_H__ */