1*0a6a1f1dSLionel Sambuc /*	$NetBSD: atomic_init_testset.c,v 1.15 2014/02/27 09:39:00 matt Exp $	*/
2b6cbf720SGianluca Guida 
3b6cbf720SGianluca Guida /*-
4b6cbf720SGianluca Guida  * Copyright (c) 2008 The NetBSD Foundation, Inc.
5b6cbf720SGianluca Guida  * All rights reserved.
6b6cbf720SGianluca Guida  *
7b6cbf720SGianluca Guida  * Redistribution and use in source and binary forms, with or without
8b6cbf720SGianluca Guida  * modification, are permitted provided that the following conditions
9b6cbf720SGianluca Guida  * are met:
10b6cbf720SGianluca Guida  * 1. Redistributions of source code must retain the above copyright
11b6cbf720SGianluca Guida  *    notice, this list of conditions and the following disclaimer.
12b6cbf720SGianluca Guida  * 2. Redistributions in binary form must reproduce the above copyright
13b6cbf720SGianluca Guida  *    notice, this list of conditions and the following disclaimer in the
14b6cbf720SGianluca Guida  *    documentation and/or other materials provided with the distribution.
15b6cbf720SGianluca Guida  *
16b6cbf720SGianluca Guida  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17b6cbf720SGianluca Guida  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18b6cbf720SGianluca Guida  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19b6cbf720SGianluca Guida  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20b6cbf720SGianluca Guida  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21b6cbf720SGianluca Guida  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22b6cbf720SGianluca Guida  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23b6cbf720SGianluca Guida  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24b6cbf720SGianluca Guida  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25b6cbf720SGianluca Guida  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26b6cbf720SGianluca Guida  * POSSIBILITY OF SUCH DAMAGE.
27b6cbf720SGianluca Guida  */
28b6cbf720SGianluca Guida 
29b6cbf720SGianluca Guida /*
30b6cbf720SGianluca Guida  * libc glue for atomic operations where the hardware does not provide
31b6cbf720SGianluca Guida  * compare-and-swap.  It's assumed that this will only be used on 32-bit
32b6cbf720SGianluca Guida  * platforms.
33b6cbf720SGianluca Guida  *
34b6cbf720SGianluca Guida  * This should be compiled with '-fno-reorder-blocks -fomit-frame-pointer'
35b6cbf720SGianluca Guida  * if using gcc.
36b6cbf720SGianluca Guida  */
37b6cbf720SGianluca Guida 
38b6cbf720SGianluca Guida #include <sys/cdefs.h>
39*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: atomic_init_testset.c,v 1.15 2014/02/27 09:39:00 matt Exp $");
40b6cbf720SGianluca Guida 
41b6cbf720SGianluca Guida #include "atomic_op_namespace.h"
42b6cbf720SGianluca Guida 
43b6cbf720SGianluca Guida #include <sys/types.h>
44b6cbf720SGianluca Guida #include <sys/atomic.h>
45b6cbf720SGianluca Guida #include <sys/lock.h>
46b6cbf720SGianluca Guida #include <sys/ras.h>
47b6cbf720SGianluca Guida #include <sys/sysctl.h>
48b6cbf720SGianluca Guida 
49b6cbf720SGianluca Guida #include <string.h>
50b6cbf720SGianluca Guida 
51b6cbf720SGianluca Guida #define	I2	__SIMPLELOCK_UNLOCKED, __SIMPLELOCK_UNLOCKED,
52b6cbf720SGianluca Guida #define	I16	I2 I2 I2 I2 I2 I2 I2 I2
53b6cbf720SGianluca Guida #define	I128	I16 I16 I16 I16 I16 I16 I16 I16
54b6cbf720SGianluca Guida 
55b6cbf720SGianluca Guida static __cpu_simple_lock_t atomic_locks[128] = { I128 };
56*0a6a1f1dSLionel Sambuc /*
57*0a6a1f1dSLionel Sambuc  * Pick a lock out of above array depending on the object address
58*0a6a1f1dSLionel Sambuc  * passed. Most variables used atomically will not be in the same
59*0a6a1f1dSLionel Sambuc  * cacheline - and if they are, using the same lock is fine.
60*0a6a1f1dSLionel Sambuc  */
61*0a6a1f1dSLionel Sambuc #define HASH(PTR)	(((uintptr_t)(PTR) >> 3) & 127)
62b6cbf720SGianluca Guida 
63b6cbf720SGianluca Guida #ifdef	__HAVE_ASM_ATOMIC_CAS_UP
64b6cbf720SGianluca Guida extern uint32_t _atomic_cas_up(volatile uint32_t *, uint32_t, uint32_t);
65b6cbf720SGianluca Guida #else
66b6cbf720SGianluca Guida static uint32_t _atomic_cas_up(volatile uint32_t *, uint32_t, uint32_t);
67b6cbf720SGianluca Guida #endif
68b6cbf720SGianluca Guida static uint32_t (*_atomic_cas_fn)(volatile uint32_t *, uint32_t, uint32_t) =
69b6cbf720SGianluca Guida     _atomic_cas_up;
70*0a6a1f1dSLionel Sambuc RAS_DECL(_atomic_cas);
71*0a6a1f1dSLionel Sambuc 
72*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ATOMIC_CAS_64_UP
73*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ASM_ATOMIC_CAS_64_UP
74*0a6a1f1dSLionel Sambuc extern uint64_t _atomic_cas_64_up(volatile uint64_t *, uint64_t, uint64_t);
75*0a6a1f1dSLionel Sambuc #else
76*0a6a1f1dSLionel Sambuc static uint64_t _atomic_cas_64_up(volatile uint64_t *, uint64_t, uint64_t);
77*0a6a1f1dSLionel Sambuc #endif
78*0a6a1f1dSLionel Sambuc static uint64_t (*_atomic_cas_64_fn)(volatile uint64_t *, uint64_t, uint64_t) =
79*0a6a1f1dSLionel Sambuc     _atomic_cas_64_up;
80*0a6a1f1dSLionel Sambuc RAS_DECL(_atomic_cas_64);
81*0a6a1f1dSLionel Sambuc #endif
82*0a6a1f1dSLionel Sambuc 
83*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ASM_ATOMIC_CAS_16_UP
84*0a6a1f1dSLionel Sambuc extern uint16_t _atomic_cas_16_up(volatile uint16_t *, uint16_t, uint16_t);
85*0a6a1f1dSLionel Sambuc #else
86*0a6a1f1dSLionel Sambuc static uint16_t _atomic_cas_16_up(volatile uint16_t *, uint16_t, uint16_t);
87*0a6a1f1dSLionel Sambuc #endif
88*0a6a1f1dSLionel Sambuc static uint16_t (*_atomic_cas_16_fn)(volatile uint16_t *, uint16_t, uint16_t) =
89*0a6a1f1dSLionel Sambuc     _atomic_cas_16_up;
90*0a6a1f1dSLionel Sambuc RAS_DECL(_atomic_cas_16);
91*0a6a1f1dSLionel Sambuc 
92*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ASM_ATOMIC_CAS_8_UP
93*0a6a1f1dSLionel Sambuc extern uint8_t _atomic_cas_8_up(volatile uint8_t *, uint8_t, uint8_t);
94*0a6a1f1dSLionel Sambuc #else
95*0a6a1f1dSLionel Sambuc static uint8_t _atomic_cas_8_up(volatile uint8_t *, uint8_t, uint8_t);
96*0a6a1f1dSLionel Sambuc #endif
97*0a6a1f1dSLionel Sambuc static uint8_t (*_atomic_cas_8_fn)(volatile uint8_t *, uint8_t, uint8_t) =
98*0a6a1f1dSLionel Sambuc     _atomic_cas_8_up;
99*0a6a1f1dSLionel Sambuc RAS_DECL(_atomic_cas_8);
100b6cbf720SGianluca Guida 
101b6cbf720SGianluca Guida void	__libc_atomic_init(void) __attribute__ ((visibility("hidden")));
102b6cbf720SGianluca Guida 
103b6cbf720SGianluca Guida #ifndef	__HAVE_ASM_ATOMIC_CAS_UP
104b6cbf720SGianluca Guida static uint32_t
_atomic_cas_up(volatile uint32_t * ptr,uint32_t old,uint32_t new)105b6cbf720SGianluca Guida _atomic_cas_up(volatile uint32_t *ptr, uint32_t old, uint32_t new)
106b6cbf720SGianluca Guida {
107b6cbf720SGianluca Guida 	uint32_t ret;
108b6cbf720SGianluca Guida 
109b6cbf720SGianluca Guida 	RAS_START(_atomic_cas);
110b6cbf720SGianluca Guida 	ret = *ptr;
111b6cbf720SGianluca Guida 	if (__predict_false(ret != old)) {
112b6cbf720SGianluca Guida 		return ret;
113b6cbf720SGianluca Guida 	}
114b6cbf720SGianluca Guida 	*ptr = new;
115b6cbf720SGianluca Guida 	RAS_END(_atomic_cas);
116b6cbf720SGianluca Guida 
117b6cbf720SGianluca Guida 	return ret;
118b6cbf720SGianluca Guida }
119b6cbf720SGianluca Guida #endif
120b6cbf720SGianluca Guida 
121*0a6a1f1dSLionel Sambuc #if defined(__HAVE_ATOMIC_CAS_64_UP) && !defined(__HAVE_ASM_ATOMIC_CAS_64_UP)
122*0a6a1f1dSLionel Sambuc static uint64_t
_atomic_cas_64_up(volatile uint64_t * ptr,uint64_t old,uint64_t new)123*0a6a1f1dSLionel Sambuc _atomic_cas_64_up(volatile uint64_t *ptr, uint64_t old, uint64_t new)
124*0a6a1f1dSLionel Sambuc {
125*0a6a1f1dSLionel Sambuc 	uint64_t ret;
126*0a6a1f1dSLionel Sambuc 
127*0a6a1f1dSLionel Sambuc 	RAS_START(_atomic_cas_64);
128*0a6a1f1dSLionel Sambuc 	ret = *ptr;
129*0a6a1f1dSLionel Sambuc 	if (__predict_false(ret != old)) {
130*0a6a1f1dSLionel Sambuc 		return ret;
131*0a6a1f1dSLionel Sambuc 	}
132*0a6a1f1dSLionel Sambuc 	*ptr = new;
133*0a6a1f1dSLionel Sambuc 	RAS_END(_atomic_cas_64);
134*0a6a1f1dSLionel Sambuc 
135*0a6a1f1dSLionel Sambuc 	return ret;
136*0a6a1f1dSLionel Sambuc }
137*0a6a1f1dSLionel Sambuc #endif
138*0a6a1f1dSLionel Sambuc 
139*0a6a1f1dSLionel Sambuc #ifndef	__HAVE_ASM_ATOMIC_CAS_16_UP
140*0a6a1f1dSLionel Sambuc static uint16_t
_atomic_cas_16_up(volatile uint16_t * ptr,uint16_t old,uint16_t new)141*0a6a1f1dSLionel Sambuc _atomic_cas_16_up(volatile uint16_t *ptr, uint16_t old, uint16_t new)
142*0a6a1f1dSLionel Sambuc {
143*0a6a1f1dSLionel Sambuc 	uint16_t ret;
144*0a6a1f1dSLionel Sambuc 
145*0a6a1f1dSLionel Sambuc 	RAS_START(_atomic_cas_16);
146*0a6a1f1dSLionel Sambuc 	ret = *ptr;
147*0a6a1f1dSLionel Sambuc 	if (__predict_false(ret != old)) {
148*0a6a1f1dSLionel Sambuc 		return ret;
149*0a6a1f1dSLionel Sambuc 	}
150*0a6a1f1dSLionel Sambuc 	*ptr = new;
151*0a6a1f1dSLionel Sambuc 	RAS_END(_atomic_cas_16);
152*0a6a1f1dSLionel Sambuc 
153*0a6a1f1dSLionel Sambuc 	return ret;
154*0a6a1f1dSLionel Sambuc }
155*0a6a1f1dSLionel Sambuc #endif
156*0a6a1f1dSLionel Sambuc 
157*0a6a1f1dSLionel Sambuc #ifndef	__HAVE_ASM_ATOMIC_CAS_8_UP
158*0a6a1f1dSLionel Sambuc static uint8_t
_atomic_cas_8_up(volatile uint8_t * ptr,uint8_t old,uint8_t new)159*0a6a1f1dSLionel Sambuc _atomic_cas_8_up(volatile uint8_t *ptr, uint8_t old, uint8_t new)
160*0a6a1f1dSLionel Sambuc {
161*0a6a1f1dSLionel Sambuc 	uint8_t ret;
162*0a6a1f1dSLionel Sambuc 
163*0a6a1f1dSLionel Sambuc 	RAS_START(_atomic_cas_8);
164*0a6a1f1dSLionel Sambuc 	ret = *ptr;
165*0a6a1f1dSLionel Sambuc 	if (__predict_false(ret != old)) {
166*0a6a1f1dSLionel Sambuc 		return ret;
167*0a6a1f1dSLionel Sambuc 	}
168*0a6a1f1dSLionel Sambuc 	*ptr = new;
169*0a6a1f1dSLionel Sambuc 	RAS_END(_atomic_cas_8);
170*0a6a1f1dSLionel Sambuc 
171*0a6a1f1dSLionel Sambuc 	return ret;
172*0a6a1f1dSLionel Sambuc }
173*0a6a1f1dSLionel Sambuc #endif
174*0a6a1f1dSLionel Sambuc 
175b6cbf720SGianluca Guida static uint32_t
_atomic_cas_mp(volatile uint32_t * ptr,uint32_t old,uint32_t new)176b6cbf720SGianluca Guida _atomic_cas_mp(volatile uint32_t *ptr, uint32_t old, uint32_t new)
177b6cbf720SGianluca Guida {
178b6cbf720SGianluca Guida 	__cpu_simple_lock_t *lock;
179b6cbf720SGianluca Guida 	uint32_t ret;
180b6cbf720SGianluca Guida 
181*0a6a1f1dSLionel Sambuc 	lock = &atomic_locks[HASH(ptr)];
182*0a6a1f1dSLionel Sambuc 	__cpu_simple_lock(lock);
183*0a6a1f1dSLionel Sambuc 	ret = *ptr;
184*0a6a1f1dSLionel Sambuc 	if (__predict_true(ret == old)) {
185*0a6a1f1dSLionel Sambuc 		*ptr = new;
186*0a6a1f1dSLionel Sambuc 	}
187*0a6a1f1dSLionel Sambuc 	__cpu_simple_unlock(lock);
188*0a6a1f1dSLionel Sambuc 
189*0a6a1f1dSLionel Sambuc 	return ret;
190*0a6a1f1dSLionel Sambuc }
191*0a6a1f1dSLionel Sambuc 
192*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ATOMIC_CAS_64_UP
193*0a6a1f1dSLionel Sambuc static uint64_t
_atomic_cas_64_mp(volatile uint64_t * ptr,uint64_t old,uint64_t new)194*0a6a1f1dSLionel Sambuc _atomic_cas_64_mp(volatile uint64_t *ptr, uint64_t old, uint64_t new)
195*0a6a1f1dSLionel Sambuc {
196*0a6a1f1dSLionel Sambuc 	__cpu_simple_lock_t *lock;
197*0a6a1f1dSLionel Sambuc 	uint64_t ret;
198*0a6a1f1dSLionel Sambuc 
199*0a6a1f1dSLionel Sambuc 	lock = &atomic_locks[HASH(ptr)];
200*0a6a1f1dSLionel Sambuc 	__cpu_simple_lock(lock);
201*0a6a1f1dSLionel Sambuc 	ret = *ptr;
202*0a6a1f1dSLionel Sambuc 	if (__predict_true(ret == old)) {
203*0a6a1f1dSLionel Sambuc 		*ptr = new;
204*0a6a1f1dSLionel Sambuc 	}
205*0a6a1f1dSLionel Sambuc 	__cpu_simple_unlock(lock);
206*0a6a1f1dSLionel Sambuc 
207*0a6a1f1dSLionel Sambuc 	return ret;
208*0a6a1f1dSLionel Sambuc }
209*0a6a1f1dSLionel Sambuc #endif
210*0a6a1f1dSLionel Sambuc 
211*0a6a1f1dSLionel Sambuc static uint16_t
_atomic_cas_16_mp(volatile uint16_t * ptr,uint16_t old,uint16_t new)212*0a6a1f1dSLionel Sambuc _atomic_cas_16_mp(volatile uint16_t *ptr, uint16_t old, uint16_t new)
213*0a6a1f1dSLionel Sambuc {
214*0a6a1f1dSLionel Sambuc 	__cpu_simple_lock_t *lock;
215*0a6a1f1dSLionel Sambuc 	uint16_t ret;
216*0a6a1f1dSLionel Sambuc 
217*0a6a1f1dSLionel Sambuc 	lock = &atomic_locks[HASH(ptr)];
218*0a6a1f1dSLionel Sambuc 	__cpu_simple_lock(lock);
219*0a6a1f1dSLionel Sambuc 	ret = *ptr;
220*0a6a1f1dSLionel Sambuc 	if (__predict_true(ret == old)) {
221*0a6a1f1dSLionel Sambuc 		*ptr = new;
222*0a6a1f1dSLionel Sambuc 	}
223*0a6a1f1dSLionel Sambuc 	__cpu_simple_unlock(lock);
224*0a6a1f1dSLionel Sambuc 
225*0a6a1f1dSLionel Sambuc 	return ret;
226*0a6a1f1dSLionel Sambuc }
227*0a6a1f1dSLionel Sambuc 
228*0a6a1f1dSLionel Sambuc static uint8_t
_atomic_cas_8_mp(volatile uint8_t * ptr,uint8_t old,uint8_t new)229*0a6a1f1dSLionel Sambuc _atomic_cas_8_mp(volatile uint8_t *ptr, uint8_t old, uint8_t new)
230*0a6a1f1dSLionel Sambuc {
231*0a6a1f1dSLionel Sambuc 	__cpu_simple_lock_t *lock;
232*0a6a1f1dSLionel Sambuc 	uint8_t ret;
233*0a6a1f1dSLionel Sambuc 
234*0a6a1f1dSLionel Sambuc 	lock = &atomic_locks[HASH(ptr)];
235b6cbf720SGianluca Guida 	__cpu_simple_lock(lock);
236b6cbf720SGianluca Guida 	ret = *ptr;
237b6cbf720SGianluca Guida 	if (__predict_true(ret == old)) {
238b6cbf720SGianluca Guida 		*ptr = new;
239b6cbf720SGianluca Guida 	}
240b6cbf720SGianluca Guida 	__cpu_simple_unlock(lock);
241b6cbf720SGianluca Guida 
242b6cbf720SGianluca Guida 	return ret;
243b6cbf720SGianluca Guida }
244b6cbf720SGianluca Guida 
245b6cbf720SGianluca Guida uint32_t
_atomic_cas_32(volatile uint32_t * ptr,uint32_t old,uint32_t new)246b6cbf720SGianluca Guida _atomic_cas_32(volatile uint32_t *ptr, uint32_t old, uint32_t new)
247b6cbf720SGianluca Guida {
248b6cbf720SGianluca Guida 
249b6cbf720SGianluca Guida 	return (*_atomic_cas_fn)(ptr, old, new);
250b6cbf720SGianluca Guida }
251b6cbf720SGianluca Guida 
252*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ATOMIC_CAS_64_UP
253*0a6a1f1dSLionel Sambuc uint64_t _atomic_cas_64(volatile uint64_t *, uint64_t, uint64_t);
254*0a6a1f1dSLionel Sambuc 
255*0a6a1f1dSLionel Sambuc uint64_t
_atomic_cas_64(volatile uint64_t * ptr,uint64_t old,uint64_t new)256*0a6a1f1dSLionel Sambuc _atomic_cas_64(volatile uint64_t *ptr, uint64_t old, uint64_t new)
257*0a6a1f1dSLionel Sambuc {
258*0a6a1f1dSLionel Sambuc 
259*0a6a1f1dSLionel Sambuc 	return (*_atomic_cas_64_fn)(ptr, old, new);
260*0a6a1f1dSLionel Sambuc }
261*0a6a1f1dSLionel Sambuc #endif
262*0a6a1f1dSLionel Sambuc 
263*0a6a1f1dSLionel Sambuc uint16_t
_atomic_cas_16(volatile uint16_t * ptr,uint16_t old,uint16_t new)264*0a6a1f1dSLionel Sambuc _atomic_cas_16(volatile uint16_t *ptr, uint16_t old, uint16_t new)
265*0a6a1f1dSLionel Sambuc {
266*0a6a1f1dSLionel Sambuc 
267*0a6a1f1dSLionel Sambuc 	return (*_atomic_cas_16_fn)(ptr, old, new);
268*0a6a1f1dSLionel Sambuc }
269*0a6a1f1dSLionel Sambuc 
270*0a6a1f1dSLionel Sambuc uint8_t _atomic_cas_8(volatile uint8_t *, uint8_t, uint8_t);
271*0a6a1f1dSLionel Sambuc 
272*0a6a1f1dSLionel Sambuc uint8_t
_atomic_cas_8(volatile uint8_t * ptr,uint8_t old,uint8_t new)273*0a6a1f1dSLionel Sambuc _atomic_cas_8(volatile uint8_t *ptr, uint8_t old, uint8_t new)
274*0a6a1f1dSLionel Sambuc {
275*0a6a1f1dSLionel Sambuc 
276*0a6a1f1dSLionel Sambuc 	return (*_atomic_cas_8_fn)(ptr, old, new);
277*0a6a1f1dSLionel Sambuc }
278*0a6a1f1dSLionel Sambuc 
27984d9c625SLionel Sambuc void __section(".text.startup")
__libc_atomic_init(void)280b6cbf720SGianluca Guida __libc_atomic_init(void)
281b6cbf720SGianluca Guida {
282cdfb5ab8SArun Thomas #if !defined(__minix)
283b6cbf720SGianluca Guida 	int ncpu, mib[2];
284b6cbf720SGianluca Guida 	size_t len;
285*0a6a1f1dSLionel Sambuc #endif /* !defined(__minix) */
286b6cbf720SGianluca Guida 
287b6cbf720SGianluca Guida 	_atomic_cas_fn = _atomic_cas_mp;
288*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ATOMIC_CAS_64_UP
289*0a6a1f1dSLionel Sambuc 	_atomic_cas_64_fn = _atomic_cas_64_mp;
290*0a6a1f1dSLionel Sambuc #endif
291*0a6a1f1dSLionel Sambuc 	_atomic_cas_16_fn = _atomic_cas_16_mp;
292*0a6a1f1dSLionel Sambuc 	_atomic_cas_8_fn = _atomic_cas_8_mp;
293b6cbf720SGianluca Guida 
294cdfb5ab8SArun Thomas #if !defined(__minix)
295b6cbf720SGianluca Guida 	mib[0] = CTL_HW;
296b6cbf720SGianluca Guida 	mib[1] = HW_NCPU;
297b6cbf720SGianluca Guida 	len = sizeof(ncpu);
298b6cbf720SGianluca Guida 	if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1)
299b6cbf720SGianluca Guida 		return;
300b6cbf720SGianluca Guida 	if (ncpu > 1)
301b6cbf720SGianluca Guida 		return;
302b6cbf720SGianluca Guida 	if (rasctl(RAS_ADDR(_atomic_cas), RAS_SIZE(_atomic_cas),
303b6cbf720SGianluca Guida 	    RAS_INSTALL) == 0) {
304b6cbf720SGianluca Guida 		_atomic_cas_fn = _atomic_cas_up;
305b6cbf720SGianluca Guida 		return;
306b6cbf720SGianluca Guida 	}
307*0a6a1f1dSLionel Sambuc 
308*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ATOMIC_CAS_64_UP
309*0a6a1f1dSLionel Sambuc 	if (rasctl(RAS_ADDR(_atomic_cas_64), RAS_SIZE(_atomic_cas_64),
310*0a6a1f1dSLionel Sambuc 	    RAS_INSTALL) == 0) {
311*0a6a1f1dSLionel Sambuc 		_atomic_cas_64_fn = _atomic_cas_64_up;
312*0a6a1f1dSLionel Sambuc 		return;
313*0a6a1f1dSLionel Sambuc 	}
314cdfb5ab8SArun Thomas #endif
315*0a6a1f1dSLionel Sambuc 
316*0a6a1f1dSLionel Sambuc 	if (rasctl(RAS_ADDR(_atomic_cas_16), RAS_SIZE(_atomic_cas_16),
317*0a6a1f1dSLionel Sambuc 	    RAS_INSTALL) == 0) {
318*0a6a1f1dSLionel Sambuc 		_atomic_cas_16_fn = _atomic_cas_16_up;
319*0a6a1f1dSLionel Sambuc 		return;
320*0a6a1f1dSLionel Sambuc 	}
321*0a6a1f1dSLionel Sambuc 
322*0a6a1f1dSLionel Sambuc 	if (rasctl(RAS_ADDR(_atomic_cas_8), RAS_SIZE(_atomic_cas_8),
323*0a6a1f1dSLionel Sambuc 	    RAS_INSTALL) == 0) {
324*0a6a1f1dSLionel Sambuc 		_atomic_cas_8_fn = _atomic_cas_8_up;
325*0a6a1f1dSLionel Sambuc 		return;
326*0a6a1f1dSLionel Sambuc 	}
327*0a6a1f1dSLionel Sambuc #endif /* !defined(__minix) */
328b6cbf720SGianluca Guida }
329b6cbf720SGianluca Guida 
330b6cbf720SGianluca Guida #undef atomic_cas_32
331b6cbf720SGianluca Guida #undef atomic_cas_uint
332b6cbf720SGianluca Guida #undef atomic_cas_ulong
333b6cbf720SGianluca Guida #undef atomic_cas_ptr
334f14fb602SLionel Sambuc #undef atomic_cas_32_ni
335f14fb602SLionel Sambuc #undef atomic_cas_uint_ni
336f14fb602SLionel Sambuc #undef atomic_cas_ulong_ni
337f14fb602SLionel Sambuc #undef atomic_cas_ptr_ni
338b6cbf720SGianluca Guida 
339b6cbf720SGianluca Guida atomic_op_alias(atomic_cas_32,_atomic_cas_32)
340b6cbf720SGianluca Guida atomic_op_alias(atomic_cas_uint,_atomic_cas_32)
341b6cbf720SGianluca Guida __strong_alias(_atomic_cas_uint,_atomic_cas_32)
342b6cbf720SGianluca Guida atomic_op_alias(atomic_cas_ulong,_atomic_cas_32)
343b6cbf720SGianluca Guida __strong_alias(_atomic_cas_ulong,_atomic_cas_32)
344b6cbf720SGianluca Guida atomic_op_alias(atomic_cas_ptr,_atomic_cas_32)
345b6cbf720SGianluca Guida __strong_alias(_atomic_cas_ptr,_atomic_cas_32)
346b6cbf720SGianluca Guida 
347b6cbf720SGianluca Guida atomic_op_alias(atomic_cas_32_ni,_atomic_cas_32)
348b6cbf720SGianluca Guida __strong_alias(_atomic_cas_32_ni,_atomic_cas_32)
349b6cbf720SGianluca Guida atomic_op_alias(atomic_cas_uint_ni,_atomic_cas_32)
350b6cbf720SGianluca Guida __strong_alias(_atomic_cas_uint_ni,_atomic_cas_32)
351b6cbf720SGianluca Guida atomic_op_alias(atomic_cas_ulong_ni,_atomic_cas_32)
352b6cbf720SGianluca Guida __strong_alias(_atomic_cas_ulong_ni,_atomic_cas_32)
353b6cbf720SGianluca Guida atomic_op_alias(atomic_cas_ptr_ni,_atomic_cas_32)
354b6cbf720SGianluca Guida __strong_alias(_atomic_cas_ptr_ni,_atomic_cas_32)
355*0a6a1f1dSLionel Sambuc 
356*0a6a1f1dSLionel Sambuc //atomic_op_alias(atomic_cas_16,_atomic_cas_16)
357*0a6a1f1dSLionel Sambuc //atomic_op_alias(atomic_cas_16_ni,_atomic_cas_16)
358*0a6a1f1dSLionel Sambuc //atomic_op_alias(atomic_cas_8,_atomic_cas_8)
359*0a6a1f1dSLionel Sambuc //atomic_op_alias(atomic_cas_8_ni,_atomic_cas_8)
360*0a6a1f1dSLionel Sambuc #ifdef	__HAVE_ATOMIC_CAS_64_UP
361*0a6a1f1dSLionel Sambuc //atomic_op_alias(atomic_cas_64_ni,_atomic_cas_64)
362*0a6a1f1dSLionel Sambuc crt_alias(__sync_val_compare_and_swap_8,_atomic_cas_64)
363*0a6a1f1dSLionel Sambuc #endif
364*0a6a1f1dSLionel Sambuc crt_alias(__sync_val_compare_and_swap_4,_atomic_cas_32)
365*0a6a1f1dSLionel Sambuc crt_alias(__sync_val_compare_and_swap_2,_atomic_cas_16)
366*0a6a1f1dSLionel Sambuc crt_alias(__sync_val_compare_and_swap_1,_atomic_cas_8)
367