1  /* This file is part of the GNU C Library.
       2     Copyright (C) 2013-2023 Free Software Foundation, Inc.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <ldsodefs.h>
      19  
      20  /* The code checks if _rtld_global_ro was realocated before trying to access
      21     the dl_hwcap field. The assembly is to make the compiler not optimize the
      22     test (&_rtld_global_ro != NULL), which is always true in ISO C (but not
      23     in that case since _rtld_global_ro might not been realocated yet).  */
      24  #if defined(SHARED) && !IS_IN (rtld)
      25  # define __GLRO(value) \
      26    ({ volatile void **__p = (volatile void**)(&_rtld_global_ro);	\
      27      unsigned long int __ret;					\
      28       asm ("# x in %0" : "+r" (__p));				\
      29       __ret = (__p) ? GLRO(value) : 0;				\
      30       __ret; })
      31  #else
      32  # define __GLRO(value)  GLRO(value)
      33  #endif
      34  
      35  /* dl_hwcap contains only the latest supported ISA, the macro checks which is
      36     and fills the previous ones.  */
      37  #define INIT_ARCH() \
      38    unsigned long int hwcap = __GLRO(dl_hwcap); 			\
      39    unsigned long int __attribute__((unused)) hwcap2 = __GLRO(dl_hwcap2); \
      40    bool __attribute__((unused)) use_cached_memopt =		\
      41      __GLRO(dl_powerpc_cpu_features.use_cached_memopt);		\
      42    if (hwcap & PPC_FEATURE_ARCH_2_06)				\
      43      hwcap |= PPC_FEATURE_ARCH_2_05 |				\
      44  	     PPC_FEATURE_POWER5_PLUS |				\
      45  	     PPC_FEATURE_POWER5 |				\
      46  	     PPC_FEATURE_POWER4;				\
      47    else if (hwcap & PPC_FEATURE_ARCH_2_05)			\
      48      hwcap |= PPC_FEATURE_POWER5_PLUS |				\
      49  	     PPC_FEATURE_POWER5 |				\
      50  	     PPC_FEATURE_POWER4;				\
      51    else if (hwcap & PPC_FEATURE_POWER5_PLUS)			\
      52      hwcap |= PPC_FEATURE_POWER5 |				\
      53  	     PPC_FEATURE_POWER4;				\
      54    else if (hwcap & PPC_FEATURE_POWER5)				\
      55      hwcap |= PPC_FEATURE_POWER4;