|
@@ -285,6 +285,57 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * get_kernel - find kernel image
|
|
|
+ * @os_data: pointer to a ulong variable, will hold os data start address
|
|
|
+ * @os_len: pointer to a ulong variable, will hold os data length
|
|
|
+ *
|
|
|
+ * get_kernel() tries to find a kernel image, verifies its integrity
|
|
|
+ * and locates kernel data.
|
|
|
+ *
|
|
|
+ * returns:
|
|
|
+ * pointer to image header if valid image was found, plus kernel start
|
|
|
+ * address and length, otherwise NULL
|
|
|
+ */
|
|
|
+static image_header_t *image_get_kernel (ulong img_addr, int verify)
|
|
|
+{
|
|
|
+ image_header_t *hdr = (image_header_t *)img_addr;
|
|
|
+
|
|
|
+ if (!image_check_magic(hdr)) {
|
|
|
+ puts ("Bad Magic Number\n");
|
|
|
+ show_boot_progress (-1);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ show_boot_progress (2);
|
|
|
+
|
|
|
+ if (!image_check_hcrc (hdr)) {
|
|
|
+ puts ("Bad Header Checksum\n");
|
|
|
+ show_boot_progress (-2);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ show_boot_progress (3);
|
|
|
+ image_print_contents (hdr);
|
|
|
+
|
|
|
+ if (verify) {
|
|
|
+ puts (" Verifying Checksum ... ");
|
|
|
+ if (!image_check_dcrc (hdr)) {
|
|
|
+ printf ("Bad Data CRC\n");
|
|
|
+ show_boot_progress (-3);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ puts ("OK\n");
|
|
|
+ }
|
|
|
+ show_boot_progress (4);
|
|
|
+
|
|
|
+ if (!image_check_target_arch (hdr)) {
|
|
|
+ printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr));
|
|
|
+ show_boot_progress (-4);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ return hdr;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* get_kernel - find kernel image
|
|
|
* @os_data: pointer to a ulong variable, will hold os data start address
|
|
@@ -339,40 +390,9 @@ static void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
|
|
case IMAGE_FORMAT_LEGACY:
|
|
|
|
|
|
debug ("* kernel: legacy format image\n");
|
|
|
- hdr = (image_header_t *)img_addr;
|
|
|
-
|
|
|
- if (!image_check_magic(hdr)) {
|
|
|
- puts ("Bad Magic Number\n");
|
|
|
- show_boot_progress (-1);
|
|
|
+ hdr = image_get_kernel (img_addr, images->verify);
|
|
|
+ if (!hdr)
|
|
|
return NULL;
|
|
|
- }
|
|
|
- show_boot_progress (2);
|
|
|
-
|
|
|
- if (!image_check_hcrc (hdr)) {
|
|
|
- puts ("Bad Header Checksum\n");
|
|
|
- show_boot_progress (-2);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
-
|
|
|
- show_boot_progress (3);
|
|
|
- image_print_contents (hdr);
|
|
|
-
|
|
|
- if (images->verify) {
|
|
|
- puts (" Verifying Checksum ... ");
|
|
|
- if (!image_check_dcrc (hdr)) {
|
|
|
- printf ("Bad Data CRC\n");
|
|
|
- show_boot_progress (-3);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- puts ("OK\n");
|
|
|
- }
|
|
|
- show_boot_progress (4);
|
|
|
-
|
|
|
- if (!image_check_target_arch (hdr)) {
|
|
|
- printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr));
|
|
|
- show_boot_progress (-4);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
show_boot_progress (5);
|
|
|
|
|
|
switch (image_get_type (hdr)) {
|