[CRIU] [PATCH 1/2] Unify own memcpy/memset/memcmp

Dmitry Safonov dsafonov at virtuozzo.com
Tue Jan 31 03:44:32 PST 2017


On 01/31/2017 10:53 AM, Kir Kolyshkin wrote:
> Currently, we have a few implementations of memcpy/memset/memcmp
> functions:
>
>  1. Ones that comes from a standard library (glibc/musl/whatever).
>  2. Own implementation used by criu/pie/, named builtin_mem*
>  3. (Optional) arch-optimized versions of above
>     (memcpy for x86, memcpy and memcmp for power).
>  4. Own implementation provided/used by compel plugins, named std_*
>
> There are two reasons why 3-5 exist:
>  a) code which is not linked to a libc (i.e. parasite/restorer and
>     also compel plugins).
>  b) C compiler, which might generate calls to memcpy, memset, memcmp,
>     memmove calls as it seem fit (so far we haven't seen memmove
>     being used by either gcc or clang on any arch supported)
>
> So, having own mem* functions is required. What's messed up is
> how many implementations and different names for those we have.
>
> This commit is an attempt to untie the knot described.
>
> A few implementation considerations:
>
> First, let's stick to just one implementation, and have it in compel
> std plugin.
>
> Second, let's use the code from criu as it comes with arch-optimized
> versions. Surely this means the patch is bigger.
>
> Third, let's call the functions memcpy/memset/memcmp (i.e. no std_ or
> builtin_ prefix, no aliases). There are many reasons to do so:
>  - this is required by the compiler (see "b" above);
>  - we are not using libc in this code anyway, so no names conflict;
>  - with current setup (function builtin_memset() with memset() as
>    an alias), compiler (clang) optimized our function by calling
>    memset() from it, which resulted in an infinite recursion, see
>    https://github.com/xemul/criu/issues/279
>
> In the meantime, keep the std_ prefix for other functions
> in compel std plugin as unlike mem*() there are no implicit calls
> to those.
>
> Notes:
>
>  - FORTIFY_SOURCE had to be disabled for compel/plugins as in Ubuntu
>    Trusty x86_64 it plays tricks with standard includes, replacing
>    calls to memcpy() with __memcpy_chk().
>
>  - builtin_strncmp() had to be moved to compel std plugin as
>    criu/include/asm-generic/string.h is gone. Currently the only user
>    is util-vdso.c
>
>  - this is a long patch, and I'm not sure it can be split effectively
>    without breaking git bisect.
>
> [v2: rebase to criu-dev, better changelog, link to github issue]

Looks good to me, there are a few nits, but they are sooo minor,
so I don't mind if it goes as-is,
Reviewed-by: Dmitry Safonov <dsafonov at virtuozzo.com>

>
> Signed-off-by: Kir Kolyshkin <kir at openvz.org>
> ---
>  compel/arch/aarch64/plugins/include/builtins.h     |  4 ++
>  compel/arch/arm/plugins/include/builtins.h         |  4 ++
>  compel/arch/ppc64/plugins/include/builtins.h       |  7 ++

I would prefer the header name to be something more general, that could
be reused with a new code like "plugins/include/string.h", as I don't
expect the header with the name "builtins.h" could grow any bigger than
now.

