EXPORT(UnHex);
EXPORT(SwapEndian16);
EXPORT(SwapEndian32);
+EXPORT(memmove);
// === CODE ===
/**
{
char tmpBuf[64+1];
int pos=0, i;
+ Uint64 rem;
// Sanity check
if(!buf) return;
// Convert
while(num > base-1) {
- tmpBuf[pos] = cUCDIGITS[ num % base ];
- num /= (Uint)base; // Shift `num` right 1 digit
+ num = DivMod64U(num, base, &rem); // Shift `num` and get remainder
+ tmpBuf[pos] = cUCDIGITS[ rem ];
pos++;
}
- tmpBuf[pos++] = cUCDIGITS[ num % base ]; // Last digit of `num`
+ tmpBuf[pos++] = cUCDIGITS[ num ]; // Last digit of `num`
// Put in reverse
i = 0;
// 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);
/**
* \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 ) )
{
/**
* \brief Convert a string of hexadecimal digits into a byte stream
*/
-int UnHex(Uint8 *Dest, size_t DestSize, const char *SourceString)
+int UnHex(Uint8 *Dest, size_t DestSize, const char *SourceString)
{
int i;
{
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( (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;
+
+}
+