From dd85c82962be492f85dc26b458128fff4ea93dd3 Mon Sep 17 00:00:00 2001 From: Jakub Czapiga Date: Thu, 10 Dec 2020 11:16:47 +0100 Subject: tests: Add lib/fmap-test test case Signed-off-by: Jakub Czapiga Change-Id: I885ea05d509d3b1330de7a18531f310d290c6965 Reviewed-on: https://review.coreboot.org/c/coreboot/+/48557 Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner --- tests/include/tests/lib/fmap/fmap_config.h | 88 ++++++++ tests/include/tests/lib/fmap/fmap_data.h | 148 +++++++++++++ tests/lib/Makefile.inc | 8 + tests/lib/fmap-test.c | 323 +++++++++++++++++++++++++++++ 4 files changed, 567 insertions(+) create mode 100644 tests/include/tests/lib/fmap/fmap_config.h create mode 100644 tests/include/tests/lib/fmap/fmap_data.h create mode 100644 tests/lib/fmap-test.c (limited to 'tests') diff --git a/tests/include/tests/lib/fmap/fmap_config.h b/tests/include/tests/lib/fmap/fmap_config.h new file mode 100644 index 0000000000..0a2809b35a --- /dev/null +++ b/tests/include/tests/lib/fmap/fmap_config.h @@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#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 + */ +#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/tests/lib/fmap/fmap_data.h b/tests/include/tests/lib/fmap/fmap_data.h new file mode 100644 index 0000000000..eaeabd3bf1 --- /dev/null +++ b/tests/include/tests/lib/fmap/fmap_data.h @@ -0,0 +1,148 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef TESTS_FMAP_DATA_H_ +#define TESTS_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 = sizeof(tests_fmap_bin); + + +#endif /* TESTS_INCLUDE_LIB_FMAP_FMAP_DATA_H_ */ diff --git a/tests/lib/Makefile.inc b/tests/lib/Makefile.inc index 5783f18919..dba27ec29f 100644 --- a/tests/lib/Makefile.inc +++ b/tests/lib/Makefile.inc @@ -9,6 +9,7 @@ tests-y += edid-test 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 @@ cbmem_console-ramstage-test-srcs += tests/stubs/console.c 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/tests/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 0000000000..372bb85a86 --- /dev/null +++ b/tests/lib/fmap-test.c @@ -0,0 +1,323 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include + +#include + +#include +#include + +#include +#include + +static struct mem_region_device mem_rdev_rw; +static struct mem_region_device mem_rdev_ro; +static char *flash_buffer = NULL; +static size_t flash_buffer_size = 0; + +static void prepare_flash_buffer(void) +{ + /* Prepare flash buffer with dummy data and FMAP */ + flash_buffer = malloc(FMAP_SECTION_FLASH_SIZE); + flash_buffer_size = FMAP_SECTION_FLASH_SIZE; + + /* Fill first part of buffer with dummy data */ + for (int i = 0; i < FMAP_SECTION_FMAP_START; ++i) + flash_buffer[i] = 'a' + i % ('z' - 'a'); + + /* Copy FMAP section into buffer */ + memcpy(flash_buffer + FMAP_SECTION_FMAP_START, tests_fmap_bin, FMAP_SIZE); + + /* Fill rest of buffer with dummy data */ + for (int i = FMAP_SECTION_FMAP_START + FMAP_SECTION_FMAP_SIZE; + i < FMAP_SECTION_FLASH_SIZE; ++i) + flash_buffer[i] = 'a' + i % ('z' - 'a'); +} + +static int setup_fmap(void **state) +{ + prepare_flash_buffer(); + + mem_rdev_rw = (struct mem_region_device) + MEM_REGION_DEV_RW_INIT(flash_buffer, FMAP_SECTION_FLASH_SIZE); + + mem_rdev_ro = (struct mem_region_device) + MEM_REGION_DEV_RO_INIT(flash_buffer, FMAP_SECTION_FLASH_SIZE); + + return 0; +} + +static int teardown_fmap(void **state) +{ + struct mem_region_device empty = { + .base = NULL, + .rdev = { + .root = NULL, + .ops = NULL, + .region = { + .offset = 0, + .size = 0 + } + } + }; + + mem_rdev_rw = empty; + mem_rdev_ro = empty; + + 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 &mem_rdev_rw.rdev; +} + +const struct region_device *boot_device_rw(void) +{ + return &mem_rdev_rw.rdev; +} + +static void test_fmap_locate_area_as_rdev(void **state) +{ + const char buffer[] = "abcdefghijk0123456789"; + struct region_device rdev; + + assert_int_not_equal(-1, fmap_locate_area_as_rdev("RO_VPD", &rdev)); + assert_int_equal(FMAP_SECTION_RO_VPD_START, region_device_offset(&rdev)); + assert_int_equal(FMAP_SECTION_RO_VPD_SIZE, region_device_sz(&rdev)); + + /* Check if locating area second time works */ + assert_int_not_equal(-1, fmap_locate_area_as_rdev("RO_VPD", &rdev)); + assert_int_equal(FMAP_SECTION_RO_VPD_START, region_device_offset(&rdev)); + assert_int_equal(FMAP_SECTION_RO_VPD_SIZE, region_device_sz(&rdev)); + + assert_int_not_equal(-1, fmap_locate_area_as_rdev("RECOVERY_MRC_CACHE", &rdev)); + assert_int_equal(FMAP_SECTION_RECOVERY_MRC_CACHE_START, region_device_offset(&rdev)); + assert_int_equal(FMAP_SECTION_RECOVERY_MRC_CACHE_SIZE, region_device_sz(&rdev)); + + /* Expect error when writing to read-only area */ + assert_int_equal(-1, rdev_writeat(&rdev, buffer, + region_device_offset(&rdev), sizeof(buffer))); + + /* Expect error when looking for incorrect area */ + assert_int_equal(-1, fmap_locate_area_as_rdev("NONEXISTENT_AREA", &rdev)); + assert_int_equal(-1, fmap_locate_area_as_rdev("", &rdev)); + assert_int_equal(-1, fmap_locate_area_as_rdev(NULL, &rdev)); + + /* Function fmap_locate_area_as_rdev is not tested with NULL + as region_device pointer as it is not allowed. */ +} + +static void test_fmap_locate_area_as_rdev_rw(void **state) +{ + struct region_device rdev; + size_t ro_rw_section_size = FMAP_SECTION_MISC_RW_SIZE; + char *buffer1 = malloc(ro_rw_section_size); + char *buffer2 = malloc(ro_rw_section_size); + char *dummy_data = malloc(ro_rw_section_size); + + /* Fill buffer with dummy data */ + for (int i = 0; i < ro_rw_section_size; ++i) + dummy_data[i] = '0' + i % ('9' - '0'); + + assert_int_not_equal(-1, fmap_locate_area_as_rdev_rw("RW_SECTION_A", &rdev)); + assert_int_equal(FMAP_SECTION_RW_SECTION_A_START, region_device_offset(&rdev)); + assert_int_equal(FMAP_SECTION_RW_SECTION_A_SIZE, region_device_sz(&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_equal(FMAP_SECTION_RW_SECTION_A_START, region_device_offset(&rdev)); + assert_int_equal(FMAP_SECTION_RW_SECTION_A_SIZE, region_device_sz(&rdev)); + + assert_int_not_equal(-1, fmap_locate_area_as_rdev_rw("MISC_RW", &rdev)); + assert_int_equal(FMAP_SECTION_MISC_RW_START, region_device_offset(&rdev)); + assert_int_equal(FMAP_SECTION_MISC_RW_SIZE, region_device_sz(&rdev)); + + + /* Expect error when looking for incorrect 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)); + + /* Function fmap_locate_area_as_rdev_rw is not tested with NULL + as region_device pointer as it is not allowed. */ + + /* Test if returned section region device is writable */ + assert_int_not_equal(-1, fmap_locate_area_as_rdev_rw("MISC_RW", &rdev)); + assert_int_equal(ro_rw_section_size, + rdev_readat(&rdev, buffer1, 0, ro_rw_section_size)); + assert_int_equal(ro_rw_section_size, + rdev_writeat(&rdev, dummy_data, 0, ro_rw_section_size)); + /* Check if written data is visible and correct after locating area as RO */ + assert_int_not_equal(-1, fmap_locate_area_as_rdev("MISC_RW", &rdev)); + assert_int_equal(ro_rw_section_size, + rdev_readat(&rdev, buffer2, 0, ro_rw_section_size)); + assert_memory_not_equal(buffer1, buffer2, ro_rw_section_size); + assert_memory_equal(dummy_data, buffer2, ro_rw_section_size); + + free(buffer1); + free(buffer2); + free(dummy_data); +} + +static void test_fmap_locate_area(void **state) +{ + struct region ar; + + /* Try to locate named area */ + assert_int_not_equal(-1, fmap_locate_area("COREBOOT", &ar)); + assert_int_equal(FMAP_SECTION_COREBOOT_START, region_offset(&ar)); + assert_int_equal(FMAP_SECTION_COREBOOT_SIZE, region_sz(&ar)); + + /* Check if locating area second time works */ + assert_int_not_equal(-1, fmap_locate_area("COREBOOT", &ar)); + assert_int_equal(FMAP_SECTION_COREBOOT_START, region_offset(&ar)); + assert_int_equal(FMAP_SECTION_COREBOOT_SIZE, region_sz(&ar)); + + /* Look for another area */ + assert_int_not_equal(-1, fmap_locate_area("GBB", &ar)); + assert_int_equal(FMAP_SECTION_GBB_START, region_offset(&ar)); + assert_int_equal(FMAP_SECTION_GBB_SIZE, region_sz(&ar)); + + /* Expect error when looking for incorrect area */ + assert_int_equal(-1, fmap_locate_area("NONEXISTENT_AREA", &ar)); + assert_int_equal(-1, fmap_locate_area("", &ar)); + assert_int_equal(-1, fmap_locate_area(NULL, &ar)); + + /* Expect error when passing invalid region pointer */ + 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 of previously located region */ + 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)); + + /* Expect error when passing invalid region pointer */ + assert_int_equal(-1, fmap_find_region_name(NULL, found_area_name)); + + /* Try to find area outside of flash region */ + ar.offset = FMAP_SECTION_FLASH_START + FMAP_SECTION_FLASH_SIZE + 0x100; + ar.size = 0x1000; + assert_int_equal(-1, fmap_find_region_name(&ar, found_area_name)); + + /* Try to find area with correct offset and incorrect size */ + ar.offset = FMAP_SECTION_COREBOOT_START; + ar.size = FMAP_SECTION_COREBOOT_SIZE / 4; + assert_int_equal(-1, fmap_find_region_name(&ar, found_area_name)); + + /* Try to find area with correct size and incorrect offset */ + ar.offset = FMAP_SECTION_GBB_START - 0x100; + ar.size = FMAP_SECTION_GBB_START; + assert_int_equal(-1, fmap_find_region_name(&ar, found_area_name)); + + /* Try to find area with correct offset overlapping with another area */ + ar.offset = FMAP_SECTION_MISC_RW_START; + ar.size = FMAP_SECTION_MISC_RW_START + 0x1000; + assert_int_equal(-1, fmap_find_region_name(&ar, found_area_name)); +} + +static void test_fmap_read_area(void **state) +{ + const unsigned int section_size = FMAP_SECTION_RW_SECTION_A_SIZE; + const unsigned int section_start = FMAP_SECTION_RW_SECTION_A_START; + char *buffer = malloc(section_size); + + /* Find and read area data. Compare with memory device simulating flash. */ + assert_int_equal(section_size, fmap_read_area("RW_SECTION_A", buffer, section_size)); + assert_memory_equal(flash_buffer + section_start, buffer, section_size); + + /* Expect error when reading incorrect area */ + assert_int_equal(-1, fmap_read_area("NONEXISTENT_SECTION", buffer, section_size)); + assert_int_equal(-1, fmap_read_area("", buffer, section_size)); + assert_int_equal(-1, fmap_read_area(NULL, buffer, section_size)); + + /* Function fmap_read_area is not tested with NULL + as output buffer pointer as it is not allowed. */ + + free(buffer); +} + +static void test_fmap_overwrite_area(void **state) +{ + const char *section_name = "FW_MAIN_A"; + const unsigned int section_size = FMAP_SECTION_FW_MAIN_A_SIZE; + char *buffer1 = malloc(section_size); + char *buffer2 = malloc(section_size); + char *new_data = malloc(section_size / 2); + char *zero_buffer = malloc(section_size / 2); + memset(zero_buffer, 0, section_size / 2); + memset(new_data, 0x42, section_size / 2); + + /* Save buffer for future comparisons */ + assert_int_equal(section_size, fmap_read_area(section_name, buffer1, section_size)); + + /* Overwrite part of section. */ + assert_int_equal(section_size / 2, + fmap_overwrite_area(section_name, new_data, section_size / 2)); + + /* Read and check if memory has changed as expected */ + assert_int_equal(section_size, fmap_read_area(section_name, buffer2, section_size)); + assert_memory_not_equal(buffer1, buffer2, section_size); + /* Check if requested section area was overwritten properly */ + assert_memory_equal(buffer2, new_data, section_size / 2); + /* Check if rest of section was zero-filled */ + assert_memory_equal(buffer2 + (section_size / 2), zero_buffer, section_size / 2); + + /* Expect error when overwriting incorrect section */ + assert_int_equal(-1, fmap_overwrite_area("NONEXISTENT_SECTION", + new_data, section_size / 2)); + assert_int_equal(-1, fmap_overwrite_area(NULL, new_data, section_size / 2)); + + /* Function fmap_overwrite_area is not tested with NULL + as input buffer pointer as it is not allowed. */ + + free(buffer1); + free(buffer2); + free(new_data); + free(zero_buffer); +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test_setup_teardown(test_fmap_locate_area_as_rdev, + setup_fmap, teardown_fmap), + cmocka_unit_test_setup_teardown(test_fmap_locate_area_as_rdev_rw, + setup_fmap, teardown_fmap), + cmocka_unit_test_setup_teardown(test_fmap_locate_area, + setup_fmap, teardown_fmap), + cmocka_unit_test_setup_teardown(test_fmap_find_region_name, + setup_fmap, teardown_fmap), + cmocka_unit_test_setup_teardown(test_fmap_read_area, + setup_fmap, teardown_fmap), + cmocka_unit_test_setup_teardown(test_fmap_overwrite_area, + setup_fmap, teardown_fmap), + }; + + return cmocka_run_group_tests(tests, NULL, NULL); +} -- cgit v1.2.3