[PATCH 1/1] efi_selftest: keep devices in ExitBootServices()

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Nov 12 21:29:21 CET 2020


When calling ExitBootServices during out unit tests we should not detach
devices as we need console output for runtime tests.

Fixes: 529441ca89b1 ("efi_loader: Disable devices before handing over control")
Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
 include/efi_loader.h            |  3 +++
 lib/efi_loader/efi_boottime.c   | 13 +++++++++----
 lib/efi_selftest/efi_selftest.c |  3 +++
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index f550ced568..455b9c8031 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -59,6 +59,9 @@ extern efi_handle_t efi_root;
 /* Set to EFI_SUCCESS when initialized */
 extern efi_status_t efi_obj_list_initialized;

+/* Flag used by the selftest to avoid detaching devices in ExitBootServices() */
+extern bool efi_st_keep_devices;
+
 /* EFI system partition */
 extern struct efi_system_partition {
 	enum if_type if_type;
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index dfa71b1774..246b59d3b3 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -38,6 +38,9 @@ LIST_HEAD(efi_event_queue);
 /* Flag to disable timer activity in ExitBootServices() */
 static bool timers_enabled = true;

+/* Flag used by the selftest to avoid detaching devices in ExitBootServices() */
+bool efi_st_keep_devices;
+
 /* List of all events registered by RegisterProtocolNotify() */
 LIST_HEAD(efi_register_notify_events);

@@ -1996,10 +1999,12 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
 			list_del(&evt->link);
 	}

-	if IS_ENABLED(CONFIG_USB_DEVICE)
-		udc_disconnect();
-	board_quiesce_devices();
-	dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
+	if (!efi_st_keep_devices) {
+		if IS_ENABLED(CONFIG_USB_DEVICE)
+			udc_disconnect();
+		board_quiesce_devices();
+		dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
+	}

 	/* Patch out unsupported runtime function */
 	efi_runtime_detach();
diff --git a/lib/efi_selftest/efi_selftest.c b/lib/efi_selftest/efi_selftest.c
index 85e819bdfa..b8eed048c2 100644
--- a/lib/efi_selftest/efi_selftest.c
+++ b/lib/efi_selftest/efi_selftest.c
@@ -38,6 +38,9 @@ void efi_st_exit_boot_services(void)
 	efi_status_t ret;
 	struct efi_mem_desc *memory_map;

+	/* Do not detach devices in ExitBootServices. We need the console. */
+	efi_st_keep_devices = true;
+
 	ret = boottime->get_memory_map(&map_size, NULL, &map_key, &desc_size,
 				       &desc_version);
 	if (ret != EFI_BUFFER_TOO_SMALL) {
--
2.28.0



More information about the U-Boot mailing list