]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/cmd_bootm.c
[new uImage] Add dual format uImage support framework
[karo-tx-uboot.git] / common / cmd_bootm.c
index f441e0e011a4312b7c5945a3e54145c84e8e4ce3..3f099888f2b4ccc4822d2af4840006783862dafe 100644 (file)
 #include <environment.h>
 #include <asm/byteorder.h>
 
-#if defined(CONFIG_OF_LIBFDT)
-#include <fdt.h>
-#include <libfdt.h>
-#include <fdt_support.h>
-#elif defined(CONFIG_OF_FLAT_TREE)
-#include <ft_build.h>
-#endif
-
-#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
-#include <rtc.h>
-#endif
-
 #ifdef CFG_HUSH_PARSER
 #include <hush.h>
 #endif
 
-#ifdef CONFIG_HAS_DATAFLASH
-#include <dataflash.h>
-#endif
-
 DECLARE_GLOBAL_DATA_PTR;
 
 extern int gunzip (void *dst, int dstlen, unsigned char *src, unsigned long *lenp);
@@ -81,7 +65,10 @@ static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 static void fixup_silent_linux (void);
 #endif
 
-static void print_type (image_header_t *hdr);
+static void *get_kernel (cmd_tbl_t *cmdtp, int flag,
+               int argc, char *argv[], int verify,
+               bootm_headers_t *images,
+               ulong *os_data, ulong *os_len);
 extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 
 /*
@@ -94,7 +81,7 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
  */
 typedef void boot_os_fn (cmd_tbl_t *cmdtp, int flag,
                        int argc, char *argv[],
-                       image_header_t *hdr,    /* of image to boot */
+                       bootm_headers_t *images,/* pointers to os/initrd/fdt */
                        int verify);            /* getenv("verify")[0] != 'n' */
 
 extern boot_os_fn do_bootm_linux;
@@ -116,6 +103,7 @@ static boot_os_fn do_bootm_artos;
 #endif
 
 ulong load_addr = CFG_LOAD_ADDR;       /* Default Load Address */
+static bootm_headers_t images;         /* pointers to os/initrd/fdt images */
 
 
 /*******************************************************************/
@@ -124,101 +112,49 @@ ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */
 int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
        ulong           iflag;
-       char            *name, *s;
-       int             (*appl)(int, char *[]);
+       const char      *type_name;
        uint            unc_len = CFG_BOOTM_LEN;
        int             verify = getenv_verify();
+       uint8_t         comp, type, os;
 
-       image_header_t  *hdr;
-       ulong           img_addr;
+       void            *os_hdr;
        ulong           os_data, os_len;
-
        ulong           image_start, image_end;
        ulong           load_start, load_end;
 
+       memset ((void *)&images, 0, sizeof (images));
 
-       if (argc < 2) {
-               img_addr = load_addr;
-       } else {
-               img_addr = simple_strtoul(argv[1], NULL, 16);
-       }
-
-       show_boot_progress (1);
-       printf ("## Booting image at %08lx ...\n", img_addr);
-
-#ifdef CONFIG_HAS_DATAFLASH
-       if (addr_dataflash (img_addr)){
-               hdr = (image_header_t *)CFG_LOAD_ADDR;
-               read_dataflash (img_addr, image_get_header_size (), (char *)hdr);
-       } else
-#endif
-       hdr = (image_header_t *)img_addr;
-
-       if (!image_check_magic(hdr)) {
-               puts ("Bad Magic Number\n");
-               show_boot_progress (-1);
+       /* get kernel image header, start address and length */
+       os_hdr = get_kernel (cmdtp, flag, argc, argv, verify,
+                       &images, &os_data, &os_len);
+       if (os_len == 0)
                return 1;
-       }
-       show_boot_progress (2);
 
-       if (!image_check_hcrc (hdr)) {
-               puts ("Bad Header Checksum\n");
-               show_boot_progress (-2);
-               return 1;
-       }
-       show_boot_progress (3);
-
-#ifdef CONFIG_HAS_DATAFLASH
-       if (addr_dataflash (img_addr))
-               read_dataflash (img_addr + image_get_header_size (),
-                               image_get_data_size (hdr),
-                               (char *)image_get_data (hdr));
-#endif
+       show_boot_progress (6);
 
