|
@@ -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;
|