More behavior fixes (changes to resolution only apply on a mode set)
[tpg/acess2.git] / Kernel / debug.c
index ac5c059..8533a9e 100644 (file)
 #define DEBUG_TO_SERIAL        1
 #define        SERIAL_PORT     0x3F8
 #define        GDB_SERIAL_PORT 0x2F8
-#define DEBUG_USE_VSNPRINTF    0
 #define        DEBUG_MAX_LINE_LEN      256
 
+#define        LOCK_DEBUG_OUTPUT       0
+
 // === IMPORTS ===
 extern void Threads_Dump(void);
 extern void    KernelPanic_SetMode(void);
@@ -33,6 +34,9 @@ void  Debug_Fmt(const char *format, va_list args);
  int   gbGDB_SerialSetup = 0;
  int   gbDebug_IsKPanic = 0;
 volatile int   gbInPutChar = 0;
+#if LOCK_DEBUG_OUTPUT
+tSpinlock      glDebug_Lock;
+#endif
 
 // === CODE ===
 int putDebugChar(char ch)
@@ -56,8 +60,8 @@ 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, 0x03);    // Set divisor to 3 (lo byte) 38400 baud
-               outb(GDB_SERIAL_PORT + 1, 0x00);    //                  (hi byte)
+               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
@@ -77,8 +81,8 @@ static void Debug_PutCharDebug(char ch)
        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, 0x03);    // Set divisor to 3 (lo byte) 38400 baud
