mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-30 18:05:48 +01: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:
		| @@ -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); | ||||
| } | ||||
|   | ||||
| @@ -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_ */ | ||||
|   | ||||
| @@ -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 */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user