armv8: semihosting: add a command to load semihosted images
Instead of sprinkling custom code and calls over the Vexpress64 boardfile, create a command that loads images using semihosting just like we would load from flash memory of over the network, using a special command: smhload <image> <address> This will make it possible to remove some custom calls and code and make the boot easier. Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
e769f68613
commit
202a674bb8
|
@ -13,6 +13,7 @@
|
||||||
* for them.
|
* for them.
|
||||||
*/
|
*/
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <command.h>
|
||||||
#include <asm/semihosting.h>
|
#include <asm/semihosting.h>
|
||||||
|
|
||||||
#define SYSOPEN 0x01
|
#define SYSOPEN 0x01
|
||||||
|
@ -234,3 +235,72 @@ long smh_len(const char *fname)
|
||||||
/* Return the file length (or -1 error indication) */
|
/* Return the file length (or -1 error indication) */
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int smh_load_file(const char * const name, ulong load_addr,
|
||||||
|
ulong *end_addr)
|
||||||
|
{
|
||||||
|
long fd;
|
||||||
|
long len;
|
||||||
|
long ret;
|
||||||
|
|
||||||
|
fd = smh_open(name, "rb");
|
||||||
|
if (fd == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
len = smh_len_fd(fd);
|
||||||
|
if (len < 0) {
|
||||||
|
smh_close(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = smh_read(fd, (void *)load_addr, len);
|
||||||
|
smh_close(fd);
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
*end_addr = load_addr + len - 1;
|
||||||
|
printf("loaded file %s from %08lX to %08lX, %08lX bytes\n",
|
||||||
|
name,
|
||||||
|
load_addr,
|
||||||
|
*end_addr,
|
||||||
|
len);
|
||||||
|
} else {
|
||||||
|
printf("read failed\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_smhload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
if (argc == 3 || argc == 4) {
|
||||||
|
ulong load_addr;
|
||||||
|
ulong end_addr = 0;
|
||||||
|
ulong ret;
|
||||||
|
char end_str[64];
|
||||||
|
|
||||||
|
load_addr = simple_strtoul(argv[2], NULL, 16);
|
||||||
|
if (!load_addr)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
ret = smh_load_file(argv[1], load_addr, &end_addr);
|
||||||
|
if (ret < 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Optionally save returned end to the environment */
|
||||||
|
if (argc == 4) {
|
||||||
|
sprintf(end_str, "0x%08lx", end_addr);
|
||||||
|
setenv(argv[3], end_str);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
U_BOOT_CMD(smhload, 4, 0, do_smhload, "load a file using semihosting",
|
||||||
|
"<file> 0x<address> [end var]\n"
|
||||||
|
" - load a semihosted file to the address specified\n"
|
||||||
|
" if the optional [end var] is specified, the end\n"
|
||||||
|
" address of the file will be stored in this environment\n"
|
||||||
|
" variable.\n");
|
||||||
|
|
|
@ -30,25 +30,10 @@ vexpress_aemv8a.h but differentiate the two models by the presence or
|
||||||
absence of CONFIG_BASE_FVP. This change is tested and works on both the
|
absence of CONFIG_BASE_FVP. This change is tested and works on both the
|
||||||
Foundation and Base fastmodel simulators.
|
Foundation and Base fastmodel simulators.
|
||||||
|
|
||||||
The level of semihosting support is minimal, restricted to just what it
|
The semihosting code adds a command:
|
||||||
takes to load images to memory. If more semihosting functionality is
|
|
||||||
required, such as file seek, outputting strings, reading characters, etc,
|
|
||||||
then it can be easily added later.
|
|
||||||
|
|
||||||
We require that the board include file define these env variables:
|
smhload <image> <address> [env var]
|
||||||
- kernel_name e.g. "uImage"
|
|
||||||
- kernel_addr_r e.g. "0x80000000"
|
|
||||||
- initrd_name e.g. "ramdisk.img"
|
|
||||||
- initrd_addr_r e.g. "0x88000000"
|
|
||||||
- fdt_name e.g. "devtree.dtb"
|
|
||||||
- fdt_addr_r e.g. "0x83000000"
|
|
||||||
|
|
||||||
Optionally, "fdt_high" and "initrd_high" can be specified as per
|
That will load an image from the host filesystem into RAM at the specified
|
||||||
their rules for allowing or preventing copying of these images.
|
address and optionally store the load end address in the specified
|
||||||
|
environment variable.
|
||||||
For the "fdt chosen" startup macro, this code will then define:
|
|
||||||
- initrd_end (based on retrieving initrd_addr_r plus actual initrd_size)
|
|
||||||
|
|
||||||
We will then load the kernel, initrd, and fdt into the specified
|
|
||||||
locations in memory in a similar way that the ATF fastmodel code
|
|
||||||
uses semihosting calls to load other boot stages and u-boot itself.
|
|
||||||
|
|
Loading…
Reference in New Issue