uboot/cmd/bootz.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2000-2009
   3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 */
   7
   8#include <common.h>
   9#include <bootm.h>
  10#include <command.h>
  11#include <lmb.h>
  12#include <linux/compiler.h>
  13
  14int __weak bootz_setup(ulong image, ulong *start, ulong *end)
  15{
  16        /* Please define bootz_setup() for your platform */
  17
  18        puts("Your platform's zImage format isn't supported yet!\n");
  19        return -1;
  20}
  21
  22/*
  23 * zImage booting support
  24 */
  25static int bootz_start(cmd_tbl_t *cmdtp, int flag, int argc,
  26                        char * const argv[], bootm_headers_t *images)
  27{
  28        int ret;
  29        ulong zi_start, zi_end;
  30
  31        ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START,
  32                              images, 1);
  33
  34        /* Setup Linux kernel zImage entry point */
  35        if (!argc) {
  36                images->ep = load_addr;
  37                debug("*  kernel: default image load address = 0x%08lx\n",
  38                                load_addr);
  39        } else {
  40                images->ep = simple_strtoul(argv[0], NULL, 16);
  41                debug("*  kernel: cmdline image address = 0x%08lx\n",
  42                        images->ep);
  43        }
  44
  45        ret = bootz_setup(images->ep, &zi_start, &zi_end);
  46        if (ret != 0)
  47                return 1;
  48
  49        lmb_reserve(&images->lmb, images->ep, zi_end - zi_start);
  50
  51        /*
  52         * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not
  53         * have a header that provide this informaiton.
  54         */
  55        if (bootm_find_images(flag, argc, argv))
  56                return 1;
  57
  58        return 0;
  59}
  60
  61int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  62{
  63        int ret;
  64
  65        /* Consume 'bootz' */
  66        argc--; argv++;
  67
  68        if (bootz_start(cmdtp, flag, argc, argv, &images))
  69                return 1;
  70
  71        /*
  72         * We are doing the BOOTM_STATE_LOADOS state ourselves, so must
  73         * disable interrupts ourselves
  74         */
  75        bootm_disable_interrupts();
  76
  77        images.os.os = IH_OS_LINUX;
  78        ret = do_bootm_states(cmdtp, flag, argc, argv,
  79                              BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |
  80                              BOOTM_STATE_OS_GO,
  81                              &images, 1);
  82
  83        return ret;
  84}
  85
  86#ifdef CONFIG_SYS_LONGHELP
  87static char bootz_help_text[] =
  88        "[addr [initrd[:size]] [fdt]]\n"
  89        "    - boot Linux zImage stored in memory\n"
  90        "\tThe argument 'initrd' is optional and specifies the address\n"
  91        "\tof the initrd in memory. The optional argument ':size' allows\n"
  92        "\tspecifying the size of RAW initrd.\n"
  93#if defined(CONFIG_OF_LIBFDT)
  94        "\tWhen booting a Linux kernel which requires a flat device-tree\n"
  95        "\ta third argument is required which is the address of the\n"
  96        "\tdevice-tree blob. To boot that kernel without an initrd image,\n"
  97        "\tuse a '-' for the second argument. If you do not pass a third\n"
  98        "\ta bd_info struct will be passed instead\n"
  99#endif
 100        "";
 101#endif
 102
 103U_BOOT_CMD(
 104        bootz,  CONFIG_SYS_MAXARGS,     1,      do_bootz,
 105        "boot Linux zImage image from memory", bootz_help_text
 106);
 107