bootm: push relocate_image up to the generic command
All handlers used to just relocate the image without any checks, so we are doomed if we write outside of SDRAM or will overwrite ourselves. Move the relocation up to the generic part where we have a chance of catching these issues. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
ec4ee82ca9
commit
351058fa51
|
@ -29,13 +29,6 @@ static int do_bootm_linux(struct image_data *data)
|
|||
debug("## Transferring control to Linux (at address 0x%p) ...\n",
|
||||
theKernel);
|
||||
|
||||
if (relocate_image(data->os, (void *)image_get_load(os_header)))
|
||||
return -1;
|
||||
|
||||
if (data->initrd)
|
||||
if (relocate_image(data->initrd, (void *)image_get_load(&data->initrd->header)))
|
||||
return -1;
|
||||
|
||||
/* we assume that the kernel is in place */
|
||||
printf("\nStarting kernel %s...\n\n", data->initrd ? "with initrd " : "");
|
||||
|
||||
|
|
|
@ -50,9 +50,6 @@ static int do_bootm_linux(struct image_data *idata)
|
|||
appl = (int (*)(char *))image_get_ep(os_header);
|
||||
printf("Starting Kernel at 0x%p\n", appl);
|
||||
|
||||
if (relocate_image(os_handle, (void *)image_get_load(os_header)))
|
||||
return -1;
|
||||
|
||||
icache_disable();
|
||||
|
||||
strncpy(cmdlinedest, cmdline, 0x1000);
|
||||
|
|
|
@ -43,9 +43,6 @@ static int do_bootm_linux(struct image_data *idata)
|
|||
|
||||
kernel = (void (*)(int, int, int, const char *))ntohl(os_header->ih_ep);
|
||||
|
||||
if (relocate_image(idata->os, (void *)ntohl(os_header->ih_load)))
|
||||
return -1;
|
||||
|
||||
/* kernel parameters passing
|
||||
* r4 : NIOS magic
|
||||
* r5 : initrd start
|
||||
|
|
|
@ -200,9 +200,6 @@ static int do_bootm_linux(struct image_data *idata)
|
|||
|
||||
kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))image_get_ep(os_header); /* FIXME */
|
||||
|
||||
if (relocate_image(idata->os, (void *)image_get_load(os_header)))
|
||||
return -1;
|
||||
|
||||
#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
|
||||
unlock_ram_in_cache();
|
||||
#endif
|
||||
|
|
|
@ -210,6 +210,23 @@ static int do_bootm(struct command *cmdtp, int argc, char *argv[])
|
|||
|
||||
puts ("OK\n");
|
||||
|
||||
/*
|
||||
* FIXME: we do not check at all whether
|
||||
* - we will write the image to sdram
|
||||
* - we overwrite ourselves
|
||||
* - kernel and initrd overlap
|
||||
*/
|
||||
ret = relocate_image(data.os, (void *)image_get_load(os_header));
|
||||
if (ret)
|
||||
goto err_out;
|
||||
|
||||
if (data.initrd) {
|
||||
ret = relocate_image(data.initrd,
|
||||
(void *)image_get_load(&data.initrd->header));
|
||||
if (ret)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* loop through the registered handlers */
|
||||
list_for_each_entry(handler, &handler_list, list) {
|
||||
if (image_get_os(os_header) == handler->image_type) {
|
||||
|
|
Loading…
Reference in New Issue