diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c
index 319d4ba41185726395c23c84d79becc1736d7255..ad05bc5d8e25372d2a2359976d7a958482bc1bd7 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;