#include <lmb.h>
#include <linux/ctype.h>
#include <asm/byteorder.h>
+#include <linux/compiler.h>
#if defined(CONFIG_CMD_USB)
#include <usb.h>
#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 <flash.h>
#include <mtd/cfi_flash.h>
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);
+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:
* - 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
#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;
#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;
#endif
};
-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)
+static void __arch_preboot_os(void)
{
/* please define platform specific arch_preboot_os() */
}
#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");
- bootm_start_lmb();
+ boot_start_lmb(&images);
+
+ 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;
}
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 || load == image_start) {
- printf (" XIP %s ... ", type_name);
+ 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;
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;
}
#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;
}
#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;
#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;
}
break;
#endif /* CONFIG_LZO */
default:
- printf ("Unimplemented compression type %d\n", comp);
+ printf("Unimplemented compression type %d\n", comp);
return BOOTM_ERR_UNIMPLEMENTED;
}
flush_cache(load, (*load_end - load) * sizeof(ulong));
- puts ("OK\n");
- debug (" kernel loaded at 0x%08lx, end = 0x%08lx\n", load, *load_end);
- if (boot_progress)
- show_boot_progress (7);
+ puts("OK\n");
+ debug(" kernel loaded at 0x%08lx, end = 0x%08lx\n", load, *load_end);
+ bootstage_mark(BOOTSTAGE_ID_KERNEL_LOADED);
- 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);
+ 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;
}
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[])
+static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc,
+ char * const argv[])
{
int ret = 0;
long state;
}
} 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;
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();
+#ifdef CONFIG_NETCONSOLE
+ /*
+ * Stop the ethernet stack if NetConsole could have
+ * left it up
+ */
+ eth_halt();
+#endif
arch_preboot_os();
boot_fn(BOOTM_STATE_OS_GO, argc, argv, &images);
break;
/* 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;
*/
iflag = disable_interrupts();
+#ifdef CONFIG_NETCONSOLE
+ /* Stop the ethernet stack if NetConsole could have left it up */
+ eth_halt();
+#endif
+
#if defined(CONFIG_CMD_USB)
/*
* turn off USB to prevent the host controller from writing to the
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;
}
}
return 0;
}
- show_boot_progress (8);
+ bootstage_mark(BOOTSTAGE_ID_CHECK_BOOT_OS);
#ifdef CONFIG_SILENT_CONSOLE
if (images.os.os == IH_OS_LINUX)
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;
}
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;
}
* 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;
* 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 */
* 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;
/* 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);
+#ifdef CONFIG_FIT_BEST_MATCH
+ if (fit_uname_config)
+ cfg_noffset =
+ fit_conf_get_node(fit_hdr,
+ fit_uname_config);
+ else
+ cfg_noffset =
+ fit_conf_find_compat(fit_hdr,
+ gd->fdt_blob);
+#else
+ cfg_noffset = fit_conf_get_node(fit_hdr,
+ fit_uname_config);
+#endif
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;
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;
}
-U_BOOT_CMD(
- bootm, CONFIG_SYS_MAXARGS, 1, do_bootm,
- "boot application image from memory",
+#ifdef CONFIG_SYS_LONGHELP
+static char bootm_help_text[] =
"[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"
"\tcmdline - OS specific command line processing/setup\n"
"\tbdt - OS specific bd_t processing\n"
"\tprep - OS specific prep before relocation or go\n"
- "\tgo - start OS"
+ "\tgo - start OS";
+#endif
+
+U_BOOT_CMD(
+ bootm, CONFIG_SYS_MAXARGS, 1, do_bootm,
+ "boot application image from memory", bootm_help_text
);
/*******************************************************************/
/* 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)
- rcode = 1;
-#else
- if (parse_string_outer (getenv ("bootcmd"),
- FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0)
+ if (run_command(getenv("bootcmd"), flag) < 0)
rcode = 1;
-#endif
return rcode;
}
/* 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[])
+static 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;
}
/* 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[])
+static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
flash_info_t *info;
int i, j;
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:
/* 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 */
/*******************************************************************/
#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 *);
#if defined(CONFIG_FIT)
if (!images->legacy_hdr_valid) {
- fit_unsupported_reset ("NetBSD");
+ fit_unsupported_reset("NetBSD");
return 1;
}
#endif
* 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
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:
* 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;
#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 *);
#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:
#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);
#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:
#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];
#if defined(CONFIG_FIT)
if (!images->legacy_hdr_valid) {
- fit_unsupported_reset ("VxWorks");
+ fit_unsupported_reset("VxWorks");
return 1;
}
#endif
#if defined(CONFIG_FIT)
if (!images->legacy_hdr_valid) {
- fit_unsupported_reset ("QNX");
+ fit_unsupported_reset("QNX");
return 1;
}
#endif
#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);
#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:
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[])
+{
+ 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...
+ */
+ disable_interrupts();
+
+#ifdef CONFIG_NETCONSOLE
+ /* Stop the ethernet stack if NetConsole could have left it up */
+ eth_halt();
+#endif
+
+#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;
+}
+
+#ifdef CONFIG_SYS_LONGHELP
+static char bootz_help_text[] =
+ "[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
+
+U_BOOT_CMD(
+ bootz, CONFIG_SYS_MAXARGS, 1, do_bootz,
+ "boot Linux zImage image from memory", bootz_help_text
+);
+#endif /* CONFIG_CMD_BOOTZ */