X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdebug.c;h=5bcbcb8e03917701eb93ce43c59cba2122ecd1d7;hb=07ed0e7479fc741a947579d4460a25a050fc9260;hp=31d3b3992bf0d90cf5f51e58fa25ef4783135d32;hpb=6804038d728db78026b05507944bd1eb6587e22b;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/debug.c b/KernelLand/Kernel/debug.c index 31d3b399..5bcbcb8e 100644 --- a/KernelLand/Kernel/debug.c +++ b/KernelLand/Kernel/debug.c @@ -7,10 +7,11 @@ #define DEBUG_MAX_LINE_LEN 256 #define LOCK_DEBUG_OUTPUT 1 // Avoid interleaving of output lines? -#define TRACE_TO_KTERM 0 // Send ENTER/DEBUG/LEAVE to debug? +#define TRACE_TO_KTERM 0 // Send ENTER/DEBUG/LEAVE to debug? // === IMPORTS === extern void Threads_Dump(void); +extern void Heap_Dump(void); extern void KernelPanic_SetMode(void); extern void KernelPanic_PutChar(char Ch); extern void IPStack_SendDebugText(const char *Text); @@ -39,7 +40,10 @@ static void Debug_Putchar(char ch) { Debug_PutCharDebug(ch); - if( !gbDebug_IsKPanic ) + if( gbDebug_IsKPanic ) + KernelPanic_PutChar(ch); + + if( gbDebug_IsKPanic < 2 ) { if(gbInPutChar) return ; gbInPutChar = 1; @@ -47,8 +51,6 @@ static void Debug_Putchar(char ch) VFS_Write(giDebug_KTerm, 1, &ch); gbInPutChar = 0; } - else - KernelPanic_PutChar(ch); if( gbSendNetworkDebug ) { @@ -75,7 +77,7 @@ static void Debug_Puts(int UseKTerm, const char *Str) IPStack_SendDebugText(Str); // Output to the kernel terminal - if( UseKTerm && !gbDebug_IsKPanic && giDebug_KTerm != -1) + if( UseKTerm && gbDebug_IsKPanic < 2 && giDebug_KTerm != -1) { if(gbInPutChar) return ; gbInPutChar = 1; @@ -92,12 +94,13 @@ void Debug_DbgOnlyFmt(const char *format, va_list args) void Debug_Fmt(int bUseKTerm, const char *format, va_list args) { char buf[DEBUG_MAX_LINE_LEN]; -// int len; buf[DEBUG_MAX_LINE_LEN-1] = 0; - /*len = */vsnprintf(buf, DEBUG_MAX_LINE_LEN-1, format, args); - //if( len < DEBUG_MAX_LINE ) - // do something + int len = vsnprintf(buf, DEBUG_MAX_LINE_LEN-1, format, args); Debug_Puts(bUseKTerm, buf); + if( len > DEBUG_MAX_LINE_LEN-1 ) { + // do something + Debug_Puts(bUseKTerm, "[...]"); + } return ; } @@ -111,10 +114,17 @@ void Debug_FmtS(int bUseKTerm, const char *format, ...) void Debug_KernelPanic(void) { - #if LOCK_DEBUG_OUTPUT - SHORTREL(&glDebug_Lock); - #endif - gbDebug_IsKPanic = 1; + // 5 nested panics? Fuck it + if( gbDebug_IsKPanic > 5 ) + HALT_CPU(); + gbDebug_IsKPanic ++; + if( gbDebug_IsKPanic == 1 ) + { + #if LOCK_DEBUG_OUTPUT + SHORTREL(&glDebug_Lock); + #endif + VT_SetTerminal(7); + } KernelPanic_SetMode(); } @@ -127,6 +137,7 @@ void LogF(const char *Fmt, ...) va_list args; #if LOCK_DEBUG_OUTPUT + if(CPU_HAS_LOCK(&glDebug_Lock)) return ; SHORTLOCK(&glDebug_Lock); #endif @@ -149,6 +160,7 @@ void Debug(const char *Fmt, ...) va_list args; #if LOCK_DEBUG_OUTPUT + if(CPU_HAS_LOCK(&glDebug_Lock)) return ; SHORTLOCK(&glDebug_Lock); #endif @@ -162,32 +174,55 @@ void Debug(const char *Fmt, ...) SHORTREL(&glDebug_Lock); #endif } -/** - * \fn void Log(const char *Msg, ...) - */ -void Log(const char *Fmt, ...) + + +void LogFV(const char *Fmt, va_list args) { - va_list args; + #if LOCK_DEBUG_OUTPUT + if(CPU_HAS_LOCK(&glDebug_Lock)) return ; + SHORTLOCK(&glDebug_Lock); + #endif + + Debug_Fmt(1, Fmt, args); #if LOCK_DEBUG_OUTPUT + SHORTREL(&glDebug_Lock); + #endif +} + +void LogV(const char *Fmt, va_list args) +{ + #if LOCK_DEBUG_OUTPUT + if(CPU_HAS_LOCK(&glDebug_Lock)) return ; SHORTLOCK(&glDebug_Lock); #endif Debug_Puts(1, "Log: "); - va_start(args, Fmt); Debug_Fmt(1, Fmt, args); - va_end(args); Debug_Puts(1, "\r\n"); #if LOCK_DEBUG_OUTPUT SHORTREL(&glDebug_Lock); #endif } + +/** + * \fn void Log(const char *Msg, ...) + */ +void Log(const char *Fmt, ...) +{ + va_list args; + va_start(args, Fmt); + LogV(Fmt, args); + va_end(args); +} + void Warning(const char *Fmt, ...) { va_list args; #if LOCK_DEBUG_OUTPUT + if(CPU_HAS_LOCK(&glDebug_Lock)) return ; SHORTLOCK(&glDebug_Lock); #endif @@ -207,7 +242,8 @@ void Panic(const char *Fmt, ...) va_list args; #if LOCK_DEBUG_OUTPUT - SHORTLOCK(&glDebug_Lock); + if( !CPU_HAS_LOCK(&glDebug_Lock) ) + SHORTLOCK(&glDebug_Lock); #endif // And never SHORTREL @@ -220,10 +256,11 @@ void Panic(const char *Fmt, ...) Debug_Putchar('\r'); Debug_Putchar('\n'); - Threads_Dump(); - Heap_Dump(); + Proc_PrintBacktrace(); + //Threads_Dump(); + //Heap_Dump(); - for(;;) ; + HALT_CPU(); } void Debug_SetKTerminal(const char *File) @@ -248,6 +285,7 @@ void Debug_Enter(const char *FuncName, const char *ArgTypes, ...) tTID tid = Threads_GetTID(); #if LOCK_DEBUG_OUTPUT + if(CPU_HAS_LOCK(&glDebug_Lock)) return ; SHORTLOCK(&glDebug_Lock); #endif @@ -308,6 +346,7 @@ void Debug_Log(const char *FuncName, const char *Fmt, ...) tTID tid = Threads_GetTID(); #if LOCK_DEBUG_OUTPUT + if(CPU_HAS_LOCK(&glDebug_Lock)) return ; SHORTLOCK(&glDebug_Lock); #endif @@ -336,6 +375,7 @@ void Debug_Leave(const char *FuncName, char RetType, ...) tTID tid = Threads_GetTID(); #if LOCK_DEBUG_OUTPUT + if(CPU_HAS_LOCK(&glDebug_Lock)) return ; SHORTLOCK(&glDebug_Lock); #endif @@ -385,7 +425,7 @@ void Debug_Leave(const char *FuncName, char RetType, ...) #endif } -void Debug_HexDump(const char *Header, const void *Data, Uint Length) +void Debug_HexDump(const char *Header, const void *Data, size_t Length) { const Uint8 *cdat = Data; Uint pos = 0;