* AcessOS Microkernel Version
* lib.c
*/
-#include <common.h>
+#include <acess.h>
// === CODE ===
void Spinlock(int *lock)
/**
* \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;
}
/**
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;
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;
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;
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);