qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [ARM/FDPIC 2/4] linux-user: ARM-FDPIC: Add support of F


From: Christophe Lyon
Subject: Re: [Qemu-devel] [ARM/FDPIC 2/4] linux-user: ARM-FDPIC: Add support of FDPIC for ARM.
Date: Mon, 16 Apr 2018 09:59:23 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0

On 13/04/2018 17:07, Peter Maydell wrote:
On 6 April 2018 at 16:17, Christophe Lyon <address@hidden> 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é <address@hidden>
Signed-off-by: Christophe Lyon <address@hidden>

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

[Prev in Thread] Current Thread [Next in Thread]