]> git.sur5r.net Git - u-boot/blobdiff - common/cmd_bootm.c
Merge with rsync://git-user@source.denx.net/git/u-boot.git
[u-boot] / common / cmd_bootm.c
index c4a8685ce33ce65ecc2680be2b03777558274287..c200fd8b86b2c467288658768f85d15bff373dd2 100644 (file)
@@ -73,7 +73,7 @@
 # define CHUNKSZ (64 * 1024)
 #endif
 
-int  gunzip (void *, int, unsigned char *, int *);
+int  gunzip (void *, int, unsigned char *, unsigned long *);
 
 static void *zalloc(void *, unsigned, unsigned);
 static void zfree(void *, void *, unsigned);
@@ -184,7 +184,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                } else
 #endif /* __I386__ */
            {
-               printf ("Bad Magic Number\n");
+               puts ("Bad Magic Number\n");
                SHOW_BOOT_PROGRESS (-1);
                return 1;
            }
@@ -198,7 +198,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        hdr->ih_hcrc = 0;
 
        if (crc32 (0, (char *)data, len) != checksum) {
-               printf ("Bad Header Checksum\n");
+               puts ("Bad Header Checksum\n");
                SHOW_BOOT_PROGRESS (-2);
                return 1;
        }
@@ -218,13 +218,13 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 #endif
 
        if (verify) {
-               printf ("   Verifying Checksum ... ");
+               puts ("   Verifying Checksum ... ");
                if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {
                        printf ("Bad Data CRC\n");
                        SHOW_BOOT_PROGRESS (-3);
                        return 1;
                }
-               printf ("OK\n");
+               puts ("OK\n");
        }
        SHOW_BOOT_PROGRESS (4);
 
@@ -240,6 +240,12 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        if (hdr->ih_arch != IH_CPU_MIPS)
 #elif defined(__nios__)
        if (hdr->ih_arch != IH_CPU_NIOS)
+#elif defined(__M68K__)
+       if (hdr->ih_arch != IH_CPU_M68K)
+#elif defined(__microblaze__)
+       if (hdr->ih_arch != IH_CPU_MICROBLAZE)
+#elif defined(__nios2__)
+       if (hdr->ih_arch != IH_CPU_NIOS2)
 #else
 # error Unknown CPU type
 #endif
@@ -255,13 +261,13 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                name = "Standalone Application";
                /* A second argument overwrites the load address */
                if (argc > 2) {
-                       hdr->ih_load = simple_strtoul(argv[2], NULL, 16);
+                       hdr->ih_load = htonl(simple_strtoul(argv[2], NULL, 16));
                }
                break;
        case IH_TYPE_KERNEL:
                name = "Kernel Image";
                break;
-       case IH_TYPE_MULTI:     
+       case IH_TYPE_MULTI:
                name = "Multi-File Image";
                len  = ntohl(len_ptr[0]);
                /* OS kernel is always the first image */
@@ -322,8 +328,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        case IH_COMP_GZIP:
                printf ("   Uncompressing %s ... ", name);
                if (gunzip ((void *)ntohl(hdr->ih_load), unc_len,
-                           (uchar *)data, (int *)&len) != 0) {
-                       printf ("GUNZIP ERROR - must RESET board to recover\n");
+                           (uchar *)data, &len) != 0) {
+                       puts ("GUNZIP ERROR - must RESET board to recover\n");
                        SHOW_BOOT_PROGRESS (-6);
                        do_reset (cmdtp, flag, argc, argv);
                }
@@ -331,8 +337,14 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 #ifdef CONFIG_BZIP2
        case IH_COMP_BZIP2:
                printf ("   Uncompressing %s ... ", name);
+               /*
+                * If we've got less than 4 MB of malloc() space,
+                * use slower decompression algorithm which requires
+                * at most 2300 KB of memory.
+                */
                i = BZ2_bzBuffToBuffDecompress ((char*)ntohl(hdr->ih_load),
-                                               &unc_len, (char *)data, len, 0, 0);
+                                               &unc_len, (char *)data, len,
+                                               CFG_MALLOC_LEN < (4096 * 1024), 0);
                if (i != BZ_OK) {
                        printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i);
                        SHOW_BOOT_PROGRESS (-6);
@@ -348,7 +360,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                SHOW_BOOT_PROGRESS (-7);
                return 1;
        }
