remoteproc: elf_loader: Introduce a common elf loader and checker functions
Introduce a common remoteproc elf loader and checker functions that automatically detects the 64 bit elf file or 32 bit elf file and loads/checks the sections accordingly. Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com> Reviewed-by: Fabien Dessenne <fabien.dessenne@st.com>
This commit is contained in:
parent
e3c4d6f01f
commit
856c0ad413
@ -120,6 +120,22 @@ int rproc_elf64_sanity_check(ulong addr, ulong size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Basic function to verify ELF image format */
|
||||
int rproc_elf_sanity_check(ulong addr, ulong size)
|
||||
{
|
||||
Elf32_Ehdr *ehdr = (Elf32_Ehdr *)addr;
|
||||
|
||||
if (!addr) {
|
||||
dev_err(dev, "Invalid firmware address\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
|
||||
return rproc_elf64_sanity_check(addr, size);
|
||||
else
|
||||
return rproc_elf32_sanity_check(addr, size);
|
||||
}
|
||||
|
||||
int rproc_elf32_load_image(struct udevice *dev, unsigned long addr, ulong size)
|
||||
{
|
||||
Elf32_Ehdr *ehdr; /* Elf header structure pointer */
|
||||
@ -220,3 +236,18 @@ int rproc_elf64_load_image(struct udevice *dev, ulong addr, ulong size)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rproc_elf_load_image(struct udevice *dev, ulong addr, ulong size)
|
||||
{
|
||||
Elf32_Ehdr *ehdr = (Elf32_Ehdr *)addr;
|
||||
|
||||
if (!addr) {
|
||||
dev_err(dev, "Invalid firmware address\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
|
||||
return rproc_elf64_load_image(dev, addr, size);
|
||||
else
|
||||
return rproc_elf32_load_image(dev, addr, size);
|
||||
}
|
||||
|
@ -226,6 +226,19 @@ int rproc_elf32_sanity_check(ulong addr, ulong size);
|
||||
*/
|
||||
int rproc_elf64_sanity_check(ulong addr, ulong size);
|
||||
|
||||
/**
|
||||
* rproc_elf_sanity_check() - Verify if an image is a valid ELF one
|
||||
*
|
||||
* Check if a valid ELF image exists at the given memory location. Auto
|
||||
* detects ELF32/ELF64 and verifies basic ELF64/ELF32 format requirements
|
||||
* like magic number and sections size.
|
||||
*
|
||||
* @addr: address of the image to verify
|
||||
* @size: size of the image
|
||||
* @return 0 if the image looks good, else appropriate error value.
|
||||
*/
|
||||
int rproc_elf_sanity_check(ulong addr, ulong size);
|
||||
|
||||
/**
|
||||
* rproc_elf32_load_image() - load an ELF32 image
|
||||
* @dev: device loading the ELF32 image
|
||||
@ -243,6 +256,17 @@ int rproc_elf32_load_image(struct udevice *dev, unsigned long addr, ulong size);
|
||||
* @return 0 if the image is successfully loaded, else appropriate error value.
|
||||
*/
|
||||
int rproc_elf64_load_image(struct udevice *dev, ulong addr, ulong size);
|
||||
|
||||
/**
|
||||
* rproc_elf_load_image() - load an ELF image
|
||||
* @dev: device loading the ELF image
|
||||
* @addr: valid ELF image address
|
||||
* @size: size of the image
|
||||
*
|
||||
* Auto detects if the image is ELF32 or ELF64 image and load accordingly.
|
||||
* @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);
|
||||
#else
|
||||
static inline int rproc_init(void) { return -ENOSYS; }
|
||||
static inline int rproc_dev_init(int id) { return -ENOSYS; }
|
||||
@ -257,12 +281,17 @@ static inline int rproc_elf32_sanity_check(ulong addr,
|
||||
ulong size) { return -ENOSYS; }
|
||||
static inline int rproc_elf64_sanity_check(ulong addr,
|
||||
ulong size) { return -ENOSYS; }
|
||||
static inline int rproc_elf_sanity_check(ulong addr,
|
||||
ulong size) { return -ENOSYS; }
|
||||
static inline int rproc_elf32_load_image(struct udevice *dev,
|
||||
unsigned long addr, ulong size)
|
||||
{ return -ENOSYS; }
|
||||
static inline int rproc_elf64_load_image(struct udevice *dev, ulong addr,
|
||||
ulong size)
|
||||
{ return -ENOSYS; }
|
||||
static inline int rproc_elf_load_image(struct udevice *dev, ulong addr,
|
||||
ulong size)
|
||||
{ return -ENOSYS; }
|
||||
#endif
|
||||
|
||||
#endif /* _RPROC_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user