Commit 14d963d1b51fc7a57b8d561588f163d7cae8ed81

Authored by Lokesh Vutla
Committed by Tom Rini
1 parent c08eb93626

remoteproc: elf_loader: Always check the validity of the image before loading

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>

Showing 4 changed files with 14 additions and 17 deletions Side-by-side Diff

drivers/remoteproc/rproc-elf-loader.c
... ... @@ -64,13 +64,18 @@
64 64 return 0;
65 65 }
66 66  
67   -/* A very simple elf loader, assumes the image is valid */
68   -int rproc_elf32_load_image(struct udevice *dev, unsigned long addr)
  67 +int rproc_elf32_load_image(struct udevice *dev, unsigned long addr, ulong size)
69 68 {
70 69 Elf32_Ehdr *ehdr; /* Elf header structure pointer */
71 70 Elf32_Phdr *phdr; /* Program header structure pointer */
72 71 const struct dm_rproc_ops *ops;
73   - unsigned int i;
  72 + unsigned int i, ret;
  73 +
  74 + ret = rproc_elf32_sanity_check(addr, size);
  75 + if (ret) {
  76 + dev_err(dev, "Invalid ELF32 Image %d\n", ret);
  77 + return ret;
  78 + }
74 79  
75 80 ehdr = (Elf32_Ehdr *)addr;
76 81 phdr = (Elf32_Phdr *)(addr + ehdr->e_phoff);
drivers/remoteproc/stm32_copro.c
... ... @@ -155,14 +155,7 @@
155 155 return ret;
156 156 }
157 157  
158   - /* Support only ELF32 image */
159   - ret = rproc_elf32_sanity_check(addr, size);
160   - if (ret) {
161   - dev_err(dev, "Invalid ELF32 image (%d)\n", ret);
162   - return ret;
163   - }
164   -
165   - return rproc_elf32_load_image(dev, addr);
  158 + return rproc_elf32_load_image(dev, addr, size);
166 159 }
167 160  
168 161 /**
include/remoteproc.h
... ... @@ -218,9 +218,10 @@
218 218 * rproc_elf32_load_image() - load an ELF32 image
219 219 * @dev: device loading the ELF32 image
220 220 * @addr: valid ELF32 image address
  221 + * @size: size of the image
221 222 * @return 0 if the image is successfully loaded, else appropriate error value.
222 223 */
223   -int rproc_elf32_load_image(struct udevice *dev, unsigned long addr);
  224 +int rproc_elf32_load_image(struct udevice *dev, unsigned long addr, ulong size);
224 225 #else
225 226 static inline int rproc_init(void) { return -ENOSYS; }
226 227 static inline int rproc_dev_init(int id) { return -ENOSYS; }
... ... @@ -234,7 +235,8 @@
234 235 static inline int rproc_elf32_sanity_check(ulong addr,
235 236 ulong size) { return -ENOSYS; }
236 237 static inline int rproc_elf32_load_image(struct udevice *dev,
237   - unsigned long addr) { return -ENOSYS; }
  238 + unsigned long addr, ulong size)
  239 +{ return -ENOSYS; }
238 240 #endif
239 241  
240 242 #endif /* _RPROC_H_ */
test/dm/remoteproc.c
... ... @@ -171,11 +171,8 @@
171 171 ut_assertnonnull(loaded_firmware);
172 172 memset(loaded_firmware, 0, loaded_firmware_size);
173 173  
174   - /* Verify valid ELF format */
175   - ut_assertok(rproc_elf32_sanity_check((ulong)valid_elf32, size));
176   -
177 174 /* Load firmware in loaded_firmware, and verify it */
178   - ut_assertok(rproc_elf32_load_image(dev, (unsigned long)valid_elf32));
  175 + ut_assertok(rproc_elf32_load_image(dev, (ulong)valid_elf32, size));
179 176 ut_assertok(memcmp(loaded_firmware, valid_elf32, loaded_firmware_size));
180 177 unmap_physmem(loaded_firmware, MAP_NOCACHE);
181 178