Altered debug print function to use vsnprintf and to use Debug_Puts instead of Debug_...
authorJohn Hodge <[email protected]>
Fri, 23 Apr 2010 11:51:08 +0000 (19:51 +0800)
committerJohn Hodge <[email protected]>
Fri, 23 Apr 2010 11:51:08 +0000 (19:51 +0800)
- Also changed when the VTerm updates the screen, now it updates on newlines and end of input
  instead on every character, major speed increase.

Kernel/debug.c
Kernel/drv/vterm.c
Kernel/lib.c

index ac9d617..b9e5cdc 100644 (file)
@@ -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');
 
index aa2b8f3..b24f374 100644 (file)
@@ -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('-');
 }
index cfbae0f..ac8f616 100644 (file)
@@ -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

UCC git Repository :: git.ucc.asn.au