3 * - By John Hodge (thePowersGang)
5 * logging.c - Kernel Logging Service
9 #define PRINT_ON_APPEND 1
24 const char *csaLevelColours[] = {
25 "\x1B[35m", "\x1B[34m", "\x1B[36m", "\x1B[31m",
26 "\x1B[33m", "\x1B[32m", "\x1B[0m", "\x1B[0m"
28 const char *csaLevelCodes[] = {"k","p","f","e","w","n","l","d"};
31 typedef struct sLogEntry
33 struct sLogEntry *Next;
34 struct sLogEntry *LevelNext;
41 typedef struct sLogList
48 void Log_AddEvent(char *Ident, int Level, char *Format, va_list Args);
49 static void Log_Int_PrintMessage(tLogEntry *Entry);
50 void Log_KernelPanic(char *Ident, char *Message, ...);
51 void Log_Panic(char *Ident, char *Message, ...);
52 void Log_Error(char *Ident, char *Message, ...);
53 void Log_Warning(char *Ident, char *Message, ...);
54 void Log_Notice(char *Ident, char *Message, ...);
55 void Log_Log(char *Ident, char *Message, ...);
56 void Log_Debug(char *Ident, char *Message, ...);
68 tSpinlock glLogOutput;
70 tLogList gLog_Levels[NUM_LOG_LEVELS];
74 * \brief Adds an event to the log
76 void Log_AddEvent(char *Ident, int Level, char *Format, va_list Args)
82 if( Level >= NUM_LOG_LEVELS ) return;
84 va_copy(args_tmp, Args);
85 len = vsnprintf(NULL, 256, Format, args_tmp);
87 //Log("len = %i", len);
89 ent = malloc(sizeof(tLogEntry)+len+1);
91 strncpy(ent->Ident, Ident, 8);
94 vsnprintf( ent->Data, 256, Format, Args );
96 //Log("ent->Ident = '%s'", ent->Ident);
97 //Log("ent->Data = '%s'", ent->Data);
101 ent->Next = gLog.Tail;
105 gLog.Tail = gLog.Head = ent;
107 ent->LevelNext = gLog_Levels[Level].Tail;
108 if(gLog_Levels[Level].Head)
109 gLog_Levels[Level].Tail = ent;
111 gLog_Levels[Level].Tail = gLog_Levels[Level].Head = ent;
116 Log_Int_PrintMessage( ent );
122 * \brief Prints a log message to the debug console
124 void Log_Int_PrintMessage(tLogEntry *Entry)
126 //LOCK( &glLogOutput );
127 LogF("%s%014lli%s [%+8s] %s\x1B[0m\r\n",
128 csaLevelColours[Entry->Level],
130 csaLevelCodes[Entry->Level],
134 //RELEASE( &glLogOutput );
138 * \brief KERNEL PANIC!!!!
140 void Log_KernelPanic(char *Ident, char *Message, ...)
143 va_start(args, Message);
144 Log_AddEvent(Ident, LOG_LEVEL_KPANIC, Message, args);
149 * \brief Panic Message - Driver Unrecoverable error
151 void Log_Panic(char *Ident, char *Message, ...)
154 va_start(args, Message);
155 Log_AddEvent(Ident, LOG_LEVEL_PANIC, Message, args);
160 * \brief Error Message - Recoverable Error
162 void Log_Error(char *Ident, char *Message, ...)
165 va_start(args, Message);
166 Log_AddEvent(Ident, LOG_LEVEL_ERROR, Message, args);
171 * \brief Warning Message - Something the user should know
173 void Log_Warning(char *Ident, char *Message, ...)
177 va_start(args, Message);
178 Log_AddEvent(Ident, LOG_LEVEL_WARNING, Message, args);
183 * \brief Notice Message - Something the user might like to know
185 void Log_Notice(char *Ident, char *Message, ...)
188 va_start(args, Message);
189 Log_AddEvent(Ident, LOG_LEVEL_NOTICE, Message, args);
194 * \brief Log Message - Possibly useful information
196 void Log_Log(char *Ident, char *Message, ...)
199 va_start(args, Message);
200 Log_AddEvent(Ident, LOG_LEVEL_LOG, Message, args);
205 * \brief Debug Message - Only a developer would want this info
207 void Log_Debug(char *Ident, char *Message, ...)
210 va_start(args, Message);
211 Log_AddEvent(Ident, LOG_LEVEL_DEBUG, Message, args);