X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdebug.c;h=8404fc1d21a848a3cd2cd7bdde467805da57dd78;hb=0df427777a3ab005eaeebc1ee4a326c8dfe91b29;hp=f78ea015fa91f32c35d579be91500c7b8d6afe84;hpb=1e7db40300bc594cf708bb6082a6e05a268da946;p=tpg%2Facess2.git diff --git a/Kernel/debug.c b/Kernel/debug.c index f78ea015..8404fc1d 100644 --- a/Kernel/debug.c +++ b/Kernel/debug.c @@ -2,12 +2,13 @@ * AcessOS Microkernel Version * debug.c */ -#include +#include #include #define DEBUG_TO_E9 1 #define DEBUG_TO_SERIAL 1 #define SERIAL_PORT 0x3F8 +#define GDB_SERIAL_PORT 0x2F8 // === IMPORTS === extern void Threads_Dump(); @@ -16,8 +17,41 @@ extern void Threads_Dump(); int gDebug_Level = 0; int giDebug_KTerm = -1; int gbDebug_SerialSetup = 0; + int gbGDB_SerialSetup = 0; // === CODE === +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, 0x03); // Set divisor to 3 (lo byte) 38400 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 + gbDebug_SerialSetup = 1; + } + while( (inb(GDB_SERIAL_PORT + 5) & 0x20) == 0 ); + outb(GDB_SERIAL_PORT, ch); + return 0; +} +int getDebugChar() +{ + 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, 0x03); // Set divisor to 3 (lo byte) 38400 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 + gbDebug_SerialSetup = 1; + } + while( (inb(GDB_SERIAL_PORT + 5) & 1) == 0) ; + return inb(GDB_SERIAL_PORT); +} + static void E9(char ch) { if(giDebug_KTerm != -1) @@ -56,7 +90,7 @@ void E9_Fmt(const char *format, va_list *args) char *p = NULL; int isLongLong = 0; Uint64 arg; - + while((c = *format++) != 0) { // Non control character @@ -152,7 +186,18 @@ void E9_Fmt(const char *format, va_list *args) if(!p) p = "(null)"; while(*p) E9(*p++); break; - + + // Single Character / Array + case 'c': + if(minSize == 1) { + E9(arg); + break; + } + p = (char*)(Uint)arg; + if(!p) goto printString; + while(minSize--) E9(*p++); + break; + default: E9(arg); break; } } @@ -223,7 +268,7 @@ void Debug_SetKTerminal(char *File) if(giDebug_KTerm != -1) VFS_Close(giDebug_KTerm); giDebug_KTerm = VFS_Open(File, VFS_OPENFLAG_WRITE); - Log("Opened '%s' as %i\n", File, giDebug_KTerm); + Log("Opened '%s' as 0x%x", File, giDebug_KTerm); } void Debug_Enter(char *FuncName, char *ArgTypes, ...) @@ -294,6 +339,10 @@ void Debug_Leave(char *FuncName, char RetType, ...) va_start(args, RetType); + if( i == -1 ) { + gDebug_Level = 0; + i = 0; + } // Indenting while(i--) E9(' ');