-       /* uImage is in a system RAM, pointed to by hdr */
-       print_image_hdr (hdr);
+       /* get image parameters */
+       switch (gen_image_get_format (os_hdr)) {
+       case IMAGE_FORMAT_LEGACY:
+               type = image_get_type (os_hdr);
+               comp = image_get_comp (os_hdr);
+               os = image_get_os (os_hdr);
 
-       if (verify) {
-               puts ("   Verifying Checksum ... ");
-               if (!image_check_dcrc (hdr)) {
-                       printf ("Bad Data CRC\n");
-                       show_boot_progress (-3);
-                       return 1;
-               }
-               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 1;
-       }
-       show_boot_progress (5);
-
-       switch (image_get_type (hdr)) {
-       case IH_TYPE_STANDALONE:
-               name = "Standalone Application";
-               /* A second argument overwrites the load address */
-               if (argc > 2) {
-                       image_set_load (hdr, simple_strtoul (argv[2], NULL, 16));
-               }
-               break;
-       case IH_TYPE_KERNEL:
-               name = "Kernel Image";
-               os_data = image_get_data (hdr);
-               os_len = image_get_data_size (hdr);
-               break;
-       case IH_TYPE_MULTI:
-               name = "Multi-File Image";
-               image_multi_getimg (hdr, 0, &os_data, &os_len);
+               image_end = image_get_image_end (os_hdr);
+               load_start = image_get_load (os_hdr);
                break;
+#if defined(CONFIG_FIT)
+       case IMAGE_FORMAT_FIT:
+               fit_unsupported ("bootm");
+               return 1;
+#endif
        default:
-               printf ("Wrong Image Type for %s command\n", cmdtp->name);
-               show_boot_progress (-5);
+               puts ("ERROR: unknown image format type!\n");
                return 1;
        }
-       show_boot_progress (6);
+
+       image_start = (ulong)os_hdr;
+       load_end = 0;
+       type_name = image_get_type_name (type);
 
        /*
         * We have reached the point of no return: we are going to
@@ -238,19 +174,14 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        dcache_disable();
 #endif
 
-       image_start = (ulong)hdr;
-       image_end = image_get_image_end (hdr);
-       load_start = image_get_load (hdr);
-       load_end = 0;
-
-       switch (image_get_comp (hdr)) {
+       switch (comp) {
        case IH_COMP_NONE:
-               if (image_get_load (hdr) == img_addr) {
-                       printf ("   XIP %s ... ", name);
+               if (load_start == (ulong)os_hdr) {
+                       printf ("   XIP %s ... ", type_name);
                } else {
-                       printf ("   Loading %s ... ", name);
+                       printf ("   Loading %s ... ", type_name);
 
-                       memmove_wd ((void *)image_get_load (hdr),
+                       memmove_wd ((void *)load_start,
                                   (void *)os_data, os_len, CHUNKSZ);
 
                        load_end = load_start + os_len;
@@ -258,8 +189,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                }
                break;
        case IH_COMP_GZIP:
-               printf ("   Uncompressing %s ... ", name);
-               if (gunzip ((void *)image_get_load (hdr), unc_len,
+               printf ("   Uncompressing %s ... ", type_name);
+               if (gunzip ((void *)load_start, unc_len,
                                        (uchar *)os_data, &os_len) != 0) {
                        puts ("GUNZIP ERROR - must RESET board to recover\n");
                        show_boot_progress (-6);
@@ -270,13 +201,13 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                break;
 #ifdef CONFIG_BZIP2
        case IH_COMP_BZIP2:
-               printf ("   Uncompressing %s ... ", name);
+               printf ("   Uncompressing %s ... ", type_name);
                /*
                 * If we've got less than 4 MB of malloc() space,
                 * use slower decompression algorithm which requires
                 * at most 2300 KB of memory.
                 */
-               int i = BZ2_bzBuffToBuffDecompress ((char*)image_get_load (hdr),
+               int i = BZ2_bzBuffToBuffDecompress ((char*)load_start,
                                        &unc_len, (char *)os_data, os_len,
                                        CFG_MALLOC_LEN < (4096 * 1024), 0);
                if (i != BZ_OK) {
@@ -291,11 +222,12 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        default:
                if (iflag)
                        enable_interrupts();
-               printf ("Unimplemented compression type %d\n", image_get_comp (hdr));
+               printf ("Unimplemented compression type %d\n", comp);
                show_boot_progress (-7);
                return 1;
        }
        puts ("OK\n");
+       debug ("   kernel loaded at 0x%08lx, end = 0x%08lx\n", load_start, load_end);
        show_boot_progress (7);
 
        if ((load_start < image_end) && (load_end > image_start)) {
@@ -306,72 +238,44 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                do_reset (cmdtp, flag, argc, argv);
        }
 
-       switch (image_get_type (hdr)) {
-       case IH_TYPE_STANDALONE:
-               if (iflag)
-                       enable_interrupts();
-
-               /* load (and uncompress), but don't start if "autostart"
-                * is set to "no"
-                */
-               if (((s = getenv("autostart")) != NULL) && (strcmp(s,"no") == 0)) {
-                       char buf[32];
-                       sprintf(buf, "%lX", image_get_data_size(hdr));
-                       setenv("filesize", buf);
-                       return 0;
-               }
-               appl = (int (*)(int, char *[]))image_get_ep (hdr);
-               (*appl)(argc-1, &argv[1]);
-               return 0;
-       case IH_TYPE_KERNEL:
-       case IH_TYPE_MULTI:
-               /* handled below */
-               break;
-       default:
-               if (iflag)
-                       enable_interrupts();
-               printf ("Can't boot image type %d\n", image_get_type (hdr));
-               show_boot_progress (-8);
-               return 1;
-       }
        show_boot_progress (8);
 
-       switch (image_get_os (hdr)) {
+       switch (os) {
        default:                        /* handled by (original) Linux case */
        case IH_OS_LINUX:
 #ifdef CONFIG_SILENT_CONSOLE
            fixup_silent_linux();
 #endif
-           do_bootm_linux (cmdtp, flag, argc, argv, hdr, verify);
+           do_bootm_linux (cmdtp, flag, argc, argv, &images, verify);
            break;
 
        case IH_OS_NETBSD:
-           do_bootm_netbsd (cmdtp, flag, argc, argv, hdr, verify);
+           do_bootm_netbsd (cmdtp, flag, argc, argv, &images, verify);
            break;
 
 #ifdef CONFIG_LYNXKDI
        case IH_OS_LYNXOS:
-           do_bootm_lynxkdi (cmdtp, flag, argc, argv, hdr, verify);
+           do_bootm_lynxkdi (cmdtp, flag, argc, argv, &images, verify);
            break;
 #endif
 
        case IH_OS_RTEMS:
-           do_bootm_rtems (cmdtp, flag, argc, argv, hdr, verify);
+           do_bootm_rtems (cmdtp, flag, argc, argv, &images, verify);
            break;
 
 #if defined(CONFIG_CMD_ELF)
        case IH_OS_VXWORKS:
-           do_bootm_vxworks (cmdtp, flag, argc, argv, hdr, verify);
+           do_bootm_vxworks (cmdtp, flag, argc, argv, &images, verify);
            break;
 
        case IH_OS_QNX:
-           do_bootm_qnxelf (cmdtp, flag, argc, argv, hdr, verify);
+           do_bootm_qnxelf (cmdtp, flag, argc, argv, &images, verify);
            break;
 #endif
 
 #ifdef CONFIG_ARTOS
        case IH_OS_ARTOS:
-           do_bootm_artos (cmdtp, flag, argc, argv, hdr, verify);
+           do_bootm_artos (cmdtp, flag, argc, argv, &images, verify);
            break;
 #endif
        }
@@ -384,13 +288,140 @@ 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 void *get_kernel (cmd_tbl_t *cmdtp, int flag,
+               int argc, char *argv[], int verify,
+               bootm_headers_t *images,
+               ulong *os_data, ulong *os_len)
+{
+       image_header_t  *hdr;
+       ulong           img_addr;
+#if defined(CONFIG_FIT)
+       void            *fit_hdr;
+       const char      *fit_uname_config = NULL;
+       const char      *fit_uname_kernel = NULL;
+#endif
+
+       /* find out kernel image address */
+       if (argc < 2) {
+               img_addr = load_addr;
+               debug ("*  kernel: default image load address = 0x%08lx\n",
+                               load_addr);
+#if defined(CONFIG_FIT)
+       } else if (fit_parse_conf (argv[1], load_addr, &img_addr,
+                                                       &fit_uname_config)) {
+               debug ("*  kernel: config '%s' from image at 0x%08lx\n",
+                               fit_uname_config, img_addr);
+       } else if (fit_parse_subimage (argv[1], load_addr, &img_addr,
+                                                       &fit_uname_kernel)) {
+               debug ("*  kernel: subimage '%s' from image at 0x%08lx\n",
+                               fit_uname_kernel, img_addr);
+#endif
+       } else {
+               img_addr = simple_strtoul(argv[1], NULL, 16);
+               debug ("*  kernel: cmdline image address = 0x%08lx\n", img_addr);
+       }
+
+       show_boot_progress (1);
+       printf ("## Booting kernel image at %08lx ...\n", img_addr);
+
+       /* copy from dataflash if needed */
+       img_addr = gen_get_image (img_addr);
+
+       /* check image type, for FIT images get FIT kernel node */
+       switch (gen_image_get_format ((void *)img_addr)) {
+       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);
+                       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;
+               }
+               show_boot_progress (5);
+
+               switch (image_get_type (hdr)) {
+               case IH_TYPE_KERNEL:
+                       *os_data = image_get_data (hdr);
+                       *os_len = image_get_data_size (hdr);
+                       break;
+               case IH_TYPE_MULTI:
+                       image_multi_getimg (hdr, 0, os_data, os_len);
+                       break;
+               default:
+                       printf ("Wrong Image Type for %s command\n", cmdtp->name);
+                       show_boot_progress (-5);
+                       return NULL;
+               }
+               images->legacy_hdr_os = hdr;
+               images->legacy_hdr_valid = 1;
+
+               break;
+#if defined(CONFIG_FIT)
+       case IMAGE_FORMAT_FIT:
+               fit_hdr = (void *)img_addr;
+               debug ("*  kernel: FIT format image\n");
+               fit_unsupported ("kernel");
+               return NULL;
+#endif
+       default:
+               printf ("Wrong Image Format for %s command\n", cmdtp->name);
+               return NULL;
+       }
+
+       debug ("   kernel data at 0x%08lx, end = 0x%08lx\n",
+                       *os_data, *os_data + *os_len);
+
+       return (void *)img_addr;
+}
+
 U_BOOT_CMD(
        bootm,  CFG_MAXARGS,    1,      do_bootm,
        "bootm   - boot application image from memory\n",
        "[addr [arg ...]]\n    - boot application image stored in memory\n"
        "\tpassing arguments 'arg ...'; when booting a Linux kernel,\n"
        "\t'arg' can be the address of an initrd image\n"
-#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
+#if defined(CONFIG_OF_LIBFDT)
        "\tWhen booting a Linux kernel which requires a flat device-tree\n"
        "\ta third argument is required which is the address of the\n"
        "\tdevice-tree blob. To boot that kernel without an initrd image,\n"
@@ -458,29 +489,44 @@ int do_iminfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 static int image_info (ulong addr)
 {
-       image_header_t *hdr = (image_header_t *)addr;
+       void *hdr = (void *)addr;
 
        printf ("\n## Checking Image at %08lx ...\n", addr);
 
-       if (!image_check_magic (hdr)) {
-               puts ("   Bad Magic Number\n");
-               return 1;
-       }
+       switch (gen_image_get_format (hdr)) {
+       case IMAGE_FORMAT_LEGACY:
+               puts ("   Legacy image found\n");
+               if (!image_check_magic (hdr)) {
+                       puts ("   Bad Magic Number\n");
+                       return 1;
+               }
 
-       if (!image_check_hcrc (hdr)) {
-               puts ("   Bad Header Checksum\n");
-               return 1;
-       }
+               if (!image_check_hcrc (hdr)) {
+                       puts ("   Bad Header Checksum\n");
+                       return 1;
+               }
 
-       print_image_hdr (hdr);
+               image_print_contents (hdr);
 
-       puts ("   Verifying Checksum ... ");
-       if (!image_check_dcrc (hdr)) {
-               puts ("   Bad Data CRC\n");
-               return 1;
+               puts ("   Verifying Checksum ... ");
+               if (!image_check_dcrc (hdr)) {
+                       puts ("   Bad Data CRC\n");
+                       return 1;
+               }
+               puts ("OK\n");
+               return 0;
+#if defined(CONFIG_FIT)
+       case IMAGE_FORMAT_FIT:
+               puts ("   FIT image found\n");
+               fit_unsupported ("iminfo");
+               return 0;
+#endif
+       default:
+               puts ("Unknown image format!\n");
+               break;
        }
-       puts ("OK\n");
-       return 0;
+
+       return 1;
 }
 
 U_BOOT_CMD(
@@ -502,7 +548,7 @@ int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
        flash_info_t *info;
        int i, j;
-       image_header_t *hdr;
+       void *hdr;
 
        for (i = 0, info = &flash_info[0];
                i < CFG_MAX_FLASH_BANKS; ++i, ++info) {
@@ -511,23 +557,38 @@ int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        goto next_bank;
                for (j = 0; j < info->sector_count; ++j) {
 
-                       hdr = (image_header_t *)info->start[j];
-
-                       if (!hdr || !image_check_magic (hdr))
+                       hdr = (void *)info->start[j];
+                       if (!hdr)
                                goto next_sector;
 
-                       if (!image_check_hcrc (hdr))
+                       switch (gen_image_get_format (hdr)) {
+                       case IMAGE_FORMAT_LEGACY:
+                               if (!image_check_magic (hdr))
+                                       goto next_sector;
+
+                               if (!image_check_hcrc (hdr))
+                                       goto next_sector;
+
+                               printf ("Legacy Image at %08lX:\n", (ulong)hdr);
+                               image_print_contents (hdr);
+
+                               puts ("   Verifying Checksum ... ");
+                               if (!image_check_dcrc (hdr)) {
+                                       puts ("Bad Data CRC\n");
+                               } else {
+                                       puts ("OK\n");
+                               }
+                               break;
+#if defined(CONFIG_FIT)
+                       case IMAGE_FORMAT_FIT:
+                               printf ("FIT Image at %08lX:\n", (ulong)hdr);
+                               fit_unsupported ("imls");
+                               break;
+#endif
+                       default:
                                goto next_sector;
-
-                       printf ("Image at %08lX:\n", (ulong)hdr);
-                       print_image_hdr (hdr);
-
-                       puts ("   Verifying Checksum ... ");
-                       if (!image_check_dcrc (hdr)) {
-                               puts ("Bad Data CRC\n");
-                       } else {
-                               puts ("OK\n");
                        }
+
 next_sector:           ;
                }
 next_bank:     ;
@@ -546,111 +607,8 @@ U_BOOT_CMD(
 #endif
 
 /*******************************************************************/
-/* */
+/* helper routines */
 /*******************************************************************/
-void print_image_hdr (image_header_t *hdr)
-{
-#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
-       time_t timestamp = (time_t)image_get_time (hdr);
-       struct rtc_time tm;
-#endif
-
-       printf ("   Image Name:   %.*s\n", IH_NMLEN, image_get_name (hdr));
-
-#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
-       to_tm (timestamp, &tm);
-       printf ("   Created:      %4d-%02d-%02d  %2d:%02d:%02d UTC\n",
-               tm.tm_year, tm.tm_mon, tm.tm_mday,
-               tm.tm_hour, tm.tm_min, tm.tm_sec);
-#endif
-       puts ("   Image Type:   ");
-       print_type (hdr);
-
-       printf ("\n   Data Size:    %d Bytes = ", image_get_data_size (hdr));
-       print_size (image_get_data_size (hdr), "\n");
-       printf ("   Load Address: %08x\n"
-               "   Entry Point:  %08x\n",
-                image_get_load (hdr), image_get_ep (hdr));
-
-       if (image_check_type (hdr, IH_TYPE_MULTI)) {
-               int i;
-               ulong data, len;
-               ulong count = image_multi_count (hdr);
-
-               puts ("   Contents:\n");
-               for (i = 0; i < count; i++) {
-                       image_multi_getimg (hdr, i, &data, &len);
-                       printf ("   Image %d: %8ld Bytes = ", i, len);
-                       print_size (len, "\n");
-               }
-       }
-}
-
-static void print_type (image_header_t *hdr)
-{
-       char *os, *arch, *type, *comp;
-
-       switch (image_get_os (hdr)) {
-       case IH_OS_INVALID:     os = "Invalid OS";              break;
-       case IH_OS_NETBSD:      os = "NetBSD";                  break;
-       case IH_OS_LINUX:       os = "Linux";                   break;
-       case IH_OS_VXWORKS:     os = "VxWorks";                 break;
-       case IH_OS_QNX:         os = "QNX";                     break;
-       case IH_OS_U_BOOT:      os = "U-Boot";                  break;
-       case IH_OS_RTEMS:       os = "RTEMS";                   break;
-#ifdef CONFIG_ARTOS
-       case IH_OS_ARTOS:       os = "ARTOS";                   break;
-#endif
-#ifdef CONFIG_LYNXKDI
-       case IH_OS_LYNXOS:      os = "LynxOS";                  break;
-#endif
-       default:                os = "Unknown OS";              break;
-       }
-
-       switch (image_get_arch (hdr)) {
-       case IH_ARCH_INVALID:   arch = "Invalid CPU";           break;
-       case IH_ARCH_ALPHA:     arch = "Alpha";                 break;
-       case IH_ARCH_ARM:       arch = "ARM";                   break;
-       case IH_ARCH_AVR32:     arch = "AVR32";                 break;
-       case IH_ARCH_BLACKFIN:  arch = "Blackfin";              break;
-       case IH_ARCH_I386:      arch = "Intel x86";             break;
-       case IH_ARCH_IA64:      arch = "IA64";                  break;
-       case IH_ARCH_M68K:      arch = "M68K";                  break;
-       case IH_ARCH_MICROBLAZE:arch = "Microblaze";            break;
-       case IH_ARCH_MIPS64:    arch = "MIPS 64 Bit";           break;
-       case IH_ARCH_MIPS:      arch = "MIPS";                  break;
-       case IH_ARCH_NIOS2:     arch = "Nios-II";               break;
-       case IH_ARCH_NIOS:      arch = "Nios";                  break;
-       case IH_ARCH_PPC:       arch = "PowerPC";               break;
-       case IH_ARCH_S390:      arch = "IBM S390";              break;
-       case IH_ARCH_SH:        arch = "SuperH";                break;
-       case IH_ARCH_SPARC64:   arch = "SPARC 64 Bit";          break;
-       case IH_ARCH_SPARC:     arch = "SPARC";                 break;
-       default:                arch = "Unknown Architecture";  break;
-       }
-
-       switch (image_get_type (hdr)) {
-       case IH_TYPE_INVALID:   type = "Invalid Image";         break;
-       case IH_TYPE_STANDALONE:type = "Standalone Program";    break;
-       case IH_TYPE_KERNEL:    type = "Kernel Image";          break;
-       case IH_TYPE_RAMDISK:   type = "RAMDisk Image";         break;
-       case IH_TYPE_MULTI:     type = "Multi-File Image";      break;
-       case IH_TYPE_FIRMWARE:  type = "Firmware";              break;
-       case IH_TYPE_SCRIPT:    type = "Script";                break;
-       case IH_TYPE_FLATDT:    type = "Flat Device Tree";      break;
-       default:                type = "Unknown Image";         break;
-       }
-
-       switch (image_get_comp (hdr)) {
-       case IH_COMP_NONE:      comp = "uncompressed";          break;
-       case IH_COMP_GZIP:      comp = "gzip compressed";       break;
-       case IH_COMP_BZIP2:     comp = "bzip2 compressed";      break;
-       default:                comp = "unknown compression";   break;
-       }
-
-       printf ("%s %s %s (%s)", arch, os, type, comp);
-}
-
 #ifdef CONFIG_SILENT_CONSOLE
 static void fixup_silent_linux ()
 {
@@ -690,14 +648,22 @@ static void fixup_silent_linux ()
 
 static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
                            int argc, char *argv[],
-                           image_header_t *hdr, int verify)
+                           bootm_headers_t *images, int verify)
 {
        void (*loader)(bd_t *, image_header_t *, char *, char *);
-       image_header_t *img_addr;
+       image_header_t *os_hdr, *hdr;
        ulong kernel_data, kernel_len;
        char *consdev;
        char *cmdline;
 
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset ("NetBSD");
+               do_reset (cmdtp, flag, argc, argv);
+       }
+#endif
+       hdr = images->legacy_hdr_os;
+
        /*
         * Booting a (NetBSD) kernel image
         *
@@ -709,12 +675,11 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
         * line, the name of the console device, and (optionally) the
         * address of the original image header.
         */
-
-       img_addr = 0;
+       os_hdr = NULL;
        if (image_check_type (hdr, IH_TYPE_MULTI)) {
                image_multi_getimg (hdr, 1, &kernel_data, &kernel_len);
                if (kernel_len)
-                       img_addr = hdr;
+                       os_hdr = hdr;
        }
 
        consdev = "";
@@ -760,24 +725,41 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
         *   r5: console device
         *   r6: boot args string
         */
-       (*loader) (gd->bd, img_addr, consdev, cmdline);
+       (*loader) (gd->bd, os_hdr, consdev, cmdline);
 }
 
 #ifdef CONFIG_LYNXKDI
 static void do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag,
                             int argc, char *argv[],
-                            image_header_t *hdr, int verify)
+                            bootm_headers_t *images, int verify)
 {
-       lynxkdi_boot (hdr);
+       image_header_t *hdr = images->legacy_hdr_os;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset ("Lynx");
+               do_reset (cmdtp, flag, argc, argv);
+       }
+#endif
+
+       lynxkdi_boot ((image_header_t *)hdr);
 }
 #endif /* CONFIG_LYNXKDI */
 
 static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag,
                           int argc, char *argv[],
-                          image_header_t *hdr, int verify)
+                          bootm_headers_t *images, int verify)
 {
+       image_header_t *hdr = images->legacy_hdr_os;
        void (*entry_point)(bd_t *);
 
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset ("RTEMS");
+               do_reset (cmdtp, flag, argc, argv);
+       }
+#endif
+
        entry_point = (void (*)(bd_t *))image_get_ep (hdr);
 
        printf ("## Transferring control to RTEMS (at address %08lx) ...\n",
@@ -795,9 +777,17 @@ static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag,
 #if defined(CONFIG_CMD_ELF)
 static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag,
                             int argc, char *argv[],
-                            image_header_t *hdr, int verify)
+                            bootm_headers_t *images, int verify)
 {
        char str[80];
+       image_header_t *hdr = images->legacy_hdr_os;
+
+#if defined(CONFIG_FIT)
+       if (hdr == NULL) {
+               fit_unsupported_reset ("VxWorks");
+               do_reset (cmdtp, flag, argc, argv);
+       }
+#endif
 
        sprintf(str, "%x", image_get_ep (hdr)); /* write entry-point into string */
        setenv("loadaddr", str);
@@ -806,10 +796,18 @@ static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag,
 
 static void do_bootm_qnxelf(cmd_tbl_t *cmdtp, int flag,
                            int argc, char *argv[],
-                           image_header_t *hdr, int verify)
+                           bootm_headers_t *images, int verify)
 {
        char *local_args[2];
        char str[16];
+       image_header_t *hdr = images->legacy_hdr_os;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset ("QNX");
+               do_reset (cmdtp, flag, argc, argv);
+       }
+#endif
 
        sprintf(str, "%x", image_get_ep (hdr)); /* write entry-point into string */
        local_args[0] = argv[0];
@@ -821,7 +819,7 @@ static void do_bootm_qnxelf(cmd_tbl_t *cmdtp, int flag,
 #if defined(CONFIG_ARTOS) && defined(CONFIG_PPC)
 static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag,
                           int argc, char *argv[],
-                          image_header_t *hdr, int verify)
+                          bootm_headers_t *images, int verify)
 {
        ulong top;
        char *s, *cmdline;
@@ -829,6 +827,14 @@ static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag,
        int i, j, nxt, len, envno, envsz;
        bd_t *kbd;
        void (*entry)(bd_t *bd, char *cmdline, char **fwenv, ulong top);
+       image_header_t *hdr = images->legacy_hdr_os;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset ("ARTOS");
+               do_reset (cmdtp, flag, argc, argv);
+       }
+#endif
 
        /*
         * Booting an ARTOS kernel image + application