diff mbox series

[v9,6/9] efi_loader: add return to efibootmgr event group

Message ID 20231102064459.3466953-7-masahisa.kojima@linaro.org
State Superseded
Headers show
Series Add EFI HTTP boot support | expand

Commit Message

Masahisa Kojima Nov. 2, 2023, 6:44 a.m. UTC
When the image loaded by efibootmgr returns, efibootmgr
needs to clean the resources. Adding the event of returning
to efibootmgr is useful to simplify the implementation.

Signed-off-by: Masahisa Kojima <masahisa.kojima@linaro.org>
---
 cmd/bootefi.c                 | 12 ++++++++++++
 include/efi_api.h             |  3 +++
 include/efi_loader.h          |  2 ++
 lib/efi_loader/efi_boottime.c |  3 +++
 4 files changed, 20 insertions(+)

Comments

Ilias Apalodimas Nov. 2, 2023, 9:34 a.m. UTC | #1
On Thu, 2 Nov 2023 at 08:46, Masahisa Kojima <masahisa.kojima@linaro.org> wrote:
>
> When the image loaded by efibootmgr returns, efibootmgr
> needs to clean the resources. Adding the event of returning
> to efibootmgr is useful to simplify the implementation.
>
> Signed-off-by: Masahisa Kojima <masahisa.kojima@linaro.org>
> ---
>  cmd/bootefi.c                 | 12 ++++++++++++
>  include/efi_api.h             |  3 +++
>  include/efi_loader.h          |  2 ++
>  lib/efi_loader/efi_boottime.c |  3 +++
>  4 files changed, 20 insertions(+)
>
> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
> index 20e5c94a33..4d74969ad6 100644
> --- a/cmd/bootefi.c
> +++ b/cmd/bootefi.c
> @@ -356,6 +356,7 @@ static efi_status_t do_bootefi_exec(efi_handle_t handle, void *load_options)
>         efi_status_t ret;
>         efi_uintn_t exit_data_size = 0;
>         u16 *exit_data = NULL;
> +       struct efi_event *evt;
>
>         /* On ARM switch from EL3 or secure mode to EL2 or non-secure mode */
>         switch_to_non_secure_mode();
> @@ -394,6 +395,17 @@ out:
>                         log_err("Failed to remove loadfile2 for initrd\n");
>         }
>
> +       /* Notify EFI_EVENT_GROUP_RETURN_TO_EFIBOOTMGR event group. */
> +       list_for_each_entry(evt, &efi_events, link) {
> +               if (evt->group &&
> +                   !guidcmp(evt->group,
> +                            &efi_guid_event_group_return_to_efibootmgr)) {
> +                       efi_signal_event(evt);
> +                       EFI_CALL(systab.boottime->close_event(evt));
> +                       break;
> +               }
> +       }
> +
>         /* Control is returned to U-Boot, disable EFI watchdog */
>         efi_set_watchdog(0);
>
> diff --git a/include/efi_api.h b/include/efi_api.h
> index c2d6964467..0e92cb8a7f 100644
> --- a/include/efi_api.h
> +++ b/include/efi_api.h
> @@ -404,6 +404,9 @@ struct efi_runtime_services {
>  #define EFI_EVENT_GROUP_RESET_SYSTEM \
>         EFI_GUID(0x62da6a56, 0x13fb, 0x485a, 0xa8, 0xda, \
>                  0xa3, 0xdd, 0x79, 0x12, 0xcb, 0x6b)
> +#define EFI_EVENT_GROUP_RETURN_TO_EFIBOOTMGR \
> +       EFI_GUID(0xb4a40fe6, 0x9149, 0x4f29, 0x94, 0x47, \
> +                0x49, 0x38, 0x7a, 0x7f, 0xab, 0x87)
>
>  /* EFI Configuration Table and GUID definitions */
>  #define NULL_GUID \
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index e164e6067d..31954e84c3 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -290,6 +290,8 @@ extern const efi_guid_t efi_guid_event_group_memory_map_change;
>  extern const efi_guid_t efi_guid_event_group_ready_to_boot;
>  /* event group ResetSystem() invoked (before ExitBootServices) */
>  extern const efi_guid_t efi_guid_event_group_reset_system;
> +/* event group return to efibootmgr */
> +extern const efi_guid_t efi_guid_event_group_return_to_efibootmgr;
>  /* GUID of the device tree table */
>  extern const efi_guid_t efi_guid_fdt;
>  extern const efi_guid_t efi_guid_loaded_image;
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index f9b10a9763..3767fa2db4 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -90,6 +90,9 @@ const efi_guid_t efi_guid_event_group_ready_to_boot =
>  /* event group ResetSystem() invoked (before ExitBootServices) */
>  const efi_guid_t efi_guid_event_group_reset_system =
>                         EFI_EVENT_GROUP_RESET_SYSTEM;
> +/* event group return to efibootmgr */
> +const efi_guid_t efi_guid_event_group_return_to_efibootmgr =
> +                       EFI_EVENT_GROUP_RETURN_TO_EFIBOOTMGR;
>  /* GUIDs of the Load File and Load File2 protocols */
>  const efi_guid_t efi_guid_load_file_protocol = EFI_LOAD_FILE_PROTOCOL_GUID;
>  const efi_guid_t efi_guid_load_file2_protocol = EFI_LOAD_FILE2_PROTOCOL_GUID;
> --
> 2.34.1
>

Now that we have the event we have touse it for loadfie2 in the future

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
diff mbox series

Patch

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 20e5c94a33..4d74969ad6 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -356,6 +356,7 @@  static efi_status_t do_bootefi_exec(efi_handle_t handle, void *load_options)
 	efi_status_t ret;
 	efi_uintn_t exit_data_size = 0;
 	u16 *exit_data = NULL;
+	struct efi_event *evt;
 
 	/* On ARM switch from EL3 or secure mode to EL2 or non-secure mode */
 	switch_to_non_secure_mode();
@@ -394,6 +395,17 @@  out:
 			log_err("Failed to remove loadfile2 for initrd\n");
 	}
 
