efi_selftest: check fdt is marked as runtime data

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>
This commit is contained in:
Heinrich Schuchardt 2018-11-18 17:58:54 +01:00 committed by Alexander Graf
parent 0c9ac06a28
commit 34c96659ed
2 changed files with 30 additions and 4 deletions

View file

@ -6,13 +6,17 @@
* *
* This unit test checks the following runtime services: * This unit test checks the following runtime services:
* AllocatePages, FreePages, GetMemoryMap * AllocatePages, FreePages, GetMemoryMap
*
* The memory type used for the device tree is checked.
*/ */
#include <efi_selftest.h> #include <efi_selftest.h>
#define EFI_ST_NUM_PAGES 8 #define EFI_ST_NUM_PAGES 8
static const efi_guid_t fdt_guid = EFI_FDT_GUID;
static struct efi_boot_services *boottime; static struct efi_boot_services *boottime;
static u64 fdt_addr;
/** /**
* setup() - setup unit test * setup() - setup unit test
@ -24,8 +28,20 @@ static struct efi_boot_services *boottime;
static int setup(const efi_handle_t handle, static int setup(const efi_handle_t handle,
const struct efi_system_table *systable) const struct efi_system_table *systable)
{ {
size_t i;
boottime = systable->boottime; 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; return EFI_ST_SUCCESS;
} }
@ -152,6 +168,14 @@ static int execute(void)
return EFI_ST_FAILURE; 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; return EFI_ST_SUCCESS;
} }

View file

@ -8,12 +8,14 @@ import u_boot_utils
@pytest.mark.buildconfigspec('cmd_bootefi_selftest') @pytest.mark.buildconfigspec('cmd_bootefi_selftest')
def test_efi_selftest(u_boot_console): def test_efi_selftest(u_boot_console):
""" """Test the UEFI implementation
Run bootefi selftest
"""
: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='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']) m = u_boot_console.p.expect(['Summary: 0 failures', 'Press any key'])
if m != 0: if m != 0:
raise Exception('Failures occurred during the EFI selftest') raise Exception('Failures occurred during the EFI selftest')