diff options
author | Michael Brown <mcb30@ipxe.org> | 2020-07-07 13:13:28 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2020-07-07 13:13:28 +0100 |
commit | 2f032c84a2cbed37308da8b29e84efb6eb2fe9e5 (patch) | |
tree | 904d3ed95d67b6a58cf90ebc5e87118be45552a1 | |
parent | d2fb317fee9635008b8298add7d6f1d5534cec59 (diff) | |
download | ipxe-2f032c84a2cbed37308da8b29e84efb6eb2fe9e5.zip ipxe-2f032c84a2cbed37308da8b29e84efb6eb2fe9e5.tar.gz ipxe-2f032c84a2cbed37308da8b29e84efb6eb2fe9e5.tar.bz2 |
[libc] Provide an unoptimised generic_memcpy_reverse()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/core/string.c | 25 | ||||
-rw-r--r-- | src/include/string.h | 2 |
2 files changed, 22 insertions, 5 deletions
diff --git a/src/core/string.c b/src/core/string.c index 5bd9dae..c35015b 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 @@ -69,25 +69,40 @@ 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 * * @v first First region diff --git a/src/include/string.h b/src/include/string.h index 0f41820..5f5aecb 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; |