+	/* Notify EFI_EVENT_GROUP_RETURN_TO_EFIBOOTMGR event group. */
+	list_for_each_entry(evt, &efi_events, link) {
+		if (evt->group &&
+		    !guidcmp(evt->group,
+			     &efi_guid_event_group_return_to_efibootmgr)) {
+			efi_signal_event(evt);
+			EFI_CALL(systab.boottime->close_event(evt));
+			break;
+		}
+	}
+
 	/* Control is returned to U-Boot, disable EFI watchdog */
 	efi_set_watchdog(0);
 
diff --git a/include/efi_api.h b/include/efi_api.h
index c2d6964467..0e92cb8a7f 100644
--- a/include/efi_api.h
+++ b/include/efi_api.h
@@ -404,6 +404,9 @@  struct efi_runtime_services {
 #define EFI_EVENT_GROUP_RESET_SYSTEM \
 	EFI_GUID(0x62da6a56, 0x13fb, 0x485a, 0xa8, 0xda, \
 		 0xa3, 0xdd, 0x79, 0x12, 0xcb, 0x6b)
+#define EFI_EVENT_GROUP_RETURN_TO_EFIBOOTMGR \
+	EFI_GUID(0xb4a40fe6, 0x9149, 0x4f29, 0x94, 0x47, \
+		 0x49, 0x38, 0x7a, 0x7f, 0xab, 0x87)
 
 /* EFI Configuration Table and GUID definitions */
 #define NULL_GUID \
diff --git a/include/efi_loader.h b/include/efi_loader.h
index e164e6067d..31954e84c3 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -290,6 +290,8 @@  extern const efi_guid_t efi_guid_event_group_memory_map_change;
 extern const efi_guid_t efi_guid_event_group_ready_to_boot;
 /* event group ResetSystem() invoked (before ExitBootServices) */
 extern const efi_guid_t efi_guid_event_group_reset_system;
+/* event group return to efibootmgr */
+extern const efi_guid_t efi_guid_event_group_return_to_efibootmgr;
 /* GUID of the device tree table */
 extern const efi_guid_t efi_guid_fdt;
 extern const efi_guid_t efi_guid_loaded_image;
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index f9b10a9763..3767fa2db4 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -90,6 +90,9 @@  const efi_guid_t efi_guid_event_group_ready_to_boot =
 /* event group ResetSystem() invoked (before ExitBootServices) */
 const efi_guid_t efi_guid_event_group_reset_system =
 			EFI_EVENT_GROUP_RESET_SYSTEM;
+/* event group return to efibootmgr */
+const efi_guid_t efi_guid_event_group_return_to_efibootmgr =
+			EFI_EVENT_GROUP_RETURN_TO_EFIBOOTMGR;
 /* GUIDs of the Load File and Load File2 protocols */
 const efi_guid_t efi_guid_load_file_protocol = EFI_LOAD_FILE_PROTOCOL_GUID;
 const efi_guid_t efi_guid_load_file2_protocol = EFI_LOAD_FILE2_PROTOCOL_GUID;