efi_loader: allow return value in EFI_CALL
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 15 Sep 2017 08:06:10 +0000 (10:06 +0200)
committerAlexander Graf <agraf@suse.de>
Mon, 18 Sep 2017 21:53:56 +0000 (23:53 +0200)
Macro EFI_CALL was introduced to call an UEFI function.
Unfortunately it does not support return values.
Most UEFI functions have a return value.

So let's rename EFI_CALL to EFI_CALL_VOID and introduce a
new EFI_CALL macro that supports return values.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
include/efi_loader.h
lib/efi_loader/efi_boottime.c

index 46d684f6df8d21c7b4002f87faf468c3f47aed00..f27192555e55be977f752086ab5f7f15741bd167 100644 (file)
@@ -42,9 +42,22 @@ const char *__efi_nesting_dec(void);
        })
 
 /*
- * Callback into UEFI world from u-boot:
+ * Call non-void UEFI function from u-boot and retrieve return value:
  */
-#define EFI_CALL(exp) do { \
+#define EFI_CALL(exp) ({ \
+       debug("%sEFI: Call: %s\n", __efi_nesting_inc(), #exp); \
+       assert(__efi_exit_check()); \
+       typeof(exp) _r = exp; \
+       assert(__efi_entry_check()); \
+       debug("%sEFI: %lu returned by %s\n", __efi_nesting_dec(), \
+             (unsigned long)((uintptr_t)_r & ~EFI_ERROR_MASK), #exp); \
+       _r; \
+})
+
+/*
+ * Call void UEFI function from u-boot:
+ */
+#define EFI_CALL_VOID(exp) do { \
        debug("%sEFI: Call: %s\n", __efi_nesting_inc(), #exp); \
        assert(__efi_exit_check()); \
        exp; \
index 90e9ead7b25ec4403387560acb39fcda57e1d264..2c9379a8ae51c9ce62c723ec3fe343ae04f927b5 100644 (file)
@@ -163,7 +163,8 @@ void efi_signal_event(struct efi_event *event)
                return;
        event->signaled = 1;
        if (event->type & EVT_NOTIFY_SIGNAL) {
-               EFI_CALL(event->notify_function(event, event->notify_context));
+               EFI_CALL_VOID(event->notify_function(event,
+                                                    event->notify_context));
        }
 }