[U-Boot] [PATCH v2 01/17] x86: Import glibc memcpy implementation

Simon Glass sjg at chromium.org
Thu Jan 12 05:44:52 CET 2012


Hi,

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ at gmail.com> wrote:
> Taken from glibc version 2.14.90
>
> Signed-off-by: Graeme Russ <graeme.russ at gmail.com>
> ---
> Changes for v2:
>  - None

It feels a bit odd acking x86 patches but I have been through these
and much of the series is generally useful for other archs...

Acked-by: Simon Glass <sjg at chromium.org>

>
>  arch/x86/include/asm/string.h |    2 +-
>  arch/x86/lib/string.c         |   61 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 62 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/include/asm/string.h b/arch/x86/include/asm/string.h
> index 3aa6c11..0ad612f 100644
> --- a/arch/x86/include/asm/string.h
> +++ b/arch/x86/include/asm/string.h
> @@ -14,7 +14,7 @@ extern char * strrchr(const char * s, int c);
>  #undef __HAVE_ARCH_STRCHR
>  extern char * strchr(const char * s, int c);
>
> -#undef __HAVE_ARCH_MEMCPY
> +#define __HAVE_ARCH_MEMCPY
>  extern void * memcpy(void *, const void *, __kernel_size_t);
>
>  #undef __HAVE_ARCH_MEMMOVE
> diff --git a/arch/x86/lib/string.c b/arch/x86/lib/string.c
> index f2ea7e4..1fde81b 100644
> --- a/arch/x86/lib/string.c
> +++ b/arch/x86/lib/string.c
> @@ -85,3 +85,64 @@ void *memset(void *dstpp, int c, size_t len)
>
>        return dstpp;
>  }
> +
> +#define        OP_T_THRES      8
> +#define OPSIZ  (sizeof(op_t))
> +
> +#define BYTE_COPY_FWD(dst_bp, src_bp, nbytes)                            \
> +do {                                                                     \
> +       int __d0;                                                         \
> +       asm volatile(                                                     \
> +               /* Clear the direction flag, so copying goes forward.  */ \
> +               "cld\n"                                                   \
> +               /* Copy bytes.  */                                        \
> +               "rep\n"                                                   \
> +               "movsb" :                                                 \
> +               "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) :               \
> +               "0" (dst_bp), "1" (src_bp), "2" (nbytes) :                \
> +               "memory");                                                \
> +} while (0)
> +
> +#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes)               \
> +do {                                                                     \
> +       int __d0;                                                         \
> +       asm volatile(                                                     \
> +               /* Clear the direction flag, so copying goes forward.  */ \
> +               "cld\n"                                                   \
> +               /* Copy longwords.  */                                    \
> +               "rep\n"                                                   \
> +               "movsl" :                                                 \
> +               "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) :               \
> +               "0" (dst_bp), "1" (src_bp), "2" ((nbytes) / 4) :          \
> +               "memory");                                                \
> +       (nbytes_left) = (nbytes) % 4;                                     \
> +} while (0)
> +
> +void *memcpy(void *dstpp, const void *srcpp, size_t len)
> +{
> +       unsigned long int dstp = (long int)dstpp;
> +       unsigned long int srcp = (long int)srcpp;
> +
> +       /* Copy from the beginning to the end.  */
> +
> +       /* If there not too few bytes to copy, use word copy.  */
> +       if (len >= OP_T_THRES) {
> +               /* Copy just a few bytes to make DSTP aligned.  */
> +               len -= (-dstp) % OPSIZ;
> +               BYTE_COPY_FWD(dstp, srcp, (-dstp) % OPSIZ);
> +
> +               /* Copy from SRCP to DSTP taking advantage of the known
> +                * alignment of DSTP.  Number of bytes remaining is put
> +                * in the third argument, i.e. in LEN.  This number may
> +                * vary from machine to machine.
> +                */
> +               WORD_COPY_FWD(dstp, srcp, len, len);
> +
> +               /* Fall out and copy the tail.  */
> +       }
> +
> +       /* There are just a few bytes to copy. Use byte memory operations. */
> +       BYTE_COPY_FWD(dstp, srcp, len);
> +
> +       return dstpp;
> +}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot


More information about the U-Boot mailing list