Name of user not set #1003143 has uploaded this change for review.

View Change

tests: Add lib/fmap-test test case

Signed-off-by: Jakub Czapiga <jacz@semihalf.com>
Change-Id: I885ea05d509d3b1330de7a18531f310d290c6965
---
A tests/include/lib/fmap/fmap_config.h
A tests/include/lib/fmap/fmap_data.h
M tests/lib/Makefile.inc
A tests/lib/fmap-test.c
4 files changed, 563 insertions(+), 0 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/57/48557/1
diff --git a/tests/include/lib/fmap/fmap_config.h b/tests/include/lib/fmap/fmap_config.h
new file mode 100644
index 0000000..c735330
--- /dev/null
+++ b/tests/include/lib/fmap/fmap_config.h
@@ -0,0 +1,87 @@
+#ifndef FMAPTOOL_GENERATED_HEADER_H_
+#define FMAPTOOL_GENERATED_HEADER_H_
+
+/*
+ * This file was generated using fmaptool from util/cbfstools using
+ * src/mainboard/google/octopus/chromeos.fmd
+ * FMAP_OFFSET was changed to zero for testing purposes.
+ */
+#define FMAP_OFFSET 0x204000
+#define FMAP_SIZE 0x620
+
+#define FMAP_SECTION_FLASH_START 0
+#define FMAP_SECTION_FLASH_SIZE 0x1000000
+#define FMAP_SECTION_WP_RO_START 0
+#define FMAP_SECTION_WP_RO_SIZE 0x400000
+#define FMAP_SECTION_SI_DESC_START 0
+#define FMAP_SECTION_SI_DESC_SIZE 0x1000
+#define FMAP_SECTION_IFWI_START 0x1000
+#define FMAP_SECTION_IFWI_SIZE 0x1ff000
+#define FMAP_SECTION_RO_VPD_START 0x200000
+#define FMAP_SECTION_RO_VPD_SIZE 0x4000
+#define FMAP_SECTION_RO_SECTION_START 0x204000
+#define FMAP_SECTION_RO_SECTION_SIZE 0x1fc000
+#define FMAP_SECTION_FMAP_START 0x204000
+#define FMAP_SECTION_FMAP_SIZE 0x800
+#define FMAP_SECTION_RO_FRID_START 0x204800
+#define FMAP_SECTION_RO_FRID_SIZE 0x40
+#define FMAP_SECTION_RO_FRID_PAD_START 0x204840
+#define FMAP_SECTION_RO_FRID_PAD_SIZE 0x7c0
+#define FMAP_SECTION_COREBOOT_START 0x205000
+#define FMAP_SECTION_COREBOOT_SIZE 0x1f8000
+#define FMAP_SECTION_GBB_START 0x3fd000
+#define FMAP_SECTION_GBB_SIZE 0x3000
+#define FMAP_SECTION_MISC_RW_START 0x400000
+#define FMAP_SECTION_MISC_RW_SIZE 0x30000
+#define FMAP_SECTION_RW_PRESERVE_START 0x400000
+#define FMAP_SECTION_RW_PRESERVE_SIZE 0x21000
+#define FMAP_SECTION_UNIFIED_MRC_CACHE_START 0x400000
+#define FMAP_SECTION_UNIFIED_MRC_CACHE_SIZE 0x21000
+#define FMAP_SECTION_RECOVERY_MRC_CACHE_START 0x400000
+#define FMAP_SECTION_RECOVERY_MRC_CACHE_SIZE 0x10000
+#define FMAP_SECTION_RW_MRC_CACHE_START 0x410000
+#define FMAP_SECTION_RW_MRC_CACHE_SIZE 0x10000
+#define FMAP_SECTION_RW_VAR_MRC_CACHE_START 0x420000
+#define FMAP_SECTION_RW_VAR_MRC_CACHE_SIZE 0x1000
+#define FMAP_SECTION_RW_ELOG_START 0x421000
+#define FMAP_SECTION_RW_ELOG_SIZE 0x3000
+#define FMAP_SECTION_RW_SHARED_START 0x424000
+#define FMAP_SECTION_RW_SHARED_SIZE 0x4000
+#define FMAP_SECTION_SHARED_DATA_START 0x424000
+#define FMAP_SECTION_SHARED_DATA_SIZE 0x2000
+#define FMAP_SECTION_VBLOCK_DEV_START 0x426000
+#define FMAP_SECTION_VBLOCK_DEV_SIZE 0x2000
+#define FMAP_SECTION_RW_VPD_START 0x428000
+#define FMAP_SECTION_RW_VPD_SIZE 0x2000
+#define FMAP_SECTION_RW_NVRAM_START 0x42a000
+#define FMAP_SECTION_RW_NVRAM_SIZE 0x5000
+#define FMAP_SECTION_FPF_STATUS_START 0x42f000
+#define FMAP_SECTION_FPF_STATUS_SIZE 0x1000
+#define FMAP_SECTION_RW_SECTION_A_START 0x430000
+#define FMAP_SECTION_RW_SECTION_A_SIZE 0x480000
+#define FMAP_SECTION_VBLOCK_A_START 0x430000
+#define FMAP_SECTION_VBLOCK_A_SIZE 0x10000
+#define FMAP_SECTION_FW_MAIN_A_START 0x440000
+#define FMAP_SECTION_FW_MAIN_A_SIZE 0x46ffc0
+#define FMAP_SECTION_RW_FWID_A_START 0x8affc0
+#define FMAP_SECTION_RW_FWID_A_SIZE 0x40
+#define FMAP_SECTION_RW_SECTION_B_START 0x8b0000
+#define FMAP_SECTION_RW_SECTION_B_SIZE 0x480000
+#define FMAP_SECTION_VBLOCK_B_START 0x8b0000
+#define FMAP_SECTION_VBLOCK_B_SIZE 0x10000
+#define FMAP_SECTION_FW_MAIN_B_START 0x8c0000
+#define FMAP_SECTION_FW_MAIN_B_SIZE 0x46ffc0
+#define FMAP_SECTION_RW_FWID_B_START 0xd2ffc0
+#define FMAP_SECTION_RW_FWID_B_SIZE 0x40
+#define FMAP_SECTION_SMMSTORE_START 0xd30000
+#define FMAP_SECTION_SMMSTORE_SIZE 0x40000
+#define FMAP_SECTION_RW_LEGACY_START 0xd70000
+#define FMAP_SECTION_RW_LEGACY_SIZE 0x1c0000
+#define FMAP_SECTION_BIOS_UNUSABLE_START 0xf30000
+#define FMAP_SECTION_BIOS_UNUSABLE_SIZE 0x4f000
+#define FMAP_SECTION_DEVICE_EXTENSION_START 0xf7f000
+#define FMAP_SECTION_DEVICE_EXTENSION_SIZE 0x80000
+//#define FMAP_SECTION_UNUSED_HOLE_START 0xfff000
+#define FMAP_SECTION_UNUSED_HOLE_SIZE 0x1000
+
+#endif
diff --git a/tests/include/lib/fmap/fmap_data.h b/tests/include/lib/fmap/fmap_data.h
new file mode 100644
index 0000000..343feef
--- /dev/null
+++ b/tests/include/lib/fmap/fmap_data.h
@@ -0,0 +1,148 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef TESTS_INCLUDE_LIB_FMAP_FMAP_DATA_H_
+#define TESTS_INCLUDE_LIB_FMAP_FMAP_DATA_H_
+
+/*
+ * This file was converted using `xxd -i` from binary output of
+ * fmaptool from util/cbfstools. Data is based on output generated by
+ * mentioned tool using src/mainboard/google/octopus/chromeos.fmd file.
+ */
+
+unsigned char tests_fmap_bin[] = {
+0x5f, 0x5f, 0x46, 0x4d, 0x41, 0x50, 0x5f, 0x5f, 0x01, 0x01, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x46, 0x4c,
+0x41, 0x53, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x40, 0x00, 0x57, 0x50, 0x5f, 0x52, 0x4f, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x53, 0x49,
+0x5f, 0x44, 0x45, 0x53, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0xf0, 0x1f, 0x00, 0x49, 0x46, 0x57, 0x49, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x52, 0x4f,
+0x5f, 0x56, 0x50, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x20, 0x00,
+0x00, 0xc0, 0x1f, 0x00, 0x52, 0x4f, 0x5f, 0x53, 0x45, 0x43, 0x54, 0x49,
+0x4f, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x46, 0x4d,
+0x41, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x20, 0x00,
+0x40, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x5f, 0x46, 0x52, 0x49, 0x44, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x40, 0x48, 0x20, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x52, 0x4f,
+0x5f, 0x46, 0x52, 0x49, 0x44, 0x5f, 0x50, 0x41, 0x44, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x20, 0x00,
+0x00, 0x80, 0x1f, 0x00, 0x43, 0x4f, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0xd0, 0x3f, 0x00, 0x00, 0x30, 0x00, 0x00, 0x47, 0x42,
+0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+0x00, 0x00, 0x03, 0x00, 0x4d, 0x49, 0x53, 0x43, 0x5f, 0x52, 0x57, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x10, 0x02, 0x00, 0x52, 0x57,
+0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x52, 0x56, 0x45, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00,
+0x00, 0x10, 0x02, 0x00, 0x55, 0x4e, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f,
+0x4d, 0x52, 0x43, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0x45,
+0x43, 0x4f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x4d, 0x52, 0x43, 0x5f, 0x43,
+0x41, 0x43, 0x48, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00,
+0x00, 0x00, 0x01, 0x00, 0x52, 0x57, 0x5f, 0x4d, 0x52, 0x43, 0x5f, 0x43,
+0x41, 0x43, 0x48, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x10, 0x00, 0x00, 0x52, 0x57,
+0x5f, 0x56, 0x41, 0x52, 0x5f, 0x4d, 0x52, 0x43, 0x5f, 0x43, 0x41, 0x43,
+0x48, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x42, 0x00,
+0x00, 0x30, 0x00, 0x00, 0x52, 0x57, 0x5f, 0x45, 0x4c, 0x4f, 0x47, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x08, 0x00, 0x00, 0x40, 0x42, 0x00, 0x00, 0x40, 0x00, 0x00, 0x52, 0x57,
+0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x00,
+0x00, 0x20, 0x00, 0x00, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x44,
+0x41, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x60, 0x42, 0x00, 0x00, 0x20, 0x00, 0x00, 0x56, 0x42,
+0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x56, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, 0x00,
+0x00, 0x20, 0x00, 0x00, 0x52, 0x57, 0x5f, 0x56, 0x50, 0x44, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x08, 0x00, 0x00, 0xa0, 0x42, 0x00, 0x00, 0x50, 0x00, 0x00, 0x52, 0x57,
+0x5f, 0x4e, 0x56, 0x52, 0x41, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xf0, 0x42, 0x00,
+0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x46, 0x5f, 0x53, 0x54, 0x41, 0x54,
+0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x48, 0x00, 0x52, 0x57,
+0x5f, 0x53, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00,
+0x00, 0x00, 0x01, 0x00, 0x56, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xc0, 0xff, 0x46, 0x00, 0x46, 0x57,
+0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x8a, 0x00,
+0x40, 0x00, 0x00, 0x00, 0x52, 0x57, 0x5f, 0x46, 0x57, 0x49, 0x44, 0x5f,
+0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x48, 0x00, 0x52, 0x57,
+0x5f, 0x53, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00,
+0x00, 0x00, 0x01, 0x00, 0x56, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x8c, 0x00, 0xc0, 0xff, 0x46, 0x00, 0x46, 0x57,
+0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xd2, 0x00,
+0x40, 0x00, 0x00, 0x00, 0x52, 0x57, 0x5f, 0x46, 0x57, 0x49, 0x44, 0x5f,
+0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x04, 0x00, 0x53, 0x4d,
+0x4d, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xd7, 0x00,
+0x00, 0x00, 0x1c, 0x00, 0x52, 0x57, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43,
+0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xf0, 0x04, 0x00, 0x42, 0x49,
+0x4f, 0x53, 0x5f, 0x55, 0x4e, 0x55, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf7, 0x00,
+0x00, 0x00, 0x08, 0x00, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45,
+0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x10, 0x00, 0x00, 0x55, 0x4e,
+0x55, 0x53, 0x45, 0x44, 0x5f, 0x48, 0x4f, 0x4c, 0x45, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+unsigned int tests_fmap_bin_len = 1568;
+
+
+#endif /* TESTS_INCLUDE_LIB_FMAP_FMAP_DATA_H_ */
diff --git a/tests/lib/Makefile.inc b/tests/lib/Makefile.inc
index 5783f18..6948588 100644
--- a/tests/lib/Makefile.inc
+++ b/tests/lib/Makefile.inc
@@ -9,6 +9,7 @@
tests-y += cbmem_console-romstage-test
tests-y += cbmem_console-ramstage-test
tests-y += list-test
+tests-y += fmap-test

string-test-srcs += tests/lib/string-test.c
string-test-srcs += src/lib/string.c
@@ -44,3 +45,10 @@
list-test-srcs += tests/lib/list-test.c
list-test-srcs += src/lib/list.c

+fmap-test-srcs += tests/lib/fmap-test.c
+fmap-test-srcs += src/lib/fmap.c
+fmap-test-srcs += tests/stubs/console.c
+fmap-test-srcs += src/lib/boot_device.c
+fmap-test-srcs += src/commonlib/region.c
+fmap-test-cflags += -I tests/include/lib/fmap
+fmap-test-cflags += -I 3rdparty/vboot/firmware/include
diff --git a/tests/lib/fmap-test.c b/tests/lib/fmap-test.c
new file mode 100644
index 0000000..2b7605d
--- /dev/null
+++ b/tests/lib/fmap-test.c
@@ -0,0 +1,320 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <fmap.h>
+#include <commonlib/region.h>
+
+#include <tests/test.h>
+
+#include <lib/fmap/fmap_data.h>
+#include <lib/fmap/fmap_config.h>
+
+static struct region_device *rdev_root = NULL;
+static char *flash_buffer = NULL;
+static size_t flash_buffer_size = 0;
+
+static void *local_mmap(const struct region_device *rdev, size_t offset, size_t size)
+{
+ if (offset >= FMAP_SECTION_FLASH_START
+ && offset < FMAP_SECTION_FLASH_START + FMAP_SECTION_FLASH_SIZE)
+ return flash_buffer + offset;
+
+ return NULL;
+}
+
+static int local_unmap(const struct region_device *rdev, void *mapping)
+{
+ return 0;
+}
+
+static ssize_t local_readat(const struct region_device *rdev, void *buffer,
+ size_t offset, size_t size)
+{
+ if (size + offset >= flash_buffer_size)
+ return -1;
+
+ size = MIN(size, flash_buffer_size - offset);
+
+ memcpy(buffer, flash_buffer + offset, size);
+
+ return size;
+}
+
+static ssize_t local_writeat(const struct region_device *rdev, const void *buffer,
+ size_t offset, size_t size)
+{
+ if (size + offset >= flash_buffer_size)
+ return -1;
+
+ size = MIN(size, flash_buffer_size - offset);
+
+ memcpy(flash_buffer + offset, buffer, size);
+
+ return size;
+}
+
+static ssize_t local_eraseat(const struct region_device *rdev,
+ size_t offset, size_t size)
+{
+ if (size + offset >= flash_buffer_size)
+ return -1;
+
+ size = MIN(size, flash_buffer_size - offset);
+
+ memset(flash_buffer + offset, 0, size);
+
+ return size;
+}
+
+static int setup_fmap_region_device(void **state)
+{
+ // Setup callbacks
+ struct region_device_ops *rdev_ops = malloc(sizeof(*rdev_ops));
+ rdev_ops->mmap = local_mmap;
+ rdev_ops->munmap = local_unmap;
+ rdev_ops->readat = local_readat;
+ rdev_ops->writeat = local_writeat;
+ rdev_ops->eraseat = local_eraseat;
+
+ // Prepare root region device
+ struct region_device rdev_new_root = REGION_DEV_INIT(rdev_ops,
+ FMAP_SECTION_FLASH_START, FMAP_SECTION_FLASH_SIZE);
+ rdev_root = malloc(sizeof(rdev_new_root));
+ memcpy(rdev_root, &rdev_new_root, sizeof(rdev_new_root));
+
+ // Prepare fmap region device
+ struct region_device rdev_fmap = REGION_DEV_INIT(rdev_ops,
+ FMAP_SECTION_FMAP_START, FMAP_SECTION_FMAP_SIZE);
+ rdev_fmap.root = rdev_root;
+
+ // Pass fmap region device to tests as state
+ *state = malloc(sizeof(rdev_fmap));
+ memcpy(*state, &rdev_fmap, sizeof(rdev_fmap));
+
+ // Prepare flash buffer with dummy data and FMAP
+ flash_buffer = malloc(FMAP_SECTION_FLASH_SIZE);
+ flash_buffer_size = FMAP_SECTION_FLASH_SIZE;
+ memset(flash_buffer, 0, FMAP_SECTION_FLASH_SIZE);
+ for (int i = 0; i < FMAP_SECTION_FMAP_START; ++i)
+ flash_buffer[i] = 'a' + i % ('z' - 'a');
+ memcpy(flash_buffer + FMAP_SECTION_FMAP_START, tests_fmap_bin, FMAP_SIZE);
+ for (int i = FMAP_SECTION_FMAP_START + FMAP_SECTION_FMAP_SIZE;
+ i < FMAP_SECTION_FLASH_SIZE; ++i)
+ flash_buffer[i] = 'a' + i % ('z' - 'a');
+
+ return 0;
+}
+
+static int teardown_fmap_region_device(void **state)
+{
+ struct region_device *rdev_fmap = *state;
+
+ free((void *)rdev_fmap->ops);
+ free(rdev_fmap);
+
+ free(rdev_root);
+ rdev_root = NULL;
+
+ free(flash_buffer);
+ flash_buffer = NULL;
+ flash_buffer_size = 0;
+
+ return 0;
+}
+
+void boot_device_init(void)
+{
+ // Setup in unit test setup function
+}
+
+const struct region_device *boot_device_ro(void)
+{
+ return rdev_root;
+}
+
+const struct region_device *boot_device_rw(void)
+{
+ return rdev_root;
+}
+
+static void test_fmap_locate_area_as_rdev(void **state)
+{
+ struct region_device *rdev = *state;
+
+ assert_int_not_equal(-1, fmap_locate_area_as_rdev("RO_VPD", rdev));
+
+ // Check if locating area second time works
+ assert_int_not_equal(-1, fmap_locate_area_as_rdev("RO_VPD", rdev));
+
+ assert_int_not_equal(-1, fmap_locate_area_as_rdev("RECOVERY_MRC_CACHE", rdev));
+
+ // Expect error when looking for non-existent area
+ assert_int_equal(-1, fmap_locate_area_as_rdev("NONEXISTENT_AREA", rdev));
+
+ assert_int_equal(-1, fmap_locate_area_as_rdev("", rdev));
+
+ // Expect error when passing invalid references
+ assert_int_equal(-1, fmap_locate_area_as_rdev(NULL, rdev));
+ assert_int_equal(-1, fmap_locate_area_as_rdev("RW_SECTION_A", NULL));
+}
+
+
+static void test_fmap_locate_area_as_rdev_rw(void **state)
+{
+ struct region_device *rdev = *state;
+
+ assert_int_not_equal(-1, fmap_locate_area_as_rdev_rw("RW_SECTION_A", rdev));
+
+ // Check if locating area second time works
+ assert_int_not_equal(-1, fmap_locate_area_as_rdev_rw("RW_SECTION_A", rdev));
+
+ assert_int_not_equal(-1, fmap_locate_area_as_rdev_rw("MISC_RW", rdev));
+
+ // Expect error when looking for non-existent area
+ assert_int_equal(-1, fmap_locate_area_as_rdev_rw("NONEXISTENT_AREA", rdev));
+ assert_int_equal(-1, fmap_locate_area_as_rdev_rw("", rdev));
+
+ // Expect error when passing invalid references
+ assert_int_equal(-1, fmap_locate_area_as_rdev_rw(NULL, rdev));
+ assert_int_equal(-1, fmap_locate_area_as_rdev_rw("RW_SECTION_A", NULL));
+}
+
+static void test_fmap_locate_area(void **state)
+{
+ (void)state;
+ struct region ar;
+
+ assert_int_not_equal(-1, fmap_locate_area("COREBOOT", &ar));
+
+ // Check if locating area second time works
+ assert_int_not_equal(-1, fmap_locate_area("COREBOOT", &ar));
+
+ assert_int_not_equal(-1, fmap_locate_area("GBB", &ar));
+
+ // Expect error when looking for non-existent area
+ assert_int_equal(-1, fmap_locate_area("NONEXISTENT_AREA", &ar));
+ assert_int_equal(-1, fmap_locate_area("", &ar));
+
+ // Expect error when passing invalid references
+ assert_int_equal(-1, fmap_locate_area(NULL, &ar));
+ assert_int_equal(-1, fmap_locate_area("SHARED_DATA", NULL));
+}
+
+static void test_fmap_find_region_name(void **state)
+{
+ (void)state;
+ struct region ar;
+ char found_area_name[FMAP_STRLEN] = "";
+ const char *area_name = "RW_PRESERVE";
+
+ // Find area by name
+ assert_int_not_equal(-1, fmap_locate_area(area_name, &ar));
+
+ // Find name by previously find area
+ assert_int_not_equal(-1, fmap_find_region_name(&ar, found_area_name));
+ assert_string_equal(area_name, found_area_name);
+
+ // Expect error when passing invalid buffer
+ assert_int_equal(-1, fmap_find_region_name(&ar, NULL));
+
+ // Try to find non-existent area
+ ar.offset = 2142037;
+ ar.size = 636;
+ assert_int_equal(-1, fmap_find_region_name(&ar, found_area_name));
+
+ // Expect error when passing invalid region pointer
+ assert_int_equal(-1, fmap_find_region_name(NULL, found_area_name));
+}
+
+static void test_fmap_read_area(void **state)
+{
+ (void)state;
+ struct region ar;
+ char *buffer = malloc(FMAP_SECTION_RW_SECTION_A_SIZE);
+
+ fmap_locate_area("RW_SECTION_A", &ar);
+ assert_int_equal(FMAP_SECTION_RW_SECTION_A_SIZE,
+ fmap_read_area("RW_SECTION_A", buffer, FMAP_SECTION_RW_SECTION_A_SIZE));
+ assert_memory_equal(flash_buffer + FMAP_SECTION_RW_SECTION_A_START, buffer,
+ FMAP_SECTION_RW_SECTION_A_SIZE);
+
+ assert_int_equal(-1,
+ fmap_read_area("NONEXISTENT_SECTION",
+ buffer,
+ FMAP_SECTION_RW_SECTION_A_SIZE));
+
+ assert_int_equal(-1, fmap_read_area(NULL, buffer, FMAP_SECTION_RW_SECTION_A_SIZE));
+ assert_int_equal(-1,
+ fmap_read_area("RW_SECTION_A", NULL, FMAP_SECTION_RW_SECTION_A_SIZE));
+
+ free(buffer);
+}
+
+static void test_fmap_overwrite_area(void **state)
+{
+ (void)state;
+ struct region ar;
+ char *buffer1 = malloc(FMAP_SECTION_FW_MAIN_A_SIZE);
+ char *buffer2 = malloc(FMAP_SECTION_FW_MAIN_A_SIZE);
+ char *new_data = malloc(FMAP_SECTION_FW_MAIN_A_SIZE);
+
+ fmap_locate_area("FW_MAIN_A", &ar);
+ assert_int_equal(FMAP_SECTION_FW_MAIN_A_SIZE,
+ fmap_read_area("FW_MAIN_A", buffer1, FMAP_SECTION_FW_MAIN_A_SIZE));
+
+ memset(new_data, 0x42, FMAP_SECTION_FW_MAIN_A_SIZE);
+ assert_int_equal(FMAP_SECTION_FW_MAIN_A_SIZE,
+ fmap_overwrite_area("FW_MAIN_A",
+ new_data,
+ FMAP_SECTION_FW_MAIN_A_SIZE));
+
+ assert_int_equal(FMAP_SECTION_FW_MAIN_A_SIZE,
+ fmap_read_area("FW_MAIN_A", buffer2, FMAP_SECTION_FW_MAIN_A_SIZE));
+
+ assert_memory_not_equal(buffer1, buffer2, FMAP_SECTION_FW_MAIN_A_SIZE);
+ assert_memory_equal(buffer2, new_data, FMAP_SECTION_FW_MAIN_A_SIZE);
+
+ assert_int_equal(-1,
+ fmap_overwrite_area("NONEXISTENT_SECTION",
+ new_data,
+ FMAP_SECTION_FW_MAIN_A_SIZE));
+
+ assert_int_equal(-1,
+ fmap_overwrite_area(NULL, new_data, FMAP_SECTION_FW_MAIN_A_SIZE));
+
+ assert_int_equal(-1,
+ fmap_overwrite_area("FW_MAIN_A", NULL, FMAP_SECTION_FW_MAIN_A_SIZE));
+
+
+ free(buffer1);
+ free(buffer2);
+ free(new_data);
+}
+
+int main(void)
+{
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test_setup_teardown(test_fmap_locate_area_as_rdev,
+ setup_fmap_region_device,
+ teardown_fmap_region_device),
+ cmocka_unit_test_setup_teardown(test_fmap_locate_area_as_rdev_rw,
+ setup_fmap_region_device,
+ teardown_fmap_region_device),
+ cmocka_unit_test_setup_teardown(test_fmap_locate_area,
+ setup_fmap_region_device,
+ teardown_fmap_region_device),
+ cmocka_unit_test_setup_teardown(test_fmap_find_region_name,
+ setup_fmap_region_device,
+ teardown_fmap_region_device),
+ cmocka_unit_test_setup_teardown(test_fmap_read_area,
+ setup_fmap_region_device,
+ teardown_fmap_region_device),
+ cmocka_unit_test_setup_teardown(test_fmap_overwrite_area,
+ setup_fmap_region_device,
+ teardown_fmap_region_device),
+ };
+
+ return cmocka_run_group_tests(tests, NULL, NULL);
+}

To view, visit change 48557. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I885ea05d509d3b1330de7a18531f310d290c6965
Gerrit-Change-Number: 48557
Gerrit-PatchSet: 1
Gerrit-Owner: Name of user not set #1003143
Gerrit-MessageType: newchange