cmd: load: add load command for memory mapped
cp.b is used a lot as a way to load binaries to memory and execute them, however we may need to integrate this with the efi subsystem to set it up as a bootdev. So, introduce a loadm command that will be consistent with the other loadX commands and will call the efi API's. ex: loadm $kernel_addr $kernel_addr_r $kernel_size with this a kernel with CONFIG_EFI_STUB enabled will be loaded and then subsequently booted with bootefi command. Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org> Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
committed by
Tom Rini
parent
a47ce34403
commit
bfef72e4dd
@@ -1160,6 +1160,11 @@ config CMD_LOADB
|
||||
help
|
||||
Load a binary file over serial line.
|
||||
|
||||
config CMD_LOADM
|
||||
bool "loadm"
|
||||
help
|
||||
Load a binary over memory mapped.
|
||||
|
||||
config CMD_LOADS
|
||||
bool "loads"
|
||||
default y
|
||||
|
||||
@@ -34,6 +34,18 @@ static struct efi_device_path *bootefi_device_path;
|
||||
static void *image_addr;
|
||||
static size_t image_size;
|
||||
|
||||
/**
|
||||
* efi_get_image_parameters() - return image parameters
|
||||
*
|
||||
* @img_addr: address of loaded image in memory
|
||||
* @img_size: size of loaded image
|
||||
*/
|
||||
void efi_get_image_parameters(void **img_addr, size_t *img_size)
|
||||
{
|
||||
*img_addr = image_addr;
|
||||
*img_size = image_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_clear_bootdev() - clear boot device
|
||||
*/
|
||||
|
||||
48
cmd/load.c
48
cmd/load.c
@@ -1063,6 +1063,44 @@ static ulong load_serial_ymodem(ulong offset, int mode)
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CMD_LOADM)
|
||||
static int do_load_memory_bin(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||
char *const argv[])
|
||||
{
|
||||
ulong addr, dest, size;
|
||||
void *src, *dst;
|
||||
|
||||
if (argc != 4)
|
||||
return CMD_RET_USAGE;
|
||||
|
||||
addr = simple_strtoul(argv[1], NULL, 16);
|
||||
|
||||
dest = simple_strtoul(argv[2], NULL, 16);
|
||||
|
||||
size = simple_strtoul(argv[3], NULL, 16);
|
||||
|
||||
if (!size) {
|
||||
printf("loadm: can not load zero bytes\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
src = map_sysmem(addr, size);
|
||||
dst = map_sysmem(dest, size);
|
||||
|
||||
memcpy(dst, src, size);
|
||||
|
||||
unmap_sysmem(src);
|
||||
unmap_sysmem(dst);
|
||||
|
||||
if (IS_ENABLED(CONFIG_CMD_BOOTEFI))
|
||||
efi_set_bootdev("Mem", "", "", map_sysmem(dest, 0), size);
|
||||
|
||||
printf("loaded bin to memory: size: %lu\n", size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_CMD_LOADS)
|
||||
@@ -1137,3 +1175,13 @@ U_BOOT_CMD(
|
||||
);
|
||||
|
||||
#endif /* CONFIG_CMD_LOADB */
|
||||
|
||||
#if defined(CONFIG_CMD_LOADM)
|
||||
U_BOOT_CMD(
|
||||
loadm, 4, 0, do_load_memory_bin,
|
||||
"load binary blob from source address to destination address",
|
||||
"[src_addr] [dst_addr] [size]\n"
|
||||
" - load a binary blob from one memory location to other"
|
||||
" from src_addr to dst_addr by size bytes"
|
||||
);
|
||||
#endif /* CONFIG_CMD_LOADM */
|
||||
|
||||
Reference in New Issue
Block a user