Browse Source

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>
Petar Jovanovic 4 years ago
parent
commit
e94e6f4bd9
1 changed files with 7 additions and 3 deletions
  1. 7 3
      libc/string/generic/memmove.c

+ 7 - 3
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.  */