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

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

unix.superglobalmegacorp.com

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