Re: [PATCH] x86: Start removing X86_X32_ABI

From: H. Peter Anvin

Date: Sat May 23 2026 - 17:44:53 EST


On May 23, 2026 2:37:34 AM PDT, Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> wrote:
>The x32 ABI was introduced in v3.4 to leverage the additional registers
>which were available on x86_64 but not on i386 while keeping the smaller
>32bit pointers.
>
>This did not take off. The memory usage usually knows no limit and the
>better performance did not reach a point where certain workloads widely
>move to x32 and use it exclusively. In the meantime Debian introduced a
>patch to disable x32 by default (so it has to be enabled at boot time on
>the command line) because they are afraid of the increased attack
>surface. Fedora as far as I tell has X32 disabled (looking at 7.0-rc5
>rpm in rawhide).
>
>The last syscall for x86_64 is currently at 471. The first x32 starts at
>512 which leaves 40 new syscalls in between. Without the x32 ABI, those
>syscalls could be used since x32 wouldn't be an option and therefore
>reserved.
>
>Since there is practically no real use for x32, start removing it by
>removing the symbol first, not allowing to enable it. Should nothing
>happening within the next half year, lets remove code bits around August
>after the summer break.
>
>Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
>---
> arch/x86/Kconfig | 14 --------------
> 1 file changed, 14 deletions(-)
>
>diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
>index f3f7cb01d69d0..2b246a6125768 100644
>--- a/arch/x86/Kconfig
>+++ b/arch/x86/Kconfig
>@@ -3143,20 +3143,6 @@ config IA32_EMULATION_DEFAULT_DISABLED
> processes and access to 32-bit syscalls. If unsure, leave it to its
> default value.
>
>-config X86_X32_ABI
>- bool "x32 ABI for 64-bit mode"
>- depends on X86_64
>- # llvm-objcopy does not convert x86_64 .note.gnu.property or
>- # compressed debug sections to x86_x32 properly:
>- # https://github.com/ClangBuiltLinux/linux/issues/514
>- # https://github.com/ClangBuiltLinux/linux/issues/1141
>- depends on $(success,$(OBJCOPY) --version | head -n1 | grep -qv llvm)
>- help
>- Include code to run binaries for the x32 native 32-bit ABI
>- for 64-bit processors. An x32 process gets access to the
>- full 64-bit register file and wide data path while leaving
>- pointers at 32 bits for smaller memory footprint.
>-
> config COMPAT_32
> def_bool y
> depends on IA32_EMULATION || X86_32

So I'm not opposed to sunsetting x32; it happened too late to actually be able to become useful (sorry, Knuth.)

However, we can not recycle the syscall numbers. The x32 flag in the syscall number was advisory originally; it was introduced late in the game to work around a design bug in the input subsystem (*).

-hpa

(*) Classic example of taking a binary interface and "translating" it into a text interface, in the process making it worse than either: taking a bitmask and exposing it as a space-separated list unsigned longs in decimal form.