Re: [U-Boot] [PATCH 3/4] elf: Add a very simple elf64 loader
On Wed, Apr 11, 2018 at 3:04 AM, Calvin Johnson wrote: > 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? Will add some more comments in v2. Regards, Bin ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
Re: [U-Boot] [PATCH 3/4] elf: Add a very simple elf64 loader
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@lists.denx.de > https://lists.denx.de/listinfo/u-boot ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
[U-Boot] [PATCH 3/4] elf: Add a very simple elf64 loader
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 * 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@lists.denx.de https://lists.denx.de/listinfo/u-boot