X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Flib.c;h=0d493bb19fcd6a70b83e11d4d775113e409e5c15;hb=37de13c0c8c88fa6edba679c20becec15547533e;hp=5fa9d12e66524aeba7332df51b0a458a48121810;hpb=9d85201216cb35e1b1e051b1d7cdc38eaa5befa4;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/lib.c b/Kernel/arch/x86/lib.c index 5fa9d12e..0d493bb1 100644 --- a/Kernel/arch/x86/lib.c +++ b/Kernel/arch/x86/lib.c @@ -3,21 +3,30 @@ * lib.c */ #include -#include +#include #define TRACE_LOCKS 0 +#define DEBUG_TO_E9 1 +#define DEBUG_TO_SERIAL 1 +#define SERIAL_PORT 0x3F8 +#define GDB_SERIAL_PORT 0x2F8 + +// === IMPRORTS === #if TRACE_LOCKS extern struct sShortSpinlock glDebug_Lock; +extern struct sShortSpinlock glThreadListLock; #endif - -// === IMPRORTS === extern int GetCPUNum(void); // === PROTOTYPES == Uint64 __udivdi3(Uint64 Num, Uint64 Den); Uint64 __umoddi3(Uint64 Num, Uint64 Den); +// === GLOBALS === + int gbDebug_SerialSetup = 0; + int gbGDB_SerialSetup = 0; + // === CODE === /** * \brief Determine if a short spinlock is locked @@ -86,6 +95,14 @@ void SHORTLOCK(struct sShortSpinlock *Lock) } #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: @@ -116,10 +133,11 @@ void SHORTLOCK(struct sShortSpinlock *Lock) #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 } @@ -137,10 +155,10 @@ void SHORTREL(struct sShortSpinlock *Lock) #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 @@ -158,6 +176,69 @@ void SHORTREL(struct sShortSpinlock *Lock) #endif } +// === DEBUG IO === +#if USE_GDB_STUB +int putDebugChar(char ch) +{ + if(!gbGDB_SerialSetup) { + outb(GDB_SERIAL_PORT + 1, 0x00); // Disable all interrupts + outb(GDB_SERIAL_PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) + outb(GDB_SERIAL_PORT + 0, 0x0C); // Set divisor to 12 (lo byte) 9600 baud + outb(GDB_SERIAL_PORT + 1, 0x00); // (base is (hi byte) + 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 + gbGDB_SerialSetup = 1; + } + while( (inb(GDB_SERIAL_PORT + 5) & 0x20) == 0 ); + outb(GDB_SERIAL_PORT, ch); + return 0; +} +int getDebugChar(void) +{ + if(!gbGDB_SerialSetup) { + outb(GDB_SERIAL_PORT + 1, 0x00); // Disable all interrupts + outb(GDB_SERIAL_PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) + outb(GDB_SERIAL_PORT + 0, 0x0C); // Set divisor to 12 (lo byte) 9600 baud + outb(GDB_SERIAL_PORT + 1, 0x00); // (hi byte) + 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 + gbGDB_SerialSetup = 1; + } + while( (inb(GDB_SERIAL_PORT + 5) & 1) == 0) ; + return inb(GDB_SERIAL_PORT); +} +#endif /* USE_GDB_STUB */ + +void Debug_PutCharDebug(char ch) +{ + #if DEBUG_TO_E9 + __asm__ __volatile__ ( "outb %%al, $0xe9" :: "a"(((Uint8)ch)) ); + #endif + + #if DEBUG_TO_SERIAL + if(!gbDebug_SerialSetup) { + outb(SERIAL_PORT + 1, 0x00); // Disable all interrupts + outb(SERIAL_PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) + outb(SERIAL_PORT + 0, 0x0C); // Set divisor to 12 (lo byte) 9600 baud + outb(SERIAL_PORT + 1, 0x00); // (hi byte) + outb(SERIAL_PORT + 3, 0x03); // 8 bits, no parity, one stop bit + outb(SERIAL_PORT + 2, 0xC7); // Enable FIFO with 14-byte threshold and clear it + outb(SERIAL_PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set + gbDebug_SerialSetup = 1; + } + while( (inb(SERIAL_PORT + 5) & 0x20) == 0 ); + outb(SERIAL_PORT, ch); + #endif +} + +void Debug_PutStringDebug(const char *String) +{ + while(*String) + Debug_PutCharDebug(*String++); +} + // === IO Commands === void outb(Uint16 Port, Uint8 Data) { @@ -353,22 +434,6 @@ Uint64 __umoddi3(Uint64 Num, Uint64 Den) return Num - __udivdi3(Num, Den) * Den; } -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); @@ -379,9 +444,6 @@ EXPORT(inb); EXPORT(inw); EXPORT(ind); EXPORT(outb); EXPORT(outw); EXPORT(outd); EXPORT(__udivdi3); EXPORT(__umoddi3); -EXPORT(LittleEndian16); EXPORT(BigEndian16); -EXPORT(LittleEndian32); EXPORT(BigEndian32); - EXPORT(SHORTLOCK); EXPORT(SHORTREL); EXPORT(IS_LOCKED);