summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib_ppc/bootm.c76
1 files changed, 44 insertions, 32 deletions
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c
index 319d4ba411..ad05bc5d8e 100644
--- a/lib_ppc/bootm.c
+++ b/lib_ppc/bootm.c
@@ -237,6 +237,39 @@ static void fdt_error (const char *msg)
puts (" - must RESET the board to recover.\n");
}
+static image_header_t *image_get_fdt (ulong fdt_addr)
+{
+ image_header_t *fdt_hdr = (image_header_t *)fdt_addr;
+
+ image_print_contents (fdt_hdr);
+
+ puts (" Verifying Checksum ... ");
+ if (!image_check_hcrc (fdt_hdr)) {
+ fdt_error ("fdt header checksum invalid");
+ return NULL;
+ }
+
+ if (!image_check_dcrc (fdt_hdr)) {
+ fdt_error ("fdt checksum invalid");
+ return NULL;
+ }
+ puts ("OK\n");
+
+ if (!image_check_type (fdt_hdr, IH_TYPE_FLATDT)) {
+ fdt_error ("uImage is not a fdt");
+ return NULL;
+ }
+ if (image_get_comp (fdt_hdr) != IH_COMP_NONE) {
+ fdt_error ("uImage is compressed");
+ return NULL;
+ }
+ if (fdt_check_header ((char *)image_get_data (fdt_hdr)) != 0) {
+ fdt_error ("uImage data is not a fdt");
+ return NULL;
+ }
+ return fdt_hdr;
+}
+
static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
bootm_headers_t *images, char **of_flat_tree, ulong *of_size)
{
@@ -297,12 +330,17 @@ static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
case IMAGE_FORMAT_LEGACY:
debug ("* fdt: legacy format image\n");
- fdt_hdr = (image_header_t *)fdt_addr;
+ /* verify fdt_addr points to a valid image header */
printf ("## Flattened Device Tree Legacy Image at %08lx\n",
- fdt_hdr);
-
- image_print_contents (fdt_hdr);
+ fdt_addr);
+ fdt_hdr = image_get_fdt (fdt_addr);
+ if (!fdt_hdr)
+ do_reset (cmdtp, flag, argc, argv);
+ /*
+ * move image data to the load address,
+ * make sure we don't overwrite initial image
+ */
image_start = (ulong)fdt_hdr;
image_end = image_get_image_end (fdt_hdr);
@@ -313,35 +351,9 @@ static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
fdt_error ("fdt overwritten");
do_reset (cmdtp, flag, argc, argv);
}
-
- puts (" Verifying Checksum ... ");
- if (!image_check_hcrc (fdt_hdr)) {
- fdt_error ("fdt header checksum invalid");
- do_reset (cmdtp, flag, argc, argv);
- }
-
- if (!image_check_dcrc (fdt_hdr)) {
- fdt_error ("fdt checksum invalid");
- do_reset (cmdtp, flag, argc, argv);
- }
- puts ("OK\n");
-
- if (!image_check_type (fdt_hdr, IH_TYPE_FLATDT)) {
- fdt_error ("uImage is not a fdt");
- do_reset (cmdtp, flag, argc, argv);
- }
- if (image_get_comp (fdt_hdr) != IH_COMP_NONE) {
- fdt_error ("uImage is compressed");
- do_reset (cmdtp, flag, argc, argv);
- }
- if (fdt_check_header ((char *)image_get_data (fdt_hdr)) != 0) {
- fdt_error ("uImage data is not a fdt");
- do_reset (cmdtp, flag, argc, argv);
- }
-
memmove ((void *)image_get_load (fdt_hdr),
- (void *)image_get_data (fdt_hdr),
- image_get_data_size (fdt_hdr));
+ (void *)image_get_data (fdt_hdr),
+ image_get_data_size (fdt_hdr));
fdt_blob = (char *)image_get_load (fdt_hdr);
break;