[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