This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Add ifunc memcpy and memmove for aarch64
On 09/02/17 00:02, Steve Ellcey wrote:
> +static inline void __attribute__ ((unused))
> +dl_platform_init (void)
> +{
> + if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
> + /* Avoid an empty string which would disturb us. */
> + GLRO(dl_platform) = NULL;
> +
> +#ifdef SHARED
> + /* init_cpu_features has been called early from __libc_start_main in
> + static executable. */
> + init_cpu_features (&GLRO(dl_aarch64_cpu_features));
> +#endif
> +}
...
> +static inline void
> +init_cpu_features (struct cpu_features *cpu_features)
> +{
> + if (GLRO(dl_hwcap) & HWCAP_CPUID)
> + {
> + register uint64_t id = 0;
> + asm volatile ("mrs %0, midr_el1" : "=r"(id));
> + cpu_features->midr_el1 = id;
this is a trap into the kernel at every process startup
since this is called very early (dynamic linking case
above, static linking case below) i wonder if there
could be a way for the user to request midr_el1==0
unconditionally (avoiding the overhead and making
sure the most generic implementation is used)
is there something like that on other targets?
> + }
> + else
> + {
> + cpu_features->midr_el1 = 0;
> + }
> +}
...
> +#ifdef SHARED
> +# include <csu/libc-start.c>
> +# else
> +/* The main work is done in the generic function. */
> +# define LIBC_START_DISABLE_INLINE
> +# define LIBC_START_MAIN generic_start_main
> +# include <csu/libc-start.c>
> +# include <cpu-features.c>
> +
> +extern struct cpu_features _dl_aarch64_cpu_features;
> +
> +int
> +__libc_start_main (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
> + int argc, char **argv,
> + __typeof (main) init,
> + void (*fini) (void),
> + void (*rtld_fini) (void), void *stack_end)
> +{
> + init_cpu_features (&_dl_aarch64_cpu_features);
> + return generic_start_main (main, argc, argv, init, fini, rtld_fini,
> + stack_end);
> +}
> +#endif
>