diff options
author | Ryan S. Arnold <rsa@linux.vnet.ibm.com> | 2013-05-16 12:12:16 -0500 |
---|---|---|
committer | Ryan S. Arnold <rsa@linux.vnet.ibm.com> | 2013-05-16 12:12:16 -0500 |
commit | 7ec34a51099d54a38517d6856e32282d2f1187ae (patch) | |
tree | cf48e658a8b5680f1da111df41fb23ad0a9a05a0 | |
parent | b90832c35a08a29ecfbe3a35331771ac1a448c2b (diff) | |
download | glibc-rsa/power8.tar.gz glibc-rsa/power8.tar.xz glibc-rsa/power8.zip |
PowerPC: Add support for POWER8. rsa/power8
-rw-r--r-- | ChangeLog | 33 | ||||
-rw-r--r-- | sysdeps/powerpc/bits/hwcap.h | 16 | ||||
-rw-r--r-- | sysdeps/powerpc/dl-procinfo.c | 15 | ||||
-rw-r--r-- | sysdeps/powerpc/dl-procinfo.h | 50 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/power8/Implies | 2 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/power8/Implies | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc32/power8/Implies | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies | 2 |
8 files changed, 96 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog index aa526f8343..b08cd20e8f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,38 @@ 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. + +2013-05-16 Ryan S. Arnold <rsa@linux.vnet.ibm.com> + * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_platforms): Add ppc405, ppc440, ppc464, and ppc476, merging from ports/ dl-procinfo.c. * sysdeps/powerpc/dl-procinfo.h: Fix whitespace by correcting spaces diff --git a/sysdeps/powerpc/bits/hwcap.h b/sysdeps/powerpc/bits/hwcap.h index 783138a0e6..c1d1defd2a 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 0f5c2b3d6d..1c87fb00f9 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 f24a0c6f11..d9cd126722 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 0000000000..083f3e950a --- /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 0000000000..9a5e3c7277 --- /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 0000000000..066dea2798 --- /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 0000000000..fad2505ab9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/power8/Implies @@ -0,0 +1,2 @@ +powerpc/powerpc64/power8/fpu +powerpc/powerpc64/power8 |