Fixing Tegra2 build
[tpg/acess2.git] / Kernel / lib.c
index 472351c..953264b 100644 (file)
@@ -3,6 +3,7 @@
  * Common Library Functions
  */
 #include <acess.h>
+#include <hal_proc.h>
 
 // === CONSTANTS ===
 #define        RANDOM_SEED     0xACE55052
@@ -190,11 +191,7 @@ void itoa(char *buf, Uint64 num, int base, int minLength, char pad)
 /**
  * \brief Append a character the the vsnprintf output
  */
-#define PUTCH(c)       do{\
-       char ch=(c);\
-       if(pos==__maxlen){return pos;}\
-       if(__s){__s[pos++]=ch;}else{pos++;}\
-       }while(0)
+#define PUTCH(c)       _putch(c)
 #define GETVAL()       do {\
        if(isLongLong)  val = va_arg(args, Uint64);\
        else    val = va_arg(args, unsigned int);\
@@ -213,16 +210,23 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
        size_t  pos = 0;
        // Flags
         int    bPadLeft = 0;
-       
-       //Log("vsnprintf: (__s=%p, __maxlen=%i, __format='%s', ...)", __s, __maxlen, __format);
-       
+
+       inline void _putch(char ch)
+       {
+               if(pos < __maxlen)
+               {
+                       if(__s) __s[pos] = ch;
+                       pos ++;
+               }
+       }
+
        while((c = *__format++) != 0)
        {
                // Non control character
                if(c != '%') { PUTCH(c); continue; }
-               
+
                c = *__format++;
-               //Log("pos = %i", pos);
+               if(c == '\0')   break;
                
                // Literal %
                if(c == '%') { PUTCH('%'); continue; }
@@ -231,9 +235,9 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                if(c == 'p') {
                        Uint    ptr = va_arg(args, Uint);
                        PUTCH('*');     PUTCH('0');     PUTCH('x');
-                       itoa(tmpBuf, ptr, 16, BITS/4, '0');
-                       p = tmpBuf;
-                       goto printString;
+                       for( len = BITS/4; len --; )
+                               PUTCH( cUCDIGITS[ (ptr>>(len*4))&15 ] );
+                       continue ;
                }
                
                // - Padding Side Flag
@@ -489,11 +493,11 @@ char *strcpy(char *__str1, const char *__str2)
  * \brief Copy a string to a new location
  * \note Copies at most `max` chars
  */
-char *strncpy(char *__str1, const char *__str2, size_t max)
+char *strncpy(char *__str1, const char *__str2, size_t __max)
 {
-       while(*__str2 && max-- >= 1)
+       while(*__str2 && __max-- >= 1)
                *__str1++ = *__str2++;
-       if(max)
+       if(__max)
                *__str1 = '\0'; // Terminate String
        return __str1;
 }
@@ -719,37 +723,39 @@ int WriteUTF8(Uint8 *str, Uint32 Val)
 {
        // ASCII
        if( Val < 128 ) {
-               *str = Val;
+               if( str ) {
+                       *str = Val;
+               }
                return 1;
        }
        
        // Two Byte
        if( Val < 0x8000 ) {
-               *str = 0xC0 | (Val >> 6);
-               str ++;
-               *str = 0x80 | (Val & 0x3F);
+               if( str ) {
+                       *str++ = 0xC0 | (Val >> 6);
+                       *str++ = 0x80 | (Val & 0x3F);
+               }
                return 2;
        }
        
        // Three Byte
        if( Val < 0x10000 ) {
-               *str = 0xE0 | (Val >> 12);
-               str ++;
-               *str = 0x80 | ((Val >> 6) & 0x3F);
-               str ++;
-               *str = 0x80 | (Val & 0x3F);
+               if( str ) {
+                       *str++ = 0xE0 | (Val >> 12);
+                       *str++ = 0x80 | ((Val >> 6) & 0x3F);
+                       *str++ = 0x80 | (Val & 0x3F);
+               }
                return 3;
        }
        
        // Four Byte
        if( Val < 0x110000 ) {
-               *str = 0xF0 | (Val >> 18);
-               str ++;
-               *str = 0x80 | ((Val >> 12) & 0x3F);
-               str ++;
-               *str = 0x80 | ((Val >> 6) & 0x3F);
-               str ++;
-               *str = 0x80 | (Val & 0x3F);
+               if( str ) {
+                       *str++ = 0xF0 | (Val >> 18);
+                       *str++ = 0x80 | ((Val >> 12) & 0x3F);
+                       *str++ = 0x80 | ((Val >> 6) & 0x3F);
+                       *str++ = 0x80 | (Val & 0x3F);
+               }
                return 4;
        }
        
@@ -821,65 +827,38 @@ int rand(void)
  */
 int CheckString(const char *String)
 {
-       if( !MM_GetPhysAddr( (tVAddr)String ) )
+       tVAddr  addr;
+        int    bUser;
+
+       addr = (tVAddr)String;
+
+       if( !MM_GetPhysAddr( addr ) )
                return 0;
        
        // Check 1st page
-       if( MM_IsUser( (tVAddr)String ) )
+       bUser = MM_IsUser( addr );
+       
+       while( *(char*)addr )
        {
-               // Traverse String
-               while( *String )
+               if( (addr & (PAGE_SIZE-1)) == 0 )
                {
-                       if( !MM_IsUser( (tVAddr)String ) )
+                       if(bUser && !MM_IsUser(addr) )
                                return 0;
-                       // Increment string pointer
-                       String ++;
-               }
-               return 1;
-       }
-       else if( MM_GetPhysAddr( (tVAddr)String ) )
-       {
-               // Traverse String
-               while( *String )
-               {
-                       if( !MM_GetPhysAddr( (tVAddr)String ) )
+                       if(!bUser && !MM_GetPhysAddr(addr) )
                                return 0;
-                       // Increment string pointer
-                       String ++;
                }
-               return 1;
+               addr ++;
        }
-       return 0;
+       return 1;
 }
 
 /**
  * \brief Check if a sized memory region is valid memory
+ * \return Boolean success
  */
 int CheckMem(const void *Mem, int NumBytes)
 {
-       tVAddr  addr = (tVAddr)Mem;
-       
-       if( MM_IsUser( addr ) )
-       {
-               while( NumBytes-- )
-               {
-                       if( !MM_IsUser( addr ) )
-                               return 0;
-                       addr ++;
-               }
-               return 1;
-       }
-       else if( MM_GetPhysAddr( addr ) )
-       {
-               while( NumBytes-- )
-               {
-                       if( !MM_GetPhysAddr( addr ) )
-                               return 0;
-                       addr ++;
-               }
-               return 1;
-       }
-       return 0;
+       return MM_IsValidBuffer( (tVAddr)Mem, NumBytes );
 }
 /* *
  * \}
@@ -956,12 +935,19 @@ void *memmove(void *__dest, const void *__src, size_t len)
        char    *dest = __dest;
        const char      *src = __src;
        void    *ret = __dest;
+
+       if( len == 0 || dest == src )
+               return dest;
        
        if( (tVAddr)dest > (tVAddr)src + len )
                return memcpy(dest, src, len);
        if( (tVAddr)dest + len < (tVAddr)src )
                return memcpy(dest, src, len);
        
+       // NOTE: Assumes memcpy works forward
+       if( (tVAddr)dest < (tVAddr)src )
+               return memcpy(dest, src, len);
+
        if( (tVAddr)dest < (tVAddr)src )
                block_size = (tVAddr)src - (tVAddr)dest;
        else

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