]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
ARM: enable elf_fdpic on systems with an MMU
authorNicolas Pitre <nicolas.pitre@linaro.org>
Fri, 11 Aug 2017 04:53:39 +0000 (00:53 -0400)
committerNicolas Pitre <nicolas.pitre@linaro.org>
Sun, 10 Sep 2017 23:31:46 +0000 (19:31 -0400)
Provide the necessary changes to be able to execute ELF-FDPIC binaries
on ARM systems with an MMU.

The default for CONFIG_BINFMT_ELF_FDPIC is also set to n if the regular
ELF loader is already configured so not to force FDPIC support on
everyone. Given that CONFIG_BINFMT_ELF depends on CONFIG_MMU, this means
CONFIG_BINFMT_ELF_FDPIC will still default to y when !MMU.

Signed-off-by: Nicolas Pitre <nico@linaro.org>
Acked-by: Mickael GUENE <mickael.guene@st.com>
Tested-by: Vincent Abriou <vincent.abriou@st.com>
Tested-by: Andras Szemzo <szemzo.andras@gmail.com>
arch/arm/include/asm/mmu.h
arch/arm/kernel/elf.c
fs/Kconfig.binfmt
fs/binfmt_elf_fdpic.c

index e0eb16680a5bd448cc1bc2e53bfcd7b24fae71fc..bdec37c6ac35c64eb35f942f8d71a0206a58728f 100644 (file)
@@ -14,6 +14,10 @@ typedef struct {
 #ifdef CONFIG_VDSO
        unsigned long   vdso;
 #endif
+#ifdef CONFIG_BINFMT_ELF_FDPIC
+       unsigned long   exec_fdpic_loadmap;
+       unsigned long   interp_fdpic_loadmap;
+#endif
 } mm_context_t;
 
 #ifdef CONFIG_CPU_HAS_ASID
index 52fb98358d9d755ad004d2a448f4798cd09573c5..569e69ece5cad80753fdb0ee26316aab510efb2d 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/personality.h>
 #include <linux/binfmts.h>
 #include <linux/elf.h>
+#include <linux/elf-fdpic.h>
 #include <asm/system_info.h>
 
 int elf_check_arch(const struct elf32_hdr *x)
@@ -89,3 +90,24 @@ int arm_elf_read_implies_exec(int executable_stack)
        return 0;
 }
 EXPORT_SYMBOL(arm_elf_read_implies_exec);
+
+#if defined(CONFIG_MMU) && defined(CONFIG_BINFMT_ELF_FDPIC)
+
+void elf_fdpic_arch_lay_out_mm(struct elf_fdpic_params *exec_params,
+                              struct elf_fdpic_params *interp_params,
+                              unsigned long *start_stack,
+                              unsigned long *start_brk)
+{
+       elf_set_personality(&exec_params->hdr);
+
+       exec_params->load_addr = 0x8000;
+       interp_params->load_addr = ELF_ET_DYN_BASE;
+       *start_stack = TASK_SIZE - SZ_16M;
+
+       if ((exec_params->flags & ELF_FDPIC_FLAG_ARRANGEMENT) == ELF_FDPIC_FLAG_INDEPENDENT) {
+               exec_params->flags &= ~ELF_FDPIC_FLAG_ARRANGEMENT;
+               exec_params->flags |= ELF_FDPIC_FLAG_CONSTDISP;
+       }
+}
+
+#endif
index 6ef70ce8e976de99979ed96c70ea9e54d0fbd820..58c2bbd385ad498f92cc4fc1a3957a3455ee095d 100644 (file)
@@ -34,8 +34,8 @@ config ARCH_BINFMT_ELF_STATE
 
 config BINFMT_ELF_FDPIC
        bool "Kernel support for FDPIC ELF binaries"
-       default y
-       depends on ((ARM && !MMU) || FRV || BLACKFIN || (SUPERH32 && !MMU) || C6X)
+       default y if !BINFMT_ELF
+       depends on (ARM || FRV || BLACKFIN || (SUPERH32 && !MMU) || C6X)
        select ELFCORE
        help
          ELF FDPIC binaries are based on ELF, but allow the individual load
index cf93a4fad01218575e3b0f4c9b2806a2b16111dc..692e2a1fd2bbe85dd7a8d8ef6f11656148fb95a2 100644 (file)
@@ -377,6 +377,11 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm)
                                 executable_stack);
        if (retval < 0)
                goto error;
+#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
+       retval = arch_setup_additional_pages(bprm, !!interpreter_name);
+       if (retval < 0)
+               goto error;
+#endif
 #endif
 
        /* load the executable and interpreter into memory */