PowerPC: Define AT_HWCAP2 bits and AT_HWCAP2 handling for POWER8.
authorRyan S. Arnold <rsa@linux.vnet.ibm.com>
Fri, 28 Jun 2013 21:52:49 +0000 (16:52 -0500)
committerRyan S. Arnold <rsa@linux.vnet.ibm.com>
Fri, 28 Jun 2013 21:52:49 +0000 (16:52 -0500)
ChangeLog
sysdeps/powerpc/Makefile
sysdeps/powerpc/bits/hwcap.h
sysdeps/powerpc/dl-procinfo.c
sysdeps/powerpc/dl-procinfo.h
sysdeps/powerpc/rtld-global-offsets.sym

index 1ee4457..c5551b8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
 2013-06-28  Ryan S. Arnold  <rsa@linux.vnet.ibm.com>
 
+       * sysdeps/powerpc/Makefile: Add comment about generating an offset to
+       rtld_global._dl_hwcap2.
+       * sysdeps/powerpc/bits/hwcap.h: Added PPC_FEATURE2_* definitions for
+       POWER8.
+       * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_cap_flags): Extend for
+       POWER8 feature descriptions defined in _dl_hwcap2.
+       * sysdeps/powerpc/dl-procinfo.h (_dl_procinfo): Implement AT_HWCAP2
+       string handling for POWER8 feature bits.
+       (_DL_HWCAP_COUNT): Increment to 64 to cover AT_HWCAP2 bits.
+       (_DL_HWCAP_LAST): New definition for position of last AT_HWCAP bit in
+       _dl_powerpc_cap_flags.
+       (_DL_HWCAP2_LAST): New definition for last usable bit of AT_HWCAP2.
+       * sysdeps/powerpc/rtld-global-offsets.sym
+       (RTLD_GLOBAL_RO_DL_HWCAP2_OFFSET): New offset macro to locate
+       _dl_hwcap2 in the rtld_global_ro structure.
+
+2013-06-28  Ryan S. Arnold  <rsa@linux.vnet.ibm.com>
+
        * elf/dl-support.c (_dl_hwcap2): Add a new hwcap field for more
        hardware capabilities in support of AT_HWCAP2.
        (_dl_aux_init): Read AT_HWCAP2 into GLRO(dl_hwcap2).
index 7442b67..f75e625 100644 (file)
@@ -17,7 +17,7 @@ endif
 endif
 
 ifeq ($(subdir),csu)
-# get offset to rtld_global._dl_hwcap
+# get offset to rtld_global._dl_hwcap and rtld_global._dl_hwcap2
 gen-as-const-headers += rtld-global-offsets.sym
 # get offset to __locale_struct.__ctype_tolower
 gen-as-const-headers += locale-defines.sym
index 783138a..0c02fc6 100644 (file)
@@ -1,4 +1,4 @@
-/* Defines for bits in AT_HWCAP.
+/* Defines for bits in AT_HWCAP and AT_HWCAP2.
    Copyright (C) 2012-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -20,9 +20,9 @@
 # error "Never include <bits/hwcap.h> directly; use <sys/auxv.h> instead."
 #endif
 
-/*
- * The following must match the kernels asm/cputable.h.
- */
+/* The bit numbers must match those in the kernel's asm/cputable.h.  */
+
+/* Feature definitions in AT_HWCAP.  */
 #define PPC_FEATURE_32             0x80000000 /* 32-bit mode. */
 #define PPC_FEATURE_64             0x40000000 /* 64-bit mode. */
 #define PPC_FEATURE_601_INSTR      0x20000000 /* 601 chip, Old POWER ISA.  */
@@ -39,8 +39,9 @@
 #define PPC_FEATURE_POWER5         0x00040000 /* POWER5 ISA 2.02 */
 #define PPC_FEATURE_POWER5_PLUS            0x00020000 /* POWER5+ ISA 2.03 */
 #define PPC_FEATURE_CELL_BE        0x00010000 /* CELL Broadband Engine */
-#define PPC_FEATURE_BOOKE          0x00008000
-#define PPC_FEATURE_SMT                    0x00004000 /* Simultaneous Multi-Threading */
+#define PPC_FEATURE_BOOKE          0x00008000 /* ISA Category Embedded */
+#define PPC_FEATURE_SMT                    0x00004000 /* Simultaneous
+                                                 Multi-Threading */
 #define PPC_FEATURE_ICACHE_SNOOP    0x00002000
 #define PPC_FEATURE_ARCH_2_05      0x00001000 /* ISA 2.05 */
 #define PPC_FEATURE_PA6T           0x00000800 /* PA Semi 6T Core */
 #define PPC_FEATURE_PSERIES_PERFMON_COMPAT  0x00000040
 #define PPC_FEATURE_TRUE_LE        0x00000002
 #define PPC_FEATURE_PPC_LE         0x00000001
