efi_selftest: check fdt is marked as runtime data
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 18 Nov 2018 16:58:54 +0000 (17:58 +0100)
committerAlexander Graf <agraf@suse.de>
Sun, 2 Dec 2018 20:59:37 +0000 (21:59 +0100)
Check that the memory area containing the device tree is marked as runtime
data.

Update the Python test to pass ${fdtcontroladdr} to bootefi.

Update the description of the Python test.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_selftest/efi_selftest_memory.c
test/py/tests/test_efi_selftest.py

index 0623e8e62daef25686b0e8b91da6b65ce6dbd0d9..24b4438ce4f51b9be75d02df6766c53f09f08ab9 100644 (file)
@@ -6,13 +6,17 @@
  *
  * This unit test checks the following runtime services:
  * AllocatePages, FreePages, GetMemoryMap
+ *
+ * The memory type used for the device tree is checked.
  */
 
 #include <efi_selftest.h>
 
 #define EFI_ST_NUM_PAGES 8
 
+static const efi_guid_t fdt_guid = EFI_FDT_GUID;
 static struct efi_boot_services *boottime;
+static u64 fdt_addr;
 
 /**
  * setup() - setup unit test
@@ -24,8 +28,20 @@ static struct efi_boot_services *boottime;
 static int setup(const efi_handle_t handle,
                 const struct efi_system_table *systable)
 {
+       size_t i;
+
        boottime = systable->boottime;
 
+       for (i = 0; i < systable->nr_tables; ++i) {
+               if (!efi_st_memcmp(&systable->tables[i].guid, &fdt_guid,
+                                  sizeof(efi_guid_t))) {
+                       if (fdt_addr) {
+                               efi_st_error("Duplicate device tree\n");
+                               return EFI_ST_FAILURE;
+                       }
+                       fdt_addr = (uintptr_t)systable->tables[i].table;
+               }
+       }
        return EFI_ST_SUCCESS;
 }
 
@@ -152,6 +168,14 @@ static int execute(void)
                return EFI_ST_FAILURE;
        }
 
+       /* Check memory reservation for the device tree */
+       if (fdt_addr &&
+           find_in_memory_map(map_size, memory_map, desc_size, fdt_addr,
+                              EFI_RUNTIME_SERVICES_DATA) != EFI_ST_SUCCESS) {
+               efi_st_error
+                       ("Device tree not marked as runtime services data\n");
+               return EFI_ST_FAILURE;
+       }
        return EFI_ST_SUCCESS;
 }
 
index e0833ffe22ca5413b0e434f1ff01e544b1260e04..36b35ee536b1607dfe97a3c432ee763e6d2d8cea 100644 (file)
@@ -8,12 +8,14 @@ import u_boot_utils
 
 @pytest.mark.buildconfigspec('cmd_bootefi_selftest')
 def test_efi_selftest(u_boot_console):
-       """
-       Run bootefi selftest
-       """
+       """Test the UEFI implementation
+
+       :param u_boot_console: U-Boot console
 
+       This function executes all selftests that are not marked as on request.
+       """
        u_boot_console.run_command(cmd='setenv efi_selftest')
-       u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False)
+       u_boot_console.run_command(cmd='bootefi selftest ${fdtcontroladdr}', wait_for_prompt=False)
        m = u_boot_console.p.expect(['Summary: 0 failures', 'Press any key'])
        if m != 0:
                raise Exception('Failures occurred during the EFI selftest')