>  .../arch/ppc64/plugins/std/memcmp.S                |  2 +-
>  .../arch/ppc64/plugins/std/memcpy.S                |  1 -
>  compel/arch/x86/plugins/include/builtins.h         |  6 ++
>  .../x86 => compel/arch/x86/plugins/std}/memcpy.S   |  2 -
>  compel/plugins/Makefile                            | 12 +++-
>  compel/plugins/include/uapi/std/string.h           |  7 +-
>  compel/plugins/std/fds.c                           |  1 -
>  compel/plugins/std/log.c                           |  6 +-
>  compel/plugins/std/string.c                        | 57 +++++++++++++--
>  compel/src/lib/infect.c                            |  1 -
>  criu/arch/aarch64/include/asm/string.h             |  7 --
>  criu/arch/aarch64/restorer.c                       |  1 -
>  criu/arch/aarch64/vdso-pie.c                       |  1 -
>  criu/arch/arm/include/asm/string.h                 |  7 --
>  criu/arch/arm/restorer.c                           |  1 -
>  criu/arch/ppc64/include/asm/string.h               | 28 --------
>  criu/arch/ppc64/vdso-pie.c                         |  4 +-
>  criu/arch/x86/include/asm/parasite.h               |  6 +-
>  criu/arch/x86/include/asm/string.h                 | 21 ------
>  criu/arch/x86/restorer.c                           |  4 +-
>  criu/arch/x86/sigaction_compat.c                   |  4 +-
>  criu/arch/x86/vdso-pie.c                           |  4 +-
>  criu/include/asm-generic/string.h                  | 82 ----------------------
>  criu/include/string.h                              |  2 -
>  criu/pie/Makefile.library                          |  5 +-
>  criu/pie/restorer.c                                |  3 +-
>  criu/pie/util-vdso.c                               | 14 ++--
>  include/common/scm-code.c                          |  8 +--
>  31 files changed, 117 insertions(+), 195 deletions(-)
>  create mode 100644 compel/arch/aarch64/plugins/include/builtins.h
>  create mode 100644 compel/arch/arm/plugins/include/builtins.h
>  create mode 100644 compel/arch/ppc64/plugins/include/builtins.h
>  rename criu/arch/ppc64/memcmp_64.S => compel/arch/ppc64/plugins/std/memcmp.S (99%)
>  rename criu/arch/ppc64/memcpy_power7.S => compel/arch/ppc64/plugins/std/memcpy.S (99%)
>  create mode 100644 compel/arch/x86/plugins/include/builtins.h
>  rename {criu/arch/x86 => compel/arch/x86/plugins/std}/memcpy.S (93%)
>  delete mode 100644 criu/arch/aarch64/include/asm/string.h
>  delete mode 100644 criu/arch/arm/include/asm/string.h
>  delete mode 100644 criu/arch/ppc64/include/asm/string.h
>  delete mode 100644 criu/arch/x86/include/asm/string.h
>  delete mode 100644 criu/include/asm-generic/string.h
>
> diff --git a/compel/arch/aarch64/plugins/include/builtins.h b/compel/arch/aarch64/plugins/include/builtins.h
> new file mode 100644
> index 0000000..cff8c0a
> --- /dev/null
> +++ b/compel/arch/aarch64/plugins/include/builtins.h
> @@ -0,0 +1,4 @@
> +#ifndef __COMPEL_BUILTINS_H
> +#define __COMPEL_BUILTINS_H
> +
> +#endif /* __COMPEL_BUILTINS_H */
> diff --git a/compel/arch/arm/plugins/include/builtins.h b/compel/arch/arm/plugins/include/builtins.h
> new file mode 100644
> index 0000000..cff8c0a
> --- /dev/null
> +++ b/compel/arch/arm/plugins/include/builtins.h
> @@ -0,0 +1,4 @@
> +#ifndef __COMPEL_BUILTINS_H
> +#define __COMPEL_BUILTINS_H
> +
> +#endif /* __COMPEL_BUILTINS_H */
> diff --git a/compel/arch/ppc64/plugins/include/builtins.h b/compel/arch/ppc64/plugins/include/builtins.h
> new file mode 100644
> index 0000000..2170f98
> --- /dev/null
> +++ b/compel/arch/ppc64/plugins/include/builtins.h
> @@ -0,0 +1,7 @@
> +#ifndef __COMPEL_BUILTINS_H
> +#define __COMPEL_BUILTINS_H
> +
> +#define ARCH_HAS_MEMCPY
> +#define ARCH_HAS_MEMCMP
> +
> +#endif /* __COMPEL_BUILTINS_H */
> diff --git a/criu/arch/ppc64/memcmp_64.S b/compel/arch/ppc64/plugins/std/memcmp.S
> similarity index 99%
> rename from criu/arch/ppc64/memcmp_64.S
> rename to compel/arch/ppc64/plugins/std/memcmp.S
> index fd1bfb9..7f7fe91 100644
> --- a/criu/arch/ppc64/memcmp_64.S
> +++ b/compel/arch/ppc64/plugins/std/memcmp.S
> @@ -31,7 +31,7 @@
>  #define LD	ldx
>  #endif
>
> -ENTRY(builtin_memcmp)
> +ENTRY(memcmp)
>  	cmpdi	cr1,r5,0
>
>  	/* Use the short loop if both strings are not 8B aligned */
> diff --git a/criu/arch/ppc64/memcpy_power7.S b/compel/arch/ppc64/plugins/std/memcpy.S
> similarity index 99%
> rename from criu/arch/ppc64/memcpy_power7.S
> rename to compel/arch/ppc64/plugins/std/memcpy.S
> index e665723..e1afb7e 100644
> --- a/criu/arch/ppc64/memcpy_power7.S
> +++ b/compel/arch/ppc64/plugins/std/memcpy.S
> @@ -28,7 +28,6 @@
>   * service memcpy to initialise big local variable in the stack.
>   */
>  ENTRY(memcpy)
> -ENTRY(memcpy_power7)
>  	cmpldi	r5,16
>  	std	r3,-STACKFRAMESIZE+STK_REG(R31)(r1)
>  	blt	.Lshort_copy
> diff --git a/compel/arch/x86/plugins/include/builtins.h b/compel/arch/x86/plugins/include/builtins.h
> new file mode 100644
> index 0000000..e2b211a
> --- /dev/null
> +++ b/compel/arch/x86/plugins/include/builtins.h
> @@ -0,0 +1,6 @@
> +#ifndef __COMPEL_BUILTINS_H
> +#define __COMPEL_BUILTINS_H
> +
> +#define ARCH_HAS_MEMCPY
> +
> +#endif /* __COMPEL_BUILTINS_H */
> diff --git a/criu/arch/x86/memcpy.S b/compel/arch/x86/plugins/std/memcpy.S
> similarity index 93%
> rename from criu/arch/x86/memcpy.S
> rename to compel/arch/x86/plugins/std/memcpy.S
> index c8f7555..2496cb9 100644
> --- a/criu/arch/x86/memcpy.S
> +++ b/compel/arch/x86/plugins/std/memcpy.S
> @@ -16,7 +16,6 @@
>   * Output:
>   * rax original destination
>   */
> -ENTRY(memcpy_x86)
>  ENTRY(memcpy)
>  	movq %rdi, %rax
>  	movq %rdx, %rcx
> @@ -27,4 +26,3 @@ ENTRY(memcpy)
>  	rep movsb
>  	ret
>  END(memcpy)
> -END(memcpy_x86)
> diff --git a/compel/plugins/Makefile b/compel/plugins/Makefile
> index 5873240..d31fcf0 100644
> --- a/compel/plugins/Makefile
> +++ b/compel/plugins/Makefile
> @@ -1,6 +1,7 @@
>  .PHONY: .FORCE
>
> -CFLAGS			:= $(filter-out -pg $(CFLAGS-GCOV),$(CFLAGS)) -DCR_NOGLIBC
> +CFLAGS			:= $(filter-out -pg $(CFLAGS-GCOV),$(CFLAGS))
> +CFLAGS			+= -DCR_NOGLIBC -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
>  PLUGIN_ARCH_DIR		:= compel/arch/$(ARCH)/plugins
>
>  #
> @@ -47,6 +48,15 @@ std-obj-y		+= std/string.o
>  std-obj-y		+= std/infect.o
>  std-obj-y		+= ./$(PLUGIN_ARCH_DIR)/std/parasite-head.o
>
> +ifeq ($(SRCARCH),x86)
> +	std-obj-y	+= ./$(PLUGIN_ARCH_DIR)/std/memcpy.o
> +endif
> +
> +ifeq ($(SRCARCH),ppc64)
> +	std-obj-y	+= ./$(PLUGIN_ARCH_DIR)/std/memcpy.o
> +	std-obj-y	+= ./$(PLUGIN_ARCH_DIR)/std/memcmp.o
> +endif
> +
>  include ./$(PLUGIN_ARCH_DIR)/std/syscalls/Makefile.syscalls
>
>  define syscall-priority
> diff --git a/compel/plugins/include/uapi/std/string.h b/compel/plugins/include/uapi/std/string.h
> index 8aec886..ddc1ea3 100644
> --- a/compel/plugins/include/uapi/std/string.h
> +++ b/compel/plugins/include/uapi/std/string.h
> @@ -21,8 +21,11 @@ extern void __std_printf(int fd, const char *format, ...);
>  #define std_putchar(c)		__std_putc(STDOUT_FILENO, c)
>
>  extern unsigned long std_strtoul(const char *nptr, char **endptr, int base);
> -extern void *std_memcpy(void *to, const void *from, unsigned int n);
> -extern int std_memcmp(const void *cs, const void *ct, size_t count);
>  extern int std_strcmp(const char *cs, const char *ct);
> +extern int std_strncmp(const char *cs, const char *ct, size_t n);
> +
> +extern void *memcpy(void *dest, const void *src, size_t n);
> +extern int memcmp(const void *s1, const void *s2, size_t n);
> +extern void *memset(void *s, int c, size_t n);
>
>  #endif /* COMPEL_PLUGIN_STD_STRING_H__ */
> diff --git a/compel/plugins/std/fds.c b/compel/plugins/std/fds.c
> index 8cfe6d2..aa83682 100644
> --- a/compel/plugins/std/fds.c
> +++ b/compel/plugins/std/fds.c
> @@ -15,6 +15,5 @@
>  #include "common/bug.h"
>
>  #define __sys(foo)	sys_##foo
> -#define __memcpy	std_memcpy
>
>  #include "common/scm-code.c"
> diff --git a/compel/plugins/std/log.c b/compel/plugins/std/log.c
> index dbdbf58..52a3f1a 100644
> --- a/compel/plugins/std/log.c
> +++ b/compel/plugins/std/log.c
> @@ -61,14 +61,14 @@ static void sbuf_log_init(struct simple_buf *b)
>  		n = std_vprint_num(pbuf, sizeof(pbuf), (unsigned)now.tv_sec, &s);
>  		pad_num(&s, &n, 2);
>  		b->bp[0] = '(';
> -		std_memcpy(b->bp + 1, s, n);
> +		memcpy(b->bp + 1, s, n);
>  		b->bp[n + 1] = '.';
>  		b->bp += n + 2;
>
>  		/* Mu-seconds */
>  		n = std_vprint_num(pbuf, sizeof(pbuf), (unsigned)now.tv_usec, &s);
>  		pad_num(&s, &n, 6);
> -		std_memcpy(b->bp, s, n);
> +		memcpy(b->bp, s, n);

