Index: boot/generic/include/memstr.h
===================================================================
--- boot/generic/include/memstr.h	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
+++ boot/generic/include/memstr.h	(revision b31f735ca8a1895378cba596d256af1d0ba4cd6b)
@@ -36,4 +36,5 @@
 
 extern void *memcpy(void *, const void *, size_t);
+extern void *memmove(void *, const void *, size_t);
 
 #endif
Index: boot/generic/src/memstr.c
===================================================================
--- boot/generic/src/memstr.c	(revision 3df290792b980ae2873195fbf00acafa0d94b3dc)
+++ boot/generic/src/memstr.c	(revision b31f735ca8a1895378cba596d256af1d0ba4cd6b)
@@ -51,4 +51,49 @@
 }
 
+/** Move memory block with possible overlapping.
+ *
+ * Copy cnt bytes from src address to dst address. The source
+ * and destination memory areas may overlap.
+ *
+ * @param dst Destination address to copy to.
+ * @param src Source address to copy from.
+ * @param cnt Number of bytes to copy.
+ *
+ * @return Destination address.
+ *
+ */
+void *memmove(void *dst, const void *src, size_t cnt)
+{
+	/* Nothing to do? */
+	if (src == dst)
+		return dst;
+	
+	/* Non-overlapping? */
+	if ((dst >= src + cnt) || (src >= dst + cnt))
+		return memcpy(dst, src, cnt);
+	
+	uint8_t *dp;
+	const uint8_t *sp;
+	
+	/* Which direction? */
+	if (src > dst) {
+		/* Forwards. */
+		dp = dst;
+		sp = src;
+		
+		while (cnt-- != 0)
+			*dp++ = *sp++;
+	} else {
+		/* Backwards. */
+		dp = dst + (cnt - 1);
+		sp = src + (cnt - 1);
+		
+		while (cnt-- != 0)
+			*dp-- = *sp--;
+	}
+	
+	return dst;
+}
+
 /** @}
  */
