-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cmd: Split 'bootz' and 'booti' out from 'bootm'
The bootz and booti commands rely on common functionality that is found in common/bootm.c and common/bootm_os.c. They do not however rely on the rest of cmd/bootm.c to be implemented so split them into their own files. Have various Makefiles include the required infrastructure for CONFIG_CMD_BOOT[IZ] as well as CONFIG_CMD_BOOTM. Move the declaration of 'images' over to common/bootm.c. Cc: Masahiro Yamada <[email protected]> Signed-off-by: Tom Rini <[email protected]>
- Loading branch information
Showing
8 changed files
with
276 additions
and
251 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
/* | ||
* (C) Copyright 2000-2009 | ||
* Wolfgang Denk, DENX Software Engineering, [email protected]. | ||
* | ||
* SPDX-License-Identifier: GPL-2.0+ | ||
*/ | ||
|
||
#include <common.h> | ||
#include <bootm.h> | ||
#include <command.h> | ||
#include <image.h> | ||
#include <lmb.h> | ||
#include <mapmem.h> | ||
|
||
DECLARE_GLOBAL_DATA_PTR; | ||
|
||
/* See Documentation/arm64/booting.txt in the Linux kernel */ | ||
struct Image_header { | ||
uint32_t code0; /* Executable code */ | ||
uint32_t code1; /* Executable code */ | ||
uint64_t text_offset; /* Image load offset, LE */ | ||
uint64_t image_size; /* Effective Image size, LE */ | ||
uint64_t res1; /* reserved */ | ||
uint64_t res2; /* reserved */ | ||
uint64_t res3; /* reserved */ | ||
uint64_t res4; /* reserved */ | ||
uint32_t magic; /* Magic number */ | ||
uint32_t res5; | ||
}; | ||
|
||
#define LINUX_ARM64_IMAGE_MAGIC 0x644d5241 | ||
|
||
static int booti_setup(bootm_headers_t *images) | ||
{ | ||
struct Image_header *ih; | ||
uint64_t dst; | ||
uint64_t image_size; | ||
|
||
ih = (struct Image_header *)map_sysmem(images->ep, 0); | ||
|
||
if (ih->magic != le32_to_cpu(LINUX_ARM64_IMAGE_MAGIC)) { | ||
puts("Bad Linux ARM64 Image magic!\n"); | ||
return 1; | ||
} | ||
|
||
if (ih->image_size == 0) { | ||
puts("Image lacks image_size field, assuming 16MiB\n"); | ||
image_size = 16 << 20; | ||
} else { | ||
image_size = le64_to_cpu(ih->image_size); | ||
} | ||
|
||
/* | ||
* If we are not at the correct run-time location, set the new | ||
* correct location and then move the image there. | ||
*/ | ||
dst = gd->bd->bi_dram[0].start + le64_to_cpu(ih->text_offset); | ||
|
||
unmap_sysmem(ih); | ||
|
||
if (images->ep != dst) { | ||
void *src; | ||
|
||
debug("Moving Image from 0x%lx to 0x%llx\n", images->ep, dst); | ||
|
||
src = (void *)images->ep; | ||
images->ep = dst; | ||
memmove((void *)dst, src, image_size); | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
/* | ||
* Image booting support | ||
*/ | ||
static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc, | ||
char * const argv[], bootm_headers_t *images) | ||
{ | ||
int ret; | ||
struct Image_header *ih; | ||
|
||
ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START, | ||
images, 1); | ||
|
||
/* Setup Linux kernel Image entry point */ | ||
if (!argc) { | ||
images->ep = load_addr; | ||
debug("* kernel: default image load address = 0x%08lx\n", | ||
load_addr); | ||
} else { | ||
images->ep = simple_strtoul(argv[0], NULL, 16); | ||
debug("* kernel: cmdline image address = 0x%08lx\n", | ||
images->ep); | ||
} | ||
|
||
ret = booti_setup(images); | ||
if (ret != 0) | ||
return 1; | ||
|
||
ih = (struct Image_header *)map_sysmem(images->ep, 0); | ||
|
||
lmb_reserve(&images->lmb, images->ep, le32_to_cpu(ih->image_size)); | ||
|
||
unmap_sysmem(ih); | ||
|
||
/* | ||
* 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; | ||
ret = do_bootm_states(cmdtp, flag, argc, argv, | ||
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]]\n" | ||
" - boot arm64 Linux Image stored in memory\n" | ||
"\tThe argument 'initrd' is optional and specifies the address\n" | ||
"\tof an initrd in memory. The optional parameter ':size' allows\n" | ||
"\tspecifying the size of a RAW initrd.\n" | ||
#if defined(CONFIG_OF_LIBFDT) | ||
"\tSince booting a Linux kernel requires a flat device-tree, a\n" | ||
"\tthird argument providing the address of the device-tree blob\n" | ||
"\tis required. To boot a kernel with a device-tree blob but\n" | ||
"\twithout an initrd image, use a '-' for the initrd argument.\n" | ||
#endif | ||
""; | ||
#endif | ||
|
||
U_BOOT_CMD( | ||
booti, CONFIG_SYS_MAXARGS, 1, do_booti, | ||
"boot arm64 Linux Image image from memory", booti_help_text | ||
); |
Oops, something went wrong.