[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CALCETrW4FivPZg5W8MrrJznsX4O-WNhHCHm-PkskGD0LvxxTvQ@mail.gmail.com>
Date: Thu, 1 Oct 2020 14:50:29 -0700
From: Andy Lutomirski <luto@...nel.org>
To: Gabriel Krisman Bertazi <krisman@...labora.com>
Cc: Andrew Lutomirski <luto@...nel.org>,
Thomas Gleixner <tglx@...utronix.de>,
Christoph Hellwig <hch@....de>,
"H. Peter Anvin" <hpa@...or.com>, Borislav Petkov <bp@...en8.de>,
Robert Richter <rric@...nel.org>,
Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>, X86 ML <x86@...nel.org>,
LKML <linux-kernel@...r.kernel.org>,
Dave Hansen <dave.hansen@...ux.intel.com>, kernel@...labora.com
Subject: Re: [PATCH v2 6/9] x86: elf: Use e_machine to select
setup_additional_pages for x32
On Thu, Oct 1, 2020 at 1:59 PM Gabriel Krisman Bertazi
<krisman@...labora.com> wrote:
>
> Since TIF_X32 is going away, avoid using it to find the ELF type when
> choosing which additional pages to set up.
>
> According to SysV AMD64 ABI Draft, an AMD64 ELF object using ILP32 must
> have ELFCLASS32 with (E_MACHINE == EM_X86_64), so use that ELF field to
> differentiate a x32 object from a IA32 object when executing
> start_thread in compat mode.
>
> Signed-off-by: Gabriel Krisman Bertazi <krisman@...labora.com>
> ---
> arch/x86/entry/vdso/vma.c | 21 ++++++++++++---------
> arch/x86/include/asm/elf.h | 11 ++++++++---
> 2 files changed, 20 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
> index 9185cb1d13b9..7a3cda8294a3 100644
> --- a/arch/x86/entry/vdso/vma.c
> +++ b/arch/x86/entry/vdso/vma.c
> @@ -412,22 +412,25 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
> }
>
> #ifdef CONFIG_COMPAT
> -int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
> - int uses_interp)
> +int compat_arch_setup_additional_pages_ia32(struct linux_binprm *bprm,
> + int uses_interp)
> {
> -#ifdef CONFIG_X86_X32_ABI
> - if (test_thread_flag(TIF_X32)) {
> - if (!vdso64_enabled)
> - return 0;
> - return map_vdso_randomized(&vdso_image_x32);
> - }
> -#endif
> #ifdef CONFIG_IA32_EMULATION
> return load_vdso32();
> #else
> return 0;
> #endif
> }
> +
> +int compat_arch_setup_additional_pages_x32(struct linux_binprm *bprm,
> + int uses_interp)
> +{
> +#ifdef CONFIG_X86_X32_ABI
> + if (vdso64_enabled)
> + return map_vdso_randomized(&vdso_image_x32);
> +#endif
> + return 0;
> +}
> #endif
> #else
> int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
> diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
> index 33c1c9be2e07..4d91f5b1079f 100644
> --- a/arch/x86/include/asm/elf.h
> +++ b/arch/x86/include/asm/elf.h
> @@ -388,9 +388,14 @@ struct linux_binprm;
> #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
> extern int arch_setup_additional_pages(struct linux_binprm *bprm,
> int uses_interp);
> -extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
> - int uses_interp);
> -#define compat_arch_setup_additional_pages compat_arch_setup_additional_pages
> +extern int compat_arch_setup_additional_pages_ia32(struct linux_binprm *bprm,
> + int uses_interp);
> +extern int compat_arch_setup_additional_pages_x32(struct linux_binprm *bprm,
> + int uses_interp);
> +
> +#define compat_arch_setup_additional_pages \
> + ((elf_ex->e_machine == EM_X86_64) ? \
> + compat_arch_setup_additional_pages_x32 : compat_arch_setup_additional_pages_ia32)
>
As in the previous patch, can you wire up the new argument for real, please?
Powered by blists - more mailing lists