]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/arm/dl-procinfo.h
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / arm / dl-procinfo.h
index 2f8f003e9fea6bfaccbe164fb8f3e9d0827e4c0e..66c00297b743f3ac28ce8c89718378a629751c6e 100644 (file)
@@ -1,5 +1,5 @@
 /* Linux/ARM version of processor capability information handling macros.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
+   Copyright (C) 2001-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Philip Blundell <philb@gnu.org>, 2001.
 
 #include <ldsodefs.h>
 #include <sysdep.h>
 
-#define _DL_HWCAP_COUNT 19
+#define _DL_HWCAP_COUNT 27
 
-/* 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;