Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86: Remove toolchain check for X32 ABI capability

Commit 0bf6276392e9 ("x32: Warn and disable rather than error if
binutils too old") added a small test in arch/x86/Makefile because
binutils 2.22 or newer is needed to properly support elf32-x86-64. This
check is no longer necessary, as the minimum supported version of
binutils is 2.23, which is enforced at configuration time with
scripts/min-tool-version.sh.

Remove this check and replace all uses of CONFIG_X86_X32 with
CONFIG_X86_X32_ABI, as two symbols are no longer necessary.

[nathan: Rebase, fix up a few places where CONFIG_X86_X32 was still
used, and simplify commit message to satisfy -tip requirements]

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220314194842.3452-2-nathan@kernel.org

authored by

Masahiro Yamada and committed by
Peter Zijlstra
83a44a4f ed53a0d9

+28 -48
+2 -6
arch/x86/Kconfig
··· 2861 2861 help 2862 2862 Support old a.out binaries in the 32bit emulation. 2863 2863 2864 - config X86_X32 2864 + config X86_X32_ABI 2865 2865 bool "x32 ABI for 64-bit mode" 2866 2866 depends on X86_64 2867 2867 help ··· 2869 2869 for 64-bit processors. An x32 process gets access to the 2870 2870 full 64-bit register file and wide data path while leaving 2871 2871 pointers at 32 bits for smaller memory footprint. 2872 - 2873 - You will need a recent binutils (2.22 or later) with 2874 - elf32_x86_64 support enabled to compile a kernel with this 2875 - option set. 2876 2872 2877 2873 config COMPAT_32 2878 2874 def_bool y ··· 2878 2882 2879 2883 config COMPAT 2880 2884 def_bool y 2881 - depends on IA32_EMULATION || X86_X32 2885 + depends on IA32_EMULATION || X86_X32_ABI 2882 2886 2883 2887 if COMPAT 2884 2888 config COMPAT_FOR_U64_ALIGNMENT
-16
arch/x86/Makefile
··· 152 152 KBUILD_CFLAGS += -mcmodel=kernel 153 153 endif 154 154 155 - ifdef CONFIG_X86_X32 156 - x32_ld_ok := $(call try-run,\ 157 - /bin/echo -e '1: .quad 1b' | \ 158 - $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \ 159 - $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMP.o" && \ 160 - $(LD) -m elf32_x86_64 "$$TMP.o" -o "$$TMP",y,n) 161 - ifeq ($(x32_ld_ok),y) 162 - CONFIG_X86_X32_ABI := y 163 - KBUILD_AFLAGS += -DCONFIG_X86_X32_ABI 164 - KBUILD_CFLAGS += -DCONFIG_X86_X32_ABI 165 - else 166 - $(warning CONFIG_X86_X32 enabled but no binutils support) 167 - endif 168 - endif 169 - export CONFIG_X86_X32_ABI 170 - 171 155 # 172 156 # If the function graph tracer is used with mcount instead of fentry, 173 157 # '-maccumulate-outgoing-args' is needed to prevent a GCC bug
+1 -1
arch/x86/entry/syscalls/Makefile
··· 67 67 syshdr-y += syscalls_32.h 68 68 syshdr-$(CONFIG_X86_64) += unistd_32_ia32.h unistd_64_x32.h 69 69 syshdr-$(CONFIG_X86_64) += syscalls_64.h 70 - syshdr-$(CONFIG_X86_X32) += syscalls_x32.h 70 + syshdr-$(CONFIG_X86_X32_ABI) += syscalls_x32.h 71 71 syshdr-$(CONFIG_XEN) += xen-hypercalls.h 72 72 73 73 uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
+3 -3
arch/x86/include/asm/syscall_wrapper.h
··· 159 159 #endif /* CONFIG_IA32_EMULATION */ 160 160 161 161 162 - #ifdef CONFIG_X86_X32 162 + #ifdef CONFIG_X86_X32_ABI 163 163 /* 164 164 * For the x32 ABI, we need to create a stub for compat_sys_*() which is aware 165 165 * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common ··· 177 177 178 178 #define __X32_COMPAT_SYS_NI(name) \ 179 179 __SYS_NI(x64, compat_sys_##name) 180 - #else /* CONFIG_X86_X32 */ 180 + #else /* CONFIG_X86_X32_ABI */ 181 181 #define __X32_COMPAT_SYS_STUB0(name) 182 182 #define __X32_COMPAT_SYS_STUBx(x, name, ...) 183 183 #define __X32_COMPAT_COND_SYSCALL(name) 184 184 #define __X32_COMPAT_SYS_NI(name) 185 - #endif /* CONFIG_X86_X32 */ 185 + #endif /* CONFIG_X86_X32_ABI */ 186 186 187 187 188 188 #ifdef CONFIG_COMPAT
+1 -1
arch/x86/include/asm/vdso.h
··· 37 37 extern const struct vdso_image vdso_image_64; 38 38 #endif 39 39 40 - #ifdef CONFIG_X86_X32 40 + #ifdef CONFIG_X86_X32_ABI 41 41 extern const struct vdso_image vdso_image_x32; 42 42 #endif 43 43
+1 -1
arch/x86/kernel/process_64.c
··· 681 681 682 682 static void __set_personality_x32(void) 683 683 { 684 - #ifdef CONFIG_X86_X32 684 + #ifdef CONFIG_X86_X32_ABI 685 685 if (current->mm) 686 686 current->mm->context.flags = 0; 687 687
+1 -1
fs/fuse/ioctl.c
··· 170 170 #else 171 171 if (flags & FUSE_IOCTL_COMPAT) { 172 172 inarg.flags |= FUSE_IOCTL_32BIT; 173 - #ifdef CONFIG_X86_X32 173 + #ifdef CONFIG_X86_X32_ABI 174 174 if (in_x32_syscall()) 175 175 inarg.flags |= FUSE_IOCTL_COMPAT_X32; 176 176 #endif
+1 -1
fs/xfs/xfs_ioctl32.c
··· 217 217 inumbers_fmt_pf inumbers_func = xfs_fsinumbers_fmt_compat; 218 218 bulkstat_one_fmt_pf bs_one_func = xfs_fsbulkstat_one_fmt_compat; 219 219 220 - #ifdef CONFIG_X86_X32 220 + #ifdef CONFIG_X86_X32_ABI 221 221 if (in_x32_syscall()) { 222 222 /* 223 223 * ... but on x32 the input xfs_fsop_bulkreq has pointers
+8 -8
sound/core/control_compat.c
··· 150 150 unsigned char reserved[128]; 151 151 }; 152 152 153 - #ifdef CONFIG_X86_X32 153 + #ifdef CONFIG_X86_X32_ABI 154 154 /* x32 has a different alignment for 64bit values from ia32 */ 155 155 struct snd_ctl_elem_value_x32 { 156 156 struct snd_ctl_elem_id id; ··· 162 162 } value; 163 163 unsigned char reserved[128]; 164 164 }; 165 - #endif /* CONFIG_X86_X32 */ 165 + #endif /* CONFIG_X86_X32_ABI */ 166 166 167 167 /* get the value type and count of the control */ 168 168 static int get_ctl_type(struct snd_card *card, struct snd_ctl_elem_id *id, ··· 347 347 return ctl_elem_write_user(file, data32, &data32->value); 348 348 } 349 349 350 - #ifdef CONFIG_X86_X32 350 + #ifdef CONFIG_X86_X32_ABI 351 351 static int snd_ctl_elem_read_user_x32(struct snd_card *card, 352 352 struct snd_ctl_elem_value_x32 __user *data32) 353 353 { ··· 359 359 { 360 360 return ctl_elem_write_user(file, data32, &data32->value); 361 361 } 362 - #endif /* CONFIG_X86_X32 */ 362 + #endif /* CONFIG_X86_X32_ABI */ 363 363 364 364 /* add or replace a user control */ 365 365 static int snd_ctl_elem_add_compat(struct snd_ctl_file *file, ··· 418 418 SNDRV_CTL_IOCTL_ELEM_WRITE32 = _IOWR('U', 0x13, struct snd_ctl_elem_value32), 419 419 SNDRV_CTL_IOCTL_ELEM_ADD32 = _IOWR('U', 0x17, struct snd_ctl_elem_info32), 420 420 SNDRV_CTL_IOCTL_ELEM_REPLACE32 = _IOWR('U', 0x18, struct snd_ctl_elem_info32), 421 - #ifdef CONFIG_X86_X32 421 + #ifdef CONFIG_X86_X32_ABI 422 422 SNDRV_CTL_IOCTL_ELEM_READ_X32 = _IOWR('U', 0x12, struct snd_ctl_elem_value_x32), 423 423 SNDRV_CTL_IOCTL_ELEM_WRITE_X32 = _IOWR('U', 0x13, struct snd_ctl_elem_value_x32), 424 - #endif /* CONFIG_X86_X32 */ 424 + #endif /* CONFIG_X86_X32_ABI */ 425 425 }; 426 426 427 427 static inline long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg) ··· 460 460 return snd_ctl_elem_add_compat(ctl, argp, 0); 461 461 case SNDRV_CTL_IOCTL_ELEM_REPLACE32: 462 462 return snd_ctl_elem_add_compat(ctl, argp, 1); 463 - #ifdef CONFIG_X86_X32 463 + #ifdef CONFIG_X86_X32_ABI 464 464 case SNDRV_CTL_IOCTL_ELEM_READ_X32: 465 465 return snd_ctl_elem_read_user_x32(ctl->card, argp); 466 466 case SNDRV_CTL_IOCTL_ELEM_WRITE_X32: 467 467 return snd_ctl_elem_write_user_x32(ctl, argp); 468 - #endif /* CONFIG_X86_X32 */ 468 + #endif /* CONFIG_X86_X32_ABI */ 469 469 } 470 470 471 471 down_read(&snd_ioctl_rwsem);
+10 -10
sound/core/pcm_compat.c
··· 147 147 return err; 148 148 } 149 149 150 - #ifdef CONFIG_X86_X32 150 + #ifdef CONFIG_X86_X32_ABI 151 151 /* X32 ABI has the same struct as x86-64 for snd_pcm_channel_info */ 152 152 static int snd_pcm_channel_info_user(struct snd_pcm_substream *substream, 153 153 struct snd_pcm_channel_info __user *src); 154 154 #define snd_pcm_ioctl_channel_info_x32(s, p) \ 155 155 snd_pcm_channel_info_user(s, p) 156 - #endif /* CONFIG_X86_X32 */ 156 + #endif /* CONFIG_X86_X32_ABI */ 157 157 158 158 struct compat_snd_pcm_status64 { 159 159 snd_pcm_state_t state; ··· 375 375 return err; 376 376 } 377 377 378 - #ifdef CONFIG_X86_X32 378 + #ifdef CONFIG_X86_X32_ABI 379 379 /* X32 ABI has 64bit timespec and 64bit alignment */ 380 380 struct snd_pcm_mmap_status_x32 { 381 381 snd_pcm_state_t state; ··· 468 468 469 469 return 0; 470 470 } 471 - #endif /* CONFIG_X86_X32 */ 471 + #endif /* CONFIG_X86_X32_ABI */ 472 472 473 473 #ifdef __BIG_ENDIAN 474 474 typedef char __pad_before_u32[4]; ··· 560 560 SNDRV_PCM_IOCTL_READN_FRAMES32 = _IOR('A', 0x53, struct snd_xfern32), 561 561 SNDRV_PCM_IOCTL_STATUS_COMPAT64 = _IOR('A', 0x20, struct compat_snd_pcm_status64), 562 562 SNDRV_PCM_IOCTL_STATUS_EXT_COMPAT64 = _IOWR('A', 0x24, struct compat_snd_pcm_status64), 563 - #ifdef CONFIG_X86_X32 563 + #ifdef CONFIG_X86_X32_ABI 564 564 SNDRV_PCM_IOCTL_CHANNEL_INFO_X32 = _IOR('A', 0x32, struct snd_pcm_channel_info), 565 565 SNDRV_PCM_IOCTL_SYNC_PTR_X32 = _IOWR('A', 0x23, struct snd_pcm_sync_ptr_x32), 566 - #endif /* CONFIG_X86_X32 */ 566 + #endif /* CONFIG_X86_X32_ABI */ 567 567 }; 568 568 569 569 static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg) ··· 607 607 case __SNDRV_PCM_IOCTL_SYNC_PTR32: 608 608 return snd_pcm_common_ioctl(file, substream, cmd, argp); 609 609 case __SNDRV_PCM_IOCTL_SYNC_PTR64: 610 - #ifdef CONFIG_X86_X32 610 + #ifdef CONFIG_X86_X32_ABI 611 611 if (in_x32_syscall()) 612 612 return snd_pcm_ioctl_sync_ptr_x32(substream, argp); 613 - #endif /* CONFIG_X86_X32 */ 613 + #endif /* CONFIG_X86_X32_ABI */ 614 614 return snd_pcm_ioctl_sync_ptr_buggy(substream, argp); 615 615 case SNDRV_PCM_IOCTL_HW_REFINE32: 616 616 return snd_pcm_ioctl_hw_params_compat(substream, 1, argp); ··· 642 642 return snd_pcm_status_user_compat64(substream, argp, false); 643 643 case SNDRV_PCM_IOCTL_STATUS_EXT_COMPAT64: 644 644 return snd_pcm_status_user_compat64(substream, argp, true); 645 - #ifdef CONFIG_X86_X32 645 + #ifdef CONFIG_X86_X32_ABI 646 646 case SNDRV_PCM_IOCTL_CHANNEL_INFO_X32: 647 647 return snd_pcm_ioctl_channel_info_x32(substream, argp); 648 - #endif /* CONFIG_X86_X32 */ 648 + #endif /* CONFIG_X86_X32_ABI */ 649 649 } 650 650 651 651 return -ENOIOCTLCMD;