Starting on PAE support, removed UDI from kernel
[tpg/acess2.git] / Kernel / arch / x86 / lib.c
index 2334417..a3c4fa6 100644 (file)
@@ -2,7 +2,7 @@
  * AcessOS Microkernel Version
  * lib.c
  */
-#include <common.h>
+#include <acess.h>
 
 // === CODE ===
 void Spinlock(int *lock)
@@ -50,11 +50,15 @@ Uint32 ind(Uint16 Port)
 
 /**
  * \fn void *memset(void *Dest, int Val, Uint Num)
- * \brief Do a byte set of Dest
+ * \brief Do a byte granuality set of Dest
  */
 void *memset(void *Dest, int Val, Uint Num)
 {
-       __asm__ __volatile__ ("rep stosb" :: "D" (Dest), "a" (Val), "c" (Num));
+       __asm__ __volatile__ (
+               "rep stosl;\n\t"
+               "mov %3, %%ecx;\n\t"
+               "rep stosb"
+               :: "D" (Dest), "a" (Val), "c" (Num/4), "r" (Num&3));
        return Dest;
 }
 /**
@@ -66,19 +70,43 @@ void *memsetd(void *Dest, Uint Val, Uint Num)
        return Dest;
 }
 
+/**
+ * \fn int memcmp(const void *m1, const void *m2, Uint Num)
+ * \brief Compare two pieces of memory
+ */
+int memcmp(const void *m1, const void *m2, Uint Num)
+{
+       while(Num--)
+       {
+               if(*(Uint8*)m1 != *(Uint8*)m2)  break;
+               m1 ++;
+               m2 ++;
+       }
+       return *(Uint8*)m1 - *(Uint8*)m2;
+}
 
 /**
- * \fn void *memcpy(void *Dest, void *Src, Uint Num)
+ * \fn void *memcpy(void *Dest, const void *Src, Uint Num)
+ * \brief Copy \a Num bytes from \a Src to \a Dest
  */
-void *memcpy(void *Dest, void *Src, Uint Num)
+void *memcpy(void *Dest, const void *Src, Uint Num)
 {
-       __asm__ __volatile__ ("rep movsb" :: "D" (Dest), "S" (Src), "c" (Num));
+       if((Uint)Dest & 3 || (Uint)Src & 3)
+               __asm__ __volatile__ ("rep movsb" :: "D" (Dest), "S" (Src), "c" (Num));
+       else {
+               __asm__ __volatile__ (
+                       "rep movsl;\n\t"
+                       "mov %3, %%ecx;\n\t"
+                       "rep movsb"
+                       :: "D" (Dest), "S" (Src), "c" (Num/4), "r" (Num&3));
+       }
        return Dest;
 }
 /**
- * \fn void *memcpyd(void *Dest, void *Src, Uint Num)
+ * \fn void *memcpyd(void *Dest, const void *Src, Uint Num)
+ * \brief Copy \a Num DWORDs from \a Src to \a Dest
  */
-void *memcpyd(void *Dest, void *Src, Uint Num)
+void *memcpyd(void *Dest, const void *Src, Uint Num)
 {
        __asm__ __volatile__ ("rep movsl" :: "D" (Dest), "S" (Src), "c" (Num));
        return Dest;
@@ -101,6 +129,7 @@ Uint64 __udivdi3(Uint64 Num, Uint64 Den)
        if(Den == 32)   return Num >> 5;        // Speed Hacks
        if(Den == 1024) return Num >> 10;       // Speed Hacks
        if(Den == 2048) return Num >> 11;       // Speed Hacks
+       if(Den == 4096) return Num >> 12;
        
        if(Num >> 32 == 0 && Den >> 32 == 0)
                return (Uint32)Num / (Uint32)Den;
@@ -131,6 +160,7 @@ Uint64 __umoddi3(Uint64 Num, Uint64 Den)
        if(Den == 32)   return Num & 31;        // Speed Hacks
        if(Den == 1024) return Num & 1023;      // Speed Hacks
        if(Den == 2048) return Num & 2047;      // Speed Hacks
+       if(Den == 4096) return Num & 4095;      // Speed Hacks
        
        if(Num >> 32 == 0 && Den >> 32 == 0)
                return (Uint32)Num % (Uint32)Den;
@@ -140,10 +170,31 @@ Uint64 __umoddi3(Uint64 Num, Uint64 Den)
        return Num;
 }
 
+Uint16 LittleEndian16(Uint16 Val)
+{
+       return Val;
+}
+Uint16 BigEndian16(Uint16 Val)
+{
+       return ((Val&0xFF)<<8) | ((Val>>8)&0xFF);
+}
+Uint32 LittleEndian32(Uint32 Val)
+{
+       return Val;
+}
+Uint32 BigEndian32(Uint32 Val)
+{
+       return ((Val&0xFF)<<24) | ((Val&0xFF00)<<8) | ((Val>>8)&0xFF00) | ((Val>>24)&0xFF);
+}
+
 // --- EXPORTS ---
 EXPORT(memcpy);        EXPORT(memset);
+EXPORT(memcmp);
 //EXPORT(memcpyw);     EXPORT(memsetw);
 EXPORT(memcpyd);       EXPORT(memsetd);
 EXPORT(inb);   EXPORT(inw);    EXPORT(ind);
 EXPORT(outb);  EXPORT(outw);   EXPORT(outd);
 EXPORT(__udivdi3);     EXPORT(__umoddi3);
+
+EXPORT(LittleEndian16);        EXPORT(BigEndian16);
+EXPORT(LittleEndian32);        EXPORT(BigEndian32);

UCC git Repository :: git.ucc.asn.au