sandbox: Support obtaining the next phase from an image

At present sandbox runs the next phase from discrete executables, so for
example u-boot-tpl runs u-boot-vpl to get to the next phase.

In some cases the phases are all built into a single firmware image, as is
done for real boards. Add support for this to sandbox.

Make it higher priority so that it takes precedence over the existing
method.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2022-10-20 18:23:08 -06:00 committed by Tom Rini
parent 5a61bf17d8
commit f1459c3657
2 changed files with 54 additions and 1 deletions

View file

@ -78,7 +78,48 @@ static int spl_board_load_file(struct spl_image_info *spl_image,
return 0;
}
SPL_LOAD_IMAGE_METHOD("sandbox", 9, BOOT_DEVICE_BOARD, spl_board_load_file);
SPL_LOAD_IMAGE_METHOD("sandbox_file", 9, BOOT_DEVICE_BOARD,
spl_board_load_file);
static int load_from_image(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
{
struct sandbox_state *state = state_get_current();
enum u_boot_phase next_phase;
const char *fname;
ulong pos, size;
int full_size;
void *buf;
int ret;
if (!IS_ENABLED(CONFIG_SANDBOX_VPL))
return -ENOENT;
next_phase = spl_next_phase();
pos = spl_get_image_pos();
size = spl_get_image_size();
if (pos == BINMAN_SYM_MISSING || size == BINMAN_SYM_MISSING) {
log_debug("No image found\n");
return -ENOENT;
}
log_info("Reading from pos %lx size %lx\n", pos, size);
/*
* Set up spl_image to boot from jump_to_image_no_args(). Allocate this
* outside the RAM buffer (i.e. don't use strdup()).
*/
fname = state->prog_fname ? state->prog_fname : state->argv[0];
ret = os_read_file(fname, &buf, &full_size);
if (ret)
return log_msg_ret("rd", -ENOMEM);
spl_image->flags = SPL_SANDBOXF_ARG_IS_BUF;
spl_image->arg = buf;
spl_image->offset = pos;
spl_image->size = size;
return 0;
}
SPL_LOAD_IMAGE_METHOD("sandbox_image", 7, BOOT_DEVICE_BOARD, load_from_image);
void spl_board_init(void)
{
@ -109,6 +150,15 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
}
break;
}
case SPL_SANDBOXF_ARG_IS_BUF: {
int ret;
ret = os_jump_to_image(spl_image->arg + spl_image->offset,
spl_image->size);
if (ret)
log_err("Failed to load image\n");
break;
}
default:
log_err("Invalid flags\n");
break;

View file

@ -232,9 +232,12 @@ static inline const char *spl_phase_prefix(enum u_boot_phase phase)
* enum spl_sandbox_flags - flags for sandbox's use of spl_image_info->flags
*
* @SPL_SANDBOXF_ARG_IS_FNAME: arg is the filename to jump to (default)
* @SPL_SANDBOXF_ARG_IS_BUF: arg is the containing image to jump to, @offset is
* the start offset within the image, @size is the size of the image
*/
enum spl_sandbox_flags {
SPL_SANDBOXF_ARG_IS_FNAME = 0,
SPL_SANDBOXF_ARG_IS_BUF,
};
struct spl_image_info {