17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bd9Sstevel@tonic-gate * with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate /* 237c478bd9Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*febac2a0SJosef 'Jeff' Sipek * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 267c478bd9Sstevel@tonic-gate */ 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate #ifndef _ASM_ATOMIC_H 297c478bd9Sstevel@tonic-gate #define _ASM_ATOMIC_H 307c478bd9Sstevel@tonic-gate 316b7143d7SRichard Lowe #include <sys/ccompile.h> 327c478bd9Sstevel@tonic-gate #include <sys/types.h> 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate #ifdef __cplusplus 357c478bd9Sstevel@tonic-gate extern "C" { 367c478bd9Sstevel@tonic-gate #endif 377c478bd9Sstevel@tonic-gate 387c478bd9Sstevel@tonic-gate #if !defined(__lint) && defined(__GNUC__) 397c478bd9Sstevel@tonic-gate 40*febac2a0SJosef 'Jeff' Sipek /* BEGIN CSTYLED */ 41*febac2a0SJosef 'Jeff' Sipek /* 42*febac2a0SJosef 'Jeff' Sipek * This file contains a number of static inline functions implementing 43*febac2a0SJosef 'Jeff' Sipek * various atomic variable functions. Note that these are *not* all of the 44*febac2a0SJosef 'Jeff' Sipek * atomic_* functions as defined in usr/src/uts/common/sys/atomic.h. All 45*febac2a0SJosef 'Jeff' Sipek * possible atomic_* functions are implemented in usr/src/common/atomic in 46*febac2a0SJosef 'Jeff' Sipek * pure assembly. In the absence of an identically named function in this 47*febac2a0SJosef 'Jeff' Sipek * header file, any use of the function will result in the compiler emitting 48*febac2a0SJosef 'Jeff' Sipek * a function call as usual. On the other hand, if an identically named 49*febac2a0SJosef 'Jeff' Sipek * function exists in this header as a static inline, the compiler will 50*febac2a0SJosef 'Jeff' Sipek * inline its contents and the linker never sees the symbol reference. We 51*febac2a0SJosef 'Jeff' Sipek * use this to avoid implementing some of the more complex and less used 52*febac2a0SJosef 'Jeff' Sipek * functions and instead falling back to function calls. Note that in some 53*febac2a0SJosef 'Jeff' Sipek * cases (e.g., atomic_inc_64) we implement a static inline only on AMD64 54*febac2a0SJosef 'Jeff' Sipek * but not i386. 55*febac2a0SJosef 'Jeff' Sipek */ 567c478bd9Sstevel@tonic-gate 57*febac2a0SJosef 'Jeff' Sipek /* 58*febac2a0SJosef 'Jeff' Sipek * Instruction suffixes for various operand sizes (assuming AMD64) 59*febac2a0SJosef 'Jeff' Sipek */ 60*febac2a0SJosef 'Jeff' Sipek #define SUF_8 "b" 61*febac2a0SJosef 'Jeff' Sipek #define SUF_16 "w" 62*febac2a0SJosef 'Jeff' Sipek #define SUF_32 "l" 63*febac2a0SJosef 'Jeff' Sipek #define SUF_64 "q" 64*febac2a0SJosef 'Jeff' Sipek 65*febac2a0SJosef 'Jeff' Sipek #if defined(__amd64) 66*febac2a0SJosef 'Jeff' Sipek #define SUF_LONG SUF_64 67*febac2a0SJosef 'Jeff' Sipek #define SUF_PTR SUF_64 68*febac2a0SJosef 'Jeff' Sipek #define __ATOMIC_OP64(...) __ATOMIC_OPXX(__VA_ARGS__) 697c478bd9Sstevel@tonic-gate #elif defined(__i386) 70*febac2a0SJosef 'Jeff' Sipek #define SUF_LONG SUF_32 71*febac2a0SJosef 'Jeff' Sipek #define SUF_PTR SUF_32 72*febac2a0SJosef 'Jeff' Sipek #define __ATOMIC_OP64(...) 73*febac2a0SJosef 'Jeff' Sipek #else 74*febac2a0SJosef 'Jeff' Sipek #error "port me" 75*febac2a0SJosef 'Jeff' Sipek #endif 76*febac2a0SJosef 'Jeff' Sipek 77*febac2a0SJosef 'Jeff' Sipek #if defined(__amd64) || defined(__i386) 78*febac2a0SJosef 'Jeff' Sipek 79*febac2a0SJosef 'Jeff' Sipek #define __ATOMIC_OPXX(fxn, type, op) \ 80*febac2a0SJosef 'Jeff' Sipek extern __GNU_INLINE void \ 81*febac2a0SJosef 'Jeff' Sipek fxn(volatile type *target) \ 82*febac2a0SJosef 'Jeff' Sipek { \ 83*febac2a0SJosef 'Jeff' Sipek __asm__ __volatile__( \ 84*febac2a0SJosef 'Jeff' Sipek "lock; " op " %0" \ 85*febac2a0SJosef 'Jeff' Sipek : "+m" (*target)); \ 86*febac2a0SJosef 'Jeff' Sipek } 87*febac2a0SJosef 'Jeff' Sipek 88*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_inc_8, uint8_t, "inc" SUF_8) 89*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_inc_16, uint16_t, "inc" SUF_16) 90*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_inc_32, uint32_t, "inc" SUF_32) 91*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OP64(atomic_inc_64, uint64_t, "inc" SUF_64) 92*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_inc_uchar, uchar_t, "inc" SUF_8) 93*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_inc_ushort, ushort_t, "inc" SUF_16) 94*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_inc_uint, uint_t, "inc" SUF_32) 95*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_inc_ulong, ulong_t, "inc" SUF_LONG) 96*febac2a0SJosef 'Jeff' Sipek 97*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_dec_8, uint8_t, "dec" SUF_8) 98*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_dec_16, uint16_t, "dec" SUF_16) 99*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_dec_32, uint32_t, "dec" SUF_32) 100*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OP64(atomic_dec_64, uint64_t, "dec" SUF_64) 101*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_dec_uchar, uchar_t, "dec" SUF_8) 102*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_dec_ushort, ushort_t, "dec" SUF_16) 103*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_dec_uint, uint_t, "dec" SUF_32) 104*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_dec_ulong, ulong_t, "dec" SUF_LONG) 105*febac2a0SJosef 'Jeff' Sipek 106*febac2a0SJosef 'Jeff' Sipek #undef __ATOMIC_OPXX 107*febac2a0SJosef 'Jeff' Sipek 108*febac2a0SJosef 'Jeff' Sipek #define __ATOMIC_OPXX(fxn, type1, type2, op) \ 109*febac2a0SJosef 'Jeff' Sipek extern __GNU_INLINE void \ 110*febac2a0SJosef 'Jeff' Sipek fxn(volatile type1 *target, type2 delta) \ 111*febac2a0SJosef 'Jeff' Sipek { \ 112*febac2a0SJosef 'Jeff' Sipek __asm__ __volatile__( \ 113*febac2a0SJosef 'Jeff' Sipek "lock; " op " %1,%0" \ 114*febac2a0SJosef 'Jeff' Sipek : "+m" (*target) \ 115*febac2a0SJosef 'Jeff' Sipek : "ir" (delta)); \ 116*febac2a0SJosef 'Jeff' Sipek } 117*febac2a0SJosef 'Jeff' Sipek 118*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_add_8, uint8_t, int8_t, "add" SUF_8) 119*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_add_16, uint16_t, int16_t, "add" SUF_16) 120*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_add_32, uint32_t, int32_t, "add" SUF_32) 121*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OP64(atomic_add_64, uint64_t, int64_t, "add" SUF_64) 122*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_add_char, uchar_t, signed char, "add" SUF_8) 123*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_add_short, ushort_t, short, "add" SUF_16) 124*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_add_int, uint_t, int, "add" SUF_32) 125*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_add_long, ulong_t, long, "add" SUF_LONG) 126*febac2a0SJosef 'Jeff' Sipek 127*febac2a0SJosef 'Jeff' Sipek /* 128*febac2a0SJosef 'Jeff' Sipek * We don't use the above macro here because atomic_add_ptr has an 129*febac2a0SJosef 'Jeff' Sipek * inconsistent type. The first argument should really be a 'volatile void 130*febac2a0SJosef 'Jeff' Sipek * **'. 131*febac2a0SJosef 'Jeff' Sipek */ 132*febac2a0SJosef 'Jeff' Sipek extern __GNU_INLINE void 133*febac2a0SJosef 'Jeff' Sipek atomic_add_ptr(volatile void *target, ssize_t delta) 134*febac2a0SJosef 'Jeff' Sipek { 135*febac2a0SJosef 'Jeff' Sipek volatile void **tmp = (volatile void **)target; 136*febac2a0SJosef 'Jeff' Sipek 137*febac2a0SJosef 'Jeff' Sipek __asm__ __volatile__( 138*febac2a0SJosef 'Jeff' Sipek "lock; add" SUF_PTR " %1,%0" 139*febac2a0SJosef 'Jeff' Sipek : "+m" (*tmp) 140*febac2a0SJosef 'Jeff' Sipek : "ir" (delta)); 141*febac2a0SJosef 'Jeff' Sipek } 142*febac2a0SJosef 'Jeff' Sipek 143*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_or_8, uint8_t, uint8_t, "or" SUF_8) 144*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_or_16, uint16_t, uint16_t, "or" SUF_16) 145*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_or_32, uint32_t, uint32_t, "or" SUF_32) 146*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OP64(atomic_or_64, uint64_t, uint64_t, "or" SUF_64) 147*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_or_uchar, uchar_t, uchar_t, "or" SUF_8) 148*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_or_ushort, ushort_t, ushort_t, "or" SUF_16) 149*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_or_uint, uint_t, uint_t, "or" SUF_32) 150*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_or_ulong, ulong_t, ulong_t, "or" SUF_LONG) 151*febac2a0SJosef 'Jeff' Sipek 152*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_and_8, uint8_t, uint8_t, "and" SUF_8) 153*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_and_16, uint16_t, uint16_t, "and" SUF_16) 154*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_and_32, uint32_t, uint32_t, "and" SUF_32) 155*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OP64(atomic_and_64, uint64_t, uint64_t, "and" SUF_64) 156*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_and_uchar, uchar_t, uchar_t, "and" SUF_8) 157*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_and_ushort, ushort_t, ushort_t, "and" SUF_16) 158*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_and_uint, uint_t, uint_t, "and" SUF_32) 159*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_and_ulong, ulong_t, ulong_t, "and" SUF_LONG) 160*febac2a0SJosef 'Jeff' Sipek 161*febac2a0SJosef 'Jeff' Sipek #undef __ATOMIC_OPXX 162*febac2a0SJosef 'Jeff' Sipek 163*febac2a0SJosef 'Jeff' Sipek #define __ATOMIC_OPXX(fxn, type, op, reg) \ 164*febac2a0SJosef 'Jeff' Sipek extern __GNU_INLINE type \ 165*febac2a0SJosef 'Jeff' Sipek fxn(volatile type *target, type cmp, type new) \ 166*febac2a0SJosef 'Jeff' Sipek { \ 167*febac2a0SJosef 'Jeff' Sipek type ret; \ 168*febac2a0SJosef 'Jeff' Sipek __asm__ __volatile__( \ 169*febac2a0SJosef 'Jeff' Sipek "lock; " op " %2,%0" \ 170*febac2a0SJosef 'Jeff' Sipek : "+m" (*target), "=a" (ret) \ 171*febac2a0SJosef 'Jeff' Sipek : reg (new), "1" (cmp) \ 172*febac2a0SJosef 'Jeff' Sipek : "cc"); \ 173*febac2a0SJosef 'Jeff' Sipek return (ret); \ 174*febac2a0SJosef 'Jeff' Sipek } 175*febac2a0SJosef 'Jeff' Sipek 176*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_cas_8, uint8_t, "cmpxchg" SUF_8, "q") 177*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_cas_16, uint16_t, "cmpxchg" SUF_16, "r") 178*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_cas_32, uint32_t, "cmpxchg" SUF_32, "r") 179*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OP64(atomic_cas_64, uint64_t, "cmpxchg" SUF_64, "r") 180*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_cas_uchar, uchar_t, "cmpxchg" SUF_8, "q") 181*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_cas_ushort, ushort_t, "cmpxchg" SUF_16, "r") 182*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_cas_uint, uint_t, "cmpxchg" SUF_32, "r") 183*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_cas_ulong, ulong_t, "cmpxchg" SUF_LONG, "r") 184*febac2a0SJosef 'Jeff' Sipek 185*febac2a0SJosef 'Jeff' Sipek #undef __ATOMIC_OPXX 186*febac2a0SJosef 'Jeff' Sipek 187*febac2a0SJosef 'Jeff' Sipek /* 188*febac2a0SJosef 'Jeff' Sipek * We don't use the above macro here because atomic_cas_ptr has an 189*febac2a0SJosef 'Jeff' Sipek * inconsistent type. The first argument should really be a 'volatile void 190*febac2a0SJosef 'Jeff' Sipek * **'. 191*febac2a0SJosef 'Jeff' Sipek */ 192*febac2a0SJosef 'Jeff' Sipek extern __GNU_INLINE void * 193*febac2a0SJosef 'Jeff' Sipek atomic_cas_ptr(volatile void *target, void *cmp, void *new) 194*febac2a0SJosef 'Jeff' Sipek { 195*febac2a0SJosef 'Jeff' Sipek volatile void **tmp = (volatile void **)target; 196*febac2a0SJosef 'Jeff' Sipek void *ret; 197*febac2a0SJosef 'Jeff' Sipek 198*febac2a0SJosef 'Jeff' Sipek __asm__ __volatile__( 199*febac2a0SJosef 'Jeff' Sipek "lock; cmpxchg" SUF_PTR " %2,%0" 200*febac2a0SJosef 'Jeff' Sipek : "+m" (*tmp), "=a" (ret) 201*febac2a0SJosef 'Jeff' Sipek : "r" (new), "1" (cmp) 202*febac2a0SJosef 'Jeff' Sipek : "cc"); 203*febac2a0SJosef 'Jeff' Sipek 204*febac2a0SJosef 'Jeff' Sipek return (ret); 205*febac2a0SJosef 'Jeff' Sipek } 206*febac2a0SJosef 'Jeff' Sipek 207*febac2a0SJosef 'Jeff' Sipek #define __ATOMIC_OPXX(fxn, type, op, reg) \ 208*febac2a0SJosef 'Jeff' Sipek extern __GNU_INLINE type \ 209*febac2a0SJosef 'Jeff' Sipek fxn(volatile type *target, type val) \ 210*febac2a0SJosef 'Jeff' Sipek { \ 211*febac2a0SJosef 'Jeff' Sipek __asm__ __volatile__( \ 212*febac2a0SJosef 'Jeff' Sipek op " %1,%0" \ 213*febac2a0SJosef 'Jeff' Sipek : "+m" (*target), "+" reg (val)); \ 214*febac2a0SJosef 'Jeff' Sipek return (val); \ 215*febac2a0SJosef 'Jeff' Sipek } 216*febac2a0SJosef 'Jeff' Sipek 217*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_swap_8, uint8_t, "xchg" SUF_8, "q") 218*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_swap_16, uint16_t, "xchg" SUF_16, "r") 219*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_swap_32, uint32_t, "xchg" SUF_32, "r") 220*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OP64(atomic_swap_64, uint64_t, "xchg" SUF_64, "r") 221*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_swap_uchar, uchar_t, "xchg" SUF_8, "q") 222*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_swap_ushort, ushort_t, "xchg" SUF_16, "r") 223*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_swap_uint, uint_t, "xchg" SUF_32, "r") 224*febac2a0SJosef 'Jeff' Sipek __ATOMIC_OPXX(atomic_swap_ulong, ulong_t, "xchg" SUF_LONG, "r") 225*febac2a0SJosef 'Jeff' Sipek 226*febac2a0SJosef 'Jeff' Sipek #undef __ATOMIC_OPXX 227*febac2a0SJosef 'Jeff' Sipek 228*febac2a0SJosef 'Jeff' Sipek /* 229*febac2a0SJosef 'Jeff' Sipek * We don't use the above macro here because atomic_swap_ptr has an 230*febac2a0SJosef 'Jeff' Sipek * inconsistent type. The first argument should really be a 'volatile void 231*febac2a0SJosef 'Jeff' Sipek * **'. 232*febac2a0SJosef 'Jeff' Sipek */ 233*febac2a0SJosef 'Jeff' Sipek extern __GNU_INLINE void * 234*febac2a0SJosef 'Jeff' Sipek atomic_swap_ptr(volatile void *target, void *val) 235*febac2a0SJosef 'Jeff' Sipek { 236*febac2a0SJosef 'Jeff' Sipek volatile void **tmp = (volatile void **)target; 237*febac2a0SJosef 'Jeff' Sipek 238*febac2a0SJosef 'Jeff' Sipek __asm__ __volatile__( 239*febac2a0SJosef 'Jeff' Sipek "xchg" SUF_PTR " %1,%0" 240*febac2a0SJosef 'Jeff' Sipek : "+m" (*tmp), "+r" (val)); 241*febac2a0SJosef 'Jeff' Sipek 242*febac2a0SJosef 'Jeff' Sipek return (val); 243*febac2a0SJosef 'Jeff' Sipek } 2447c478bd9Sstevel@tonic-gate 2457c478bd9Sstevel@tonic-gate #else 2467c478bd9Sstevel@tonic-gate #error "port me" 2477c478bd9Sstevel@tonic-gate #endif 2487c478bd9Sstevel@tonic-gate 249*febac2a0SJosef 'Jeff' Sipek #undef SUF_8 250*febac2a0SJosef 'Jeff' Sipek #undef SUF_16 251*febac2a0SJosef 'Jeff' Sipek #undef SUF_32 252*febac2a0SJosef 'Jeff' Sipek #undef SUF_64 253*febac2a0SJosef 'Jeff' Sipek #undef SUF_LONG 254*febac2a0SJosef 'Jeff' Sipek #undef SUF_PTR 255*febac2a0SJosef 'Jeff' Sipek 256*febac2a0SJosef 'Jeff' Sipek #undef __ATOMIC_OP64 257*febac2a0SJosef 'Jeff' Sipek 258*febac2a0SJosef 'Jeff' Sipek /* END CSTYLED */ 259*febac2a0SJosef 'Jeff' Sipek 2607c478bd9Sstevel@tonic-gate #endif /* !__lint && __GNUC__ */ 2617c478bd9Sstevel@tonic-gate 2627c478bd9Sstevel@tonic-gate #ifdef __cplusplus 2637c478bd9Sstevel@tonic-gate } 2647c478bd9Sstevel@tonic-gate #endif 2657c478bd9Sstevel@tonic-gate 2667c478bd9Sstevel@tonic-gate #endif /* _ASM_ATOMIC_H */ 267