diff options
-rw-r--r-- | firmware/lib/vboot_api_kernel.c | 28 | ||||
-rw-r--r-- | firmware/lib/vboot_ui.c | 17 | ||||
-rw-r--r-- | firmware/lib/vboot_ui_menu.c | 11 | ||||
-rw-r--r-- | tests/vboot_api_kernel_tests.c | 32 |
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, + }, }; /****************************************************************************/ |