remoteproc: elf_loader: Introduce rproc_elf_get_boot_addr() api
authorLokesh Vutla <lokeshvutla@ti.com>
Wed, 4 Sep 2019 10:31:31 +0000 (16:01 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 11 Oct 2019 14:07:34 +0000 (10:07 -0400)
Introduce rproc_elf_get_boot_addr() that returns the entry point of
the elf file. This api auto detects the 64/32 bit elf file and returns
the boot addr accordingly.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
drivers/remoteproc/rproc-elf-loader.c
include/remoteproc.h
test/dm/remoteproc.c

index 42a78f4207ebc8c93e19d4f5b64a7345f6a75b41..b38a226065df7f5f23de3efb915383180a0775bc 100644 (file)
@@ -251,3 +251,27 @@ int rproc_elf_load_image(struct udevice *dev, ulong addr, ulong size)
        else
                return rproc_elf32_load_image(dev, addr, size);
 }
+
+static ulong rproc_elf32_get_boot_addr(ulong addr)
+{
+       Elf32_Ehdr *ehdr = (Elf32_Ehdr *)addr;
+
+       return ehdr->e_entry;
+}
+
+static ulong rproc_elf64_get_boot_addr(ulong addr)
+{
+       Elf64_Ehdr *ehdr = (Elf64_Ehdr *)addr;
+
+       return ehdr->e_entry;
+}
+
+ulong rproc_elf_get_boot_addr(struct udevice *dev, ulong addr)
+{
+       Elf32_Ehdr *ehdr = (Elf32_Ehdr *)addr;
+
+       if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
+               return rproc_elf64_get_boot_addr(addr);
+       else
+               return rproc_elf32_get_boot_addr(addr);
+}
index 812e0f47c4be4ccf76428801f61905bad385fe3e..046cd9e54e0209939abe562ac5c017cfabf00468 100644 (file)
@@ -267,6 +267,16 @@ int rproc_elf64_load_image(struct udevice *dev, ulong addr, ulong size);
  * @return 0 if the image is successfully loaded, else appropriate error value.
  */
 int rproc_elf_load_image(struct udevice *dev, unsigned long addr, ulong size);
+
+/**
+ * rproc_elf_get_boot_addr() - Get rproc's boot address.
+ * @dev:       device loading the ELF image
+ * @addr:      valid ELF image address
+ *
+ * This function returns the entry point address of the ELF
+ * image.
+ */
+ulong rproc_elf_get_boot_addr(struct udevice *dev, ulong addr);
 #else
 static inline int rproc_init(void) { return -ENOSYS; }
 static inline int rproc_dev_init(int id) { return -ENOSYS; }
@@ -292,6 +302,8 @@ static inline int rproc_elf64_load_image(struct udevice *dev, ulong addr,
 static inline int rproc_elf_load_image(struct udevice *dev, ulong addr,
                                       ulong size)
 { return -ENOSYS; }
+static inline ulong rproc_elf_get_boot_addr(struct udevice *dev, ulong addr)
+{ return 0; }
 #endif
 
 #endif /* _RPROC_H_ */
index c77361c8f4450c82fb53414b151c4d21e79221d9..1d9a9b32d550fc07040c0f61d6bac7cbe916393d 100644 (file)
@@ -174,6 +174,8 @@ static int dm_test_remoteproc_elf(struct unit_test_state *uts)
        /* Load firmware in loaded_firmware, and verify it */
        ut_assertok(rproc_elf32_load_image(dev, (ulong)valid_elf32, size));
        ut_assertok(memcmp(loaded_firmware, valid_elf32, loaded_firmware_size));
+       ut_asserteq(rproc_elf_get_boot_addr(dev, (unsigned long)valid_elf32),
+                   0x08000000);
        unmap_physmem(loaded_firmware, MAP_NOCACHE);
 
        /* Invalid ELF Magic */