This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] ARM: Add support for AT_HWCAP2 in _dl_procinfo
- From: Will Newton <will dot newton at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Wed, 25 Jun 2014 14:12:50 +0100
- Subject: [PATCH] ARM: Add support for AT_HWCAP2 in _dl_procinfo
- Authentication-results: sourceware.org; auth=none
Add support for the new HWCAP2 values for ARMv8 added in the
3.15 kernel. Tested using QEMU which supports these extensions.
ChangeLog:
2014-06-25 Will Newton <will.newton@linaro.org>
* sysdeps/unix/sysv/linux/arm/dl-procinfo.c
(_dl_arm_cap_flags): Add HWCAP2 values.
* sysdeps/unix/sysv/linux/arm/dl-procinfo.h
(_DL_HWCAP_COUNT): Increase to 37.
(_DL_HWCAP_LAST): New define.
(_DL_HWCAP2_LAST): New define.
(_dl_procinfo): Add support for printing
AT_HWCAP2 entries.
(_dl_string_hwcap): Use _dl_hwcap_string.
---
sysdeps/unix/sysv/linux/arm/dl-procinfo.c | 5 ++-
sysdeps/unix/sysv/linux/arm/dl-procinfo.h | 67 +++++++++++++++++++------------
2 files changed, 44 insertions(+), 28 deletions(-)
diff --git a/sysdeps/unix/sysv/linux/arm/dl-procinfo.c b/sysdeps/unix/sysv/linux/arm/dl-procinfo.c
index 113cda5..7cb3be9 100644
--- a/sysdeps/unix/sysv/linux/arm/dl-procinfo.c
+++ b/sysdeps/unix/sysv/linux/arm/dl-procinfo.c
@@ -23,7 +23,7 @@
If anything should be added here check whether the size of each string
is still ok with the given array size.
- All the #ifdefs in the definitions ar equite irritating but
+ All the #ifdefs in the definitions are quite irritating but
necessary if we want to avoid duplicating the information. There
are three different modes:
@@ -46,13 +46,14 @@
#if !defined PROCINFO_DECL && defined SHARED
._dl_arm_cap_flags
#else
-PROCINFO_CLASS const char _dl_arm_cap_flags[22][10]
+PROCINFO_CLASS const char _dl_arm_cap_flags[37][10]
#endif
#ifndef PROCINFO_DECL
= {
"swp", "half", "thumb", "26bit", "fastmult", "fpa", "vfp", "edsp",
"java", "iwmmxt", "crunch", "thumbee", "neon", "vfpv3", "vfpv3d16",
"tls", "vfpv4", "idiva", "idivt", "vfpd32", "lpae", "evtstrm",
+ "aes", "pmull", "sha1", "sha2", "crc32",
}
#endif
#if !defined SHARED || defined PROCINFO_DECL
diff --git a/sysdeps/unix/sysv/linux/arm/dl-procinfo.h b/sysdeps/unix/sysv/linux/arm/dl-procinfo.h
index 20a3e92..f7557b9 100644
--- a/sysdeps/unix/sysv/linux/arm/dl-procinfo.h
+++ b/sysdeps/unix/sysv/linux/arm/dl-procinfo.h
@@ -23,32 +23,17 @@
#include <ldsodefs.h>
#include <sysdep.h>
-#define _DL_HWCAP_COUNT 22
+#define _DL_HWCAP_COUNT 37
-/* The kernel provides platform data but it is not interesting. */
-#define _DL_HWCAP_PLATFORM 0
-
-
-static inline int
-__attribute__ ((unused))
-_dl_procinfo (unsigned int type, unsigned long int word)
-{
- int i;
-
- /* Fallback to unknown output mechanism. */
- if (type == AT_HWCAP2)
- return -1;
-
- _dl_printf ("AT_HWCAP: ");
+/* Low 22 bits are allocated in HWCAP. */
+#define _DL_HWCAP_LAST 21
- for (i = 0; i < _DL_HWCAP_COUNT; ++i)
- if (word & (1 << i))
- _dl_printf (" %s", GLRO(dl_arm_cap_flags)[i]);
+/* Low 5 bits are allocated in HWCAP2. */
+#define _DL_HWCAP2_LAST 4
- _dl_printf ("\n");
+/* The kernel provides platform data but it is not interesting. */
+#define _DL_HWCAP_PLATFORM 0
- return 0;
-}
static inline const char *
__attribute__ ((unused))
@@ -57,17 +42,47 @@ _dl_hwcap_string (int idx)
return GLRO(dl_arm_cap_flags)[idx];
};
+static inline int
+__attribute__ ((unused))
+_dl_procinfo (unsigned int type, unsigned long int word)
+{
+ switch(type)
+ {
+ case AT_HWCAP:
+ _dl_printf ("AT_HWCAP: ");
+
+ for (int i = 0; i <= _DL_HWCAP_LAST; ++i)
+ if (word & (1 << i))
+ _dl_printf (" %s", _dl_hwcap_string (i));
+ break;
+ case AT_HWCAP2:
+ {
+ unsigned int offset = _DL_HWCAP_LAST + 1;
+
+ _dl_printf ("AT_HWCAP2: ");
+
+ for (int i = 0; i <= _DL_HWCAP2_LAST; ++i)
+ if (word & (1 << i))
+ _dl_printf (" %s", _dl_hwcap_string (offset + i));
+ break;
+ }
+ default:
+ /* This should not happen. */
+ return -1;
+ }
+ _dl_printf ("\n");
+ return 0;
+}
+
#define HWCAP_IMPORTANT (HWCAP_ARM_VFP | HWCAP_ARM_NEON)
static inline int
__attribute__ ((unused))
_dl_string_hwcap (const char *str)
{
- int i;
-
- for (i = 0; i < _DL_HWCAP_COUNT; i++)
+ for (int i = 0; i < _DL_HWCAP_COUNT; i++)
{
- if (strcmp (str, GLRO(dl_arm_cap_flags)[i]) == 0)
+ if (strcmp (str, _dl_hwcap_string (i)) == 0)
return i;
}
return -1;
--
1.9.3