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

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
# 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 ...@@ -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))
......
...@@ -580,10 +580,10 @@ config CPU_LITTLE_ENDIAN ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment