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 ?

> +#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.

> +#endif
>  } CPUARMState;
>
>  /**

thanks
-- PMM

Reply via email to