VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / arch / i386 / lib / memcpy.c
index 4cb37b6..ad16efa 100644 (file)
@@ -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);