[PATCH v2 3/3] efi: ECPT EFI selftest
Jose Marinho
jose.marinho at arm.com
Thu Dec 23 15:51:09 CET 2021
This test ensures the ECPT table is present and is consistent.
Invocation from the sandbox platform:
add to sandbox_defconfig:
+CONFIG_CMD_BOOTEFI_SELFTEST=y
make sandbox_capsule_defconfig all
./u-boot -d arch/sandbox/dts/test.dtb
bootefi selftest
Signed-off-by: Jose Marinho <jose.marinho at arm.com>
---
lib/efi_selftest/Makefile | 2 +
lib/efi_selftest/efi_selftest_ecpt.c | 105 +++++++++++++++++++++++++++
2 files changed, 107 insertions(+)
create mode 100644 lib/efi_selftest/efi_selftest_ecpt.c
diff --git a/lib/efi_selftest/Makefile b/lib/efi_selftest/Makefile
index 9ff6e1760c..6cf548653f 100644
--- a/lib/efi_selftest/Makefile
+++ b/lib/efi_selftest/Makefile
@@ -112,3 +112,5 @@ $(obj)/efi_selftest_loadimage.o: $(obj)/efi_miniapp_file_image_exit.h
$(obj)/efi_selftest_startimage_exit.o: $(obj)/efi_miniapp_file_image_exit.h
$(obj)/efi_selftest_startimage_return.o: $(obj)/efi_miniapp_file_image_return.h
+
+obj-$(CONFIG_EFI_ECPT) += efi_selftest_ecpt.o
diff --git a/lib/efi_selftest/efi_selftest_ecpt.c b/lib/efi_selftest/efi_selftest_ecpt.c
new file mode 100644
index 0000000000..555b59bc90
--- /dev/null
+++ b/lib/efi_selftest/efi_selftest_ecpt.c
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Test ECPT tables support
+ *
+ * Copyright (C) 2022 Arm Ltd.
+ */
+#include <common.h>
+#include <efi_loader.h>
+#include <efi_selftest.h>
+
+static const struct efi_system_table *local_systable;
+
+/*
+ * Setup unit test.
+ *
+ * @handle: handle of the loaded image
+ * @systable: system table
+ * @return: EFI_ST_SUCCESS for success
+ */
+static int setup(const efi_handle_t handle,
+ const struct efi_system_table *systable)
+{
+ local_systable = systable;
+
+ return EFI_ST_SUCCESS;
+}
+
+/*
+ * Traverse the ECPT table looking for a particular profile.
+ *
+ * @profile_guid: the guid of the conformance profile to find
+ * @ecpt: a pointer to the ECPT table
+ * @return: true if profile_guid is an entry in ECPT, false otherwise
+ */
+static bool find_profile(efi_guid_t *profile_guid,
+ struct efi_conformance_profiles_table *ecpt)
+{
+ for (int idx = 0; idx < local_systable->nr_tables; idx++)
+ if (!guidcmp(profile_guid, &ecpt->conformance_profiles[idx]))
+ return true;
+ return false;
+}
+
+/*
+ * Perform the test
+ *
+ * The test consists of the following steps:
+ *
+ * 1) Obtain the ECPT
+ * 2) Quantify the number of expected profiles
+ * 3) Verify that each expected profile is in the ECPT
+ * 4) Ensure that the number of ECPT entries is the expected
+ *
+ * The failure of any of the above steps results in a test failure.
+ *
+ */
+static int execute(void)
+{
+ struct efi_conformance_profiles_table *ecpt;
+ efi_status_t ret = EFI_SUCCESS;
+ struct efi_boot_services *bt;
+ int expected_num_entries;
+
+ bt = local_systable->boottime;
+
+ if (!bt) {
+ efi_st_error("Cannot find boottime services structure\n");
+ return EFI_ST_FAILURE;
+ }
+
+ for (int idx = 0; idx < local_systable->nr_tables; idx++)
+ if (!guidcmp(&efi_ecpt_guid, &local_systable->tables[idx].guid))
+ ecpt = (struct efi_conformance_profiles_table *)
+ local_systable->tables[idx].table;
+
+ if (!ecpt) {
+ efi_st_error("ECPT table not present\n");
+ return EFI_ST_FAILURE;
+ }
+
+ /*
+ * Check for presence of each expected profile.
+ */
+ if (IS_ENABLED(CONFIG_EFI_EBBR_2_0_CONFORMANCE)) {
+ expected_num_entries++;
+ if (!find_profile(&efi_ecpt_guid, ecpt)) {
+ efi_st_error("failed to find profile %pUL\n", &efi_ecpt_guid);
+ return EFI_ST_FAILURE;
+ }
+ }
+
+ if (ecpt->number_of_profiles != expected_num_entries) {
+ efi_st_error("Mismatch in number of ECPT entries\n");
+ return EFI_ST_FAILURE;
+ }
+
+ return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(ecpt) = {
+ .name = "ecpt",
+ .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+ .setup = setup,
+ .execute = execute,
+};
--
2.25.1
More information about the U-Boot
mailing list