Messages in this thread | | | From | Andy Lutomirski <> | Date | Thu, 1 Oct 2020 14:50:29 -0700 | 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@collabora.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@collabora.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?
| |