From 53f3deee06366dacd38974af7beb89aa7ce6c45e Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 5 Nov 2012 00:58:20 +0000 Subject: [PATCH] [libc] Fix and externalise memswap() Make memswap() behave correctly if called with a length of zero. Signed-off-by: Michael Brown --- src/arch/x86/core/x86_string.c | 28 ++++++++++++++++++++++++++++ src/arch/x86/include/bits/string.h | 17 ++--------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/arch/x86/core/x86_string.c b/src/arch/x86/core/x86_string.c index 69c73f70..d48347c9 100644 --- a/src/arch/x86/core/x86_string.c +++ b/src/arch/x86/core/x86_string.c @@ -105,6 +105,34 @@ void * __memmove ( void *dest, const void *src, size_t len ) { } } +/** + * Swap memory areas + * + * @v dest Destination address + * @v src Source address + * @v len Length + * @ret dest Destination address + */ +void * memswap ( void *dest, void *src, size_t len ) { + size_t discard_c; + int discard; + + __asm__ __volatile__ ( "\n1:\n\t" + "dec %2\n\t" + "js 2f\n\t" + "movb (%0,%2), %b3\n\t" + "xchgb (%1,%2), %b3\n\t" + "movb %b3, (%0,%2)\n\t" + "jmp 1b\n\t" + "2:\n\t" + : "=r" ( src ), "=r" ( dest ), + "=&c" ( discard_c ), "=&q" ( discard ) + : "0" ( src ), "1" ( dest ), "2" ( len ) + : "memory" ); + + return dest; +} + /** * Calculate length of string * diff --git a/src/arch/x86/include/bits/string.h b/src/arch/x86/include/bits/string.h index 249dd543..4d44c722 100644 --- a/src/arch/x86/include/bits/string.h +++ b/src/arch/x86/include/bits/string.h @@ -213,21 +213,8 @@ static inline void * memset ( void *dest, int fill, size_t len ) { } #define __HAVE_ARCH_MEMSWAP -static inline void * memswap(void *dest, void *src, size_t n) -{ -long d0, d1, d2, d3; -__asm__ __volatile__( - "\n1:\t" - "movb (%2),%%al\n\t" - "xchgb (%1),%%al\n\t" - "inc %1\n\t" - "stosb\n\t" - "loop 1b" - : "=&c" (d0), "=&S" (d1), "=&D" (d2), "=&a" (d3) - : "0" (n), "1" (src), "2" (dest) - : "memory" ); -return dest; -} + +extern void * memswap ( void *dest, void *src, size_t len ); #define __HAVE_ARCH_STRNCMP