[coreboot] r3519 - trunk/payloads/libpayload/libc

svn at coreboot.org svn at coreboot.org
Tue Aug 19 18:55:06 CEST 2008


Author: stepan
Date: 2008-08-19 18:55:05 +0200 (Tue, 19 Aug 2008)
New Revision: 3519

Modified:
   trunk/payloads/libpayload/libc/memory.c
Log:
libpayload:  Fix the memcpy functions 

There was a bit of confusion in the memcpy functions - we could simplify
things slightly without having to revert to 8 bit copies on a 32 bit
system.

Signed-off-by: Jordan Crouse <jordan.crouse at amd.com>
Acked-by: Stefan Reinauer <stepan at coresystems.de>



Modified: trunk/payloads/libpayload/libc/memory.c
===================================================================
--- trunk/payloads/libpayload/libc/memory.c	2008-08-19 16:53:47 UTC (rev 3518)
+++ trunk/payloads/libpayload/libc/memory.c	2008-08-19 16:55:05 UTC (rev 3519)
@@ -43,59 +43,41 @@
 	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;
 
-	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 dst;
 }
 
 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;
 }
 
 /**





More information about the coreboot mailing list