mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 12:54:37 +00:00
remoteproc: elf_loader: Introduce rproc_elf_get_boot_addr() api
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>
This commit is contained in:
parent
856c0ad413
commit
81e39fbd92
3 changed files with 38 additions and 0 deletions
|
@ -251,3 +251,27 @@ int rproc_elf_load_image(struct udevice *dev, ulong addr, ulong size)
|
||||||
else
|
else
|
||||||
return rproc_elf32_load_image(dev, addr, size);
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -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.
|
* @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);
|
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
|
#else
|
||||||
static inline int rproc_init(void) { return -ENOSYS; }
|
static inline int rproc_init(void) { return -ENOSYS; }
|
||||||
static inline int rproc_dev_init(int id) { 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,
|
static inline int rproc_elf_load_image(struct udevice *dev, ulong addr,
|
||||||
ulong size)
|
ulong size)
|
||||||
{ return -ENOSYS; }
|
{ return -ENOSYS; }
|
||||||
|
static inline ulong rproc_elf_get_boot_addr(struct udevice *dev, ulong addr)
|
||||||
|
{ return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _RPROC_H_ */
|
#endif /* _RPROC_H_ */
|
||||||
|
|
|
@ -174,6 +174,8 @@ static int dm_test_remoteproc_elf(struct unit_test_state *uts)
|
||||||
/* Load firmware in loaded_firmware, and verify it */
|
/* Load firmware in loaded_firmware, and verify it */
|
||||||
ut_assertok(rproc_elf32_load_image(dev, (ulong)valid_elf32, size));
|
ut_assertok(rproc_elf32_load_image(dev, (ulong)valid_elf32, size));
|
||||||
ut_assertok(memcmp(loaded_firmware, valid_elf32, loaded_firmware_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);
|
unmap_physmem(loaded_firmware, MAP_NOCACHE);
|
||||||
|
|
||||||
/* Invalid ELF Magic */
|
/* Invalid ELF Magic */
|
||||||
|
|
Loading…
Add table
Reference in a new issue