This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH rsa/power8] PowerPC: Add support for POWER8.


Hi,

Predicated on the AT_HWCAP2 patch, I've created the rsa/power8 branch
with the latest commit adding power8 hwcap2 feature bits, power8
platform, and power8 sysdeps directory structures.  I've runtime tested
this on an architected kernel and verified that the hwcap features
display properly in the presence of AT_HWCAP2.

        commit 7ec34a51099d54a38517d6856e32282d2f1187ae
        Author: Ryan S. Arnold <rsa@linux.vnet.ibm.com>
        Date:   Thu May 16 12:12:16 2013 -0500
        
            PowerPC: Add support for POWER8.

As of this time Linux kenrel 3.10-rc1 contains support for AT_HWCAP2 and
the POWER8 hwcap feature bits utilizing AT_HWCAP2.

I've updated and added the AT_HWCAP2 patch to this branch as well as the
ports/sysdeps/powerpc/dl-procinfo.[hc] merge:

        commit b90832c35a08a29ecfbe3a35331771ac1a448c2b
        Author: Ryan S. Arnold <rsa@linux.vnet.ibm.com>
        Date:   Mon May 13 15:38:13 2013 -0500
        
            PowerPC: Remove redundant ports/sysdeps/powerpc/dl-procinfo.[hc].
        
        commit c796dcbe0df1184991f332f2eb955becff7e5770
        Author: Ryan S. Arnold <rsa@linux.vnet.ibm.com>
        Date:   Mon May 13 15:31:55 2013 -0500
        
            PowerPC: Merge ports/ dl-procinfo.[hc] with base.
        
        commit f58f65cd7d3318d3af0073c782844d1a6008b111
        Author: Ryan S. Arnold <rsa@linux.vnet.ibm.com>
        Date:   Fri May 3 14:14:40 2013 -0500
        
            Add support for AT_HWCAP2.

Ryan S. Arnold
IBM Linux Technology Center

commit 7ec34a51099d54a38517d6856e32282d2f1187ae
Author: Ryan S. Arnold <rsa@linux.vnet.ibm.com>
Date:   Thu May 16 12:12:16 2013 -0500

    PowerPC: Add support for POWER8.

ChangeLog
2013-05-16  Ryan S. Arnold  <rsa@linux.vnet.ibm.com>
 
	* sysdeps/powerpc/bits/hwcap.h: Add new AT_HWCAP2 features.
	[PPC_FEATURE2_ARCH_2_07]: New feature bit for Power ISA 2.07.
	[PPC_FEATURE2_HAS_HTM]: New feature bit for Hardware Transactional
	Memory.
	[PPC_FEATURE2_HAS_DSCR]: New feature bit for Data Stream Control
	Register.
	[PPC_FEATURE2_HAS_EBB]: New feature bit for Event Based Branching
	facility.
	[PPC_FEATURE2_HAS_ISEL]: New feature bit for Integer Select.
	[PPC_FEATURE2_HAS_TAR]: New feature bit for Target Address Register
	facility.
	* sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_platforms): Add power8 as
	PPC_PLATFORM_POWER8.
	(_dl_powerpc_cap_flags): Add arch_2_07, htm, dscr, ebb, isel, and tar
	as hwcap strings for power8.
	* sysdeps/powerpc/dl-procinfo.h (_dl_procinfo): Eliminate confusing
	conditional variable definitions used to re-use a single loop
	definition.  Replace with simpler redundant loops.  Account for
	AT_HWCAP2 feature bits starting at bit 31 and decrementing.
	[_DL_HWCAP_LAST]: New definition.
	[_DL_HWCAP2_LAST]: New definition.
	[_DL_HWCAP_COUNT]: Update to 64 to account for available bits, not
	number of actual hwcap bits that are defined.
	[_DL_PLATFORMS_COUNT]: Increment for power8.
	[PPC_PLATFORM_POWER8]: New definition.
	(_dl_string_platform): Add return value for power8 platform string.
	* sysdeps/powerpc/powerpc32/power8/Implies: New file.
	* sysdeps/powerpc/powerpc64/power8/Implies: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/power8/Implies: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies: Likewise.

diff --git a/sysdeps/powerpc/bits/hwcap.h b/sysdeps/powerpc/bits/hwcap.h
index 783138a..c1d1def 100644
--- a/sysdeps/powerpc/bits/hwcap.h
+++ b/sysdeps/powerpc/bits/hwcap.h
@@ -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,7 +39,7 @@
 #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_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 */
@@ -51,3 +51,11 @@
 #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 */
diff --git a/sysdeps/powerpc/dl-procinfo.c b/sysdeps/powerpc/dl-procinfo.c
index 0f5c2b3..1c87fb0 100644
--- a/sysdeps/powerpc/dl-procinfo.c
+++ b/sysdeps/powerpc/dl-procinfo.c
@@ -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
@@ -67,7 +75,7 @@ PROCINFO_CLASS const char _dl_powerpc_cap_flags[25][10]
 #if !defined PROCINFO_DECL && defined SHARED
   ._dl_powerpc_platforms
 #else
