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