diff options
author | Yu-Ping Wu <yupingso@chromium.org> | 2021-10-13 11:02:20 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-10-15 09:06:41 +0000 |
commit | 2d1ce45dc46b0dd5522edf1edabef35b90a66942 (patch) | |
tree | 79b805d4776f9432c1ecb35fb5a49c4d399aaeb5 /firmware | |
parent | 1269365169791c65a6bf6f364583209195874138 (diff) | |
download | vboot-2d1ce45dc46b0dd5522edf1edabef35b90a66942.tar.gz |
vboot: Support booting from non-active miniOS partition
To support booting from the non-active miniOS partition in recovery UI,
add minios_flags argument to VbTryLoadMiniOsKernel. Currently there is
only one flag: VB_MINIOS_FLAG_NON_ACTIVE. When it is set, we will
attempt to boot from the non-active partition only.
BUG=b:200750322
TEST=make runtests
BRANCH=none
Cq-Depend: chromium:3219727
Change-Id: I6221f10c09de2487e89e6113981bc9e9755d67f4
Signed-off-by: Yu-Ping Wu <yupingso@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/3219901
Reviewed-by: Julius Werner <jwerner@chromium.org>
Reviewed-by: Jae Hoon Kim <kimjae@chromium.org>
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/include/vboot_api.h | 9 | ||||
-rw-r--r-- | firmware/lib/include/load_kernel_fw.h | 3 | ||||
-rw-r--r-- | firmware/lib/vboot_api_kernel.c | 12 | ||||
-rw-r--r-- | firmware/lib/vboot_kernel.c | 9 |
4 files changed, 24 insertions, 9 deletions
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h index f19ee747..1fee766d 100644 --- a/firmware/include/vboot_api.h +++ b/firmware/include/vboot_api.h @@ -89,6 +89,11 @@ vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx, */ vb2_error_t VbTryLoadKernel(struct vb2_context *ctx, uint32_t disk_flags); +/* miniOS flags */ + +/* Boot from non-active miniOS partition only */ +#define VB_MINIOS_FLAG_NON_ACTIVE (1 << 0) + /** * Attempt loading a miniOS kernel from internal disk. * @@ -100,9 +105,11 @@ vb2_error_t VbTryLoadKernel(struct vb2_context *ctx, uint32_t disk_flags); * VB2_SUCCESS. * * @param ctx Vboot context + * @param minios_flags Flags for miniOS * @return VB2_SUCCESS or the most specific VB2_ERROR_LK error. */ -vb2_error_t VbTryLoadMiniOsKernel(struct vb2_context *ctx); +vb2_error_t VbTryLoadMiniOsKernel(struct vb2_context *ctx, + uint32_t minios_flags); /*****************************************************************************/ /* Disk access (previously in boot_device.h) */ diff --git a/firmware/lib/include/load_kernel_fw.h b/firmware/lib/include/load_kernel_fw.h index af454703..76d25560 100644 --- a/firmware/lib/include/load_kernel_fw.h +++ b/firmware/lib/include/load_kernel_fw.h @@ -30,11 +30,12 @@ vb2_error_t LoadKernel(struct vb2_context *ctx, * @param ctx Vboot context * @param params Params specific to loading the kernel * @param disk_info Disk from which to read kernel + * @param minios_flags Flags for miniOS * * Returns VB2_SUCCESS if successful. If unsuccessful, returns an error code. */ vb2_error_t LoadMiniOsKernel(struct vb2_context *ctx, VbSelectAndLoadKernelParams *params, - VbDiskInfo *disk_info); + VbDiskInfo *disk_info, uint32_t minios_flags); #endif /* VBOOT_REFERENCE_LOAD_KERNEL_FW_H_ */ diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c index 2abd57eb..54447c26 100644 --- a/firmware/lib/vboot_api_kernel.c +++ b/firmware/lib/vboot_api_kernel.c @@ -62,7 +62,8 @@ static int is_valid_disk(VbDiskInfo *info, uint32_t disk_flags) } static vb2_error_t VbTryLoadKernelImpl(struct vb2_context *ctx, - uint32_t disk_flags, int minios) + uint32_t disk_flags, int minios, + uint32_t minios_flags) { vb2_error_t rv = VB2_ERROR_LK_NO_DISK_FOUND; VbDiskInfo* disk_info = NULL; @@ -96,7 +97,7 @@ static vb2_error_t VbTryLoadKernelImpl(struct vb2_context *ctx, if (minios) { new_rv = LoadMiniOsKernel(ctx, kparams_ptr, - &disk_info[i]); + &disk_info[i], minios_flags); VB2_DEBUG("LoadMiniOsKernel() = %#x\n", new_rv); } else { new_rv = LoadKernel(ctx, kparams_ptr, &disk_info[i]); @@ -142,13 +143,14 @@ static vb2_error_t VbTryLoadKernelImpl(struct vb2_context *ctx, test_mockable vb2_error_t VbTryLoadKernel(struct vb2_context *ctx, uint32_t disk_flags) { - return VbTryLoadKernelImpl(ctx, disk_flags, 0); + return VbTryLoadKernelImpl(ctx, disk_flags, 0, 0); } test_mockable -vb2_error_t VbTryLoadMiniOsKernel(struct vb2_context *ctx) +vb2_error_t VbTryLoadMiniOsKernel(struct vb2_context *ctx, + uint32_t minios_flags) { - return VbTryLoadKernelImpl(ctx, VB_DISK_FLAG_FIXED, 1); + return VbTryLoadKernelImpl(ctx, VB_DISK_FLAG_FIXED, 1, minios_flags); } vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx, diff --git a/firmware/lib/vboot_kernel.c b/firmware/lib/vboot_kernel.c index 34a8a426..cb83d40d 100644 --- a/firmware/lib/vboot_kernel.c +++ b/firmware/lib/vboot_kernel.c @@ -607,12 +607,17 @@ static vb2_error_t try_minios_sector_region(struct vb2_context *ctx, */ vb2_error_t LoadMiniOsKernel(struct vb2_context *ctx, VbSelectAndLoadKernelParams *params, - VbDiskInfo *disk_info) + VbDiskInfo *disk_info, uint32_t minios_flags) { vb2_error_t rv; int end_region_first = vb2_nv_get(ctx, VB2_NV_MINIOS_PRIORITY); - rv = try_minios_sector_region(ctx, params, disk_info, end_region_first); + if (minios_flags & VB_MINIOS_FLAG_NON_ACTIVE) + rv = VB2_ERROR_UNKNOWN; /* Ignore active partition */ + else + rv = try_minios_sector_region(ctx, params, disk_info, + end_region_first); + if (rv) rv = try_minios_sector_region(ctx, params, disk_info, !end_region_first); |