-               outb(SERIAL_PORT + 1, 0x00);    //                  (hi byte)
+               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
@@ -164,11 +168,19 @@ void LogF(char *Fmt, ...)
 {
        va_list args;
 
+       #if LOCK_DEBUG_OUTPUT
+       VTIGHTLOCK(&glDebug_Lock);
+       #endif
+       
        va_start(args, Fmt);
 
        Debug_Fmt(Fmt, args);
 
        va_end(args);
+       
+       #if LOCK_DEBUG_OUTPUT
+       RELEASE(&glDebug_Lock);
+       #endif
 }
 /**
  * \fn void Debug(char *Msg, ...)
@@ -177,12 +189,20 @@ void LogF(char *Fmt, ...)
 void Debug(char *Fmt, ...)
 {
        va_list args;
+       
+       #if LOCK_DEBUG_OUTPUT
+       LOCK(&glDebug_Lock);
+       #endif
 
        Debug_Puts(0, "Debug: ");
        va_start(args, Fmt);
        Debug_DbgOnlyFmt(Fmt, args);
        va_end(args);
+       Debug_PutCharDebug('\r');
        Debug_PutCharDebug('\n');
+       #if LOCK_DEBUG_OUTPUT
+       RELEASE(&glDebug_Lock);
+       #endif
 }
 /**
  * \fn void Log(char *Msg, ...)
@@ -190,32 +210,57 @@ void Debug(char *Fmt, ...)
 void Log(char *Fmt, ...)
 {
        va_list args;
+       
+       #if LOCK_DEBUG_OUTPUT
+       LOCK(&glDebug_Lock);
+       #endif
 
        Debug_Puts(1, "Log: ");
        va_start(args, Fmt);
        Debug_Fmt(Fmt, args);
        va_end(args);
+       Debug_Putchar('\r');
        Debug_Putchar('\n');
+       
+       #if LOCK_DEBUG_OUTPUT
+       RELEASE(&glDebug_Lock);
+       #endif
 }
 void Warning(char *Fmt, ...)
 {
        va_list args;
+       
+       #if LOCK_DEBUG_OUTPUT
+       LOCK(&glDebug_Lock);
+       #endif
+       
        Debug_Puts(1, "Warning: ");
        va_start(args, Fmt);
        Debug_Fmt(Fmt, args);
        va_end(args);
+       Debug_Putchar('\r');
        Debug_Putchar('\n');
+       
+       #if LOCK_DEBUG_OUTPUT
+       RELEASE(&glDebug_Lock);
+       #endif
 }
 void Panic(char *Fmt, ...)
 {
        va_list args;
        
+       #if LOCK_DEBUG_OUTPUT
+       LOCK(&glDebug_Lock);
+       #endif
+       // And never release
+       
        Debug_KernelPanic();
        
        Debug_Puts(1, "Panic: ");
        va_start(args, Fmt);
        Debug_Fmt(Fmt, args);
        va_end(args);
+       Debug_Putchar('\r');
        Debug_Putchar('\n');
 
        Threads_Dump();
@@ -280,7 +325,7 @@ void Debug_Enter(char *FuncName, char *ArgTypes, ...)
        }
 
        va_end(args);
-       Debug_Putchar(')');     Debug_Putchar('\n');
+       Debug_Putchar(')');     Debug_Putchar('\r');    Debug_Putchar('\n');
 }
 
 void Debug_Log(char *FuncName, char *Fmt, ...)
@@ -296,6 +341,7 @@ void Debug_Log(char *FuncName, char *Fmt, ...)
        Debug_Fmt(Fmt, args);
 
        va_end(args);
+       Debug_Putchar('\r');
        Debug_Putchar('\n');
 }
 
@@ -304,6 +350,10 @@ void Debug_Leave(char *FuncName, char RetType, ...)
        va_list args;
         int    i = --gDebug_Level;
 
+       #if LOCK_DEBUG_OUTPUT
+       LOCK(&glDebug_Lock);
+       #endif
+
        va_start(args, RetType);
 
        if( i == -1 ) {
@@ -317,6 +367,7 @@ void Debug_Leave(char *FuncName, char RetType, ...)
 
        // No Return
        if(RetType == '-') {
+               Debug_Putchar('\r');
                Debug_Putchar('\n');
                return;
        }
@@ -333,6 +384,7 @@ void Debug_Leave(char *FuncName, char RetType, ...)
        // Extended (64-Bit)
        case 'X':       Debug_Fmt("0x%llx", args);      break;
        }
+       Debug_Putchar('\r');
        Debug_Putchar('\n');
 
        va_end(args);
@@ -343,11 +395,12 @@ void Debug_HexDump(char *Header, void *Data, Uint Length)
        Uint8   *cdat = Data;
        Uint    pos = 0;
        Debug_Puts(1, Header);
-       LogF(" (Hexdump of %p)\n", Data);
+       LogF(" (Hexdump of %p)\r\n", Data);
+
+       #define CH(n)   ((' '<=cdat[(n)]&&cdat[(n)]<=0x7F) ? cdat[(n)] : '.')
 
        while(Length >= 16)
        {
-               #define CH(n)   ((' '<=cdat[(n)]&&cdat[(n)]<=0x7F) ? cdat[(n)] : '.')
                Log("%04x: %02x %02x %02x %02x %02x %02x %02x %02x"
                        " %02x %02x %02x %02x %02x %02x %02x %02x"
                        "  %c%c%c%c%c%c%c%c %c%c%c%c%c%c%c%c",
@@ -362,14 +415,23 @@ void Debug_HexDump(char *Header, void *Data, Uint Length)
                pos += 16;
        }
 
-       LogF("Log: %04x: ", pos);
-       while(Length)
        {
-               Uint    byte = *cdat;
-               LogF("%02x ", byte);
-               Length--;
-               cdat ++;
+                int    i ;
+               LogF("Log: %04x: ", pos);
+               for(i = 0; i < Length; i ++)
+               {
+                       LogF("%02x ", cdat[i]);
+               }
+               for( ; i < 16; i ++)    LogF("   ");
+               LogF(" ");
+               for(i = 0; i < Length; i ++)
+               {
+                       if( i == 8 )    LogF(" ");
+                       LogF("%c", CH(i));
+               }
        }
+       
+       Debug_Putchar('\r');
        Debug_Putchar('\n');
 }
 

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