summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarthikeyan Ramasubramanian <kramasub@google.com>2022-11-29 13:40:16 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-12-09 19:12:38 +0000
commit4a8935cb943d151d699ea25793b56ed90215d606 (patch)
tree1b8221c7254e483823dc05fdf329a49bf3009066
parentd19765a9507e33c697bfd18038f860e62bd99161 (diff)
downloadvboot-4a8935cb943d151d699ea25793b56ed90215d606.tar.gz
firmware/2lib/2nvstorage: Skip NV init if already initialized
With provision to report previous boots failures (ref CB:70382), NV storage might already be initialized before verstage_main() runs. Hence update vb2_nv_init to return early if NV storage is already initialized. BUG=None BRANCH=None TEST=Build and boot to OS in Skyrim. Change-Id: I8052a44eed5741b15bff7ba8af290acdc68d33cb Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/4064426 Reviewed-by: Yu-Ping Wu <yupingso@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
-rw-r--r--firmware/2lib/2nvstorage.c2
-rw-r--r--tests/vb2_nvstorage_tests.c9
2 files changed, 11 insertions, 0 deletions
diff --git a/firmware/2lib/2nvstorage.c b/firmware/2lib/2nvstorage.c
index 03731849..cdb568e4 100644
--- a/firmware/2lib/2nvstorage.c
+++ b/firmware/2lib/2nvstorage.c
@@ -64,6 +64,8 @@ void vb2_nv_init(struct vb2_context *ctx)
struct vb2_shared_data *sd = vb2_get_sd(ctx);
uint8_t *p = ctx->nvdata;
+ if (sd->status & VB2_SD_STATUS_NV_INIT)
+ return;
/* Check data for consistency */
if (vb2_nv_check_crc(ctx) != VB2_SUCCESS) {
diff --git a/tests/vb2_nvstorage_tests.c b/tests/vb2_nvstorage_tests.c
index e67486a0..ab872287 100644
--- a/tests/vb2_nvstorage_tests.c
+++ b/tests/vb2_nvstorage_tests.c
@@ -125,6 +125,7 @@ static void nv_storage_test(uint32_t ctxflags)
ctx->nvdata[VB2_NV_OFFS_HEADER] ^= 0x40;
TEST_EQ(vb2_nv_check_crc(ctx),
VB2_ERROR_NV_HEADER, "vb2_nv_check_crc() bad header");
+ sd->status = 0;
vb2_nv_init(ctx);
TEST_EQ(ctx->nvdata[VB2_NV_OFFS_HEADER], expect_header,
"vb2_nv_init() reset header byte again");
@@ -137,6 +138,7 @@ static void nv_storage_test(uint32_t ctxflags)
ctx->nvdata[VB2_NV_OFFS_KERNEL1] = 12;
TEST_EQ(vb2_nv_check_crc(ctx),
VB2_ERROR_NV_CRC, "vb2_nv_check_crc() bad CRC");
+ sd->status = 0;
vb2_nv_init(ctx);
TEST_EQ(ctx->nvdata[VB2_NV_OFFS_KERNEL1], 0,
"vb2_nv_init() reset kernel byte");
@@ -145,6 +147,7 @@ static void nv_storage_test(uint32_t ctxflags)
"vb2_nv_init() CRC same again");
/* Clear the kernel and firmware flags */
+ sd->status = 0;
vb2_nv_init(ctx);
TEST_EQ(vb2_nv_get(ctx, VB2_NV_FIRMWARE_SETTINGS_RESET),
1, "Firmware settings are reset");
@@ -166,6 +169,7 @@ static void nv_storage_test(uint32_t ctxflags)
"vb2_nv_init() CRC changed due to flags clear");
/* Test explicitly setting the reset flags again */
+ sd->status = 0;
vb2_nv_init(ctx);
vb2_nv_set(ctx, VB2_NV_FIRMWARE_SETTINGS_RESET, 1);
TEST_EQ(vb2_nv_get(ctx, VB2_NV_FIRMWARE_SETTINGS_RESET),
@@ -178,11 +182,13 @@ static void nv_storage_test(uint32_t ctxflags)
vb2_nv_set(ctx, VB2_NV_KERNEL_SETTINGS_RESET, 0);
/* Get/set an invalid field */
+ sd->status = 0;
vb2_nv_init(ctx);
vb2_nv_set(ctx, -1, 1);
TEST_EQ(vb2_nv_get(ctx, -1), 0, "Get invalid setting");
/* Test other fields */
+ sd->status = 0;
vb2_nv_init(ctx);
for (vnf = nvfields; vnf->desc; vnf++) {
TEST_EQ(vb2_nv_get(ctx, vnf->param), vnf->default_value,
@@ -218,6 +224,7 @@ static void nv_storage_test(uint32_t ctxflags)
}
/* None of those changes should have caused a reset to defaults */
+ sd->status = 0;
vb2_nv_init(ctx);
TEST_EQ(vb2_nv_get(ctx, VB2_NV_FIRMWARE_SETTINGS_RESET),
0, "Firmware settings are still clear");
@@ -226,6 +233,7 @@ static void nv_storage_test(uint32_t ctxflags)
/* Writing identical settings doesn't cause the CRC to regenerate */
ctx->flags = ctxflags;
+ sd->status = 0;
vb2_nv_init(ctx);
test_changed(ctx, 0, "No regen CRC on open");
for (vnf = nvfields; vnf->desc; vnf++)
@@ -240,6 +248,7 @@ static void nv_storage_test(uint32_t ctxflags)
test_changed(ctx, 0, "No regen CRC if V2 data not changed");
/* Test out-of-range fields mapping to defaults or failing */
+ sd->status = 0;
vb2_nv_init(ctx);
vb2_nv_set(ctx, VB2_NV_TRY_COUNT, 16);
TEST_EQ(vb2_nv_get(ctx, VB2_NV_TRY_COUNT),