aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/generic/dl-sysdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/generic/dl-sysdep.c')
-rw-r--r--sysdeps/generic/dl-sysdep.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c
index 8db0c7889f..7f5e32193a 100644
--- a/sysdeps/generic/dl-sysdep.c
+++ b/sysdeps/generic/dl-sysdep.c
@@ -45,6 +45,7 @@ int __libc_enable_secure;
int __libc_multiple_libcs; /* Defining this here avoids the inclusion
of init-first. */
static ElfW(auxv_t) *_dl_auxv;
+static unsigned long hwcap;
#ifndef DL_FIND_ARG_COMPONENTS
@@ -235,10 +236,10 @@ _dl_show_auxv (void)
_dl_sysdep_message ("AT_PLATFORM: ", av->a_un.a_ptr, "\n", NULL);
break;
case AT_HWCAP:
- if (_dl_procinfo (av->a_un.a_val) < 0)
+ hwcap = av->a_un.a_val;
+ if (_dl_procinfo (hwcap) < 0)
_dl_sysdep_message ("AT_HWCAP: ",
- _itoa_word (av->a_un.a_val, buf + sizeof buf - 1,
- 16, 0),
+ _itoa_word (hwcap, buf + sizeof buf - 1, 16, 0),
"\n", NULL);
break;
}
@@ -269,3 +270,30 @@ _dl_next_ld_env_entry (char ***position)
return result;
}
+
+/* Return an array of useful/necessary hardware capability names. */
+char **
+_dl_important_hwcaps (size_t *sz)
+{
+ /* Determine how many important bits are set. */
+ unsigned long int important = hwcap & HWCAP_IMPORTANT;
+ size_t cnt = 0;
+ size_t n;
+ char **result;
+
+ for (n = 0; (~((1UL << n) - 1) & important) != 0; ++n)
+ if ((important & (1UL << n)) != 0)
+ ++cnt;
+
+ *sz = 0;
+ if (cnt == 0)
+ return NULL;
+
+ result = (char **) malloc (cnt * sizeof (char *));
+ if (result != NULL)
+ for (n = 0; (~((1UL << n) - 1) & important) != 0; ++n)
+ if ((important & (1UL << n)) != 0)
+ result[*sz++] = _dl_hwcap_string (n);
+
+ return result;
+}