summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/lib/vboot_api_kernel.c28
-rw-r--r--firmware/lib/vboot_ui.c17
-rw-r--r--firmware/lib/vboot_ui_menu.c11
-rw-r--r--tests/vboot_api_kernel_tests.c32
4 files changed, 47 insertions, 41 deletions
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index ff4cbf4b..ad7be645 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -121,19 +121,21 @@ vb2_error_t VbTryLoadKernel(struct vb2_context *ctx, uint32_t get_info_flags)
}
/* If we drop out of the loop, we didn't find any usable kernel. */
- switch (rv) {
- case VBERROR_INVALID_KERNEL_FOUND:
- vb2api_fail(ctx, VB2_RECOVERY_RW_INVALID_OS, rv);
- break;
- case VBERROR_NO_KERNEL_FOUND:
- vb2api_fail(ctx, VB2_RECOVERY_RW_NO_KERNEL, rv);
- break;
- case VBERROR_NO_DISK_FOUND:
- vb2api_fail(ctx, VB2_RECOVERY_RW_NO_DISK, rv);
- break;
- default:
- vb2api_fail(ctx, VB2_RECOVERY_LK_UNSPECIFIED, rv);
- break;
+ if (get_info_flags & VB_DISK_FLAG_FIXED) {
+ switch (rv) {
+ case VBERROR_INVALID_KERNEL_FOUND:
+ vb2api_fail(ctx, VB2_RECOVERY_RW_INVALID_OS, rv);
+ break;
+ case VBERROR_NO_KERNEL_FOUND:
+ vb2api_fail(ctx, VB2_RECOVERY_RW_NO_KERNEL, rv);
+ break;
+ case VBERROR_NO_DISK_FOUND:
+ vb2api_fail(ctx, VB2_RECOVERY_RW_NO_DISK, rv);
+ break;
+ default:
+ vb2api_fail(ctx, VB2_RECOVERY_LK_UNSPECIFIED, rv);
+ break;
+ }
}
/* If we didn't find any good kernels, don't return a disk handle. */
diff --git a/firmware/lib/vboot_ui.c b/firmware/lib/vboot_ui.c
index a2cdab46..cae29ec8 100644
--- a/firmware/lib/vboot_ui.c
+++ b/firmware/lib/vboot_ui.c
@@ -91,14 +91,6 @@ static vb2_error_t VbTryUsb(struct vb2_context *ctx)
vb2_error_notify("Could not boot from USB\n",
"VbBootDeveloper() - no kernel found on USB\n",
VB_BEEP_FAILED);
- /*
- * Clear recovery requests from failed
- * kernel loading, so that powering off
- * at this point doesn't put us into
- * recovery mode.
- */
- vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST,
- VB2_RECOVERY_NOT_REQUESTED);
}
return retval;
}
@@ -855,15 +847,6 @@ static vb2_error_t recovery_ui(struct vb2_context *ctx)
VB2_DEBUG("VbBootRecovery() attempting to load kernel2\n");
retval = VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE);
- /*
- * Clear recovery requests from failed kernel loading, since
- * we're already in recovery mode. Do this now, so that
- * powering off after inserting an invalid disk doesn't leave
- * us stuck in recovery mode.
- */
- vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST,
- VB2_RECOVERY_NOT_REQUESTED);
-
if (VB2_SUCCESS == retval)
break; /* Found a recovery kernel */
diff --git a/firmware/lib/vboot_ui_menu.c b/firmware/lib/vboot_ui_menu.c
index 58349ca3..d1808b90 100644
--- a/firmware/lib/vboot_ui_menu.c
+++ b/firmware/lib/vboot_ui_menu.c
@@ -198,8 +198,6 @@ static vb2_error_t boot_usb_action(struct vb2_context *ctx)
return VB2_SUCCESS;
}
- /* Loading kernel failed. Clear recovery request from that. */
- vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST, VB2_RECOVERY_NOT_REQUESTED);
vb2_flash_screen(ctx);
vb2_error_notify(no_kernel, NULL, VB_BEEP_FAILED);
return VBERROR_KEEP_LOOPING;
@@ -894,15 +892,6 @@ static vb2_error_t recovery_ui(struct vb2_context *ctx)
VB2_DEBUG("attempting to load kernel2\n");
ret = VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE);
- /*
- * Clear recovery requests from failed kernel loading, since
- * we're already in recovery mode. Do this now, so that
- * powering off after inserting an invalid disk doesn't leave
- * us stuck in recovery mode.
- */
- vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST,
- VB2_RECOVERY_NOT_REQUESTED);
-
if (VB2_SUCCESS == ret)
return ret; /* Found a recovery kernel */
diff --git a/tests/vboot_api_kernel_tests.c b/tests/vboot_api_kernel_tests.c
index 1734c386..8c57dee6 100644
--- a/tests/vboot_api_kernel_tests.c
+++ b/tests/vboot_api_kernel_tests.c
@@ -257,6 +257,38 @@ test_case_t test[] = {
.expected_to_load_disk = 0,
.expected_return_val = VBERROR_NO_KERNEL_FOUND,
},
+ {
+ .name = "invalid kernel (removable)",
+ .want_flags = VB_DISK_FLAG_REMOVABLE,
+ .disks_to_provide = {
+ {512, 100, VB_DISK_FLAG_REMOVABLE, "corrupted"},
+ {512, 100, VB_DISK_FLAG_REMOVABLE, "data"},
+ },
+ .disk_count_to_return = DEFAULT_COUNT,
+ .diskgetinfo_return_val = VB2_SUCCESS,
+ .loadkernel_return_val = {VBERROR_INVALID_KERNEL_FOUND,
+ VBERROR_NO_KERNEL_FOUND},
+
+ .expected_recovery_request_val = VB2_RECOVERY_NOT_REQUESTED,
+ .expected_to_find_disk = DONT_CARE,
+ .expected_to_load_disk = 0,
+ .expected_return_val = VBERROR_INVALID_KERNEL_FOUND,
+ },
+ {
+ .name = "no kernel (removable)",
+ .want_flags = VB_DISK_FLAG_REMOVABLE,
+ .disks_to_provide = {
+ {512, 100, VB_DISK_FLAG_REMOVABLE, "data"},
+ },
+ .disk_count_to_return = DEFAULT_COUNT,
+ .diskgetinfo_return_val = VB2_SUCCESS,
+ .loadkernel_return_val = {VBERROR_NO_KERNEL_FOUND},
+
+ .expected_recovery_request_val = VB2_RECOVERY_NOT_REQUESTED,
+ .expected_to_find_disk = DONT_CARE,
+ .expected_to_load_disk = 0,
+ .expected_return_val = VBERROR_NO_KERNEL_FOUND,
+ },
};
/****************************************************************************/