]> Git Repo - u-boot.git/blobdiff - boot/bootm.c
bootm: Reduce arguments to boot_get_ramdisk()
[u-boot.git] / boot / bootm.c
index 75f0b4a9af8a04bf6c2268cc4f6bf32b75478cbd..d5893e82d128d2363014da9540e0432984fb907a 100644 (file)
@@ -8,6 +8,7 @@
 #include <common.h>
 #include <bootstage.h>
 #include <cli.h>
+#include <command.h>
 #include <cpu_func.h>
 #include <env.h>
 #include <errno.h>
@@ -22,6 +23,7 @@
 #include <asm/global_data.h>
 #include <asm/io.h>
 #include <linux/sizes.h>
+#include <tpm-v2.h>
 #if defined(CONFIG_CMD_USB)
 #include <usb.h>
 #endif
@@ -29,7 +31,6 @@
 #include "mkimage.h"
 #endif
 
-#include <command.h>
 #include <bootm.h>
 #include <image.h>
 
@@ -43,14 +44,200 @@ DECLARE_GLOBAL_DATA_PTR;
 
 struct bootm_headers images;           /* pointers to os/initrd/fdt images */
 
-static const void *boot_get_kernel(struct cmd_tbl *cmdtp, int flag, int argc,
-                                  char *const argv[], struct bootm_headers *images,
-                                  ulong *os_data, ulong *os_len);
-
 __weak void board_quiesce_devices(void)
 {
 }
 
