}
/**
- * Copy memory region
+ * Copy memory region (forwards)
*
* @v dest Destination region
* @v src Source region
}
/**
- * Copy (possibly overlapping) memory region
+ * Copy memory region (backwards)
*
* @v dest Destination region
* @v src Source region
* @v len Length
* @ret dest Destination region
*/
-void * generic_memmove ( void *dest, const void *src, size_t len ) {
+void * generic_memcpy_reverse ( void *dest, const void *src, size_t len ) {
const uint8_t *src_bytes = ( src + len );
uint8_t *dest_bytes = ( dest + len );
- if ( dest < src )
- return generic_memcpy ( dest, src, len );
while ( len-- )
*(--dest_bytes) = *(--src_bytes);
return dest;
}
+/**
+ * Copy (possibly overlapping) memory region
+ *
+ * @v dest Destination region
+ * @v src Source region
+ * @v len Length
+ * @ret dest Destination region
+ */
+void * generic_memmove ( void *dest, const void *src, size_t len ) {
+
+ if ( dest < src ) {
+ return generic_memcpy ( dest, src, len );
+ } else {
+ return generic_memcpy_reverse ( dest, src, len );
+ }
+}
+
/**
* Compare memory regions
*
size_t len ) __nonnull;
extern void * generic_memcpy ( void *dest, const void *src,
size_t len ) __nonnull;
+extern void * generic_memcpy_reverse ( void *dest, const void *src,
+ size_t len ) __nonnull;
extern void * generic_memmove ( void *dest, const void *src,
size_t len ) __nonnull;