x86/elf: Use e_machine to check for x32/ia32 in setup_additional_pages()
authorGabriel Krisman Bertazi <krisman@collabora.com>
Sun, 4 Oct 2020 03:25:34 +0000 (23:25 -0400)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 26 Oct 2020 12:46:47 +0000 (13:46 +0100)
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
setup_additional_pages() in compat mode.

Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20201004032536.1229030-9-krisman@collabora.com
arch/x86/entry/vdso/vma.c
arch/x86/include/asm/elf.h

index 9185cb1d13b9be48107a00c24a17f4963cd0ffe3..50e5d3a2e70a4dad4438e7d3f9ec801e37c3f688 100644 (file)
@@ -413,10 +413,10 @@ 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 uses_interp, bool x32)
 {
 #ifdef CONFIG_X86_X32_ABI
-       if (test_thread_flag(TIF_X32)) {
+       if (x32) {
                if (!vdso64_enabled)
                        return 0;
                return map_vdso_randomized(&vdso_image_x32);
index 109697a19eb10b007b48ca5fb8b52ce35bd74274..44a9b9940535241789a2a99d1b9f3e39e462637b 100644 (file)
@@ -383,8 +383,10 @@ struct linux_binprm;
 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
+                                             int uses_interp, bool x32);
+#define COMPAT_ARCH_SETUP_ADDITIONAL_PAGES(bprm, ex, interpreter)      \
+       compat_arch_setup_additional_pages(bprm, interpreter,           \
+                                          (ex->e_machine == EM_X86_64))
 
 /* Do not change the values. See get_align_mask() */
 enum align_flags {