Usermode - Removed unused (and fat) pcidump utility
[tpg/acess2.git] / Kernel / lib.c
index 28edc56..73b6432 100644 (file)
@@ -81,6 +81,7 @@ EXPORT(ModUtil_SetIdent);
 EXPORT(UnHex);
 EXPORT(SwapEndian16);
 EXPORT(SwapEndian32);
+EXPORT(memmove);
 
 // === CODE ===
 /**
@@ -356,7 +357,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                // String - Null Terminated Array
                case 's':
                        p = va_arg(args, char*);        // Get Argument
-                       if( !CheckString(p) )   p = "(inval)";  // Avoid #PFs  
+                       if( !p || !CheckString(p) )     p = "(inval)";  // Avoid #PFs  
                printString:
                        if(!p)          p = "(null)";
                        len = strlen(p);
@@ -853,10 +854,14 @@ int CheckString(const char *String)
 
 /**
  * \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_GetPhysAddr( addr ) )
+               return 0;
        
        if( MM_IsUser( addr ) )
        {
@@ -948,3 +953,42 @@ Uint32 SwapEndian32(Uint32 Val)
 {
        return ((Val&0xFF)<<24) | ((Val&0xFF00)<<8) | ((Val>>8)&0xFF00) | ((Val>>24)&0xFF);
 }
+
+void *memmove(void *__dest, const void *__src, size_t len)
+{
+       size_t  block_size;
+       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
+               block_size = (tVAddr)dest - (tVAddr)src;
+       
+       block_size &= ~0xF;
+       
+       while(len >= block_size)
+       {
+               memcpy(dest, src, block_size);
+               len -= block_size;
+               dest += block_size;
+               src += block_size;
+       }
+       memcpy(dest, src, len);
+       return ret;
+       
+}
+

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