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.
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.
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]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 .ident "%Z%%M% %I% %E% SMI"
31 #include <sys/asm_linkage.h>
35 * Legacy kernel interfaces; they will go away (eventually).
37 ANSI_PRAGMA_WEAK2(cas8,atomic_cas_8,function)
38 ANSI_PRAGMA_WEAK2(cas32,atomic_cas_32,function)
39 ANSI_PRAGMA_WEAK2(cas64,atomic_cas_64,function)
40 ANSI_PRAGMA_WEAK2(caslong,atomic_cas_ulong,function)
41 ANSI_PRAGMA_WEAK2(casptr,atomic_cas_ptr,function)
42 ANSI_PRAGMA_WEAK2(atomic_and_long,atomic_and_ulong,function)
43 ANSI_PRAGMA_WEAK2(atomic_or_long,atomic_or_ulong,function)
46 * Include the definitions for the libc weak aliases.
48 #include "../atomic_asm_weak.h"
52 ALTENTRY(atomic_inc_uchar)
57 SET_SIZE(atomic_inc_uchar)
58 SET_SIZE(atomic_inc_8)
61 ALTENTRY(atomic_inc_ushort)
66 SET_SIZE(atomic_inc_ushort)
67 SET_SIZE(atomic_inc_16)
70 ALTENTRY(atomic_inc_uint)
71 ALTENTRY(atomic_inc_ulong)
76 SET_SIZE(atomic_inc_ulong)
77 SET_SIZE(atomic_inc_uint)
78 SET_SIZE(atomic_inc_32)
80 ENTRY(atomic_inc_8_nv)
81 ALTENTRY(atomic_inc_uchar_nv)
91 SET_SIZE(atomic_inc_uchar_nv)
92 SET_SIZE(atomic_inc_8_nv)
94 ENTRY(atomic_inc_16_nv)
95 ALTENTRY(atomic_inc_ushort_nv)
105 SET_SIZE(atomic_inc_ushort_nv)
106 SET_SIZE(atomic_inc_16_nv)
108 ENTRY(atomic_inc_32_nv)
109 ALTENTRY(atomic_inc_uint_nv)
110 ALTENTRY(atomic_inc_ulong_nv)
116 cmpxchgl %ecx, (%edx)
120 SET_SIZE(atomic_inc_ulong_nv)
121 SET_SIZE(atomic_inc_uint_nv)
122 SET_SIZE(atomic_inc_32_nv)
125 * NOTE: If atomic_inc_64 and atomic_inc_64_nv are ever
126 * separated, you need to also edit the libc i386 platform
127 * specific mapfile and remove the NODYNSORT attribute
128 * from atomic_inc_64_nv.
131 ALTENTRY(atomic_inc_64_nv)
151 SET_SIZE(atomic_inc_64_nv)
152 SET_SIZE(atomic_inc_64)
155 ALTENTRY(atomic_dec_uchar)
160 SET_SIZE(atomic_dec_uchar)
161 SET_SIZE(atomic_dec_8)
164 ALTENTRY(atomic_dec_ushort)
169 SET_SIZE(atomic_dec_ushort)
170 SET_SIZE(atomic_dec_16)
173 ALTENTRY(atomic_dec_uint)
174 ALTENTRY(atomic_dec_ulong)
179 SET_SIZE(atomic_dec_ulong)
180 SET_SIZE(atomic_dec_uint)
181 SET_SIZE(atomic_dec_32)
183 ENTRY(atomic_dec_8_nv)
184 ALTENTRY(atomic_dec_uchar_nv)
194 SET_SIZE(atomic_dec_uchar_nv)
195 SET_SIZE(atomic_dec_8_nv)
197 ENTRY(atomic_dec_16_nv)
198 ALTENTRY(atomic_dec_ushort_nv)
208 SET_SIZE(atomic_dec_ushort_nv)
209 SET_SIZE(atomic_dec_16_nv)
211 ENTRY(atomic_dec_32_nv)
212 ALTENTRY(atomic_dec_uint_nv)
213 ALTENTRY(atomic_dec_ulong_nv)
219 cmpxchgl %ecx, (%edx)
223 SET_SIZE(atomic_dec_ulong_nv)
224 SET_SIZE(atomic_dec_uint_nv)
225 SET_SIZE(atomic_dec_32_nv)
228 * NOTE: If atomic_dec_64 and atomic_dec_64_nv are ever
229 * separated, it is important to edit the libc i386 platform
230 * specific mapfile and remove the NODYNSORT attribute
231 * from atomic_dec_64_nv.
234 ALTENTRY(atomic_dec_64_nv)
255 SET_SIZE(atomic_dec_64_nv)
256 SET_SIZE(atomic_dec_64)
259 ALTENTRY(atomic_add_char)
265 SET_SIZE(atomic_add_char)
266 SET_SIZE(atomic_add_8)
269 ALTENTRY(atomic_add_short)
275 SET_SIZE(atomic_add_short)
276 SET_SIZE(atomic_add_16)
279 ALTENTRY(atomic_add_int)
280 ALTENTRY(atomic_add_ptr)
281 ALTENTRY(atomic_add_long)
287 SET_SIZE(atomic_add_long)
288 SET_SIZE(atomic_add_ptr)
289 SET_SIZE(atomic_add_int)
290 SET_SIZE(atomic_add_32)
293 ALTENTRY(atomic_or_uchar)
299 SET_SIZE(atomic_or_uchar)
300 SET_SIZE(atomic_or_8)
303 ALTENTRY(atomic_or_ushort)
309 SET_SIZE(atomic_or_ushort)
310 SET_SIZE(atomic_or_16)
313 ALTENTRY(atomic_or_uint)
314 ALTENTRY(atomic_or_ulong)
320 SET_SIZE(atomic_or_ulong)
321 SET_SIZE(atomic_or_uint)
322 SET_SIZE(atomic_or_32)
325 ALTENTRY(atomic_and_uchar)
331 SET_SIZE(atomic_and_uchar)
332 SET_SIZE(atomic_and_8)
335 ALTENTRY(atomic_and_ushort)
341 SET_SIZE(atomic_and_ushort)
342 SET_SIZE(atomic_and_16)
345 ALTENTRY(atomic_and_uint)
346 ALTENTRY(atomic_and_ulong)
352 SET_SIZE(atomic_and_ulong)
353 SET_SIZE(atomic_and_uint)
354 SET_SIZE(atomic_and_32)
356 ENTRY(atomic_add_8_nv)
357 ALTENTRY(atomic_add_char_nv)
368 SET_SIZE(atomic_add_char_nv)
369 SET_SIZE(atomic_add_8_nv)
371 ENTRY(atomic_add_16_nv)
372 ALTENTRY(atomic_add_short_nv)
383 SET_SIZE(atomic_add_short_nv)
384 SET_SIZE(atomic_add_16_nv)
386 ENTRY(atomic_add_32_nv)
387 ALTENTRY(atomic_add_int_nv)
388 ALTENTRY(atomic_add_ptr_nv)
389 ALTENTRY(atomic_add_long_nv)
396 cmpxchgl %ecx, (%edx)
400 SET_SIZE(atomic_add_long_nv)
401 SET_SIZE(atomic_add_ptr_nv)
402 SET_SIZE(atomic_add_int_nv)
403 SET_SIZE(atomic_add_32_nv)
406 * NOTE: If atomic_add_64 and atomic_add_64_nv are ever
407 * separated, it is important to edit the libc i386 platform
408 * specific mapfile and remove the NODYNSORT attribute
409 * from atomic_add_64_nv.
412 ALTENTRY(atomic_add_64_nv)
431 SET_SIZE(atomic_add_64_nv)
432 SET_SIZE(atomic_add_64)
434 ENTRY(atomic_or_8_nv)
435 ALTENTRY(atomic_or_uchar_nv)
446 SET_SIZE(atomic_or_uchar_nv)
447 SET_SIZE(atomic_or_8_nv)
449 ENTRY(atomic_or_16_nv)
450 ALTENTRY(atomic_or_ushort_nv)
461 SET_SIZE(atomic_or_ushort_nv)
462 SET_SIZE(atomic_or_16_nv)
464 ENTRY(atomic_or_32_nv)
465 ALTENTRY(atomic_or_uint_nv)
466 ALTENTRY(atomic_or_ulong_nv)
473 cmpxchgl %ecx, (%edx)
477 SET_SIZE(atomic_or_ulong_nv)
478 SET_SIZE(atomic_or_uint_nv)
479 SET_SIZE(atomic_or_32_nv)
482 * NOTE: If atomic_or_64 and atomic_or_64_nv are ever
483 * separated, it is important to edit the libc i386 platform
484 * specific mapfile and remove the NODYNSORT attribute
485 * from atomic_or_64_nv.
488 ALTENTRY(atomic_or_64_nv)
507 SET_SIZE(atomic_or_64_nv)
508 SET_SIZE(atomic_or_64)
510 ENTRY(atomic_and_8_nv)
511 ALTENTRY(atomic_and_uchar_nv)
522 SET_SIZE(atomic_and_uchar_nv)
523 SET_SIZE(atomic_and_8_nv)
525 ENTRY(atomic_and_16_nv)
526 ALTENTRY(atomic_and_ushort_nv)
537 SET_SIZE(atomic_and_ushort_nv)
538 SET_SIZE(atomic_and_16_nv)
540 ENTRY(atomic_and_32_nv)
541 ALTENTRY(atomic_and_uint_nv)
542 ALTENTRY(atomic_and_ulong_nv)
549 cmpxchgl %ecx, (%edx)
553 SET_SIZE(atomic_and_ulong_nv)
554 SET_SIZE(atomic_and_uint_nv)
555 SET_SIZE(atomic_and_32_nv)
558 * NOTE: If atomic_and_64 and atomic_and_64_nv are ever
559 * separated, it is important to edit the libc i386 platform
560 * specific mapfile and remove the NODYNSORT attribute
561 * from atomic_and_64_nv.
564 ALTENTRY(atomic_and_64_nv)
583 SET_SIZE(atomic_and_64_nv)
584 SET_SIZE(atomic_and_64)
587 ALTENTRY(atomic_cas_uchar)
594 SET_SIZE(atomic_cas_uchar)
595 SET_SIZE(atomic_cas_8)
598 ALTENTRY(atomic_cas_ushort)
605 SET_SIZE(atomic_cas_ushort)
606 SET_SIZE(atomic_cas_16)
609 ALTENTRY(atomic_cas_uint)
610 ALTENTRY(atomic_cas_ulong)
611 ALTENTRY(atomic_cas_ptr)
616 cmpxchgl %ecx, (%edx)
618 SET_SIZE(atomic_cas_ptr)
619 SET_SIZE(atomic_cas_ulong)
620 SET_SIZE(atomic_cas_uint)
621 SET_SIZE(atomic_cas_32)
636 SET_SIZE(atomic_cas_64)
639 ALTENTRY(atomic_swap_uchar)
645 SET_SIZE(atomic_swap_uchar)
646 SET_SIZE(atomic_swap_8)
648 ENTRY(atomic_swap_16)
649 ALTENTRY(atomic_swap_ushort)
655 SET_SIZE(atomic_swap_ushort)
656 SET_SIZE(atomic_swap_16)
658 ENTRY(atomic_swap_32)
659 ALTENTRY(atomic_swap_uint)
660 ALTENTRY(atomic_swap_ptr)
661 ALTENTRY(atomic_swap_ulong)
667 SET_SIZE(atomic_swap_ulong)
668 SET_SIZE(atomic_swap_ptr)
669 SET_SIZE(atomic_swap_uint)
670 SET_SIZE(atomic_swap_32)
672 ENTRY(atomic_swap_64)
687 SET_SIZE(atomic_swap_64)
689 ENTRY(atomic_set_long_excl)
699 SET_SIZE(atomic_set_long_excl)
701 ENTRY(atomic_clear_long_excl)
711 SET_SIZE(atomic_clear_long_excl)
713 #if !defined(_KERNEL)
716 * NOTE: membar_enter, membar_exit, membar_producer, and
717 * membar_consumer are all identical routines. We define them
718 * separately, instead of using ALTENTRY definitions to alias them
719 * together, so that DTrace and debuggers will see a unique address
720 * for them, allowing more accurate tracing.
728 SET_SIZE(membar_enter)
734 SET_SIZE(membar_exit)
736 ENTRY(membar_producer)
740 SET_SIZE(membar_producer)
742 ENTRY(membar_consumer)
746 SET_SIZE(membar_consumer)
748 #endif /* !_KERNEL */
751 .section .note.GNU-stack,"",%progbits