mirror of https://github.com/ipxe/ipxe.git
[libc] Fix and externalise memswap()
Make memswap() behave correctly if called with a length of zero. Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/598/head
parent
de20c526e6
commit
53f3deee06
|
@ -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
|
* Calculate length of string
|
||||||
*
|
*
|
||||||
|
|
|
@ -213,21 +213,8 @@ static inline void * memset ( void *dest, int fill, size_t len ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __HAVE_ARCH_MEMSWAP
|
#define __HAVE_ARCH_MEMSWAP
|
||||||
static inline void * memswap(void *dest, void *src, size_t n)
|
|
||||||
{
|
extern void * memswap ( void *dest, void *src, size_t len );
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRNCMP
|
#define __HAVE_ARCH_STRNCMP
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue