about summary refs log tree commit diff
path: root/sysdeps/s390/dl-procinfo.c
diff options
context:
space:
mode:
authorStefan Liebler <stli@linux.ibm.com>2023-02-02 14:57:50 +0100
committerStefan Liebler <stli@linux.ibm.com>2023-02-07 09:19:27 +0100
commit41f67ccbe92b4fd09e1062b383e55e407ae5bfa1 (patch)
treedfda0fd844157445add9ab30f59eeea659b38dcc /sysdeps/s390/dl-procinfo.c
parent0b9d2d4a76508fdcbd9f421cdd98bf324c22af3c (diff)
downloadglibc-41f67ccbe92b4fd09e1062b383e55e407ae5bfa1.tar.gz
glibc-41f67ccbe92b4fd09e1062b383e55e407ae5bfa1.tar.xz
glibc-41f67ccbe92b4fd09e1062b383e55e407ae5bfa1.zip
S390: Influence hwcaps/stfle via GLIBC_TUNABLES.
This patch enables the option to influence hwcaps and stfle bits used
by the s390 specific ifunc-resolvers.  The currently x86-specific
tunable glibc.cpu.hwcaps is also used on s390x to achieve the task. In
addition the user can also set a CPU arch-level like z13 instead of
single HWCAP and STFLE features.

Note that the tunable only handles the features which are really used
in the IFUNC-resolvers.  All others are ignored as the values are only
used inside glibc.  Thus we can influence:
- HWCAP_S390_VXRS (z13)
- HWCAP_S390_VXRS_EXT (z14)
- HWCAP_S390_VXRS_EXT2 (z15)
- STFLE_MIE3 (z15)

The influenced hwcap/stfle-bits are stored in the s390-specific
cpu_features struct which also contains reserved fields for future
usage.

The ifunc-resolvers and users of stfle bits are adjusted to use the
information from cpu_features struct.

On 31bit, the ELF_MACHINE_IRELATIVE macro is now also defined.
Otherwise the new ifunc-resolvers segfaults as they depend on
the not yet processed_rtld_global_ro@GLIBC_PRIVATE relocation.
Diffstat (limited to 'sysdeps/s390/dl-procinfo.c')
-rw-r--r--sysdeps/s390/dl-procinfo.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/sysdeps/s390/dl-procinfo.c b/sysdeps/s390/dl-procinfo.c
index 52fb6ac488..a6b61e8523 100644
--- a/sysdeps/s390/dl-procinfo.c
+++ b/sysdeps/s390/dl-procinfo.c
@@ -21,5 +21,42 @@
 
 /* Needed by sysdeps/unix/sysv/linux/dl-vdso-setup.c (as included from
    sysdeps/generic/ldsodefs.h).  */
+
+/* All the #ifdefs in the definitions are quite irritating but
+   necessary if we want to avoid duplicating the information.  There
+   are three different modes:
+
+   - PROCINFO_DECL is defined.  This means we are only interested in
+     declarations.
+
+   - PROCINFO_DECL is not defined:
+
+     + if SHARED is defined the file is included in an array
+       initializer.  The .element = { ... } syntax is needed.
+
+     + if SHARED is not defined a normal array initialization is
+       needed.
+  */
+
+#ifndef PROCINFO_CLASS
+# define PROCINFO_CLASS
+#endif
+
+#if !IS_IN (ldconfig)
+# if !defined PROCINFO_DECL && defined SHARED
+  ._dl_s390_cpu_features
+# else
+PROCINFO_CLASS struct cpu_features _dl_s390_cpu_features
+# endif
+# ifndef PROCINFO_DECL
+= { }
+# endif
+# if !defined SHARED || defined PROCINFO_DECL
+;
+# else
+,
+# endif
+#endif
+
 #undef PROCINFO_DECL
 #undef PROCINFO_CLASS