1/*
2 * Copyright 2003, Marcus Overhagen. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <SupportDefs.h>
8
9#include <syscalls.h>
10
11
12#ifdef ATOMIC_FUNCS_ARE_SYSCALLS
13
14void
15atomic_set(int32 *value, int32 newValue)
16{
17	_kern_atomic_set(value, newValue);
18}
19
20
21int32
22atomic_get_and_set(int32 *value, int32 newValue)
23{
24	return _kern_atomic_get_and_set(value, newValue);
25}
26
27
28int32
29atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst)
30{
31	return _kern_atomic_test_and_set(value, newValue, testAgainst);
32}
33
34
35int32
36atomic_add(int32 *value, int32 addValue)
37{
38	return _kern_atomic_add(value, addValue);
39}
40
41
42int32
43atomic_and(int32 *value, int32 andValue)
44{
45	return _kern_atomic_and(value, andValue);
46}
47
48
49int32
50atomic_or(int32 *value, int32 orValue)
51{
52	return _kern_atomic_or(value, orValue);
53}
54
55
56int32
57atomic_get(int32 *value)
58{
59	return _kern_atomic_get(value);
60}
61
62
63#endif	/* ATOMIC_FUNCS_ARE_SYSCALLS */
64
65#ifdef ATOMIC64_FUNCS_ARE_SYSCALLS
66
67void
68atomic_set64(int64 *value, int64 newValue)
69{
70	_kern_atomic_set64(value, newValue);
71}
72
73
74int64
75atomic_test_and_set64(int64 *value, int64 newValue, int64 testAgainst)
76{
77	return _kern_atomic_test_and_set64(value, newValue, testAgainst);
78}
79
80
81int64
82atomic_add64(int64 *value, int64 addValue)
83{
84	return _kern_atomic_add64(value, addValue);
85}
86
87
88int64
89atomic_and64(int64 *value, int64 andValue)
90{
91	return _kern_atomic_and64(value, andValue);
92}
93
94
95int64
96atomic_or64(int64 *value, int64 orValue)
97{
98	return _kern_atomic_or64(value, orValue);
99}
100
101
102int64
103atomic_get64(int64 *value)
104{
105	return _kern_atomic_get64(value);
106}
107
108
109#endif	/* ATOMIC64_FUNCS_ARE_SYSCALLS */
110
111#if defined(__arm__) && !defined(__clang__)
112
113/* GCC compatibility: libstdc++ needs this one.
114 * TODO: Update libstdc++ and drop this.
115 * cf. http://fedoraproject.org/wiki/Architectures/ARM/GCCBuiltInAtomicOperations
116 */
117extern int32_t __sync_fetch_and_add_4(int32_t *value, int32_t addValue);
118
119extern int32_t __sync_fetch_and_add_4(int32_t *value, int32_t addValue)
120{
121	return atomic_add((int32 *)value, addValue);
122}
123
124#endif
125