This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Use AT_PLATFORM and limit the number of important hwcapbits on PPC


Jakub Jelinek wrote:
>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:
>... 
>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.
>  
Correct the these bits should be removed from important mask in favor of
AT_PLATFORM. These bits do designate ISA levels and as such are still
(potentially) useful for runtime test to use specific instructions.

>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).
>
>  
This is similar to a patch I submited in January but seems to have been
ignored. So this patch is ok with only one quible, I was told that I
should not use "cell" as the Official name is "Cell Broadband Engine".
So the HWCAP name should be "cellbe".



>2006-09-14  Jakub Jelinek  <jakub@redhat.com>
>
>	* 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 <ldsodefs.h>
> #include <sysdep.h>		/* 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
>  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]