-       printf ("OK\n");
+       puts ("OK\n");
        SHOW_BOOT_PROGRESS (7);
 
        switch (hdr->ih_type) {
@@ -427,7 +439,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
        SHOW_BOOT_PROGRESS (-9);
 #ifdef DEBUG
-       printf ("\n## Control returned to monitor - resetting...\n");
+       puts ("\n## Control returned to monitor - resetting...\n");
        do_reset (cmdtp, flag, argc, argv);
 #endif
        return 1;
@@ -437,8 +449,8 @@ 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"
-       "        passing arguments 'arg ...'; when booting a Linux kernel,\n"
-       "        'arg' can be the address of an initrd image\n"
+       "\tpassing arguments 'arg ...'; when booting a Linux kernel,\n"
+       "\t'arg' can be the address of an initrd image\n"
 );
 
 #ifdef CONFIG_SILENT_CONSOLE
@@ -561,16 +573,23 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                /* convert all clock information to MHz */
                kbd->bi_intfreq /= 1000000L;
                kbd->bi_busfreq /= 1000000L;
-#if defined(CONFIG_8260) || defined(CONFIG_MPC8560)
+#if defined(CONFIG_MPC8220)
+       kbd->bi_inpfreq /= 1000000L;
+       kbd->bi_pcifreq /= 1000000L;
+       kbd->bi_pevfreq /= 1000000L;
+       kbd->bi_flbfreq /= 1000000L;
+       kbd->bi_vcofreq /= 1000000L;
+#endif
+#if defined(CONFIG_CPM2)
                kbd->bi_cpmfreq /= 1000000L;
                kbd->bi_brgfreq /= 1000000L;
                kbd->bi_sccfreq /= 1000000L;
                kbd->bi_vco     /= 1000000L;
-#endif /* CONFIG_8260 */
-#if defined(CONFIG_MPC5XXXX)
+#endif
+#if defined(CONFIG_MPC5xxx)
                kbd->bi_ipbfreq /= 1000000L;
                kbd->bi_pcifreq /= 1000000L;
-#endif /* CONFIG_MPC5XXXX */
+#endif /* CONFIG_MPC5xxx */
        }
 
        kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))hdr->ih_ep;
@@ -589,7 +608,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                memmove (&header, (char *)addr, sizeof(image_header_t));
 
                if (hdr->ih_magic  != IH_MAGIC) {
-                       printf ("Bad Magic Number\n");
+                       puts ("Bad Magic Number\n");
                        SHOW_BOOT_PROGRESS (-10);
                        do_reset (cmdtp, flag, argc, argv);
                }
@@ -601,7 +620,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                hdr->ih_hcrc = 0;
 
                if (crc32 (0, (char *)data, len) != checksum) {
-                       printf ("Bad Header Checksum\n");
+                       puts ("Bad Header Checksum\n");
                        SHOW_BOOT_PROGRESS (-11);
                        do_reset (cmdtp, flag, argc, argv);
                }
@@ -619,7 +638,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                        ulong cdata = data, edata = cdata + len;
 #endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
 
-                       printf ("   Verifying Checksum ... ");
+                       puts ("   Verifying Checksum ... ");
 
 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
 
@@ -638,11 +657,11 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
 #endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
 
                        if (csum != hdr->ih_dcrc) {
-                               printf ("Bad Data CRC\n");
+                               puts ("Bad Data CRC\n");
                                SHOW_BOOT_PROGRESS (-12);
                                do_reset (cmdtp, flag, argc, argv);
                        }
-                       printf ("OK\n");
+                       puts ("OK\n");
                }
 
                SHOW_BOOT_PROGRESS (11);
@@ -650,7 +669,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                if ((hdr->ih_os   != IH_OS_LINUX)       ||
                    (hdr->ih_arch != IH_CPU_PPC)        ||
                    (hdr->ih_type != IH_TYPE_RAMDISK)   ) {
-                       printf ("No Linux PPC Ramdisk Image\n");
+                       puts ("No Linux PPC Ramdisk Image\n");
                        SHOW_BOOT_PROGRESS (-13);
                        do_reset (cmdtp, flag, argc, argv);
                }
@@ -748,7 +767,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
 #else  /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
                memmove ((void *)initrd_start, (void *)data, len);
 #endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
