From 2f032c84a2cbed37308da8b29e84efb6eb2fe9e5 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 7 Jul 2020 13:13:28 +0100 Subject: [PATCH] [libc] Provide an unoptimised generic_memcpy_reverse() Signed-off-by: Michael Brown --- src/core/string.c | 29 ++++++++++++++++++++++------- src/include/string.h | 2 ++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/core/string.c b/src/core/string.c index 5bd9dae8b..c35015b59 100644 --- a/src/core/string.c +++ b/src/core/string.c @@ -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 @@ -68,6 +68,23 @@ void * generic_memcpy ( void *dest, const void *src, size_t len ) { return dest; } +/** + * Copy memory region (backwards) + * + * @v dest Destination region + * @v src Source region + * @v len Length + * @ret dest Destination region + */ +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 ); + + while ( len-- ) + *(--dest_bytes) = *(--src_bytes); + return dest; +} + /** * Copy (possibly overlapping) memory region * @@ -77,14 +94,12 @@ void * generic_memcpy ( void *dest, const void *src, size_t len ) { * @ret dest Destination region */ void * generic_memmove ( void *dest, const void *src, size_t len ) { - const uint8_t *src_bytes = ( src + len ); - uint8_t *dest_bytes = ( dest + len ); - if ( dest < src ) + if ( dest < src ) { return generic_memcpy ( dest, src, len ); - while ( len-- ) - *(--dest_bytes) = *(--src_bytes); - return dest; + } else { + return generic_memcpy_reverse ( dest, src, len ); + } } /** diff --git a/src/include/string.h b/src/include/string.h index 0f4182001..5f5aecb92 100644 --- a/src/include/string.h +++ b/src/include/string.h @@ -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;