Annotation of coherent/f/usr/include/kernel/x86lock.h, revision 1.1.1.1

1.1       root        1: #ifndef        __KERNEL_X86LOCK_H__
                      2: #define        __KERNEL_X86LOCK_H__
                      3: 
                      4: /*
                      5:  * Here we encapsulate all the system-specific basics for dealing with multi-
                      6:  * and uni-processor locking in an i386 environment. Note that the functions
                      7:  * defined here for the user have names that are too long for common ISO C
                      8:  * external linkage limitations; this should not be an obstacle, since the
                      9:  * functions defined here will normally have internal linkage.
                     10:  *
                     11:  * Note that none of the functions here are defined in the DDI/DKI. This
                     12:  * header is purely for internal purposes and for this reason does not follow
                     13:  * the usual DDI/DKI header binary-compatibility structure with external-
                     14:  * linkage versions always available.
                     15:  */
                     16: 
                     17: /*
                     18:  *-IMPORTS:
                     19:  *     <common/ccompat.h>
                     20:  *             __INLINE__
                     21:  *             __VOLATILE__
                     22:  *             __NON_ISO ()
                     23:  *     <common/xdebug.h>
                     24:  *             __LOCAL__
                     25:  *     <common/__types.h>
                     26:  *             __uchar_t
                     27:  *             __ushort_t
                     28:  *             __uint_t
                     29:  *             __ulong_t
                     30:  *     <kernel/__pl.h>
                     31:  *             __pl_t
                     32:  */
                     33: 
                     34: #include <common/ccompat.h>
                     35: #include <common/xdebug.h>
                     36: #include <common/__types.h>
                     37: #include <kernel/__pl.h>
                     38: 
                     39: 
                     40: /*
                     41:  * On the 386, there are no "compare and swap" instructions as in the 68020
                     42:  * CPU. Unfortunately, this deficiency makes some of the more advanced
                     43:  * synchronisation algorithms unavailable (and introduces locking requirements
                     44:  * where no locking is needed in the 68020).
                     45:  *
                     46:  * The facilities that do exist are an atomic fetch-and-set via XCHG, and
                     47:  * atomic arithmetic via the LOCK instruction prefix. Neither facility is
                     48:  * directly available in C, so this header file encapsulates the system-
                     49:  * specific methods for gaining access to these atomic operations.
                     50:  *
                     51:  * We define a wide range of atomic data types, so that in cases where a
                     52:  * machine might not be able to support a high-level atomic operation on a
                     53:  * data type it will be possible to build the high-level operation out of
                     54:  * primitive locking facilities like test-and-set.
                     55:  *
                     56:  * We use the single-element-array declarations for two reasons: 1) we may
                     57:  * as well have implicit reference-passing semantics, and 2) it seems like
                     58:  * the easiest way (until C++, at least) of preventing the accidental misuse
                     59:  * of data items of these types.
                     60:  *
                     61:  * Each atomic type is guaranteed to have the same range as the <limits.h>
                     62:  * header specifies, but may be considerably larger (and have different
                     63:  * alignment requirements) than objects of the base non-atomic type.
                     64:  *
                     65:  * Dealing with atomic pointers: with C++, there is currently no guarantee
                     66:  * equivalent to the ISO C requirement that any pointer type can be converted
                     67:  * to and from a value of type "void *" successfully without loss of
                     68:  * information. For now, we operate without this guarantee rather than
                     69:  * introducing possibly unnecessary complexity via a "generic" structure-
                     70:  * pointer type. In point of fact, we don't support the only known case where
                     71:  * this doesn't work anyway (Borland C++ medium model, SS != DS) since we
                     72:  * assume SS = DS in those small-data models for simplicity anyway.
                     73:  *
                     74:  * To make things easier for the Borland C++, all the functions defined here
                     75:  * are permitted to evaluate their "lock" argument multiple times, which is
                     76:  * why the names have been changed to all upper-case.
                     77:  */
                     78: 
                     79: /*
                     80:  * The split between the user-visible (implicit reference) and internal
                     81:  * (volatile, decayed pointer) types was effectively forced by differences
                     82:  * in the way the available translators dealt with type-qualifiers and casts
                     83:  * to values of array type.
                     84:  *
                     85:  * As it happens, this split appears to have produced the most aesthetically
                     86:  * pleasing code forms, much to my surprise, as well as pointing up a lurking
                     87:  * problem (a misplaced "volatile") in the treatment of atomic_ptr_t.
                     88:  */
                     89: 
                     90: typedef signed char                    atomic_char_t [1];
                     91: typedef        short                           atomic_short_t [1];
                     92: typedef        int                             atomic_int_t [1];
                     93: typedef        long                            atomic_long_t [1];
                     94: 
                     95: typedef        __uchar_t                       atomic_uchar_t [1];
                     96: typedef __ushort_t                     atomic_ushort_t [1];
                     97: typedef __uint_t                       atomic_uint_t [1];
                     98: typedef __ulong_t                      atomic_ulong_t [1];
                     99: 
                    100: typedef        __VOID__                      * atomic_ptr_t [1];
                    101: 
                    102: typedef        __VOLATILE__ signed char      * __atomic_char_t;
                    103: typedef        __VOLATILE__ __uchar_t        * __atomic_uchar_t;
                    104: typedef        __VOLATILE__ short            * __atomic_short_t;
                    105: typedef        __VOLATILE__ __ushort_t       * __atomic_ushort_t;
                    106: typedef        __VOLATILE__ int              * __atomic_int_t;
                    107: typedef        __VOLATILE__ __uint_t         * __atomic_uint_t;
                    108: typedef        __VOLATILE__ long             * __atomic_long_t;
                    109: typedef        __VOLATILE__ __ulong_t        * __atomic_ulong_t;
                    110: typedef        __VOID__       * __VOLATILE__ * __atomic_ptr_t;
                    111: 
                    112: 
                    113: /*
                    114:  * Here we define C-linkage prototypes for the functions that we want to
                    115:  * define (possibly as macros) here, so that it's easy to suppress any macro
                    116:  * definitions given below and get full type-checking even for compilers that
                    117:  * need macros to get the inline versions.
                    118:  *
                    119:  * Note that while ATOMIC_TEST_AND_SET_UCHAR has () functionality that is
                    120:  * completely availble through ATOMIC_FETCH_AND_STORE_UCHAR (), we define it
                    121:  * as a separate function so as not to overly constrain implementations on
                    122:  * machines such as the 60820, which has the powerful "compare and swap"
                    123:  * operation and the basic "test and set operation", but no basic exchange
                    124:  * (whereas the 88100 implements only exchange, and only on bytes and 32-bit
                    125:  * long words).
                    126:  *
                    127:  * Being verbose here is a small price to pay for the later flexibility.
                    128:  */
                    129: 
                    130: 
                    131: #if    ! (__GNUC__ && (defined (i386) || _I386))
                    132: 
                    133: __EXTERN_C_BEGIN__
                    134: 
                    135: char      ATOMIC_FETCH_AND_STORE_CHAR  __PROTO ((__atomic_char_t _lock,
                    136:                                                  char _newvalue));
                    137: __uchar_t  ATOMIC_FETCH_AND_STORE_UCHAR        __PROTO ((__atomic_uchar_t _lock,
                    138:                                                  __uchar_t _newvalue));
                    139: short     ATOMIC_FETCH_AND_STORE_SHORT __PROTO ((__atomic_short_t _lock,
                    140:                                                  short _newvalue));
                    141: __ushort_t ATOMIC_FETCH_AND_STORE_USHORT __PROTO ((__atomic_ushort_t _lock,
                    142:                                                   __ushort_t _newvalue));
                    143: int       ATOMIC_FETCH_AND_STORE_INT   __PROTO ((__atomic_int_t _lock,
                    144:                                                  int _newvalue));
                    145: __uint_t   ATOMIC_FETCH_AND_STORE_UINT __PROTO ((__atomic_uint_t _lock,
                    146:                                                  __uint_t _newvalue));
                    147: long      ATOMIC_FETCH_AND_STORE_LONG  __PROTO ((__atomic_long_t _lock,
                    148:                                                  long _newvalue));
                    149: __ulong_t  ATOMIC_FETCH_AND_STORE_ULONG        __PROTO ((__atomic_ulong_t _lock,
                    150:                                                  __ulong_t _newvalue));
                    151: 
                    152: __VOID__ * ATOMIC_FETCH_AND_STORE_PTR  __PROTO ((__atomic_ptr_t _lock,
                    153:                                                  __VOID__ * _newvalue));
                    154: 
                    155: char      ATOMIC_FETCH_CHAR            __PROTO ((__atomic_char_t _lock));
                    156: __uchar_t  ATOMIC_FETCH_UCHAR          __PROTO ((__atomic_uchar_t _lock));
                    157: short     ATOMIC_FETCH_SHORT           __PROTO ((__atomic_short_t _lock));
                    158: __ushort_t ATOMIC_FETCH_USHORT         __PROTO ((__atomic_ushort_t _lock));
                    159: int       ATOMIC_FETCH_INT             __PROTO ((__atomic_int_t _lock));
                    160: __uint_t   ATOMIC_FETCH_UINT           __PROTO ((__atomic_uint_t _lock));
                    161: long      ATOMIC_FETCH_LONG            __PROTO ((__atomic_long_t _lock));
                    162: __ulong_t  ATOMIC_FETCH_ULONG          __PROTO ((__atomic_ulong_t _lock));
                    163: __VOID__ * ATOMIC_FETCH_PTR            __PROTO ((__atomic_ptr_t _lock));
                    164: 
                    165: int       ATOMIC_TEST_AND_SET_UCHAR    __PROTO ((__atomic_uchar_t _lock));
                    166: 
                    167: void      ATOMIC_STORE_PTR             __PROTO ((__atomic_ptr_t _lock,
                    168:                                                  __VOID__ * _newvalue));
                    169: 
                    170: void      ATOMIC_CLEAR_UCHAR           __PROTO ((__atomic_uchar_t _lock));
                    171: void      ATOMIC_CLEAR_USHORT          __PROTO ((__atomic_ushort_t _lock));
                    172: void      ATOMIC_CLEAR_PTR             __PROTO ((__atomic_ptr_t _lock));
                    173: 
                    174: __EXTERN_C_END__
                    175: 
                    176: 
                    177: #else  /* __GNUC__ && (defined (i386) || _I386) */
                    178: 
                    179: 
                    180: __LOCAL__ __INLINE__
                    181: char ATOMIC_FETCH_AND_STORE_CHAR (__atomic_char_t _lock,
                    182:                                  char _newvalue) {
                    183:        __NON_ISO (asm) volatile ("xchgb %0, %2" : "=r" (_newvalue) :
                    184:                                  "0" (_newvalue), "m" (_lock [0]));
                    185:        return _newvalue;
                    186: }
                    187: 
                    188: __LOCAL__ __INLINE__
                    189: __uchar_t ATOMIC_FETCH_AND_STORE_UCHAR (__atomic_uchar_t _lock,
                    190:                                        __uchar_t _newvalue) {
                    191:        __NON_ISO (asm) volatile ("xchgb %0, %2" : "=r" (_newvalue) :
                    192:                                  "0" (_newvalue), "m" (_lock [0]));
                    193:        return _newvalue;
                    194: }
                    195: 
                    196: __LOCAL__ __INLINE__
                    197: short ATOMIC_FETCH_AND_STORE_SHORT (__atomic_short_t _lock,
                    198:                                    short _newvalue) {
                    199:        __NON_ISO (asm) volatile ("xchgw %0, %2" : "=r" (_newvalue) :
                    200:                                  "0" (_newvalue), "m" (_lock [0]));
                    201:        return _newvalue;
                    202: }
                    203: 
                    204: __LOCAL__ __INLINE__
                    205: __ushort_t ATOMIC_FETCH_AND_STORE_USHORT (__atomic_ushort_t _lock,
                    206:                                          __ushort_t _newvalue) {
                    207:        __NON_ISO (asm) volatile ("xchgw %0, %2" : "=r" (_newvalue) :
                    208:                                  "0" (_newvalue), "m" (_lock [0]));
                    209:        return _newvalue;
                    210: }
                    211: 
                    212: __LOCAL__ __INLINE__
                    213: int ATOMIC_FETCH_AND_STORE_INT (__atomic_int_t _lock,
                    214:                                int _newvalue) {
                    215:        __NON_ISO (asm) volatile ("xchgl %0, %2" : "=r" (_newvalue) :
                    216:                                  "0" (_newvalue), "m" (_lock [0]));
                    217:        return _newvalue;
                    218: }
                    219: 
                    220: __LOCAL__ __INLINE__
                    221: __uint_t ATOMIC_FETCH_AND_STORE_UINT (__atomic_uint_t _lock,
                    222:                                      __uint_t _newvalue) {
                    223:        __NON_ISO (asm) volatile ("xchgl %0, %2" : "=r" (_newvalue) :
                    224:                                  "0" (_newvalue), "m" (_lock [0]));
                    225:        return _newvalue;
                    226: }
                    227: 
                    228: __LOCAL__ __INLINE__
                    229: long ATOMIC_FETCH_AND_STORE_LONG (__atomic_long_t _lock,
                    230:                                  long _newvalue) {
                    231:        __NON_ISO (asm) volatile ("xchgl %0, %2" : "=r" (_newvalue) :
                    232:                                  "0" (_newvalue), "m" (_lock [0]));
                    233:        return _newvalue;
                    234: }
                    235: 
                    236: __LOCAL__ __INLINE__
                    237: __ulong_t ATOMIC_FETCH_AND_STORE_ULONG (__atomic_ulong_t _lock,
                    238:                                        __ulong_t _newvalue) {
                    239:        __NON_ISO (asm) volatile ("xchgl %0, %2" : "=r" (_newvalue) :
                    240:                                  "0" (_newvalue), "m" (_lock [0]));
                    241:        return _newvalue;
                    242: }
                    243: 
                    244: __LOCAL__ __INLINE__
                    245: __VOID__ * ATOMIC_FETCH_AND_STORE_PTR (__atomic_ptr_t _lock,
                    246:                                       __VOID__ * _newvalue) {
                    247:        __NON_ISO (asm) volatile ("xchgl %0, %2" : "=r" (_newvalue) :
                    248:                                  "0" (_newvalue), "m" (_lock [0]));
                    249:        return _newvalue;
                    250: }
                    251: 
                    252: __LOCAL__ __INLINE__ char ATOMIC_FETCH_CHAR (__atomic_char_t _lock) {
                    253:        return _lock [0];
                    254: }
                    255: 
                    256: __LOCAL__ __INLINE__ __uchar_t ATOMIC_FETCH_UCHAR (__atomic_uchar_t _lock) {
                    257:        return _lock [0];
                    258: }
                    259: 
                    260: __LOCAL__ __INLINE__ short ATOMIC_FETCH_SHORT (__atomic_short_t _lock) {
                    261:        return _lock [0];
                    262: }
                    263: 
                    264: __LOCAL__ __INLINE__ __ushort_t ATOMIC_FETCH_USHORT (__atomic_ushort_t _lock) {
                    265:        return _lock [0];
                    266: }
                    267: 
                    268: __LOCAL__ __INLINE__ int ATOMIC_FETCH_INT (__atomic_int_t _lock) {
                    269:        return _lock [0];
                    270: }
                    271: 
                    272: __LOCAL__ __INLINE__ __uint_t ATOMIC_FETCH_UINT (__atomic_uint_t _lock) {
                    273:        return _lock [0];
                    274: }
                    275: 
                    276: __LOCAL__ __INLINE__ long ATOMIC_FETCH_LONG (__atomic_long_t _lock) {
                    277:        return _lock [0];
                    278: }
                    279: 
                    280: __LOCAL__ __INLINE__ __ulong_t ATOMIC_FETCH_ULONG (__atomic_ulong_t _lock) {
                    281:        return _lock [0];
                    282: }
                    283: 
                    284: __LOCAL__ __INLINE__ __VOID__ * ATOMIC_FETCH_PTR (__atomic_ptr_t _lock) {
                    285:        return (__VOID__ *) _lock [0];
                    286: }
                    287: 
                    288: __LOCAL__ __INLINE__ int ATOMIC_TEST_AND_SET_UCHAR (__atomic_uchar_t _lock) {
                    289:        return ATOMIC_FETCH_AND_STORE_UCHAR (_lock, (__uchar_t) -1);
                    290: }
                    291: 
                    292: __LOCAL__ __INLINE__ void ATOMIC_CLEAR_UCHAR (__atomic_uchar_t _lock) {
                    293:        _lock [0] = 0;
                    294: }
                    295: 
                    296: __LOCAL__ __INLINE__ void ATOMIC_CLEAR_USHORT (__atomic_ushort_t _lock) {
                    297:        _lock [0] = 0;
                    298: }
                    299: 
                    300: __LOCAL__ __INLINE__ void ATOMIC_CLEAR_PTR (__atomic_ptr_t _lock) {
                    301:        _lock [0] = 0;
                    302: }
                    303: 
                    304: __LOCAL__ __INLINE__
                    305: void ATOMIC_STORE_UCHAR (__atomic_uchar_t _lock, __uchar_t _newvalue) {
                    306:        _lock [0] = _newvalue;
                    307: }
                    308: 
                    309: __LOCAL__ __INLINE__
                    310: void ATOMIC_STORE_PTR (__atomic_ptr_t _lock, __VOID__ * _newvalue) {
                    311:        _lock [0] = _newvalue;
                    312: }
                    313: 
                    314: #endif
                    315: 
                    316: 
                    317: #if    __BORLANDC__
                    318: 
                    319: 
                    320: /*lint -e570 *//* Anything with pseudoregisters causes spurious warnings */
                    321: /*lint -e732 *//* Anything with pseudoregisters causes spurious warnings */
                    322: /*lint -e915 *//* Anything with pseudoregisters causes spurious warnings */
                    323: 
                    324: void   __emit__        (unsigned char __byte, ...);
                    325: 
                    326: /*
                    327:  * Borland C++ has many restrictions on assembly and in-line functions. To
                    328:  * get around some of these, we use the 32-bit-register pseudovariables that
                    329:  * are available when targetting the 386. Note how we convert 32-bit values
                    330:  * into 16-bit seg:offset pairs and back via the stack; this avoids several
                    331:  * of the nastier bugs in the 32-bit support.
                    332:  */
                    333: 
                    334: #define        __USE_ES__              0x26
                    335: #define        __XCHG_AL_ESBX__        __USE_ES__, 0x86, 0x07
                    336: #define        __XCHG_AX_ESBX__        __USE_ES__, 0x87, 0x07
                    337: #define        __XCHG_EAX_ESBX__       __USE_ES__, 0x66, 0x87, 0x07
                    338: #define        __MOV_AX_ESBX__         __USE_ES__, 0x8B, 0x07
                    339: #define        __MOV_EAX_ESBX__        __USE_ES__, 0x66, 0x8B, 0x07
                    340: 
                    341: #if    defined (__LARGE__) || defined (__HUGE__) || defined (__COMPACT__)
                    342: #define        __lockaddr(l)           (_ES = (unsigned) (void __seg *) \
                    343:                                                (void __far *) (l),\
                    344:                                 _BX = (unsigned) (l))
                    345: #else
                    346: #define        __lockaddr(l)           (_ES = _DS, _BX = (unsigned) (l))
                    347: #endif
                    348: 
                    349: 
                    350: #define ATOMIC_FETCH_AND_STORE_CHAR(l,v) (__lockaddr (l), _AL = (v),\
                    351:                                          __emit__ (__XCHG_AL_ESBX__),\
                    352:                                          (char) _AL)
                    353: #define        ATOMIC_FETCH_AND_STORE_UCHAR(l,v) (__lockaddr (l), _AL = (v),\
                    354:                                           __emit__ (__XCHG_AL_ESBX__),\
                    355:                                           (__uchar_t) _AL)
                    356: #define ATOMIC_FETCH_AND_STORE_SHORT(l,v) (__lockaddr (l), _AX = (v),\
                    357:                                           __emit__ (__XCHG_AX_ESBX__),\
                    358:                                           (short) _AX)
                    359: #define        ATOMIC_FETCH_AND_STORE_USHORT(l,v) (__lockaddr (l), _AX = (v),\
                    360:                                            __emit__ (__XCHG_AX_ESBX__),\
                    361:                                            (__ushort_t) _AX)
                    362: #define ATOMIC_FETCH_AND_STORE_INT(l,v)        (__lockaddr (l), _AX = (v),\
                    363:                                         __emit__ (__XCHG_AX_ESBX__),\
                    364:                                         (int) _AX)
                    365: #define        ATOMIC_FETCH_AND_STORE_UINT(l,v) (__lockaddr (l), _AX = (v),\
                    366:                                          __emit__ (__XCHG_AX_ESBX__),\
                    367:                                          (__uint_t) _AX)
                    368: #define ATOMIC_FETCH_AND_STORE_LONG(l,v) (__lockaddr (l), _EAX = (v),\
                    369:                                          __emit__ (__XCHG_EAX_ESBX__),\
                    370:                                          (long) _EAX)
                    371: #define        ATOMIC_FETCH_AND_STORE_ULONG(l,v) (__lockaddr (l), _EAX = (v),\
                    372:                                           __emit__ (__XCHG_EAX_ESBX__),\
                    373:                                           (__ulong_t) _EAX)
                    374: 
                    375: #define        ATOMIC_FETCH_CHAR(l)            (((__atomic_char_t) (l)) [0])
                    376: #define        ATOMIC_FETCH_UCHAR(l)           (((__atomic_uchar_t) (l)) [0])
                    377: #define        ATOMIC_FETCH_SHORT(l)           (((__atomic_short_t) (l)) [0])
                    378: #define        ATOMIC_FETCH_USHORT(l)          (((__atomic_ushort_t) (l)) [0])
                    379: #define        ATOMIC_FETCH_INT(l)             (((__atomic_int_t) (l)) [0])
                    380: #define        ATOMIC_FETCH_UINT(l)            (((__atomic_uint_t) (l)) [0])
                    381: #define        ATOMIC_FETCH_LONG(l)            ((long) (_EAX = ((__atomic_long_t) (l)) [0]))
                    382: #define        ATOMIC_FETCH_ULONG(l)           ((__ulong_t) (_EAX = ((__atomic_ulong_t) (l)) [0]))
                    383: 
                    384: #define        ATOMIC_TEST_AND_SET_UCHAR(l)    ATOMIC_FETCH_AND_STORE_UCHAR (l, -1)
                    385: 
                    386: #define        ATOMIC_CLEAR_UCHAR(l)           ((void) (((__atomic_uchar_t) (l)) [0] = 0))
                    387: #define        ATOMIC_CLEAR_USHORT(l)          ((void) (((__atomic_ushort_t) (l)) [0] = 0))
                    388: 
                    389: #define        ATOMIC_STORE_UCHAR(l,v)         ((void) (((__atomic_uchar_t) (l)) [0] = (v)))
                    390: 
                    391: #if    defined (__LARGE__) || defined (__HUGE__) || defined (__COMPACT__)
                    392: 
                    393: /*
                    394:  * The ATOMIC_FETCH_AND_STORE_PTR () operation cannot be performed in-line in
                    395:  * BC++ 3.1 in large data models due to code-generation bugs that appear to
                    396:  * be caused by a mix of problems casting 32-bit registers to pointers and
                    397:  * other problems dealing with far-pointer-valued returns from in-line
                    398:  * assembly.
                    399:  */
                    400: 
                    401: #define        ATOMIC_STORE_PTR(l,v)           (__lockaddr (l), _EAX = (long) (v),\
                    402:                                         __emit__ (__XCHG_EAX_ESBX__))
                    403: 
                    404: #define        ATOMIC_FETCH_PTR(l)             ((void *) (_EAX = ((__atomic_ulong_t) (l)) [0]))
                    405: 
                    406: #define        ATOMIC_CLEAR_PTR(l)             ATOMIC_STORE_PTR (l, 0)
                    407: 
                    408: #else  /* use simpler small-data version */
                    409: 
                    410: #define        ATOMIC_FETCH_AND_STORE_PTR(l,v) (__lockaddr (l), _AX = (unsigned) (v),\
                    411:                                         __emit__ (__XCHG_AX_ESBX__), \
                    412:                                         (void *) _AX)
                    413: 
                    414: #define        ATOMIC_STORE_PTR(l,v)           (__lockaddr (l), _AX = (unsigned) (v),\
                    415:                                         __emit__ (__XCHG_AX_ESBX__))
                    416: 
                    417: #define        ATOMIC_FETCH_PTR(l)             (((__atomic_ptr_t) (l)) [0])
                    418: 
                    419: #define        ATOMIC_CLEAR_PTR(l)             ATOMIC_STORE_PTR (l, 0)
                    420: 
                    421: #endif /* small data model */
                    422: 
                    423: 
                    424: #elif  __COHERENT__
                    425: 
                    426: 
                    427: #define        ATOMIC_FETCH_CHAR(l)            (((__atomic_char_t) (l)) [0])
                    428: #define        ATOMIC_FETCH_UCHAR(l)           (((__atomic_uchar_t) (l)) [0])
                    429: #define        ATOMIC_FETCH_SHORT(l)           (((__atomic_short_t) (l)) [0])
                    430: #define        ATOMIC_FETCH_USHORT(l)          (((__atomic_ushort_t) (l)) [0])
                    431: #define        ATOMIC_FETCH_INT(l)             (((__atomic_int_t) (l)) [0])
                    432: #define        ATOMIC_FETCH_UINT(l)            (((__atomic_uint_t) (l)) [0])
                    433: #define        ATOMIC_FETCH_LONG(l)            (((__atomic_long_t) (l)) [0])
                    434: #define        ATOMIC_FETCH_ULONG(l)           (((__atomic_ulong_t) (l)) [0])
                    435: #define        ATOMIC_FETCH_PTR(l)             (((__atomic_ptr_t) (l)) [0])
                    436: 
                    437: #define        ATOMIC_TEST_AND_SET_UCHAR(l)    ATOMIC_FETCH_AND_STORE_UCHAR (l, -1)
                    438: 
                    439: #define        ATOMIC_CLEAR_UCHAR(l)           ((void) (((__atomic_uchar_t) (l)) [0] = 0))
                    440: #define        ATOMIC_CLEAR_USHORT(l)          ((void) (((__atomic_ushort_t) (l)) [0] = 0))
                    441: #define        ATOMIC_CLEAR_PTR(l)             ((void) (((__atomic_ptr_t) (l)) [0] = 0))
                    442: 
                    443: #define        ATOMIC_STORE_UCHAR(l,v)         ((void) (((__atomic_uchar_t) (l)) [0] = (v)))
                    444: #define        ATOMIC_STORE_PTR(l,v)           ((void) (((__atomic_ptr_t) (l)) [0] = (v)))
                    445: 
                    446: #endif /* __COHERENT__ */
                    447: 
                    448: 
                    449: #ifdef _CHECK_LOCK_TYPES
                    450: 
                    451: #undef ATOMIC_FETCH_AND_STORE_CHAR
                    452: #undef ATOMIC_FETCH_AND_STORE_UCHAR
                    453: #undef ATOMIC_FETCH_AND_STORE_SHORT
                    454: #undef ATOMIC_FETCH_AND_STORE_USHORT
                    455: #undef ATOMIC_FETCH_AND_STORE_INT
                    456: #undef ATOMIC_FETCH_AND_STORE_UINT
                    457: #undef ATOMIC_FETCH_AND_STORE_LONG
                    458: #undef ATOMIC_FETCH_AND_STORE_ULONG
                    459: #undef ATOMIC_FETCH_AND_STORE_PTR
                    460: #undef ATOMIC_FETCH_CHAR
                    461: #undef ATOMIC_FETCH_UCHAR
                    462: #undef ATOMIC_FETCH_SHORT
                    463: #undef ATOMIC_FETCH_USHORT
                    464: #undef ATOMIC_FETCH_INT
                    465: #undef ATOMIC_FETCH_UINT
                    466: #undef ATOMIC_FETCH_LONG
                    467: #undef ATOMIC_FETCH_ULONG
                    468: #undef ATOMIC_FETCH_PTR
                    469: 
                    470: #undef ATOMIC_CLEAR_UCHAR
                    471: #undef ATOMIC_CLEAR_USHORT
                    472: #undef ATOMIC_CLEAR_PTR
                    473: 
                    474: #undef ATOMIC_STORE_UCHAR
                    475: #undef ATOMIC_STORE_PTR
                    476: 
                    477: #endif /* defined (_CHECK_LOCK_TYPES) */
                    478: 
                    479: 
                    480: __EXTERN_C_BEGIN__
                    481: 
                    482: __pl_t TEST_AND_SET_LOCK       __PROTO ((__atomic_uchar_t _locked,
                    483:                                          __pl_t _pl,
                    484:                                          __CONST__ char * _name));
                    485: 
                    486: __EXTERN_C_END__
                    487: 
                    488: 
                    489: #endif /* ! defined (__KERNEL_X86LOCK_H__) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.