Using current gcc CVS I hit a pieve of code in whcih the compiler was emitting a memmove() call. The kernel link failed. Uninline it. Also, move the memcpy and memset exports into memcpy.c. Signed-off-by: Andrew Morton --- 25-akpm/arch/i386/kernel/i386_ksyms.c | 8 +------- 25-akpm/arch/i386/lib/memcpy.c | 29 +++++++++++++++++++++++++++-- 25-akpm/include/asm-i386/string.h | 19 +------------------ 3 files changed, 29 insertions(+), 27 deletions(-) diff -puN include/asm-i386/string.h~i386-uninline-memmove include/asm-i386/string.h --- 25/include/asm-i386/string.h~i386-uninline-memmove 2004-06-24 04:15:26.295858368 -0700 +++ 25-akpm/include/asm-i386/string.h 2004-06-24 04:15:26.301857456 -0700 @@ -294,24 +294,7 @@ extern void __struct_cpy_bug (void); }) #define __HAVE_ARCH_MEMMOVE -static inline void * memmove(void * dest,const void * src, size_t n) -{ -int d0, d1, d2; -if (dest #include +#include #undef memcpy #undef memset -void * memcpy(void * to, const void * from, size_t n) +void *memcpy(void *to, const void *from, size_t n) { #ifdef CONFIG_X86_USE_3DNOW return __memcpy3d(to, from, n); @@ -12,8 +13,32 @@ void * memcpy(void * to, const void * fr return __memcpy(to, from, n); #endif } +EXPORT_SYMBOL_NOVERS(memcpy); -void * memset(void * s, int c, size_t count) +void *memset(void *s, int c, size_t count) { return __memset(s, c, count); } +EXPORT_SYMBOL_NOVERS(memset); + +void *memmove(void *dest, const void *src, size_t n) +{ + int d0, d1, d2; + + if (dest < src) { + memcpy(dest,src,n); + } else { + __asm__ __volatile__( + "std\n\t" + "rep\n\t" + "movsb\n\t" + "cld" + : "=&c" (d0), "=&S" (d1), "=&D" (d2) + :"0" (n), + "1" (n-1+(const char *)src), + "2" (n-1+(char *)dest) + :"memory"); + } + return dest; +} +EXPORT_SYMBOL_NOVERS(memmove); diff -puN arch/i386/kernel/i386_ksyms.c~i386-uninline-memmove arch/i386/kernel/i386_ksyms.c --- 25/arch/i386/kernel/i386_ksyms.c~i386-uninline-memmove 2004-06-24 04:15:26.298857912 -0700 +++ 25-akpm/arch/i386/kernel/i386_ksyms.c 2004-06-24 04:15:26.302857304 -0700 @@ -172,15 +172,9 @@ EXPORT_SYMBOL(rtc_lock); EXPORT_SYMBOL_GPL(set_nmi_callback); EXPORT_SYMBOL_GPL(unset_nmi_callback); - -#undef memcpy -#undef memset + #undef memcmp -extern void * memset(void *,int,__kernel_size_t); -extern void * memcpy(void *,const void *,__kernel_size_t); extern int memcmp(const void *,const void *,__kernel_size_t); -EXPORT_SYMBOL_NOVERS(memcpy); -EXPORT_SYMBOL_NOVERS(memset); EXPORT_SYMBOL_NOVERS(memcmp); #ifdef CONFIG_HAVE_DEC_LOCK _