Re: [PATCH v2 6/9] x86: elf: Use e_machine to select setup_additional_pages for x32
From: Andy Lutomirski
Date: Thu Oct 01 2020 - 17:50:45 EST
On Thu, Oct 1, 2020 at 1:59 PM Gabriel Krisman Bertazi
<krisman@xxxxxxxxxxxxx> 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@xxxxxxxxxxxxx>
> ---
> 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?