efi_selftest: keep devices in ExitBootServices()
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 12 Nov 2020 20:26:28 +0000 (21:26 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 14 Nov 2020 04:05:46 +0000 (05:05 +0100)
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@gmx.de>
include/efi_loader.h
lib/efi_loader/efi_boottime.c
lib/efi_selftest/efi_selftest.c

index f550ced..455b9c8 100644 (file)
@@ -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;
index dfa71b1..246b59d 100644 (file)
@@ -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();
index 85e819b..b8eed04 100644 (file)
@@ -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) {