All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nathan Chancellor <nathan@kernel.org>
To: Masahiro Yamada <masahiroy@kernel.org>
Cc: X86 ML <x86@kernel.org>, Thomas Gleixner <tglx@linutronix.de>,
	Borislav Petkov <bp@alien8.de>, "H . Peter Anvin" <hpa@zytor.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Fangrui Song <maskray@google.com>,
	clang-built-linux <clang-built-linux@googlegroups.com>,
	"H . J . Lu" <hjl.tools@gmail.com>,
	Andy Lutomirski <luto@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
	Brian Gerst <brgerst@gmail.com>,
	"Chang S. Bae" <chang.seok.bae@intel.com>,
	Chao Yu <chao@kernel.org>, "Darrick J. Wong" <djwong@kernel.org>,
	Dmitry Safonov <0x7f454c46@gmail.com>,
	Dominik Brodowski <linux@dominikbrodowski.net>,
	Gabriel Krisman Bertazi <krisman@collabora.com>,
	Ingo Molnar <mingo@redhat.com>, Jaroslav Kysela <perex@perex.cz>,
	Jason Gunthorpe <jgg@ziepe.ca>,
	Jethro Beekman <jethro@fortanix.com>,
	Kees Cook <keescook@chromium.org>,
	Miklos Szeredi <miklos@szeredi.hu>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Sasha Levin <sashal@kernel.org>,
	Sean Christopherson <seanjc@google.com>,
	Takashi Iwai <tiwai@suse.com>,
	ALSA Development Mailing List <alsa-devel@alsa-project.org>,
	Linux FS-devel Mailing List <linux-fsdevel@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-xfs <linux-xfs@vger.kernel.org>
Subject: Re: [PATCH RFC] x86: remove toolchain check for X32 ABI capability
Date: Sat, 27 Feb 2021 23:52:54 -0700	[thread overview]
Message-ID: <20210228065254.GA30798@24bbad8f3778> (raw)
In-Reply-To: <20210228064936.zixrhxlthyy6fmid@24bbad8f3778>

