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:
Rui Miguel Silva
2022-05-11 10:55:40 +01:00
committed by Tom Rini
parent a47ce34403
commit bfef72e4dd
14 changed files with 209 additions and 0 deletions

View File

@@ -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

View File

@@ -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
*/

View File

@@ -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 */