On 13/04/2018 17:07, Peter Maydell wrote:
On 6 April 2018 at 16:17, Christophe Lyon <christophe.l...@st.com> wrote:
Add FDPIC info into image_info structure since interpreter info is on
stack and needs to be saved to be accessed later on.

Co-Authored-By:  Mickaël Guêné <mickael.gu...@st.com>
Signed-off-by: Christophe Lyon <christophe.l...@st.com>

diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 7ba3795..363da67 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -287,6 +287,23 @@ static inline void init_thread(struct target_pt_regs *regs,
      /* For uClinux PIC binaries.  */
      /* XXX: Linux does this only on ARM with no MMU (do we care ?) */
      regs->uregs[10] = infop->start_data;
+#ifdef CONFIG_USE_FDPIC
+    /* Support ARM FDPIC.  */
+    /* As described in the ABI document, r7 points to the loadmap info
+     * prepared by the kernel. If an interpreter is needed, r8 points
+     * to the interpreter loadmap and r9 points to the interpreter
+     * PT_DYNAMIC info. If no interpreter is needed, r8 is zer0, and
+     * r9 points to the main program PT_DYNAMIC info.  */
+    regs->uregs[7] = infop->loadmap_addr;
+    if (infop->interpreter_loadmap_addr) {
+        /* Executable is dynamically loaded.  */
+        regs->uregs[8] = infop->interpreter_loadmap_addr;
+        regs->uregs[9] = infop->interpreter_pt_dynamic_addr;
+    } else {
+        regs->uregs[8] = 0;
+        regs->uregs[9] = infop->pt_dynamic_addr;
+    }

Is it really correct to set these registers always, and not only if
this is an FDPIC ELF ?

I need to check, but I used my FDPIC-enabled QEMU to run non-FDPIC
binaries and saw no problem.

+#endif
  }

  int load_elf_binary(struct linux_binprm *bprm, struct image_info *info);
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 19a0c03..90c8ee1 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -629,6 +629,12 @@ typedef struct CPUARMState {
      const struct arm_boot_info *boot_info;
      /* Store GICv3CPUState to access from this struct */
      void *gicv3state;
+
+#if defined(CONFIG_USER_ONLY) && defined(CONFIG_USE_FDPIC)
+    /* We need to know if we have an FDPIC binary to adapt signal
+     * syscalls.  */
+    int is_fdpic;

linux-user specific information shouldn't live in CPUARMState;
put it in the TaskState struct instead, perhaps.

OK, I'll have a look at that.

+#endif
  } CPUARMState;

  /**

thanks
-- PMM
.



Reply via email to