On Thu, Nov 12, 2020 at 09:29:21PM +0100, Heinrich Schuchardt wrote:
> 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.g...@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
> 

Acked-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>

Reply via email to