nice!

>  		b->bp[n] = ')';
>  		b->bp += n + 1;
>  	}
> @@ -79,7 +79,7 @@ static void sbuf_log_init(struct simple_buf *b)
>  	b->bp[2] = 'e';
>  	b->bp[3] = ':';
>  	b->bp[4] = ' ';
> -	std_memcpy(b->bp + 5, s, n);
> +	memcpy(b->bp + 5, s, n);
>  	b->bp[n + 5] = ':';
>  	b->bp[n + 6] = ' ';
>  	b->bp += n + 7;
> diff --git a/compel/plugins/std/string.c b/compel/plugins/std/string.c
> index e987e40..87e3fed 100644
> --- a/compel/plugins/std/string.c
> +++ b/compel/plugins/std/string.c
> @@ -5,6 +5,8 @@
>  #include "uapi/std/syscall.h"
>  #include "uapi/std/string.h"
>
> +#include "builtins.h"
> +
>  static const char conv_tab[] = "0123456789abcdefghijklmnopqrstuvwxyz";
>
>  void __std_putc(int fd, char c)
> @@ -220,17 +222,33 @@ fin:
>  	return neg ? (unsigned long)-num : (unsigned long)num;
>  }
>
> -void *std_memcpy(void *to, const void *from, unsigned int n)
> +
> +/* C compiler may generate calls to memcmp, memset, memcpy and memmove,
> + * so it relies on those to be available during linking.
> + * As the compel plugin code is not linked with libc,

We could specify "As the parasite code is not linked with libc"

> + * we must provide our own implementations of mem*() functions.
> + * Surely, these functions may also be used explicitly.
> + *
> + * For now, not having memmove() seems OK for both gcc and clang.
> + */

