Commit 14d963d1b51fc7a57b8d561588f163d7cae8ed81
Committed by
Tom Rini
1 parent
c08eb93626
Exists in
smarc_8mq_lf_v2020.04
and in
9 other branches
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 |