+
+/* Feature definitions in AT_HWCAP2.  */
+#define PPC_FEATURE2_ARCH_2_07     0x80000000 /* ISA 2.07 */
+#define PPC_FEATURE2_HAS_HTM       0x40000000 /* Hardware Transactional
+                                                Memory */
+#define PPC_FEATURE2_HAS_DSCR      0x20000000 /* Data Stream Control
+                                                Register */
+#define PPC_FEATURE2_HAS_EBB       0x10000000 /* Event Base Branching */
+#define PPC_FEATURE2_HAS_ISEL      0x08000000 /* Integer Select */
+#define PPC_FEATURE2_HAS_TAR       0x04000000 /* Target Address Register */
index 9654984..2984af1 100644 (file)
@@ -45,7 +45,7 @@
 #if !defined PROCINFO_DECL && defined SHARED
   ._dl_powerpc_cap_flags
 #else
-PROCINFO_CLASS const char _dl_powerpc_cap_flags[25][10]
+PROCINFO_CLASS const char _dl_powerpc_cap_flags[57][10]
 #endif
 #ifndef PROCINFO_DECL
 = {
@@ -56,6 +56,14 @@ PROCINFO_CLASS const char _dl_powerpc_cap_flags[25][10]
     "notb", "efpdouble", "efpsingle", "spe",
     "ucache", "4xxmac", "mmu", "fpu",
     "altivec", "ppc601", "ppc64", "ppc32",
+    "", "", "", "",
+    "", "", "", "",
+    "", "", "", "",
+    "", "", "", "",
+    "", "", "", "",
+    "", "", "", "",
+    "", "", "tar", "isel",
+    "ebb", "dscr", "htm", "arch_2_07",
   }
 #endif
 #if !defined SHARED || defined PROCINFO_DECL
index 9531a2a..e7eeed9 100644 (file)
 #define _DL_PROCINFO_H 1
 
 #include <ldsodefs.h>
-#include <sysdep.h>    /* This defines the PPC_FEATURE_* macros.  */
+#include <sysdep.h>    /* This defines the PPC_FEATURE[2]_* macros.  */
 
 /* There are 25 bits used, but they are bits 7..31.  */
 #define _DL_HWCAP_FIRST                7
-#define _DL_HWCAP_COUNT                32
+
+/* The total number of available bits (including those prior to
+   _DL_HWCAP_FIRST).  Some of these bits might not be used.  */
+#define _DL_HWCAP_COUNT                64
+
+/* Features started at bit 31 and decremented as new features were added.  */
+#define _DL_HWCAP_LAST         31
+
+/* AT_HWCAP2 features started at bit 31 and decremented as new features were
+   added.  HWCAP2 feature bits start at bit 0.  */
+#define _DL_HWCAP2_LAST                31
 
 /* These bits influence library search.  */
 #define HWCAP_IMPORTANT                (PPC_FEATURE_HAS_ALTIVEC \
@@ -161,18 +171,33 @@ static inline int
 __attribute__ ((unused))
 _dl_procinfo (unsigned int type, unsigned long int word)
 {
-  /* Fallback to unknown output mechanism.  */
-  if (type == AT_HWCAP2)
-    return -1;
-
-  _dl_printf ("AT_HWCAP:       ");
-
-  for (int i = _DL_HWCAP_FIRST; i < _DL_HWCAP_COUNT; ++i)
-    if (word & (1 << i))
-      _dl_printf (" %s", _dl_hwcap_string (i));
-
-  _dl_printf ("\n");
-
+  switch(type)
+    {
+    case AT_HWCAP:
+      _dl_printf ("AT_HWCAP:       ");
+
+      for (int i = _DL_HWCAP_FIRST; 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:      ");
+
+        /* We have to go through them all because the kernel added the
+          AT_HWCAP2 features starting with the high bits.  */
+       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;
 }
 #endif
index ff4e97f..f5ea5a1 100644 (file)
@@ -5,3 +5,4 @@
 #define rtld_global_ro_offsetof(mem) offsetof (struct rtld_global_ro, mem)
 
 RTLD_GLOBAL_RO_DL_HWCAP_OFFSET rtld_global_ro_offsetof (_dl_hwcap)
+RTLD_GLOBAL_RO_DL_HWCAP2_OFFSET        rtld_global_ro_offsetof (_dl_hwcap2)