1/*
2 * Copyright 2007, Hugo Santos. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _FBSD_COMPAT_MACHINE_ATOMIC_H_
6#define _FBSD_COMPAT_MACHINE_ATOMIC_H_
7
8
9#include <KernelExport.h>
10
11
12#define atomic_add_int(ptr, value) \
13	atomic_add((int32 *)(ptr), value)
14
15#define atomic_subtract_int(ptr, value) \
16	atomic_add((int32 *)(ptr), -value)
17
18#define atomic_load_int(ptr) \
19	atomic_get((int32 *)ptr)
20
21#define atomic_set_acq_32(ptr, value) \
22	atomic_set_int(ptr, value)
23
24#define atomic_set_int(ptr, value) \
25	atomic_or((int32 *)(ptr), value)
26
27#define atomic_readandclear_int(ptr) \
28	atomic_set((int32 *)(ptr), 0)
29
30#define atomic_cmpset_int(ptr, old, new) \
31	(atomic_test_and_set((int32 *)(ptr), new, old) == (int32)old)
32
33#define atomic_add_32			atomic_add_int
34#define atomic_subtract_32		atomic_subtract_int
35#define atomic_load_acq_32		atomic_load_int
36#define atomic_store_rel_int	atomic_set_acq_32
37#define atomic_cmpset_acq_int	atomic_cmpset_int
38
39#define	atomic_load_32(ptr)		(*(volatile uint32 *)(ptr))
40#define atomic_set_32(ptr, val)	atomic_set((int32 *)ptr, val)
41#define atomic_fetchadd_32(ptr, val)	atomic_add((int32 *)ptr, val)
42
43#define mb()    memory_full_barrier()
44#define wmb()   memory_write_barrier_inline()
45#define rmb()   memory_read_barrier()
46
47#endif	/* _FBSD_COMPAT_MACHINE_ATOMIC_H_ */
48