mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-16 09:54:35 +00:00
efi_loader: use event callback for initrd deregistration
Currently efi_initrd_deregister() is called in bootefi.c when the image started from bootefi command returns. Since efi_guid_event_group_return_to_efibootmgr event is implemented, so let's use this event for invoking initrd deregistration. Signed-off-by: Masahisa Kojima <masahisa.kojima@linaro.org> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Tested-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
This commit is contained in:
parent
2608015921
commit
05bf7adf87
2 changed files with 63 additions and 40 deletions
|
@ -549,11 +549,6 @@ efi_status_t do_bootefi_exec(efi_handle_t handle, void *load_options)
|
|||
out:
|
||||
free(load_options);
|
||||
|
||||
if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD)) {
|
||||
if (efi_initrd_deregister() != EFI_SUCCESS)
|
||||
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 &&
|
||||
|
|
|
@ -183,41 +183,6 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_initrd_register() - create handle for loading initial RAM disk
|
||||
*
|
||||
* This function creates a new handle and installs a Linux specific vendor
|
||||
* device path and an EFI_LOAD_FILE2_PROTOCOL. Linux uses the device path
|
||||
* to identify the handle and then calls the LoadFile service of the
|
||||
* EFI_LOAD_FILE2_PROTOCOL to read the initial RAM disk.
|
||||
*
|
||||
* Return: status code
|
||||
*/
|
||||
efi_status_t efi_initrd_register(void)
|
||||
{
|
||||
efi_status_t ret;
|
||||
|
||||
/*
|
||||
* Allow the user to continue if Boot#### file path is not set for
|
||||
* an initrd
|
||||
*/
|
||||
ret = check_initrd();
|
||||
if (ret == EFI_INVALID_PARAMETER)
|
||||
return EFI_SUCCESS;
|
||||
if (ret != EFI_SUCCESS)
|
||||
return ret;
|
||||
|
||||
ret = efi_install_multiple_protocol_interfaces(&efi_initrd_handle,
|
||||
/* initramfs */
|
||||
&efi_guid_device_path, &dp_lf2_handle,
|
||||
/* LOAD_FILE2 */
|
||||
&efi_guid_load_file2_protocol,
|
||||
&efi_lf2_protocol,
|
||||
NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_initrd_deregister() - delete the handle for loading initial RAM disk
|
||||
*
|
||||
|
@ -245,3 +210,66 @@ efi_status_t efi_initrd_deregister(void)
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_initrd_return_notify() - return to efibootmgr callback
|
||||
*
|
||||
* @event: the event for which this notification function is registered
|
||||
* @context: event context
|
||||
*/
|
||||
static void EFIAPI efi_initrd_return_notify(struct efi_event *event,
|
||||
void *context)
|
||||
{
|
||||
efi_status_t ret;
|
||||
|
||||
EFI_ENTRY("%p, %p", event, context);
|
||||
ret = efi_initrd_deregister();
|
||||
EFI_EXIT(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_initrd_register() - create handle for loading initial RAM disk
|
||||
*
|
||||
* This function creates a new handle and installs a Linux specific vendor
|
||||
* device path and an EFI_LOAD_FILE2_PROTOCOL. Linux uses the device path
|
||||
* to identify the handle and then calls the LoadFile service of the
|
||||
* EFI_LOAD_FILE2_PROTOCOL to read the initial RAM disk.
|
||||
*
|
||||
* Return: status code
|
||||
*/
|
||||
efi_status_t efi_initrd_register(void)
|
||||
{
|
||||
efi_status_t ret;
|
||||
struct efi_event *event;
|
||||
|
||||
/*
|
||||
* Allow the user to continue if Boot#### file path is not set for
|
||||
* an initrd
|
||||
*/
|
||||
ret = check_initrd();
|
||||
if (ret == EFI_INVALID_PARAMETER)
|
||||
return EFI_SUCCESS;
|
||||
if (ret != EFI_SUCCESS)
|
||||
return ret;
|
||||
|
||||
ret = efi_install_multiple_protocol_interfaces(&efi_initrd_handle,
|
||||
/* initramfs */
|
||||
&efi_guid_device_path, &dp_lf2_handle,
|
||||
/* LOAD_FILE2 */
|
||||
&efi_guid_load_file2_protocol,
|
||||
&efi_lf2_protocol,
|
||||
NULL);
|
||||
if (ret != EFI_SUCCESS) {
|
||||
log_err("installing EFI_LOAD_FILE2_PROTOCOL failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = efi_create_event(EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
|
||||
efi_initrd_return_notify, NULL,
|
||||
&efi_guid_event_group_return_to_efibootmgr,
|
||||
&event);
|
||||
if (ret != EFI_SUCCESS)
|
||||
log_err("Creating event failed\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue