mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-07 06:43:00 +03:00
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.
This commit is contained in:
@@ -19,42 +19,17 @@
|
||||
|
||||
#include <unistd.h>
|
||||
#include <dl-procinfo.h>
|
||||
#include <cpu-features.h>
|
||||
|
||||
#define S390_STFLE_BITS_Z10 34 /* General instructions extension */
|
||||
#define S390_STFLE_BITS_Z196 45 /* Distinct operands, pop ... */
|
||||
#define S390_STFLE_BITS_ARCH13_MIE3 61 /* Miscellaneous-Instruction-Extensions
|
||||
Facility 3, e.g. mvcrl. */
|
||||
|
||||
#define S390_IS_ARCH13_MIE3(STFLE_BITS) \
|
||||
((STFLE_BITS & (1ULL << (63 - S390_STFLE_BITS_ARCH13_MIE3))) != 0)
|
||||
|
||||
#define S390_IS_Z196(STFLE_BITS) \
|
||||
((STFLE_BITS & (1ULL << (63 - S390_STFLE_BITS_Z196))) != 0)
|
||||
|
||||
#define S390_IS_Z10(STFLE_BITS) \
|
||||
((STFLE_BITS & (1ULL << (63 - S390_STFLE_BITS_Z10))) != 0)
|
||||
|
||||
#define S390_STORE_STFLE(STFLE_BITS) \
|
||||
/* We want just 1 double word to be returned. */ \
|
||||
register unsigned long reg0 __asm__("0") = 0; \
|
||||
\
|
||||
__asm__ __volatile__(".machine push" "\n\t" \
|
||||
".machine \"z9-109\"" "\n\t" \
|
||||
".machinemode \"zarch_nohighgprs\"\n\t" \
|
||||
"stfle %0" "\n\t" \
|
||||
".machine pop" "\n" \
|
||||
: "=QS" (STFLE_BITS), "+d" (reg0) \
|
||||
: : "cc");
|
||||
#define s390_libc_ifunc_expr_stfle_init() \
|
||||
unsigned long long stfle_bits = 0ULL; \
|
||||
if (__glibc_likely ((hwcap & HWCAP_S390_STFLE) \
|
||||
&& (hwcap & HWCAP_S390_ZARCH) \
|
||||
&& (hwcap & HWCAP_S390_HIGH_GPRS))) \
|
||||
{ \
|
||||
S390_STORE_STFLE (stfle_bits); \
|
||||
}
|
||||
const unsigned long long *stfle_bits = features->stfle_bits;
|
||||
|
||||
#define s390_libc_ifunc_expr_init() \
|
||||
const struct cpu_features *features = &GLRO(dl_s390_cpu_features); \
|
||||
/* The hwcap from kernel is passed as argument, but we \
|
||||
explicitly use the hwcaps from cpu-features struct. */ \
|
||||
hwcap = features->hwcap;
|
||||
|
||||
#define s390_libc_ifunc_expr_init()
|
||||
#define s390_libc_ifunc_expr(TYPE_FUNC, FUNC, EXPR) \
|
||||
__ifunc (TYPE_FUNC, FUNC, EXPR, unsigned long int hwcap, \
|
||||
s390_libc_ifunc_expr_init);
|
||||
|
Reference in New Issue
Block a user