Commit 5017b459 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

powerpc/64: Option to build big-endian with ELFv2 ABI



Provide an option to build big-endian kernels using the ELFv2 ABI. This
works on GCC only for now. Clang is rumored to support this, but core
build files need updating first, at least.

This gives big-endian kernels useful advantages of the ELFv2 ABI, e.g.,
less stack usage, -mprofile-kernel support, 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: default avatarMichal Suchánek <msuchanek@suse.de>
Reviewed-by: default avatarSegher Boessenkool <segher@kernel.crashing.org>
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Reviewed-by: default avatarJoel Stanley <joel@jms.id.au>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221128041539.1742489-5-npiggin@gmail.com
parent 505ea330
Loading
Loading
Loading
Loading
+21 −0
Original line number Original line Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
# SPDX-License-Identifier: GPL-2.0
source "arch/powerpc/platforms/Kconfig.cputype"
source "arch/powerpc/platforms/Kconfig.cputype"


config CC_HAS_ELFV2
	def_bool PPC64 && $(cc-option, -mabi=elfv2)

config 32BIT
config 32BIT
	bool
	bool
	default y if PPC32
	default y if PPC32
@@ -586,6 +589,24 @@ config KEXEC_FILE
config ARCH_HAS_KEXEC_PURGATORY
config ARCH_HAS_KEXEC_PURGATORY
	def_bool KEXEC_FILE
	def_bool KEXEC_FILE


config PPC64_BIG_ENDIAN_ELF_ABI_V2
	bool "Build big-endian kernel using ELF ABI V2 (EXPERIMENTAL)"
	depends on PPC64 && CPU_BIG_ENDIAN
	depends on CC_HAS_ELFV2
	depends on LD_IS_BFD && LD_VERSION >= 22400
	default n
	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
config RELOCATABLE
	bool "Build a relocatable kernel"
	bool "Build a relocatable kernel"
	depends on PPC64 || (FLATMEM && (44x || PPC_85xx))
	depends on PPC64 || (FLATMEM && (44x || PPC_85xx))
+2 −2
Original line number Original line Diff line number Diff line
@@ -580,10 +580,10 @@ config CPU_LITTLE_ENDIAN
endchoice
endchoice


config PPC64_ELF_ABI_V1
config PPC64_ELF_ABI_V1
	def_bool PPC64 && CPU_BIG_ENDIAN
	def_bool PPC64 && (CPU_BIG_ENDIAN && !PPC64_BIG_ENDIAN_ELF_ABI_V2)


config PPC64_ELF_ABI_V2
config PPC64_ELF_ABI_V2
	def_bool PPC64 && CPU_LITTLE_ENDIAN
	def_bool PPC64 && !PPC64_ELF_ABI_V1


config PPC64_BOOT_WRAPPER
config PPC64_BOOT_WRAPPER
	def_bool n
	def_bool n