-               printf ("OK\n");
+               puts ("OK\n");
            }
        } else {
                initrd_start = 0;
@@ -1006,7 +1025,7 @@ static int image_info (ulong addr)
        memmove (&header, (char *)addr, sizeof(image_header_t));
 
        if (ntohl(hdr->ih_magic) != IH_MAGIC) {
-               printf ("   Bad Magic Number\n");
+               puts ("   Bad Magic Number\n");
                return 1;
        }
 
@@ -1017,7 +1036,7 @@ static int image_info (ulong addr)
        hdr->ih_hcrc = 0;
 
        if (crc32 (0, (char *)data, len) != checksum) {
-               printf ("   Bad Header Checksum\n");
+               puts ("   Bad Header Checksum\n");
                return 1;
        }
 
@@ -1027,12 +1046,12 @@ static int image_info (ulong addr)
        data = addr + sizeof(image_header_t);
        len  = ntohl(hdr->ih_size);
 
-       printf ("   Verifying Checksum ... ");
+       puts ("   Verifying Checksum ... ");
        if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {
-               printf ("   Bad Data CRC\n");
+               puts ("   Bad Data CRC\n");
                return 1;
        }
-       printf ("OK\n");
+       puts ("OK\n");
        return 0;
 }
 
@@ -1083,11 +1102,11 @@ int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        data = (ulong)hdr + sizeof(image_header_t);
                        len  = ntohl(hdr->ih_size);
 
-                       printf ("   Verifying Checksum ... ");
+                       puts ("   Verifying Checksum ... ");
                        if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {
-                               printf ("   Bad Data CRC\n");
+                               puts ("   Bad Data CRC\n");
                        }
-                       printf ("OK\n");
+                       puts ("OK\n");
 next_sector:           ;
                }
 next_bank:     ;
@@ -1120,18 +1139,19 @@ print_image_hdr (image_header_t *hdr)
                tm.tm_year, tm.tm_mon, tm.tm_mday,
                tm.tm_hour, tm.tm_min, tm.tm_sec);
 #endif /* CFG_CMD_DATE, CONFIG_TIMESTAMP */
-       printf ("   Image Type:   "); print_type(hdr); printf ("\n");
-       printf ("   Data Size:    %d Bytes = ", ntohl(hdr->ih_size));
+       puts ("   Image Type:   "); print_type(hdr);
+       printf ("\n   Data Size:    %d Bytes = ", ntohl(hdr->ih_size));
        print_size (ntohl(hdr->ih_size), "\n");
-       printf ("   Load Address: %08x\n", ntohl(hdr->ih_load));
-       printf ("   Entry Point:  %08x\n", ntohl(hdr->ih_ep));
+       printf ("   Load Address: %08x\n"
+               "   Entry Point:  %08x\n",
+                ntohl(hdr->ih_load), ntohl(hdr->ih_ep));
 
        if (hdr->ih_type == IH_TYPE_MULTI) {
                int i;
                ulong len;
                ulong *len_ptr = (ulong *)((ulong)hdr + sizeof(image_header_t));
 
-               printf ("   Contents:\n");
+               puts ("   Contents:\n");
                for (i=0; (len = ntohl(*len_ptr)); ++i, ++len_ptr) {
                        printf ("   Image %d: %8ld Bytes = ", i, len);
                        print_size (len, "\n");
@@ -1176,6 +1196,9 @@ print_type (image_header_t *hdr)
        case IH_CPU_SPARC:      arch = "SPARC";                 break;
        case IH_CPU_SPARC64:    arch = "SPARC 64 Bit";          break;
        case IH_CPU_M68K:       arch = "M68K";                  break;
+       case IH_CPU_MICROBLAZE: arch = "Microblaze";            break;
+       case IH_CPU_NIOS:       arch = "Nios";                  break;
+       case IH_CPU_NIOS2:      arch = "Nios-II";               break;
        default:                arch = "Unknown Architecture";  break;
        }
 
@@ -1227,7 +1250,7 @@ static void zfree(void *x, void *addr, unsigned nb)
 
 #define DEFLATED       8
 
-int gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
+int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
 {
        z_stream s;
        int r, i, flags;
@@ -1236,7 +1259,7 @@ int gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
        i = 10;
        flags = src[3];
        if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
-               printf ("Error: Bad gzipped data\n");
+               puts ("Error: Bad gzipped data\n");
                return (-1);
        }
        if ((flags & EXTRA_FIELD) != 0)
@@ -1250,7 +1273,7 @@ int gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
        if ((flags & HEAD_CRC) != 0)
                i += 2;
        if (i >= *lenp) {
-               printf ("Error: gunzip out of data in header\n");
+               puts ("Error: gunzip out of data in header\n");
                return (-1);
        }