]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[libc] Provide an unoptimised generic_memcpy_reverse()
authorMichael Brown <mcb30@ipxe.org>
Tue, 7 Jul 2020 12:13:28 +0000 (13:13 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 7 Jul 2020 12:13:28 +0000 (13:13 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/string.c
src/include/string.h

index 5bd9dae8b41279f4935757a7e18e0210ca314c5f..c35015b595206ac1815a4871ad92182cb2403241 100644 (file)
@@ -52,7 +52,7 @@ void * generic_memset ( void *dest, int character, size_t len ) {
 }
 
 /**
- * Copy memory region
+ * Copy memory region (forwards)
  *
  * @v dest             Destination region
  * @v src              Source region
@@ -69,24 +69,39 @@ void * generic_memcpy ( void *dest, const void *src, size_t len ) {
 }
 
 /**
- * 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
  *
index 0f41820017602caa21e7dacd7a08eda50ba00b1a..5f5aecb92a8bf8f4e59d3aacb954c0c947e8223c 100644 (file)
@@ -15,6 +15,8 @@ extern void * generic_memset ( void *dest, int character,
                               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;