/* $XFree86: xc/programs/Xserver/hw/xfree86/common/compiler.h,v 3.24.2.2 1998/02/07 00:44:37 dawes Exp $ */ /* * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Thomas Roell not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Thomas Roell makes no representations * about the suitability of this software for any purpose. It is provided * "as is" without express or implied warranty. * * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * */ /* $Xorg: compiler.h,v 1.3 2000/08/17 19:50:28 cpqbld Exp $ */ #ifndef _COMPILER_H #define _COMPILER_H #ifndef __STDC__ # ifdef signed # undef signed # endif # ifdef volatile # undef volatile # endif # ifdef const # undef const # endif # define signed /**/ # ifdef __GNUC__ # define volatile __volatile__ # define const __const__ # ifdef PC98 # undef NO_INLINE # endif # else # define const /**/ # ifdef PC98 # define __inline__ /**/ # endif # endif /* __GNUC__ */ #endif /* !__STDC__ */ #if defined(IODEBUG) && defined(__GNUC__) #define outb RealOutb #define outw RealOutw #define outl RealOutl #define inb RealInb #define inw RealInw #define inl RealInl #endif #ifdef NO_INLINE extern void outb(); extern void outw(); extern void outl(); extern unsigned int inb(); extern unsigned int inw(); extern unsigned int inl(); #if NeedFunctionPrototypes extern unsigned char rdinx(unsigned short int, unsigned char); extern void wrinx(unsigned short int, unsigned char, unsigned char); extern void modinx(unsigned short int, unsigned char, unsigned char, unsigned char); extern int testrg(unsigned short int, unsigned char); extern int testinx2(unsigned short int, unsigned char, unsigned char); extern int testinx(unsigned short int, unsigned char); #else /* NeedFunctionProtoypes */ extern unsigned char rdinx(); extern void wrinx(); extern void modinx(); extern int testrg(); extern int testinx2(); extern int testinx(); #endif /* NeedFunctionProtoypes */ #else /* NO_INLINE */ #ifdef __GNUC__ #if defined(linux) && defined(__alpha__) /* for Linux on Alpha, we use the LIBC _inx/_outx routines */ /* note that the appropriate setup via "ioperm" needs to be done */ /* *before* any inx/outx is done. */ static __inline__ void outb(port, val) unsigned short port; char val; { extern void _outb(char val, unsigned short port); _outb(val, port); } static __inline__ void outw(port, val) unsigned short port; short val; { extern void _outw(short val, unsigned short port); _outw(val, port); } static __inline__ void outl(port, val) unsigned short port; int val; { extern void _outl(int val, unsigned short port); _outl(val, port); } static __inline__ unsigned int inb(port) unsigned short port; { extern unsigned int _inb(unsigned short port); return _inb(port); } static __inline__ unsigned int inw(port) unsigned short port; { extern unsigned int _inw(unsigned short port); return _inw(port); } static __inline__ unsigned int inl(port) unsigned short port; { extern unsigned int _inl(unsigned short port); return _inl(port); } /* * inline functions to do unaligned accesses * from linux/include/asm-alpha/unaligned.h */ static __inline__ unsigned long ldq_u(unsigned long * r11) { unsigned long r1,r2; __asm__("ldq_u %0,%3\n\t" "ldq_u %1,%4\n\t" "extql %0,%2,%0\n\t" "extqh %1,%2,%1\n\t" "bis %1,%0,%0" :"=&r" (r1), "=&r" (r2) :"r" (r11), "m" (*r11), "m" (*(unsigned long *)(7+(char *) r11))); return r1; } static __inline__ unsigned long ldl_u(unsigned int * r11) { unsigned long r1,r2; __asm__("ldq_u %0,%3\n\t" "ldq_u %1,%4\n\t" "extll %0,%2,%0\n\t" "extlh %1,%2,%1\n\t" "bis %1,%0,%0" :"=&r" (r1), "=&r" (r2) :"r" (r11), "m" (*r11), "m" (*(unsigned long *)(3+(char *) r11))); return r1; } static __inline__ unsigned long ldw_u(unsigned short * r11) { unsigned long r1,r2; __asm__("ldq_u %0,%3\n\t" "ldq_u %1,%4\n\t" "extwl %0,%2,%0\n\t" "extwh %1,%2,%1\n\t" "bis %1,%0,%0" :"=&r" (r1), "=&r" (r2) :"r" (r11), "m" (*r11), "m" (*(unsigned long *)(1+(char *) r11))); return r1; } static __inline__ void stq_u(unsigned long r5, unsigned long * r11) { unsigned long r1,r2,r3,r4; __asm__("ldq_u %3,%1\n\t" "ldq_u %2,%0\n\t" "insqh %6,%7,%5\n\t" "insql %6,%7,%4\n\t" "mskqh %3,%7,%3\n\t" "mskql %2,%7,%2\n\t" "bis %3,%5,%3\n\t" "bis %2,%4,%2\n\t" "stq_u %3,%1\n\t" "stq_u %2,%0" :"=m" (*r11), "=m" (*(unsigned long *)(7+(char *) r11)), "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4) :"r" (r5), "r" (r11)); } static __inline__ void stl_u(unsigned long r5, unsigned int * r11) { unsigned long r1,r2,r3,r4; __asm__("ldq_u %3,%1\n\t" "ldq_u %2,%0\n\t" "inslh %6,%7,%5\n\t" "insll %6,%7,%4\n\t" "msklh %3,%7,%3\n\t" "mskll %2,%7,%2\n\t" "bis %3,%5,%3\n\t" "bis %2,%4,%2\n\t" "stq_u %3,%1\n\t" "stq_u %2,%0" :"=m" (*r11), "=m" (*(unsigned long *)(3+(char *) r11)), "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4) :"r" (r5), "r" (r11)); } static __inline__ void stw_u(unsigned long r5, unsigned short * r11) { unsigned long r1,r2,r3,r4; __asm__("ldq_u %3,%1\n\t" "ldq_u %2,%0\n\t" "inswh %6,%7,%5\n\t" "inswl %6,%7,%4\n\t" "mskwh %3,%7,%3\n\t" "mskwl %2,%7,%2\n\t" "bis %3,%5,%3\n\t" "bis %2,%4,%2\n\t" "stq_u %3,%1\n\t" "stq_u %2,%0" :"=m" (*r11), "=m" (*(unsigned long *)(1+(char *) r11)), "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4) :"r" (r5), "r" (r11)); } #define mem_barrier() __asm__ __volatile__("mb" : : : "memory") #ifdef __ELF__ #define write_mem_barrier() __asm__ __volatile__("wmb" : : : "memory") #else /* ECOFF gas 2.6 doesn't know "wmb" :-( */ #define write_mem_barrier() mem_barrier() #endif #else /* defined(linux) && defined(__alpha__) */ #if defined(__mips__) unsigned int IOPortBase; /* Memory mapped I/O port area */ static __inline__ void outb(port, val) short port; char val; { *(volatile unsigned char*)(((unsigned short)(port))+IOPortBase) = val; } static __inline__ void outw(port, val) short port; short val; { *(volatile unsigned short*)(((unsigned short)(port))+IOPortBase) = val; } static __inline__ void outl(port, val) short port; int val; { *(volatile unsigned long*)(((unsigned short)(port))+IOPortBase) = val; } static __inline__ unsigned int inb(port) short port; { return(*(volatile unsigned char*)(((unsigned short)(port))+IOPortBase)); } static __inline__ unsigned int inw(port) short port; { return(*(volatile unsigned short*)(((unsigned short)(port))+IOPortBase)); } static __inline__ unsigned int inl(port) short port; { return(*(volatile unsigned long*)(((unsigned short)(port))+IOPortBase)); } static __inline__ unsigned long ldq_u(unsigned long * r11) { unsigned long r1; __asm__("lwr %0,%2\n\t" "lwl %0,%3\n\t" :"=&r" (r1) :"r" (r11), "m" (*r11), "m" (*(unsigned long *)(3+(char *) r11))); return r1; } static __inline__ unsigned long ldl_u(unsigned int * r11) { unsigned long r1; __asm__("lwr %0,%2\n\t" "lwl %0,%3\n\t" :"=&r" (r1) :"r" (r11), "m" (*r11), "m" (*(unsigned long *)(3+(char *) r11))); return r1; } static __inline__ unsigned long ldw_u(unsigned short * r11) { unsigned long r1; __asm__("lwr %0,%2\n\t" "lwl %0,%3\n\t" :"=&r" (r1) :"r" (r11), "m" (*r11), "m" (*(unsigned long *)(1+(char *) r11))); return r1; } #define stq_u(v,p) stl_u(v,p) #define stl_u(v,p) ((unsigned char *)(p)) = (v); \ ((unsigned char *)(p)+1) = ((v) >> 8); \ ((unsigned char *)(p)+2) = ((v) >> 16); \ ((unsigned char *)(p)+3) = ((v) >> 24) #define stw_u(v,p) ((unsigned char *)(p)) = (v); \ ((unsigned char *)(p)+1) = ((v) >> 8) #define mem_barrier() /* NOP */ #else /* defined(mips) */ #define ldq_u(p) (*((unsigned long *)(p))) #define ldl_u(p) (*((unsigned int *)(p))) #define ldw_u(p) (*((unsigned short *)(p))) #define stq_u(v,p) ((unsigned long *)(p)) = (v) #define stl_u(v,p) ((unsigned int *)(p)) = (v) #define stw_u(v,p) ((unsigned short *)(p)) = (v) #define mem_barrier() /* NOP */ #define write_mem_barrier() /* NOP */ #if !defined(FAKEIT) && !defined(__mc68000__) #ifdef GCCUSESGAS /* * If gcc uses gas rather than the native assembler, the syntax of these * inlines has to be different. DHD */ #ifndef PC98 static __inline__ void #if NeedFunctionPrototypes outb( unsigned short int port, unsigned char val) #else outb(port, val) unsigned short int port; unsigned char val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port)); } static __inline__ void #if NeedFunctionPrototypes outw( unsigned short int port, unsigned short int val) #else outw(port, val) unsigned short int port; unsigned short int val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port)); } static __inline__ void #if NeedFunctionPrototypes outl( unsigned short int port, unsigned int val) #else outl(port, val) unsigned short int port; unsigned int val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port)); } static __inline__ unsigned int #if NeedFunctionPrototypes inb( unsigned short int port) #else inb(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned char ret; __asm__ __volatile__("inb %1,%0" : "=a" (ret) : "d" (port)); return ret; } static __inline__ unsigned int #if NeedFunctionPrototypes inw( unsigned short int port) #else inw(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned short int ret; __asm__ __volatile__("inw %1,%0" : "=a" (ret) : "d" (port)); return ret; } static __inline__ unsigned int #if NeedFunctionPrototypes inl( unsigned short int port) #else inl(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned int ret; __asm__ __volatile__("inl %1,%0" : "=a" (ret) : "d" (port)); return ret; } #else /* PC98 */ static __inline__ void #if NeedFunctionPrototypes _outb( unsigned short int port, unsigned char val) #else _outb(port, val) unsigned short int port; unsigned char val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("outb %0,%1" ::"a" (val), "d" (port)); } static __inline__ void #if NeedFunctionPrototypes _outw( unsigned short int port, unsigned short int val) #else _outw(port, val) unsigned short int port; unsigned short int val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("outw %0,%1" ::"a" (val), "d" (port)); } static __inline__ void #if NeedFunctionPrototypes _outl( unsigned short int port, unsigned int val) #else _outl(port, val) unsigned short int port; unsigned int val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port)); } static __inline__ unsigned int #if NeedFunctionPrototypes _inb( unsigned short int port) #else _inb(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned char ret; __asm__ __volatile__("inb %1,%0" : "=a" (ret) : "d" (port)); return ret; } static __inline__ unsigned int #if NeedFunctionPrototypes _inw( unsigned short int port) #else _inw(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned short ret; __asm__ __volatile__("inw %1,%0" : "=a" (ret) : "d" (port)); return ret; } static __inline__ unsigned int #if NeedFunctionPrototypes _inl( unsigned short int port) #else _inl(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned int ret; __asm__ __volatile__("inl %1,%0" : "=a" (ret) : "d" (port)); return ret; } #if defined(PC98_PW) || defined(PC98_XKB) || defined(PC98_NEC) || defined(PC98_PWLB) || defined(PC98_GA968) #define PW_PORT 0x600 extern short chipID; #if NeedFunctionPrototypes extern void *mmioBase; #else extern unsigned char *mmioBase; #endif extern unsigned short _port_tbl[]; #define port_convert(x) _port_tbl[(unsigned short)x] #endif #if defined(PC98_WAB) || defined(PC98_GANB_WAP) static __inline__ unsigned short port_convert(unsigned short port) { port <<= 8; port &= 0x7f00; /* Mask 0111 1111 0000 0000 */ port |= 0xE0; return port; } #endif /* PC98_WAB || PC98_GANB_WAP */ #if defined(PC98_WABEP) static __inline__ unsigned short port_convert(unsigned short port) { port &= 0x7f; /* Mask 0000 0000 0111 1111 */ port |= 0x0f00; return port; } #endif /* PC98_WABEP */ #ifdef PC98_WSNA static __inline__ unsigned short port_convert(unsigned short port) { port <<= 8; port &= 0x7f00; /* Mask 0111 1111 0000 0000 */ port |= 0xE2; return port; } #endif /* PC98_WSNA */ #ifdef PC98_NKVNEC #ifdef PC98_NEC_CIRRUS2 static __inline__ unsigned short port_convert(unsigned short port) { port = (port & 0xf) + ((port & 0xf0) << 4) + 0x0050; return port; } #else static __inline__ unsigned short port_convert(unsigned short port) { port = (port & 0xf) + ((port & 0xf0) << 4) + 0x00a0; return port; } #endif /* PC98_NEC_CIRRUS2 */ #endif /* PC98_NKVNEC */ #if defined(PC98_TGUI) || defined(PC98_MGA) #if NeedFunctionPrototypes extern void *mmioBase; #else extern unsigned char *mmioBase; #endif #endif static __inline__ void #if NeedFunctionPrototypes outb( unsigned short port, unsigned char val) #else outb(port, val) unsigned short port; unsigned char val; #endif /* NeedFunctionPrototypes */ { #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) *(volatile unsigned char *)((char *)mmioBase+(port)) = (unsigned char)(val); #else __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port)); #endif } static __inline__ void #if NeedFunctionPrototypes outw( unsigned short port, unsigned short val) #else outw(port, val) unsigned short port; unsigned short val; #endif /* NeedFunctionPrototypes */ { #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) *(volatile unsigned short *)((char *)mmioBase+(port)) = (unsigned short)(val); #else __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port)); #endif } static __inline__ void #if NeedFunctionPrototypes outl( unsigned short port, unsigned int val) #else outl(port, val) unsigned short port; unsigned int val; #endif /* NeedFunctionPrototypes */ { #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) *(volatile unsigned int *)((char *)mmioBase+(port)) = (unsigned int)(val); #else __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port)); #endif } static __inline__ unsigned int #if NeedFunctionPrototypes inb( unsigned short port) #else inb(port) unsigned short port; #endif /* NeedFunctionPrototypes */ { unsigned char ret; #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) ret =*(volatile unsigned char *)((char *)mmioBase+(port)); #else __asm__ __volatile__("inb %1,%0" : "=a" (ret) : "d" (port)); #endif return ret; } static __inline__ unsigned int #if NeedFunctionPrototypes inw( unsigned short port) #else inw(port) unsigned short port; #endif /* NeedFunctionPrototypes */ { unsigned short ret; #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) ret =*(volatile unsigned short *)((char *)mmioBase+(port)); #else __asm__ __volatile__("inw %1,%0" : "=a" (ret) : "d" (port)); #endif return ret; } static __inline__ unsigned int #if NeedFunctionPrototypes inl( unsigned short port) #else inl(port) unsigned short port; #endif /* NeedFunctionPrototypes */ { unsigned int ret; #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) ret =*(volatile unsigned int *)((char *)mmioBase+(port)); #else __asm__ __volatile__("inl %1,%0" : "=a" (ret) : "d" (port)); #endif return ret; } #endif /* PC98 */ #else /* GCCUSESGAS */ static __inline__ void #if NeedFunctionPrototypes outb( unsigned short int port, unsigned char val) #else outb(port, val) unsigned short int port; unsigned char val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("out%B0 (%1)" : :"a" (val), "d" (port)); } static __inline__ void #if NeedFunctionPrototypes outw( unsigned short int port, unsigned short int val) #else outw(port, val) unsigned short int port; unsigned short int val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("out%W0 (%1)" : :"a" (val), "d" (port)); } static __inline__ void #if NeedFunctionPrototypes outl( unsigned short int port, unsigned int val) #else outl(port, val) unsigned short int port; unsigned int val; #endif /* NeedFunctionPrototypes */ { __asm__ __volatile__("out%L0 (%1)" : :"a" (val), "d" (port)); } static __inline__ unsigned int #if NeedFunctionPrototypes inb( unsigned short int port) #else inb(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned char ret; __asm__ __volatile__("in%B0 (%1)" : "=a" (ret) : "d" (port)); return ret; } static __inline__ unsigned int #if NeedFunctionPrototypes inw( unsigned short int port) #else inw(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned short int ret; __asm__ __volatile__("in%W0 (%1)" : "=a" (ret) : "d" (port)); return ret; } static __inline__ unsigned int #if NeedFunctionPrototypes inl( unsigned short int port) #else inl(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { unsigned int ret; __asm__ __volatile__("in%L0 (%1)" : "=a" (ret) : "d" (port)); return ret; } #endif /* GCCUSESGAS */ #else /* !defined(FAKEIT) && !defined(__mc68000__) */ static __inline__ void #if NeedFunctionPrototypes outb( unsigned short int port, unsigned char val) #else outb(port, val) unsigned short int port; unsigned char val; #endif /* NeedFunctionPrototypes */ { } static __inline__ void #if NeedFunctionPrototypes outw( unsigned short int port, unsigned short int val) #else outw(port, val) unsigned short int port; unsigned short int val; #endif /* NeedFunctionPrototypes */ { } static __inline__ void #if NeedFunctionPrototypes outl( unsigned short int port, unsigned int val) #else outl(port, val) unsigned short int port; unsigned int val; #endif /* NeedFunctionPrototypes */ { } static __inline__ unsigned int #if NeedFunctionPrototypes inb( unsigned short int port) #else inb(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { return 0; } static __inline__ unsigned int #if NeedFunctionPrototypes inw( unsigned short int port) #else inw(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { return 0; } static __inline__ unsigned int #if NeedFunctionPrototypes inl( unsigned short int port) #else inl(port) unsigned short int port; #endif /* NeedFunctionPrototypes */ { return 0; } #endif /* FAKEIT */ #endif /* defined(mips) */ #endif /* defined(AlphaArchitecture) && defined(LinuxArchitecture) */ #else /* __GNUC__ */ #if !defined(AMOEBA) && !defined(MINIX) # if defined(__STDC__) && (__STDC__ == 1) # ifndef asm # define asm __asm # endif # endif # ifdef SVR4 # include # ifndef __HIGHC__ # ifndef __USLC__ # define __USLC__ # endif # endif # endif # ifndef PC98 # ifndef SCO325 # include # else # include "scoasm.h" # endif # else #if defined(PC98_PW) || defined(PC98_XKB) || defined(PC98_NEC) || defined(PC98_PWLB) || defined(PC98_GA968) #define PW_PORT 0x600 extern short chipID; #if NeedFunctionPrototypes extern void *mmioBase; #else extern unsigned char *mmioBase; #endif extern unsigned short _port_tbl[]; #define port_convert(x) _port_tbl[(unsigned short)x] #endif #if defined(PC98_TGUI) || defined(PC98_MGA) #if NeedFunctionPrototypes extern void *mmioBase; #else extern unsigned char *mmioBase; #endif #endif asm void _outl(port,val) { %reg port,val; movl port, %edx movl val, %eax outl (%dx) %reg port; mem val; movl port, %edx movl val, %eax outl (%dx) %mem port; reg val; movw port, %dx movl val, %eax outl (%dx) %mem port,val; movw port, %dx movl val, %eax outl (%dx) } asm void _outw(port,val) { %reg port,val; movl port, %edx movl val, %eax data16 outl (%dx) %reg port; mem val; movl port, %edx movw val, %ax data16 outl (%dx) %mem port; reg val; movw port, %dx movl val, %eax data16 outl (%dx) %mem port,val; movw port, %dx movw val, %ax data16 outl (%dx) } asm void _outb(port,val) { %reg port,val; movl port, %edx movl val, %eax outb (%dx) %reg port; mem val; movl port, %edx movb val, %al outb (%dx) %mem port; reg val; movw port, %dx movl val, %eax outb (%dx) %mem port,val; movw port, %dx movb val, %al outb (%dx) } asm int _inl(port) { %reg port; movl port, %edx inl (%dx) %mem port; movw port, %dx inl (%dx) } asm int _inw(port) { %reg port; subl %eax, %eax movl port, %edx data16 inl (%dx) %mem port; subl %eax, %eax movw port, %dx data16 inl (%dx) } asm int _inb(port) { %reg port; subl %eax, %eax movl port, %edx inb (%dx) %mem port; subl %eax, %eax movw port, %dx inb (%dx) } #if defined(PC98_WAB) || defined(PC98_GANB_WAP) static unsigned short port_convert(unsigned short port) { port <<= 8; port &= 0x7f00; /* Mask 0111 1111 0000 0000 */ port |= 0xE0; return port; } #endif /* PC98_WAB || PC98_GANB_WAP */ #if defined(PC98_WABEP) static unsigned short port_convert(unsigned short port) { port &= 0x7f; /* Mask 0000 0000 0111 1111 */ port |= 0x0f00; return port; } #endif /* PC98_WABEP */ #ifdef PC98_WSNA static unsigned short port_convert(unsigned short port) { port <<= 8; port &= 0x7f00; /* Mask 0111 1111 0000 0000 */ port |= 0xE2; return port; } #endif /* PC98_WSNA */ #ifdef PC98_NKVNEC #ifdef PC98_NEC_CIRRUS2 static unsigned short port_convert(unsigned short port) { port = (port & 0xf) + ((port & 0xf0) << 4) + 0x0050; return port; } #else static unsigned short port_convert(unsigned short port) { port = (port & 0xf) + ((port & 0xf0) << 4) + 0x00a0; return port; } #endif /* PC98_NEC_CIRRUS2 */ #endif /* PC98_NKVNEC */ static void outl(port,val) { #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) *(volatile unsigned int *)((char *)mmioBase+(port)) = (unsigned int)(val); #else _outl(port,val); #endif } static void outw(port,val) { #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) *(volatile unsigned short *)((char *)mmioBase+(port)) = (unsigned short)(val); #else _outw(port,val); #endif } static void outb(port,val) { #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) *(volatile unsigned char *)((char *)mmioBase+(port)) = (unsigned char)(val); #else _outb(port,val); #endif } static int inl(port) { unsigned int ret; #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) ret =*(volatile unsigned int *)((char *)mmioBase+(port)); #else ret = _inl(port); #endif return ret; } static int inw(port) { unsigned short ret; #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) ret =*(volatile unsigned short *)((char *)mmioBase+(port)); #else ret = _inw(port); #endif return ret; } static int inb(port) { unsigned char ret; #if defined(PC98_GANB_WAP) || defined(PC98_NKVNEC) || defined(PC98_WAB) || \ defined(PC98_WABEP) || defined(PC98_WSNA) || defined(PC98_PW) || \ defined(PC98_XKB) || defined(PC98_NEC) unsigned short tmp; tmp=port_convert(port); port=tmp; #endif #if defined(PC98_NEC)||defined(PC98_PWLB)||defined(PC98_TGUI)||defined(PC98_MGA) ret =*(volatile unsigned char *)((char *)mmioBase+(port)); #else ret = _inb(port); #endif return ret; } # endif /* PC98 */ # if !defined(__HIGHC__) && !defined(SCO325) # pragma asm partial_optimization outl # pragma asm partial_optimization outw # pragma asm partial_optimization outb # pragma asm partial_optimization inl # pragma asm partial_optimization inw # pragma asm partial_optimization inb # endif #endif #define ldq_u(p) (*((unsigned long *)(p))) #define ldl_u(p) (*((unsigned int *)(p))) #define ldw_u(p) (*((unsigned short *)(p))) #define stq_u(v,p) ((unsigned long *)(p)) = (v) #define stl_u(v,p) ((unsigned int *)(p)) = (v) #define stw_u(v,p) ((unsigned short *)(p)) = (v) #define mem_barrier() /* NOP */ #define write_mem_barrier() /* NOP */ #endif /* __GNUC__ */ #if defined(IODEBUG) && defined(__GNUC__) #undef inb #undef inw #undef inl #undef outb #undef outw #undef outl #define inb(a) __extension__ ({unsigned char __c=RealInb(a); ErrorF("inb(0x%03x) = 0x%02x\t@ line %4d, file %s\n", a, __c, __LINE__, __FILE__);__c;}) #define inw(a) __extension__ ({unsigned short __c=RealInw(a); ErrorF("inw(0x%03x) = 0x%04x\t@ line %4d, file %s\n", a, __c, __LINE__, __FILE__);__c;}) #define inl(a) __extension__ ({unsigned long __c=RealInl(a); ErrorF("inl(0x%03x) = 0x%08x\t@ line %4d, file %s\n", a, __c, __LINE__, __FILE__);__c;}) #define outb(a,b) (ErrorF("outb(0x%03x, 0x%02x)\t@ line %4d, file %s\n", a, b, __LINE__, __FILE__),RealOutb(a,b)) #define outw(a,b) (ErrorF("outw(0x%03x, 0x%04x)\t@ line %4d, file %s\n", a, b, __LINE__, __FILE__),RealOutw(a,b)) #define outl(a,b) (ErrorF("outl(0x%03x, 0x%08x)\t@ line %4d, file %s\n", a, b, __LINE__, __FILE__),RealOutl(a,b)) #endif /* * This header sometimes gets included where is isn't needed, and on some * OSs this causes problems because the following functions generate * references to inb() and outb() which can't be resolved. Defining * NO_COMPILER_H_EXTRAS avoids this problem. */ #ifndef NO_COMPILER_H_EXTRAS /* *----------------------------------------------------------------------- * Port manipulation convenience functions *----------------------------------------------------------------------- */ #ifndef __GNUC__ #define __inline__ /**/ #endif /* * rdinx - read the indexed byte port 'port', index 'ind', and return its value */ static __inline__ unsigned char #ifdef __STDC__ rdinx(unsigned short int port, unsigned char ind) #else rdinx(port, ind) unsigned short int port; unsigned char ind; #endif { if (port == 0x3C0) /* reset attribute flip-flop */ (void) inb(0x3DA); outb(port, ind); return(inb(port+1)); } /* * wrinx - write 'val' to port 'port', index 'ind' */ static __inline__ void #ifdef __STDC__ wrinx(unsigned short int port, unsigned char ind, unsigned char val) #else wrinx(port, ind, val) unsigned short int port; unsigned char ind, val; #endif { outb(port, ind); outb(port+1, val); } /* * modinx - in register 'port', index 'ind', set the bits in 'mask' as in 'new'; * the other bits are unchanged. */ static __inline__ void #ifdef __STDC__ modinx(unsigned short int port, unsigned char ind, unsigned char mask, unsigned char new) #else modinx(port, ind, mask, new) unsigned short int port; unsigned char ind, mask, new; #endif { unsigned char tmp; tmp = (rdinx(port, ind) & ~mask) | (new & mask); wrinx(port, ind, tmp); } /* * tstrg - returns true iff the bits in 'mask' of register 'port' are * readable & writable. */ static __inline__ int #ifdef __STDC__ testrg(unsigned short int port, unsigned char mask) #else tstrg(port, mask) unsigned short int port; unsigned char mask; #endif { unsigned char old, new1, new2; old = inb(port); outb(port, old & ~mask); new1 = inb(port) & mask; outb(port, old | mask); new2 = inb(port) & mask; outb(port, old); return((new1 == 0) && (new2 == mask)); } /* * testinx2 - returns true iff the bits in 'mask' of register 'port', index * 'ind' are readable & writable. */ static __inline__ int #ifdef __STDC__ testinx2(unsigned short int port, unsigned char ind, unsigned char mask) #else testinx2(port, ind, mask) unsigned short int port; unsigned char ind, mask; #endif { unsigned char old, new1, new2; old = rdinx(port, ind); wrinx(port, ind, old & ~mask); new1 = rdinx(port, ind) & mask; wrinx(port, ind, old | mask); new2 = rdinx(port, ind) & mask; wrinx(port, ind, old); return((new1 == 0) && (new2 == mask)); } /* * testinx - returns true iff all bits of register 'port', index 'ind' are * readable & writable. */ static __inline__ int #ifdef __STDC__ testinx(unsigned short int port, unsigned char ind) #else testinx(port, ind, mask) unsigned short int port; unsigned char ind; #endif { return(testinx2(port, ind, 0xFF)); } #endif /* NO_COMPILER_H_EXTRAS */ #endif /* NO_INLINE */ #endif /* _COMPILER_H */