From: Guo Ren <guo...@linux.alibaba.com>

Implement necessary type and macro for compat elf. See the code
comment for detail.

Signed-off-by: Guo Ren <guo...@linux.alibaba.com>
Signed-off-by: Guo Ren <guo...@kernel.org>
Cc: Arnd Bergmann <a...@arndb.de>
---
 arch/riscv/include/asm/elf.h | 49 +++++++++++++++++++++++++++++++++++-
 1 file changed, 48 insertions(+), 1 deletion(-)

diff --git a/arch/riscv/include/asm/elf.h b/arch/riscv/include/asm/elf.h
index f53c40026c7a..91b372d4e13b 100644
--- a/arch/riscv/include/asm/elf.h
+++ b/arch/riscv/include/asm/elf.h
@@ -8,6 +8,8 @@
 #ifndef _ASM_RISCV_ELF_H
 #define _ASM_RISCV_ELF_H
 
+#include <uapi/linux/elf.h>
+#include <linux/compat.h>
 #include <uapi/asm/elf.h>
 #include <asm/auxvec.h>
 #include <asm/byteorder.h>
@@ -18,11 +20,13 @@
  */
 #define ELF_ARCH       EM_RISCV
 
+#ifndef ELF_CLASS
 #ifdef CONFIG_64BIT
 #define ELF_CLASS      ELFCLASS64
 #else
 #define ELF_CLASS      ELFCLASS32
 #endif
+#endif
 
 #define ELF_DATA       ELFDATA2LSB
 
@@ -31,6 +35,15 @@
  */
 #define elf_check_arch(x) ((x)->e_machine == EM_RISCV)
 
+#ifdef CONFIG_COMPAT
+/*
+ * Use the same code with elf_check_arch, because elf32_hdr &
+ * elf64_hdr e_machine's offset are different. The checker is
+ * a little bit simple compare to other architectures.
+ */
+#define compat_elf_check_arch(x) ((x)->e_machine == EM_RISCV)
+#endif
+
 #define CORE_DUMP_USE_REGSET
 #define ELF_EXEC_PAGESIZE      (PAGE_SIZE)
 
@@ -43,8 +56,14 @@
 #define ELF_ET_DYN_BASE                ((TASK_SIZE / 3) * 2)
 
 #ifdef CONFIG_64BIT
+#ifdef CONFIG_COMPAT
+#define STACK_RND_MASK         (test_thread_flag(TIF_32BIT) ? \
+                                0x7ff >> (PAGE_SHIFT - 12) : \
+                                0x3ffff >> (PAGE_SHIFT - 12))
+#else
 #define STACK_RND_MASK         (0x3ffff >> (PAGE_SHIFT - 12))
 #endif
+#endif
 /*
  * This yields a mask that user programs can use to figure out what
  * instruction set this CPU supports.  This could be done in user space,
@@ -60,11 +79,19 @@ extern unsigned long elf_hwcap;
  */
 #define ELF_PLATFORM   (NULL)
 
+#define COMPAT_ELF_PLATFORM    (NULL)
+
 #ifdef CONFIG_MMU
 #define ARCH_DLINFO                                            \
 do {                                                           \
+       /*                                                      \
+        * Note that we add ulong after elf_addr_t because      \
+        * casting current->mm->context.vdso triggers a cast    \
+        * warning of cast from pointer to integer for          \
+        * COMPAT ELFCLASS32.                                   \
+        */                                                     \
        NEW_AUX_ENT(AT_SYSINFO_EHDR,                            \
-               (elf_addr_t)current->mm->context.vdso);         \
+               (elf_addr_t)(ulong)current->mm->context.vdso);  \
        NEW_AUX_ENT(AT_L1I_CACHESIZE,                           \
                get_cache_size(1, CACHE_TYPE_INST));            \
        NEW_AUX_ENT(AT_L1I_CACHEGEOMETRY,                       \
@@ -90,4 +117,24 @@ do {                                                        
\
                *(struct user_regs_struct *)regs;       \
 } while (0);
 
+#ifdef CONFIG_COMPAT
+
+/*
+ * FIXME: not sure SET_PERSONALITY for compat process is right!
+ */
+#define SET_PERSONALITY(ex)                                               \
+do {    if ((ex).e_ident[EI_CLASS] == ELFCLASS32)                         \
+               set_thread_flag(TIF_32BIT);                                \
+       else                                                               \
+               clear_thread_flag(TIF_32BIT);                              \
+       set_personality(PER_LINUX | (current->personality & (~PER_MASK))); \
+} while (0)
+
+#define COMPAT_ELF_ET_DYN_BASE         ((TASK_SIZE_32 / 3) * 2)
+
+/* rv32 registers */
+typedef compat_ulong_t                 compat_elf_greg_t;
+typedef compat_elf_greg_t              compat_elf_gregset_t[ELF_NGREG];
+
+#endif /* CONFIG_COMPAT */
 #endif /* _ASM_RISCV_ELF_H */
-- 
2.25.1

Reply via email to