This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH rsa/power8] PowerPC: Add support for POWER8.
- From: Ryan Arnold <rsa at us dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Thu, 16 May 2013 12:37:32 -0500
- Subject: [PATCH rsa/power8] PowerPC: Add support for POWER8.
- Reply-to: rsa at us dot ibm dot com
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