From ea01a4da219011f4a4db97eef3c5bfc2f6e8fc6b Mon Sep 17 00:00:00 2001 From: Siddhesh Poyarekar Date: Thu, 25 May 2017 15:34:55 +0530 Subject: [PATCH] aarch64: Add hwcap string routines Add support for routines in dl-procinfo.h to show string versions of HWCAP entries when a program is invoked with the LD_SHOW_AUXV environment variable set and also to aid in path resolution for ldconfig. * sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c (_dl_aarch64_cap_flags): New array. * sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h (_dl_hwcap_string, _dl_string_hwcap, _dl_procinfo): Implement functions. --- ChangeLog | 6 ++ sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c | 15 +++++ sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h | 58 ++++++++++++++++--- 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 99b23b9ef3..2e4e14efd9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2017-06-07 Siddhesh Poyarekar + * sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c + (_dl_aarch64_cap_flags): New array. + * sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h + (_dl_hwcap_string, _dl_string_hwcap, _dl_procinfo): Implement + functions. + * elf/dl-hwcaps.h [HAVE_TUNABLES]: Always read hwcap_mask. * sysdeps/sparc/sparc32/dl-machine.h [HAVE_TUNABLES]: Likewise. diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c index 438046a562..bc37bad782 100644 --- a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c +++ b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c @@ -56,5 +56,20 @@ PROCINFO_CLASS struct cpu_features _dl_aarch64_cpu_features # endif #endif +#if !defined PROCINFO_DECL && defined SHARED + ._dl_aarch64_cap_flags +#else +PROCINFO_CLASS const char _dl_aarch64_cap_flags[13][10] +#endif +#ifndef PROCINFO_DECL += { "fp", "asimd", "evtstrm", "aes", "pmull", "sha1", "sha2", "crc32", + "atomics", "fphp", "asimdhp", "cpuid", "asimdrdm"} +#endif +#if !defined SHARED || defined PROCINFO_DECL +; +#else +, +#endif + #undef PROCINFO_DECL #undef PROCINFO_CLASS diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h index 7a60d72844..cdb36d3316 100644 --- a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h +++ b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h @@ -20,25 +20,67 @@ #define _DL_PROCINFO_H 1 #include +#include +#include +#include /* We cannot provide a general printing function. */ -#define _dl_procinfo(type, word) -1 +static inline int +__attribute__ ((unused)) +_dl_procinfo (unsigned int type, unsigned long int word) +{ + /* This table should match the information from arch/arm64/kernel/cpuinfo.c + in the kernel sources. */ + int i; -/* There are no hardware capabilities defined. */ -#define _dl_hwcap_string(idx) "" + /* Fallback to unknown output mechanism. */ + if (type == AT_HWCAP2) + return -1; + + _dl_printf ("AT_HWCAP: "); + + for (i = 0; i < 32; ++i) + if (word & (1 << i)) + _dl_printf (" %s", GLRO(dl_aarch64_cap_flags)[i]); + + _dl_printf ("\n"); + + return 0; +} + +static inline const char * +__attribute__ ((unused)) +_dl_hwcap_string (int idx) +{ + return GLRO(dl_aarch64_cap_flags)[idx]; +}; + + +/* 13 HWCAP bits set. */ +#define _DL_HWCAP_COUNT 13 + +/* Low 13 bits are allocated in HWCAP. */ +#define _DL_HWCAP_LAST 12 /* HWCAP_CPUID should be available by default to influence IFUNC as well as library search. */ #define HWCAP_IMPORTANT HWCAP_CPUID +static inline int +__attribute__ ((unused)) +_dl_string_hwcap (const char *str) +{ + for (int i = 0; i < _DL_HWCAP_COUNT; i++) + { + if (strcmp (str, _dl_hwcap_string (i)) == 0) + return i; + } + return -1; +}; + /* There're no platforms to filter out. */ #define _DL_HWCAP_PLATFORM 0 -/* We don't have any hardware capabilities. */ -#define _DL_HWCAP_COUNT 0 - -#define _dl_string_hwcap(str) (-1) - #define _dl_string_platform(str) (-1) #endif /* dl-procinfo.h */