-PROCINFO_CLASS const char _dl_powerpc_platforms[13][12]
+PROCINFO_CLASS const char _dl_powerpc_platforms[14][12]
 #endif
 #ifndef PROCINFO_DECL
 = {
@@ -83,7 +91,8 @@ PROCINFO_CLASS const char _dl_powerpc_platforms[13][12]
     [PPC_PLATFORM_PPC405] = "ppc405",
     [PPC_PLATFORM_PPC440] = "ppc440",
     [PPC_PLATFORM_PPC464] = "ppc464",
-    [PPC_PLATFORM_PPC476] = "ppc476"
+    [PPC_PLATFORM_PPC476] = "ppc476",
+    [PPC_PLATFORM_POWER8] = "power8"
   }
 #endif
 #if !defined SHARED || defined PROCINFO_DECL
diff --git a/sysdeps/powerpc/dl-procinfo.h b/sysdeps/powerpc/dl-procinfo.h
index f24a0c6..d9cd126 100644
--- a/sysdeps/powerpc/dl-procinfo.h
+++ b/sysdeps/powerpc/dl-procinfo.h
@@ -20,18 +20,26 @@
 #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 in AT_HWCAP, but they are bits 7..31.  */
+/* There are 25 bits used in AT_HWCAP, but they are bits 7..31.  The feature
+ * definitions started at bit 31 and decremented as new features were added.
+ */
+#define _DL_HWCAP_LAST		31
 #define _DL_HWCAP_FIRST		7
-#define _DL_HWCAP2_FIRST	32
-#define _DL_HWCAP_COUNT		32
+
+/* AT_HWCAP2 feature bits similarily started at bit 31 and decremented as new
+ * features were added.  */
+#define _DL_HWCAP2_LAST		31
+
+/* The total number of available bits relative to (minus) _DL_HWCAP_FIRST.  */
+#define _DL_HWCAP_COUNT		64
 
 /* These bits influence library search.  */
 #define HWCAP_IMPORTANT		(PPC_FEATURE_HAS_ALTIVEC \
 				+ PPC_FEATURE_HAS_DFP)
 
-#define _DL_PLATFORMS_COUNT	13
+#define _DL_PLATFORMS_COUNT	14
 
 #define _DL_FIRST_PLATFORM	32
 /* Mask to filter out platforms.  */
@@ -52,6 +60,7 @@
 #define PPC_PLATFORM_PPC440		10
 #define PPC_PLATFORM_PPC464		11
 #define PPC_PLATFORM_PPC476		12
+#define PPC_PLATFORM_POWER8		13
 
 static inline const char *
 __attribute__ ((unused))
@@ -112,6 +121,9 @@ _dl_string_platform (const char *str)
 	case '7':
 	  ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER7;
 	  break;
+	case '8':
+	  ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER8;
+	  break;
 	default:
 	  return -1;
 	}
@@ -159,31 +171,31 @@ static inline int
 __attribute__ ((unused))
 _dl_procinfo (unsigned int type, int word)
 {
-  unsigned int first, count, str_offset;
-
   switch(type)
     {
     case AT_HWCAP:
       _dl_printf ("AT_HWCAP:       ");
-      first = _DL_HWCAP_FIRST;
-      count = MIN(_DL_HWCAP_COUNT,_DL_HWCAP2_FIRST);
-      str_offset = 0;
+
+      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:
-      _dl_printf ("AT_HWCAP2:      ");
-      first = 0;
-      count = _DL_HWCAP_COUNT - _DL_HWCAP2_FIRST;
-      str_offset = _DL_HWCAP2_FIRST;
-      break;
+      {
+	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;
     }
 
-  for (int i = first; i < count; ++i)
-    if (word & (1 << i))
-      _dl_printf (" %s", _dl_hwcap_string (str_offset + i));
-
   _dl_printf ("\n");
 
   return 0;
diff --git a/sysdeps/powerpc/powerpc32/power8/Implies b/sysdeps/powerpc/powerpc32/power8/Implies
new file mode 100644
index 0000000..083f3e9
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power8/Implies
@@ -0,0 +1,2 @@
+powerpc/powerpc32/power7/fpu
+powerpc/powerpc32/power7
diff --git a/sysdeps/powerpc/powerpc64/power8/Implies b/sysdeps/powerpc/powerpc64/power8/Implies
new file mode 100644
index 0000000..9a5e3c7
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/power8/Implies
@@ -0,0 +1,2 @@
+powerpc/powerpc64/power7/fpu
+powerpc/powerpc64/power7
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/power8/Implies b/sysdeps/unix/sysv/linux/powerpc/powerpc32/power8/Implies
new file mode 100644
index 0000000..066dea2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/power8/Implies
@@ -0,0 +1,2 @@
+powerpc/powerpc32/power8/fpu
+powerpc/powerpc32/power8
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies b/sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies
new file mode 100644
index 0000000..fad2505
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies
@@ -0,0 +1,2 @@
+powerpc/powerpc64/power8/fpu
+powerpc/powerpc64/power8



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]