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