/*
  * Not a kernel-styled comment, heh
  */

> +
> +#ifndef ARCH_HAS_MEMCPY
> +void *memcpy(void *to, const void *from, size_t n)
>  {
> -	char *tmp = to;
> -	const char *s = from;
> +	size_t i;
> +	unsigned char *cto = to;
> +	const unsigned char *cfrom = from;
> +
> +	for (i = 0; i < n; ++i, ++cto, ++cfrom) {
> +		*cto = *cfrom;
> +	}

Excessive braces {}

>
> -	while (n--)
> -		*tmp++ = *s++;
>  	return to;
>  }
> +#endif
>
> -int std_memcmp(const void *cs, const void *ct, size_t count)
> +#ifndef ARCH_HAS_MEMCMP
> +int memcmp(const void *cs, const void *ct, size_t count)
>  {
>  	const unsigned char *su1, *su2;
>  	int res = 0;
> @@ -240,6 +258,20 @@ int std_memcmp(const void *cs, const void *ct, size_t count)
>  			break;
>  	return res;
>  }
> +#endif
> +
> +#ifndef ARCH_HAS_MEMSET
> +void *memset(void *s, const int c, size_t count)
> +{
> +	volatile char *dest = s;
> +	size_t i = 0;
> +
> +	while (i < count)
> +		dest[i++] = (char) c;
> +
> +	return s;
> +}
> +#endif
>
>  int std_strcmp(const char *cs, const char *ct)
>  {
> @@ -255,3 +287,16 @@ int std_strcmp(const char *cs, const char *ct)
>  	}
>  	return 0;
>  }
> +
> +int std_strncmp(const char *cs, const char *ct, size_t count)
> +{
> +	size_t i;
> +
> +	for (i = 0; i < count; i++) {
> +		if (cs[i] != ct[i])
> +			return cs[i] < ct[i] ? -1 : 1;
> +		if (!cs[i])
> +			break;
> +	}
> +	return 0;
> +}
> diff --git a/compel/src/lib/infect.c b/compel/src/lib/infect.c
> index 599c372..3aa4905 100644
> --- a/compel/src/lib/infect.c
> +++ b/compel/src/lib/infect.c
> @@ -30,7 +30,6 @@
>  #include "infect-util.h"
>
>  #define __sys(foo)	foo
> -#define __memcpy	memcpy
>
>  #include "common/scm.h"
>  #include "common/scm-code.c"
> diff --git a/criu/arch/aarch64/include/asm/string.h b/criu/arch/aarch64/include/asm/string.h
> deleted file mode 100644
> index 020a8ec..0000000
> --- a/criu/arch/aarch64/include/asm/string.h
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#ifndef __CR_ASM_STRING_H__
> -#define __CR_ASM_STRING_H__
> -
> -#include "common/compiler.h"
> -#include "asm-generic/string.h"
> -
> -#endif /* __CR_ASM_STRING_H__ */
> diff --git a/criu/arch/aarch64/restorer.c b/criu/arch/aarch64/restorer.c
> index d9fbead..ce9c1b4 100644
> --- a/criu/arch/aarch64/restorer.c
> +++ b/criu/arch/aarch64/restorer.c
> @@ -2,7 +2,6 @@
>
>  #include "restorer.h"
>  #include "asm/restorer.h"
> -#include "asm/string.h"
>
>  #include <compel/plugins/std/syscall.h>
>  #include "log.h"
> diff --git a/criu/arch/aarch64/vdso-pie.c b/criu/arch/aarch64/vdso-pie.c
> index e2dd253..55de8cb 100644
> --- a/criu/arch/aarch64/vdso-pie.c
> +++ b/criu/arch/aarch64/vdso-pie.c
> @@ -1,6 +1,5 @@
>  #include <unistd.h>
>
> -#include "asm/string.h"
>  #include "asm/types.h"
>
>  #include <compel/plugins/std/syscall.h>
> diff --git a/criu/arch/arm/include/asm/string.h b/criu/arch/arm/include/asm/string.h
> deleted file mode 100644
> index 020a8ec..0000000
> --- a/criu/arch/arm/include/asm/string.h
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#ifndef __CR_ASM_STRING_H__
> -#define __CR_ASM_STRING_H__
> -
> -#include "common/compiler.h"
> -#include "asm-generic/string.h"
> -
> -#endif /* __CR_ASM_STRING_H__ */
> diff --git a/criu/arch/arm/restorer.c b/criu/arch/arm/restorer.c
> index 73fa307..21234b9 100644
> --- a/criu/arch/arm/restorer.c
> +++ b/criu/arch/arm/restorer.c
> @@ -2,7 +2,6 @@
>
>  #include "restorer.h"
>  #include "asm/restorer.h"
> -#include "asm/string.h"
>
>  #include <compel/plugins/std/syscall.h>
>  #include "log.h"
> diff --git a/criu/arch/ppc64/include/asm/string.h b/criu/arch/ppc64/include/asm/string.h
> deleted file mode 100644
> index 93eb428..0000000
> --- a/criu/arch/ppc64/include/asm/string.h
> +++ /dev/null
> @@ -1,28 +0,0 @@
> -#ifndef __CR_ASM_STRING_H__
> -#define __CR_ASM_STRING_H__
> -
> -#include "common/compiler.h"
> -
> -#define HAS_BUILTIN_MEMCPY
> -#define HAS_BUILTIN_MEMCMP
> -
> -#include "asm-generic/string.h"
> -
> -#ifdef CR_NOGLIBC
> -extern void memcpy_power7(void *to, const void *from, unsigned long n);
> -static inline void *builtin_memcpy(void *to, const void *from, unsigned long n)
> -{
> -	if (n)
> -		memcpy_power7(to, from, n);
> -	return to;
> -}
> -extern int builtin_memcmp(const void *cs, const void *ct, size_t count);
> -#else
> -/*
> - * When building with the C library, call its services
> - */
> -#define builtin_memcpy memcpy
> -#define builtin_memcmp memcmp
> -#endif
> -
> -#endif /* __CR_ASM_STRING_H__ */
> diff --git a/criu/arch/ppc64/vdso-pie.c b/criu/arch/ppc64/vdso-pie.c
> index 33f3dbd..f13ea4a 100644
> --- a/criu/arch/ppc64/vdso-pie.c
> +++ b/criu/arch/ppc64/vdso-pie.c
> @@ -1,8 +1,8 @@
>  #include <unistd.h>
>
> -#include "asm/string.h"
>  #include "asm/types.h"
>
> +#include <compel/plugins/std/string.h>
>  #include <compel/plugins/std/syscall.h>
>  #include "parasite-vdso.h"
>  #include "log.h"
> @@ -104,7 +104,7 @@ static unsigned long put_trampoline(unsigned long at, struct vdso_symtable *sym)
>
>  			pr_debug("Putting vDSO trampoline in %s at %lx\n",
>  				 sym->symbols[i].name, trampoline);
> -			builtin_memcpy((void *)trampoline, &vdso_trampoline,
> +			memcpy((void *)trampoline, &vdso_trampoline,
>  				       size);
>  			invalidate_caches(trampoline);
>  		}
> diff --git a/criu/arch/x86/include/asm/parasite.h b/criu/arch/x86/include/asm/parasite.h
> index 7b259d7..68fad09 100644
> --- a/criu/arch/x86/include/asm/parasite.h
> +++ b/criu/arch/x86/include/asm/parasite.h
> @@ -1,7 +1,7 @@
>  #ifndef __ASM_PARASITE_H__
>  #define __ASM_PARASITE_H__
>
> -#include "asm-generic/string.h"
> +#include <compel/plugins/std/string.h>
>  #include <compel/plugins/std/syscall-codes.h>
>  #include "asm/compat.h"
>
> @@ -68,11 +68,11 @@ static void arch_get_tls(tls_t *ptls)
>  	{
>  		user_desc_t *d = syscall_mem;
>
> -		builtin_memset(d, 0, sizeof(user_desc_t));
> +		memset(d, 0, sizeof(user_desc_t));
>  		d->seg_not_present = 1;
>  		d->entry_number = GDT_ENTRY_TLS_MIN + i;
>  		arch_get_user_desc(d);
> -		builtin_memcpy(&ptls->desc[i], d, sizeof(user_desc_t));
> +		memcpy(&ptls->desc[i], d, sizeof(user_desc_t));
>  	}
>
>  	free_compat_syscall_stack(syscall_mem);
> diff --git a/criu/arch/x86/include/asm/string.h b/criu/arch/x86/include/asm/string.h
> deleted file mode 100644
> index 415bf5c..0000000
> --- a/criu/arch/x86/include/asm/string.h
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -#ifndef __CR_ASM_STRING_H__
> -#define __CR_ASM_STRING_H__
> -
> -#define HAS_BUILTIN_MEMCPY
> -
> -#include "common/compiler.h"
> -#include "asm-generic/string.h"
> -
> -#ifdef CR_NOGLIBC
> -extern void *memcpy_x86(void *to, const void *from, size_t n);
> -static inline void *builtin_memcpy(void *to, const void *from, size_t n)
> -{
> -	if (n)
> -		memcpy_x86(to, from, n);
> -	return to;
> -}
> -#else
> -#define builtin_memcpy memcpy
> -#endif /* CR_NOGLIBC */
> -
> -#endif /* __CR_ASM_STRING_H__ */
> diff --git a/criu/arch/x86/restorer.c b/criu/arch/x86/restorer.c
> index 4510704..a4ddee5 100644
> --- a/criu/arch/x86/restorer.c
> +++ b/criu/arch/x86/restorer.c
> @@ -5,8 +5,8 @@
>  #include "restorer.h"
>  #include "asm/restorer.h"
>  #include <compel/asm/fpu.h>
> -#include "asm/string.h"
>
> +#include <compel/plugins/std/string.h>
>  #include <compel/plugins/std/syscall.h>
>  #include "log.h"
>  #include "cpu.h"
> @@ -71,7 +71,7 @@ void restore_tls(tls_t *ptls)
>  		if (prepare_stack32(&stack32) < 0)
>  			return;
>
> -		builtin_memcpy(stack32, desc, sizeof(user_desc_t));
> +		memcpy(stack32, desc, sizeof(user_desc_t));
>  		asm volatile (
>  		"       mov %1,%%eax                    \n"
>  		"       mov %2,%%ebx                    \n"
> diff --git a/criu/arch/x86/sigaction_compat.c b/criu/arch/x86/sigaction_compat.c
> index 168d3dd..52f22a4 100644
> --- a/criu/arch/x86/sigaction_compat.c
> +++ b/criu/arch/x86/sigaction_compat.c
> @@ -1,11 +1,11 @@
>  #include "log.h"
>  #include "asm/restorer.h"
>  #include <compel/asm/fpu.h>
> -#include "asm/string.h"
>  #include "asm/compat.h"
>
>  #ifdef CR_NOGLIBC
>  # include <compel/plugins/std/syscall.h>
> +# include <compel/plugins/std/string.h>
>  #else
>  # ifndef  __NR32_rt_sigaction
>  #  define  __NR32_rt_sigaction 174
> @@ -38,7 +38,7 @@ int arch_compat_rt_sigaction(void *stack32, int sig, rt_sigaction_t_compat *act)
>  	 * To be sure, that sigaction pointer lies under 4G,
>  	 * coping it on the bottom of the stack.
>  	 */
> -	builtin_memcpy(stack32, act, sizeof(rt_sigaction_t_compat));
> +	memcpy(stack32, act, sizeof(rt_sigaction_t_compat));
>
>  	asm volatile ("\t movl %%ebx,%%ebx\n" : :"b"(sig));	/* signum */
>  	asm volatile ("\t movl %%ecx,%%ecx\n" : :"c"(stack32));	/* act */
> diff --git a/criu/arch/x86/vdso-pie.c b/criu/arch/x86/vdso-pie.c
> index 63f8d8d..24d4496 100644
> --- a/criu/arch/x86/vdso-pie.c
> +++ b/criu/arch/x86/vdso-pie.c
> @@ -1,8 +1,8 @@
>  #include <unistd.h>
>
> -#include "asm/string.h"
>  #include "asm/types.h"
>
> +#include <compel/plugins/std/string.h>
>  #include <compel/plugins/std/syscall.h>
>  #include "parasite-vdso.h"
>  #include "log.h"
> @@ -59,7 +59,7 @@ int vdso_redirect_calls(unsigned long base_to, unsigned long base_from,
>  			 base_to, to->symbols[i].offset, i);
>
>  		IMMEDIATE(jmp) = base_to + to->symbols[i].offset;
> -		builtin_memcpy((void *)(base_from + from->symbols[i].offset), &jmp, sizeof(jmp));
> +		memcpy((void *)(base_from + from->symbols[i].offset), &jmp, sizeof(jmp));
>  	}
>
>  	return 0;
> diff --git a/criu/include/asm-generic/string.h b/criu/include/asm-generic/string.h
> deleted file mode 100644
> index ff91968..0000000
> --- a/criu/include/asm-generic/string.h
> +++ /dev/null
> @@ -1,82 +0,0 @@
> -#ifndef __CR_ASM_GENERIC_STRING_H__
> -#define __CR_ASM_GENERIC_STRING_H__
> -
> -#include "common/compiler.h"
> -
> -/* C compiler may generate calls to memcmp, memset, memcpy and memmove,
> - * so it relies on those to be available during linking.
> - * In case we are not linking our code against glibc, we set CR_NOGLIBC
> - * and have to provide our own implementations of mem*() functions.
> - *
> - * For now, not having memmove() seems OK for both gcc and clang.
> - */
> -
> -#ifndef HAS_BUILTIN_MEMCPY
> -static __maybe_unused void *builtin_memcpy(void *to, const void *from, size_t n)
> -{
> -	size_t i;
> -	unsigned char *cto = to;
> -	const unsigned char *cfrom = from;
> -
> -	for (i = 0; i < n; ++i, ++cto, ++cfrom) {
> -		*cto = *cfrom;
> -	}
> -
> -	return to;
> -}
> -#ifdef CR_NOGLIBC
> -void *memcpy(void *to, const void *from, size_t n)	\
> -	     __attribute__ ((weak, alias ("builtin_memcpy")));
> -#endif
> -#endif
> -
> -#ifndef HAS_BUILTIN_MEMCMP
> -static __maybe_unused int builtin_memcmp(const void *cs, const void *ct, size_t count)
> -{
> -	const unsigned char *su1, *su2;
> -	int res = 0;
> -
> -	for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
> -		if ((res = *su1 - *su2) != 0)
> -			break;
> -	return res;
> -}
> -#ifdef CR_NOGLIBC
> -int memcmp(const void *cs, const void *ct, size_t count)	\
> -	     __attribute__ ((weak, alias ("builtin_memcmp")));
> -#endif
> -#endif
> -
> -#ifndef HAS_BUILTIN_STRNCMP
> -static always_inline int builtin_strncmp(const char *cs, const char *ct, size_t count)
> -{
> -	size_t i;
> -
> -	for (i = 0; i < count; i++) {
> -		if (cs[i] != ct[i])
> -			return cs[i] < ct[i] ? -1 : 1;
> -		if (!cs[i])
> -			break;
> -	}
> -	return 0;
> -}
> -#endif
> -
> -#ifndef HAS_BUILTIN_MEMSET
> -static __maybe_unused void *builtin_memset(void *s, const int c, size_t count)
> -{
> -	char *dest = s;
> -	size_t i = 0;
> -
> -	while (i < count)
> -		dest[i++] = (char) c;
> -
> -	return s;
> -}
> -#ifdef CR_NOGLIBC
> -void *memset(void *s, const int c, size_t count)	\
> -	     __attribute__ ((weak, alias ("builtin_memset")));
> -#endif
> -#endif
> -
> -#endif /* __CR_ASM_GENERIC_STRING_H__ */
> diff --git a/criu/include/string.h b/criu/include/string.h
> index 53c0098..f9b4a38 100644
> --- a/criu/include/string.h
> +++ b/criu/include/string.h
> @@ -2,8 +2,6 @@
>  #define __CR_STRING_H__
>
>  #include <sys/types.h>
> -#include <string.h>
> -#include "asm/string.h"
>
>  #ifdef CONFIG_HAS_LIBBSD
>  # include <bsd/string.h>
> diff --git a/criu/pie/Makefile.library b/criu/pie/Makefile.library
> index f1c5f11..b65c25e 100644
> --- a/criu/pie/Makefile.library
> +++ b/criu/pie/Makefile.library
> @@ -18,8 +18,7 @@ ifeq ($(VDSO),y)
>  endif
>
>  ifeq ($(SRCARCH),ppc64)
> -        lib-y		+= ./$(ARCH_DIR)/memcpy_power7.o		\
> -			   ./$(ARCH_DIR)/memcmp_64.o ./$(ARCH_DIR)/misc.o
> +        lib-y		+= ./$(ARCH_DIR)/misc.o
>  endif
>
>  ifeq ($(SRCARCH),x86)
> @@ -27,8 +26,6 @@ ifeq ($(SRCARCH),x86)
>                  lib-y	+= util-vdso-elf32.o
>          endif
>          CFLAGS_util-vdso-elf32.o	+= -DCONFIG_VDSO_32
> -
> -        lib-y		+= ./$(ARCH_DIR)/memcpy.o
>  endif
>
>  #
> diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c
> index e50dac8..3870434 100644
> --- a/criu/pie/restorer.c
> +++ b/criu/pie/restorer.c
> @@ -22,7 +22,6 @@
>  #include "int.h"
>  #include "types.h"
>  #include "common/compiler.h"
> -#include "string.h"
>  #include <compel/plugins/std/syscall.h>
>  #include <compel/plugins/std/log.h>
>  #include <compel/ksigset.h>
> @@ -700,7 +699,7 @@ static int restore_aio_ring(struct rst_aio_ring *raio)
>
>  populate:
>  	i = offsetof(struct aio_ring, io_events);
> -	builtin_memcpy((void *)ctx + i, (void *)ring + i, raio->len - i);
> +	memcpy((void *)ctx + i, (void *)ring + i, raio->len - i);
>
>  	/*
>  	 * If we failed to get the proper nr_req right and
> diff --git a/criu/pie/util-vdso.c b/criu/pie/util-vdso.c
> index c02187c..ef87f07 100644
> --- a/criu/pie/util-vdso.c
> +++ b/criu/pie/util-vdso.c
> @@ -10,13 +10,19 @@
>  #include <sys/stat.h>
>  #include <sys/mman.h>
>
> -#include "string.h"
>  #include "image.h"
>  #include "util-vdso.h"
>  #include "vma.h"
>  #include "log.h"
>  #include "common/bug.h"
>
> +#ifdef CR_NOGLIBC
> +# include <compel/plugins/std/string.h>
> +#else
> +# include <string.h>
> +# define std_strncmp strncmp
> +#endif
> +
>  #ifdef LOG_PREFIX
>  # undef LOG_PREFIX
>  #endif
> @@ -81,7 +87,7 @@ static int has_elf_identity(Ehdr_t *ehdr)
>
>  	BUILD_BUG_ON(sizeof(elf_ident) != sizeof(ehdr->e_ident));
>
> -	if (builtin_memcmp(ehdr->e_ident, elf_ident, sizeof(elf_ident)))
> +	if (memcmp(ehdr->e_ident, elf_ident, sizeof(elf_ident)))
>  		return false;
>  	return true;
>  }
> @@ -239,10 +245,10 @@ static void parse_elf_symbols(uintptr_t mem, size_t size, Phdr_t *load,
>  				continue;
>  			name = (void *)addr;
>
> -			if (builtin_strncmp(name, symbol, vdso_symbol_length))
> +			if (std_strncmp(name, symbol, vdso_symbol_length))
>  				continue;
>
> -			builtin_memcpy(t->symbols[i].name, name, vdso_symbol_length);
> +			memcpy(t->symbols[i].name, name, vdso_symbol_length);
>  			t->symbols[i].offset = (unsigned long)sym->st_value - load->p_vaddr;
>  			break;
>  		}
> diff --git a/include/common/scm-code.c b/include/common/scm-code.c
> index 504c972..db855d9 100644
> --- a/include/common/scm-code.c
> +++ b/include/common/scm-code.c
> @@ -2,10 +2,6 @@
>  #error "The __sys macro is required"
>  #endif
>
> -#ifndef __memcpy
> -#error "The __memcpy macro is required"
> -#endif
> -
>  static void scm_fdset_init_chunk(struct scm_fdset *fdset, int nr_fds,
>  		void *data, unsigned ch_size)
>  {
> @@ -62,7 +58,7 @@ int send_fds(int sock, struct sockaddr_un *saddr, int len,
>  	for (i = 0; i < nr_fds; i += min_fd) {
>  		min_fd = min(CR_SCM_MAX_FD, nr_fds - i);
>  		scm_fdset_init_chunk(&fdset, min_fd, data, ch_size);
> -		__memcpy(cmsg_data, &fds[i], sizeof(int) * min_fd);
> +		memcpy(cmsg_data, &fds[i], sizeof(int) * min_fd);
>
>  		ret = __sys(sendmsg)(sock, &fdset.hdr, 0);
>  		if (ret <= 0)
> @@ -113,7 +109,7 @@ int recv_fds(int sock, int *fds, int nr_fds, void *data, unsigned ch_size)
>  		if (unlikely(min_fd <= 0))
>  			return -1;
>
> -		__memcpy(&fds[i], cmsg_data, sizeof(int) * min_fd);
> +		memcpy(&fds[i], cmsg_data, sizeof(int) * min_fd);
>  		if (data)
>  			data += ch_size * min_fd;
>  	}
>


-- 
              Dmitry


More information about the CRIU mailing list