Annotation of coherent/f/usr/include.78/sys/x86io.h, revision 1.1

1.1     ! root        1: #ifndef        __SYS_X86IO_H__
        !             2: #define        __SYS_X86IO_H__
        !             3: 
        !             4: /*
        !             5:  * The system V DDI/DKI for Intel processors defines a C-language interface to
        !             6:  * the machine I/O instructions available through <sys/types.h>.
        !             7:  *
        !             8:  * For simplicity, this has been factored out into a separate file for this
        !             9:  * implementation, and <sys/types.h> pulls this file in.
        !            10:  */
        !            11: /*
        !            12:  *-IMPORTS:
        !            13:  *     <sys/ccompat.h>
        !            14:  *             __EXTERN_C_BEGIN__
        !            15:  *             __EXTERN_C_END__
        !            16:  *             __PROTO ()
        !            17:  *             __NON_ISO ()
        !            18:  *             __INLINE__
        !            19:  *     <sys/xdebug.h>
        !            20:  *             __LOCAL__
        !            21:  *     <sys/types.h>
        !            22:  *             uchar_t
        !            23:  *             ushort_t
        !            24:  *             ulong_t
        !            25:  */
        !            26: 
        !            27: #include <sys/ccompat.h>
        !            28: #include <sys/xdebug.h>
        !            29: #include <sys/v_types.h>
        !            30: 
        !            31: 
        !            32: /*
        !            33:  * Get these into a useful form in a similar manner to the way the spl... ()
        !            34:  * functions are defined in <sys/inline.h>
        !            35:  */
        !            36: 
        !            37: #if    defined (__GNUC__) && defined (i386)    /* 80386 with GNU CC */
        !            38: 
        !            39: 
        !            40: /*
        !            41:  * Note that the definitions for the string-input instructions assume that
        !            42:  * ES: is equivalent to DS:.
        !            43:  */
        !            44: 
        !            45: __LOCAL__ __INLINE__ uchar_t __inb (int _port) {
        !            46:        uchar_t         _result;
        !            47:        __NON_ISO (asm) volatile ("in %1,%0" :
        !            48:                                  "=a" (_result) : "d" ((ushort_t) _port));
        !            49:        return _result;
        !            50: }
        !            51: 
        !            52: __LOCAL__ __INLINE__ ulong_t __inl (int _port) {
        !            53:        ulong_t         _result;
        !            54:        __NON_ISO (asm) volatile ("in %1,%0" :
        !            55:                                  "=a" (_result) : "d" ((ushort_t) _port));
        !            56:        return _result;
        !            57: }
        !            58: 
        !            59: __LOCAL__ __INLINE__ ushort_t __inw (int _port) {
        !            60:        ushort_t        _result;
        !            61:        __NON_ISO (asm) volatile ("in %1,%0" :
        !            62:                                  "=a" (_result) : "d" ((ushort_t) _port));
        !            63:        return _result;
        !            64: }
        !            65: 
        !            66: __LOCAL__ __INLINE__ void __outb (int _port, uchar_t value) {
        !            67:        __NON_ISO (asm) volatile ("out %1,%0" : :
        !            68:                                  "d" ((ushort_t) _port), "a" (value));
        !            69: }
        !            70: 
        !            71: __LOCAL__ __INLINE__ void __outl (int _port, ulong_t value) {
        !            72:        __NON_ISO (asm) volatile ("out %1,%0" : :
        !            73:                                  "d" ((ushort_t) _port), "a" (value));
        !            74: }
        !            75: 
        !            76: __LOCAL__ __INLINE__ void __outw (int _port, ushort_t value) {
        !            77:        __NON_ISO (asm) volatile ("out %1,%0" : :
        !            78:                                  "d" ((ushort_t) _port), "a" (value));
        !            79: }
        !            80: 
        !            81: __LOCAL__ __INLINE__ void __repinsb (int _port, uchar_t * _addr, int _cnt) {
        !            82:        __NON_ISO (asm) volatile ("mov %1,%%edi;rep;insb" : :
        !            83:                                  "d" ((ushort_t) _port), "g" (_addr),
        !            84:                                  "c" (_cnt) : "di");
        !            85: }
        !            86: 
        !            87: __LOCAL__ __INLINE__ void __repinsd (int _port, ulong_t * _addr, int _cnt) {
        !            88:        __NON_ISO (asm) volatile ("mov %1,%%edi;rep;insl" : :
        !            89:                                  "d" ((ushort_t) _port), "g" (_addr),
        !            90:                                  "c" (_cnt) : "di");
        !            91: }
        !            92: 
        !            93: __LOCAL__ __INLINE__ void __repinsw (int _port, ushort_t * _addr, int _cnt) {
        !            94:        __NON_ISO (asm) volatile ("mov %1,%%edi;rep;insw" : :
        !            95:                                  "d" ((ushort_t) _port), "g" (_addr),
        !            96:                                  "c" (_cnt) : "di");
        !            97: }
        !            98: 
        !            99: __LOCAL__ __INLINE__ void __repoutsb (int _port, uchar_t * _addr, int _cnt) {
        !           100:        __NON_ISO (asm) volatile ("mov %1,%%esi;rep;outsb" : :
        !           101:                                  "d" ((ushort_t) _port), "g" (_addr),
        !           102:                                  "c" (_cnt) : "si");
        !           103: }
        !           104: 
        !           105: __LOCAL__ __INLINE__ void __repoutsd (int _port, ulong_t * _addr, int _cnt) {
        !           106:        __NON_ISO (asm) volatile ("movl %1,%%esi;rep;outsl" : :
        !           107:                                  "d" ((ushort_t) _port), "g" (_addr),
        !           108:                                  "c" (_cnt) : "si");
        !           109: }
        !           110: 
        !           111: __LOCAL__ __INLINE__ void __repoutsw (int _port, ushort_t * _addr, int _cnt) {
        !           112:        __NON_ISO (asm) volatile ("movl %1,%%esi;rep;outsw" : :
        !           113:                                  "d" ((ushort_t) _port), "g" (_addr),
        !           114:                                  "c" (_cnt) : "si");
        !           115: }
        !           116: 
        !           117: #define __FORWARD_inb__
        !           118: #define __FORWARD_inl__
        !           119: #define __FORWARD_inw__
        !           120: #define        __FORWARD_outb__
        !           121: #define        __FORWARD_outl__
        !           122: #define        __FORWARD_outw__
        !           123: #define        __FORWARD_repinsb__
        !           124: #define        __FORWARD_repinsd__
        !           125: #define        __FORWARD_repinsw__
        !           126: #define        __FORWARD_repoutsb__
        !           127: #define        __FORWARD_repoutsd__
        !           128: #define        __FORWARD_repoutsw__
        !           129: 
        !           130: #elif  defined (__BORLANDC__)
        !           131: 
        !           132: /*lint +fva *//* __emit__ () is truly varadic */
        !           133: void   __emit__        (__ANY_ARGS__);
        !           134: /*lint -fva */
        !           135: 
        !           136: /*
        !           137:  * Note the use of the 0x66 operand-size override prefix below, which is built
        !           138:  * on the assumption that Borland generates 16-bit code segments.
        !           139:  */
        !           140: 
        !           141: #define        __REP__         0xF3            /* repeat-prefix */
        !           142: 
        !           143: #define        __INB__         0xEC
        !           144: #define        __INW__         0xED
        !           145: #define        __INL__         0x66, __INW__   /* size-override for 32-bit form */
        !           146: 
        !           147: #define        __OUTB__        0xEE
        !           148: #define        __OUTW__        0xEF
        !           149: #define        __OUTL__        0x66, __OUTW__  /* size-override for 32-bit form */
        !           150: 
        !           151: #define        __INSB__        0x6C
        !           152: #define        __INSW__        0x6D
        !           153: #define        __INSL__        0x65, __INSW__
        !           154: 
        !           155: #define        __OUTSB__       0x6E
        !           156: #define        __OUTSW__       0x6F            /* word/long depending on CS: */
        !           157: #define        __OUTSL__       0x66, __OUTSW__
        !           158: 
        !           159: 
        !           160: /*
        !           161:  * If we are willing to restrict ourselves to i386's, Borland C++ 3.1 allows
        !           162:  * support for 32-bit register-pseudovariables if 386 code generation has
        !           163:  * been enabled.
        !           164:  *
        !           165:  * As it turns out, there are all kinds of bugs in the 386 support in BC++ 3.1
        !           166:  * but enough works that we can even get a far pointer into ES:whatever via
        !           167:  * a 32-bit register, as long as the intermediate register isn't _ESI or _EDI
        !           168:  * since _EAX = _ESI or _EAX = _EDI only moves the low 16 bits. Being able to
        !           169:  * load ES:whatever via a 32-bit register allows us to write macros that only
        !           170:  * reference each argument exactly once.
        !           171:  *
        !           172:  * While the 32-bit-pointer version still works in the near models, it's not
        !           173:  * exactly optimal, so we use a more straightforward version there.
        !           174:  */
        !           175: 
        !           176: #define        __inb(port)             (_DX = (port), __emit__ (__INB__), (uchar_t) _AL)
        !           177: #define        __inl(port)             (_DX = (port), __emit__ (__INL__), _EAX)
        !           178: #define        __inw(port)             (_DX = (port), __emit__ (__INW__), (ushort_t) _AX)
        !           179: 
        !           180: #define        __outb(port,value)      (_DX = (port), _AL = (value), __emit__ (__OUTB__))
        !           181: #define        __outl(port,value)      (_DX = (port), _EAX = (value), __emit__ (__OUTL__))
        !           182: #define        __outw(port,value)      (_DX = (port), _AX = (value), __emit__ (__OUTW__))
        !           183: 
        !           184: #if    defined (__LARGE__) || defined (__HUGE__) || defined (__COMPACT__)
        !           185: 
        !           186: #define        __repins(p,a,c)         (_EDX = (long) (void __far *) (a), _EAX = _EDX,\
        !           187:                                 _ES = (unsigned) (_EAX >> 16),\
        !           188:                                 _DI = _DX, _CX = (c), _DX = (p))
        !           189: #define        __repouts(p,a,c)        (_EDX = (long) (void _far *) (a), _EAX = _EDX,\
        !           190:                                 _ES = (unsigned) (_EAX >> 16),\
        !           191:                                 _SI = _DX, _CX = (c), _DX = (p))
        !           192: 
        !           193: #else  /* use simpler small-data versions */
        !           194: 
        !           195: #define        __repins(p,a,c)         (_ES = _DS, _DI = (unsigned) (a), _CX = (c), _DX = (p))
        !           196: #define        __repouts(p,a,c)        (_ES = _DS, _SI = (unsigned) (a), _CX = (c), _DX = (p))
        !           197: 
        !           198: #endif
        !           199: 
        !           200: #define        __repinsb(p,a,c)        (__repins (p, a, c),\
        !           201:                                 __emit__ (__REP__, __INSB__))
        !           202: #define        __repinsd(p,a,c)        (__repins (p, a, c),\
        !           203:                                 __emit__ (__REP__, __INSL__))
        !           204: #define        __repinsw(p,a,c)        (__repins (p, a, c),\
        !           205:                                 __emit__ (__REP__, __INSW__))
        !           206: 
        !           207: #define        __repoutsb(p,a,c)       (__repouts (p, a, c),\
        !           208:                                 __emit__ (__REP__, __OUTSB__))
        !           209: #define        __repoutsd(p,a,c)       (__repouts (p, a, c),\
        !           210:                                 __emit__ (__REP__, __OUTSL__))
        !           211: #define        __repoutsw(p,a,c)       (__repouts (p, a, c),\
        !           212:                                 __emit__ (__REP__, __OUTSW__))
        !           213: 
        !           214: 
        !           215: #define __FORWARD_inb__
        !           216: #define __FORWARD_inl__
        !           217: #define __FORWARD_inw__
        !           218: #define        __FORWARD_outb__
        !           219: #define        __FORWARD_outl__
        !           220: #define        __FORWARD_outw__
        !           221: #define        __FORWARD_repinsb__
        !           222: #define        __FORWARD_repinsd__
        !           223: #define        __FORWARD_repinsw__
        !           224: #define        __FORWARD_repoutsb__
        !           225: #define        __FORWARD_repoutsd__
        !           226: #define        __FORWARD_repoutsw__
        !           227: 
        !           228: #elif  defined (COHERENT)
        !           229: 
        !           230: /*
        !           231:  * Under Coherent, the inb ()/inw ()/inl () and outb ()/outw ()/outl ()
        !           232:  * operations are already available under those names in the standard system.
        !           233:  *
        !           234:  * The rep... () operations are provided in a supplemental file that should be
        !           235:  * linked in if you are building a DDI/DKI kernel.
        !           236:  */
        !           237: 
        !           238: #endif
        !           239: 
        !           240: 
        !           241: __EXTERN_C_BEGIN__
        !           242: 
        !           243: uchar_t                inb             __PROTO ((int _port));
        !           244: ulong_t                inl             __PROTO ((int _port));
        !           245: ushort_t       inw             __PROTO ((int _port));
        !           246: void           outb            __PROTO ((int _port, uchar_t _value));
        !           247: void           outl            __PROTO ((int _port, ulong_t _value));
        !           248: void           outw            __PROTO ((int _port, ushort_t _value));
        !           249: void           repinsb         __PROTO ((int _port, uchar_t * _addr,
        !           250:                                          int _cnt));
        !           251: void           repinsd         __PROTO ((int _port, ulong_t * _addr,
        !           252:                                          int _cnt));
        !           253: void           repinsw         __PROTO ((int _port, ushort_t * _addr,
        !           254:                                          int _cnt));
        !           255: void           repoutsb        __PROTO ((int _port, uchar_t * _addr,
        !           256:                                          int _cnt));
        !           257: void           repoutsd        __PROTO ((int _port, ulong_t * _addr,
        !           258:                                          int _cnt));
        !           259: void           repoutsw        __PROTO ((int _port, ushort_t * _addr,
        !           260:                                          int _cnt));
        !           261: 
        !           262: __EXTERN_C_END__
        !           263: 
        !           264: 
        !           265: #ifdef __FORWARD_inb__
        !           266: # define       inb(port)       __inb (port)
        !           267: #endif
        !           268: 
        !           269: #ifdef __FORWARD_inl__
        !           270: # define       inl(port)       __inl (port)
        !           271: #endif
        !           272: 
        !           273: #ifdef __FORWARD_inw__
        !           274: # define       inw(port)       __inw (port)
        !           275: #endif
        !           276: 
        !           277: #ifdef __FORWARD_outb__
        !           278: # define       outb(port,val)  __outb (port, val)
        !           279: #endif
        !           280: 
        !           281: #ifdef __FORWARD_outl__
        !           282: # define       outl(port,val)  __outl (port, val)
        !           283: #endif
        !           284: 
        !           285: #ifdef __FORWARD_outw__
        !           286: # define       outw(port,val)  __outw (port, val)
        !           287: #endif
        !           288: 
        !           289: #ifdef __FORWARD_repinsb__
        !           290: # define       repinsb(p,a,c)  __repinsb (p, a, c)
        !           291: #endif
        !           292: 
        !           293: #ifdef __FORWARD_repinsd__
        !           294: # define       repinsd(p,a,c)  __repinsd (p, a, c)
        !           295: #endif
        !           296: 
        !           297: #ifdef __FORWARD_repinsw__
        !           298: # define       repinsw(p,a,c)  __repinsw (p, a, c)
        !           299: #endif
        !           300: 
        !           301: #ifdef __FORWARD_repoutsb__
        !           302: # define       repoutsb(p,a,c) __repoutsb (p, a, c)
        !           303: #endif
        !           304: 
        !           305: #ifdef __FORWARD_repoutsd__
        !           306: # define       repoutsd(p,a,c) __repoutsd (p, a, c)
        !           307: #endif
        !           308: 
        !           309: #ifdef __FORWARD_repoutsw__
        !           310: # define       repoutsw(p,a,c) __repoutsw (p, a, c)
        !           311: #endif
        !           312: 
        !           313: 
        !           314: #undef __FORWARD_inb__
        !           315: #undef __FORWARD_inl__
        !           316: #undef __FORWARD_inw__
        !           317: #undef __FORWARD_outb__
        !           318: #undef __FORWARD_outl__
        !           319: #undef __FORWARD_outw__
        !           320: #undef __FORWARD_repinsb__
        !           321: #undef __FORWARD_repinsd__
        !           322: #undef __FORWARD_repinsw__
        !           323: #undef __FORWARD_repoutsb__
        !           324: #undef __FORWARD_repoutsd__
        !           325: #undef __FORWARD_repoutsw__
        !           326: 
        !           327: #endif /* ! defined (__SYS_X86IO_H__) */

unix.superglobalmegacorp.com

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