/*
- * AcessOS Microkernel Version
- * lib.c
+ * Acess2
+ *
+ * arch/x86/lib.c
+ * - General arch-specific stuff
*/
#include <acess.h>
#include <threads_int.h>
// === IMPRORTS ===
#if TRACE_LOCKS
extern struct sShortSpinlock glDebug_Lock;
+extern struct sShortSpinlock glThreadListLock;
#endif
extern int GetCPUNum(void);
}
#endif
+ #if TRACE_LOCKS
+ if( Lock != &glDebug_Lock && Lock != &glThreadListLock )
+ {
+ //Log_Log("LOCK", "%p locked by %p", Lock, __builtin_return_address(0));
+ Debug("%p obtaining %p (Called by %p)", __builtin_return_address(0), Lock, __builtin_return_address(1));
+ }
+ #endif
+
// Wait for another CPU to release
while(v) {
// CMPXCHG:
#endif
#if TRACE_LOCKS
- if( Lock != &glDebug_Lock )
+ if( Lock != &glDebug_Lock && Lock != &glThreadListLock )
{
//Log_Log("LOCK", "%p locked by %p", Lock, __builtin_return_address(0));
- LogF("Lock %p locked by %p\n", Lock, __builtin_return_address(0));
+ //Debug("Lock %p locked by %p\t%p", Lock, __builtin_return_address(0), __builtin_return_address(1));
+ Debug("got it");
}
#endif
}
#endif
#if TRACE_LOCKS
- if( Lock != &glDebug_Lock )
+ if( Lock != &glDebug_Lock && Lock != &glThreadListLock )
{
//Log_Log("LOCK", "%p released by %p", Lock, __builtin_return_address(0));
- LogF("Lock %p released by %p\n", Lock, __builtin_return_address(0));
+ Debug("Lock %p released by %p\t%p", Lock, __builtin_return_address(0), __builtin_return_address(1));
}
#endif
outb(GDB_SERIAL_PORT + 3, 0x03); // 8 bits, no parity, one stop bit (8N1)
outb(GDB_SERIAL_PORT + 2, 0xC7); // Enable FIFO with 14-byte threshold and clear it
outb(GDB_SERIAL_PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set
- gbDebug_SerialSetup = 1;
+ gbGDB_SerialSetup = 1;
}
while( (inb(GDB_SERIAL_PORT + 5) & 0x20) == 0 );
outb(GDB_SERIAL_PORT, ch);
outb(GDB_SERIAL_PORT + 3, 0x03); // 8 bits, no parity, one stop bit
outb(GDB_SERIAL_PORT + 2, 0xC7); // Enable FIFO with 14-byte threshold and clear it
outb(GDB_SERIAL_PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set
- gbDebug_SerialSetup = 1;
+ gbGDB_SerialSetup = 1;
}
while( (inb(GDB_SERIAL_PORT + 5) & 1) == 0) ;
return inb(GDB_SERIAL_PORT);
*/
void *memcpy(void *Dest, const void *Src, size_t Num)
{
+// Debug("\nmemcpy:Num=0x%x by %p", Num, __builtin_return_address(0));
if( ((Uint)Dest & 3) || ((Uint)Src & 3) )
__asm__ __volatile__ ("rep movsb" :: "D" (Dest), "S" (Src), "c" (Num));
else {
return Dest;
}
+Uint64 DivMod64U(Uint64 Num, Uint64 Div, Uint64 *Rem)
+{
+ Uint64 ret;
+ if( Div < 0x100000000ULL && Num < 0xFFFFFFFF * Div ) {
+ Uint32 rem, ret_32;
+ __asm__ __volatile__(
+ "div %4"
+ : "=a" (ret_32), "=d" (rem)
+ : "a" ( (Uint32)(Num & 0xFFFFFFFF) ), "d" ((Uint32)(Num >> 32)), "r" (Div)
+ );
+ if(Rem) *Rem = rem;
+ return ret_32;
+ }
+
+ ret = __udivdi3(Num, Div);
+ if(Rem) *Rem = __umoddi3(Num, Div);
+ return ret;
+}
+
/**
* \fn Uint64 __udivdi3(Uint64 Num, Uint64 Den)
* \brief Divide two 64-bit integers