summaryrefslogtreecommitdiff
path: root/tests/vb2_kernel_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/vb2_kernel_tests.c')
-rw-r--r--tests/vb2_kernel_tests.c98
1 files changed, 76 insertions, 22 deletions
diff --git a/tests/vb2_kernel_tests.c b/tests/vb2_kernel_tests.c
index ca945e95..6d32eb2d 100644
--- a/tests/vb2_kernel_tests.c
+++ b/tests/vb2_kernel_tests.c
@@ -14,8 +14,6 @@
#include "2sysincludes.h"
#include "common/boot_mode.h"
#include "common/tests.h"
-#include "vboot_struct.h"
-#include "vboot_api.h"
/* Common context for tests */
static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
@@ -24,7 +22,7 @@ static struct vb2_context *ctx;
static struct vb2_shared_data *sd;
static struct vb2_fw_preamble *fwpre;
static const char fw_kernel_key_data[36] = "Test kernel key data";
-static VbSelectAndLoadKernelParams kparams;
+static struct vb2_kernel_params kparams;
/* Mocked function data */
@@ -40,6 +38,9 @@ static int mock_commit_data_called;
static int mock_ec_sync_called;
static int mock_ec_sync_retval;
static int mock_battery_cutoff_called;
+static int mock_kernel_flag;
+static int mock_kernel_flag_set;
+static int mock_kernel_version;
/* Type of test to reset for */
enum reset_type {
@@ -62,16 +63,15 @@ static void reset_common_data(enum reset_type t)
sd = vb2_get_sd(ctx);
vb2_nv_init(ctx);
- vb2api_secdata_kernel_create(ctx);
- vb2_secdata_kernel_init(ctx);
- vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_VERSIONS, 0x20002);
-
mock_read_res_fail_on_call = 0;
mock_secdata_fwmp_check_retval = VB2_SUCCESS;
mock_commit_data_called = 0;
mock_ec_sync_called = 0;
mock_ec_sync_retval = VB2_SUCCESS;
mock_battery_cutoff_called = 0;
+ mock_kernel_flag = 0;
+ mock_kernel_flag_set = 0;
+ mock_kernel_version = 0x10002;
/* Recovery key in mock GBB */
memset(&mock_gbb, 0, sizeof(mock_gbb));
@@ -86,6 +86,8 @@ static void reset_common_data(enum reset_type t)
mock_gbb.h.recovery_key_size =
mock_gbb.recovery_key.key_offset +
mock_gbb.recovery_key.key_size;
+ mock_gbb.h.major_version = VB2_GBB_MAJOR_VER;
+ mock_gbb.h.minor_version = VB2_GBB_MINOR_VER;
if (t == FOR_PHASE1) {
uint8_t *kdata;
@@ -103,6 +105,11 @@ static void reset_common_data(enum reset_type t)
sd->preamble_size = sizeof(*fwpre) + k->key_size;
vb2_set_workbuf_used(ctx,
sd->preamble_offset + sd->preamble_size);
+ } else if (t == FOR_FINALIZE) {
+ SET_BOOT_MODE(ctx, VB2_BOOT_MODE_NORMAL);
+ vb2_nv_set(ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0xffffffff);
+ sd->kernel_version_secdata = mock_kernel_version;
+ sd->kernel_version = mock_kernel_version;
}
};
@@ -178,6 +185,37 @@ vb2_error_t vb2ex_commit_data(struct vb2_context *c)
return VB2_SUCCESS;
}
+void vb2_secdata_kernel_set(struct vb2_context *c,
+ enum vb2_secdata_kernel_param param,
+ uint32_t value)
+{
+ switch (param) {
+ case VB2_SECDATA_KERNEL_FLAGS:
+ mock_kernel_flag = value;
+ mock_kernel_flag_set = 1;
+ break;
+ case VB2_SECDATA_KERNEL_VERSIONS:
+ mock_kernel_version = value;
+ break;
+ default:
+ vb2ex_abort();
+ }
+}
+
+uint32_t vb2_secdata_kernel_get(struct vb2_context *c,
+ enum vb2_secdata_kernel_param param)
+{
+ switch (param) {
+ case VB2_SECDATA_KERNEL_FLAGS:
+ return mock_kernel_flag;
+ case VB2_SECDATA_KERNEL_VERSIONS:
+ return mock_kernel_version;
+ default:
+ vb2ex_abort();
+ }
+ return 0;
+}
+
/* Tests */
static void phase1_tests(void)
@@ -204,7 +242,7 @@ static void phase1_tests(void)
TEST_EQ(k->key_size, sizeof(fw_kernel_key_data), " key_size");
TEST_EQ(memcmp((uint8_t *)k + k->key_offset, fw_kernel_key_data,
k->key_size), 0, " key data");
- TEST_EQ(sd->kernel_version_secdata, 0x20002,
+ TEST_EQ(sd->kernel_version_secdata, 0x10002,
" secdata_kernel version");
/* Test successful call in recovery mode */
@@ -230,7 +268,7 @@ static void phase1_tests(void)
TEST_EQ(memcmp((uint8_t *)k + k->key_offset,
mock_gbb.recovery_key_data, k->key_size), 0,
" key data");
- TEST_EQ(sd->kernel_version_secdata, 0x20002,
+ TEST_EQ(sd->kernel_version_secdata, 0x10002,
" secdata_kernel version");
/* Test flags for experimental features in non-recovery path */
@@ -249,22 +287,10 @@ static void phase1_tests(void)
/*
* Test flags are unchanged for experimental features in recovery path
*/
-
- /* Set 8 bits to 0 */
reset_common_data(FOR_PHASE1);
SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 123);
- vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_FLAGS, 0);
TEST_SUCC(vb2api_kernel_phase1(ctx), "phase1 rec good");
- TEST_EQ(vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_FLAGS), 0,
- "VB2_SECDATA_KERNEL_FLAGS remains unchanged in recovery path");
-
- /* Set 8 bits to 1 */
- reset_common_data(FOR_PHASE1);
- SET_BOOT_MODE(ctx, VB2_BOOT_MODE_BROKEN_SCREEN, 123);
- vb2_secdata_kernel_set(ctx, VB2_SECDATA_KERNEL_FLAGS, UINT8_MAX);
- TEST_SUCC(vb2api_kernel_phase1(ctx), "phase1 rec good");
- TEST_EQ(vb2_secdata_kernel_get(ctx, VB2_SECDATA_KERNEL_FLAGS),
- UINT8_MAX,
+ TEST_EQ(mock_kernel_flag_set, 0,
"VB2_SECDATA_KERNEL_FLAGS remains unchanged in recovery path");
/* Bad secdata_fwmp causes failure in normal mode only */
@@ -404,6 +430,34 @@ static void phase2_tests(void)
static void finalize_tests(void)
{
+ /* Kernel version roll forward */
+ reset_common_data(FOR_FINALIZE);
+ sd->kernel_version = 0x20003;
+ TEST_EQ(vb2api_kernel_finalize(ctx), VB2_SUCCESS,
+ "Kernel version roll forward");
+ TEST_EQ(mock_kernel_version, 0x20003, " kernel version");
+
+ reset_common_data(FOR_FINALIZE);
+ vb2_nv_set(ctx, VB2_NV_FW_RESULT, VB2_FW_RESULT_TRYING);
+ sd->kernel_version = 0x20003;
+ TEST_EQ(vb2api_kernel_finalize(ctx), VB2_SUCCESS,
+ "Don't roll forward kernel when trying new FW");
+ TEST_EQ(mock_kernel_version, 0x10002, " kernel version");
+
+ reset_common_data(FOR_FINALIZE);
+ vb2_nv_set(ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x30005);
+ sd->kernel_version = 0x40006;
+ TEST_EQ(vb2api_kernel_finalize(ctx), VB2_SUCCESS,
+ "Limit max roll forward");
+ TEST_EQ(mock_kernel_version, 0x30005, " kernel version");
+
+ reset_common_data(FOR_FINALIZE);
+ vb2_nv_set(ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x10001);
+ sd->kernel_version = 0x40006;
+ TEST_EQ(vb2api_kernel_finalize(ctx), VB2_SUCCESS,
+ "Max roll forward can't rollback");
+ TEST_EQ(mock_kernel_version, 0x10002, " kernel version");
+
/* NO_BOOT with EC sync support */
reset_common_data(FOR_FINALIZE);
ctx->flags |= VB2_CONTEXT_NO_BOOT;