Kernel - Fixed double-lock caused by workqueue
[tpg/acess2.git] / Kernel / lib.c
index 4d65108..2b786ec 100644 (file)
@@ -3,6 +3,7 @@
  * Common Library Functions
  */
 #include <acess.h>
+#include <hal_proc.h>
 
 // === CONSTANTS ===
 #define        RANDOM_SEED     0xACE55052
@@ -489,11 +490,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 +720,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,35 +824,29 @@ 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;
 }
 
 /**
@@ -858,32 +855,7 @@ int CheckString(const char *String)
  */
 int CheckMem(const void *Mem, int NumBytes)
 {
-       tVAddr  addr = (tVAddr)Mem;
-
-       if( !MM_GetPhysAddr( addr ) )
-               return 0;
-       
-       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 );
 }
 /* *
  * \}
@@ -960,12 +932,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