diff options
author | Karthikeyan Ramasubramanian <kramasub@google.com> | 2022-11-29 13:40:16 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-03-29 08:18:20 +0000 |
commit | 4c2f0f79e2847ee792569b146549c627e8d52390 (patch) | |
tree | 1b8221c7254e483823dc05fdf329a49bf3009066 | |
parent | f6cc51e609765c4542f8389814c427a772557f33 (diff) | |
download | vboot-4c2f0f79e2847ee792569b146549c627e8d52390.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
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/4064426
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/4380934
Commit-Queue: Cheng Yueh <cyueh@chromium.org>
Auto-Submit: Phoebe Wang <phoebewang@chromium.org>
Reviewed-by: Cheng Yueh <cyueh@chromium.org>
Tested-by: Phoebe Wang <phoebewang@chromium.org>
-rw-r--r-- | firmware/2lib/2nvstorage.c | 2 | ||||
-rw-r--r-- | tests/vb2_nvstorage_tests.c | 9 |
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), |