As we support more than one compat formats, it looks more reasonable
to not use fs/compat_binfmt.c. Custom binfmt_elf32.c allows to move aarch32
specific definitions there and make code more maintainable and readable.

Signed-off-by: Yury Norov <yno...@caviumnetworks.com>
---
 arch/arm64/Kconfig               |  1 -
 arch/arm64/include/asm/elf.h     | 24 ------------------------
 arch/arm64/include/asm/hwcap.h   |  2 --
 arch/arm64/kernel/Makefile       |  2 +-
 arch/arm64/kernel/binfmt_elf32.c | 33 +++++++++++++++++++++++++++++++++
 5 files changed, 34 insertions(+), 28 deletions(-)
 create mode 100644 arch/arm64/kernel/binfmt_elf32.c

diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index ede9b2e..0bb7adc 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -932,7 +932,6 @@ config AARCH32_EL0
        bool "Kernel support for 32-bit EL0"
        def_bool y
        depends on ARM64_4K_PAGES || EXPERT
-       select COMPAT_BINFMT_ELF
        select HAVE_UID16
        select OLD_SIGSUSPEND3
        select COMPAT_OLD_SIGACTION
diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h
index e18bb8a..7a39683 100644
--- a/arch/arm64/include/asm/elf.h
+++ b/arch/arm64/include/asm/elf.h
@@ -166,12 +166,6 @@ extern int arch_setup_additional_pages(struct linux_binprm 
*bprm,
 
 #ifdef CONFIG_COMPAT
 
-#ifdef __AARCH64EB__
-#define COMPAT_ELF_PLATFORM            ("v8b")
-#else
-#define COMPAT_ELF_PLATFORM            ("v8l")
-#endif
-
 #define COMPAT_ELF_ET_DYN_BASE         (2 * TASK_SIZE_32 / 3)
 
 /* AArch32 registers. */
@@ -179,24 +173,6 @@ extern int arch_setup_additional_pages(struct linux_binprm 
*bprm,
 typedef unsigned int                   compat_elf_greg_t;
 typedef compat_elf_greg_t              compat_elf_gregset_t[COMPAT_ELF_NGREG];
 
-/* AArch32 EABI. */
-#define EF_ARM_EABI_MASK               0xff000000
-#define compat_elf_check_arch(x)       (((x)->e_machine == EM_ARM) && \
-                                        ((x)->e_flags & EF_ARM_EABI_MASK))
-
-#define compat_start_thread            compat_start_thread
-#define COMPAT_SET_PERSONALITY(ex)             \
-do {                                           \
-       clear_thread_flag(TIF_32BIT_AARCH64);   \
-       set_thread_flag(TIF_32BIT);             \
-} while (0)
-
-#define COMPAT_ARCH_DLINFO
-extern int aarch32_setup_vectors_page(struct linux_binprm *bprm,
-                                     int uses_interp);
-#define compat_arch_setup_additional_pages \
-                                       aarch32_setup_vectors_page
-
 #endif /* CONFIG_COMPAT */
 
 #endif /* !__ASSEMBLY__ */
diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h
index 2c7fc5d..99dfd92 100644
--- a/arch/arm64/include/asm/hwcap.h
+++ b/arch/arm64/include/asm/hwcap.h
@@ -47,8 +47,6 @@
 #define ELF_HWCAP              (elf_hwcap)
 
 #ifdef CONFIG_AARCH32_EL0
-#define COMPAT_ELF_HWCAP       (compat_elf_hwcap)
-#define COMPAT_ELF_HWCAP2      (compat_elf_hwcap2)
 extern unsigned int compat_elf_hwcap, compat_elf_hwcap2;
 #endif
 
diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
index 75dd250..6bc9738 100644
--- a/arch/arm64/kernel/Makefile
+++ b/arch/arm64/kernel/Makefile
@@ -27,7 +27,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE
 
 arm64-obj-$(CONFIG_AARCH32_EL0)                += sys32.o kuser32.o signal32.o 
        \
                                           sys_compat.o entry32.o               
\
-                                          ../../arm/kernel/opcodes.o
+                                          ../../arm/kernel/opcodes.o 
binfmt_elf32.o
 arm64-obj-$(CONFIG_FUNCTION_TRACER)    += ftrace.o entry-ftrace.o
 arm64-obj-$(CONFIG_MODULES)            += arm64ksyms.o module.o
 arm64-obj-$(CONFIG_ARM64_MODULE_PLTS)  += module-plts.o
diff --git a/arch/arm64/kernel/binfmt_elf32.c b/arch/arm64/kernel/binfmt_elf32.c
new file mode 100644
index 0000000..5487872
--- /dev/null
+++ b/arch/arm64/kernel/binfmt_elf32.c
@@ -0,0 +1,33 @@
+/*
+ * Support for AArch32 Linux ELF binaries.
+ */
+
+/* AArch32 EABI. */
+#define EF_ARM_EABI_MASK               0xff000000
+#define compat_elf_check_arch(x)       (((x)->e_machine == EM_ARM) && \
+                                        ((x)->e_flags & EF_ARM_EABI_MASK))
+
+#define compat_start_thread            compat_start_thread
+#define COMPAT_SET_PERSONALITY(ex)             \
+do {                                           \
+       clear_thread_flag(TIF_32BIT_AARCH64);   \
+       set_thread_flag(TIF_32BIT);             \
+} while (0)
+
+#define COMPAT_ARCH_DLINFO
+#define COMPAT_ELF_HWCAP               (compat_elf_hwcap)
+#define COMPAT_ELF_HWCAP2              (compat_elf_hwcap2)
+
+#ifdef __AARCH64EB__
+#define COMPAT_ELF_PLATFORM            ("v8b")
+#else
+#define COMPAT_ELF_PLATFORM            ("v8l")
+#endif
+
+#define compat_arch_setup_additional_pages \
+                                       aarch32_setup_vectors_page
+struct linux_binprm;
+extern int aarch32_setup_vectors_page(struct linux_binprm *bprm,
+                                     int uses_interp);
+
+#include "../../../fs/compat_binfmt_elf.c"
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-doc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to