aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlias Apalodimas <ilias.apalodimas@linaro.org>2022-10-16 11:36:32 +0300
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2022-10-16 12:23:22 +0200
commit70089c13a73f58315547982573be2016e7a70958 (patch)
tree905752b31d7b4161ed2f166b3d1ab0d98c07333c
parentf4d52c41595b8af1813413020773b5d59f226622 (diff)
downloadu-boot-70089c13a73f58315547982573be2016e7a70958.zip
u-boot-70089c13a73f58315547982573be2016e7a70958.tar.gz
u-boot-70089c13a73f58315547982573be2016e7a70958.tar.bz2
efi_loader: remove efi_delete_handle on loadfile2
Loadfile2 code is installing two protocols on it's own handle and uses efi_delete_handle() to clean it up on failure(s). However commit 05c4c9e21ae6 ("efi_loader: define internal implementations of install/uninstallmultiple") prepares the ground for us to clean up efi_delete_handle() used in favor of Install/UninstallMultipleProtocol. While at it clean up the non needed void casts to (void *) on the protolcol installation. Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
-rw-r--r--cmd/bootefi.c6
-rw-r--r--include/efi_loader.h2
-rw-r--r--lib/efi_loader/efi_load_initrd.c19
3 files changed, 20 insertions, 7 deletions
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index b93c0d3..2a7d429 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -394,8 +394,10 @@ static 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))
- efi_initrd_deregister();
+ if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD)) {
+ if (efi_initrd_deregister() != EFI_SUCCESS)
+ log_err("Failed to remove loadfile2 for initrd\n");
+ }
/* Control is returned to U-Boot, disable EFI watchdog */
efi_set_watchdog(0);
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 1bac3f4..0c6c95b 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -570,7 +570,7 @@ efi_status_t efi_net_register(void);
/* Called by bootefi to make the watchdog available */
efi_status_t efi_watchdog_register(void);
efi_status_t efi_initrd_register(void);
-void efi_initrd_deregister(void);
+efi_status_t efi_initrd_deregister(void);
/* Called by bootefi to make SMBIOS tables available */
/**
* efi_acpi_register() - write out ACPI tables
diff --git a/lib/efi_loader/efi_load_initrd.c b/lib/efi_loader/efi_load_initrd.c
index 87fde3f..1934337 100644
--- a/lib/efi_loader/efi_load_initrd.c
+++ b/lib/efi_loader/efi_load_initrd.c
@@ -213,7 +213,7 @@ efi_status_t efi_initrd_register(void)
&efi_guid_device_path, &dp_lf2_handle,
/* LOAD_FILE2 */
&efi_guid_load_file2_protocol,
- (void *)&efi_lf2_protocol,
+ &efi_lf2_protocol,
NULL);
return ret;
@@ -227,11 +227,22 @@ efi_status_t efi_initrd_register(void)
*
* Return: status code
*/
-void efi_initrd_deregister(void)
+efi_status_t efi_initrd_deregister(void)
{
+ efi_status_t ret;
+
if (!efi_initrd_handle)
- return;
+ return EFI_SUCCESS;
- efi_delete_handle(efi_initrd_handle);
+ 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;
}