diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/board_f.c | 13 | ||||
-rw-r--r-- | common/board_r.c | 4 | ||||
-rw-r--r-- | common/bootm.c | 29 | ||||
-rw-r--r-- | common/bootm_os.c | 12 | ||||
-rw-r--r-- | common/image-fdt.c | 2 | ||||
-rw-r--r-- | common/image.c | 8 | ||||
-rw-r--r-- | common/spl/spl.c | 2 | ||||
-rw-r--r-- | common/spl/spl_ext.c | 2 |
8 files changed, 50 insertions, 22 deletions
diff --git a/common/board_f.c b/common/board_f.c index b61036577a5..88ff0424a7b 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -502,11 +502,12 @@ static int reserve_malloc(void) static int reserve_board(void) { if (!gd->bd) { - gd->start_addr_sp = reserve_stack_aligned(sizeof(bd_t)); - gd->bd = (bd_t *)map_sysmem(gd->start_addr_sp, sizeof(bd_t)); - memset(gd->bd, '\0', sizeof(bd_t)); + gd->start_addr_sp = reserve_stack_aligned(sizeof(struct bd_info)); + gd->bd = (struct bd_info *)map_sysmem(gd->start_addr_sp, + sizeof(struct bd_info)); + memset(gd->bd, '\0', sizeof(struct bd_info)); debug("Reserving %zu Bytes for Board Info at: %08lx\n", - sizeof(bd_t), gd->start_addr_sp); + sizeof(struct bd_info), gd->start_addr_sp); } return 0; } @@ -601,7 +602,7 @@ static int display_new_sp(void) defined(CONFIG_SH) static int setup_board_part1(void) { - bd_t *bd = gd->bd; + struct bd_info *bd = gd->bd; /* * Save local variables to board info struct @@ -631,7 +632,7 @@ static int setup_board_part1(void) #if defined(CONFIG_PPC) || defined(CONFIG_M68K) static int setup_board_part2(void) { - bd_t *bd = gd->bd; + struct bd_info *bd = gd->bd; bd->bi_intfreq = gd->cpu_clk; /* Internal Freq, in Hz */ bd->bi_busfreq = gd->bus_clk; /* Bus Freq, in Hz */ diff --git a/common/board_r.c b/common/board_r.c index 5e924322b2f..67dc25c7d28 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -381,7 +381,7 @@ __weak int is_flash_available(void) static int initr_flash(void) { ulong flash_size = 0; - bd_t *bd = gd->bd; + struct bd_info *bd = gd->bd; if (!is_flash_available()) return 0; @@ -533,7 +533,7 @@ static int initr_api(void) #ifdef CONFIG_CMD_NET static int initr_ethaddr(void) { - bd_t *bd = gd->bd; + struct bd_info *bd = gd->bd; /* kept around for legacy kernels only ... ignore the next section */ eth_env_get_enetaddr("ethaddr", bd->bi_enetaddr); diff --git a/common/bootm.c b/common/bootm.c index 2ed7521520a..247b600d9c6 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -228,6 +228,8 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc, * @flag: Ignored Argument * @argc: command argument count * @argv: command argument list + * @start: OS image start address + * @size: OS image size * * boot_find_images() will attempt to load an available ramdisk, * flattened device tree, as well as specifically marked @@ -239,7 +241,8 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc, * 0, if all existing images were loaded correctly * 1, if an image is found but corrupted, or invalid */ -int bootm_find_images(int flag, int argc, char *const argv[]) +int bootm_find_images(int flag, int argc, char *const argv[], ulong start, + ulong size) { int ret; @@ -251,6 +254,16 @@ int bootm_find_images(int flag, int argc, char *const argv[]) return 1; } + /* check if ramdisk overlaps OS image */ + if (images.rd_start && (((ulong)images.rd_start >= start && + (ulong)images.rd_start <= start + size) || + ((ulong)images.rd_end >= start && + (ulong)images.rd_end <= start + size))) { + printf("ERROR: RD image overlaps OS image (OS=0x%lx..0x%lx)\n", + start, start + size); + return 1; + } + #if IMAGE_ENABLE_OF_LIBFDT /* find flattened device tree */ ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images, @@ -259,6 +272,18 @@ int bootm_find_images(int flag, int argc, char *const argv[]) puts("Could not find a valid device tree\n"); return 1; } + + /* check if FDT overlaps OS image */ + if (images.ft_addr && + (((ulong)images.ft_addr >= start && + (ulong)images.ft_addr <= start + size) || + ((ulong)images.ft_addr + images.ft_len >= start && + (ulong)images.ft_addr + images.ft_len <= start + size))) { + printf("ERROR: FDT image overlaps OS image (OS=0x%lx..0x%lx)\n", + start, start + size); + return 1; + } + if (CONFIG_IS_ENABLED(CMD_FDT)) set_working_fdt_addr(map_to_sysmem(images.ft_addr)); #endif @@ -294,7 +319,7 @@ static int bootm_find_other(struct cmd_tbl *cmdtp, int flag, int argc, (images.os.type == IH_TYPE_MULTI)) && (images.os.os == IH_OS_LINUX || images.os.os == IH_OS_VXWORKS)) - return bootm_find_images(flag, argc, argv); + return bootm_find_images(flag, argc, argv, 0, 0); return 0; } diff --git a/common/bootm_os.c b/common/bootm_os.c index 55296483f76..6a95e0de338 100644 --- a/common/bootm_os.c +++ b/common/bootm_os.c @@ -61,7 +61,7 @@ static void copy_args(char *dest, int argc, char *const argv[], char delim) static int do_bootm_netbsd(int flag, int argc, char *const argv[], bootm_headers_t *images) { - void (*loader)(bd_t *, image_header_t *, char *, char *); + void (*loader)(struct bd_info *, image_header_t *, char *, char *); image_header_t *os_hdr, *hdr; ulong kernel_data, kernel_len; char *cmdline; @@ -109,7 +109,7 @@ static int do_bootm_netbsd(int flag, int argc, char *const argv[], cmdline = ""; } - loader = (void (*)(bd_t *, image_header_t *, char *, char *))images->ep; + loader = (void (*)(struct bd_info *, image_header_t *, char *, char *))images->ep; printf("## Transferring control to NetBSD stage-2 loader (at address %08lx) ...\n", (ulong)loader); @@ -155,7 +155,7 @@ static int do_bootm_lynxkdi(int flag, int argc, char *const argv[], static int do_bootm_rtems(int flag, int argc, char *const argv[], bootm_headers_t *images) { - void (*entry_point)(bd_t *); + void (*entry_point)(struct bd_info *); if (flag != BOOTM_STATE_OS_GO) return 0; @@ -167,7 +167,7 @@ static int do_bootm_rtems(int flag, int argc, char *const argv[], } #endif - entry_point = (void (*)(bd_t *))images->ep; + entry_point = (void (*)(struct bd_info *))images->ep; printf("## Transferring control to RTEMS (at address %08lx) ...\n", (ulong)entry_point); @@ -495,7 +495,7 @@ static int do_bootm_tee(int flag, int argc, char *const argv[], return ret; /* Locate FDT etc */ - ret = bootm_find_images(flag, argc, argv); + ret = bootm_find_images(flag, argc, argv, 0, 0); if (ret) return ret; @@ -516,7 +516,7 @@ static int do_bootm_efi(int flag, int argc, char *const argv[], return 0; /* Locate FDT, if provided */ - ret = bootm_find_images(flag, argc, argv); + ret = bootm_find_images(flag, argc, argv, 0, 0); if (ret) return ret; diff --git a/common/image-fdt.c b/common/image-fdt.c index b63e772bd6e..7005b349666 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -426,7 +426,7 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch, break; default: puts("ERROR: Did not find a cmdline Flattened Device Tree\n"); - goto no_fdt; + goto error; } printf(" Booting using the fdt blob at %#08lx\n", fdt_addr); diff --git a/common/image.c b/common/image.c index ff16f5afb0a..9d7d5c17d12 100644 --- a/common/image.c +++ b/common/image.c @@ -1665,10 +1665,12 @@ int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end) * 0 - success * -1 - failure */ -int boot_get_kbd(struct lmb *lmb, bd_t **kbd) +int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd) { - *kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf, - env_get_bootm_mapsize() + env_get_bootm_low()); + *kbd = (struct bd_info *)(ulong)lmb_alloc_base(lmb, + sizeof(struct bd_info), + 0xf, + env_get_bootm_mapsize() + env_get_bootm_low()); if (*kbd == NULL) return -1; diff --git a/common/spl/spl.c b/common/spl/spl.c index 0e96a8cd104..4840d1d3670 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -54,7 +54,7 @@ binman_sym_declare(ulong, spl, size); #endif /* Define board data structure */ -static bd_t bdata __attribute__ ((section(".data"))); +static struct bd_info bdata __attribute__ ((section(".data"))); /* * Board-specific Platform code can reimplement show_boot_progress () if needed diff --git a/common/spl/spl_ext.c b/common/spl/spl_ext.c index 3898041d106..d73f0627621 100644 --- a/common/spl/spl_ext.c +++ b/common/spl/spl_ext.c @@ -32,7 +32,7 @@ int spl_load_image_ext(struct spl_image_info *spl_image, #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT printf("%s: ext4fs mount err - %d\n", __func__, err); #endif - goto end; + return -1; } err = ext4fs_open(filename, &filelen); |