Blame view
cmd/booti.c
2.76 KB
83d290c56
|
1 |
// SPDX-License-Identifier: GPL-2.0+ |
5db28905c
|
2 3 4 |
/* * (C) Copyright 2000-2009 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
5db28905c
|
5 6 7 8 9 10 11 12 |
*/ #include <common.h> #include <bootm.h> #include <command.h> #include <image.h> #include <lmb.h> #include <mapmem.h> |
280857649
|
13 14 |
#include <linux/kernel.h> #include <linux/sizes.h> |
5db28905c
|
15 |
|
5db28905c
|
16 17 18 19 20 21 22 |
/* * Image booting support */ static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], bootm_headers_t *images) { int ret; |
6808ef9ac
|
23 24 25 |
ulong ld; ulong relocated_addr; ulong image_size; |
5db28905c
|
26 27 28 29 30 31 |
ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START, images, 1); /* Setup Linux kernel Image entry point */ if (!argc) { |
6808ef9ac
|
32 |
ld = load_addr; |
5db28905c
|
33 34 35 36 |
debug("* kernel: default image load address = 0x%08lx ", load_addr); } else { |
6808ef9ac
|
37 |
ld = simple_strtoul(argv[0], NULL, 16); |
bf14d9a7e
|
38 39 |
debug("* kernel: cmdline image address = 0x%08lx ", ld); |
5db28905c
|
40 |
} |
7f13b374f
|
41 |
ret = booti_setup(ld, &relocated_addr, &image_size, false); |
5db28905c
|
42 43 |
if (ret != 0) return 1; |
6808ef9ac
|
44 45 46 47 48 49 |
/* Handle BOOTM_STATE_LOADOS */ if (relocated_addr != ld) { debug("Moving Image from 0x%lx to 0x%lx ", ld, relocated_addr); memmove((void *)relocated_addr, (void *)ld, image_size); } |
5db28905c
|
50 |
|
6808ef9ac
|
51 52 |
images->ep = relocated_addr; lmb_reserve(&images->lmb, images->ep, le32_to_cpu(image_size)); |
5db28905c
|
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
/* * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not * have a header that provide this informaiton. */ if (bootm_find_images(flag, argc, argv)) return 1; return 0; } int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int ret; /* Consume 'booti' */ argc--; argv++; if (booti_start(cmdtp, flag, argc, argv, &images)) return 1; /* * We are doing the BOOTM_STATE_LOADOS state ourselves, so must * disable interrupts ourselves */ bootm_disable_interrupts(); images.os.os = IH_OS_LINUX; |
0fff19a67
|
81 |
images.os.arch = IH_ARCH_ARM64; |
5db28905c
|
82 |
ret = do_bootm_states(cmdtp, flag, argc, argv, |
4943dc2f1
|
83 84 85 |
#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH BOOTM_STATE_RAMDISK | #endif |
5db28905c
|
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO | BOOTM_STATE_OS_GO, &images, 1); return ret; } #ifdef CONFIG_SYS_LONGHELP static char booti_help_text[] = "[addr [initrd[:size]] [fdt]] " " - boot arm64 Linux Image stored in memory " "\tThe argument 'initrd' is optional and specifies the address " "\tof an initrd in memory. The optional parameter ':size' allows " "\tspecifying the size of a RAW initrd. " #if defined(CONFIG_OF_LIBFDT) "\tSince booting a Linux kernel requires a flat device-tree, a " "\tthird argument providing the address of the device-tree blob " "\tis required. To boot a kernel with a device-tree blob but " "\twithout an initrd image, use a '-' for the initrd argument. " #endif ""; #endif U_BOOT_CMD( booti, CONFIG_SYS_MAXARGS, 1, do_booti, "boot arm64 Linux Image image from memory", booti_help_text ); |