Re: [PATCH v4 2/2] powerpc/64: Option to use ELF V2 ABI for big-endian kernels
On Fri, Jun 11, 2021 at 11:58:19AM +0200, Michal Suchánek wrote: > On Fri, Jun 11, 2021 at 07:39:59PM +1000, Nicholas Piggin wrote: > > Provide an option to build big-endian kernels using the ELFv2 ABI. This > > works on GCC only so far, although it is rumored to work with clang > > that's not been tested yet. A new module version check ensures the > > module ELF ABI level matches the kernel build. > > > > This can give big-endian kernels some useful advantages of the ELFv2 ABI > > (e.g., less stack usage, -mprofile-kernel, better compatibility with eBPF > > tools). > > > > BE+ELFv2 is not officially supported by the GNU toolchain, but it works > > fine in testing and has been used by some userspace for some time (e.g., > > Void Linux). > > > > Tested-by: Michal Suchánek > > Reviewed-by: Segher Boessenkool > > Signed-off-by: Nicholas Piggin > > --- > > arch/powerpc/Kconfig| 22 ++ > > arch/powerpc/Makefile | 18 -- > > arch/powerpc/boot/Makefile | 4 +++- > > arch/powerpc/include/asm/module.h | 24 > > arch/powerpc/kernel/vdso64/Makefile | 13 + > > drivers/crypto/vmx/Makefile | 8 ++-- > > drivers/crypto/vmx/ppc-xlate.pl | 10 ++ > > 7 files changed, 86 insertions(+), 13 deletions(-) > > > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > > index 088dd2afcfe4..093f973a28b9 100644 > > --- a/arch/powerpc/Kconfig > > +++ b/arch/powerpc/Kconfig > > @@ -163,6 +163,7 @@ config PPC > > select ARCH_WEAK_RELEASE_ACQUIRE > > select BINFMT_ELF > > select BUILDTIME_TABLE_SORT > > + select PPC64_BUILD_ELF_V2_ABI if PPC64 && CPU_LITTLE_ENDIAN > > select CLONE_BACKWARDS > > select DCACHE_WORD_ACCESS if PPC64 && CPU_LITTLE_ENDIAN > > select DMA_OPS_BYPASS if PPC64 > > @@ -561,6 +562,27 @@ config KEXEC_FILE > > config ARCH_HAS_KEXEC_PURGATORY > > def_bool KEXEC_FILE > > > > +config PPC64_BUILD_ELF_V2_ABI > > + bool > > + > > +config PPC64_BUILD_BIG_ENDIAN_ELF_V2_ABI > > + bool "Build big-endian kernel using ELF ABI V2 (EXPERIMENTAL)" > > + depends on PPC64 && CPU_BIG_ENDIAN && EXPERT > > + depends on CC_IS_GCC && LD_VERSION >= 22400 > > + default n > > + select PPC64_BUILD_ELF_V2_ABI > > + help > > + This builds the kernel image using the "Power Architecture 64-Bit ELF > > + V2 ABI Specification", which has a reduced stack overhead and faster > > + function calls. This internal kernel ABI option does not affect > > + userspace compatibility. > > + > > + The V2 ABI is standard for 64-bit little-endian, but for big-endian > > + it is less well tested by kernel and toolchain. However some distros > > + build userspace this way, and it can produce a functioning kernel. > > + > > + This requires GCC and binutils 2.24 or newer. > > + > > config RELOCATABLE > > bool "Build a relocatable kernel" > > depends on PPC64 || (FLATMEM && (44x || FSL_BOOKE)) > > diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile > > index 3212d076ac6a..b90b5cb799aa 100644 > > --- a/arch/powerpc/Makefile > > +++ b/arch/powerpc/Makefile > > @@ -91,10 +91,14 @@ endif > > > > ifdef CONFIG_PPC64 > > ifndef CONFIG_CC_IS_CLANG > > -cflags-$(CONFIG_CPU_BIG_ENDIAN)+= $(call cc-option,-mabi=elfv1) > > -cflags-$(CONFIG_CPU_BIG_ENDIAN)+= $(call > > cc-option,-mcall-aixdesc) > > -aflags-$(CONFIG_CPU_BIG_ENDIAN)+= $(call cc-option,-mabi=elfv1) > > -aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mabi=elfv2 > > +ifdef CONFIG_PPC64_BUILD_ELF_V2_ABI > > +cflags-y += $(call cc-option,-mabi=elfv2) > > +aflags-y += $(call cc-option,-mabi=elfv2) > > +else > > +cflags-y += $(call cc-option,-mabi=elfv1) > > +cflags-y += $(call cc-option,-mcall-aixdesc) > > +aflags-y += $(call cc-option,-mabi=elfv1) > > +endif > > endif > > endif > > > > @@ -142,15 +146,17 @@ endif > > > > CFLAGS-$(CONFIG_PPC64) := $(call cc-option,-mtraceback=no) > > ifndef CONFIG_CC_IS_CLANG > > -ifdef CONFIG_CPU_LITTLE_ENDIAN > > -CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2,$(call > > cc-option,-mcall-aixdesc)) > > +ifdef CONFIG_PPC64_BUILD_ELF_V2_ABI > > +CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2) > > AFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2) > > else > > +# Keep these in synch with arch/powerpc/kernel/vdso64/Makefile > > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1) > > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcall-aixdesc) > > AFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1) > > endif > > endif > > + > > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call > > cc-option,-mminimal-toc)) > > CFLAGS-$(CONFIG_PPC64) += $(call >
Re: [PATCH v4 2/2] powerpc/64: Option to use ELF V2 ABI for big-endian kernels
On Fri, Jun 11, 2021 at 07:39:59PM +1000, Nicholas Piggin wrote: > Provide an option to build big-endian kernels using the ELFv2 ABI. This > works on GCC only so far, although it is rumored to work with clang > that's not been tested yet. A new module version check ensures the > module ELF ABI level matches the kernel build. > > This can give big-endian kernels some useful advantages of the ELFv2 ABI > (e.g., less stack usage, -mprofile-kernel, better compatibility with eBPF > tools). > > BE+ELFv2 is not officially supported by the GNU toolchain, but it works > fine in testing and has been used by some userspace for some time (e.g., > Void Linux). > > Tested-by: Michal Suchánek > Reviewed-by: Segher Boessenkool > Signed-off-by: Nicholas Piggin > --- > arch/powerpc/Kconfig| 22 ++ > arch/powerpc/Makefile | 18 -- > arch/powerpc/boot/Makefile | 4 +++- > arch/powerpc/include/asm/module.h | 24 > arch/powerpc/kernel/vdso64/Makefile | 13 + > drivers/crypto/vmx/Makefile | 8 ++-- > drivers/crypto/vmx/ppc-xlate.pl | 10 ++ > 7 files changed, 86 insertions(+), 13 deletions(-) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index 088dd2afcfe4..093f973a28b9 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -163,6 +163,7 @@ config PPC > select ARCH_WEAK_RELEASE_ACQUIRE > select BINFMT_ELF > select BUILDTIME_TABLE_SORT > + select PPC64_BUILD_ELF_V2_ABI if PPC64 && CPU_LITTLE_ENDIAN > select CLONE_BACKWARDS > select DCACHE_WORD_ACCESS if PPC64 && CPU_LITTLE_ENDIAN > select DMA_OPS_BYPASS if PPC64 > @@ -561,6 +562,27 @@ config KEXEC_FILE > config ARCH_HAS_KEXEC_PURGATORY > def_bool KEXEC_FILE > > +config PPC64_BUILD_ELF_V2_ABI > + bool > + > +config PPC64_BUILD_BIG_ENDIAN_ELF_V2_ABI > + bool "Build big-endian kernel using ELF ABI V2 (EXPERIMENTAL)" > + depends on PPC64 && CPU_BIG_ENDIAN && EXPERT > + depends on CC_IS_GCC && LD_VERSION >= 22400 > + default n > + select PPC64_BUILD_ELF_V2_ABI > + help > + This builds the kernel image using the "Power Architecture 64-Bit ELF > + V2 ABI Specification", which has a reduced stack overhead and faster > + function calls. This internal kernel ABI option does not affect > + userspace compatibility. > + > + The V2 ABI is standard for 64-bit little-endian, but for big-endian > + it is less well tested by kernel and toolchain. However some distros > + build userspace this way, and it can produce a functioning kernel. > + > + This requires GCC and binutils 2.24 or newer. > + > config RELOCATABLE > bool "Build a relocatable kernel" > depends on PPC64 || (FLATMEM && (44x || FSL_BOOKE)) > diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile > index 3212d076ac6a..b90b5cb799aa 100644 > --- a/arch/powerpc/Makefile > +++ b/arch/powerpc/Makefile > @@ -91,10 +91,14 @@ endif > > ifdef CONFIG_PPC64 > ifndef CONFIG_CC_IS_CLANG > -cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mabi=elfv1) > -cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call > cc-option,-mcall-aixdesc) > -aflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mabi=elfv1) > -aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mabi=elfv2 > +ifdef CONFIG_PPC64_BUILD_ELF_V2_ABI > +cflags-y += $(call cc-option,-mabi=elfv2) > +aflags-y += $(call cc-option,-mabi=elfv2) > +else > +cflags-y += $(call cc-option,-mabi=elfv1) > +cflags-y += $(call cc-option,-mcall-aixdesc) > +aflags-y += $(call cc-option,-mabi=elfv1) > +endif > endif > endif > > @@ -142,15 +146,17 @@ endif > > CFLAGS-$(CONFIG_PPC64) := $(call cc-option,-mtraceback=no) > ifndef CONFIG_CC_IS_CLANG > -ifdef CONFIG_CPU_LITTLE_ENDIAN > -CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2,$(call > cc-option,-mcall-aixdesc)) > +ifdef CONFIG_PPC64_BUILD_ELF_V2_ABI > +CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2) > AFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2) > else > +# Keep these in synch with arch/powerpc/kernel/vdso64/Makefile > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1) > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcall-aixdesc) > AFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1) > endif > endif > + > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call > cc-option,-mminimal-toc)) > CFLAGS-$(CONFIG_PPC64) += $(call > cc-option,-mno-pointers-to-nested-functions) > > diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile > index 2b8da923ceca..be84a72f8258 100644 > --- a/arch/powerpc/boot/Makefile > +++ b/