8 void outb(Uint16 Port, Uint8 Data)
10 __asm__ __volatile__ ("outb %%al, %%dx"::"d"(Port),"a"(Data));
12 void outw(Uint16 Port, Uint16 Data)
14 __asm__ __volatile__ ("outw %%ax, %%dx"::"d"(Port),"a"(Data));
16 void outd(Uint16 Port, Uint32 Data)
18 __asm__ __volatile__ ("outl %%eax, %%dx"::"d"(Port),"a"(Data));
20 Uint8 inb(Uint16 Port)
23 __asm__ __volatile__ ("inb %%dx, %%al":"=a"(ret):"d"(Port));
26 Uint16 inw(Uint16 Port)
29 __asm__ __volatile__ ("inw %%dx, %%ax":"=a"(ret):"d"(Port));
32 Uint32 ind(Uint16 Port)
35 __asm__ __volatile__ ("inl %%dx, %%eax":"=a"(ret):"d"(Port));
40 Uint32 BigEndian32(Uint32 Value)
44 ret |= ((Value >> 16) & 0xFF) << 8;
45 ret |= ((Value >> 8) & 0xFF) << 16;
46 ret |= ((Value >> 0) & 0xFF) << 24;
50 Uint16 BigEndian16(Uint16 Value)
52 return (Value>>8)|(Value<<8);
55 // === Memory Manipulation ===
56 int memcmp(const void *__dest, const void *__src, size_t __count)
58 if( ((tVAddr)__dest & 7) != ((tVAddr)__src & 7) ) {
59 const Uint8 *src = __src, *dst = __dest;
64 src ++; dst ++; __count --;
69 const Uint8 *src = __src;
70 const Uint8 *dst = __dest;
71 const Uint64 *src64, *dst64;
73 while( (tVAddr)src & 7 && __count ) {
76 dst ++; src ++; __count --;
84 if( *src64 != *dst64 )
88 if(src[0] != dst[0]) return dst[0]-src[0];
89 if(src[1] != dst[1]) return dst[1]-src[1];
90 if(src[2] != dst[2]) return dst[2]-src[2];
91 if(src[3] != dst[3]) return dst[3]-src[3];
92 if(src[4] != dst[4]) return dst[4]-src[4];
93 if(src[5] != dst[5]) return dst[5]-src[5];
94 if(src[6] != dst[6]) return dst[6]-src[6];
95 if(src[7] != dst[7]) return dst[7]-src[7];
96 return -1; // This should never happen
107 if(*dst != *src) return *dst - *src;
115 void *memcpy(void *__dest, const void *__src, size_t __count)
117 if( ((tVAddr)__dest & 7) != ((tVAddr)__src & 7) )
118 __asm__ __volatile__ ("rep movsb" : : "D"(__dest),"S"(__src),"c"(__count));
120 const Uint8 *src = __src;
122 while( (tVAddr)src & 7 && __count ) {
127 __asm__ __volatile__ ("rep movsq" : : "D"(dst),"S"(src),"c"(__count/8));
130 __count = __count & 7;
137 void *memset(void *__dest, int __val, size_t __count)
139 if( __val != 0 || ((tVAddr)__dest & 7) != 0 )
140 __asm__ __volatile__ ("rep stosb" : : "D"(__dest),"a"(__val),"c"(__count));
144 __asm__ __volatile__ ("rep stosq" : : "D"(dst),"a"(0),"c"(__count/8));
146 __count = __count & 7;
153 void *memsetd(void *__dest, Uint32 __val, size_t __count)
155 __asm__ __volatile__ ("rep stosl" : : "D"(__dest),"a"(__val),"c"(__count));