summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetar Jovanovic <petar.jovanovic@rt-rk.com>2019-06-28 15:41:37 +0000
committerWaldemar Brodkorb <wbx@openadk.org>2019-07-05 14:48:35 +0200
commite94e6f4bd91c92c7e1cc21d82ed9320dd722add2 (patch)
treeee1fc8f9c673e0018433a336fab2682020056a25
parent028d28e6a9654c9addfc4fe1af9b6dd9bd464680 (diff)
mips: avoid calling memcpy() from memmove() for MIPS arch
This is a follow up to an incorrect fix for memmove() problem in: commit 785dee78552f9ad06819bf7eb1adc05b43110842 Author: Petar Jovanovic <petar.jovanovic@rt-rk.com> Date: Mon May 6 13:29:02 2019 +0000 mips: fix memmove() call when __ARCH_HAS_BWD_MEMCPY__ is not defined Calling memcpy from memmove should be skipped in two cases: a) if arch's memcpy uses a backward copying (e.g. SH4) b) if arch's memcpy is not fully safe for overlapping regions (MIPS) Signed-off-by: Petar Jovanovic <petar.jovanovic@rt-rk.com>
-rw-r--r--libc/string/generic/memmove.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/libc/string/generic/memmove.c b/libc/string/generic/memmove.c
index 1ac018013..5389cc029 100644
--- a/libc/string/generic/memmove.c
+++ b/libc/string/generic/memmove.c
@@ -23,8 +23,9 @@
#include "memcopy.h"
#include "pagecopy.h"
-#ifndef __ARCH_HAS_BWD_MEMCPY__
+#if defined(__ARCH_HAS_BWD_MEMCPY__) || defined(__mips__)
/* generic-opt memmove assumes memcpy does forward copying! */
+/* also needed for MIPS as its memcpy does not support overlapping regions */
#include "_memcpy_fwd.c"
#endif
@@ -224,8 +225,11 @@ void *memmove (void *dest, const void *src, size_t len)
Reduces the working set. */
if (dstp - srcp >= len) /* *Unsigned* compare! */
{
-#ifdef __ARCH_HAS_BWD_MEMCPY__
- /* Backward memcpy implementation can be used */
+ /* Calling memcpy() from memmove() should be skipped in two cases:
+ * a) if arch's memcpy uses a backward copying (SH4)
+ * b) if arch's memcpy is not fully safe for overlapping regions (MIPS)
+ */
+#if !defined(__ARCH_HAS_BWD_MEMCPY_) && !defined(__mips__)
memcpy(dest, src, len);
#else
/* Copy from the beginning to the end. */