[PATCH v2] efi_loader: esrt: Remove EFI_CALL invocation for efi_create_event

Sughosh Ganu sughosh.ganu at linaro.org
Sat Apr 10 17:09:48 CEST 2021

The efi_esrt_register function calls the efi_create_event function
through the EFI_CALL macro.

For the Arm and RiscV architecture platforms, the EFI_CALL macro,
before invoking the corresponding function, modifies the global_data
pointer. Before the function calls, the gd is set to app_gd, which is
the value used by UEFI app, and after the function call, it is
restored back to u-boot's gd.

This becomes an issue when the EFI_CALL is used for the function
invocation, since the function makes calls to calloc, which
dereferences the gd pointer. With the gd pointer being no longer
valid, this results in an abort. Since this function is using
u-boot's api's, it should not be called through the EFI_CALL
macro. Fix this issue by calling the function directly, without the
EFI_CALL macro.

Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>

Changes since V1:
Remove the EFI_CALL macro only for efi_create_event function
invocation, and not for the efi_register_protocol_notify invocation,
since the later has an EFI_ENTRY function call.

 lib/efi_loader/efi_esrt.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/efi_loader/efi_esrt.c b/lib/efi_loader/efi_esrt.c
index 947bdb5e95..461bd4b937 100644
--- a/lib/efi_loader/efi_esrt.c
+++ b/lib/efi_loader/efi_esrt.c
@@ -490,8 +490,8 @@ efi_status_t efi_esrt_register(void)
 		return ret;
-	ret = EFI_CALL(efi_create_event(EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
-					efi_esrt_new_fmp_notify, NULL, NULL, &ev));
+	ret = efi_create_event(EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
+			       efi_esrt_new_fmp_notify, NULL, NULL, &ev);
 	if (ret != EFI_SUCCESS) {
 		EFI_PRINT("ESRT failed to create event\n");
 		return ret;

More information about the U-Boot mailing list