[string] Use 64-bit registers in assembly memswap() on x86_64
authorJoshua Oreman <oremanj@rwcr.net>
Fri, 30 Jul 2010 16:52:03 +0000 (09:52 -0700)
committerJoshua Oreman <oremanj@rwcr.net>
Fri, 30 Jul 2010 17:16:33 +0000 (10:16 -0700)
An assembly version of memswap() is in an x86 word-length-agnostic
header file, but it used 32-bit registers to store pointers, leading
to memory errors responding to ARP queries on 64-bit systems.

Signed-off-by: Joshua Oreman <oremanj@rwcr.net>
src/arch/x86/include/bits/string.h

index a68868a..f35cdab 100644 (file)
@@ -198,12 +198,12 @@ return s;
 #define __HAVE_ARCH_MEMSWAP
 static inline void * memswap(void *dest, void *src, size_t n)
 {
 #define __HAVE_ARCH_MEMSWAP
 static inline void * memswap(void *dest, void *src, size_t n)
 {
-int d0, d1, d2, d3;
+long d0, d1, d2, d3;
 __asm__ __volatile__(
        "\n1:\t"
 __asm__ __volatile__(
        "\n1:\t"
-       "movb (%%edi),%%al\n\t"
-       "xchgb (%%esi),%%al\n\t"
-       "incl %%esi\n\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)
        "stosb\n\t"
        "loop 1b"
        : "=&c" (d0), "=&S" (d1), "=&D" (d2), "=&a" (d3)