| /* Get system-specific information at run-time. Linux/powerpc version. |
| Copyright (C) 2017-2018 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 |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #include <errno.h> |
| #include <unistd.h> |
| #include <sys/auxv.h> |
| |
| static long linux_sysconf (int name); |
| |
| static inline long |
| auxv2sysconf_cache_associativity (unsigned long type) |
| { |
| return (__getauxval (type) & 0xffff0000) >> 16; |
| } |
| |
| static inline long |
| auxv2sysconf_cache_linesize (unsigned long type) |
| { |
| return __getauxval (type) & 0xffff; |
| } |
| |
| /* Get the value of the system variable NAME. */ |
| long int |
| __sysconf (int name) |
| { |
| switch (name) |
| { |
| case _SC_LEVEL1_ICACHE_SIZE: |
| return __getauxval (AT_L1I_CACHESIZE); |
| case _SC_LEVEL1_ICACHE_ASSOC: |
| return auxv2sysconf_cache_associativity (AT_L1I_CACHEGEOMETRY); |
| case _SC_LEVEL1_ICACHE_LINESIZE: |
| return auxv2sysconf_cache_linesize (AT_L1I_CACHEGEOMETRY); |
| case _SC_LEVEL1_DCACHE_SIZE: |
| return __getauxval (AT_L1D_CACHESIZE); |
| case _SC_LEVEL1_DCACHE_ASSOC: |
| return auxv2sysconf_cache_associativity (AT_L1D_CACHEGEOMETRY); |
| case _SC_LEVEL1_DCACHE_LINESIZE: |
| return auxv2sysconf_cache_linesize (AT_L1D_CACHEGEOMETRY); |
| case _SC_LEVEL2_CACHE_SIZE: |
| return __getauxval (AT_L2_CACHESIZE); |
| case _SC_LEVEL2_CACHE_ASSOC: |
| return auxv2sysconf_cache_associativity (AT_L2_CACHEGEOMETRY); |
| case _SC_LEVEL2_CACHE_LINESIZE: |
| return auxv2sysconf_cache_linesize (AT_L2_CACHEGEOMETRY); |
| case _SC_LEVEL3_CACHE_SIZE: |
| return __getauxval (AT_L3_CACHESIZE); |
| case _SC_LEVEL3_CACHE_ASSOC: |
| return auxv2sysconf_cache_associativity (AT_L3_CACHEGEOMETRY); |
| case _SC_LEVEL3_CACHE_LINESIZE: |
| return auxv2sysconf_cache_linesize (AT_L3_CACHEGEOMETRY); |
| default: |
| return linux_sysconf (name); |
| } |
| } |
| |
| /* Now the generic Linux version. */ |
| #undef __sysconf |
| #define __sysconf static linux_sysconf |
| #include "../sysconf.c" |