Message ID | 20231102064459.3466953-7-masahisa.kojima@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | Add EFI HTTP boot support | expand |
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 --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;
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(+)