aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--elf/dl-hwcaps.h15
-rw-r--r--sysdeps/sparc/sparc32/dl-machine.h2
-rw-r--r--sysdeps/x86/cpu-features.c8
4 files changed, 17 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index f0b25e31cc..99b23b9ef3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2017-06-07 Siddhesh Poyarekar <siddhesh@sourceware.org>
+ * elf/dl-hwcaps.h [HAVE_TUNABLES]: Always read hwcap_mask.
+ * sysdeps/sparc/sparc32/dl-machine.h [HAVE_TUNABLES]:
+ Likewise.
+ * sysdeps/x86/cpu-features.c (init_cpu_features): Always set
+ up hwcap and hwcap_mask.
+
* sysdeps/unix/sysv/linux/aarch64/cpu-features.c
(init_cpu_features): Use glibc.tune.hwcap_mask.
* sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h: New file.
diff --git a/elf/dl-hwcaps.h b/elf/dl-hwcaps.h
index 9ce33173f1..2c4fa3db02 100644
--- a/elf/dl-hwcaps.h
+++ b/elf/dl-hwcaps.h
@@ -18,14 +18,13 @@
#include <elf/dl-tunables.h>
-#ifdef SHARED
-# if HAVE_TUNABLES
-# define GET_HWCAP_MASK() \
- TUNABLE_GET (glibc, tune, hwcap_mask, uint64_t, NULL)
+#if HAVE_TUNABLES
+# define GET_HWCAP_MASK() TUNABLE_GET (glibc, tune, hwcap_mask, uint64_t, NULL)
+#else
+# ifdef SHARED
+# define GET_HWCAP_MASK() GLRO(dl_hwcap_mask)
# else
-# define GET_HWCAP_MASK() GLRO(dl_hwcap_mask)
+/* HWCAP_MASK is ignored in static binaries when built without tunables. */
+# define GET_HWCAP_MASK() (0)
# endif
-#else
-/* HWCAP_MASK is ignored in static binaries. */
-# define GET_HWCAP_MASK() (0)
#endif
diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h
index f9ae13300d..95f673270e 100644
--- a/sysdeps/sparc/sparc32/dl-machine.h
+++ b/sysdeps/sparc/sparc32/dl-machine.h
@@ -37,7 +37,7 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr)
return 1;
else if (ehdr->e_machine == EM_SPARC32PLUS)
{
-#ifdef SHARED
+#if HAVE_TUNABLES || defined SHARED
uint64_t hwcap_mask = GET_HWCAP_MASK();
return GLRO(dl_hwcap) & hwcap_mask & HWCAP_SPARC_V9;
#else
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index 4fe58bfd51..4288001cdd 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -312,17 +312,16 @@ no_cpuid:
cpu_features->model = model;
cpu_features->kind = kind;
-#if IS_IN (rtld)
/* Reuse dl_platform, dl_hwcap and dl_hwcap_mask for x86. */
GLRO(dl_platform) = NULL;
GLRO(dl_hwcap) = 0;
-#if !HAVE_TUNABLES
+#if !HAVE_TUNABLES && defined SHARED
/* The glibc.tune.hwcap_mask tunable is initialized already, so no need to do
this. */
GLRO(dl_hwcap_mask) = HWCAP_IMPORTANT;
#endif
-# ifdef __x86_64__
+#ifdef __x86_64__
if (cpu_features->kind == arch_kind_intel)
{
if (CPU_FEATURES_ARCH_P (cpu_features, AVX512F_Usable)
@@ -352,7 +351,7 @@ no_cpuid:
&& CPU_FEATURES_CPU_P (cpu_features, POPCNT))
GLRO(dl_platform) = "haswell";
}
-# else
+#else
if (CPU_FEATURES_CPU_P (cpu_features, SSE2))
GLRO(dl_hwcap) |= HWCAP_X86_SSE2;
@@ -360,6 +359,5 @@ no_cpuid:
GLRO(dl_platform) = "i686";
else if (CPU_FEATURES_ARCH_P (cpu_features, I586))
GLRO(dl_platform) = "i586";
-# endif
#endif
}