summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-06-26 20:58:53 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-06-26 20:58:53 -0700
commitec3c438ed7a820fdb66c0ff189a85fd9b976758e (patch)
treef5fe37847c385d0d3c4aa6f9be88bc9a7dc14c9b
parentd9c43f5e02d3f5fed13fc3b798d992ffaf3f6829 (diff)
[PATCH] i386: uninline memmove
Using current gcc CVS I hit a piece of code in which 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 <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/i386/kernel/i386_ksyms.c8
-rw-r--r--arch/i386/lib/memcpy.c29
-rw-r--r--include/asm-i386/string.h19
3 files changed, 29 insertions, 27 deletions
diff --git a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c
index 552996fdea67..064d6fb8a094 100644
--- a/arch/i386/kernel/i386_ksyms.c
+++ b/arch/i386/kernel/i386_ksyms.c
@@ -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
diff --git a/arch/i386/lib/memcpy.c b/arch/i386/lib/memcpy.c
index 4cb37b6e5015..ad16efa52e84 100644
--- a/arch/i386/lib/memcpy.c
+++ b/arch/i386/lib/memcpy.c
@@ -1,10 +1,11 @@
#include <linux/config.h>
#include <linux/string.h>
+#include <linux/module.h>
#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 * from, size_t n)
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 --git a/include/asm-i386/string.h b/include/asm-i386/string.h
index a14f9f37d9c1..34d5a4180bdb 100644
--- a/include/asm-i386/string.h
+++ b/include/asm-i386/string.h
@@ -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<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;
-}
+void *memmove(void * dest,const void * src, size_t n);
#define memcmp __builtin_memcmp