From mboxrd@z Thu Jan 1 00:00:00 1970 From: Calvin Johnson Date: Wed, 11 Apr 2018 00:34:41 +0530 Subject: [U-Boot] [PATCH 3/4] elf: Add a very simple elf64 loader In-Reply-To: <1523341711-721-3-git-send-email-bmeng.cn@gmail.com> References: <1523341711-721-1-git-send-email-bmeng.cn@gmail.com> <1523341711-721-3-git-send-email-bmeng.cn@gmail.com> Message-ID: <20180410190441.GA2831@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Mon, Apr 09, 2018 at 11:28:30PM -0700, Bin Meng wrote: > This adds a very simple elf64 loader via program headers, similar > to load_elf_image_phdr() that we already have. > > Signed-off-by: Bin Meng > --- > > cmd/elf.c | 34 ++++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/cmd/elf.c b/cmd/elf.c > index 501f935..91a04da 100644 > --- a/cmd/elf.c > +++ b/cmd/elf.c > @@ -24,6 +24,37 @@ > #endif > > /* > + * A very simple elf64 loader, assumes the image is valid, returns the > + * entry point address. > + */ > +static unsigned long load_elf64_image_phdr(unsigned long addr) > +{ > + Elf64_Ehdr *ehdr; /* Elf header structure pointer */ > + Elf64_Phdr *phdr; /* Program header structure pointer */ > + int i; > + > + ehdr = (Elf64_Ehdr *)addr; > + phdr = (Elf64_Phdr *)(addr + (ulong)ehdr->e_phoff); > + > + /* Load each program header */ > + for (i = 0; i < ehdr->e_phnum; ++i) { > + void *dst = (void *)(ulong)phdr->p_paddr; > + void *src = (void *)addr + phdr->p_offset; > + debug("Loading phdr %i to 0x%p (%lu bytes)\n", > + i, dst, (ulong)phdr->p_filesz); > + if (phdr->p_filesz) > + memcpy(dst, src, phdr->p_filesz); > + if (phdr->p_filesz != phdr->p_memsz) > + memset(dst + phdr->p_filesz, 0x00, > + phdr->p_memsz - phdr->p_filesz); > + flush_cache((unsigned long)dst, phdr->p_filesz); > + ++phdr; > + } > + > + return ehdr->e_entry; > +} > + > +/* > * A very simple elf loader, assumes the image is valid, returns the Would it be good to modify this comment to indicate elf32 loader? > * entry point address. > */ > @@ -34,6 +65,9 @@ static unsigned long load_elf_image_phdr(unsigned long addr) > int i; > > ehdr = (Elf32_Ehdr *)addr; > + if (ehdr->e_ident[EI_CLASS] == ELFCLASS64) > + return load_elf64_image_phdr(addr); > + > phdr = (Elf32_Phdr *)(addr + ehdr->e_phoff); > > /* Load each program header */ > -- > 2.7.4 > > _______________________________________________ > U-Boot mailing list > U-Boot at lists.denx.de > https://lists.denx.de/listinfo/u-boot