2 * AcessOS Microkernel Version
9 #define E9(ch) __asm__ __volatile__ ("outb %%al, $0xe9"::"a"(((Uint8)ch)))
12 extern void Proc_DumpThreads();
18 static void E9_Str(char *Str)
20 while(*Str) E9(*Str++);
23 void E9_Fmt(const char *format, va_list *args)
27 char tmpBuf[34]; // For Integers
32 while((c = *format++) != 0)
34 // Non control character
50 Uint ptr = va_arg(*args, Uint);
51 E9('*'); E9('0'); E9('x');
53 itoa(p, ptr, 16, BITS/4, '0');
58 arg = va_arg(*args, Uint);
69 if('1' <= c && c <= '9')
72 while('0' <= c && c <= '9')
86 arg |= va_arg(*args, Uint);
97 if( (isLongLong && arg >> 63) || (!isLongLong && arg >> 31) ) {
101 itoa(p, arg, 10, minSize, pad);
104 itoa(p, arg, 10, minSize, pad);
107 itoa(p, arg, 16, minSize, pad);
110 itoa(p, arg, 8, minSize, pad);
113 itoa(p, arg, 2, minSize, pad);
117 if(arg) E9_Str("True");
118 else E9_Str("False");
122 p = (char*)(Uint)arg;
128 default: E9(arg); break;
134 * \fn void LogV(char *Fmt, va_list Args)
136 void LogV(char *Fmt, va_list Args)
143 * \fn void LogF(char *Msg, ...)
145 void LogF(char *Fmt, ...)
156 * \fn void Log(char *Msg, ...)
158 void Log(char *Fmt, ...)
168 void Warning(char *Fmt, ...)
177 void Panic(char *Fmt, ...)
188 __asm__ __volatile__ ("xchg %bx, %bx");
189 __asm__ __volatile__ ("cli;\n\thlt");
190 for(;;) __asm__ __volatile__ ("hlt");
193 void Debug_Enter(char *FuncName, char *ArgTypes, ...)
196 int i = gDebug_Level ++;
199 va_start(args, ArgTypes);
203 E9_Str(FuncName); E9_Str(": (");
207 pos = strpos(ArgTypes, ' ');
208 if(pos != -1) ArgTypes[pos] = '\0';
209 if(pos == -1 || pos > 1) {
213 if(pos != -1) ArgTypes[pos] = ' ';
216 case 'p': E9_Fmt("%p", &args); break;
217 case 's': E9_Fmt("'%s'", &args); break;
218 case 'i': E9_Fmt("%i", &args); break;
219 case 'u': E9_Fmt("%u", &args); break;
220 case 'x': E9_Fmt("0x%x", &args); break;
221 case 'b': E9_Fmt("0b%b", &args); break;
223 case 'X': E9_Fmt("0x%llx", &args); break;
224 case 'B': E9_Fmt("0b%llb", &args); break;
231 ArgTypes = &ArgTypes[pos+1];
238 void Debug_Log(char *FuncName, char *Fmt, ...)
241 int i = gDebug_Level;
247 E9_Str(FuncName); E9_Str(": ");
254 void Debug_Leave(char *FuncName, char RetType, ...)
257 int i = --gDebug_Level;
259 va_start(args, RetType);
264 E9_Str(FuncName); E9_Str(": RETURN");
275 case 'n': E9_Str("NULL"); break;
276 case 'p': E9_Fmt("%p", &args); break;
277 case 's': E9_Fmt("'%s'", &args); break;
278 case 'i': E9_Fmt("%i", &args); break;
279 case 'u': E9_Fmt("%u", &args); break;
280 case 'x': E9_Fmt("0x%x", &args); break;
282 case 'X': E9_Fmt("0x%llx", &args); break;
289 void Debug_HexDump(char *Header, void *Data, Uint Length)
294 LogF(" (Hexdump of %p)\n", Data);
298 Log("%04x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
300 cdat[0], cdat[1], cdat[2], cdat[3], cdat[4], cdat[5], cdat[6], cdat[7],
301 cdat[8], cdat[9], cdat[10], cdat[11], cdat[12], cdat[13], cdat[14], cdat[15]
308 LogF("Log: %04x: ", pos);