|
@@ -31,16 +31,12 @@
|
|
|
#include <linux/string.h>
|
|
|
|
|
|
#ifdef __HAVE_ARCH_MEMMOVE
|
|
|
+#ifndef CONFIG_OPT_LIB_FUNCTION
|
|
|
void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
|
|
|
{
|
|
|
const char *src = v_src;
|
|
|
char *dst = v_dst;
|
|
|
|
|
|
-#ifdef CONFIG_OPT_LIB_FUNCTION
|
|
|
- const uint32_t *i_src;
|
|
|
- uint32_t *i_dst;
|
|
|
-#endif
|
|
|
-
|
|
|
if (!c)
|
|
|
return v_dst;
|
|
|
|
|
@@ -48,7 +44,6 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
|
|
|
if (v_dst <= v_src)
|
|
|
return memcpy(v_dst, v_src, c);
|
|
|
|
|
|
-#ifndef CONFIG_OPT_LIB_FUNCTION
|
|
|
/* copy backwards, from end to beginning */
|
|
|
src += c;
|
|
|
dst += c;
|
|
@@ -58,7 +53,22 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
|
|
|
*--dst = *--src;
|
|
|
|
|
|
return v_dst;
|
|
|
-#else
|
|
|
+}
|
|
|
+#else /* CONFIG_OPT_LIB_FUNCTION */
|
|
|
+void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
|
|
|
+{
|
|
|
+ const char *src = v_src;
|
|
|
+ char *dst = v_dst;
|
|
|
+ const uint32_t *i_src;
|
|
|
+ uint32_t *i_dst;
|
|
|
+
|
|
|
+ if (!c)
|
|
|
+ return v_dst;
|
|
|
+
|
|
|
+ /* Use memcpy when source is higher than dest */
|
|
|
+ if (v_dst <= v_src)
|
|
|
+ return memcpy(v_dst, v_src, c);
|
|
|
+
|
|
|
/* The following code tries to optimize the copy by using unsigned
|
|
|
* alignment. This will work fine if both source and destination are
|
|
|
* aligned on the same boundary. However, if they are aligned on
|
|
@@ -169,7 +179,7 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
|
|
|
*--dst = *--src;
|
|
|
}
|
|
|
return v_dst;
|
|
|
-#endif
|
|
|
}
|
|
|
+#endif /* CONFIG_OPT_LIB_FUNCTION */
|
|
|
EXPORT_SYMBOL(memmove);
|
|
|
#endif /* __HAVE_ARCH_MEMMOVE */
|