[U-Boot] [PATCH v3 4/7] remoteproc: add elf file load support
Patrick DELAUNAY
patrick.delaunay at st.com
Mon Jul 22 06:58:42 UTC 2019
Hi Lokesh,
Thanks for the review.
Fabien is in vacation and I will integrate this serie in my next stm32 pull request.
> From: Lokesh Vutla <lokeshvutla at ti.com>
> Sent: lundi 3 juin 2019 07:31
>
>
>
> On 31/05/19 6:41 PM, Fabien Dessenne wrote:
> > The current implementation supports only binary file load.
> > Add helpers to support ELF32 format (sanity check, and load).
> > Note that since an ELF32 image is built for the remote processor, the
> > load function uses the device_to_virt ops to translate the addresses.
> > Implement a basic translation for sandbox_testproc.
> >
> > Add related tests. Test result:
> > => ut dm remoteproc_elf
> > Test: dm_test_remoteproc_elf: remoteproc.c
> > Test: dm_test_remoteproc_elf: remoteproc.c (flat tree)
> > Failures: 0
> >
> > Signed-off-by: Loic Pallardy <loic.pallardy at st.com>
> > Signed-off-by: Fabien Dessenne <fabien.dessenne at st.com>
> > ---
>
> [...snip...]
>
> > +/* Basic function to verify ELF32 image format */ int
> > +rproc_elf32_sanity_check(ulong addr, ulong size) {
> > + Elf32_Ehdr *ehdr;
> > + char class;
> > +
> > + if (!addr) {
> > + pr_debug("Invalid fw address?\n");
> > + return -EFAULT;
> > + }
> > +
> > + if (size < sizeof(Elf32_Ehdr)) {
> > + pr_debug("Image is too small\n");
> > + return -ENOSPC;
> > + }
> > +
> > + ehdr = (Elf32_Ehdr *)addr;
> > + class = ehdr->e_ident[EI_CLASS];
> > +
> > + if (!IS_ELF(*ehdr) || ehdr->e_type != ET_EXEC || class != ELFCLASS32) {
> > + pr_debug("Not an executable ELF32 image\n");
> > + return -EPROTONOSUPPORT;
> > + }
> > +
> > + /* We assume the firmware has the same endianness as the host */ #
> > +ifdef __LITTLE_ENDIAN
> > + if (ehdr->e_ident[EI_DATA] != ELFDATA2LSB) { # else /* BIG ENDIAN */
> > + if (ehdr->e_ident[EI_DATA] != ELFDATA2MSB) { # endif
> > + pr_debug("Unsupported firmware endianness\n");
> > + return -EILSEQ;
> > + }
> > +
> > + if (size < ehdr->e_shoff + sizeof(Elf32_Shdr)) {
> > + pr_debug("Image is too small\n");
> > + return -ENOSPC;
> > + }
> > +
> > + if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG)) {
> > + pr_debug("Image is corrupted (bad magic)\n");
> > + return -EBADF;
> > + }
> > +
> > + if (ehdr->e_phnum == 0) {
> > + pr_debug("No loadable segments\n");
> > + return -ENOEXEC;
> > + }
> > +
> > + if (ehdr->e_phoff > size) {
> > + pr_debug("Firmware size is too small\n");
> > + return -ENOSPC;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +/* A very simple elf loader, assumes the image is valid */ int
> > +rproc_elf32_load_image(struct udevice *dev, unsigned long addr) {
> > + Elf32_Ehdr *ehdr; /* Elf header structure pointer */
> > + Elf32_Phdr *phdr; /* Program header structure pointer */
> > + const struct dm_rproc_ops *ops;
> > + unsigned int i;
> > +
>
> I would prefer to call rproc_elf32_sanity_check() here and reduce the burden on
> user. It's my preference and no strong objections.
Yes it is a possibility, but for my side I prefer the Fabien proposition.
(we can perhaps reuse the check of ELF for other use case).
I will merge the patch with this version (to have the patch in v2019.10) .
But I let Fabien conclude and potentially sent a minor update.
> Other than that:
>
> Reviewed-by: Lokesh Vutla <lokeshvutla at ti.com>
>
> Thanks and regards,
> Lokesh
Thanks
Patrick
More information about the U-Boot
mailing list