mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-06-09 23:36:03 +09:00
SPL: Let spl_parse_image_header() return value
Allow the spl_parse_image_header() to return value. This is convenient for controlling the SPL boot flow if the loaded image is corrupted. Signed-off-by: Marek Vasut <marex@denx.de> Cc: Fabio Estevam <fabio.estevam@nxp.com> Cc: Peng Fan <van.freenix@gmail.com> Cc: Stefano Babic <sbabic@denx.de> Cc: Tom Rini <trini@konsulko.com>
This commit is contained in:
parent
249092fa81
commit
7e0f22674a
|
@ -73,7 +73,7 @@ void spl_set_header_raw_uboot(void)
|
||||||
spl_image.name = "U-Boot";
|
spl_image.name = "U-Boot";
|
||||||
}
|
}
|
||||||
|
|
||||||
void spl_parse_image_header(const struct image_header *header)
|
int spl_parse_image_header(const struct image_header *header)
|
||||||
{
|
{
|
||||||
u32 header_size = sizeof(struct image_header);
|
u32 header_size = sizeof(struct image_header);
|
||||||
|
|
||||||
|
@ -118,6 +118,7 @@ void spl_parse_image_header(const struct image_header *header)
|
||||||
spl_set_header_raw_uboot();
|
spl_set_header_raw_uboot();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
|
__weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
|
||||||
|
|
|
@ -48,7 +48,11 @@ int spl_load_image_ext(struct blk_desc *block_dev,
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
spl_parse_image_header(header);
|
err = spl_parse_image_header(header);
|
||||||
|
if (err < 0) {
|
||||||
|
puts("spl: ext4fs_read failed\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
err = ext4fs_read((char *)spl_image.load_addr, filelen, &actlen);
|
err = ext4fs_read((char *)spl_image.load_addr, filelen, &actlen);
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,9 @@ int spl_load_image_fat(struct blk_desc *block_dev,
|
||||||
if (err <= 0)
|
if (err <= 0)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
spl_parse_image_header(header);
|
err = spl_parse_image_header(header);
|
||||||
|
if (err <= 0)
|
||||||
|
goto end;
|
||||||
|
|
||||||
err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0);
|
err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0);
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,12 @@ static int mmc_load_legacy(struct mmc *mmc, ulong sector,
|
||||||
{
|
{
|
||||||
u32 image_size_sectors;
|
u32 image_size_sectors;
|
||||||
unsigned long count;
|
unsigned long count;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = spl_parse_image_header(header);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
spl_parse_image_header(header);
|
|
||||||
/* convert size to sectors - round up */
|
/* convert size to sectors - round up */
|
||||||
image_size_sectors = (spl_image.size + mmc->read_bl_len - 1) /
|
image_size_sectors = (spl_image.size + mmc->read_bl_len - 1) /
|
||||||
mmc->read_bl_len;
|
mmc->read_bl_len;
|
||||||
|
|
|
@ -32,7 +32,10 @@ static int spl_nand_load_element(int offset, struct image_header *header)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
spl_parse_image_header(header);
|
err = spl_parse_image_header(header);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
return nand_spl_load_image(offset, spl_image.size,
|
return nand_spl_load_image(offset, spl_image.size,
|
||||||
(void *)(unsigned long)spl_image.load_addr);
|
(void *)(unsigned long)spl_image.load_addr);
|
||||||
}
|
}
|
||||||
|
@ -77,7 +80,9 @@ int spl_nand_load_image(void)
|
||||||
/* load linux */
|
/* load linux */
|
||||||
nand_spl_load_image(CONFIG_SYS_NAND_SPL_KERNEL_OFFS,
|
nand_spl_load_image(CONFIG_SYS_NAND_SPL_KERNEL_OFFS,
|
||||||
sizeof(*header), (void *)header);
|
sizeof(*header), (void *)header);
|
||||||
spl_parse_image_header(header);
|
err = spl_parse_image_header(header);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
if (header->ih_os == IH_OS_LINUX) {
|
if (header->ih_os == IH_OS_LINUX) {
|
||||||
/* happy - was a linux */
|
/* happy - was a linux */
|
||||||
err = nand_spl_load_image(
|
err = nand_spl_load_image(
|
||||||
|
|
|
@ -34,7 +34,5 @@ int spl_net_load_image(const char *device)
|
||||||
printf("Problem booting with BOOTP\n");
|
printf("Problem booting with BOOTP\n");
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
spl_parse_image_header((struct image_header *)load_addr);
|
return spl_parse_image_header((struct image_header *)load_addr);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
int spl_nor_load_image(void)
|
int spl_nor_load_image(void)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
/*
|
/*
|
||||||
* Loading of the payload to SDRAM is done with skipping of
|
* Loading of the payload to SDRAM is done with skipping of
|
||||||
* the mkimage header in this SPL NOR driver
|
* the mkimage header in this SPL NOR driver
|
||||||
|
@ -28,7 +29,9 @@ int spl_nor_load_image(void)
|
||||||
if (image_get_os(header) == IH_OS_LINUX) {
|
if (image_get_os(header) == IH_OS_LINUX) {
|
||||||
/* happy - was a Linux */
|
/* happy - was a Linux */
|
||||||
|
|
||||||
spl_parse_image_header(header);
|
ret = spl_parse_image_header(header);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
memcpy((void *)spl_image.load_addr,
|
memcpy((void *)spl_image.load_addr,
|
||||||
(void *)(CONFIG_SYS_OS_BASE +
|
(void *)(CONFIG_SYS_OS_BASE +
|
||||||
|
@ -56,8 +59,10 @@ int spl_nor_load_image(void)
|
||||||
* Load real U-Boot from its location in NOR flash to its
|
* Load real U-Boot from its location in NOR flash to its
|
||||||
* defined location in SDRAM
|
* defined location in SDRAM
|
||||||
*/
|
*/
|
||||||
spl_parse_image_header(
|
ret = spl_parse_image_header(
|
||||||
(const struct image_header *)CONFIG_SYS_UBOOT_BASE);
|
(const struct image_header *)CONFIG_SYS_UBOOT_BASE);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
memcpy((void *)(unsigned long)spl_image.load_addr,
|
memcpy((void *)(unsigned long)spl_image.load_addr,
|
||||||
(void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)),
|
(void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)),
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
int spl_onenand_load_image(void)
|
int spl_onenand_load_image(void)
|
||||||
{
|
{
|
||||||
struct image_header *header;
|
struct image_header *header;
|
||||||
|
int ret;
|
||||||
|
|
||||||
debug("spl: onenand\n");
|
debug("spl: onenand\n");
|
||||||
|
|
||||||
|
@ -25,7 +26,9 @@ int spl_onenand_load_image(void)
|
||||||
/* Load u-boot */
|
/* Load u-boot */
|
||||||
onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS,
|
onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS,
|
||||||
CONFIG_SYS_ONENAND_PAGE_SIZE, (void *)header);
|
CONFIG_SYS_ONENAND_PAGE_SIZE, (void *)header);
|
||||||
spl_parse_image_header(header);
|
ret = spl_parse_image_header(header);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS,
|
onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS,
|
||||||
spl_image.size, (void *)spl_image.load_addr);
|
spl_image.size, (void *)spl_image.load_addr);
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,11 @@ int spl_ymodem_load_image(void)
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
while ((res =
|
while ((res =
|
||||||
xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) {
|
xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) {
|
||||||
if (addr == 0)
|
if (addr == 0) {
|
||||||
spl_parse_image_header((struct image_header *)buf);
|
ret = spl_parse_image_header((struct image_header *)buf);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
store_addr = addr + spl_image.load_addr;
|
store_addr = addr + spl_image.load_addr;
|
||||||
size += res;
|
size += res;
|
||||||
addr += res;
|
addr += res;
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
static int spi_load_image_os(struct spi_flash *flash,
|
static int spi_load_image_os(struct spi_flash *flash,
|
||||||
struct image_header *header)
|
struct image_header *header)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
/* Read for a header, parse or error out. */
|
/* Read for a header, parse or error out. */
|
||||||
spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40,
|
spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40,
|
||||||
(void *)header);
|
(void *)header);
|
||||||
|
@ -30,7 +32,9 @@ static int spi_load_image_os(struct spi_flash *flash,
|
||||||
if (image_get_magic(header) != IH_MAGIC)
|
if (image_get_magic(header) != IH_MAGIC)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
spl_parse_image_header(header);
|
err = spl_parse_image_header(header);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS,
|
spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS,
|
||||||
spl_image.size, (void *)spl_image.load_addr);
|
spl_image.size, (void *)spl_image.load_addr);
|
||||||
|
@ -81,7 +85,9 @@ int spl_spi_load_image(void)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
spl_parse_image_header(header);
|
err = spl_parse_image_header(header);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
err = spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS,
|
err = spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS,
|
||||||
spl_image.size, (void *)spl_image.load_addr);
|
spl_image.size, (void *)spl_image.load_addr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ void preloader_console_init(void);
|
||||||
u32 spl_boot_device(void);
|
u32 spl_boot_device(void);
|
||||||
u32 spl_boot_mode(void);
|
u32 spl_boot_mode(void);
|
||||||
void spl_set_header_raw_uboot(void);
|
void spl_set_header_raw_uboot(void);
|
||||||
void spl_parse_image_header(const struct image_header *header);
|
int spl_parse_image_header(const struct image_header *header);
|
||||||
void spl_board_prepare_for_linux(void);
|
void spl_board_prepare_for_linux(void);
|
||||||
void __noreturn jump_to_image_linux(void *arg);
|
void __noreturn jump_to_image_linux(void *arg);
|
||||||
int spl_start_uboot(void);
|
int spl_start_uboot(void);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user