X-Git-Url: https://git.kernelconcepts.de/?a=blobdiff_plain;f=common%2Fcmd_bootm.c;h=5685232892a647aa221e5af381dfbb84ceb65632;hb=8fa3d2b8161bb73b759c9db5c811c885ca5ec60c;hp=1a024f168f7d1bea73fd7b0c26f81480ec602f4a;hpb=d963e84c92a63b4e6c4f2f80482a5ecbe9b24fe0;p=karo-tx-uboot.git diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 1a024f168f..5685232892 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -36,6 +36,7 @@ #include #include #include +#include #if defined(CONFIG_CMD_USB) #include @@ -72,28 +73,28 @@ extern void bz_internal_error(int); #endif #if defined(CONFIG_CMD_IMI) -static int image_info (unsigned long addr); +static int image_info(unsigned long addr); #endif #if defined(CONFIG_CMD_IMLS) #include #include extern flash_info_t flash_info[]; /* info for FLASH chips */ -static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); #endif #ifdef CONFIG_SILENT_CONSOLE -static void fixup_silent_linux (void); +static void fixup_silent_linux(void); #endif -static image_header_t *image_get_kernel (ulong img_addr, int verify); +static image_header_t *image_get_kernel(ulong img_addr, int verify); #if defined(CONFIG_FIT) -static int fit_check_kernel (const void *fit, int os_noffset, int verify); +static int fit_check_kernel(const void *fit, int os_noffset, int verify); #endif -static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag,int argc, char * const argv[], - bootm_headers_t *images, ulong *os_data, ulong *os_len); -extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +static void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[], bootm_headers_t *images, + ulong *os_data, ulong *os_len); /* * Continue booting an OS image; caller already has: @@ -103,7 +104,7 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); * - loaded (first part of) image to header load address, * - disabled interrupts. */ -typedef int boot_os_fn (int flag, int argc, char * const argv[], +typedef int boot_os_fn(int flag, int argc, char * const argv[], bootm_headers_t *images); /* pointers to os/initrd/fdt */ #ifdef CONFIG_BOOTM_LINUX @@ -114,7 +115,7 @@ static boot_os_fn do_bootm_netbsd; #endif #if defined(CONFIG_LYNXKDI) static boot_os_fn do_bootm_lynxkdi; -extern void lynxkdi_boot (image_header_t *); +extern void lynxkdi_boot(image_header_t *); #endif #ifdef CONFIG_BOOTM_RTEMS static boot_os_fn do_bootm_rtems; @@ -125,8 +126,8 @@ static boot_os_fn do_bootm_ose; #if defined(CONFIG_CMD_ELF) static boot_os_fn do_bootm_vxworks; static boot_os_fn do_bootm_qnxelf; -int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); -int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); #endif #if defined(CONFIG_INTEGRITY) static boot_os_fn do_bootm_integrity; @@ -157,8 +158,7 @@ static boot_os_fn *boot_os[] = { #endif }; -ulong load_addr = CONFIG_SYS_LOAD_ADDR; /* Default Load Address */ -static bootm_headers_t images; /* pointers to os/initrd/fdt images */ +bootm_headers_t images; /* pointers to os/initrd/fdt images */ /* Allow for arch specific config before we boot */ void __arch_preboot_os(void) @@ -167,152 +167,137 @@ void __arch_preboot_os(void) } void arch_preboot_os(void) __attribute__((weak, alias("__arch_preboot_os"))); -#if defined(__ARM__) - #define IH_INITRD_ARCH IH_ARCH_ARM -#elif defined(__avr32__) - #define IH_INITRD_ARCH IH_ARCH_AVR32 -#elif defined(__bfin__) - #define IH_INITRD_ARCH IH_ARCH_BLACKFIN -#elif defined(__I386__) - #define IH_INITRD_ARCH IH_ARCH_I386 -#elif defined(__M68K__) - #define IH_INITRD_ARCH IH_ARCH_M68K -#elif defined(__microblaze__) - #define IH_INITRD_ARCH IH_ARCH_MICROBLAZE -#elif defined(__mips__) - #define IH_INITRD_ARCH IH_ARCH_MIPS -#elif defined(__nios2__) - #define IH_INITRD_ARCH IH_ARCH_NIOS2 -#elif defined(__PPC__) - #define IH_INITRD_ARCH IH_ARCH_PPC -#elif defined(__sh__) - #define IH_INITRD_ARCH IH_ARCH_SH -#elif defined(__sparc__) - #define IH_INITRD_ARCH IH_ARCH_SPARC -#else -# error Unknown CPU type -#endif +#define IH_INITRD_ARCH IH_ARCH_DEFAULT -static void bootm_start_lmb(void) -{ #ifdef CONFIG_LMB +static void boot_start_lmb(bootm_headers_t *images) +{ ulong mem_start; phys_size_t mem_size; - lmb_init(&images.lmb); + lmb_init(&images->lmb); mem_start = getenv_bootm_low(); mem_size = getenv_bootm_size(); - lmb_add(&images.lmb, (phys_addr_t)mem_start, mem_size); + lmb_add(&images->lmb, (phys_addr_t)mem_start, mem_size); - arch_lmb_reserve(&images.lmb); - board_lmb_reserve(&images.lmb); + arch_lmb_reserve(&images->lmb); + board_lmb_reserve(&images->lmb); +} #else -# define lmb_reserve(lmb, base, size) +#define lmb_reserve(lmb, base, size) +static inline void boot_start_lmb(bootm_headers_t *images) { } #endif -} static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { void *os_hdr; int ret; - memset ((void *)&images, 0, sizeof (images)); - images.verify = getenv_yesno ("verify"); + memset((void *)&images, 0, sizeof(images)); + images.verify = getenv_yesno("verify"); + + boot_start_lmb(&images); - bootm_start_lmb(); + bootstage_mark_name(BOOTSTAGE_ID_BOOTM_START, "bootm_start"); /* get kernel image header, start address and length */ - os_hdr = boot_get_kernel (cmdtp, flag, argc, argv, + os_hdr = boot_get_kernel(cmdtp, flag, argc, argv, &images, &images.os.image_start, &images.os.image_len); if (images.os.image_len == 0) { - puts ("ERROR: can't get kernel image!\n"); + puts("ERROR: can't get kernel image!\n"); return 1; } /* get image parameters */ - switch (genimg_get_format (os_hdr)) { + switch (genimg_get_format(os_hdr)) { case IMAGE_FORMAT_LEGACY: - images.os.type = image_get_type (os_hdr); - images.os.comp = image_get_comp (os_hdr); - images.os.os = image_get_os (os_hdr); + images.os.type = image_get_type(os_hdr); + images.os.comp = image_get_comp(os_hdr); + images.os.os = image_get_os(os_hdr); - images.os.end = image_get_image_end (os_hdr); - images.os.load = image_get_load (os_hdr); + images.os.end = image_get_image_end(os_hdr); + images.os.load = image_get_load(os_hdr); break; #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: - if (fit_image_get_type (images.fit_hdr_os, + if (fit_image_get_type(images.fit_hdr_os, images.fit_noffset_os, &images.os.type)) { - puts ("Can't get image type!\n"); - show_boot_progress (-109); + puts("Can't get image type!\n"); + bootstage_error(BOOTSTAGE_ID_FIT_TYPE); return 1; } - if (fit_image_get_comp (images.fit_hdr_os, + if (fit_image_get_comp(images.fit_hdr_os, images.fit_noffset_os, &images.os.comp)) { - puts ("Can't get image compression!\n"); - show_boot_progress (-110); + puts("Can't get image compression!\n"); + bootstage_error(BOOTSTAGE_ID_FIT_COMPRESSION); return 1; } - if (fit_image_get_os (images.fit_hdr_os, + if (fit_image_get_os(images.fit_hdr_os, images.fit_noffset_os, &images.os.os)) { - puts ("Can't get image OS!\n"); - show_boot_progress (-111); + puts("Can't get image OS!\n"); + bootstage_error(BOOTSTAGE_ID_FIT_OS); return 1; } - images.os.end = fit_get_end (images.fit_hdr_os); + images.os.end = fit_get_end(images.fit_hdr_os); - if (fit_image_get_load (images.fit_hdr_os, images.fit_noffset_os, + if (fit_image_get_load(images.fit_hdr_os, images.fit_noffset_os, &images.os.load)) { - puts ("Can't get image load address!\n"); - show_boot_progress (-112); + puts("Can't get image load address!\n"); + bootstage_error(BOOTSTAGE_ID_FIT_LOADADDR); return 1; } break; #endif default: - puts ("ERROR: unknown image format type!\n"); + puts("ERROR: unknown image format type!\n"); return 1; } /* find kernel entry point */ if (images.legacy_hdr_valid) { - images.ep = image_get_ep (&images.legacy_hdr_os_copy); + images.ep = image_get_ep(&images.legacy_hdr_os_copy); #if defined(CONFIG_FIT) } else if (images.fit_uname_os) { - ret = fit_image_get_entry (images.fit_hdr_os, + ret = fit_image_get_entry(images.fit_hdr_os, images.fit_noffset_os, &images.ep); if (ret) { - puts ("Can't get entry point property!\n"); + puts("Can't get entry point property!\n"); return 1; } #endif } else { - puts ("Could not find kernel entry point!\n"); + puts("Could not find kernel entry point!\n"); 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 */ - ret = boot_get_ramdisk (argc, argv, &images, IH_INITRD_ARCH, + ret = boot_get_ramdisk(argc, argv, &images, IH_INITRD_ARCH, &images.rd_start, &images.rd_end); if (ret) { - puts ("Ramdisk image is corrupt or invalid\n"); + puts("Ramdisk image is corrupt or invalid\n"); return 1; } #if defined(CONFIG_OF_LIBFDT) /* find flattened device tree */ - ret = boot_get_fdt (flag, argc, argv, &images, - &images.ft_addr, &images.ft_len); + ret = boot_get_fdt(flag, argc, argv, &images, + &images.ft_addr, &images.ft_len); if (ret) { - puts ("Could not find a valid device tree\n"); + puts("Could not find a valid device tree\n"); return 1; } @@ -337,20 +322,22 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) ulong blob_end = os.end; ulong image_start = os.image_start; ulong image_len = os.image_len; - uint unc_len = CONFIG_SYS_BOOTM_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) */ - const char *type_name = genimg_get_type_name (os.type); + const char *type_name = genimg_get_type_name(os.type); switch (comp) { case IH_COMP_NONE: - if (load == blob_start) { - printf (" XIP %s ... ", type_name); + 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, + printf(" Loading %s ... ", type_name); + memmove_wd((void *)load, (void *)image_start, image_len, CHUNKSZ); } *load_end = load + image_len; @@ -358,13 +345,13 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) break; #ifdef CONFIG_GZIP case IH_COMP_GZIP: - printf (" Uncompressing %s ... ", type_name); - if (gunzip ((void *)load, unc_len, - (uchar *)image_start, &image_len) != 0) { - puts ("GUNZIP: uncompress, out-of-mem or overwrite error " - "- must RESET board to recover\n"); + printf(" Uncompressing %s ... ", type_name); + if (gunzip((void *)load, unc_len, + (uchar *)image_start, &image_len) != 0) { + puts("GUNZIP: uncompress, out-of-mem or overwrite " + "error - must RESET board to recover\n"); if (boot_progress) - show_boot_progress (-6); + bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE); return BOOTM_ERR_RESET; } @@ -373,20 +360,20 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) #endif /* CONFIG_GZIP */ #ifdef CONFIG_BZIP2 case IH_COMP_BZIP2: - printf (" Uncompressing %s ... ", type_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*)load, + int i = BZ2_bzBuffToBuffDecompress((char *)load, &unc_len, (char *)image_start, image_len, CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0); if (i != BZ_OK) { - printf ("BUNZIP2: uncompress or overwrite error %d " + printf("BUNZIP2: uncompress or overwrite error %d " "- must RESET board to recover\n", i); if (boot_progress) - show_boot_progress (-6); + bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE); return BOOTM_ERR_RESET; } @@ -396,16 +383,16 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) #ifdef CONFIG_LZMA case IH_COMP_LZMA: { SizeT lzma_len = unc_len; - printf (" Uncompressing %s ... ", type_name); + printf(" Uncompressing %s ... ", type_name); ret = lzmaBuffToBuffDecompress( (unsigned char *)load, &lzma_len, (unsigned char *)image_start, image_len); unc_len = lzma_len; if (ret != SZ_OK) { - printf ("LZMA: uncompress or overwrite error %d " + printf("LZMA: uncompress or overwrite error %d " "- must RESET board to recover\n", ret); - show_boot_progress (-6); + bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE); return BOOTM_ERR_RESET; } *load_end = load + unc_len; @@ -414,16 +401,16 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) #endif /* CONFIG_LZMA */ #ifdef CONFIG_LZO case IH_COMP_LZO: - printf (" Uncompressing %s ... ", type_name); + printf(" Uncompressing %s ... ", type_name); ret = lzop_decompress((const unsigned char *)image_start, image_len, (unsigned char *)load, &unc_len); if (ret != LZO_E_OK) { - printf ("LZO: uncompress or overwrite error %d " + printf("LZO: uncompress or overwrite error %d " "- must RESET board to recover\n", ret); if (boot_progress) - show_boot_progress (-6); + bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE); return BOOTM_ERR_RESET; } @@ -431,17 +418,21 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) break; #endif /* CONFIG_LZO */ default: - printf ("Unimplemented compression type %d\n", comp); + printf("Unimplemented compression type %d\n", comp); return BOOTM_ERR_UNIMPLEMENTED; } - puts ("OK\n"); - debug (" kernel loaded at 0x%08lx, end = 0x%08lx\n", load, *load_end); - if (boot_progress) - show_boot_progress (7); - if ((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, *load_end); + flush_cache(load, (*load_end - load) * sizeof(ulong)); + + puts("OK\n"); + debug(" kernel loaded at 0x%08lx, end = 0x%08lx\n", load, *load_end); + bootstage_mark(BOOTSTAGE_ID_KERNEL_LOADED); + + 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, + *load_end); return BOOTM_ERR_OVERLAP; } @@ -461,9 +452,8 @@ static int bootm_start_standalone(ulong iflag, int argc, char * const argv[]) setenv("filesize", buf); return 0; } - appl = (int (*)(int, char * const []))ntohl(images.ep); + appl = (int (*)(int, char * const []))(ulong)ntohl(images.ep); (*appl)(argc-1, &argv[1]); - return 0; } @@ -484,17 +474,18 @@ static cmd_tbl_t cmd_bootm_sub[] = { U_BOOT_CMD_MKENT(go, 0, 1, (void *)BOOTM_STATE_OS_GO, "", ""), }; -int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) { int ret = 0; - int state; + long state; cmd_tbl_t *c; boot_os_fn *boot_fn; c = find_cmd_tbl(argv[1], &cmd_bootm_sub[0], ARRAY_SIZE(cmd_bootm_sub)); if (c) { - state = (int)c->cmd; + state = (long)c->cmd; /* treat start special since it resets the state machine */ if (state == BOOTM_STATE_START) { @@ -504,12 +495,12 @@ int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv } } else { /* Unrecognized command */ - return cmd_usage(cmdtp); + return CMD_RET_USAGE; } if (images.state >= state) { - printf ("Trying to execute a command out of order\n"); - return cmd_usage(cmdtp); + printf("Trying to execute a command out of order\n"); + return CMD_RET_USAGE; } images.state |= state; @@ -546,11 +537,12 @@ int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv } break; #endif -#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_SYS_BOOTMAPSZ) +#if defined(CONFIG_OF_LIBFDT) case BOOTM_STATE_FDT: { - ulong bootmap_base = getenv_bootm_low(); - ret = boot_relocate_fdt(&images.lmb, bootmap_base, + boot_fdt_add_mem_rsv_regions(&images.lmb, + images.ft_addr); + ret = boot_relocate_fdt(&images.lmb, &images.ft_addr, &images.ft_len); break; } @@ -558,17 +550,17 @@ int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv case BOOTM_STATE_OS_CMDLINE: ret = boot_fn(BOOTM_STATE_OS_CMDLINE, argc, argv, &images); if (ret) - printf ("cmdline subcommand not supported\n"); + printf("cmdline subcommand not supported\n"); break; case BOOTM_STATE_OS_BD_T: ret = boot_fn(BOOTM_STATE_OS_BD_T, argc, argv, &images); if (ret) - printf ("bdt subcommand not supported\n"); + printf("bdt subcommand not supported\n"); break; case BOOTM_STATE_OS_PREP: ret = boot_fn(BOOTM_STATE_OS_PREP, argc, argv, &images); if (ret) - printf ("prep subcommand not supported\n"); + printf("prep subcommand not supported\n"); break; case BOOTM_STATE_OS_GO: disable_interrupts(); @@ -584,7 +576,7 @@ int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv /* bootm - boot application image from image in memory */ /*******************************************************************/ -int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { ulong iflag; ulong load_end = 0; @@ -647,23 +639,26 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (ret < 0) { if (ret == BOOTM_ERR_RESET) - do_reset (cmdtp, flag, argc, argv); + do_reset(cmdtp, flag, argc, argv); if (ret == BOOTM_ERR_OVERLAP) { if (images.legacy_hdr_valid) { - if (image_get_type (&images.legacy_hdr_os_copy) == IH_TYPE_MULTI) - puts ("WARNING: legacy format multi component " - "image overwritten\n"); + image_header_t *hdr; + hdr = &images.legacy_hdr_os_copy; + if (image_get_type(hdr) == IH_TYPE_MULTI) + puts("WARNING: legacy format multi " + "component image " + "overwritten\n"); } else { - puts ("ERROR: new format image overwritten - " + puts("ERROR: new format image overwritten - " "must RESET the board to recover\n"); - show_boot_progress (-113); - do_reset (cmdtp, flag, argc, argv); + bootstage_error(BOOTSTAGE_ID_OVERWRITTEN); + do_reset(cmdtp, flag, argc, argv); } } if (ret == BOOTM_ERR_UNIMPLEMENTED) { if (iflag) enable_interrupts(); - show_boot_progress (-7); + bootstage_error(BOOTSTAGE_ID_DECOMP_UNIMPL); return 1; } } @@ -678,7 +673,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 0; } - show_boot_progress (8); + bootstage_mark(BOOTSTAGE_ID_CHECK_BOOT_OS); #ifdef CONFIG_SILENT_CONSOLE if (images.os.os == IH_OS_LINUX) @@ -690,9 +685,9 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (boot_fn == NULL) { if (iflag) enable_interrupts(); - printf ("ERROR: booting os '%s' (%d) is not supported\n", + printf("ERROR: booting os '%s' (%d) is not supported\n", genimg_get_os_name(images.os.os), images.os.os); - show_boot_progress (-8); + bootstage_error(BOOTSTAGE_ID_CHECK_BOOT_OS); return 1; } @@ -700,15 +695,30 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) boot_fn(0, argc, argv, &images); - show_boot_progress (-9); + bootstage_error(BOOTSTAGE_ID_BOOT_OS_RETURNED); #ifdef DEBUG - puts ("\n## Control returned to monitor - resetting...\n"); + puts("\n## Control returned to monitor - resetting...\n"); #endif - do_reset (cmdtp, flag, argc, argv); + do_reset(cmdtp, flag, argc, argv); return 1; } +int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd) +{ + const char *ep = getenv("autostart"); + + if (ep && !strcmp(ep, "yes")) { + char *local_args[2]; + local_args[0] = (char *)cmd; + local_args[1] = NULL; + printf("Automatic boot of image at addr 0x%08lX ...\n", load_addr); + return do_bootm(cmdtp, 0, 1, local_args); + } + + return 0; +} + /** * image_get_kernel - verify legacy format kernel image * @img_addr: in RAM address of the legacy format image to be verified @@ -721,40 +731,40 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * pointer to a legacy image header if valid image was found * otherwise return NULL */ -static image_header_t *image_get_kernel (ulong img_addr, int verify) +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); + puts("Bad Magic Number\n"); + bootstage_error(BOOTSTAGE_ID_CHECK_MAGIC); return NULL; } - show_boot_progress (2); + bootstage_mark(BOOTSTAGE_ID_CHECK_HEADER); - if (!image_check_hcrc (hdr)) { - puts ("Bad Header Checksum\n"); - show_boot_progress (-2); + if (!image_check_hcrc(hdr)) { + puts("Bad Header Checksum\n"); + bootstage_error(BOOTSTAGE_ID_CHECK_HEADER); return NULL; } - show_boot_progress (3); - image_print_contents (hdr); + bootstage_mark(BOOTSTAGE_ID_CHECK_CHECKSUM); + image_print_contents(hdr); if (verify) { - puts (" Verifying Checksum ... "); - if (!image_check_dcrc (hdr)) { - printf ("Bad Data CRC\n"); - show_boot_progress (-3); + puts(" Verifying Checksum ... "); + if (!image_check_dcrc(hdr)) { + printf("Bad Data CRC\n"); + bootstage_error(BOOTSTAGE_ID_CHECK_CHECKSUM); return NULL; } - puts ("OK\n"); + puts("OK\n"); } - show_boot_progress (4); + bootstage_mark(BOOTSTAGE_ID_CHECK_ARCH); - if (!image_check_target_arch (hdr)) { - printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr)); - show_boot_progress (-4); + if (!image_check_target_arch(hdr)) { + printf("Unsupported Architecture 0x%x\n", image_get_arch(hdr)); + bootstage_error(BOOTSTAGE_ID_CHECK_ARCH); return NULL; } return hdr; @@ -773,36 +783,37 @@ static image_header_t *image_get_kernel (ulong img_addr, int verify) * 1, on success * 0, on failure */ -#if defined (CONFIG_FIT) -static int fit_check_kernel (const void *fit, int os_noffset, int verify) +#if defined(CONFIG_FIT) +static int fit_check_kernel(const void *fit, int os_noffset, int verify) { - fit_image_print (fit, os_noffset, " "); + fit_image_print(fit, os_noffset, " "); if (verify) { - puts (" Verifying Hash Integrity ... "); - if (!fit_image_check_hashes (fit, os_noffset)) { - puts ("Bad Data Hash\n"); - show_boot_progress (-104); + puts(" Verifying Hash Integrity ... "); + if (!fit_image_check_hashes(fit, os_noffset)) { + puts("Bad Data Hash\n"); + bootstage_error(BOOTSTAGE_ID_FIT_CHECK_HASH); return 0; } - puts ("OK\n"); + puts("OK\n"); } - show_boot_progress (105); + bootstage_mark(BOOTSTAGE_ID_FIT_CHECK_ARCH); - if (!fit_image_check_target_arch (fit, os_noffset)) { - puts ("Unsupported Architecture\n"); - show_boot_progress (-105); + if (!fit_image_check_target_arch(fit, os_noffset)) { + puts("Unsupported Architecture\n"); + bootstage_error(BOOTSTAGE_ID_FIT_CHECK_ARCH); return 0; } - show_boot_progress (106); - if (!fit_image_check_type (fit, os_noffset, IH_TYPE_KERNEL)) { - puts ("Not a kernel image\n"); - show_boot_progress (-106); + bootstage_mark(BOOTSTAGE_ID_FIT_CHECK_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"); + bootstage_error(BOOTSTAGE_ID_FIT_CHECK_KERNEL); return 0; } - show_boot_progress (107); + bootstage_mark(BOOTSTAGE_ID_FIT_CHECKED); return 1; } #endif /* CONFIG_FIT */ @@ -819,8 +830,9 @@ static int fit_check_kernel (const void *fit, int os_noffset, int verify) * pointer to image header if valid image was found, plus kernel start * address and length, otherwise NULL */ -static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], - bootm_headers_t *images, ulong *os_data, ulong *os_len) +static void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[], bootm_headers_t *images, ulong *os_data, + ulong *os_len) { image_header_t *hdr; ulong img_addr; @@ -837,127 +849,138 @@ static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char * const /* find out kernel image address */ if (argc < 2) { img_addr = load_addr; - debug ("* kernel: default image load address = 0x%08lx\n", + 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, + } else if (fit_parse_conf(argv[1], load_addr, &img_addr, &fit_uname_config)) { - debug ("* kernel: config '%s' from image at 0x%08lx\n", + 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, + } else if (fit_parse_subimage(argv[1], load_addr, &img_addr, &fit_uname_kernel)) { - debug ("* kernel: subimage '%s' from image at 0x%08lx\n", + 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); + debug("* kernel: cmdline image address = 0x%08lx\n", img_addr); } - show_boot_progress (1); + bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC); /* copy from dataflash if needed */ - img_addr = genimg_get_image (img_addr); + img_addr = genimg_get_image(img_addr); /* check image type, for FIT images get FIT kernel node */ *os_data = *os_len = 0; - switch (genimg_get_format ((void *)img_addr)) { + switch (genimg_get_format((void *)img_addr)) { case IMAGE_FORMAT_LEGACY: - printf ("## Booting kernel from Legacy Image at %08lx ...\n", + printf("## Booting kernel from Legacy Image at %08lx ...\n", img_addr); - hdr = image_get_kernel (img_addr, images->verify); + hdr = image_get_kernel(img_addr, images->verify); if (!hdr) return NULL; - show_boot_progress (5); + bootstage_mark(BOOTSTAGE_ID_CHECK_IMAGETYPE); /* get os_data and os_len */ - switch (image_get_type (hdr)) { + switch (image_get_type(hdr)) { case IH_TYPE_KERNEL: - *os_data = image_get_data (hdr); - *os_len = image_get_data_size (hdr); + case IH_TYPE_KERNEL_NOLOAD: + *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); + image_multi_getimg(hdr, 0, os_data, os_len); break; case IH_TYPE_STANDALONE: - *os_data = image_get_data (hdr); - *os_len = image_get_data_size (hdr); + *os_data = image_get_data(hdr); + *os_len = image_get_data_size(hdr); break; default: - printf ("Wrong Image Type for %s command\n", cmdtp->name); - show_boot_progress (-5); + printf("Wrong Image Type for %s command\n", + cmdtp->name); + bootstage_error(BOOTSTAGE_ID_CHECK_IMAGETYPE); return NULL; } /* - * copy image header to allow for image overwrites during kernel - * decompression. + * copy image header to allow for image overwrites during + * kernel decompression. */ - memmove (&images->legacy_hdr_os_copy, hdr, sizeof(image_header_t)); + memmove(&images->legacy_hdr_os_copy, hdr, + sizeof(image_header_t)); /* save pointer to image header */ images->legacy_hdr_os = hdr; images->legacy_hdr_valid = 1; - show_boot_progress (6); + bootstage_mark(BOOTSTAGE_ID_DECOMP_IMAGE); break; #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: fit_hdr = (void *)img_addr; - printf ("## Booting kernel from FIT Image at %08lx ...\n", + printf("## Booting kernel from FIT Image at %08lx ...\n", img_addr); - if (!fit_check_format (fit_hdr)) { - puts ("Bad FIT kernel image format!\n"); - show_boot_progress (-100); + if (!fit_check_format(fit_hdr)) { + puts("Bad FIT kernel image format!\n"); + bootstage_error(BOOTSTAGE_ID_FIT_FORMAT); return NULL; } - show_boot_progress (100); + bootstage_mark(BOOTSTAGE_ID_FIT_FORMAT); if (!fit_uname_kernel) { /* * no kernel image node unit name, try to get config * node first. If config unit node name is NULL - * fit_conf_get_node() will try to find default config node + * fit_conf_get_node() will try to find default config + * node */ - show_boot_progress (101); - cfg_noffset = fit_conf_get_node (fit_hdr, fit_uname_config); + bootstage_mark(BOOTSTAGE_ID_FIT_NO_UNIT_NAME); + cfg_noffset = fit_conf_get_node(fit_hdr, + fit_uname_config); if (cfg_noffset < 0) { - show_boot_progress (-101); + bootstage_error(BOOTSTAGE_ID_FIT_NO_UNIT_NAME); return NULL; } /* save configuration uname provided in the first * bootm argument */ - images->fit_uname_cfg = fdt_get_name (fit_hdr, cfg_noffset, NULL); - printf (" Using '%s' configuration\n", images->fit_uname_cfg); - show_boot_progress (103); - - os_noffset = fit_conf_get_kernel_node (fit_hdr, cfg_noffset); - fit_uname_kernel = fit_get_name (fit_hdr, os_noffset, NULL); + images->fit_uname_cfg = fdt_get_name(fit_hdr, + cfg_noffset, + NULL); + printf(" Using '%s' configuration\n", + images->fit_uname_cfg); + bootstage_mark(BOOTSTAGE_ID_FIT_CONFIG); + + os_noffset = fit_conf_get_kernel_node(fit_hdr, + cfg_noffset); + fit_uname_kernel = fit_get_name(fit_hdr, os_noffset, + NULL); } else { /* get kernel component image node offset */ - show_boot_progress (102); - os_noffset = fit_image_get_node (fit_hdr, fit_uname_kernel); + bootstage_mark(BOOTSTAGE_ID_FIT_UNIT_NAME); + os_noffset = fit_image_get_node(fit_hdr, + fit_uname_kernel); } if (os_noffset < 0) { - show_boot_progress (-103); + bootstage_error(BOOTSTAGE_ID_FIT_CONFIG); return NULL; } - printf (" Trying '%s' kernel subimage\n", fit_uname_kernel); + printf(" Trying '%s' kernel subimage\n", fit_uname_kernel); - show_boot_progress (104); - if (!fit_check_kernel (fit_hdr, os_noffset, images->verify)) + bootstage_mark(BOOTSTAGE_ID_FIT_CHECK_SUBIMAGE); + if (!fit_check_kernel(fit_hdr, os_noffset, images->verify)) return NULL; /* get kernel image data address and length */ - if (fit_image_get_data (fit_hdr, os_noffset, &data, &len)) { - puts ("Could not find kernel subimage data!\n"); - show_boot_progress (-107); + if (fit_image_get_data(fit_hdr, os_noffset, &data, &len)) { + puts("Could not find kernel subimage data!\n"); + bootstage_error(BOOTSTAGE_ID_FIT_KERNEL_INFO_ERR); return NULL; } - show_boot_progress (108); + bootstage_mark(BOOTSTAGE_ID_FIT_KERNEL_INFO); *os_len = len; *os_data = (ulong)data; @@ -967,12 +990,12 @@ static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char * const break; #endif default: - printf ("Wrong Image Format for %s command\n", cmdtp->name); - show_boot_progress (-108); + printf("Wrong Image Format for %s command\n", cmdtp->name); + bootstage_error(BOOTSTAGE_ID_FIT_KERNEL_INFO); return NULL; } - debug (" kernel data at 0x%08lx, len = 0x%08lx (%ld)\n", + debug(" kernel data at 0x%08lx, len = 0x%08lx (%ld)\n", *os_data, *os_len, *os_len); return (void *)img_addr; @@ -1020,18 +1043,12 @@ U_BOOT_CMD( /* bootd - boot default image */ /*******************************************************************/ #if defined(CONFIG_CMD_BOOTD) -int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_bootd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int rcode = 0; -#ifndef CONFIG_SYS_HUSH_PARSER - if (run_command (getenv ("bootcmd"), flag) < 0) + if (run_command(getenv("bootcmd"), flag) < 0) rcode = 1; -#else - if (parse_string_outer (getenv ("bootcmd"), - FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0) - rcode = 1; -#endif return rcode; } @@ -1055,72 +1072,72 @@ U_BOOT_CMD( /* iminfo - print header info for a requested image */ /*******************************************************************/ #if defined(CONFIG_CMD_IMI) -int do_iminfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_iminfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int arg; ulong addr; int rcode = 0; if (argc < 2) { - return image_info (load_addr); + return image_info(load_addr); } for (arg = 1; arg < argc; ++arg) { - addr = simple_strtoul (argv[arg], NULL, 16); - if (image_info (addr) != 0) + addr = simple_strtoul(argv[arg], NULL, 16); + if (image_info(addr) != 0) rcode = 1; } return rcode; } -static int image_info (ulong addr) +static int image_info(ulong addr) { void *hdr = (void *)addr; - printf ("\n## Checking Image at %08lx ...\n", addr); + printf("\n## Checking Image at %08lx ...\n", addr); - switch (genimg_get_format (hdr)) { + switch (genimg_get_format(hdr)) { case IMAGE_FORMAT_LEGACY: - puts (" Legacy image found\n"); - if (!image_check_magic (hdr)) { - puts (" Bad Magic Number\n"); + 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"); + if (!image_check_hcrc(hdr)) { + puts(" Bad Header Checksum\n"); return 1; } - image_print_contents (hdr); + image_print_contents(hdr); - puts (" Verifying Checksum ... "); - if (!image_check_dcrc (hdr)) { - puts (" Bad Data CRC\n"); + puts(" Verifying Checksum ... "); + if (!image_check_dcrc(hdr)) { + puts(" Bad Data CRC\n"); return 1; } - puts ("OK\n"); + puts("OK\n"); return 0; #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: - puts (" FIT image found\n"); + puts(" FIT image found\n"); - if (!fit_check_format (hdr)) { - puts ("Bad FIT image format!\n"); + if (!fit_check_format(hdr)) { + puts("Bad FIT image format!\n"); return 1; } - fit_print_contents (hdr); + fit_print_contents(hdr); - if (!fit_all_image_check_hashes (hdr)) { - puts ("Bad hash in FIT image!\n"); + if (!fit_all_image_check_hashes(hdr)) { + puts("Bad hash in FIT image!\n"); return 1; } return 0; #endif default: - puts ("Unknown image format!\n"); + puts("Unknown image format!\n"); break; } @@ -1142,7 +1159,7 @@ U_BOOT_CMD( /* imls - list all images found in flash */ /*******************************************************************/ #if defined(CONFIG_CMD_IMLS) -int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { flash_info_t *info; int i, j; @@ -1159,28 +1176,28 @@ int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (!hdr) goto next_sector; - switch (genimg_get_format (hdr)) { + switch (genimg_get_format(hdr)) { case IMAGE_FORMAT_LEGACY: - if (!image_check_hcrc (hdr)) + if (!image_check_hcrc(hdr)) goto next_sector; - printf ("Legacy Image at %08lX:\n", (ulong)hdr); - image_print_contents (hdr); + 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"); + puts(" Verifying Checksum ... "); + if (!image_check_dcrc(hdr)) { + puts("Bad Data CRC\n"); } else { - puts ("OK\n"); + puts("OK\n"); } break; #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: - if (!fit_check_format (hdr)) + if (!fit_check_format(hdr)) goto next_sector; - printf ("FIT Image at %08lX:\n", (ulong)hdr); - fit_print_contents (hdr); + printf("FIT Image at %08lX:\n", (ulong)hdr); + fit_print_contents(hdr); break; #endif default: @@ -1208,34 +1225,35 @@ U_BOOT_CMD( /* helper routines */ /*******************************************************************/ #ifdef CONFIG_SILENT_CONSOLE -static void fixup_silent_linux () +static void fixup_silent_linux(void) { char buf[256], *start, *end; - char *cmdline = getenv ("bootargs"); + char *cmdline = getenv("bootargs"); /* Only fix cmdline when requested */ if (!(gd->flags & GD_FLG_SILENT)) return; - debug ("before silent fix-up: %s\n", cmdline); + debug("before silent fix-up: %s\n", cmdline); if (cmdline) { - if ((start = strstr (cmdline, "console=")) != NULL) { - end = strchr (start, ' '); - strncpy (buf, cmdline, (start - cmdline + 8)); + start = strstr(cmdline, "console="); + if (start) { + end = strchr(start, ' '); + strncpy(buf, cmdline, (start - cmdline + 8)); if (end) - strcpy (buf + (start - cmdline + 8), end); + strcpy(buf + (start - cmdline + 8), end); else buf[start - cmdline + 8] = '\0'; } else { - strcpy (buf, cmdline); - strcat (buf, " console="); + strcpy(buf, cmdline); + strcat(buf, " console="); } } else { - strcpy (buf, "console="); + strcpy(buf, "console="); } - setenv ("bootargs", buf); - debug ("after silent fix-up: %s\n", buf); + setenv("bootargs", buf); + debug("after silent fix-up: %s\n", buf); } #endif /* CONFIG_SILENT_CONSOLE */ @@ -1245,7 +1263,7 @@ static void fixup_silent_linux () /*******************************************************************/ #ifdef CONFIG_BOOTM_NETBSD -static int do_bootm_netbsd (int flag, int argc, char * const argv[], +static int do_bootm_netbsd(int flag, int argc, char * const argv[], bootm_headers_t *images) { void (*loader)(bd_t *, image_header_t *, char *, char *); @@ -1259,7 +1277,7 @@ static int do_bootm_netbsd (int flag, int argc, char * const argv[], #if defined(CONFIG_FIT) if (!images->legacy_hdr_valid) { - fit_unsupported_reset ("NetBSD"); + fit_unsupported_reset("NetBSD"); return 1; } #endif @@ -1277,20 +1295,20 @@ static int do_bootm_netbsd (int flag, int argc, char * const argv[], * address of the original image header. */ os_hdr = NULL; - if (image_check_type (&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) { - image_multi_getimg (hdr, 1, &kernel_data, &kernel_len); + if (image_check_type(&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) { + image_multi_getimg(hdr, 1, &kernel_data, &kernel_len); if (kernel_len) os_hdr = hdr; } consdev = ""; -#if defined (CONFIG_8xx_CONS_SMC1) +#if defined(CONFIG_8xx_CONS_SMC1) consdev = "smc1"; -#elif defined (CONFIG_8xx_CONS_SMC2) +#elif defined(CONFIG_8xx_CONS_SMC2) consdev = "smc2"; -#elif defined (CONFIG_8xx_CONS_SCC2) +#elif defined(CONFIG_8xx_CONS_SCC2) consdev = "scc2"; -#elif defined (CONFIG_8xx_CONS_SCC3) +#elif defined(CONFIG_8xx_CONS_SCC3) consdev = "scc3"; #endif @@ -1299,25 +1317,26 @@ static int do_bootm_netbsd (int flag, int argc, char * const argv[], int i; for (i = 2, len = 0; i < argc; i += 1) - len += strlen (argv[i]) + 1; - cmdline = malloc (len); + len += strlen(argv[i]) + 1; + cmdline = malloc(len); for (i = 2, len = 0; i < argc; i += 1) { if (i > 2) cmdline[len++] = ' '; - strcpy (&cmdline[len], argv[i]); - len += strlen (argv[i]); + strcpy(&cmdline[len], argv[i]); + len += strlen(argv[i]); } - } else if ((cmdline = getenv ("bootargs")) == NULL) { + } else if ((cmdline = getenv("bootargs")) == NULL) { cmdline = ""; } loader = (void (*)(bd_t *, image_header_t *, char *, char *))images->ep; - printf ("## Transferring control to NetBSD stage-2 loader (at address %08lx) ...\n", + printf("## Transferring control to NetBSD stage-2 loader " + "(at address %08lx) ...\n", (ulong)loader); - show_boot_progress (15); + bootstage_mark(BOOTSTAGE_ID_RUN_OS); /* * NetBSD Stage-2 Loader Parameters: @@ -1326,14 +1345,14 @@ static int do_bootm_netbsd (int flag, int argc, char * const argv[], * r5: console device * r6: boot args string */ - (*loader) (gd->bd, os_hdr, consdev, cmdline); + (*loader)(gd->bd, os_hdr, consdev, cmdline); return 1; } #endif /* CONFIG_BOOTM_NETBSD*/ #ifdef CONFIG_LYNXKDI -static int do_bootm_lynxkdi (int flag, int argc, char * const argv[], +static int do_bootm_lynxkdi(int flag, int argc, char * const argv[], bootm_headers_t *images) { image_header_t *hdr = &images->legacy_hdr_os_copy; @@ -1343,19 +1362,19 @@ static int do_bootm_lynxkdi (int flag, int argc, char * const argv[], #if defined(CONFIG_FIT) if (!images->legacy_hdr_valid) { - fit_unsupported_reset ("Lynx"); + fit_unsupported_reset("Lynx"); return 1; } #endif - lynxkdi_boot ((image_header_t *)hdr); + lynxkdi_boot((image_header_t *)hdr); return 1; } #endif /* CONFIG_LYNXKDI */ #ifdef CONFIG_BOOTM_RTEMS -static int do_bootm_rtems (int flag, int argc, char * const argv[], +static int do_bootm_rtems(int flag, int argc, char * const argv[], bootm_headers_t *images) { void (*entry_point)(bd_t *); @@ -1365,17 +1384,17 @@ static int do_bootm_rtems (int flag, int argc, char * const argv[], #if defined(CONFIG_FIT) if (!images->legacy_hdr_valid) { - fit_unsupported_reset ("RTEMS"); + fit_unsupported_reset("RTEMS"); return 1; } #endif entry_point = (void (*)(bd_t *))images->ep; - printf ("## Transferring control to RTEMS (at address %08lx) ...\n", + printf("## Transferring control to RTEMS (at address %08lx) ...\n", (ulong)entry_point); - show_boot_progress (15); + bootstage_mark(BOOTSTAGE_ID_RUN_OS); /* * RTEMS Parameters: @@ -1388,7 +1407,7 @@ static int do_bootm_rtems (int flag, int argc, char * const argv[], #endif /* CONFIG_BOOTM_RTEMS */ #if defined(CONFIG_BOOTM_OSE) -static int do_bootm_ose (int flag, int argc, char * const argv[], +static int do_bootm_ose(int flag, int argc, char * const argv[], bootm_headers_t *images) { void (*entry_point)(void); @@ -1398,17 +1417,17 @@ static int do_bootm_ose (int flag, int argc, char * const argv[], #if defined(CONFIG_FIT) if (!images->legacy_hdr_valid) { - fit_unsupported_reset ("OSE"); + fit_unsupported_reset("OSE"); return 1; } #endif entry_point = (void (*)(void))images->ep; - printf ("## Transferring control to OSE (at address %08lx) ...\n", + printf("## Transferring control to OSE (at address %08lx) ...\n", (ulong)entry_point); - show_boot_progress (15); + bootstage_mark(BOOTSTAGE_ID_RUN_OS); /* * OSE Parameters: @@ -1421,7 +1440,7 @@ static int do_bootm_ose (int flag, int argc, char * const argv[], #endif /* CONFIG_BOOTM_OSE */ #if defined(CONFIG_CMD_ELF) -static int do_bootm_vxworks (int flag, int argc, char * const argv[], +static int do_bootm_vxworks(int flag, int argc, char * const argv[], bootm_headers_t *images) { char str[80]; @@ -1431,7 +1450,7 @@ static int do_bootm_vxworks (int flag, int argc, char * const argv[], #if defined(CONFIG_FIT) if (!images->legacy_hdr_valid) { - fit_unsupported_reset ("VxWorks"); + fit_unsupported_reset("VxWorks"); return 1; } #endif @@ -1454,7 +1473,7 @@ static int do_bootm_qnxelf(int flag, int argc, char * const argv[], #if defined(CONFIG_FIT) if (!images->legacy_hdr_valid) { - fit_unsupported_reset ("QNX"); + fit_unsupported_reset("QNX"); return 1; } #endif @@ -1469,7 +1488,7 @@ static int do_bootm_qnxelf(int flag, int argc, char * const argv[], #endif #ifdef CONFIG_INTEGRITY -static int do_bootm_integrity (int flag, int argc, char * const argv[], +static int do_bootm_integrity(int flag, int argc, char * const argv[], bootm_headers_t *images) { void (*entry_point)(void); @@ -1479,17 +1498,17 @@ static int do_bootm_integrity (int flag, int argc, char * const argv[], #if defined(CONFIG_FIT) if (!images->legacy_hdr_valid) { - fit_unsupported_reset ("INTEGRITY"); + fit_unsupported_reset("INTEGRITY"); return 1; } #endif entry_point = (void (*)(void))images->ep; - printf ("## Transferring control to INTEGRITY (at address %08lx) ...\n", + printf("## Transferring control to INTEGRITY (at address %08lx) ...\n", (ulong)entry_point); - show_boot_progress (15); + bootstage_mark(BOOTSTAGE_ID_RUN_OS); /* * INTEGRITY Parameters: @@ -1500,3 +1519,128 @@ static int do_bootm_integrity (int flag, int argc, char * const argv[], return 1; } #endif + +#ifdef CONFIG_CMD_BOOTZ + +static int __bootz_setup(void *image, void **start, void **end) +{ + /* Please define bootz_setup() for your platform */ + + puts("Your platform's zImage format isn't supported yet!\n"); + return -1; +} +int bootz_setup(void *image, void **start, void **end) + __attribute__((weak, alias("__bootz_setup"))); + +/* + * zImage booting support + */ +static int bootz_start(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[], bootm_headers_t *images) +{ + int ret; + void *zi_start, *zi_end; + + memset(images, 0, sizeof(bootm_headers_t)); + + boot_start_lmb(images); + + /* Setup Linux kernel zImage entry point */ + if (argc < 2) { + images->ep = load_addr; + debug("* kernel: default image load address = 0x%08lx\n", + load_addr); + } else { + images->ep = simple_strtoul(argv[1], NULL, 16); + debug("* kernel: cmdline image address = 0x%08lx\n", + images->ep); + } + + ret = bootz_setup((void *)images->ep, &zi_start, &zi_end); + if (ret != 0) + return 1; + + lmb_reserve(&images->lmb, images->ep, zi_end - zi_start); + + /* Find ramdisk */ + ret = boot_get_ramdisk(argc, argv, images, IH_INITRD_ARCH, + &images->rd_start, &images->rd_end); + if (ret) { + puts("Ramdisk image is corrupt or invalid\n"); + return 1; + } + +#if defined(CONFIG_OF_LIBFDT) + /* find flattened device tree */ + ret = boot_get_fdt(flag, argc, argv, images, + &images->ft_addr, &images->ft_len); + if (ret) { + puts("Could not find a valid device tree\n"); + return 1; + } + + set_working_fdt_addr(images->ft_addr); +#endif + + return 0; +} + +static int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + ulong iflag; + bootm_headers_t images; + + if (bootz_start(cmdtp, flag, argc, argv, &images)) + return 1; + + /* + * We have reached the point of no return: we are going to + * overwrite all exception vector code, so we cannot easily + * recover from any failures any more... + */ + iflag = disable_interrupts(); + +#if defined(CONFIG_CMD_USB) + /* + * turn off USB to prevent the host controller from writing to the + * SDRAM while Linux is booting. This could happen (at least for OHCI + * controller), because the HCCA (Host Controller Communication Area) + * lies within the SDRAM and the host controller writes continously to + * this area (as busmaster!). The HccaFrameNumber is for example + * updated every 1 ms within the HCCA structure in SDRAM! For more + * details see the OpenHCI specification. + */ + usb_stop(); +#endif + +#ifdef CONFIG_SILENT_CONSOLE + fixup_silent_linux(); +#endif + arch_preboot_os(); + + do_bootm_linux(0, argc, argv, &images); +#ifdef DEBUG + puts("\n## Control returned to monitor - resetting...\n"); +#endif + do_reset(cmdtp, flag, argc, argv); + + return 1; +} + +U_BOOT_CMD( + bootz, CONFIG_SYS_MAXARGS, 1, do_bootz, + "boot Linux zImage image from memory", + "[addr [initrd[:size]] [fdt]]\n" + " - boot Linux zImage stored in memory\n" + "\tThe argument 'initrd' is optional and specifies the address\n" + "\tof the initrd in memory. The optional argument ':size' allows\n" + "\tspecifying the size of RAW initrd.\n" +#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" + "\tuse a '-' for the second argument. If you do not pass a third\n" + "\ta bd_info struct will be passed instead\n" +#endif +); +#endif /* CONFIG_CMD_BOOTZ */