aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Kardashevskiy <aik@ozlabs.ru>2019-12-31 13:03:44 +1100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2020-01-02 12:42:49 +1100
commitb3138d2c77a2adb7a472896c00f87c212830d17a (patch)
tree5146e132e602edd9de2fa42935a99e476be7970f
parent87e24dba8b52e32e7c1a00416fa5ab2e337f2107 (diff)
downloadSLOF-b3138d2c77a2adb7a472896c00f87c212830d17a.zip
SLOF-b3138d2c77a2adb7a472896c00f87c212830d17a.tar.gz
SLOF-b3138d2c77a2adb7a472896c00f87c212830d17a.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>
-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;
}