Merge branch 'sr@denx.de' of git://git.denx.de/u-boot-staging
authorWolfgang Denk <wd@denx.de>
Thu, 1 Dec 2011 23:05:25 +0000 (00:05 +0100)
committerWolfgang Denk <wd@denx.de>
Thu, 1 Dec 2011 23:05:25 +0000 (00:05 +0100)
* 'sr@denx.de' of git://git.denx.de/u-boot-staging:
  image: Don't detect XIP images as overlapping.
  image: Implement IH_TYPE_KERNEL_NOLOAD

common/cmd_bootm.c
common/image.c
include/image.h
tools/default_image.c

index b073f095ba00610f978d0b4d22b6e69ee24861ae..d5745b14e2ce54427ce7153759b0f39a0bb8fa3f 100644 (file)
@@ -272,7 +272,13 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
                return 1;
        }
 
+       if (images.os.type == IH_TYPE_KERNEL_NOLOAD) {
+               images.os.load = images.os.image_start;
+               images.ep += images.os.load;
+       }
+
        if (((images.os.type == IH_TYPE_KERNEL) ||
+            (images.os.type == IH_TYPE_KERNEL_NOLOAD) ||
             (images.os.type == IH_TYPE_MULTI)) &&
            (images.os.os == IH_OS_LINUX)) {
                /* find ramdisk */
@@ -314,6 +320,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
        ulong image_start = os.image_start;
        ulong image_len = os.image_len;
        __maybe_unused uint unc_len = CONFIG_SYS_BOOTM_LEN;
+       int no_overlap = 0;
 #if defined(CONFIG_LZMA) || defined(CONFIG_LZO)
        int ret;
 #endif /* defined(CONFIG_LZMA) || defined(CONFIG_LZO) */
@@ -324,6 +331,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
        case IH_COMP_NONE:
                if (load == blob_start || load == image_start) {
                        printf("   XIP %s ... ", type_name);
+                       no_overlap = 1;
                } else {
                        printf("   Loading %s ... ", type_name);
                        memmove_wd((void *)load, (void *)image_start,
@@ -418,7 +426,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
        if (boot_progress)
                show_boot_progress(7);
 
-       if ((load < blob_end) && (*load_end > blob_start)) {
+       if (!no_overlap && (load < blob_end) && (*load_end > blob_start)) {
                debug("images.os.start = 0x%lX, images.os.end = 0x%lx\n",
                        blob_start, blob_end);
                debug("images.os.load = 0x%lx, load_end = 0x%lx\n", load,
@@ -796,7 +804,8 @@ static int fit_check_kernel(const void *fit, int os_noffset, int verify)
        }
 
        show_boot_progress(106);
-       if (!fit_image_check_type(fit, os_noffset, IH_TYPE_KERNEL)) {
+       if (!fit_image_check_type(fit, os_noffset, IH_TYPE_KERNEL) &&
+           !fit_image_check_type(fit, os_noffset, IH_TYPE_KERNEL_NOLOAD)) {
                puts("Not a kernel image\n");
                show_boot_progress(-106);
                return 0;
@@ -874,6 +883,7 @@ static void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
                /* get os_data and os_len */
                switch (image_get_type(hdr)) {
                case IH_TYPE_KERNEL:
+               case IH_TYPE_KERNEL_NOLOAD:
                        *os_data = image_get_data(hdr);
                        *os_len = image_get_data_size(hdr);
                        break;
index 555d9d9d42ba01b89faafa94e83843433c298914..aacae5ac51aab01d3e10499c4e843971f1129000 100644 (file)
@@ -136,6 +136,7 @@ static const table_entry_t uimage_type[] = {
        {       IH_TYPE_FIRMWARE,   "firmware",   "Firmware",           },
        {       IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",   },
        {       IH_TYPE_KERNEL,     "kernel",     "Kernel Image",       },
+       {       IH_TYPE_KERNEL_NOLOAD, "kernel_noload",  "Kernel Image (no loading done)", },
        {       IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},
        {       IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},
        {       IH_TYPE_INVALID,    NULL,         "Invalid Image",      },
index 6a41c2e34e711450a608edde640eecf1920a48cf..466c98018fdc8f93b89cb4ebe4ad1853c6673e2c 100644 (file)
 #define IH_TYPE_UBLIMAGE       11      /* Davinci UBL Image            */
 #define IH_TYPE_OMAPIMAGE      12      /* TI OMAP Config Header Image  */
 #define IH_TYPE_AISIMAGE       13      /* TI Davinci AIS Image         */
+#define IH_TYPE_KERNEL_NOLOAD  14      /* OS Kernel Image, can run from any load address */
 
 /*
  * Compression Types
index 6ea3b462cdd76e40ccc1df3fa2cff04606e373c6..e9d072975bb8b330d5868699e73f11f18376ca95 100644 (file)
@@ -35,7 +35,8 @@ static image_header_t header;
 
 static int image_check_image_types(uint8_t type)
 {
-       if ((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT))
+       if (((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT)) ||
+           (type == IH_TYPE_KERNEL_NOLOAD))
                return EXIT_SUCCESS;
        else
                return EXIT_FAILURE;