efi_loader: validate load option
[oweals/u-boot.git] / lib / efi_selftest / efi_selftest_fdt.c
index c7bc242b5c4bbfabf3944fe026f5620085d87c93..94d72d3f6d853358d4d86640eeacd009c8e4769c 100644 (file)
 #include <efi_selftest.h>
 #include <linux/libfdt.h>
 
-static struct efi_boot_services *boottime;
+static const struct efi_system_table *systemtab;
+static const struct efi_boot_services *boottime;
 static const char *fdt;
 
-/* This should be sufficent for */
+/* This should be sufficient for */
 #define BUFFERSIZE 0x100000
 
-static efi_guid_t fdt_guid = EFI_FDT_GUID;
+static const efi_guid_t fdt_guid = EFI_FDT_GUID;
+static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
 
 /*
  * Convert FDT value to host endianness.
@@ -115,6 +117,23 @@ static char *get_property(const u16 *property)
        }
 }
 
+/**
+ * efi_st_get_config_table() - get configuration table
+ *
+ * @guid:      GUID of the configuration table
+ * Return:     pointer to configuration table or NULL
+ */
+static void *efi_st_get_config_table(const efi_guid_t *guid)
+{
+       size_t i;
+
+       for (i = 0; i < systab.nr_tables; i++) {
+               if (!guidcmp(guid, &systemtab->tables[i].guid))
+                       return systemtab->tables[i].table;
+       }
+       return NULL;
+}
+
 /*
  * Setup unit test.
  *
@@ -125,21 +144,22 @@ static char *get_property(const u16 *property)
 static int setup(const efi_handle_t img_handle,
                 const struct efi_system_table *systable)
 {
-       efi_uintn_t i;
+       void *acpi;
 
+       systemtab = systable;
        boottime = systable->boottime;
 
-       /* Find configuration tables */
-       for (i = 0; i < systable->nr_tables; ++i) {
-               if (!efi_st_memcmp(&systable->tables[i].guid, &fdt_guid,
-                                  sizeof(efi_guid_t)))
-                       fdt = systable->tables[i].table;
-       }
+       acpi = efi_st_get_config_table(&acpi_guid);
+       fdt = efi_st_get_config_table(&fdt_guid);
+
        if (!fdt) {
                efi_st_error("Missing device tree\n");
                return EFI_ST_FAILURE;
        }
-
+       if (acpi) {
+               efi_st_error("Found ACPI table and device tree\n");
+               return EFI_ST_FAILURE;
+       }
        return EFI_ST_SUCCESS;
 }
 
@@ -183,5 +203,4 @@ EFI_UNIT_TEST(fdt) = {
        .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
        .setup = setup,
        .execute = execute,
-       .on_request = true,
 };