Annotation of coherent/f/etc/conf/streams/src/xcohlock.s, revision 1.1.1.1

1.1       root        1: / This file contains implementations of multiprocessor locking primitives used
                      2: / by the STREAMS and DDI/DDK subsystems. With GCC or other compilers that allow
                      3: / in-line generation of assembly language code in C programs a separate
                      4: / assembly-language file containing these implementations is not necessary.
                      5: / Since the MWC C compiler that is the default development tool under Coherent
                      6: / does not permit inlining, references to the locking functions will be turned
                      7: / into external function calls that will be resolved by the routines below.
                      8:                .unixorder
                      9: 
                     10: / The routines work by using the i386 feature that all cycles involving a
                     11: / single read or write are atomic regardless of alignment or lack thereof, and
                     12: / by using the XCHG instruction, which is an atomic read-modify-write
                     13: / instruction. Use of the atomic exchange primitive allows more efficient
                     14: / implementation of some data structures than the more fundamental test-and-set
                     15: / instruction (but is not as powerful as the atomic compare-and-swap
                     16: / instruction found in the Motorola 680x0 processors).
                     17: / Incidentally, atomic exchange is the only atomic operation in many new RISC
                     18: / processors such as the Motorola 88100.
                     19: 
                     20: / The C-language header file <kernel/x86lock.h> defines data types and function
                     21: / prototypes that should match the definitions expected in this file. Since the
                     22: / regular read and write operations on the i386 are atomic, the definitions in
                     23: / this file are for those operations that cannot be performed in C; the other
                     24: / operations can be safely described by macros with the use of the 'volatile'
                     25: / keyword to prevent optimisation of accesses to these items (since other CPUs
                     26: / have the ability to modify the values contained in these locations, the
                     27: / data-flow analysis often performed by compilers to allow cacheing of values
                     28: / in registers would cause incorrect results).
                     29: 
                     30: / Under Coherent, the iBCS2 function calling-sequence rules are in effect. This
                     31: / means that the registers %ebx, %esi and %edi are used for register variables
                     32: / and must be preserved by routines. However, all other registers are available
                     33: / for modification; with the i386 CPU the general registers %eax, %ecx and %edx
                     34: / are available for use as index registers with the addition of the SIB
                     35: / instruction forat. Parameters are passed in the stack from right to left,
                     36: / with the caller's return address being the "topmost" entry.
                     37: 
                     38:                .globl  ATOMIC_FETCH_AND_STORE_CHAR
                     39:                .globl  ATOMIC_FETCH_AND_STORE_UCHAR
                     40:                .globl  ATOMIC_FETCH_AND_STORE_SHORT
                     41:                .globl  ATOMIC_FETCH_AND_STORE_USHORT
                     42:                .globl  ATOMIC_FETCH_AND_STORE_INT
                     43:                .globl  ATOMIC_FETCH_AND_STORE_UINT
                     44:                .globl  ATOMIC_FETCH_AND_STORE_LONG
                     45:                .globl  ATOMIC_FETCH_AND_STORE_ULONG
                     46:                .globl  ATOMIC_FETCH_AND_STORE_PTR
                     47: 
                     48: 
                     49: / char     ATOMIC_FETCH_AND_STORE_CHAR (atomic_char_t _item, char _value);
                     50: ATOMIC_FETCH_AND_STORE_CHAR:
                     51:                mov     8(%esp), %al    / Value to store
                     52:                mov     4(%esp), %edx   / Address of atomic item
                     53: 
                     54:                xchg    %al, (%edx)     / Atomic fetch-and-store
                     55:                cbw                     / Sign-extend %al->%ax
                     56:                cwde                    / Sign-extend %ax->%eax
                     57:                ret                     / return to caller
                     58: 
                     59: 
                     60: / uchar_t  ATOMIC_FETCH_AND_STORE_UCHAR (atomic_uchar_t _item, uchar_t _value);
                     61: ATOMIC_FETCH_AND_STORE_UCHAR:
                     62:                movzxb  8(%esp), %eax   / Value to store, zero-extend
                     63:                mov     4(%esp), %edx   / Address of atomic item
                     64: 
                     65:                xchg    %al, (%edx)     / Atomic fetch-and-store
                     66:                ret                     / return to caller
                     67: 
                     68: 
                     69: / short    ATOMIC_FETCH_AND_STORE_SHORT (atomic_short_t _item, short _value);
                     70: ATOMIC_FETCH_AND_STORE_SHORT:
                     71:                mov     8(%esp), %ax    / Value to store
                     72:                mov     4(%esp), %edx   / Address of atomic item
                     73: 
                     74:                xchg    %ax, (%edx)     / Atomic fetch-and-store
                     75:                cwde                    / Sign-extend %ax->%eax
                     76:                ret                     / return to caller
                     77: 
                     78: 
                     79: / ushort_t ATOMIC_FETCH_AND_STORE_USHORT (atomic_ushort_t _item,
                     80: /                                        ushort_t _value);
                     81: ATOMIC_FETCH_AND_STORE_USHORT:
                     82:                movzxw  8(%esp), %eax   / Value to store, zero-filled
                     83:                mov     4(%esp), %edx   / Address of atomic item
                     84: 
                     85:                xchg    %ax, (%edx)     / Atomic fetch-and-store
                     86:                ret                     / return to caller
                     87: 
                     88: 
                     89: / int      ATOMIC_FETCH_AND_STORE_INT (atomic_int_t _item, int _value);
                     90: ATOMIC_FETCH_AND_STORE_INT:
                     91: / long     ATOMIC_FETCH_AND_STORE_LONG (atomic_long_t _item, long _value);
                     92: ATOMIC_FETCH_AND_STORE_LONG:
                     93: / uint_t   ATOMIC_FETCH_AND_STORE_UINT (atomic_uint_t _item, uint_t _value);
                     94: ATOMIC_FETCH_AND_STORE_UINT:
                     95: / ulong_t  ATOMIC_FETCH_AND_STORE_ULONG (atomic_ulong_t _item, ulong_t _value);
                     96: ATOMIC_FETCH_AND_STORE_ULONG:
                     97: / _VOID  * ATOMIC_FETCH_AND_STORE_PTR (atomic_ptr_t _item, _VOID * value);
                     98: ATOMIC_FETCH_AND_STORE_PTR:
                     99:                mov     8(%esp), %eax   / Value to store
                    100:                mov     4(%esp), %edx   / Address of atomic item
                    101: 
                    102:                xchg    %eax, (%edx)    / Atomic fetch-and-store
                    103:                ret                     / return to caller

unix.superglobalmegacorp.com

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