]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
efi_loader: use event callback for initrd deregistration
authorMasahisa Kojima <masahisa.kojima@linaro.org>
Mon, 4 Dec 2023 04:30:14 +0000 (13:30 +0900)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 20 Apr 2024 06:21:59 +0000 (08:21 +0200)
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>
lib/efi_loader/efi_helper.c
lib/efi_loader/efi_load_initrd.c

index 58761fae7849bafb6934531620924e449ccfca05..6918fd5e48ad39eb6a3d01a08f06cb7dd13d56fa 100644 (file)
@@ -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 &&
index 2b467b554810b6dc60c34e942661493e05206c4d..67d1f75d525f1e32247e20946516bfffa4cecb22 100644 (file)
@@ -183,6 +183,50 @@ out:
        return ret;
 }
 
+/**
+ * efi_initrd_deregister() - delete the handle for loading initial RAM disk
+ *
+ * This will delete the handle containing the Linux specific vendor device
+ * path and EFI_LOAD_FILE2_PROTOCOL for loading an initrd
+ *
+ * Return:     status code
+ */
+efi_status_t efi_initrd_deregister(void)
+{
+       efi_status_t ret;
+
+       if (!efi_initrd_handle)
+               return EFI_SUCCESS;
+
+       ret = efi_uninstall_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);
+       efi_initrd_handle = NULL;
+
+       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
  *
@@ -196,6 +240,7 @@ out:
 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
@@ -214,34 +259,17 @@ efi_status_t efi_initrd_register(void)
                                                       &efi_guid_load_file2_protocol,
                                                       &efi_lf2_protocol,
                                                       NULL);
+       if (ret != EFI_SUCCESS) {
+               log_err("installing EFI_LOAD_FILE2_PROTOCOL failed\n");
+               return ret;
+       }
 
-       return ret;
-}
-
-/**
- * efi_initrd_deregister() - delete the handle for loading initial RAM disk
- *
- * This will delete the handle containing the Linux specific vendor device
- * path and EFI_LOAD_FILE2_PROTOCOL for loading an initrd
- *
- * Return:     status code
- */
-efi_status_t efi_initrd_deregister(void)
-{
-       efi_status_t ret;
-
-       if (!efi_initrd_handle)
-               return EFI_SUCCESS;
-
-       ret = efi_uninstall_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);
-       efi_initrd_handle = NULL;
+       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;
 }