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:
		
							parent
							
								
									5a61bf17d8
								
							
						
					
					
						commit
						f1459c3657
					
				| 
						 | 
					@ -78,7 +78,48 @@ static int spl_board_load_file(struct spl_image_info *spl_image,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						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)
 | 
					void spl_board_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -109,6 +150,15 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							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:
 | 
						default:
 | 
				
			||||||
		log_err("Invalid flags\n");
 | 
							log_err("Invalid flags\n");
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					 * 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_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 {
 | 
					enum spl_sandbox_flags {
 | 
				
			||||||
	SPL_SANDBOXF_ARG_IS_FNAME = 0,
 | 
						SPL_SANDBOXF_ARG_IS_FNAME = 0,
 | 
				
			||||||
 | 
						SPL_SANDBOXF_ARG_IS_BUF,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct spl_image_info {
 | 
					struct spl_image_info {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue