[PATCH 1/1] riscv: Get cache information through sysconf

Zong Li zong.li@sifive.com
Tue Nov 10 06:25:20 GMT 2020


On Fri, Nov 6, 2020 at 12:57 PM Palmer Dabbelt <palmer@dabbelt.com> wrote:
>
> On Mon, 26 Oct 2020 00:24:47 PDT (-0700), zong.li@sifive.com wrote:
> > Add support to query cache information on RISC-V through sysconf()
> > function. The cache information had been added in AUX vector of RISC-V
> > architecture in Linux kernel v.5.10-rc1.
> > ---
> >  sysdeps/unix/sysv/linux/riscv/sysconf.c | 74 +++++++++++++++++++++++++
> >  1 file changed, 74 insertions(+)
> >  create mode 100644 sysdeps/unix/sysv/linux/riscv/sysconf.c
> >
> > diff --git a/sysdeps/unix/sysv/linux/riscv/sysconf.c b/sysdeps/unix/sysv/linux/riscv/sysconf.c
> > new file mode 100644
> > index 0000000000..e73095528c
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/riscv/sysconf.c
> > @@ -0,0 +1,74 @@
> > +/* Copyright (C) 2020 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
> > +   <https://www.gnu.org/licenses/>.  */
> > +
> > +#include <errno.h>
> > +#include <unistd.h>
> > +#include <sys/auxv.h>
> > +
> > +static long int linux_sysconf (int name);
> > +
> > +static inline long int
> > +sysconf_get_cache_associativity (unsigned long type)
> > +{
> > +  return (__getauxval (type) & 0xffff0000) >> 16;
> > +}
> > +
> > +static inline long int
> > +sysconf_get_cache_linesize (unsigned long type)
> > +{
> > +  return __getauxval (type) & 0xffff;
> > +}
> > +
> > +static inline long int
> > +sysconf_get_cache_size (unsigned long type)
> > +{
> > +  return __getauxval (type);
> > +}
> > +
> > +/* Get the value of the system variable NAME.  */
> > +long int
> > +__sysconf (int name)
> > +{
> > +  switch (name)
> > +    {
> > +      case _SC_LEVEL1_ICACHE_SIZE:
> > +     return sysconf_get_cache_size (AT_L1I_CACHESIZE);
> > +      case _SC_LEVEL1_ICACHE_ASSOC:
> > +     return sysconf_get_cache_associativity (AT_L1I_CACHEGEOMETRY);
> > +      case _SC_LEVEL1_ICACHE_LINESIZE:
> > +     return sysconf_get_cache_linesize (AT_L1I_CACHEGEOMETRY);
> > +      case _SC_LEVEL1_DCACHE_SIZE:
> > +     return sysconf_get_cache_size (AT_L1D_CACHESIZE);
> > +      case _SC_LEVEL1_DCACHE_ASSOC:
> > +     return sysconf_get_cache_associativity (AT_L1D_CACHEGEOMETRY);
> > +      case _SC_LEVEL1_DCACHE_LINESIZE:
> > +     return sysconf_get_cache_linesize (AT_L1D_CACHEGEOMETRY);
> > +      case _SC_LEVEL2_CACHE_SIZE:
> > +     return sysconf_get_cache_size (AT_L2_CACHESIZE);
> > +      case _SC_LEVEL2_CACHE_ASSOC:
> > +     return sysconf_get_cache_associativity (AT_L2_CACHEGEOMETRY);
> > +      case _SC_LEVEL2_CACHE_LINESIZE:
> > +     return sysconf_get_cache_linesize (AT_L2_CACHEGEOMETRY);
> > +      default:
> > +     return linux_sysconf (name);
> > +    }
> > +}
> > +
> > +/* Now the generic Linux version.  */
> > +#undef __sysconf
> > +#define __sysconf static linux_sysconf
> > +#include <sysdeps/unix/sysv/linux/sysconf.c>
>
> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>
> Acked-by: Palmer Dabbelt <palmerdabbelt@google.com>

Thanks for the review. Can someone help to pick this patch if it is
good enough, thanks.


More information about the Libc-alpha mailing list