Debugging a segfault in ELF loader (when loading CLIShell)
[tpg/acess2.git] / Kernel / debug.c
index 8533a9e..f59704a 100644 (file)
@@ -13,7 +13,7 @@
 #define        GDB_SERIAL_PORT 0x2F8
 #define        DEBUG_MAX_LINE_LEN      256
 
-#define        LOCK_DEBUG_OUTPUT       0
+#define        LOCK_DEBUG_OUTPUT       1
 
 // === IMPORTS ===
 extern void Threads_Dump(void);
@@ -24,8 +24,11 @@ extern void  KernelPanic_PutChar(char Ch);
  int   putDebugChar(char ch);
  int   getDebugChar(void);
 static void    Debug_Putchar(char ch);
-static void    Debug_Puts(int DbgOnly, char *Str);
+static void    Debug_Puts(int DbgOnly, const char *Str);
+void   Debug_DbgOnlyFmt(const char *format, va_list args);
+void   Debug_FmtS(const char *format, ...);
 void   Debug_Fmt(const char *format, va_list args);
+void   Debug_SetKTerminal(const char *File);
 
 // === GLOBALS ===
  int   gDebug_Level = 0;
@@ -35,7 +38,7 @@ void  Debug_Fmt(const char *format, va_list args);
  int   gbDebug_IsKPanic = 0;
 volatile int   gbInPutChar = 0;
 #if LOCK_DEBUG_OUTPUT
-tSpinlock      glDebug_Lock;
+tShortSpinlock glDebug_Lock;
 #endif
 
 // === CODE ===
@@ -108,7 +111,7 @@ static void Debug_Putchar(char ch)
                KernelPanic_PutChar(ch);
 }
 
-static void Debug_Puts(int UseKTerm, char *Str)
+static void Debug_Puts(int UseKTerm, const char *Str)
 {
         int    len = 0;
        while( *Str )
@@ -155,6 +158,14 @@ void Debug_Fmt(const char *format, va_list args)
        return ;
 }
 
+void Debug_FmtS(const char *format, ...)
+{
+       va_list args;   
+       va_start(args, format);
+       Debug_Fmt(format, args);
+       va_end(args);
+}
+
 void Debug_KernelPanic()
 {
        gbDebug_IsKPanic = 1;
@@ -162,14 +173,15 @@ void Debug_KernelPanic()
 }
 
 /**
- * \fn void LogF(char *Msg, ...)
+ * \fn void LogF(const char *Msg, ...)
+ * \brief Raw debug log (no new line, no prefix)
  */
-void LogF(char *Fmt, ...)
+void LogF(const char *Fmt, ...)
 {
        va_list args;
 
        #if LOCK_DEBUG_OUTPUT
-       VTIGHTLOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
        
        va_start(args, Fmt);
@@ -179,19 +191,19 @@ void LogF(char *Fmt, ...)
        va_end(args);
        
        #if LOCK_DEBUG_OUTPUT
-       RELEASE(&glDebug_Lock);
+       SHORTREL(&glDebug_Lock);
        #endif
 }
 /**
- * \fn void Debug(char *Msg, ...)
+ * \fn void Debug(const char *Msg, ...)
  * \brief Print only to the debug channel
  */
-void Debug(char *Fmt, ...)
+void Debug(const char *Fmt, ...)
 {
        va_list args;
        
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
 
        Debug_Puts(0, "Debug: ");
@@ -201,18 +213,18 @@ void Debug(char *Fmt, ...)
        Debug_PutCharDebug('\r');
        Debug_PutCharDebug('\n');
        #if LOCK_DEBUG_OUTPUT
-       RELEASE(&glDebug_Lock);
+       SHORTREL(&glDebug_Lock);
        #endif
 }
 /**
- * \fn void Log(char *Msg, ...)
+ * \fn void Log(const char *Msg, ...)
  */
-void Log(char *Fmt, ...)
+void Log(const char *Fmt, ...)
 {
        va_list args;
        
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
 
        Debug_Puts(1, "Log: ");
@@ -223,15 +235,15 @@ void Log(char *Fmt, ...)
        Debug_Putchar('\n');
        
        #if LOCK_DEBUG_OUTPUT
-       RELEASE(&glDebug_Lock);
+       SHORTREL(&glDebug_Lock);
        #endif
 }
-void Warning(char *Fmt, ...)
+void Warning(const char *Fmt, ...)
 {
        va_list args;
        
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
        
        Debug_Puts(1, "Warning: ");
@@ -242,17 +254,17 @@ void Warning(char *Fmt, ...)
        Debug_Putchar('\n');
        
        #if LOCK_DEBUG_OUTPUT
-       RELEASE(&glDebug_Lock);
+       SHORTREL(&glDebug_Lock);
        #endif
 }
-void Panic(char *Fmt, ...)
+void Panic(const char *Fmt, ...)
 {
        va_list args;
        
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
-       // And never release
+       // And never SHORTREL
        
        Debug_KernelPanic();
        
@@ -270,7 +282,7 @@ void Panic(char *Fmt, ...)
        for(;;) __asm__ __volatile__ ("hlt");
 }
 
