Message ID | 1477081997-4770-10-git-send-email-ynorov@caviumnetworks.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Oct 21, 2016 at 11:33:08PM +0300, Yury Norov wrote: > 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. Can you remind me why we need this patch (rather than using the default fs/compat_binfmt_elf.c which you include here anyway)? > --- /dev/null > +++ b/arch/arm64/kernel/binfmt_elf32.c > @@ -0,0 +1,31 @@ > +/* > + * Support for AArch32 Linux ELF binaries. > + */ > + > +/* AArch32 EABI. */ > +#define EF_ARM_EABI_MASK 0xff000000 > + > +#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) You introduce this here but it seems to still be present in asm/elf.h.
On Mon, Dec 05, 2016 at 03:10:19PM +0000, Catalin Marinas wrote: > On Fri, Oct 21, 2016 at 11:33:08PM +0300, Yury Norov wrote: > > 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. > > Can you remind me why we need this patch (rather than using the default > fs/compat_binfmt_elf.c which you include here anyway)? https://patchwork.kernel.org/patch/8756121/ This is mostly to avoid runtime checks and hide some re-definitions for aarch32 from ilp32, to avoid re-re-definition. > > > --- /dev/null > > +++ b/arch/arm64/kernel/binfmt_elf32.c > > @@ -0,0 +1,31 @@ > > +/* > > + * Support for AArch32 Linux ELF binaries. > > + */ > > + > > +/* AArch32 EABI. */ > > +#define EF_ARM_EABI_MASK 0xff000000 > > + > > +#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) > > You introduce this here but it seems to still be present in asm/elf.h. Hmm... Maybe chunk that delete it from asm/elf.h was dropped at some rebase. Thank you for the catch. I'll check it again. Yury
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 0cd786e..9efa86a 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1003,7 +1003,6 @@ config AARCH32_EL0 def_bool y depends on ARM64_4K_PAGES || EXPERT select COMPAT - select COMPAT_BINFMT_ELF select HAVE_UID16 select OLD_SIGSUSPEND3 select COMPAT_OLD_SIGACTION 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 8a19fda..abe5040 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -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 entry32.o + sys_compat.o entry32.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..aec1c8a --- /dev/null +++ b/arch/arm64/kernel/binfmt_elf32.c @@ -0,0 +1,31 @@ +/* + * Support for AArch32 Linux ELF binaries. + */ + +/* AArch32 EABI. */ +#define EF_ARM_EABI_MASK 0xff000000 + +#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"
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 <ynorov@caviumnetworks.com> --- arch/arm64/Kconfig | 1 - arch/arm64/include/asm/hwcap.h | 2 -- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/binfmt_elf32.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 arch/arm64/kernel/binfmt_elf32.c