|
|
29e444 |
From 3ca2c50727b3e3e22eb3606135a18c6212f516d2 Mon Sep 17 00:00:00 2001
|
|
|
29e444 |
From: "Ryan S. Arnold" <rsa@linux.vnet.ibm.com>
|
|
|
29e444 |
Date: Fri, 28 Jun 2013 16:52:49 -0500
|
|
|
29e444 |
Subject: [PATCH 40/42] PowerPC: Define AT_HWCAP2 bits and AT_HWCAP2 handling
|
|
|
29e444 |
for POWER8. (cherry picked from commit
|
|
|
29e444 |
89cd956937f46e8f4a0374994965f991642dd408)
|
|
|
29e444 |
|
|
|
29e444 |
---
|
|
|
29e444 |
sysdeps/powerpc/Makefile | 2 +-
|
|
|
29e444 |
sysdeps/powerpc/bits/hwcap.h | 25 +++++++++++-----
|
|
|
29e444 |
sysdeps/powerpc/dl-procinfo.c | 10 ++++++-
|
|
|
29e444 |
sysdeps/powerpc/dl-procinfo.h | 53 ++++++++++++++++++++++++---------
|
|
|
29e444 |
sysdeps/powerpc/rtld-global-offsets.sym | 1 +
|
|
|
29e444 |
6 files changed, 86 insertions(+), 23 deletions(-)
|
|
|
29e444 |
|
|
|
12745e |
diff --git glibc-2.17-c758a686/sysdeps/powerpc/Makefile glibc-2.17-c758a686/sysdeps/powerpc/Makefile
|
|
|
29e444 |
index 7442b67..f75e625 100644
|
|
|
12745e |
--- glibc-2.17-c758a686/sysdeps/powerpc/Makefile
|
|
|
12745e |
+++ glibc-2.17-c758a686/sysdeps/powerpc/Makefile
|
|
|
29e444 |
@@ -17,7 +17,7 @@ endif
|
|
|
29e444 |
endif
|
|
|
29e444 |
|
|
|
29e444 |
ifeq ($(subdir),csu)
|
|
|
29e444 |
-# get offset to rtld_global._dl_hwcap
|
|
|
29e444 |
+# get offset to rtld_global._dl_hwcap and rtld_global._dl_hwcap2
|
|
|
29e444 |
gen-as-const-headers += rtld-global-offsets.sym
|
|
|
29e444 |
# get offset to __locale_struct.__ctype_tolower
|
|
|
29e444 |
gen-as-const-headers += locale-defines.sym
|
|
|
12745e |
diff --git glibc-2.17-c758a686/sysdeps/powerpc/bits/hwcap.h glibc-2.17-c758a686/sysdeps/powerpc/bits/hwcap.h
|
|
|
29e444 |
index 89e7d8b..0c02fc6 100644
|
|
|
12745e |
--- glibc-2.17-c758a686/sysdeps/powerpc/bits/hwcap.h
|
|
|
12745e |
+++ glibc-2.17-c758a686/sysdeps/powerpc/bits/hwcap.h
|
|
|
29e444 |
@@ -1,5 +1,5 @@
|
|
|
29e444 |
-/* Defines for bits in AT_HWCAP.
|
|
|
29e444 |
- Copyright (C) 2012 Free Software Foundation, Inc.
|
|
|
29e444 |
+/* Defines for bits in AT_HWCAP and AT_HWCAP2.
|
|
|
29e444 |
+ Copyright (C) 2012-2013 Free Software Foundation, Inc.
|
|
|
29e444 |
This file is part of the GNU C Library.
|
|
|
29e444 |
|
|
|
29e444 |
The GNU C Library is free software; you can redistribute it and/or
|
|
|
29e444 |
@@ -20,9 +20,9 @@
|
|
|
29e444 |
# error "Never include <bits/hwcap.h> directly; use <sys/auxv.h> instead."
|
|
|
29e444 |
#endif
|
|
|
29e444 |
|
|
|
29e444 |
-/*
|
|
|
29e444 |
- * The following must match the kernels asm/cputable.h.
|
|
|
29e444 |
- */
|
|
|
29e444 |
+/* The bit numbers must match those in the kernel's asm/cputable.h. */
|
|
|
29e444 |
+
|
|
|
29e444 |
+/* Feature definitions in AT_HWCAP. */
|
|
|
29e444 |
#define PPC_FEATURE_32 0x80000000 /* 32-bit mode. */
|
|
|
29e444 |
#define PPC_FEATURE_64 0x40000000 /* 64-bit mode. */
|
|
|
29e444 |
#define PPC_FEATURE_601_INSTR 0x20000000 /* 601 chip, Old POWER ISA. */
|
|
|
29e444 |
@@ -39,8 +39,9 @@
|
|
|
29e444 |
#define PPC_FEATURE_POWER5 0x00040000 /* POWER5 ISA 2.02 */
|
|
|
29e444 |
#define PPC_FEATURE_POWER5_PLUS 0x00020000 /* POWER5+ ISA 2.03 */
|
|
|
29e444 |
#define PPC_FEATURE_CELL_BE 0x00010000 /* CELL Broadband Engine */
|
|
|
29e444 |
-#define PPC_FEATURE_BOOKE 0x00008000
|
|
|
29e444 |
-#define PPC_FEATURE_SMT 0x00004000 /* Simultaneous Multi-Threading */
|
|
|
29e444 |
+#define PPC_FEATURE_BOOKE 0x00008000 /* ISA Category Embedded */
|
|
|
29e444 |
+#define PPC_FEATURE_SMT 0x00004000 /* Simultaneous
|
|
|
29e444 |
+ Multi-Threading */
|
|
|
29e444 |
#define PPC_FEATURE_ICACHE_SNOOP 0x00002000
|
|
|
29e444 |
#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */
|
|
|
29e444 |
#define PPC_FEATURE_PA6T 0x00000800 /* PA Semi 6T Core */
|
|
|
29e444 |
@@ -51,3 +52,13 @@
|
|
|
29e444 |
#define PPC_FEATURE_PSERIES_PERFMON_COMPAT 0x00000040
|
|
|
29e444 |
#define PPC_FEATURE_TRUE_LE 0x00000002
|
|
|
29e444 |
#define PPC_FEATURE_PPC_LE 0x00000001
|
|
|
29e444 |
+
|
|
|
29e444 |
+/* Feature definitions in AT_HWCAP2. */
|
|
|
29e444 |
+#define PPC_FEATURE2_ARCH_2_07 0x80000000 /* ISA 2.07 */
|
|
|
29e444 |
+#define PPC_FEATURE2_HAS_HTM 0x40000000 /* Hardware Transactional
|
|
|
29e444 |
+ Memory */
|
|
|
29e444 |
+#define PPC_FEATURE2_HAS_DSCR 0x20000000 /* Data Stream Control
|
|
|
29e444 |
+ Register */
|
|
|
29e444 |
+#define PPC_FEATURE2_HAS_EBB 0x10000000 /* Event Base Branching */
|
|
|
29e444 |
+#define PPC_FEATURE2_HAS_ISEL 0x08000000 /* Integer Select */
|
|
|
29e444 |
+#define PPC_FEATURE2_HAS_TAR 0x04000000 /* Target Address Register */
|
|
|
12745e |
diff --git glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.c glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.c
|
|
|
29e444 |
index efab165..6cebf99 100644
|
|
|
12745e |
--- glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.c
|
|
|
12745e |
+++ glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.c
|
|
|
29e444 |
@@ -45,7 +45,7 @@
|
|
|
29e444 |
#if !defined PROCINFO_DECL && defined SHARED
|
|
|
29e444 |
._dl_powerpc_cap_flags
|
|
|
29e444 |
#else
|
|
|
29e444 |
-PROCINFO_CLASS const char _dl_powerpc_cap_flags[25][10]
|
|
|
29e444 |
+PROCINFO_CLASS const char _dl_powerpc_cap_flags[57][10]
|
|
|
29e444 |
#endif
|
|
|
29e444 |
#ifndef PROCINFO_DECL
|
|
|
29e444 |
= {
|
|
|
29e444 |
@@ -56,6 +56,14 @@ PROCINFO_CLASS const char _dl_powerpc_cap_flags[25][10]
|
|
|
29e444 |
"notb", "efpdouble", "efpsingle", "spe",
|
|
|
29e444 |
"ucache", "4xxmac", "mmu", "fpu",
|
|
|
29e444 |
"altivec", "ppc601", "ppc64", "ppc32",
|
|
|
29e444 |
+ "", "", "", "",
|
|
|
29e444 |
+ "", "", "", "",
|
|
|
29e444 |
+ "", "", "", "",
|
|
|
29e444 |
+ "", "", "", "",
|
|
|
29e444 |
+ "", "", "", "",
|
|
|
29e444 |
+ "", "", "", "",
|
|
|
29e444 |
+ "", "", "tar", "isel",
|
|
|
29e444 |
+ "ebb", "dscr", "htm", "arch_2_07",
|
|
|
29e444 |
}
|
|
|
29e444 |
#endif
|
|
|
29e444 |
#if !defined SHARED || defined PROCINFO_DECL
|
|
|
12745e |
diff --git glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.h glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.h
|
|
|
29e444 |
index 7732ed2..dc3b70e 100644
|
|
|
12745e |
--- glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.h
|
|
|
12745e |
+++ glibc-2.17-c758a686/sysdeps/powerpc/dl-procinfo.h
|
|
|
29e444 |
@@ -20,11 +20,21 @@
|
|
|
29e444 |
#define _DL_PROCINFO_H 1
|
|
|
29e444 |
|
|
|
29e444 |
#include <ldsodefs.h>
|
|
|
29e444 |
-#include <sysdep.h> /* This defines the PPC_FEATURE_* macros. */
|
|
|
29e444 |
+#include <sysdep.h> /* This defines the PPC_FEATURE[2]_* macros. */
|
|
|
29e444 |
|
|
|
29e444 |
/* There are 25 bits used, but they are bits 7..31. */
|
|
|
29e444 |
#define _DL_HWCAP_FIRST 7
|
|
|
29e444 |
-#define _DL_HWCAP_COUNT 32
|
|
|
29e444 |
+
|
|
|
29e444 |
+/* The total number of available bits (including those prior to
|
|
|
29e444 |
+ _DL_HWCAP_FIRST). Some of these bits might not be used. */
|
|
|
29e444 |
+#define _DL_HWCAP_COUNT 64
|
|
|
29e444 |
+
|
|
|
29e444 |
+/* Features started at bit 31 and decremented as new features were added. */
|
|
|
29e444 |
+#define _DL_HWCAP_LAST 31
|
|
|
29e444 |
+
|
|
|
29e444 |
+/* AT_HWCAP2 features started at bit 31 and decremented as new features were
|
|
|
29e444 |
+ added. HWCAP2 feature bits start at bit 0. */
|
|
|
29e444 |
+#define _DL_HWCAP2_LAST 31
|
|
|
29e444 |
|
|
|
29e444 |
/* These bits influence library search. */
|
|
|
29e444 |
#define HWCAP_IMPORTANT (PPC_FEATURE_HAS_ALTIVEC \
|
|
|
29e444 |
@@ -161,18 +171,33 @@ static inline int
|
|
|
29e444 |
__attribute__ ((unused))
|
|
|
29e444 |
_dl_procinfo (unsigned int type, unsigned long int word)
|
|
|
29e444 |
{
|
|
|
29e444 |
- /* Fallback to unknown output mechanism. */
|
|
|
29e444 |
- if (type == AT_HWCAP2)
|
|
|
29e444 |
- return -1;
|
|
|
29e444 |
-
|
|
|
29e444 |
- _dl_printf ("AT_HWCAP: ");
|
|
|
29e444 |
-
|
|
|
29e444 |
- for (int i = _DL_HWCAP_FIRST; i < _DL_HWCAP_COUNT; ++i)
|
|
|
29e444 |
- if (word & (1 << i))
|
|
|
29e444 |
- _dl_printf (" %s", _dl_hwcap_string (i));
|
|
|
29e444 |
-
|
|
|
29e444 |
- _dl_printf ("\n");
|
|
|
29e444 |
-
|
|
|
29e444 |
+ switch(type)
|
|
|
29e444 |
+ {
|
|
|
29e444 |
+ case AT_HWCAP:
|
|
|
29e444 |
+ _dl_printf ("AT_HWCAP: ");
|
|
|
29e444 |
+
|
|
|
29e444 |
+ for (int i = _DL_HWCAP_FIRST; i <= _DL_HWCAP_LAST; ++i)
|
|
|
29e444 |
+ if (word & (1 << i))
|
|
|
29e444 |
+ _dl_printf (" %s", _dl_hwcap_string (i));
|
|
|
29e444 |
+ break;
|
|
|
29e444 |
+ case AT_HWCAP2:
|
|
|
29e444 |
+ {
|
|
|
29e444 |
+ unsigned int offset = _DL_HWCAP_LAST + 1;
|
|
|
29e444 |
+
|
|
|
29e444 |
+ _dl_printf ("AT_HWCAP2: ");
|
|
|
29e444 |
+
|
|
|
29e444 |
+ /* We have to go through them all because the kernel added the
|
|
|
29e444 |
+ AT_HWCAP2 features starting with the high bits. */
|
|
|
29e444 |
+ for (int i = 0; i <= _DL_HWCAP2_LAST; ++i)
|
|
|
29e444 |
+ if (word & (1 << i))
|
|
|
29e444 |
+ _dl_printf (" %s", _dl_hwcap_string (offset + i));
|
|
|
29e444 |
+ break;
|
|
|
29e444 |
+ }
|
|
|
29e444 |
+ default:
|
|
|
29e444 |
+ /* This should not happen. */
|
|
|
29e444 |
+ return -1;
|
|
|
29e444 |
+ }
|
|
|
29e444 |
+ _dl_printf ("\n");
|
|
|
29e444 |
return 0;
|
|
|
29e444 |
}
|
|
|
29e444 |
#endif
|
|
|
12745e |
diff --git glibc-2.17-c758a686/sysdeps/powerpc/rtld-global-offsets.sym glibc-2.17-c758a686/sysdeps/powerpc/rtld-global-offsets.sym
|
|
|
29e444 |
index ff4e97f..f5ea5a1 100644
|
|
|
12745e |
--- glibc-2.17-c758a686/sysdeps/powerpc/rtld-global-offsets.sym
|
|
|
12745e |
+++ glibc-2.17-c758a686/sysdeps/powerpc/rtld-global-offsets.sym
|
|
|
29e444 |
@@ -5,3 +5,4 @@
|
|
|
29e444 |
#define rtld_global_ro_offsetof(mem) offsetof (struct rtld_global_ro, mem)
|
|
|
29e444 |
|
|
|
29e444 |
RTLD_GLOBAL_RO_DL_HWCAP_OFFSET rtld_global_ro_offsetof (_dl_hwcap)
|
|
|
29e444 |
+RTLD_GLOBAL_RO_DL_HWCAP2_OFFSET rtld_global_ro_offsetof (_dl_hwcap2)
|
|
|
29e444 |
--
|
|
|
29e444 |
1.7.11.7
|
|
|
29e444 |
|