-void Debug_SetKTerminal(char *File)
+void Debug_SetKTerminal(const char *File)
 {
         int    tmp;
        if(giDebug_KTerm != -1) {
@@ -284,27 +296,40 @@ void Debug_SetKTerminal(char *File)
        Log_Log("Debug", "Returning to %p", __builtin_return_address(0));
 }
 
-void Debug_Enter(char *FuncName, char *ArgTypes, ...)
+void Debug_Enter(const char *FuncName, const char *ArgTypes, ...)
 {
        va_list args;
-        int    i = gDebug_Level ++;
+        int    i;
         int    pos;
+       tTID    tid = Threads_GetTID();
+        
+       #if LOCK_DEBUG_OUTPUT
+       SHORTLOCK(&glDebug_Lock);
+       #endif
+
+       i = gDebug_Level ++;
 
        va_start(args, ArgTypes);
 
+       LogF("%012lli ", now());
        while(i--)      Debug_Putchar(' ');
 
-       Debug_Puts(1, FuncName);        Debug_Puts(1, ": (");
+       Debug_Puts(1, FuncName);
+       Debug_FmtS("[%i]", tid);
+       Debug_Puts(1, ": (");
 
        while(*ArgTypes)
        {
                pos = strpos(ArgTypes, ' ');
-               if(pos != -1)   ArgTypes[pos] = '\0';
                if(pos == -1 || pos > 1) {
-                       Debug_Puts(1, ArgTypes+1);
+                       if(pos == -1)
+                               Debug_Puts(1, ArgTypes+1);
+                       else {
+                               for( i = 1; i < pos; i ++ )
+                                       Debug_Putchar(ArgTypes[i]);
+                       }
                        Debug_Putchar('=');
                }
-               if(pos != -1)   ArgTypes[pos] = ' ';
                switch(*ArgTypes)
                {
                case 'p':       LogF("%p", va_arg(args, void*));        break;
@@ -326,33 +351,52 @@ void Debug_Enter(char *FuncName, char *ArgTypes, ...)
 
        va_end(args);
        Debug_Putchar(')');     Debug_Putchar('\r');    Debug_Putchar('\n');
+       
+       #if LOCK_DEBUG_OUTPUT
+       SHORTREL(&glDebug_Lock);
+       #endif
 }
 
-void Debug_Log(char *FuncName, char *Fmt, ...)
+void Debug_Log(const char *FuncName, const char *Fmt, ...)
 {
        va_list args;
         int    i = gDebug_Level;
+       tTID    tid = Threads_GetTID();
+
+       #if LOCK_DEBUG_OUTPUT
+       SHORTLOCK(&glDebug_Lock);
+       #endif
 
        va_start(args, Fmt);
 
+       LogF("%012lli ", now());
        while(i--)      Debug_Putchar(' ');
 
-       Debug_Puts(1, FuncName);        Debug_Puts(1, ": ");
+       Debug_Puts(1, FuncName);
+       Debug_FmtS("[%i]", tid);
+       Debug_Puts(1, ": ");
        Debug_Fmt(Fmt, args);
 
        va_end(args);
        Debug_Putchar('\r');
        Debug_Putchar('\n');
+       
+       #if LOCK_DEBUG_OUTPUT
+       SHORTREL(&glDebug_Lock);
+       #endif
 }
 
-void Debug_Leave(char *FuncName, char RetType, ...)
+void Debug_Leave(const char *FuncName, char RetType, ...)
 {
        va_list args;
-        int    i = --gDebug_Level;
+        int    i;
+       tTID    tid = Threads_GetTID();
 
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
+       
+       i = --gDebug_Level;
 
        va_start(args, RetType);
 
@@ -360,15 +404,21 @@ void Debug_Leave(char *FuncName, char RetType, ...)
                gDebug_Level = 0;
                i = 0;
        }
+       LogF("%012lli ", now());
        // Indenting
        while(i--)      Debug_Putchar(' ');
 
-       Debug_Puts(1, FuncName);        Debug_Puts(1, ": RETURN");
+       Debug_Puts(1, FuncName);
+       Debug_FmtS("[%i]", tid);
+       Debug_Puts(1, ": RETURN");
 
        // No Return
        if(RetType == '-') {
                Debug_Putchar('\r');
                Debug_Putchar('\n');
+               #if LOCK_DEBUG_OUTPUT
+               SHORTREL(&glDebug_Lock);
+               #endif
                return;
        }
 
@@ -388,11 +438,15 @@ void Debug_Leave(char *FuncName, char RetType, ...)
        Debug_Putchar('\n');
 
        va_end(args);
+       
+       #if LOCK_DEBUG_OUTPUT
+       SHORTREL(&glDebug_Lock);
+       #endif
 }
 
-void Debug_HexDump(char *Header, void *Data, Uint Length)
+void Debug_HexDump(const char *Header, const void *Data, Uint Length)
 {
-       Uint8   *cdat = Data;
+       const Uint8     *cdat = Data;
        Uint    pos = 0;
        Debug_Puts(1, Header);
        LogF(" (Hexdump of %p)\r\n", Data);

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