Add constants for fast path resume copying
[coreboot.git] / payloads / libpayload / libc / memory.c
index 41fa76e343abaae748917d1ad1b9c727fd2351b5..4757b10596ed2f5c524d3c040401b604c934aded 100644 (file)
@@ -43,73 +43,55 @@ void *memset(void *s, int c, size_t n)
        return s;
 }
 
-struct along {
-       unsigned long n;
-} __attribute__ ((packed));
-
-static void *unaligned_memcpy(void *dst, const void *src, size_t n)
-{
-       int i, j;
-       struct along *adst = dst;
-       const struct along *asrc = src;
-
-       for (i = 0; i < n / sizeof(unsigned long); i++)
-               adst[i].n = asrc[i].n;
-
-       for (j = 0; j < n % sizeof(unsigned long); j++)
-               ((unsigned char *)(((unsigned long *)dst) + i))[j] =
-                   ((unsigned char *)(((unsigned long *)src) + i))[j];
-
-       return (char *)src;
-}
-
 void *memcpy(void *dst, const void *src, size_t n)
 {
-       int i, j;
+       int i;
+       void *ret = dst;
 
-       if (((long)dst & (sizeof(long) - 1))
-           || ((long)src & (sizeof(long) - 1)))
-               return unaligned_memcpy(dst, src, n);
+       for(i = 0; i < n % sizeof(unsigned long); i++)
+               ((unsigned char *) dst)[i] = ((unsigned char *) src)[i];
 
-       for (i = 0; i < n / sizeof(unsigned long); i++)
-               ((unsigned long *)dst)[i] = ((unsigned long *)src)[i];
+       n -= i;
+       src += i;
+       dst += i;
 
-       for (j = 0; j < n % sizeof(unsigned long); j++)
-               ((unsigned char *)(((unsigned long *)dst) + i))[j] =
-                   ((unsigned char *)(((unsigned long *)src) + i))[j];
+       for(i = 0; i < n / sizeof(unsigned long); i++)
+               ((unsigned long *) dst)[i] = ((unsigned long *) src)[i];
 
-       return (char *)src;
+       return ret;
 }
 
 void *memmove(void *dst, const void *src, size_t n)
 {
-       int i, j;
+       int i;
+       unsigned long offs;
 
        if (src > dst)
                return memcpy(dst, src, n);
 
-       for (j = (n % sizeof(unsigned long)) - 1; j >= 0; j--)
-               ((unsigned char *)((unsigned long *)dst))[j] =
-                   ((unsigned char *)((unsigned long *)src))[j];
+       offs = n - (n % sizeof(unsigned long));
+
+       for (i = (n % sizeof(unsigned long)) - 1; i >= 0; i--)
+               ((unsigned char *)dst)[i + offs] =
+                       ((unsigned char *)src)[i + offs];
 
        for (i = n / sizeof(unsigned long) - 1; i >= 0; i--)
                ((unsigned long *)dst)[i] = ((unsigned long *)src)[i];
 
-       return (char *)src;
+       return dst;
 }
 
 /**
  * Compare two memory areas.
  *
- * @param s1   Pointer to the first area to compare.
- * @param s2   Pointer to the second area to compare.
- * @param len  Size of the first area in bytes. Both areas must have the same
- *             length.
- * @return     If len is 0, return zero. If the areas match, return zero.
- *             Otherwise return non-zero.
+ * @param s1 Pointer to the first area to compare.
+ * @param s2 Pointer to the second area to compare.
+ * @param len Size of the first area in bytes (both must have the same length).
+ * @return If len is 0, return zero. If the areas match, return zero.
+ *         Otherwise return non-zero.
  */
-int memcmp(const char *s1, const char *s2, size_t len)
+int memcmp(const void *s1, const void *s2, size_t len)
 {
-       for (; len && *s1++ == *s2++; len--) ;
+       for (; len && *(char *)s1++ == *(char *)s2++; len--) ;
        return len;
 }