[coreboot] r3519 - trunk/payloads/libpayload/libc
Ulf Jordan
jordan at chalmers.se
Tue Aug 19 20:36:45 CEST 2008
On Tue, 19 Aug 2008, svn at coreboot.org wrote:
[snip]
> 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;
> }
Does this really return the correct value?
When I read the Linux memcpy(3) man page and the GNU C library reference
manual I get the impression that the return value should be the original
value of dst. This implementation returns a value which is original dst+0,
1, 2, or 3, depending on n % sizeof(unsigned long).
/ulf
More information about the coreboot
mailing list