(root)/
glibc-2.38/
misc/
getauxval.c
       1  /* Copyright (C) 2012-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       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 <sys/auxv.h>
      19  #include <errno.h>
      20  #include <ldsodefs.h>
      21  #include <stdbool.h>
      22  
      23  bool
      24  __getauxval2 (unsigned long int type, unsigned long int *result)
      25  {
      26  #ifdef HAVE_AUX_VECTOR
      27    ElfW(auxv_t) *p;
      28  #endif
      29  
      30    if (type == AT_HWCAP)
      31      {
      32        *result = GLRO(dl_hwcap);
      33        return true;
      34      }
      35    else if (type == AT_HWCAP2)
      36      {
      37        *result = GLRO(dl_hwcap2);
      38        return true;
      39      }
      40  
      41  #ifdef HAVE_AUX_VECTOR
      42    for (p = GLRO(dl_auxv); p->a_type != AT_NULL; p++)
      43      if (p->a_type == type)
      44        {
      45          *result = p->a_un.a_val;
      46          return true;
      47        }
      48  #endif
      49  
      50    return false;
      51  }
      52  libc_hidden_def (__getauxval2)
      53  
      54  unsigned long int
      55  __getauxval (unsigned long int type)
      56  {
      57    unsigned long int result;
      58  
      59    if (__getauxval2 (type, &result))
      60      return result;
      61  
      62    __set_errno (ENOENT);
      63    return 0;
      64  }
      65  
      66  weak_alias (__getauxval, getauxval)
      67  libc_hidden_def (__getauxval)