aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlexey Kardashevskiy <aik@ozlabs.ru>2019-12-31 13:03:44 +1100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2020-02-21 14:03:07 +1100
commit8dcfb9a87ba18313c02773021c150dc08084710b (patch)
treea555e25cda6fb69ecf339bc02d5aede2b5fb3f29 /lib
parentefb21312a4a8290f45acd04460f862a88cc9a75a (diff)
downloadSLOF-8dcfb9a87ba18313c02773021c150dc08084710b.zip
SLOF-8dcfb9a87ba18313c02773021c150dc08084710b.tar.gz
SLOF-8dcfb9a87ba18313c02773021c150dc08084710b.tar.bz2
elf64: Add LE64 ABIv1/2 support for loading images to given address
c2358afb40d4 ("Add support for 64bit LE ABI v1 and v2 support") added little endian ELF support for one of two ELF loading helpers, this fixes oversight. With this changes, 'boot disk:2,boot\zImage' is able to handle little-endian zimages. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Diffstat (limited to 'lib')
-rw-r--r--lib/libelf/elf.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/libelf/elf.c b/lib/libelf/elf.c
index db2d2ab..5204bc3 100644
--- a/lib/libelf/elf.c
+++ b/lib/libelf/elf.c
@@ -140,6 +140,7 @@ elf_load_file_to_addr(void *file_addr, void *addr, unsigned long *entry,
{
int type;
long offset;
+ struct ehdr *ehdr = (struct ehdr *) file_addr;
type = elf_check_file(file_addr);
@@ -157,6 +158,13 @@ elf_load_file_to_addr(void *file_addr, void *addr, unsigned long *entry,
*entry = elf_load_segments64(file_addr, offset, pre_load,
post_load) + offset;
elf_relocate64(file_addr, offset);
+ if (ehdr->ei_data != ELFDATA2MSB) {
+ uint32_t flags = elf_get_eflags_64(file_addr);
+ if ((flags & 0x3) == 2)
+ type = 4; /* LE64 ABIv2 */
+ else
+ type = 3; /* LE64 ABIv1 */
+ }
break;
}