From ea01a4da219011f4a4db97eef3c5bfc2f6e8fc6b Mon Sep 17 00:00:00 2001 From: Siddhesh Poyarekar Date: Thu, 25 May 2017 15:34:55 +0530 Subject: 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. --- sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c | 15 +++++++ sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h | 58 +++++++++++++++++++++++---- 2 files changed, 65 insertions(+), 8 deletions(-) (limited to 'sysdeps/unix/sysv') diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c index 438046a..bc37bad 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 7a60d72..cdb36d3 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 */ -- cgit v1.1