xref: /illumos-gate/usr/src/common/atomic/atomic.c (revision bb57d1f5164aca913cbd286ae1b61c896167cfa7)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include <sys/atomic.h>
29 
30 /*
31  * This file exists only for the purpose of running lint.
32  */
33 
34 #if defined(__lint)
35 
36 void
37 atomic_inc_8(volatile uint8_t *target)
38 { (*target)++; }
39 
40 void
41 atomic_inc_uchar(volatile uchar_t *target)
42 { (*target)++; }
43 
44 void
45 atomic_inc_16(volatile uint16_t *target)
46 { (*target)++; }
47 
48 void
49 atomic_inc_ushort(volatile ushort_t *target)
50 { (*target)++; }
51 
52 void
53 atomic_inc_32(volatile uint32_t *target)
54 { (*target)++; }
55 
56 void
57 atomic_inc_uint(volatile uint_t *target)
58 { (*target)++; }
59 
60 void
61 atomic_inc_ulong(volatile ulong_t *target)
62 { (*target)++; }
63 
64 void
65 atomic_inc_64(volatile uint64_t *target)
66 { (*target)++; }
67 
68 void
69 atomic_dec_8(volatile uint8_t *target)
70 { (*target)--; }
71 
72 void
73 atomic_dec_uchar(volatile uchar_t *target)
74 { (*target)--; }
75 
76 void
77 atomic_dec_16(volatile uint16_t *target)
78 { (*target)--; }
79 
80 void
81 atomic_dec_ushort(volatile ushort_t *target)
82 { (*target)--; }
83 
84 void
85 atomic_dec_32(volatile uint32_t *target)
86 { (*target)--; }
87 
88 void
89 atomic_dec_uint(volatile uint_t *target)
90 { (*target)--; }
91 
92 void
93 atomic_dec_ulong(volatile ulong_t *target)
94 { (*target)--; }
95 
96 void
97 atomic_dec_64(volatile uint64_t *target)
98 { (*target)--; }
99 
100 void
101 atomic_add_8(volatile uint8_t *target, int8_t value)
102 { *target += value; }
103 
104 void
105 atomic_add_char(volatile uchar_t *target, signed char value)
106 { *target += value; }
107 
108 void
109 atomic_add_16(volatile uint16_t *target, int16_t delta)
110 { *target += delta; }
111 
112 void
113 atomic_add_ushort(volatile ushort_t *target, short value)
114 { *target += value; }
115 
116 void
117 atomic_add_32(volatile uint32_t *target, int32_t delta)
118 { *target += delta; }
119 
120 void
121 atomic_add_ptr(volatile void *target, ssize_t value)
122 { *(caddr_t *)target += value; }
123 
124 void
125 atomic_add_long(volatile ulong_t *target, long delta)
126 { *target += delta; }
127 
128 void
129 atomic_add_64(volatile uint64_t *target, int64_t delta)
130 { *target += delta; }
131 
132 void
133 atomic_or_8(volatile uint8_t *target, uint8_t bits)
134 { *target |= bits; }
135 
136 void
137 atomic_or_uchar(volatile uchar_t *target, uchar_t bits)
138 { *target |= bits; }
139 
140 void
141 atomic_or_16(volatile uint16_t *target, uint16_t bits)
142 { *target |= bits; }
143 
144 void
145 atomic_or_ushort(volatile ushort_t *target, ushort_t bits)
146 { *target |= bits; }
147 
148 void
149 atomic_or_32(volatile uint32_t *target, uint32_t bits)
150 { *target |= bits; }
151 
152 void
153 atomic_or_uint(volatile uint_t *target, uint_t bits)
154 { *target |= bits; }
155 
156 void
157 atomic_or_ulong(volatile ulong_t *target, ulong_t bits)
158 { *target |= bits; }
159 
160 void
161 atomic_or_64(volatile uint64_t *target, uint64_t bits)
162 { *target |= bits; }
163 
164 void
165 atomic_and_8(volatile uint8_t *target, uint8_t bits)
166 { *target &= bits; }
167 
168 void
169 atomic_and_uchar(volatile uchar_t *target, uchar_t bits)
170 { *target &= bits; }
171 
172 void
173 atomic_and_16(volatile uint16_t *target, uint16_t bits)
174 { *target &= bits; }
175 
176 void
177 atomic_and_ushort(volatile ushort_t *target, ushort_t bits)
178 { *target &= bits; }
179 
180 void
181 atomic_and_32(volatile uint32_t *target, uint32_t bits)
182 { *target &= bits; }
183 
184 void
185 atomic_and_uint(volatile uint_t *target, uint_t bits)
186 { *target &= bits; }
187 
188 void
189 atomic_and_ulong(volatile ulong_t *target, ulong_t bits)
190 { *target &= bits; }
191 
192 void
193 atomic_and_64(volatile uint64_t *target, uint64_t bits)
194 { *target &= bits; }
195 
196 uint8_t
197 atomic_inc_8_nv(volatile uint8_t *target)
198 { return (++(*target)); }
199 
200 uchar_t
201 atomic_inc_uchar_nv(volatile uchar_t *target)
202 { return (++(*target)); }
203 
204 uint16_t
205 atomic_inc_16_nv(volatile uint16_t *target)
206 { return (++(*target)); }
207 
208 ushort_t
209 atomic_inc_ushort_nv(volatile ushort_t *target)
210 { return (++(*target)); }
211 
212 uint32_t
213 atomic_inc_32_nv(volatile uint32_t *target)
214 { return (++(*target)); }
215 
216 uint_t
217 atomic_inc_uint_nv(volatile uint_t *target)
218 { return (++(*target)); }
219 
220 ulong_t
221 atomic_inc_ulong_nv(volatile ulong_t *target)
222 { return (++(*target)); }
223 
224 uint64_t
225 atomic_inc_64_nv(volatile uint64_t *target)
226 { return (++(*target)); }
227 
228 uint8_t
229 atomic_dec_8_nv(volatile uint8_t *target)
230 { return (--(*target)); }
231 
232 uchar_t
233 atomic_dec_uchar_nv(volatile uchar_t *target)
234 { return (--(*target)); }
235 
236 uint16_t
237 atomic_dec_16_nv(volatile uint16_t *target)
238 { return (--(*target)); }
239 
240 ushort_t
241 atomic_dec_ushort_nv(volatile ushort_t *target)
242 { return (--(*target)); }
243 
244 uint32_t
245 atomic_dec_32_nv(volatile uint32_t *target)
246 { return (--(*target)); }
247 
248 uint_t
249 atomic_dec_uint_nv(volatile uint_t *target)
250 { return (--(*target)); }
251 
252 ulong_t
253 atomic_dec_ulong_nv(volatile ulong_t *target)
254 { return (--(*target)); }
255 
256 uint64_t
257 atomic_dec_64_nv(volatile uint64_t *target)
258 { return (--(*target)); }
259 
260 uint8_t
261 atomic_add_8_nv(volatile uint8_t *target, int8_t value)
262 { return (*target += value); }
263 
264 uchar_t
265 atomic_add_char_nv(volatile uchar_t *target, signed char value)
266 { return (*target += value); }
267 
268 uint16_t
269 atomic_add_16_nv(volatile uint16_t *target, int16_t delta)
270 { return (*target += delta); }
271 
272 ushort_t
273 atomic_add_short_nv(volatile ushort_t *target, short value)
274 { return (*target += value); }
275 
276 uint32_t
277 atomic_add_32_nv(volatile uint32_t *target, int32_t delta)
278 { return (*target += delta); }
279 
280 uint_t
281 atomic_add_int_nv(volatile uint_t *target, int delta)
282 { return (*target += delta); }
283 
284 void *
285 atomic_add_ptr_nv(volatile void *target, ssize_t value)
286 { return (*(caddr_t *)target += value); }
287 
288 ulong_t
289 atomic_add_long_nv(volatile ulong_t *target, long delta)
290 { return (*target += delta); }
291 
292 uint64_t
293 atomic_add_64_nv(volatile uint64_t *target, int64_t delta)
294 { return (*target += delta); }
295 
296 uint8_t
297 atomic_or_8_nv(volatile uint8_t *target, uint8_t value)
298 { return (*target |= value); }
299 
300 uchar_t
301 atomic_or_uchar_nv(volatile uchar_t *target, uchar_t value)
302 { return (*target |= value); }
303 
304 uint16_t
305 atomic_or_16_nv(volatile uint16_t *target, uint16_t value)
306 { return (*target |= value); }
307 
308 ushort_t
309 atomic_or_ushort_nv(volatile ushort_t *target, ushort_t value)
310 { return (*target |= value); }
311 
312 uint32_t
313 atomic_or_32_nv(volatile uint32_t *target, uint32_t value)
314 { return (*target |= value); }
315 
316 uint_t
317 atomic_or_uint_nv(volatile uint_t *target, uint_t value)
318 { return (*target |= value); }
319 
320 ulong_t
321 atomic_or_ulong_nv(volatile ulong_t *target, ulong_t value)
322 { return (*target |= value); }
323 
324 uint64_t
325 atomic_or_64_nv(volatile uint64_t *target, uint64_t value)
326 { return (*target |= value); }
327 
328 uint8_t
329 atomic_and_8_nv(volatile uint8_t *target, uint8_t value)
330 { return (*target &= value); }
331 
332 uchar_t
333 atomic_and_uchar_nv(volatile uchar_t *target, uchar_t value)
334 { return (*target &= value); }
335 
336 uint16_t
337 atomic_and_16_nv(volatile uint16_t *target, uint16_t value)
338 { return (*target &= value); }
339 
340 ushort_t
341 atomic_and_ushort_nv(volatile ushort_t *target, ushort_t value)
342 { return (*target &= value); }
343 
344 uint32_t
345 atomic_and_32_nv(volatile uint32_t *target, uint32_t value)
346 { return (*target &= value); }
347 
348 uint_t
349 atomic_and_uint_nv(volatile uint_t *target, uint_t value)
350 { return (*target &= value); }
351 
352 ulong_t
353 atomic_and_ulong_nv(volatile ulong_t *target, ulong_t value)
354 { return (*target &= value); }
355 
356 uint64_t
357 atomic_and_64_nv(volatile uint64_t *target, uint64_t value)
358 { return (*target &= value); }
359 
360 uint8_t
361 atomic_cas_8(volatile uint8_t *target, uint8_t cmp, uint8_t new)
362 {
363 	uint8_t old = *target;
364 	if (old == cmp)
365 		*target = new;
366 	return (old);
367 }
368 
369 uchar_t
370 atomic_cas_uchar(volatile uchar_t *target, uchar_t cmp, uchar_t new)
371 {
372 	uchar_t old = *target;
373 	if (old == cmp)
374 		*target = new;
375 	return (old);
376 }
377 
378 uint16_t
379 atomic_cas_16(volatile uint16_t *target, uint16_t cmp, uint16_t new)
380 {
381 	uint16_t old = *target;
382 	if (old == cmp)
383 		*target = new;
384 	return (old);
385 }
386 
387 ushort_t
388 atomic_cas_ushort(volatile ushort_t *target, ushort_t cmp, ushort_t new)
389 {
390 	ushort_t old = *target;
391 	if (old == cmp)
392 		*target = new;
393 	return (old);
394 }
395 
396 uint32_t
397 atomic_cas_32(volatile uint32_t *target, uint32_t cmp, uint32_t new)
398 {
399 	uint32_t old = *target;
400 	if (old == cmp)
401 		*target = new;
402 	return (old);
403 }
404 
405 uint_t
406 atomic_cas_uint(volatile uint_t *target, uint_t cmp, uint_t new)
407 {
408 	uint_t old = *target;
409 	if (old == cmp)
410 		*target = new;
411 	return (old);
412 }
413 
414 ulong_t
415 atomic_cas_ulong(volatile ulong_t *target, ulong_t cmp, ulong_t new)
416 {
417 	ulong_t old = *target;
418 	if (old == cmp)
419 		*target = new;
420 	return (old);
421 }
422 
423 uint64_t
424 atomic_cas_uint64(volatile uint64_t *target, ulong_t cmp, uint64_t new)
425 {
426 	uint64_t old = *target;
427 	if (old == cmp)
428 		*target = new;
429 	return (old);
430 }
431 
432 void *
433 atomic_cas_ptr(volatile void *target, void *cmp, void *new)
434 {
435 	void *old = *(void **)target;
436 	if (old == cmp)
437 		*(void **)target = new;
438 	return (old);
439 }
440 
441 uint8_t
442 atomic_swap_8(volatile uint8_t *target, uint8_t new)
443 {
444 	uint8_t old = *target;
445 	*target = new;
446 	return (old);
447 }
448 
449 uchar_t
450 atomic_swap_char(volatile uchar_t *target, uchar_t new)
451 {
452 	uchar_t old = *target;
453 	*target = new;
454 	return (old);
455 }
456 
457 uint16_t
458 atomic_swap_16(volatile uint16_t *target, uint16_t new)
459 {
460 	uint16_t old = *target;
461 	*target = new;
462 	return (old);
463 }
464 
465 ushort_t
466 atomic_swap_ushort(volatile ushort_t *target, ushort_t new)
467 {
468 	ushort_t old = *target;
469 	*target = new;
470 	return (old);
471 }
472 
473 uint32_t
474 atomic_swap_32(volatile uint32_t *target, uint32_t new)
475 {
476 	uint32_t old = *target;
477 	*target = new;
478 	return (old);
479 }
480 
481 uint_t
482 atomic_swap_uint(volatile uint_t *target, uint_t new)
483 {
484 	uint_t old = *target;
485 	*target = new;
486 	return (old);
487 }
488 
489 uint64_t
490 atomic_swap_64(volatile uint64_t *target, uint64_t new)
491 {
492 	uint64_t old = *target;
493 	*target = new;
494 	return (old);
495 }
496 
497 void *
498 atomic_swap_ptr(volatile void *target, void *new)
499 {
500 	void *old = *(void **)target;
501 	*(void **)target = new;
502 	return (old);
503 }
504 
505 ulong_t
506 atomic_swap_ulong(volatile ulong_t *target, ulong_t new)
507 {
508 	ulong_t old = *target;
509 	*target = new;
510 	return (old);
511 }
512 
513 int
514 atomic_set_long_excl(volatile ulong_t *target, uint_t value)
515 {
516 	ulong_t bit = (1UL << value);
517 	if ((*target & bit) != 0)
518 		return (-1);
519 	*target |= bit;
520 	return (0);
521 }
522 
523 int
524 atomic_clear_long_excl(volatile ulong_t *target, uint_t value)
525 {
526 	ulong_t bit = (1UL << value);
527 	if ((*target & bit) == 0)
528 		return (-1);
529 	*target &= ~bit;
530 	return (0);
531 }
532 
533 #if !defined(_KERNEL)
534 
535 void
536 membar_enter(void)
537 {}
538 
539 void
540 membar_exit(void)
541 {}
542 
543 void
544 membar_producer(void)
545 {}
546 
547 void
548 membar_consumer(void)
549 {}
550 
551 #endif	/* _KERNEL */
552 
553 #endif	/* __lint */
554