summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/arm
diff options
context:
space:
mode:
authorWill Newton <will.newton@linaro.org>2014-06-25 12:21:17 +0100
committerWill Newton <will.newton@linaro.org>2014-06-25 16:02:04 +0100
commit9aea0cb842f02098d9c09b4855f883ddc8a8a97e (patch)
treea7b9c14ad610066b5ffabf1c1a68cf986d9c636f /sysdeps/unix/sysv/linux/arm
parent6eaa65cefb0224a3cf6ee4b6649e3576802487b3 (diff)
downloadglibc-9aea0cb842f02098d9c09b4855f883ddc8a8a97e.tar.gz
glibc-9aea0cb842f02098d9c09b4855f883ddc8a8a97e.tar.xz
glibc-9aea0cb842f02098d9c09b4855f883ddc8a8a97e.zip
ARM: Add support for AT_HWCAP2 in _dl_procinfo
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.
Diffstat (limited to 'sysdeps/unix/sysv/linux/arm')
-rw-r--r--sysdeps/unix/sysv/linux/arm/dl-procinfo.c5
-rw-r--r--sysdeps/unix/sysv/linux/arm/dl-procinfo.h67
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 113cda5cc3..7cb3be9156 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 20a3e92bbb..f7557b9d86 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;