[new uImage] Add image_get_kernel() routine
authorMarian Balakowicz <m8@semihalf.com>
Wed, 27 Feb 2008 10:02:07 +0000 (11:02 +0100)
committerMarian Balakowicz <m8@semihalf.com>
Wed, 27 Feb 2008 10:02:07 +0000 (11:02 +0100)
Legacy image specific verification is factored out to a separate helper
routine to keep get_kernel() generic and simple.

Signed-off-by: Marian Balakowicz <m8@semihalf.com>
Acked-by: Kumar Gala <galak@kernel.crashing.org>
common/cmd_bootm.c

index ce2de2e..e5ed167 100644 (file)
@@ -297,6 +297,57 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
  *     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
+ * @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 void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                bootm_headers_t *images, ulong *os_data, ulong *os_len)
 {
@@ -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)) {