From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17874 invoked by alias); 14 Sep 2006 15:23:34 -0000 Received: (qmail 17849 invoked by uid 22791); 14 Sep 2006 15:23:34 -0000 X-Spam-Check-By: sourceware.org Received: from sunsite.ms.mff.cuni.cz (HELO sunsite.mff.cuni.cz) (195.113.15.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 14 Sep 2006 15:23:27 +0000 Received: from sunsite.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by sunsite.mff.cuni.cz (8.13.1/8.13.1) with ESMTP id k8EFNL0Q002765; Thu, 14 Sep 2006 17:23:21 +0200 Received: (from jj@localhost) by sunsite.mff.cuni.cz (8.13.1/8.13.1/Submit) id k8EFNHaI002762; Thu, 14 Sep 2006 17:23:17 +0200 Date: Thu, 14 Sep 2006 15:23:00 -0000 From: Jakub Jelinek To: Ulrich Drepper , Steven Munroe Cc: Glibc hackers Subject: [PATCH] Use AT_PLATFORM and limit the number of important hwcap bits on PPC Message-ID: <20060914152316.GH4556@sunsite.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2006-09/txt/msg00023.txt.bz2 Hi! For LD_LIBRARY_PATH, ld.so uses AT_PLATFORM whenever it is set by the kernel, even if it is not listed in dl-procinfo.[ch] (that only matters for ldconfig). So, currently e.g. on G5 we look a huge number of dirs: 14931: trying file=/lib/tls/ppc970/altivec/power4/libc.so.6 14931: trying file=/lib/tls/ppc970/altivec/libc.so.6 14931: trying file=/lib/tls/ppc970/power4/libc.so.6 14931: trying file=/lib/tls/ppc970/libc.so.6 14931: trying file=/lib/tls/altivec/power4/libc.so.6 14931: trying file=/lib/tls/altivec/libc.so.6 14931: trying file=/lib/tls/power4/libc.so.6 14931: trying file=/lib/tls/libc.so.6 14931: trying file=/lib/ppc970/altivec/power4/libc.so.6 14931: trying file=/lib/ppc970/altivec/libc.so.6 14931: trying file=/lib/ppc970/power4/libc.so.6 14931: trying file=/lib/ppc970/libc.so.6 14931: trying file=/lib/altivec/power4/libc.so.6 14931: trying file=/lib/altivec/libc.so.6 14931: trying file=/lib/power4/libc.so.6 14931: trying file=/lib/libc.so.6 The following patch limits important hwcaps to just altivec (as it is present on multiple different platforms, ppc970 (aka G5), ppc74{0,5}0, ppc-cell-be (and arch_2_05?)) and adds booke which is also set on 4 different platforms. The power4/power5/power5+ bits seem to be completely redundant with the platform name. I haven't included all platforms in dl-procinfo*, as I don't think we need to list there prehistoric CPUs (for which non-optimized libs are good enough anyway) and embedded stuff (as for embedded use you rarely want to choose different libcs based on which chip you are on, you pretty much know which chip it is), listing there all 24 platforms kernel now lists would be a waste, especially for the scarce bit space in ldconfig's mask (we have at most 31 bits there for platform and any other future uses, so if we now take 6 bits out of this for the common contemporary CPUs, we still have a big reserve for the future). 2006-09-14 Jakub Jelinek * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_cap_flags): Add "booke" to the beginning. (_dl_powerpc_platforms): New. * sysdeps/powerpc/dl-procinfo.h (_DL_HWCAP_FIRST): Decrease. (HWCAP_IMPORTANT): Remove power{4,5,5+} and cell, add booke. (_DL_PLATFORMS_COUNT, _DL_FIRST_PLATFORM): Define. (_DL_HWCAP_PLATFORM): Define to new mask. (_dl_platform_string, _dl_string_platform): New functions. * sysdeps/powerpc/sysdep.h (PPC_FEATURE_BOOKE): Define. --- libc/sysdeps/powerpc/dl-procinfo.c.jj 2006-09-14 13:55:06.000000000 +0200 +++ libc/sysdeps/powerpc/dl-procinfo.c 2006-09-14 16:41:23.000000000 +0200 @@ -1,5 +1,5 @@ /* Data for processor capability information. PowerPC version. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -46,10 +46,11 @@ #if !defined PROCINFO_DECL && defined SHARED ._dl_powerpc_cap_flags #else -PROCINFO_CLASS const char _dl_powerpc_cap_flags[16][10] +PROCINFO_CLASS const char _dl_powerpc_cap_flags[17][10] #endif #ifndef PROCINFO_DECL = { + "booke", "cell", "power5+", "power5", "power4", "notb", "efpdouble", "efpsingle", "spe", "ucache", "4xxmac", "mmu", "fpu", @@ -62,5 +63,21 @@ PROCINFO_CLASS const char _dl_powerpc_ca , #endif +#if !defined PROCINFO_DECL && defined SHARED + ._dl_powerpc_platforms +#else +PROCINFO_CLASS const char _dl_powerpc_platforms[6][12] +#endif +#ifndef PROCINFO_DECL += { + "power4", "ppc970", "power5", "power5+", "power6", "ppc-cell-be" + } +#endif +#if !defined SHARED || defined PROCINFO_DECL +; +#else +, +#endif + #undef PROCINFO_DECL #undef PROCINFO_CLASS --- libc/sysdeps/powerpc/dl-procinfo.h.jj 2006-09-14 13:55:06.000000000 +0200 +++ libc/sysdeps/powerpc/dl-procinfo.h 2006-09-14 16:12:47.000000000 +0200 @@ -1,5 +1,5 @@ /* Processor capability information handling macros. PowerPC version. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,27 +23,34 @@ #include #include /* This defines the PPC_FEATURE_* macros. */ -/* There are 16 bits used, but they are bits 16..31. */ -#define _DL_HWCAP_FIRST 16 +/* There are 17 bits used, but they are bits 15..31. */ +#define _DL_HWCAP_FIRST 15 #define _DL_HWCAP_COUNT 32 /* These bits influence library search. */ -#define HWCAP_IMPORTANT (PPC_FEATURE_HAS_ALTIVEC \ - | PPC_FEATURE_POWER4 \ - | PPC_FEATURE_POWER5 \ - | PPC_FEATURE_POWER5_PLUS \ - | PPC_FEATURE_CELL) - -/* We don't use AT_PLATFORM. */ -#define _DL_HWCAP_PLATFORM 0 -#define _dl_string_platform(str) (-1) +#define HWCAP_IMPORTANT (PPC_FEATURE_HAS_ALTIVEC \ + | PPC_FEATURE_BOOKE) + +#define _DL_PLATFORMS_COUNT 6 + +#define _DL_FIRST_PLATFORM 32 +/* Mask to filter out platforms. */ +#define _DL_HWCAP_PLATFORM (((1ULL << _DL_PLATFORMS_COUNT) - 1) \ + << _DL_FIRST_PLATFORM) static inline const char * __attribute__ ((unused)) _dl_hwcap_string (int idx) { return GLRO(dl_powerpc_cap_flags)[idx - _DL_HWCAP_FIRST]; -}; +} + +static inline const char * +__attribute__ ((unused)) +_dl_platform_string (int idx) +{ + return GLRO(dl_powerpc_platforms)[idx - _DL_FIRST_PLATFORM]; +} static inline int __attribute__ ((unused)) @@ -53,7 +60,48 @@ _dl_string_hwcap (const char *str) if (strcmp (str, _dl_hwcap_string (i)) == 0) return i; return -1; -}; +} + +static inline int +__attribute__ ((unused, always_inline)) +_dl_string_platform (const char *str) +{ + if (str == NULL) + return -1; + + if (strncmp (str, GLRO(dl_powerpc_platforms)[0], 5) == 0) + { + int ret; + str += 5; + switch (*str) + { + case '4': + ret = _DL_FIRST_PLATFORM + 0; + break; + case '5': + ret = _DL_FIRST_PLATFORM + 2; + if (str[1] == '+') + ++ret, ++str; + break; + case '6': + ret = _DL_FIRST_PLATFORM + 4; + break; + default: + return -1; + } + if (str[1] == '\0') + return ret; + } + else if (strncmp (str, GLRO(dl_powerpc_platforms)[1], 3) == 0) + { + if (strcmp (str + 3, GLRO(dl_powerpc_platforms)[1] + 3) == 0) + return _DL_FIRST_PLATFORM + 1; + else if (strcmp (str + 3, GLRO(dl_powerpc_platforms)[5] + 3) == 0) + return _DL_FIRST_PLATFORM + 5; + } + + return -1; +} #ifdef IS_IN_rtld static inline int --- libc/sysdeps/powerpc/sysdep.h.jj 2005-11-21 12:07:50.000000000 +0100 +++ libc/sysdeps/powerpc/sysdep.h 2006-09-14 16:11:34.000000000 +0200 @@ -37,6 +37,7 @@ #define PPC_FEATURE_POWER5 0x00040000 /* POWER5 microarch level */ #define PPC_FEATURE_POWER5_PLUS 0x00020000 /* POWER5+ microarch level */ #define PPC_FEATURE_CELL 0x00010000 /* CELL PU microarch level */ +#define PPC_FEATURE_BOOKE 0x00008000 #define PPC_FEATURE_970 (PPC_FEATURE_POWER4 + PPC_FEATURE_HAS_ALTIVEC) #ifdef __ASSEMBLER__ Jakub