+#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
+/**
+ * image_get_kernel - verify legacy format kernel image
+ * @img_addr: in RAM address of the legacy format image to be verified
+ * @verify: data CRC verification flag
+ *
+ * image_get_kernel() verifies legacy image integrity and returns pointer to
+ * legacy image header if image verification was completed successfully.
+ *
+ * returns:
+ *     pointer to a legacy image header if valid image was found
+ *     otherwise return NULL
+ */
+static struct legacy_img_hdr *image_get_kernel(ulong img_addr, int verify)
+{
+       struct legacy_img_hdr *hdr = (struct legacy_img_hdr *)img_addr;
+
+       if (!image_check_magic(hdr)) {
+               puts("Bad Magic Number\n");
+               bootstage_error(BOOTSTAGE_ID_CHECK_MAGIC);
+               return NULL;
+       }
+       bootstage_mark(BOOTSTAGE_ID_CHECK_HEADER);
+
+       if (!image_check_hcrc(hdr)) {
+               puts("Bad Header Checksum\n");
+               bootstage_error(BOOTSTAGE_ID_CHECK_HEADER);
+               return NULL;
+       }
+
+       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");
+                       bootstage_error(BOOTSTAGE_ID_CHECK_CHECKSUM);
+                       return NULL;
+               }
+               puts("OK\n");
+       }
+       bootstage_mark(BOOTSTAGE_ID_CHECK_ARCH);
+
+       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;
+}
+#endif
+
+/**
+ * boot_get_kernel() - find kernel image
+ *
+ * @addr_fit: first argument to bootm: address, fit configuration, etc.
+ * @os_data: pointer to a ulong variable, will hold os data start address
+ * @os_len: pointer to a ulong variable, will hold os data length
+ *     address and length, otherwise NULL
+ *     pointer to image header if valid image was found, plus kernel start
+ * @kernp: image header if valid image was found, otherwise NULL
+ *
+ * boot_get_kernel() tries to find a kernel image, verifies its integrity
+ * and locates kernel data.
+ *
+ * Return: 0 on success, -ve on error. -EPROTOTYPE means that the image is in
+ * a wrong or unsupported format
+ */
+static int boot_get_kernel(const char *addr_fit, struct bootm_headers *images,
+                          ulong *os_data, ulong *os_len, const void **kernp)
+{
+#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
+       struct legacy_img_hdr   *hdr;
+#endif
+       ulong           img_addr;
+       const void *buf;
+       const char *fit_uname_config = NULL, *fit_uname_kernel = NULL;
+#if CONFIG_IS_ENABLED(FIT)
+       int             os_noffset;
+#endif
+
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+       const void *boot_img;
+       const void *vendor_boot_img;
+#endif
+       img_addr = genimg_get_kernel_addr_fit(addr_fit, &fit_uname_config,
+                                             &fit_uname_kernel);
+
+       if (IS_ENABLED(CONFIG_CMD_BOOTM_PRE_LOAD))
+               img_addr += image_load_offset;
+
+       bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC);
+
+       /* check image type, for FIT images get FIT kernel node */
+       *os_data = *os_len = 0;
+       buf = map_sysmem(img_addr, 0);
+       switch (genimg_get_format(buf)) {
+#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
+       case IMAGE_FORMAT_LEGACY:
+               printf("## Booting kernel from Legacy Image at %08lx ...\n",
+                      img_addr);
+               hdr = image_get_kernel(img_addr, images->verify);
+               if (!hdr)
+                       return -EINVAL;
+               bootstage_mark(BOOTSTAGE_ID_CHECK_IMAGETYPE);
+
+               /* get os_data and os_len */
+               switch (image_get_type(hdr)) {
+               case IH_TYPE_KERNEL:
+               case IH_TYPE_KERNEL_NOLOAD:
+                       *os_data = image_get_data(hdr);
+                       *os_len = image_get_data_size(hdr);
+                       break;
+               case IH_TYPE_MULTI:
+                       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);
+                       break;
+               default:
+                       bootstage_error(BOOTSTAGE_ID_CHECK_IMAGETYPE);
+                       return -EPROTOTYPE;
+               }
+
+               /*
+                * copy image header to allow for image overwrites during
+                * kernel decompression.
+                */
+               memmove(&images->legacy_hdr_os_copy, hdr,
+                       sizeof(struct legacy_img_hdr));
+
+               /* save pointer to image header */
+               images->legacy_hdr_os = hdr;
+
+               images->legacy_hdr_valid = 1;
+               bootstage_mark(BOOTSTAGE_ID_DECOMP_IMAGE);
+               break;
+#endif
+#if CONFIG_IS_ENABLED(FIT)
+       case IMAGE_FORMAT_FIT:
+               os_noffset = fit_image_load(images, img_addr,
+                               &fit_uname_kernel, &fit_uname_config,
+                               IH_ARCH_DEFAULT, IH_TYPE_KERNEL,
+                               BOOTSTAGE_ID_FIT_KERNEL_START,
+                               FIT_LOAD_IGNORED, os_data, os_len);
+               if (os_noffset < 0)
+                       return -ENOENT;
+
+               images->fit_hdr_os = map_sysmem(img_addr, 0);
+               images->fit_uname_os = fit_uname_kernel;
+               images->fit_uname_cfg = fit_uname_config;
+               images->fit_noffset_os = os_noffset;
+               break;
+#endif
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+       case IMAGE_FORMAT_ANDROID: {
+               int ret;
+
+               boot_img = buf;
+               vendor_boot_img = NULL;
+               if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+                       boot_img = map_sysmem(get_abootimg_addr(), 0);
+                       vendor_boot_img = map_sysmem(get_avendor_bootimg_addr(), 0);
+               }
+               printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
+               ret = android_image_get_kernel(boot_img, vendor_boot_img,
+                                              images->verify, os_data, os_len);
+               if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+                       unmap_sysmem(vendor_boot_img);
+                       unmap_sysmem(boot_img);
+               }
+               if (ret)
+                       return ret;
+               break;
+       }
+#endif
+       default:
+               bootstage_error(BOOTSTAGE_ID_CHECK_IMAGETYPE);
+               return -EPROTOTYPE;
+       }
+
+       debug("   kernel data at 0x%08lx, len = 0x%08lx (%ld)\n",
+             *os_data, *os_len, *os_len);
+       *kernp = buf;
+
+       return 0;
+}
+
 #ifdef CONFIG_LMB
 static void boot_start_lmb(struct bootm_headers *images)
 {
@@ -68,8 +255,7 @@ static void boot_start_lmb(struct bootm_headers *images)
 static inline void boot_start_lmb(struct bootm_headers *images) { }
 #endif
 
-static int bootm_start(struct cmd_tbl *cmdtp, int flag, int argc,
-                      char *const argv[])
+static int bootm_start(void)
 {
        memset((void *)&images, 0, sizeof(images));
        images.verify = env_get_yesno("verify");
@@ -82,22 +268,31 @@ static int bootm_start(struct cmd_tbl *cmdtp, int flag, int argc,
        return 0;
 }
 
-static ulong bootm_data_addr(int argc, char *const argv[])
+static ulong bootm_data_addr(const char *addr_str)
 {
        ulong addr;
 
-       if (argc > 0)
-               addr = simple_strtoul(argv[0], NULL, 16);
+       if (addr_str)
+               addr = hextoul(addr_str, NULL);
        else
                addr = image_load_addr;
 
        return addr;
 }
 
-static int bootm_pre_load(struct cmd_tbl *cmdtp, int flag, int argc,
-                         char *const argv[])
+/**
+ * bootm_pre_load() - Handle the pre-load processing
+ *
+ * This can be used to do a full signature check of the image, for example.
+ * It calls image_pre_load() with the data address of the image to check.
+ *
+ * @addr_str: String containing load address in hex, or NULL to use
+ * image_load_addr
+ * Return: 0 if OK, CMD_RET_FAILURE on failure
+ */
+static int bootm_pre_load(const char *addr_str)
 {
-       ulong data_addr = bootm_data_addr(argc, argv);
+       ulong data_addr = bootm_data_addr(addr_str);
        int ret = 0;
 
        if (IS_ENABLED(CONFIG_CMD_BOOTM_PRE_LOAD))
@@ -109,8 +304,14 @@ static int bootm_pre_load(struct cmd_tbl *cmdtp, int flag, int argc,
        return ret;
 }
 
-static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
-                        char *const argv[])
+/**
+ * bootm_find_os(): Find the OS to boot
+ *
+ * @cmd_name: Command name that started this boot, e.g. "bootm"
+ * @addr_fit: Address and/or FIT specifier (first arg of bootm command)
+ * Return: 0 on success, -ve on error
+ */
+static int bootm_find_os(const char *cmd_name, const char *addr_fit)
 {
        const void *os_hdr;
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
@@ -121,10 +322,13 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
        int ret;
 
        /* get kernel image header, start address and length */
-       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");
+       ret = boot_get_kernel(addr_fit, &images, &images.os.image_start,
+                             &images.os.image_len, &os_hdr);
+       if (ret) {
+               if (ret == -EPROTOTYPE)
+                       printf("Wrong Image Type for %s command\n", cmd_name);
+
+               printf("ERROR %dE: can't get kernel image!\n", ret);
                return 1;
        }
 
@@ -285,10 +489,23 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc,
 int bootm_find_images(int flag, int argc, char *const argv[], ulong start,
                      ulong size)
 {
+       const char *select = NULL;
        int ret;
 
+       if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
+               char *buf;
+
+               /* Look for an Android boot image */
+               buf = map_sysmem(images.os.start, 0);
+               if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
+                       select = argc ? argv[0] : env_get("loadaddr");
+       }
+
+       if (argc >= 2)
+               select = argv[1];
+
        /* find ramdisk */
-       ret = boot_get_ramdisk(argc, argv, &images, IH_INITRD_ARCH,
+       ret = boot_get_ramdisk(select, &images, IH_INITRD_ARCH,
                               &images.rd_start, &images.rd_end);
        if (ret) {
                puts("Ramdisk image is corrupt or invalid\n");
@@ -673,6 +890,75 @@ int bootm_process_cmdline_env(int flags)
        return 0;
 }
 
+int bootm_measure(struct bootm_headers *images)
+{
+       int ret = 0;
+
+       /* Skip measurement if EFI is going to do it */
+       if (images->os.os == IH_OS_EFI &&
+           IS_ENABLED(CONFIG_EFI_TCG2_PROTOCOL) &&
+           IS_ENABLED(CONFIG_BOOTM_EFI))
+               return ret;
+
+       if (IS_ENABLED(CONFIG_MEASURED_BOOT)) {
+               struct tcg2_event_log elog;
+               struct udevice *dev;
+               void *initrd_buf;
+               void *image_buf;
+               const char *s;
+               u32 rd_len;
+               bool ign;
+
+               elog.log_size = 0;
+               ign = IS_ENABLED(CONFIG_MEASURE_IGNORE_LOG);
+               ret = tcg2_measurement_init(&dev, &elog, ign);
+               if (ret)
+                       return ret;
+
+               image_buf = map_sysmem(images->os.image_start,
+                                      images->os.image_len);
+               ret = tcg2_measure_data(dev, &elog, 8, images->os.image_len,
+                                       image_buf, EV_COMPACT_HASH,
+                                       strlen("linux") + 1, (u8 *)"linux");
+               if (ret)
+                       goto unmap_image;
+
+               rd_len = images->rd_end - images->rd_start;
+               initrd_buf = map_sysmem(images->rd_start, rd_len);
+               ret = tcg2_measure_data(dev, &elog, 9, rd_len, initrd_buf,
+                                       EV_COMPACT_HASH, strlen("initrd") + 1,
+                                       (u8 *)"initrd");
+               if (ret)
+                       goto unmap_initrd;
+
+               if (IS_ENABLED(CONFIG_MEASURE_DEVICETREE)) {
+                       ret = tcg2_measure_data(dev, &elog, 0, images->ft_len,
+                                               (u8 *)images->ft_addr,
+                                               EV_TABLE_OF_DEVICES,
+                                               strlen("dts") + 1,
+                                               (u8 *)"dts");
+                       if (ret)
+                               goto unmap_initrd;
+               }
+
+               s = env_get("bootargs");
+               if (!s)
+                       s = "";
+               ret = tcg2_measure_data(dev, &elog, 1, strlen(s) + 1, (u8 *)s,
+                                       EV_PLATFORM_CONFIG_FLAGS,
+                                       strlen(s) + 1, (u8 *)s);
+
+unmap_initrd:
+               unmap_sysmem(initrd_buf);
+
+unmap_image:
+               unmap_sysmem(image_buf);
+               tcg2_measurement_term(dev, &elog, ret != 0);
+       }
+
+       return ret;
+}
+
 /**
  * Execute selected states of the bootm command.
  *
@@ -713,17 +999,21 @@ int do_bootm_states(struct cmd_tbl *cmdtp, int flag, int argc,
         * any error.
         */
        if (states & BOOTM_STATE_START)
-               ret = bootm_start(cmdtp, flag, argc, argv);
+               ret = bootm_start();
 
        if (!ret && (states & BOOTM_STATE_PRE_LOAD))
-               ret = bootm_pre_load(cmdtp, flag, argc, argv);
+               ret = bootm_pre_load(argv[0]);
 
        if (!ret && (states & BOOTM_STATE_FINDOS))
-               ret = bootm_find_os(cmdtp, flag, argc, argv);
+               ret = bootm_find_os(cmdtp->name, argv[0]);
 
        if (!ret && (states & BOOTM_STATE_FINDOTHER))
                ret = bootm_find_other(cmdtp, flag, argc, argv);
 
+       if (IS_ENABLED(CONFIG_MEASURED_BOOT) && !ret &&
+           (states & BOOTM_STATE_MEASURE))
+               bootm_measure(images);
+
        /* Load the OS */
        if (!ret && (states & BOOTM_STATE_LOADOS)) {
                iflag = bootm_disable_interrupts();
@@ -823,191 +1113,41 @@ err:
        return ret;
 }
 
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-/**
- * image_get_kernel - verify legacy format kernel image
- * @img_addr: in RAM address of the legacy format image to be verified
- * @verify: data CRC verification flag
- *
- * image_get_kernel() verifies legacy image integrity and returns pointer to
- * legacy image header if image verification was completed successfully.
- *
- * returns:
- *     pointer to a legacy image header if valid image was found
- *     otherwise return NULL
- */
-static struct legacy_img_hdr *image_get_kernel(ulong img_addr, int verify)
+int bootm_boot_start(ulong addr, const char *cmdline)
 {
-       struct legacy_img_hdr *hdr = (struct legacy_img_hdr *)img_addr;
-
-       if (!image_check_magic(hdr)) {
-               puts("Bad Magic Number\n");
-               bootstage_error(BOOTSTAGE_ID_CHECK_MAGIC);
-               return NULL;
-       }
-       bootstage_mark(BOOTSTAGE_ID_CHECK_HEADER);
-
-       if (!image_check_hcrc(hdr)) {
-               puts("Bad Header Checksum\n");
-               bootstage_error(BOOTSTAGE_ID_CHECK_HEADER);
-               return NULL;
-       }
-
-       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");
-                       bootstage_error(BOOTSTAGE_ID_CHECK_CHECKSUM);
-                       return NULL;
-               }
-               puts("OK\n");
-       }
-       bootstage_mark(BOOTSTAGE_ID_CHECK_ARCH);
-
-       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;
-}
-#endif
-
-/**
- * boot_get_kernel - find kernel image
- * @os_data: pointer to a ulong variable, will hold os data start address
- * @os_len: pointer to a ulong variable, will hold os data length
- *
- * boot_get_kernel() tries to find a kernel image, verifies its integrity
- * and locates kernel data.
- *
- * returns:
- *     pointer to image header if valid image was found, plus kernel start
- *     address and length, otherwise NULL
- */
-static const void *boot_get_kernel(struct cmd_tbl *cmdtp, int flag, int argc,
-                                  char *const argv[], struct bootm_headers *images,
-                                  ulong *os_data, ulong *os_len)
-{
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-       struct legacy_img_hdr   *hdr;
-#endif
-       ulong           img_addr;
-       const void *buf;
-       const char      *fit_uname_config = NULL;
-       const char      *fit_uname_kernel = NULL;
-#if CONFIG_IS_ENABLED(FIT)
-       int             os_noffset;
-#endif
-
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-       const void *boot_img;
-       const void *vendor_boot_img;
-#endif
-       img_addr = genimg_get_kernel_addr_fit(argc < 1 ? NULL : argv[0],
-                                             &fit_uname_config,
-                                             &fit_uname_kernel);
-
-       if (IS_ENABLED(CONFIG_CMD_BOOTM_PRE_LOAD))
-               img_addr += image_load_offset;
-
-       bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC);
-
-       /* check image type, for FIT images get FIT kernel node */
-       *os_data = *os_len = 0;
-       buf = map_sysmem(img_addr, 0);
-       switch (genimg_get_format(buf)) {
-#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
-       case IMAGE_FORMAT_LEGACY:
-               printf("## Booting kernel from Legacy Image at %08lx ...\n",
-                      img_addr);
-               hdr = image_get_kernel(img_addr, images->verify);
-               if (!hdr)
-                       return NULL;
-               bootstage_mark(BOOTSTAGE_ID_CHECK_IMAGETYPE);
-
-               /* get os_data and os_len */
-               switch (image_get_type(hdr)) {
-               case IH_TYPE_KERNEL:
-               case IH_TYPE_KERNEL_NOLOAD:
-                       *os_data = image_get_data(hdr);
-                       *os_len = image_get_data_size(hdr);
-                       break;
-               case IH_TYPE_MULTI:
-                       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);
-                       break;
-               default:
-                       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.
-                */
-               memmove(&images->legacy_hdr_os_copy, hdr,
-                       sizeof(struct legacy_img_hdr));
-
-               /* save pointer to image header */
-               images->legacy_hdr_os = hdr;
-
-               images->legacy_hdr_valid = 1;
-               bootstage_mark(BOOTSTAGE_ID_DECOMP_IMAGE);
-               break;
-#endif
-#if CONFIG_IS_ENABLED(FIT)
-       case IMAGE_FORMAT_FIT:
-               os_noffset = fit_image_load(images, img_addr,
-                               &fit_uname_kernel, &fit_uname_config,
-                               IH_ARCH_DEFAULT, IH_TYPE_KERNEL,
-                               BOOTSTAGE_ID_FIT_KERNEL_START,
-                               FIT_LOAD_IGNORED, os_data, os_len);
-               if (os_noffset < 0)
-                       return NULL;
+       static struct cmd_tbl cmd = {"bootm"};
+       char addr_str[30];
+       char *argv[] = {addr_str, NULL};
+       int states;
+       int ret;
 
-               images->fit_hdr_os = map_sysmem(img_addr, 0);
-               images->fit_uname_os = fit_uname_kernel;
-               images->fit_uname_cfg = fit_uname_config;
-               images->fit_noffset_os = os_noffset;
-               break;
-#endif
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-       case IMAGE_FORMAT_ANDROID:
-               boot_img = buf;
-               vendor_boot_img = NULL;
-               if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
-                       boot_img = map_sysmem(get_abootimg_addr(), 0);
-                       vendor_boot_img = map_sysmem(get_avendor_bootimg_addr(), 0);
-               }
-               printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-               if (android_image_get_kernel(boot_img, vendor_boot_img, images->verify,
-                                            os_data, os_len))
-                       return NULL;
-               if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
-                       unmap_sysmem(vendor_boot_img);
-                       unmap_sysmem(boot_img);
-               }
-               break;
-#endif
-       default:
-               printf("Wrong Image Format for %s command\n", cmdtp->name);
-               bootstage_error(BOOTSTAGE_ID_FIT_KERNEL_INFO);
-               return NULL;
+       /*
+        * TODO([email protected]): This uses the command-line interface, but
+        * should not. To clean this up, the various bootm states need to be
+        * passed an info structure instead of cmdline flags. Then this can
+        * set up the required info and move through the states without needing
+        * the command line.
+        */
+       states = BOOTM_STATE_START | BOOTM_STATE_FINDOS | BOOTM_STATE_PRE_LOAD |
+               BOOTM_STATE_FINDOTHER | BOOTM_STATE_LOADOS |
+               BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |
+               BOOTM_STATE_OS_GO;
+       if (IS_ENABLED(CONFIG_SYS_BOOT_RAMDISK_HIGH))
+               states |= BOOTM_STATE_RAMDISK;
+       if (IS_ENABLED(CONFIG_PPC) || IS_ENABLED(CONFIG_MIPS))
+               states |= BOOTM_STATE_OS_CMDLINE;
+       images.state |= states;
+
+       snprintf(addr_str, sizeof(addr_str), "%lx", addr);
+
+       ret = env_set("bootargs", cmdline);
+       if (ret) {
+               printf("Failed to set cmdline\n");
+               return ret;
        }
+       ret = do_bootm_states(&cmd, 0, 1, argv, states, &images, 1);
 
-       debug("   kernel data at 0x%08lx, len = 0x%08lx (%ld)\n",
-             *os_data, *os_len, *os_len);
-
-       return buf;
+       return ret;
 }
 
 /**
This page took 0.044356 seconds and 4 git commands to generate.