summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/new_nvmem.c5
-rw-r--r--test/nvmem.c14
-rw-r--r--test/nvmem_test.h3
3 files changed, 21 insertions, 1 deletions
diff --git a/common/new_nvmem.c b/common/new_nvmem.c
index 60d8704a9b..9b3b399a67 100644
--- a/common/new_nvmem.c
+++ b/common/new_nvmem.c
@@ -944,6 +944,11 @@ static enum ec_error_list save_object(const struct nn_container *cont)
size_t save_size = aligned_container_size(cont);
size_t top_room;
+#if defined(NVMEM_TEST_BUILD)
+ if (failure_mode == TEST_FAILED_HASH)
+ save_size -= sizeof(uint32_t);
+#endif
+
top_room = CONFIG_FLASH_BANK_SIZE - master_at.mt.data_offset;
if (save_size >= top_room) {
diff --git a/test/nvmem.c b/test/nvmem.c
index a7e339ebf1..52cf40138a 100644
--- a/test/nvmem.c
+++ b/test/nvmem.c
@@ -828,6 +828,7 @@ static int test_nvmem_incomplete_transaction(void)
uint16_t offsets[MAX_OFFSETS];
size_t num_objects;
uint8_t buf[nvmem_user_sizes[NVMEM_TPM]];
+ uint8_t *p;
TEST_ASSERT(prepare_post_migration_nvmem() == EC_SUCCESS);
num_objects = fill_obj_offsets(offsets, ARRAY_SIZE(offsets));
@@ -859,6 +860,19 @@ static int test_nvmem_incomplete_transaction(void)
num_objects = fill_obj_offsets(offsets, ARRAY_SIZE(offsets));
TEST_ASSERT(num_objects == 7);
+ /*
+ * Now, let's modify an object and introduce corruption when saving
+ * it.
+ */
+ p = evictable_offs_to_addr(offsets[4]);
+ p[10] ^= 0x55;
+ failure_mode = TEST_FAILED_HASH;
+ new_nvmem_save();
+ failure_mode = TEST_NO_FAILURE;
+
+ /* And verify that nvmem can still successfully initialize. */
+ TEST_ASSERT(nvmem_init() == EC_SUCCESS);
+
return EC_SUCCESS;
}
diff --git a/test/nvmem_test.h b/test/nvmem_test.h
index 9e050582ac..6aba855bfe 100644
--- a/test/nvmem_test.h
+++ b/test/nvmem_test.h
@@ -19,7 +19,8 @@ enum test_failure_mode {
TEST_FAIL_WHEN_INVALIDATING,
TEST_FAIL_WHEN_COMPACTING,
TEST_FAIL_SAVING_VAR,
- TEST_FAIL_FINALIZING_VAR
+ TEST_FAIL_FINALIZING_VAR,
+ TEST_FAILED_HASH
};
extern enum test_failure_mode failure_mode;