summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/lib/vboot_api_kernel.c15
-rw-r--r--tests/vboot_api_kernel4_tests.c12
2 files changed, 22 insertions, 5 deletions
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index 6111eee0..ff13a256 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -176,6 +176,7 @@ vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx,
VbSelectAndLoadKernelParams *kparams)
{
struct vb2_shared_data *sd = vb2_get_sd(ctx);
+ vb2_gbb_flags_t gbb_flags = vb2api_gbb_get_flags(ctx);
/* Init nvstorage space. TODO(kitching): Remove once we add assertions
to vb2_nv_get and vb2_nv_set. */
@@ -185,7 +186,7 @@ vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx,
VB2_TRY(vb2api_kernel_phase1(ctx));
- VB2_DEBUG("GBB flags are %#x\n", vb2_get_gbb(ctx)->flags);
+ VB2_DEBUG("GBB flags are %#x\n", gbb_flags);
/*
* Do EC and Aux FW software sync unless we're in recovery mode. This
@@ -262,10 +263,14 @@ vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx,
VB2_TRY(vb2_normal_boot(ctx));
}
- if (ctx->flags & VB2_CONTEXT_NO_BOOT) {
- /* Stop all cases returning SUCCESS against NO_BOOT flag. */
- VB2_DEBUG("Blocking boot in NO_BOOT mode.\n");
- vb2api_fail(ctx, VB2_RECOVERY_RW_INVALID_OS, 0);
+ /*
+ * Stop all cases returning SUCCESS against NO_BOOT flag except when
+ * GBB flag disables software sync.
+ */
+ if (!(gbb_flags & VB2_GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC)
+ && (ctx->flags & VB2_CONTEXT_NO_BOOT)) {
+ VB2_DEBUG("Blocking escape from NO_BOOT mode.\n");
+ vb2api_fail(ctx, VB2_RECOVERY_ESCAPE_NO_BOOT, 0);
return VB2_ERROR_ESCAPE_NO_BOOT;
}
diff --git a/tests/vboot_api_kernel4_tests.c b/tests/vboot_api_kernel4_tests.c
index 38d70552..de4688b0 100644
--- a/tests/vboot_api_kernel4_tests.c
+++ b/tests/vboot_api_kernel4_tests.c
@@ -248,6 +248,18 @@ static void select_and_load_kernel_tests(void)
kernel_phase1_retval = VB2_ERROR_MOCK;
test_slk(VB2_ERROR_MOCK, 0, "Normal phase1 failure");
+ /* Recovery - VB2_ERROR_ESCAPE_NO_BOOT */
+ reset_common_data();
+ ctx->flags |= VB2_CONTEXT_NO_BOOT;
+ test_slk(VB2_ERROR_ESCAPE_NO_BOOT,
+ VB2_RECOVERY_ESCAPE_NO_BOOT, "Recovery for NO_BOOT escape");
+
+ /* Boot normal - VB2_ERROR_ESCAPE_NO_BOOT */
+ reset_common_data();
+ ctx->flags |= VB2_CONTEXT_NO_BOOT;
+ gbb.flags |= VB2_GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC;
+ test_slk(VB2_SUCCESS, 0, "DISABLE_EC_SOFTWARE_SYNC ignores NO_BOOT");
+
/* Boot dev */
reset_common_data();
ctx->flags |= VB2_CONTEXT_DEVELOPER_MODE;