[PATCH] arm64: Generate cpucaps.h

Mark Rutland mark.rutland at arm.com
Thu May 13 04:51:39 PDT 2021


On Thu, May 13, 2021 at 10:35:04AM +0530, Anshuman Khandual wrote:
> 
> On 4/28/21 5:42 PM, Mark Brown wrote:
> > The arm64 code allocates an internal constant to every CPU feature it can
> > detect, distinct from the public hwcap numbers we use to expose some
> > features to userspace. Currently this is maintained manually which is an
> > irritating source of conflicts when working on new features, to avoid this
> > replace the header with a simple text file listing the names we've assigned
> > and sort it to minimise conflicts.
> > 
> > As part of doing this we also do the Kbuild hookup required to hook up
> > an arch tools directory and to generate header files in there.
> > 
> > This will result in a renumbering and reordering of the existing constants,
> > since they are all internal only the values should not be important. The
> > reordering will impact the order in which some steps in enumeration handle
> > features but the algorithm is not intended to depend on this and I haven't
> > seen any issues when testing. Due to the UAO cpucap having been removed in
> > the past we end up with ARM64_NCAPS being 1 smaller than it was before.
> > 
> > Signed-off-by: Mark Brown <broonie at kernel.org>
> > ---
> >  arch/arm64/Makefile              |  3 ++
> >  arch/arm64/include/asm/Kbuild    |  2 +
> >  arch/arm64/include/asm/cpucaps.h | 74 --------------------------------
> >  arch/arm64/tools/Makefile        | 22 ++++++++++
> >  arch/arm64/tools/cpucaps         | 65 ++++++++++++++++++++++++++++
> >  arch/arm64/tools/gen-cpucaps.awk | 40 +++++++++++++++++
> >  6 files changed, 132 insertions(+), 74 deletions(-)
> >  delete mode 100644 arch/arm64/include/asm/cpucaps.h
> >  create mode 100644 arch/arm64/tools/Makefile
> >  create mode 100644 arch/arm64/tools/cpucaps
> >  create mode 100755 arch/arm64/tools/gen-cpucaps.awk
> > 
> > diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
> > index 7ef44478560d..b52481f0605d 100644
> > --- a/arch/arm64/Makefile
> > +++ b/arch/arm64/Makefile
> > @@ -175,6 +175,9 @@ vdso_install:
> >  	$(if $(CONFIG_COMPAT_VDSO), \
> >  		$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso32 $@)
> >  
> > +archprepare:
> > +	$(Q)$(MAKE) $(build)=arch/arm64/tools kapi
> 
> Small nit. So going forward this new directory (arch/arm64/tools/), will
> be used to hold similar scripts that generate header or similar things ?
> At first the directory name 'tool' was bit confusing but seems like other
> archs (arm, m68k, mips, powerpc, s390, sh) have this directory as well.

Yup; there's more stuff we might want to put here in future, e.g.

* Generation of (or consistency-checks) for the kernel HWCAP glue
* Generation of the sysreg headers
* Generation of the insn code
* Generation of metadata (or consistency checks) for
  RELIABLE_STACKTRACE, LIVEPATCH, etc

[...]

> > +BEGIN {
> > +	print "#ifndef __ASM_CPUCAPS_H"
> > +	print "#define __ASM_CPUCAPS_H"
> > +	print ""
> > +	print "/* Generated file - do not edit */"
> > +	cap_num = 0
> > +	print ""
> > +}
> > +
> > +/^[vA-Z0-9_]+$/ {
> 
> Small nit. Should this be length restricted at the least ?
> Like each CAP entries should not exceed a certain length.

I don't think we should enforce a length limit in the script, as we'd
have to select an arbitrary limit, and given we should catch exceedingly
long names during review, I think it's more likely to be a hindrance
than a help (e.g. if we ever bump up against that limit).

> > +	printf("#define ARM64_%-30s\t%d\n", $0, cap_num++)
> > +	next
> > +}
> > +
> > +END {
> > +	printf("#define ARM64_NCAPS\t\t\t\t%d\n", cap_num)
> > +	print ""
> > +	print "#endif"
> 
> Small nit. Should it be print "#endif /* __ASM_CPUCAPS_H */" instead
> in order to be complete.

Agreed; that would be nice.

Thanks,
Mark.



More information about the linux-arm-kernel mailing list