On Sat, Feb 27, 2021 at 11:49:36PM -0700, Nathan Chancellor wrote:
> On Sun, Feb 28, 2021 at 12:15:16PM +0900, Masahiro Yamada wrote:
> > On Sun, Feb 28, 2021 at 3:41 AM Masahiro Yamada <masahiroy@kernel.org> wrote:
> > >
> > > This commit reverts 0bf6276392e9 ("x32: Warn and disable rather than
> > > error if binutils too old").
> > >
> > > The help text in arch/x86/Kconfig says enabling the X32 ABI support
> > > needs binutils 2.22 or later. This is met because the minimal binutils
> > > version is 2.23 according to Documentation/process/changes.rst.
> > >
> > > I would not say I am not familiar with toolchain configuration, but
> > 
> > I mean:
> > I would not say I am familiar ...
> > That is why I added RFC.
> > 
> > I appreciate comments from people who are familiar
> > with toolchains (binutils, llvm).
> > 
> > If this change is not safe,
> > we can move this check to Kconfig at least.
> 
> Hi Masahiro,
> 
> As Fangrui pointed out, there are two outstanding issues with x32 with
> LLVM=1, both seemingly related to LLVM=1.
                                    ^ llvm-objcopy

Sigh, note to self, don't write emails while tired...

Cheers,
Nathan

> 
> https://github.com/ClangBuiltLinux/linux/issues/514
> https://github.com/ClangBuiltLinux/linux/issues/1141
> 
> Additionally, there appears to be one from Arnd as well but that one has
> received no triage yet.
> 
> https://github.com/ClangBuiltLinux/linux/issues/1205
> 
> I intend to test this patch as well as a few others at some point in the
> coming week although I am having to play sysadmin due to moving servers
> so I might not be able to get to it until later in the week.
> 
> Cheers,
> Nathan
> 
> > > I checked the configure.tgt code in binutils. The elf32_x86_64
> > > emulation mode seems to be included when it is configured for the
> > > x86_64-*-linux-* target.
> > >
> > > I also tried lld and llvm-objcopy, and succeeded in building x32 VDSO.
> > >
> > > I removed the compile-time check in arch/x86/Makefile, in the hope of
> > > elf32_x86_64 being always supported.
> > >
> > > With this, CONFIG_X86_X32 and CONFIG_X86_X32_ABI will be equivalent.
> > > Rename the former to the latter.
> > >
> > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> > > ---
> > >
> > >  arch/x86/Kconfig                       |  8 ++------
> > >  arch/x86/Makefile                      | 16 ----------------
> > >  arch/x86/include/asm/syscall_wrapper.h |  6 +++---
> > >  arch/x86/include/asm/vdso.h            |  2 +-
> > >  arch/x86/kernel/process_64.c           |  2 +-
> > >  fs/fuse/file.c                         |  2 +-
> > >  fs/xfs/xfs_ioctl32.c                   |  2 +-
> > >  sound/core/control_compat.c            | 16 ++++++++--------
> > >  sound/core/pcm_compat.c                | 20 ++++++++++----------
> > >  9 files changed, 27 insertions(+), 47 deletions(-)
> > >
> > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> > > index 2792879d398e..7272cba2744c 100644
> > > --- a/arch/x86/Kconfig
> > > +++ b/arch/x86/Kconfig
> > > @@ -2865,7 +2865,7 @@ config IA32_AOUT
> > >         help
> > >           Support old a.out binaries in the 32bit emulation.
> > >
> > > -config X86_X32
> > > +config X86_X32_ABI
> > >         bool "x32 ABI for 64-bit mode"
> > >         depends on X86_64
> > >         help
> > > @@ -2874,10 +2874,6 @@ config X86_X32
> > >           full 64-bit register file and wide data path while leaving
> > >           pointers at 32 bits for smaller memory footprint.
> > >
> > > -         You will need a recent binutils (2.22 or later) with
> > > -         elf32_x86_64 support enabled to compile a kernel with this
> > > -         option set.
> > > -
> > >  config COMPAT_32
> > >         def_bool y
> > >         depends on IA32_EMULATION || X86_32
> > > @@ -2886,7 +2882,7 @@ config COMPAT_32
> > >
> > >  config COMPAT
> > >         def_bool y
> > > -       depends on IA32_EMULATION || X86_X32
> > > +       depends on IA32_EMULATION || X86_X32_ABI
> > >
> > >  if COMPAT
> > >  config COMPAT_FOR_U64_ALIGNMENT
> > > diff --git a/arch/x86/Makefile b/arch/x86/Makefile
> > > index 2d6d5a28c3bf..e163549f5be7 100644
> > > --- a/arch/x86/Makefile
> > > +++ b/arch/x86/Makefile
> > > @@ -125,22 +125,6 @@ else
> > >          KBUILD_CFLAGS += -mcmodel=kernel
> > >  endif
> > >
> > > -ifdef CONFIG_X86_X32
> > > -       x32_ld_ok := $(call try-run,\
> > > -                       /bin/echo -e '1: .quad 1b' | \
> > > -                       $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \
> > > -                       $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \
> > > -                       $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n)
> > > -        ifeq ($(x32_ld_ok),y)
> > > -                CONFIG_X86_X32_ABI := y
> > > -                KBUILD_AFLAGS += -DCONFIG_X86_X32_ABI
> > > -                KBUILD_CFLAGS += -DCONFIG_X86_X32_ABI
> > > -        else
> > > -                $(warning CONFIG_X86_X32 enabled but no binutils support)
> > > -        endif
> > > -endif
> > > -export CONFIG_X86_X32_ABI
> > > -
> > >  #
> > >  # If the function graph tracer is used with mcount instead of fentry,
> > >  # '-maccumulate-outgoing-args' is needed to prevent a GCC bug
> > > diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
> > > index a84333adeef2..69bf87c41a0b 100644
> > > --- a/arch/x86/include/asm/syscall_wrapper.h
> > > +++ b/arch/x86/include/asm/syscall_wrapper.h
> > > @@ -158,7 +158,7 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
> > >  #endif /* CONFIG_IA32_EMULATION */
> > >
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  /*
> > >   * For the x32 ABI, we need to create a stub for compat_sys_*() which is aware
> > >   * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common
> > > @@ -176,12 +176,12 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
> > >
> > >  #define __X32_COMPAT_SYS_NI(name)                                      \
> > >         __SYS_NI(x32, compat_sys_##name)
> > > -#else /* CONFIG_X86_X32 */
> > > +#else /* CONFIG_X86_X32_ABI */
> > >  #define __X32_COMPAT_SYS_STUB0(name)
> > >  #define __X32_COMPAT_SYS_STUBx(x, name, ...)
> > >  #define __X32_COMPAT_COND_SYSCALL(name)
> > >  #define __X32_COMPAT_SYS_NI(name)
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >
> > >  #ifdef CONFIG_COMPAT
> > > diff --git a/arch/x86/include/asm/vdso.h b/arch/x86/include/asm/vdso.h
> > > index 98aa103eb4ab..2963a2f5dbc4 100644
> > > --- a/arch/x86/include/asm/vdso.h
> > > +++ b/arch/x86/include/asm/vdso.h
> > > @@ -37,7 +37,7 @@ struct vdso_image {
> > >  extern const struct vdso_image vdso_image_64;
> > >  #endif
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  extern const struct vdso_image vdso_image_x32;
> > >  #endif
> > >
> > > diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
> > > index d08307df69ad..a93b6f4296fc 100644
> > > --- a/arch/x86/kernel/process_64.c
> > > +++ b/arch/x86/kernel/process_64.c
> > > @@ -656,7 +656,7 @@ void set_personality_64bit(void)
> > >
> > >  static void __set_personality_x32(void)
> > >  {
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         if (current->mm)
> > >                 current->mm->context.flags = 0;
> > >
> > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> > > index 8cccecb55fb8..c53c620d1a7a 100644
> > > --- a/fs/fuse/file.c
> > > +++ b/fs/fuse/file.c
> > > @@ -2797,7 +2797,7 @@ long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
> > >  #else
> > >         if (flags & FUSE_IOCTL_COMPAT) {
> > >                 inarg.flags |= FUSE_IOCTL_32BIT;
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >                 if (in_x32_syscall())
> > >                         inarg.flags |= FUSE_IOCTL_COMPAT_X32;
> > >  #endif
> > > diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c
> > > index 33c09ec8e6c0..e8038bc966e7 100644
> > > --- a/fs/xfs/xfs_ioctl32.c
> > > +++ b/fs/xfs/xfs_ioctl32.c
> > > @@ -233,7 +233,7 @@ xfs_compat_ioc_fsbulkstat(
> > >         inumbers_fmt_pf         inumbers_func = xfs_fsinumbers_fmt_compat;
> > >         bulkstat_one_fmt_pf     bs_one_func = xfs_fsbulkstat_one_fmt_compat;
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         if (in_x32_syscall()) {
> > >                 /*
> > >                  * ... but on x32 the input xfs_fsop_bulkreq has pointers
> > > diff --git a/sound/core/control_compat.c b/sound/core/control_compat.c
> > > index 1d708aab9c98..5d1b94bda2cd 100644
> > > --- a/sound/core/control_compat.c
> > > +++ b/sound/core/control_compat.c
> > > @@ -153,7 +153,7 @@ struct snd_ctl_elem_value32 {
> > >          unsigned char reserved[128];
> > >  };
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  /* x32 has a different alignment for 64bit values from ia32 */
> > >  struct snd_ctl_elem_value_x32 {
> > >         struct snd_ctl_elem_id id;
> > > @@ -165,7 +165,7 @@ struct snd_ctl_elem_value_x32 {
> > >         } value;
> > >         unsigned char reserved[128];
> > >  };
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >  /* get the value type and count of the control */
> > >  static int get_ctl_type(struct snd_card *card, struct snd_ctl_elem_id *id,
> > > @@ -350,7 +350,7 @@ static int snd_ctl_elem_write_user_compat(struct snd_ctl_file *file,
> > >         return ctl_elem_write_user(file, data32, &data32->value);
> > >  }
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  static int snd_ctl_elem_read_user_x32(struct snd_card *card,
> > >                                       struct snd_ctl_elem_value_x32 __user *data32)
> > >  {
> > > @@ -362,7 +362,7 @@ static int snd_ctl_elem_write_user_x32(struct snd_ctl_file *file,
> > >  {
> > >         return ctl_elem_write_user(file, data32, &data32->value);
> > >  }
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >  /* add or replace a user control */
> > >  static int snd_ctl_elem_add_compat(struct snd_ctl_file *file,
> > > @@ -421,10 +421,10 @@ enum {
> > >         SNDRV_CTL_IOCTL_ELEM_WRITE32 = _IOWR('U', 0x13, struct snd_ctl_elem_value32),
> > >         SNDRV_CTL_IOCTL_ELEM_ADD32 = _IOWR('U', 0x17, struct snd_ctl_elem_info32),
> > >         SNDRV_CTL_IOCTL_ELEM_REPLACE32 = _IOWR('U', 0x18, struct snd_ctl_elem_info32),
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         SNDRV_CTL_IOCTL_ELEM_READ_X32 = _IOWR('U', 0x12, struct snd_ctl_elem_value_x32),
> > >         SNDRV_CTL_IOCTL_ELEM_WRITE_X32 = _IOWR('U', 0x13, struct snd_ctl_elem_value_x32),
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >  };
> > >
> > >  static inline long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg)
> > > @@ -463,12 +463,12 @@ static inline long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, uns
> > >                 return snd_ctl_elem_add_compat(ctl, argp, 0);
> > >         case SNDRV_CTL_IOCTL_ELEM_REPLACE32:
> > >                 return snd_ctl_elem_add_compat(ctl, argp, 1);
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         case SNDRV_CTL_IOCTL_ELEM_READ_X32:
> > >                 return snd_ctl_elem_read_user_x32(ctl->card, argp);
> > >         case SNDRV_CTL_IOCTL_ELEM_WRITE_X32:
> > >                 return snd_ctl_elem_write_user_x32(ctl, argp);
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >         }
> > >
> > >         down_read(&snd_ioctl_rwsem);
> > > diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c
> > > index 590a46a9e78d..937f5117a81f 100644
> > > --- a/sound/core/pcm_compat.c
> > > +++ b/sound/core/pcm_compat.c
> > > @@ -147,13 +147,13 @@ static int snd_pcm_ioctl_channel_info_compat(struct snd_pcm_substream *substream
> > >         return err;
> > >  }
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  /* X32 ABI has the same struct as x86-64 for snd_pcm_channel_info */
> > >  static int snd_pcm_channel_info_user(struct snd_pcm_substream *substream,
> > >                                      struct snd_pcm_channel_info __user *src);
> > >  #define snd_pcm_ioctl_channel_info_x32(s, p)   \
> > >         snd_pcm_channel_info_user(s, p)
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >  struct compat_snd_pcm_status64 {
> > >         snd_pcm_state_t state;
> > > @@ -373,7 +373,7 @@ static int snd_pcm_ioctl_xfern_compat(struct snd_pcm_substream *substream,
> > >         return err;
> > >  }
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  /* X32 ABI has 64bit timespec and 64bit alignment */
> > >  struct snd_pcm_mmap_status_x32 {
> > >         snd_pcm_state_t state;
> > > @@ -464,7 +464,7 @@ static int snd_pcm_ioctl_sync_ptr_x32(struct snd_pcm_substream *substream,
> > >
> > >         return 0;
> > >  }
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >  /*
> > >   */
> > > @@ -484,10 +484,10 @@ enum {
> > >         SNDRV_PCM_IOCTL_READN_FRAMES32 = _IOR('A', 0x53, struct snd_xfern32),
> > >         SNDRV_PCM_IOCTL_STATUS_COMPAT64 = _IOR('A', 0x20, struct compat_snd_pcm_status64),
> > >         SNDRV_PCM_IOCTL_STATUS_EXT_COMPAT64 = _IOWR('A', 0x24, struct compat_snd_pcm_status64),
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         SNDRV_PCM_IOCTL_CHANNEL_INFO_X32 = _IOR('A', 0x32, struct snd_pcm_channel_info),
> > >         SNDRV_PCM_IOCTL_SYNC_PTR_X32 = _IOWR('A', 0x23, struct snd_pcm_sync_ptr_x32),
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >  };
> > >
> > >  static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg)
> > > @@ -531,10 +531,10 @@ static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned l
> > >         case __SNDRV_PCM_IOCTL_SYNC_PTR32:
> > >                 return snd_pcm_common_ioctl(file, substream, cmd, argp);
> > >         case __SNDRV_PCM_IOCTL_SYNC_PTR64:
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >                 if (in_x32_syscall())
> > >                         return snd_pcm_ioctl_sync_ptr_x32(substream, argp);
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >                 return snd_pcm_common_ioctl(file, substream, cmd, argp);
> > >         case SNDRV_PCM_IOCTL_HW_REFINE32:
> > >                 return snd_pcm_ioctl_hw_params_compat(substream, 1, argp);
> > > @@ -566,10 +566,10 @@ static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned l
> > >                 return snd_pcm_status_user_compat64(substream, argp, false);
> > >         case SNDRV_PCM_IOCTL_STATUS_EXT_COMPAT64:
> > >                 return snd_pcm_status_user_compat64(substream, argp, true);
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         case SNDRV_PCM_IOCTL_CHANNEL_INFO_X32:
> > >                 return snd_pcm_ioctl_channel_info_x32(substream, argp);
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >         }
> > >
> > >         return -ENOIOCTLCMD;
> > > --
> > > 2.27.0
> > >
> > > --
> > > You received this message because you are subscribed to the Google Groups "Clang Built Linux" group.
> > > To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com.
> > > To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20210227183910.221873-1-masahiroy%40kernel.org.
> > 
> > 
> > 
> > --
> > Best Regards
> > Masahiro Yamada

WARNING: multiple messages have this Message-ID (diff)
From: Nathan Chancellor <nathan@kernel.org>
To: Masahiro Yamada <masahiroy@kernel.org>
Cc: ALSA Development Mailing List <alsa-devel@alsa-project.org>,
	Peter Zijlstra <peterz@infradead.org>,
	"Darrick J. Wong" <djwong@kernel.org>,
	Dmitry Safonov <0x7f454c46@gmail.com>,
	Dominik Brodowski <linux@dominikbrodowski.net>,
	"H . Peter Anvin" <hpa@zytor.com>,
	Gabriel Krisman Bertazi <krisman@collabora.com>,
	Sasha Levin <sashal@kernel.org>,
	Fangrui Song <maskray@google.com>,
	clang-built-linux <clang-built-linux@googlegroups.com>,
	X86 ML <x86@kernel.org>, Jethro Beekman <jethro@fortanix.com>,
	Jason Gunthorpe <jgg@ziepe.ca>, Ingo Molnar <mingo@redhat.com>,
	"H . J . Lu" <hjl.tools@gmail.com>,
	Kees Cook <keescook@chromium.org>, Arnd Bergmann <arnd@arndb.de>,
	Brian Gerst <brgerst@gmail.com>,
	"Chang S. Bae" <chang.seok.bae@intel.com>,
	Chao Yu <chao@kernel.org>, Borislav Petkov <bp@alien8.de>,
	Andy Lutomirski <luto@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Sean Christopherson <seanjc@google.com>,
	Miklos Szeredi <miklos@szeredi.hu>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Takashi Iwai <tiwai@suse.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-xfs <linux-xfs@vger.kernel.org>,
	Linux FS-devel Mailing List <linux-fsdevel@vger.kernel.org>
Subject: Re: [PATCH RFC] x86: remove toolchain check for X32 ABI capability
Date: Sat, 27 Feb 2021 23:52:54 -0700	[thread overview]
Message-ID: <20210228065254.GA30798@24bbad8f3778> (raw)
In-Reply-To: <20210228064936.zixrhxlthyy6fmid@24bbad8f3778>

On Sat, Feb 27, 2021 at 11:49:36PM -0700, Nathan Chancellor wrote:
> On Sun, Feb 28, 2021 at 12:15:16PM +0900, Masahiro Yamada wrote:
> > On Sun, Feb 28, 2021 at 3:41 AM Masahiro Yamada <masahiroy@kernel.org> wrote:
> > >
> > > This commit reverts 0bf6276392e9 ("x32: Warn and disable rather than
> > > error if binutils too old").
> > >
> > > The help text in arch/x86/Kconfig says enabling the X32 ABI support
> > > needs binutils 2.22 or later. This is met because the minimal binutils
> > > version is 2.23 according to Documentation/process/changes.rst.
> > >
> > > I would not say I am not familiar with toolchain configuration, but
> > 
> > I mean:
> > I would not say I am familiar ...
> > That is why I added RFC.
> > 
> > I appreciate comments from people who are familiar
> > with toolchains (binutils, llvm).
> > 
> > If this change is not safe,
> > we can move this check to Kconfig at least.
> 
> Hi Masahiro,
> 
> As Fangrui pointed out, there are two outstanding issues with x32 with
> LLVM=1, both seemingly related to LLVM=1.
                                    ^ llvm-objcopy

Sigh, note to self, don't write emails while tired...

Cheers,
Nathan

> 
> https://github.com/ClangBuiltLinux/linux/issues/514
> https://github.com/ClangBuiltLinux/linux/issues/1141
> 
> Additionally, there appears to be one from Arnd as well but that one has
> received no triage yet.
> 
> https://github.com/ClangBuiltLinux/linux/issues/1205
> 
> I intend to test this patch as well as a few others at some point in the
> coming week although I am having to play sysadmin due to moving servers
> so I might not be able to get to it until later in the week.
> 
> Cheers,
> Nathan
> 
> > > I checked the configure.tgt code in binutils. The elf32_x86_64
> > > emulation mode seems to be included when it is configured for the
> > > x86_64-*-linux-* target.
> > >
> > > I also tried lld and llvm-objcopy, and succeeded in building x32 VDSO.
> > >
> > > I removed the compile-time check in arch/x86/Makefile, in the hope of
> > > elf32_x86_64 being always supported.
> > >
> > > With this, CONFIG_X86_X32 and CONFIG_X86_X32_ABI will be equivalent.
> > > Rename the former to the latter.
> > >
> > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> > > ---
> > >
> > >  arch/x86/Kconfig                       |  8 ++------
> > >  arch/x86/Makefile                      | 16 ----------------
> > >  arch/x86/include/asm/syscall_wrapper.h |  6 +++---
> > >  arch/x86/include/asm/vdso.h            |  2 +-
> > >  arch/x86/kernel/process_64.c           |  2 +-
> > >  fs/fuse/file.c                         |  2 +-
> > >  fs/xfs/xfs_ioctl32.c                   |  2 +-
> > >  sound/core/control_compat.c            | 16 ++++++++--------
> > >  sound/core/pcm_compat.c                | 20 ++++++++++----------
> > >  9 files changed, 27 insertions(+), 47 deletions(-)
> > >
> > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> > > index 2792879d398e..7272cba2744c 100644
> > > --- a/arch/x86/Kconfig
> > > +++ b/arch/x86/Kconfig
> > > @@ -2865,7 +2865,7 @@ config IA32_AOUT
> > >         help
> > >           Support old a.out binaries in the 32bit emulation.
> > >
> > > -config X86_X32
> > > +config X86_X32_ABI
> > >         bool "x32 ABI for 64-bit mode"
> > >         depends on X86_64
> > >         help
> > > @@ -2874,10 +2874,6 @@ config X86_X32
> > >           full 64-bit register file and wide data path while leaving
> > >           pointers at 32 bits for smaller memory footprint.
> > >
> > > -         You will need a recent binutils (2.22 or later) with
> > > -         elf32_x86_64 support enabled to compile a kernel with this
> > > -         option set.
> > > -
> > >  config COMPAT_32
> > >         def_bool y
> > >         depends on IA32_EMULATION || X86_32
> > > @@ -2886,7 +2882,7 @@ config COMPAT_32
> > >
> > >  config COMPAT
> > >         def_bool y
> > > -       depends on IA32_EMULATION || X86_X32
> > > +       depends on IA32_EMULATION || X86_X32_ABI
> > >
> > >  if COMPAT
> > >  config COMPAT_FOR_U64_ALIGNMENT
> > > diff --git a/arch/x86/Makefile b/arch/x86/Makefile
> > > index 2d6d5a28c3bf..e163549f5be7 100644
> > > --- a/arch/x86/Makefile
> > > +++ b/arch/x86/Makefile
> > > @@ -125,22 +125,6 @@ else
> > >          KBUILD_CFLAGS += -mcmodel=kernel
> > >  endif
> > >
> > > -ifdef CONFIG_X86_X32
> > > -       x32_ld_ok := $(call try-run,\
> > > -                       /bin/echo -e '1: .quad 1b' | \
> > > -                       $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \
> > > -                       $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \
> > > -                       $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n)
> > > -        ifeq ($(x32_ld_ok),y)
> > > -                CONFIG_X86_X32_ABI := y
> > > -                KBUILD_AFLAGS += -DCONFIG_X86_X32_ABI
> > > -                KBUILD_CFLAGS += -DCONFIG_X86_X32_ABI
> > > -        else
> > > -                $(warning CONFIG_X86_X32 enabled but no binutils support)
> > > -        endif
> > > -endif
> > > -export CONFIG_X86_X32_ABI
> > > -
> > >  #
> > >  # If the function graph tracer is used with mcount instead of fentry,
> > >  # '-maccumulate-outgoing-args' is needed to prevent a GCC bug
> > > diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
> > > index a84333adeef2..69bf87c41a0b 100644
> > > --- a/arch/x86/include/asm/syscall_wrapper.h
> > > +++ b/arch/x86/include/asm/syscall_wrapper.h
> > > @@ -158,7 +158,7 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
> > >  #endif /* CONFIG_IA32_EMULATION */
> > >
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  /*
> > >   * For the x32 ABI, we need to create a stub for compat_sys_*() which is aware
> > >   * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common
> > > @@ -176,12 +176,12 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
> > >
> > >  #define __X32_COMPAT_SYS_NI(name)                                      \
> > >         __SYS_NI(x32, compat_sys_##name)
> > > -#else /* CONFIG_X86_X32 */
> > > +#else /* CONFIG_X86_X32_ABI */
> > >  #define __X32_COMPAT_SYS_STUB0(name)
> > >  #define __X32_COMPAT_SYS_STUBx(x, name, ...)
> > >  #define __X32_COMPAT_COND_SYSCALL(name)
> > >  #define __X32_COMPAT_SYS_NI(name)
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >
> > >  #ifdef CONFIG_COMPAT
> > > diff --git a/arch/x86/include/asm/vdso.h b/arch/x86/include/asm/vdso.h
> > > index 98aa103eb4ab..2963a2f5dbc4 100644
> > > --- a/arch/x86/include/asm/vdso.h
> > > +++ b/arch/x86/include/asm/vdso.h
> > > @@ -37,7 +37,7 @@ struct vdso_image {
> > >  extern const struct vdso_image vdso_image_64;
> > >  #endif
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  extern const struct vdso_image vdso_image_x32;
> > >  #endif
> > >
> > > diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
> > > index d08307df69ad..a93b6f4296fc 100644
> > > --- a/arch/x86/kernel/process_64.c
> > > +++ b/arch/x86/kernel/process_64.c
> > > @@ -656,7 +656,7 @@ void set_personality_64bit(void)
> > >
> > >  static void __set_personality_x32(void)
> > >  {
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         if (current->mm)
> > >                 current->mm->context.flags = 0;
> > >
> > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> > > index 8cccecb55fb8..c53c620d1a7a 100644
> > > --- a/fs/fuse/file.c
> > > +++ b/fs/fuse/file.c
> > > @@ -2797,7 +2797,7 @@ long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
> > >  #else
> > >         if (flags & FUSE_IOCTL_COMPAT) {
> > >                 inarg.flags |= FUSE_IOCTL_32BIT;
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >                 if (in_x32_syscall())
> > >                         inarg.flags |= FUSE_IOCTL_COMPAT_X32;
> > >  #endif
> > > diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c
> > > index 33c09ec8e6c0..e8038bc966e7 100644
> > > --- a/fs/xfs/xfs_ioctl32.c
> > > +++ b/fs/xfs/xfs_ioctl32.c
> > > @@ -233,7 +233,7 @@ xfs_compat_ioc_fsbulkstat(
> > >         inumbers_fmt_pf         inumbers_func = xfs_fsinumbers_fmt_compat;
> > >         bulkstat_one_fmt_pf     bs_one_func = xfs_fsbulkstat_one_fmt_compat;
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         if (in_x32_syscall()) {
> > >                 /*
> > >                  * ... but on x32 the input xfs_fsop_bulkreq has pointers
> > > diff --git a/sound/core/control_compat.c b/sound/core/control_compat.c
> > > index 1d708aab9c98..5d1b94bda2cd 100644
> > > --- a/sound/core/control_compat.c
> > > +++ b/sound/core/control_compat.c
> > > @@ -153,7 +153,7 @@ struct snd_ctl_elem_value32 {
> > >          unsigned char reserved[128];
> > >  };
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  /* x32 has a different alignment for 64bit values from ia32 */
> > >  struct snd_ctl_elem_value_x32 {
> > >         struct snd_ctl_elem_id id;
> > > @@ -165,7 +165,7 @@ struct snd_ctl_elem_value_x32 {
> > >         } value;
> > >         unsigned char reserved[128];
> > >  };
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >  /* get the value type and count of the control */
> > >  static int get_ctl_type(struct snd_card *card, struct snd_ctl_elem_id *id,
> > > @@ -350,7 +350,7 @@ static int snd_ctl_elem_write_user_compat(struct snd_ctl_file *file,
> > >         return ctl_elem_write_user(file, data32, &data32->value);
> > >  }
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  static int snd_ctl_elem_read_user_x32(struct snd_card *card,
> > >                                       struct snd_ctl_elem_value_x32 __user *data32)
> > >  {
> > > @@ -362,7 +362,7 @@ static int snd_ctl_elem_write_user_x32(struct snd_ctl_file *file,
> > >  {
> > >         return ctl_elem_write_user(file, data32, &data32->value);
> > >  }
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >  /* add or replace a user control */
> > >  static int snd_ctl_elem_add_compat(struct snd_ctl_file *file,
> > > @@ -421,10 +421,10 @@ enum {
> > >         SNDRV_CTL_IOCTL_ELEM_WRITE32 = _IOWR('U', 0x13, struct snd_ctl_elem_value32),
> > >         SNDRV_CTL_IOCTL_ELEM_ADD32 = _IOWR('U', 0x17, struct snd_ctl_elem_info32),
> > >         SNDRV_CTL_IOCTL_ELEM_REPLACE32 = _IOWR('U', 0x18, struct snd_ctl_elem_info32),
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         SNDRV_CTL_IOCTL_ELEM_READ_X32 = _IOWR('U', 0x12, struct snd_ctl_elem_value_x32),
> > >         SNDRV_CTL_IOCTL_ELEM_WRITE_X32 = _IOWR('U', 0x13, struct snd_ctl_elem_value_x32),
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >  };
> > >
> > >  static inline long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg)
> > > @@ -463,12 +463,12 @@ static inline long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, uns
> > >                 return snd_ctl_elem_add_compat(ctl, argp, 0);
> > >         case SNDRV_CTL_IOCTL_ELEM_REPLACE32:
> > >                 return snd_ctl_elem_add_compat(ctl, argp, 1);
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         case SNDRV_CTL_IOCTL_ELEM_READ_X32:
> > >                 return snd_ctl_elem_read_user_x32(ctl->card, argp);
> > >         case SNDRV_CTL_IOCTL_ELEM_WRITE_X32:
> > >                 return snd_ctl_elem_write_user_x32(ctl, argp);
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >         }
> > >
> > >         down_read(&snd_ioctl_rwsem);
> > > diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c
> > > index 590a46a9e78d..937f5117a81f 100644
> > > --- a/sound/core/pcm_compat.c
> > > +++ b/sound/core/pcm_compat.c
> > > @@ -147,13 +147,13 @@ static int snd_pcm_ioctl_channel_info_compat(struct snd_pcm_substream *substream
> > >         return err;
> > >  }
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  /* X32 ABI has the same struct as x86-64 for snd_pcm_channel_info */
> > >  static int snd_pcm_channel_info_user(struct snd_pcm_substream *substream,
> > >                                      struct snd_pcm_channel_info __user *src);
> > >  #define snd_pcm_ioctl_channel_info_x32(s, p)   \
> > >         snd_pcm_channel_info_user(s, p)
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >  struct compat_snd_pcm_status64 {
> > >         snd_pcm_state_t state;
> > > @@ -373,7 +373,7 @@ static int snd_pcm_ioctl_xfern_compat(struct snd_pcm_substream *substream,
> > >         return err;
> > >  }
> > >
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >  /* X32 ABI has 64bit timespec and 64bit alignment */
> > >  struct snd_pcm_mmap_status_x32 {
> > >         snd_pcm_state_t state;
> > > @@ -464,7 +464,7 @@ static int snd_pcm_ioctl_sync_ptr_x32(struct snd_pcm_substream *substream,
> > >
> > >         return 0;
> > >  }
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >
> > >  /*
> > >   */
> > > @@ -484,10 +484,10 @@ enum {
> > >         SNDRV_PCM_IOCTL_READN_FRAMES32 = _IOR('A', 0x53, struct snd_xfern32),
> > >         SNDRV_PCM_IOCTL_STATUS_COMPAT64 = _IOR('A', 0x20, struct compat_snd_pcm_status64),
> > >         SNDRV_PCM_IOCTL_STATUS_EXT_COMPAT64 = _IOWR('A', 0x24, struct compat_snd_pcm_status64),
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         SNDRV_PCM_IOCTL_CHANNEL_INFO_X32 = _IOR('A', 0x32, struct snd_pcm_channel_info),
> > >         SNDRV_PCM_IOCTL_SYNC_PTR_X32 = _IOWR('A', 0x23, struct snd_pcm_sync_ptr_x32),
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >  };
> > >
> > >  static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg)
> > > @@ -531,10 +531,10 @@ static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned l
> > >         case __SNDRV_PCM_IOCTL_SYNC_PTR32:
> > >                 return snd_pcm_common_ioctl(file, substream, cmd, argp);
> > >         case __SNDRV_PCM_IOCTL_SYNC_PTR64:
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >                 if (in_x32_syscall())
> > >                         return snd_pcm_ioctl_sync_ptr_x32(substream, argp);
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >                 return snd_pcm_common_ioctl(file, substream, cmd, argp);
> > >         case SNDRV_PCM_IOCTL_HW_REFINE32:
> > >                 return snd_pcm_ioctl_hw_params_compat(substream, 1, argp);
> > > @@ -566,10 +566,10 @@ static long snd_pcm_ioctl_compat(struct file *file, unsigned int cmd, unsigned l
> > >                 return snd_pcm_status_user_compat64(substream, argp, false);
> > >         case SNDRV_PCM_IOCTL_STATUS_EXT_COMPAT64:
> > >                 return snd_pcm_status_user_compat64(substream, argp, true);
> > > -#ifdef CONFIG_X86_X32
> > > +#ifdef CONFIG_X86_X32_ABI
> > >         case SNDRV_PCM_IOCTL_CHANNEL_INFO_X32:
> > >                 return snd_pcm_ioctl_channel_info_x32(substream, argp);
> > > -#endif /* CONFIG_X86_X32 */
> > > +#endif /* CONFIG_X86_X32_ABI */
> > >         }
> > >
> > >         return -ENOIOCTLCMD;
> > > --
> > > 2.27.0
> > >
> > > --
> > > You received this message because you are subscribed to the Google Groups "Clang Built Linux" group.
> > > To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com.
> > > To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20210227183910.221873-1-masahiroy%40kernel.org.
> > 
> > 
> > 
> > --
> > Best Regards
> > Masahiro Yamada

  reply	other threads:[~2021-02-28  6:54 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-27 18:39 [PATCH RFC] x86: remove toolchain check for X32 ABI capability Masahiro Yamada
2021-02-27 18:39 ` Masahiro Yamada
2021-02-28  3:15 ` Masahiro Yamada
2021-02-28  3:15   ` Masahiro Yamada
2021-02-28  6:49   ` Nathan Chancellor
2021-02-28  6:49     ` Nathan Chancellor
2021-02-28  6:52     ` Nathan Chancellor [this message]
2021-02-28  6:52       ` Nathan Chancellor
2021-02-28  7:07       ` Masahiro Yamada
2021-02-28  7:07         ` Masahiro Yamada
2021-06-07  7:39     ` Masahiro Yamada
2021-06-08 17:26       ` Nathan Chancellor
2021-02-28  5:51 ` Fangrui Song
2021-02-28  5:51   ` Fangrui Song

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210228065254.GA30798@24bbad8f3778 \
    --to=nathan@kernel.org \
    --cc=0x7f454c46@gmail.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=arnd@arndb.de \
    --cc=bp@alien8.de \
    --cc=brgerst@gmail.com \
    --cc=chang.seok.bae@intel.com \
    --cc=chao@kernel.org \
    --cc=clang-built-linux@googlegroups.com \
    --cc=djwong@kernel.org \
    --cc=hjl.tools@gmail.com \
    --cc=hpa@zytor.com \
    --cc=jethro@fortanix.com \
    --cc=jgg@ziepe.ca \
    --cc=keescook@chromium.org \
    --cc=krisman@collabora.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=linux@dominikbrodowski.net \
    --cc=luto@kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=maskray@google.com \
    --cc=miklos@szeredi.hu \
    --cc=mingo@redhat.com \
    --cc=ndesaulniers@google.com \
    --cc=perex@perex.cz \
    --cc=peterz@infradead.org \
    --cc=sashal@kernel.org \
    --cc=seanjc@google.com \
    --cc=tglx@linutronix.de \
    --cc=tiwai@suse.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.