summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/nvmem.c22
-rw-r--r--test/nvmem_test.h3
2 files changed, 24 insertions, 1 deletions
diff --git a/test/nvmem.c b/test/nvmem.c
index 7bac2f9dd7..4e7c3600be 100644
--- a/test/nvmem.c
+++ b/test/nvmem.c
@@ -834,6 +834,7 @@ static int test_nvmem_incomplete_transaction(void)
size_t num_objects;
uint8_t buf[nvmem_user_sizes[NVMEM_TPM]];
uint8_t *p;
+ size_t object_size;
TEST_ASSERT(prepare_post_migration_nvmem() == EC_SUCCESS);
num_objects = fill_obj_offsets(offsets, ARRAY_SIZE(offsets));
@@ -878,6 +879,27 @@ static int test_nvmem_incomplete_transaction(void)
/* And verify that nvmem can still successfully initialize. */
TEST_ASSERT(nvmem_init() == EC_SUCCESS);
+ /*
+ * Now let's interrupt saving an object spanning two pages.
+ *
+ * First, fill up the current page to get close to the limit such that
+ * the next save will have to span two flash pages.
+ */
+ object_size = offsets[4] - offsets[3];
+ p = (uint8_t *)evictable_offs_to_addr(offsets[3]) + object_size - 10;
+ while ((master_at.mt.data_offset + object_size +
+ sizeof(struct nn_container)) <= CONFIG_FLASH_BANK_SIZE) {
+ (*p)++;
+ new_nvmem_save();
+ }
+
+ /* This will trigger spilling over the page boundary. */
+ (*p)++;
+ failure_mode = TEST_SPANNING_PAGES;
+ new_nvmem_save();
+ failure_mode = TEST_NO_FAILURE;
+ TEST_ASSERT(nvmem_init() == EC_SUCCESS);
+
return EC_SUCCESS;
}
diff --git a/test/nvmem_test.h b/test/nvmem_test.h
index 6aba855bfe..58775d4bcb 100644
--- a/test/nvmem_test.h
+++ b/test/nvmem_test.h
@@ -20,7 +20,8 @@ enum test_failure_mode {
TEST_FAIL_WHEN_COMPACTING,
TEST_FAIL_SAVING_VAR,
TEST_FAIL_FINALIZING_VAR,
- TEST_FAILED_HASH
+ TEST_FAILED_HASH,
+ TEST_SPANNING_PAGES
};
extern enum test_failure_mode failure_mode;