]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
remoteproc: elf_loader: Always check the validity of the image before loading
authorLokesh Vutla <lokeshvutla@ti.com>
Wed, 4 Sep 2019 10:31:28 +0000 (16:01 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 11 Oct 2019 14:07:34 +0000 (10:07 -0400)
rproc_elf32_load_image() rely on user to send a valid address for elf loading.
Instead do a sanity check on the address passed by user. This will help
all rproc elf users to not call sanity_check explicitly before calling
elf_loading.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Reviewed-by: Fabien Dessenne <fabien.dessenne@st.com>
drivers/remoteproc/rproc-elf-loader.c
drivers/remoteproc/stm32_copro.c
include/remoteproc.h
test/dm/remoteproc.c

index 7574ba3fb31daad7ec8f0796cb0320f81c30b797..238f51d3b56582774c47ebe5e57c28ad7322a5c0 100644 (file)
@@ -64,13 +64,18 @@ int rproc_elf32_sanity_check(ulong addr, ulong size)
        return 0;
 }
 
-/* A very simple elf loader, assumes the image is valid */
-int rproc_elf32_load_image(struct udevice *dev, unsigned long addr)
+int rproc_elf32_load_image(struct udevice *dev, unsigned long addr, ulong size)
 {
        Elf32_Ehdr *ehdr; /* Elf header structure pointer */
        Elf32_Phdr *phdr; /* Program header structure pointer */
        const struct dm_rproc_ops *ops;
-       unsigned int i;
+       unsigned int i, ret;
+
+       ret =  rproc_elf32_sanity_check(addr, size);
+       if (ret) {
+               dev_err(dev, "Invalid ELF32 Image %d\n", ret);
+               return ret;
+       }
 
        ehdr = (Elf32_Ehdr *)addr;
        phdr = (Elf32_Phdr *)(addr + ehdr->e_phoff);
index 71895daf9c5ca55d7b4056e4aa3ed530d268ce89..40bba3721192bd57bf1bd9c43131bbffa2959955 100644 (file)
@@ -155,14 +155,7 @@ static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
                return ret;
        }
 
-       /* Support only ELF32 image */
-       ret = rproc_elf32_sanity_check(addr, size);
-       if (ret) {
-               dev_err(dev, "Invalid ELF32 image (%d)\n", ret);
-               return ret;
-       }
-
-       return rproc_elf32_load_image(dev, addr);
+       return rproc_elf32_load_image(dev, addr, size);
 }
 
 /**
index dbff1ce3cf436d7f59583a019b1766260339ed3d..1ef88be7f75029dc865e416aa47030a03a7e8736 100644 (file)
@@ -218,9 +218,10 @@ int rproc_elf32_sanity_check(ulong addr, ulong size);
  * rproc_elf32_load_image() - load an ELF32 image
  * @dev:       device loading the ELF32 image
  * @addr:      valid ELF32 image address
+ * @size:      size of the image
  * @return 0 if the image is successfully loaded, else appropriate error value.
  */
-int rproc_elf32_load_image(struct udevice *dev, unsigned long addr);
+int rproc_elf32_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; }
@@ -234,7 +235,8 @@ static inline int rproc_is_running(int id) { return -ENOSYS; }
 static inline int rproc_elf32_sanity_check(ulong addr,
                                           ulong size) { return -ENOSYS; }
 static inline int rproc_elf32_load_image(struct udevice *dev,
-                                        unsigned long addr) { return -ENOSYS; }
+                                        unsigned long addr, ulong size)
+{ return -ENOSYS; }
 #endif
 
 #endif /* _RPROC_H_ */
index a2c4be7c27988ad472c880f2963eca1231d4647a..c77361c8f4450c82fb53414b151c4d21e79221d9 100644 (file)
@@ -171,11 +171,8 @@ static int dm_test_remoteproc_elf(struct unit_test_state *uts)
        ut_assertnonnull(loaded_firmware);
        memset(loaded_firmware, 0, loaded_firmware_size);
 
-       /* Verify valid ELF format */
-       ut_assertok(rproc_elf32_sanity_check((ulong)valid_elf32, size));
-
        /* Load firmware in loaded_firmware, and verify it */
-       ut_assertok(rproc_elf32_load_image(dev, (unsigned long)valid_elf32));
+       ut_assertok(rproc_elf32_load_image(dev, (ulong)valid_elf32, size));
        ut_assertok(memcmp(loaded_firmware, valid_elf32, loaded_firmware_size));
        unmap_physmem(loaded_firmware, MAP_NOCACHE);