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@amd.com>
Acked-by: Stefan Reinauer <stepan@coresystems.de>



git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3519 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Jordan Crouse 2008-08-19 16:55:05 +00:00 committed by Stefan Reinauer
parent 0740cdaac9
commit 96f57aee0a
1 changed files with 17 additions and 35 deletions

View File

@ -43,59 +43,41 @@ void *memset(void *s, int c, size_t n)
return s; 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) void *memcpy(void *dst, const void *src, size_t n)
{ {
int i, j; int i;
if (((long)dst & (sizeof(long) - 1)) for(i = 0; i < n % sizeof(unsigned long); i++)
|| ((long)src & (sizeof(long) - 1))) ((unsigned char *) dst)[i] = ((unsigned char *) src)[i];
return unaligned_memcpy(dst, src, n);
for (i = 0; i < n / sizeof(unsigned long); i++) n -= i;
((unsigned long *)dst)[i] = ((unsigned long *)src)[i]; src += i;
dst += i;
for (j = 0; j < n % sizeof(unsigned long); j++) for(i = 0; i < n / sizeof(unsigned long); i++)
((unsigned char *)(((unsigned long *)dst) + i))[j] = ((unsigned long *) dst)[i] = ((unsigned long *) src)[i];
((unsigned char *)(((unsigned long *)src) + i))[j];
return (char *)src; return dst;
} }
void *memmove(void *dst, const void *src, size_t n) void *memmove(void *dst, const void *src, size_t n)
{ {
int i, j; int i;
unsigned long offs;
if (src > dst) if (src > dst)
return memcpy(dst, src, n); return memcpy(dst, src, n);
for (j = (n % sizeof(unsigned long)) - 1; j >= 0; j--) offs = n - (n % sizeof(unsigned long));
((unsigned char *)((unsigned long *)dst))[j] =
((unsigned char *)((unsigned long *)src))[j]; 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--) for (i = n / sizeof(unsigned long) - 1; i >= 0; i--)
((unsigned long *)dst)[i] = ((unsigned long *)src)[i]; ((unsigned long *)dst)[i] = ((unsigned long *)src)[i];
return (char *)src; return dst;
} }
/** /**