From 3e11c7767641614fbb3fad38fffefa0da9e66919 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 3 Oct 2010 09:28:52 +0800 Subject: [PATCH] Replace rand() implementation - fixes threading lockups - Large ammounts of debug enabled to trace #PF in FAT driver - Added TID to Debug logging - Enabled locking on debug prints --- Kernel/binary.c | 2 +- Kernel/debug.c | 80 ++++++++++++++++++++------ Kernel/lib.c | 28 ++++++--- Kernel/syscalls.c | 2 +- Kernel/vfs/main.c | 2 + Kernel/vfs/open.c | 4 +- Modules/Filesystems/FAT/fat.c | 2 +- Usermode/Applications/login_src/main.c | 2 + 8 files changed, 91 insertions(+), 31 deletions(-) diff --git a/Kernel/binary.c b/Kernel/binary.c index aa5d9547..dffb1784 100644 --- a/Kernel/binary.c +++ b/Kernel/binary.c @@ -2,7 +2,7 @@ * Acess2 * Common Binary Loader */ -#define DEBUG 0 +#define DEBUG 1 #include #include #include diff --git a/Kernel/debug.c b/Kernel/debug.c index 8533a9e8..ce87d9de 100644 --- a/Kernel/debug.c +++ b/Kernel/debug.c @@ -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); @@ -35,7 +35,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 === @@ -155,6 +155,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; @@ -169,7 +177,7 @@ void LogF(char *Fmt, ...) va_list args; #if LOCK_DEBUG_OUTPUT - VTIGHTLOCK(&glDebug_Lock); + SHORTLOCK(&glDebug_Lock); #endif va_start(args, Fmt); @@ -179,7 +187,7 @@ void LogF(char *Fmt, ...) va_end(args); #if LOCK_DEBUG_OUTPUT - RELEASE(&glDebug_Lock); + SHORTREL(&glDebug_Lock); #endif } /** @@ -191,7 +199,7 @@ void Debug(char *Fmt, ...) va_list args; #if LOCK_DEBUG_OUTPUT - LOCK(&glDebug_Lock); + SHORTLOCK(&glDebug_Lock); #endif Debug_Puts(0, "Debug: "); @@ -201,7 +209,7 @@ void Debug(char *Fmt, ...) Debug_PutCharDebug('\r'); Debug_PutCharDebug('\n'); #if LOCK_DEBUG_OUTPUT - RELEASE(&glDebug_Lock); + SHORTREL(&glDebug_Lock); #endif } /** @@ -212,7 +220,7 @@ void Log(char *Fmt, ...) va_list args; #if LOCK_DEBUG_OUTPUT - LOCK(&glDebug_Lock); + SHORTLOCK(&glDebug_Lock); #endif Debug_Puts(1, "Log: "); @@ -223,7 +231,7 @@ void Log(char *Fmt, ...) Debug_Putchar('\n'); #if LOCK_DEBUG_OUTPUT - RELEASE(&glDebug_Lock); + SHORTREL(&glDebug_Lock); #endif } void Warning(char *Fmt, ...) @@ -231,7 +239,7 @@ void Warning(char *Fmt, ...) va_list args; #if LOCK_DEBUG_OUTPUT - LOCK(&glDebug_Lock); + SHORTLOCK(&glDebug_Lock); #endif Debug_Puts(1, "Warning: "); @@ -242,7 +250,7 @@ void Warning(char *Fmt, ...) Debug_Putchar('\n'); #if LOCK_DEBUG_OUTPUT - RELEASE(&glDebug_Lock); + SHORTREL(&glDebug_Lock); #endif } void Panic(char *Fmt, ...) @@ -250,9 +258,9 @@ void Panic(char *Fmt, ...) va_list args; #if LOCK_DEBUG_OUTPUT - LOCK(&glDebug_Lock); + SHORTLOCK(&glDebug_Lock); #endif - // And never release + // And never SHORTREL Debug_KernelPanic(); @@ -287,14 +295,23 @@ void Debug_SetKTerminal(char *File) void Debug_Enter(char *FuncName, 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); while(i--) Debug_Putchar(' '); - Debug_Puts(1, FuncName); Debug_Puts(1, ": ("); + Debug_Puts(1, FuncName); + Debug_FmtS("[%i]", tid); + Debug_Puts(1, ": ("); while(*ArgTypes) { @@ -326,33 +343,51 @@ 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, ...) { va_list args; int i = gDebug_Level; + tTID tid = Threads_GetTID(); + + #if LOCK_DEBUG_OUTPUT + SHORTLOCK(&glDebug_Lock); + #endif va_start(args, Fmt); 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, ...) { 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); @@ -363,12 +398,17 @@ void Debug_Leave(char *FuncName, char RetType, ...) // 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,6 +428,10 @@ 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) diff --git a/Kernel/lib.c b/Kernel/lib.c index cab15b3c..2ce5c980 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -8,7 +8,7 @@ #define RANDOM_SEED 0xACE55052 #define RANDOM_A 0x00731ADE #define RANDOM_C 12345 -#define RANDOM_SPRUCE 0xf12b02b +#define RANDOM_SPRUCE 0xf12b039 // Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec const short DAYS_BEFORE[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; #define UNIX_TO_2K ((30*365*3600*24) + (7*3600*24)) //Normal years + leap years @@ -66,9 +66,6 @@ EXPORT(CheckMem); EXPORT(ModUtil_LookupString); EXPORT(ModUtil_SetIdent); -// === GLOBALS === -static Uint giRandomState = RANDOM_SEED; - // === CODE === /** * \brief Convert a string into an integer @@ -679,12 +676,27 @@ Sint64 timestamp(int sec, int mins, int hrs, int day, int month, int year) */ Uint rand(void) { - Uint old = giRandomState; + #if 0 + static Uint state = RANDOM_SEED; + Uint old = state; // Get the next state value - giRandomState = (RANDOM_A*giRandomState + RANDOM_C) & 0xFFFFFFFF; + giRandomState = (RANDOM_A*state + RANDOM_C); // Check if it has changed, and if it hasn't, change it - if(giRandomState == old) giRandomState += RANDOM_SPRUCE; - return giRandomState; + if(state == old) state += RANDOM_SPRUCE; + return state; + #else + // http://en.wikipedia.org/wiki/Xorshift + // 2010-10-03 + static Uint32 x = 123456789; + static Uint32 y = 362436069; + static Uint32 z = 521288629; + static Uint32 w = 88675123; + Uint32 t; + + t = x ^ (x << 11); + x = y; y = z; z = w; + return w = w ^ (w >> 19) ^ t ^ (t >> 8); + #endif } /* * diff --git a/Kernel/syscalls.c b/Kernel/syscalls.c index 97459c2b..d286d21d 100644 --- a/Kernel/syscalls.c +++ b/Kernel/syscalls.c @@ -176,7 +176,7 @@ void SyscallHandler(tSyscallRegs *Regs) } LEAVE('s', "Assuming 0"); // Path, **Argv, **Envp - ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3); + ret = Proc_Execve( (char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3 ); break; // -- Load a binary into the current process case SYS_LOADBIN: diff --git a/Kernel/vfs/main.c b/Kernel/vfs/main.c index f072a285..cd9c4518 100644 --- a/Kernel/vfs/main.c +++ b/Kernel/vfs/main.c @@ -72,8 +72,10 @@ char *VFS_GetTruePath(char *Path) tmp = VFS_GetAbsPath(Path); if(tmp == NULL) return NULL; + Log(" VFS_GetTruePath: tmp = '%s'", tmp); node = VFS_ParsePath(tmp, &ret); free(tmp); + Log(" VFS_GetTruePath: node=%p, ret='%s'", node, ret); if(!node) return NULL; if(node->Close) node->Close(node); diff --git a/Kernel/vfs/open.c b/Kernel/vfs/open.c index 3a2622f5..0bca8cac 100644 --- a/Kernel/vfs/open.c +++ b/Kernel/vfs/open.c @@ -2,7 +2,7 @@ * AcessMicro VFS * - Open, Close and ChDir */ -#define DEBUG 0 +#define DEBUG 1 #include #include #include "vfs.h" @@ -391,7 +391,7 @@ tVFS_Node *VFS_ParsePath(const char *Path, char **TruePath) (*TruePath)[retLength] = '/'; strcpy(*TruePath+retLength+1, pathEle); - LOG("*TruePath = '%s'\n", *TruePath); + LOG("*TruePath = '%s'", *TruePath); // - Extend Path retLength += nextSlash + 1; diff --git a/Modules/Filesystems/FAT/fat.c b/Modules/Filesystems/FAT/fat.c index e14fad0b..5d1c7f53 100644 --- a/Modules/Filesystems/FAT/fat.c +++ b/Modules/Filesystems/FAT/fat.c @@ -17,7 +17,7 @@ * \todo Implement changing of the parent directory when a file is written to * \todo Implement file creation / deletion */ -#define DEBUG 0 +#define DEBUG 1 #define VERBOSE 1 #define CACHE_FAT 0 //!< Caches the FAT in memory diff --git a/Usermode/Applications/login_src/main.c b/Usermode/Applications/login_src/main.c index 353c90a3..2bafe3b2 100644 --- a/Usermode/Applications/login_src/main.c +++ b/Usermode/Applications/login_src/main.c @@ -46,6 +46,8 @@ int main(int argc, char *argv[]) return -1; } + printf("pid = %i\n", pid); + // Spawn shell in a child process if(pid == 0) { -- 2.20.1