Commit 63a07568 authored by Yury Norov's avatar Yury Norov Committed by Yang Yingliang
Browse files

arm64: introduce binfmt_elf32.c



hulk inclusion
category: feature
bugzilla: NA
CVE: NA
---------------------------

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: default avatarYury Norov <ynorov@caviumnetworks.com>
Signed-off-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: default avatarHanjun Guo &lt;guohanjun@huawei.com <mailto:guohanjun@huawei.com&gt;>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
parent b7734529
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -1380,7 +1380,6 @@ config AARCH32_EL0
	bool "Kernel support for 32-bit EL0"
	def_bool y
	depends on ARM64_4K_PAGES || EXPERT
	select COMPAT_BINFMT_ELF if BINFMT_ELF
	select HAVE_UID16
	select OLD_SIGSUSPEND3
	select COMPAT_OLD_SIGACTION
+3 −23
Original line number Diff line number Diff line
@@ -188,36 +188,16 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm,

/* PIE load location for compat arm. Must match ARM ELF_ET_DYN_BASE. */
#define COMPAT_ELF_ET_DYN_BASE		0x000400000UL
#endif /*CONFIG_COMPAT */

#ifdef CONFIG_AARCH32_EL0
/* AArch32 registers. */
#define COMPAT_ELF_NGREG		18
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)	(system_supports_32bit_el0() && \
					 ((x)->e_machine == EM_ARM) && \
					 ((x)->e_flags & EF_ARM_EABI_MASK))

#define compat_start_thread		compat_start_thread
/*
 * Unlike the native SET_PERSONALITY macro, the compat version maintains
 * READ_IMPLIES_EXEC across an execve() since this is the behaviour on
 * arch/arm/.
 */
#define COMPAT_SET_PERSONALITY(ex)					\
({									\
	clear_thread_flag(TIF_32BIT_AARCH64);				\
	set_thread_flag(TIF_32BIT);					\
 })
#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 /* CONFIG_AARCH32_EL0 */

#endif /* !__ASSEMBLY__ */

+0 −2
Original line number Diff line number Diff line
@@ -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

+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE
	$(call if_changed,objcopy)

arm64-obj-$(CONFIG_AARCH32_EL0)		+= sys32.o kuser32.o signal32.o 	\
					   sys_compat.o
					   sys_compat.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
+35 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0+

/*
 * Support for AArch32 Linux ELF binaries.
 */

/* AArch32 EABI. */
#define EF_ARM_EABI_MASK		0xff000000

#define compat_start_thread		compat_start_thread
/*
 * Unlike the native SET_PERSONALITY macro, the compat version inherits
 * READ_IMPLIES_EXEC across a fork() since this is the behaviour on
 * arch/arm/.
 */
#define COMPAT_SET_PERSONALITY(ex)					\
({									\
	clear_thread_flag(TIF_32BIT_AARCH64);				\
	set_thread_flag(TIF_32BIT);					\
})

#define COMPAT_ARCH_DLINFO
#define COMPAT_ELF_HWCAP		(compat_elf_hwcap)
#define COMPAT_ELF_HWCAP2		(compat_elf_hwcap2)

#define compat_arch_setup_additional_pages \
					aarch32_setup_vectors_page

/* AArch32 EABI. */
#define compat_elf_check_arch(x)	(system_supports_32bit_el0() && \
					 ((x)->e_machine == EM_ARM) && \
					 ((x)->e_flags & EF_ARM_EABI_MASK))


#include "../../../fs/compat_binfmt_elf.c"