FROMLIST: [PATCH 2/6] arm64: elf: Set AT_SYSINFO_EHDR in compat processes
authorKevin Brodsky <kevin.brodsky@arm.com>
Thu, 12 May 2016 08:53:26 +0000 (09:53 +0100)
committerMichael Benedict <michaelbt@live.com>
Sun, 22 Sep 2019 15:51:33 +0000 (01:51 +1000)
(cherry pick from url https://patchwork.kernel.org/patch/10060431/)

If the compat vDSO is enabled, we need to set AT_SYSINFO_EHDR in the
auxiliary vector of compat processes to the address of the vDSO code
page, so that the dynamic linker can find it (just like the regular vDSO).

Note that we cast context.vdso to Elf64_Off, instead of elf_addr_t,
because elf_addr_t is Elf32_Off in compat_binfmt_elf.c, and casting
context.vdso to u32 would trigger a pointer narrowing warning.

Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
Signed-off-by: Mark Salyzyn <salyzyn@android.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Dave Martin <Dave.Martin@arm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Bug: 63737556
Bug: 20045882
Change-Id: I5d0b191d3b2f4c0b2ec31fe9faef0246253635ce

arch/arm64/include/asm/elf.h

index f9d64ed4fd2bcc06fded325659ba02946eae12a3..2c7bd88159fba62577c39f1f7be9103e05c82b2c 100644 (file)
@@ -140,11 +140,12 @@ typedef struct user_fpsimd_state elf_fpregset_t;
 #define SET_PERSONALITY(ex)            clear_thread_flag(TIF_32BIT);
 
 /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */
-#define ARCH_DLINFO                                                    \
+#define _SET_AUX_ENT_VDSO                                              \
 do {                                                                   \
        NEW_AUX_ENT(AT_SYSINFO_EHDR,                                    \
-                   (elf_addr_t)current->mm->context.vdso);             \
+                   (Elf64_Off)current->mm->context.vdso);              \
 } while (0)
+#define ARCH_DLINFO _SET_AUX_ENT_VDSO
 
 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES
 struct linux_binprm;
@@ -182,8 +183,13 @@ typedef compat_elf_greg_t          compat_elf_gregset_t[COMPAT_ELF_NGREG];
                                         ((x)->e_flags & EF_ARM_EABI_MASK))
 
 #define compat_start_thread            compat_start_thread
-#define COMPAT_SET_PERSONALITY(ex)     set_thread_flag(TIF_32BIT);
+#define COMPAT_SET_PERSONALITY(ex)     set_thread_flag(TIF_32BIT);
+
+#ifdef CONFIG_VDSO32
+#define COMPAT_ARCH_DLINFO             _SET_AUX_ENT_VDSO
+#else
 #define COMPAT_ARCH_DLINFO
+#endif
 extern int aarch32_setup_vectors_page(struct linux_binprm *bprm,
                                      int uses_interp);
 #define compat_arch_setup_additional_pages \
@@ -193,4 +199,4 @@ extern int aarch32_setup_vectors_page(struct linux_binprm *bprm,
 
 #endif /* !__ASSEMBLY__ */
 
-#endif
+#endif
\ No newline at end of file