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:
parent
0740cdaac9
commit
96f57aee0a
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue