From: John Hodge Date: Fri, 23 Apr 2010 11:51:08 +0000 (+0800) Subject: Altered debug print function to use vsnprintf and to use Debug_Puts instead of Debug_... X-Git-Tag: rel0.06~224 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=0acc62ad4a27ba63d17b48dd6bf51fde30056d4c;p=tpg%2Facess2.git Altered debug print function to use vsnprintf and to use Debug_Puts instead of Debug_Putchar - Also changed when the VTerm updates the screen, now it updates on newlines and end of input instead on every character, major speed increase. --- diff --git a/Kernel/debug.c b/Kernel/debug.c index ac9d6179..b9e5cdc6 100644 --- a/Kernel/debug.c +++ b/Kernel/debug.c @@ -9,18 +9,28 @@ #define DEBUG_TO_SERIAL 1 #define SERIAL_PORT 0x3F8 #define GDB_SERIAL_PORT 0x2F8 +#define DEBUG_USE_VSNPRINTF 1 +#define DEBUG_MAX_LINE_LEN 256 // === IMPORTS === extern void Threads_Dump(void); extern void KernelPanic_SetMode(void); extern void KernelPanic_PutChar(char Ch); +// === PROTOTYPES === + int putDebugChar(char ch); + int getDebugChar(); +static void Debug_Putchar(char ch); +static void Debug_Puts(char *Str); +void Debug_Fmt(const char *format, va_list args); + // === GLOBALS === int gDebug_Level = 0; int giDebug_KTerm = -1; int gbDebug_SerialSetup = 0; int gbGDB_SerialSetup = 0; int gbDebug_IsKPanic = 0; +volatile int gbInPutChar = 0; // === CODE === int putDebugChar(char ch) @@ -55,8 +65,6 @@ int getDebugChar() return inb(GDB_SERIAL_PORT); } -volatile int gbInPutChar = 0; - static void Debug_Putchar(char ch) { #if DEBUG_TO_E9 @@ -92,11 +100,56 @@ static void Debug_Putchar(char ch) static void Debug_Puts(char *Str) { - while(*Str) Debug_Putchar(*Str++); + int len = 0; + while( *Str ) + { + #if DEBUG_TO_E9 + __asm__ __volatile__ ( "outb %%al, $0xe9" :: "a" ((Uint8)*Str) ); + #endif + + #if DEBUG_TO_SERIAL + if(!gbDebug_SerialSetup) { + outb(SERIAL_PORT + 1, 0x00); // Disable all interrupts + outb(SERIAL_PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) + outb(SERIAL_PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud + outb(SERIAL_PORT + 1, 0x00); // (hi byte) + outb(SERIAL_PORT + 3, 0x03); // 8 bits, no parity, one stop bit + outb(SERIAL_PORT + 2, 0xC7); // Enable FIFO with 14-byte threshold and clear it + outb(SERIAL_PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set + gbDebug_SerialSetup = 1; + } + while( (inb(SERIAL_PORT + 5) & 0x20) == 0 ); + outb(SERIAL_PORT, *Str); + #endif + + if( gbDebug_IsKPanic ) + KernelPanic_PutChar(*Str); + len ++; + Str ++; + } + + Str -= len; + + if( !gbDebug_IsKPanic && giDebug_KTerm != -1) + { + if(gbInPutChar) return ; + gbInPutChar = 1; + VFS_Write(giDebug_KTerm, len, Str); + gbInPutChar = 0; + } } -void Debug_Fmt(const char *format, va_list *args) +void Debug_Fmt(const char *format, va_list args) { + #if DEBUG_USE_VSNPRINTF + char buf[DEBUG_MAX_LINE_LEN]; + int len; + len = vsnprintf(buf, DEBUG_MAX_LINE_LEN-1, format, args); + //if( len < DEBUG_MAX_LINE ) + // do something + Debug_Puts(buf); + return ; + #else char c, pad = ' '; int minSize = 0, len; char tmpBuf[34]; // For Integers @@ -230,6 +283,7 @@ void Debug_Fmt(const char *format, va_list *args) break; } } + #endif } void Debug_KernelPanic() @@ -247,7 +301,7 @@ void LogF(char *Fmt, ...) va_start(args, Fmt); - Debug_Fmt(Fmt, &args); + Debug_Fmt(Fmt, args); va_end(args); } @@ -260,7 +314,7 @@ void Log(char *Fmt, ...) Debug_Puts("Log: "); va_start(args, Fmt); - Debug_Fmt(Fmt, &args); + Debug_Fmt(Fmt, args); va_end(args); Debug_Putchar('\n'); } @@ -269,7 +323,7 @@ void Warning(char *Fmt, ...) va_list args; Debug_Puts("Warning: "); va_start(args, Fmt); - Debug_Fmt(Fmt, &args); + Debug_Fmt(Fmt, args); va_end(args); Debug_Putchar('\n'); } @@ -281,7 +335,7 @@ void Panic(char *Fmt, ...) Debug_Puts("Panic: "); va_start(args, Fmt); - Debug_Fmt(Fmt, &args); + Debug_Fmt(Fmt, args); va_end(args); Debug_Putchar('\n'); @@ -329,15 +383,15 @@ void Debug_Enter(char *FuncName, char *ArgTypes, ...) if(pos != -1) ArgTypes[pos] = ' '; switch(*ArgTypes) { - case 'p': Debug_Fmt("%p", &args); break; - case 's': Debug_Fmt("'%s'", &args); break; - case 'i': Debug_Fmt("%i", &args); break; - case 'u': Debug_Fmt("%u", &args); break; - case 'x': Debug_Fmt("0x%x", &args); break; - case 'b': Debug_Fmt("0b%b", &args); break; + case 'p': Debug_Fmt("%p", args); break; + case 's': Debug_Fmt("'%s'", args); break; + case 'i': Debug_Fmt("%i", args); break; + case 'u': Debug_Fmt("%u", args); break; + case 'x': Debug_Fmt("0x%x", args); break; + case 'b': Debug_Fmt("0b%b", args); break; // Extended (64-Bit) - case 'X': Debug_Fmt("0x%llx", &args); break; - case 'B': Debug_Fmt("0b%llb", &args); break; + case 'X': Debug_Fmt("0x%llx", args); break; + case 'B': Debug_Fmt("0b%llb", args); break; } if(pos != -1) { Debug_Putchar(','); Debug_Putchar(' '); @@ -361,7 +415,7 @@ void Debug_Log(char *FuncName, char *Fmt, ...) while(i--) Debug_Putchar(' '); Debug_Puts(FuncName); Debug_Puts(": "); - Debug_Fmt(Fmt, &args); + Debug_Fmt(Fmt, args); va_end(args); Debug_Putchar('\n'); @@ -393,13 +447,13 @@ void Debug_Leave(char *FuncName, char RetType, ...) switch(RetType) { case 'n': Debug_Puts("NULL"); break; - case 'p': Debug_Fmt("%p", &args); break; - case 's': Debug_Fmt("'%s'", &args); break; - case 'i': Debug_Fmt("%i", &args); break; - case 'u': Debug_Fmt("%u", &args); break; - case 'x': Debug_Fmt("0x%x", &args); break; + case 'p': Debug_Fmt("%p", args); break; + case 's': Debug_Fmt("'%s'", args); break; + case 'i': Debug_Fmt("%i", args); break; + case 'u': Debug_Fmt("%u", args); break; + case 'x': Debug_Fmt("0x%x", args); break; // Extended (64-Bit) - case 'X': Debug_Fmt("0x%llx", &args); break; + case 'X': Debug_Fmt("0x%llx", args); break; } Debug_Putchar('\n'); diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index aa2b8f33..b24f3746 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -488,7 +488,7 @@ void VT_SetTerminal(int ID) gpVT_CurTerm = &gVT_Terminals[ID]; // Update cursor - if( !(gpVT_CurTerm->Flags & VT_FLAG_HIDECSR) ) + if( gpVT_CurTerm->Mode == TERM_MODE_TEXT && !(gpVT_CurTerm->Flags & VT_FLAG_HIDECSR) ) { tVideo_IOCtl_Pos pos; pos.x = gpVT_CurTerm->WritePos % gpVT_CurTerm->Width; @@ -674,41 +674,6 @@ void VT_KBCallBack(Uint32 Codepoint) } } -/** - * \fn void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count) - * \brief Print a string to the Virtual Terminal - */ -void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count) -{ - Uint32 val; - int i; - for( i = 0; i < Count; i++ ) - { - if( Buffer[i] == 0x1B ) // Escape Sequence - { - i ++; - i += VT_int_ParseEscape(Term, (char*)&Buffer[i]); - continue; - } - - if( Buffer[i] < 128 ) // Plain ASCII - VT_int_PutChar(Term, Buffer[i]); - else { // UTF-8 - i += ReadUTF8(&Buffer[i], &val); - VT_int_PutChar(Term, val); - } - } - - // Update cursor - if( Term == gpVT_CurTerm && !(Term->Flags & VT_FLAG_HIDECSR) ) - { - tVideo_IOCtl_Pos pos; - pos.x = Term->WritePos % Term->Width; - pos.y = Term->WritePos / Term->Width; - VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &pos); - } -} - /** * \fn void VT_int_ClearLine(tVTerm *Term, int Num) * \brief Clears a line in a virtual terminal @@ -837,6 +802,43 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer) return j + 1; } +/** + * \fn void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count) + * \brief Print a string to the Virtual Terminal + */ +void VT_int_PutString(tVTerm *Term, Uint8 *Buffer, Uint Count) +{ + Uint32 val; + int i; + for( i = 0; i < Count; i++ ) + { + if( Buffer[i] == 0x1B ) // Escape Sequence + { + i ++; + i += VT_int_ParseEscape(Term, (char*)&Buffer[i]); + continue; + } + + if( Buffer[i] < 128 ) // Plain ASCII + VT_int_PutChar(Term, Buffer[i]); + else { // UTF-8 + i += ReadUTF8(&Buffer[i], &val); + VT_int_PutChar(Term, val); + } + } + // Update Screen + VT_int_UpdateScreen( Term, 0 ); + + // Update cursor + if( Term == gpVT_CurTerm && !(Term->Flags & VT_FLAG_HIDECSR) ) + { + tVideo_IOCtl_Pos pos; + pos.x = Term->WritePos % Term->Width; + pos.y = Term->WritePos / Term->Width; + VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &pos); + } +} + /** * \fn void VT_int_PutChar(tVTerm *Term, Uint32 Ch) * \brief Write a single character to a VTerm @@ -851,6 +853,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) { case '\0': return; // Ignore NULL byte case '\n': + VT_int_UpdateScreen( Term, 0 ); // Update the line before newlining Term->WritePos += Term->Width; case '\r': Term->WritePos -= Term->WritePos % Term->Width; @@ -931,8 +934,6 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) //LOG("Scrolled screen"); VT_int_UpdateScreen( Term, 1 ); } - else - VT_int_UpdateScreen( Term, 0 ); //LEAVE('-'); } diff --git a/Kernel/lib.c b/Kernel/lib.c index cfbae0f0..ac8f6168 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -181,14 +181,14 @@ void itoa(char *buf, Uint num, int base, int minLength, char pad) int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) { char c, pad = ' '; - int minSize = 0; + int minSize = 0, len; char tmpBuf[34]; // For Integers char *p = NULL; int isLongLong = 0; Uint64 val; size_t pos = 0; // Flags - // int bPadLeft = 0; + int bPadLeft = 0; //Log("vsnprintf: (__s=%p, __maxlen=%i, __format='%s', ...)", __s, __maxlen, __format); @@ -214,7 +214,12 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) // Get Argument val = va_arg(args, Uint); - //Log("val = %x", val); + + // - Padding Side Flag + if(c == '+') { + bPadLeft = 1; + c = *__format++; + } // - Padding if(c == '0') { @@ -285,9 +290,11 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) case 's': p = (char*)(Uint)val; printString: - //Log("p = '%s'", p); if(!p) p = "(null)"; + len = strlen(p); + if( !bPadLeft ) while(len++ < minSize) PUTCH(pad); while(*p) PUTCH(*p++); + if( bPadLeft ) while(len++ < minSize) PUTCH(pad); break; case 'C': // Non-Null Terminated Character Array