diff options
Diffstat (limited to 'tests/vboot_api_kernel4_tests.c')
-rw-r--r-- | tests/vboot_api_kernel4_tests.c | 106 |
1 files changed, 62 insertions, 44 deletions
diff --git a/tests/vboot_api_kernel4_tests.c b/tests/vboot_api_kernel4_tests.c index 91ba5198..6ac25bd8 100644 --- a/tests/vboot_api_kernel4_tests.c +++ b/tests/vboot_api_kernel4_tests.c @@ -22,6 +22,7 @@ #include "vboot_test.h" /* Mock data */ + static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE] __attribute__((aligned(VB2_WORKBUF_ALIGN))); static struct vb2_context *ctx; @@ -39,13 +40,14 @@ static int commit_data_called; static vb2_error_t secdata_kernel_init_retval; static vb2_error_t secdata_fwmp_init_retval; static vb2_error_t kernel_phase1_retval; +static uint32_t current_recovery_reason; +static uint32_t expected_recovery_reason; static uint32_t mock_switches[8]; static uint32_t mock_switches_count; static int mock_switches_are_stuck; -/* Reset mock data (for use before each test) */ -static void ResetMocks(void) +static void reset_common_data(void) { memset(&kparams, 0, sizeof(kparams)); @@ -73,12 +75,23 @@ static void ResetMocks(void) secdata_kernel_init_retval = VB2_SUCCESS; secdata_fwmp_init_retval = VB2_SUCCESS; kernel_phase1_retval = VB2_SUCCESS; + current_recovery_reason = 0; + expected_recovery_reason = 0; memset(mock_switches, 0, sizeof(mock_switches)); mock_switches_count = 0; mock_switches_are_stuck = 0; } +static void test_slk(vb2_error_t retval, int recovery_reason, const char *desc) +{ + expected_recovery_reason = recovery_reason; + TEST_EQ(VbSelectAndLoadKernel(ctx, shared, &kparams), retval, desc); + TEST_EQ(current_recovery_reason, expected_recovery_reason, + " recovery reason"); + TEST_TRUE(commit_data_called, " commit nvdata"); +} + /* Mock functions */ struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c) @@ -96,6 +109,7 @@ vb2_error_t vb2api_kernel_phase1(struct vb2_context *c) vb2_error_t vb2ex_commit_data(struct vb2_context *c) { + current_recovery_reason = vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST); commit_data_called = 1; return commit_data_retval; } @@ -139,6 +153,10 @@ vb2_error_t VbBootDeveloperLegacyClamshell(struct vb2_context *c) vb2_error_t VbBootRecoveryLegacyClamshell(struct vb2_context *c) { + TEST_EQ(current_recovery_reason, expected_recovery_reason, + " recovery reason"); + TEST_TRUE(commit_data_called, " commit nvdata"); + shared->kernel_version_tpm = new_version; if (vbboot_retval == -3) @@ -155,15 +173,6 @@ vb2_error_t VbBootDiagnosticLegacyClamshell(struct vb2_context *c) return vbboot_retval; } -static void test_slk(vb2_error_t retval, int recovery_reason, const char *desc) -{ - TEST_EQ(VbSelectAndLoadKernel(ctx, shared, &kparams), retval, desc); - TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), - recovery_reason, " recovery reason"); - if (recovery_reason) - TEST_TRUE(commit_data_called, " didn't commit nvdata"); -} - uint32_t VbExGetSwitches(uint32_t request_mask) { if (mock_switches_are_stuck) @@ -181,67 +190,67 @@ vb2_error_t vb2ex_tpm_set_mode(enum vb2_tpm_mode mode_val) /* Tests */ -static void VbSlkTest(void) +static void select_and_load_kernel_tests(void) { /* Normal boot */ - ResetMocks(); + reset_common_data(); test_slk(0, 0, "Normal"); TEST_EQ(kernel_version, 0x10002, " version"); TEST_NEQ(sd->flags & VB2_SD_STATUS_EC_SYNC_COMPLETE, 0, " EC sync complete"); /* Check EC sync toggling */ - ResetMocks(); + reset_common_data(); ctx->flags |= VB2_CONTEXT_EC_SYNC_SUPPORTED; gbb.flags |= VB2_GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC; test_slk(0, 0, "EC sync disabled by GBB"); TEST_NEQ(sd->flags & VB2_SD_STATUS_EC_SYNC_COMPLETE, 0, " EC sync complete"); - ResetMocks(); + reset_common_data(); ctx->flags |= VB2_CONTEXT_EC_SYNC_SUPPORTED; test_slk(0, 0, "Normal with EC sync"); TEST_NEQ(sd->flags & VB2_SD_STATUS_EC_SYNC_COMPLETE, 0, " EC sync complete"); - ResetMocks(); + reset_common_data(); new_version = 0x20003; test_slk(0, 0, "Roll forward"); TEST_EQ(kernel_version, 0x20003, " version"); - ResetMocks(); + reset_common_data(); vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_TRYING); new_version = 0x20003; test_slk(0, 0, "Don't roll forward kernel when trying new FW"); TEST_EQ(kernel_version, 0x10002, " version"); - ResetMocks(); + reset_common_data(); vb2_nv_set(ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x30005); new_version = 0x40006; test_slk(0, 0, "Limit max roll forward"); TEST_EQ(kernel_version, 0x30005, " version"); - ResetMocks(); + reset_common_data(); vb2_nv_set(ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x10001); new_version = 0x40006; test_slk(0, 0, "Max roll forward can't rollback"); TEST_EQ(kernel_version, 0x10002, " version"); - ResetMocks(); + reset_common_data(); new_version = 0x20003; commit_data_retval = VB2_ERROR_SECDATA_KERNEL_WRITE; test_slk(VB2_ERROR_SECDATA_KERNEL_WRITE, VB2_RECOVERY_RW_TPM_W_ERROR, "Write kernel rollback"); /* Boot normal */ - ResetMocks(); + reset_common_data(); vbboot_retval = -1; test_slk(VB2_ERROR_MOCK, 0, "Normal boot bad"); /* Check that NV_DIAG_REQUEST triggers diagnostic UI */ if (DIAGNOSTIC_UI) { - ResetMocks(); + reset_common_data(); mock_switches[1] = VB_SWITCH_FLAG_PHYS_PRESENCE_PRESSED; vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 1); vbboot_retval = -4; @@ -254,12 +263,12 @@ static void VbSlkTest(void) } /* Boot normal - phase1 failure */ - ResetMocks(); + reset_common_data(); kernel_phase1_retval = VB2_ERROR_MOCK; test_slk(VB2_ERROR_MOCK, 0, "Normal phase1 failure"); /* Boot normal - commit data failures */ - ResetMocks(); + reset_common_data(); commit_data_retval = VB2_ERROR_SECDATA_FIRMWARE_WRITE; test_slk(commit_data_retval, VB2_RECOVERY_RW_TPM_W_ERROR, "Normal secdata_firmware write error triggers recovery"); @@ -274,75 +283,84 @@ static void VbSlkTest(void) "Normal unknown commit error aborts"); /* Boot dev */ - ResetMocks(); + reset_common_data(); sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED; vbboot_retval = -2; test_slk(VB2_ERROR_MOCK, 0, "Dev boot bad"); - ResetMocks(); + reset_common_data(); sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED; new_version = 0x20003; test_slk(0, 0, "Dev doesn't roll forward"); TEST_EQ(kernel_version, 0x10002, " version"); /* Boot dev - phase1 failure */ - ResetMocks(); + reset_common_data(); sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED; kernel_phase1_retval = VB2_ERROR_MOCK; test_slk(VB2_ERROR_MOCK, 0, "Dev phase1 failure"); /* Boot recovery */ - ResetMocks(); + reset_common_data(); sd->recovery_reason = 123; vbboot_retval = -3; test_slk(VB2_ERROR_MOCK, 0, "Recovery boot bad"); - ResetMocks(); + reset_common_data(); sd->recovery_reason = 123; new_version = 0x20003; test_slk(0, 0, "Recovery doesn't roll forward"); TEST_EQ(kernel_version, 0x10002, " version"); /* Boot recovery - phase1 failure */ - ResetMocks(); + reset_common_data(); sd->recovery_reason = 123; kernel_phase1_retval = VB2_ERROR_MOCK; test_slk(VB2_ERROR_MOCK, 0, "Recovery phase1 failure"); /* Boot recovery - commit data failures */ - ResetMocks(); + reset_common_data(); sd->recovery_reason = 123; commit_data_retval = VB2_ERROR_SECDATA_FIRMWARE_WRITE; test_slk(0, 0, "Recovery ignore secdata_firmware write error"); + + reset_common_data(); + sd->recovery_reason = 123; commit_data_retval = VB2_ERROR_SECDATA_KERNEL_WRITE; test_slk(0, 0, "Recovery ignore secdata_kernel write error"); + + reset_common_data(); + sd->recovery_reason = 123; commit_data_retval = VB2_ERROR_NV_WRITE; test_slk(0, 0, "Recovery return nvdata write error"); - commit_data_retval = VB2_ERROR_UNKNOWN; - test_slk(0, 0, "Recovery return unknown write error"); - /* Boot recovery - nvstorage cleared */ - ResetMocks(); + reset_common_data(); sd->recovery_reason = 123; - vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST, 5); - vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, 13); - test_slk(0, 0, "Recovery with nvstorage"); - TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE), - 0, " recovery subcode cleared"); + commit_data_retval = VB2_ERROR_UNKNOWN; + test_slk(0, 0, "Recovery return unknown write error"); /* Boot recovery - memory retraining */ - ResetMocks(); + reset_common_data(); sd->recovery_reason = VB2_RECOVERY_TRAIN_AND_REBOOT; test_slk(VBERROR_REBOOT_REQUIRED, 0, "Recovery train and reboot"); - // todo: rkr/w/l fail ignored if recovery - + /* Boot BROKEN recovery */ + reset_common_data(); + sd->recovery_reason = 123; + vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, 13); + test_slk(0, 0, "BROKEN recovery"); + /* Boot manual recovery */ + reset_common_data(); + sd->recovery_reason = VB2_RECOVERY_RO_MANUAL; + vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, 13); + sd->flags |= VB2_SD_FLAG_MANUAL_RECOVERY; + test_slk(0, 0, "Manual recovery"); } int main(void) { - VbSlkTest(); + select_and_load_kernel_tests(); return gTestSuccess ? 0 : 255; } |