Currenty any EFI status other than EFI_SUCCESS is reported as
Application terminated, r = -22

With the patch the status code and its mnemonic is printed.

Signed-off-by: Heinrich Schuchardt <[email protected]>
---
 cmd/bootefi.c                     | 17 ++++-----
 include/efi.h                     | 47 +++++++++++++++++-------
 include/efi_loader.h              |  3 ++
 lib/efi_loader/efi_image_loader.c | 76 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 122 insertions(+), 21 deletions(-)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index fcb223e999..51353b1217 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -247,8 +247,7 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt)
        debug("%s:%d Jumping to 0x%lx\n", __func__, __LINE__, (long)entry);
 
        if (setjmp(&loaded_image_info.exit_jmp)) {
-               efi_status_t status = loaded_image_info.exit_status;
-               return status == EFI_SUCCESS ? 0 : -EINVAL;
+               return loaded_image_info.exit_status;
        }
        loaded_image_info.entry = entry;
 
@@ -277,7 +276,7 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, 
char * const argv[])
 {
        char *saddr, *sfdt;
        unsigned long addr, fdt_addr = 0;
-       int r = 0;
+       unsigned long r;
 
        if (argc < 2)
                return CMD_RET_USAGE;
@@ -302,12 +301,14 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int 
argc, char * const argv[])
 
        printf("## Starting EFI application at %08lx ...\n", addr);
        r = do_bootefi_exec((void *)addr, (void*)fdt_addr);
-       printf("## Application terminated, r = %d\n", r);
+       printf("## Application terminated with status code\n"
+              "   %lu, %s\n",
+              r & ~(1UL << (EFI_BITS_PER_LONG - 1)),  efi_status_to_str(r));
 
-       if (r != 0)
-               r = 1;
-
-       return r;
+       if (r != EFI_SUCCESS)
+               return 1;
+       else
+               return 0;
 }
 
 #ifdef CONFIG_SYS_LONGHELP
diff --git a/include/efi.h b/include/efi.h
index 3d587807e8..242da3c3be 100644
--- a/include/efi.h
+++ b/include/efi.h
@@ -39,19 +39,40 @@ struct efi_device_path;
 #define EFI_BITS_PER_LONG      64
 #endif
 
-#define EFI_SUCCESS            0
-#define EFI_LOAD_ERROR         (1 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_INVALID_PARAMETER  (2 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_UNSUPPORTED                (3 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_BAD_BUFFER_SIZE    (4 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_BUFFER_TOO_SMALL   (5 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_NOT_READY          (6 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_DEVICE_ERROR       (7 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_WRITE_PROTECTED    (8 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_OUT_OF_RESOURCES   (9 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_NOT_FOUND          (14 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_ACCESS_DENIED      (15 | (1UL << (EFI_BITS_PER_LONG - 1)))
-#define EFI_SECURITY_VIOLATION (26 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_SUCCESS                    0
+#define EFI_LOAD_ERROR                 (1 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_INVALID_PARAMETER          (2 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_UNSUPPORTED                        (3 | (1UL << (EFI_BITS_PER_LONG 
- 1)))
+#define EFI_BAD_BUFFER_SIZE            (4 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_BUFFER_TOO_SMALL           (5 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_NOT_READY                  (6 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_DEVICE_ERROR               (7 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_WRITE_PROTECTED            (8 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_OUT_OF_RESOURCES           (9 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_VOLUME_CORRUPTED           (10 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_VOLUME_FULL                        (11 | (1UL << 
(EFI_BITS_PER_LONG - 1)))
+#define EFI_NO_MEDIA                   (12 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_MEDIA_CHANGED              (13 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_NOT_FOUND                  (14 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_ACCESS_DENIED              (15 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_NO_RESPONSE                        (16 | (1UL << 
(EFI_BITS_PER_LONG - 1)))
+#define EFI_NO_MAPPING                 (17 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_TIMEOUT                    (18 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_NOT_STARTED                        (19 | (1UL << 
(EFI_BITS_PER_LONG - 1)))
+#define EFI_ALREADY_STARTED            (20 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_ABORTED                    (21 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_ICMP_ERROR                 (22 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_TFTP_ERROR                 (23 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_PROTOCOL_ERROR             (24 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_INCOMPATIBLE_VERSION       (25 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_SECURITY_VIOLATION         (26 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_CRC_ERROR                  (27 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_END_OF_MEDIA               (28 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_END_OF_FILE                        (31 | (1UL << 
(EFI_BITS_PER_LONG - 1)))
+#define EFI_INVALID_LANGUAGE           (32 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_COMPROMISED_DATA           (33 | (1UL << (EFI_BITS_PER_LONG - 1)))
+#define EFI_IP_ADDRESS_CONFLICT                (34 | (1UL << 
(EFI_BITS_PER_LONG - 1)))
+#define EFI_HTTP_ERROR                 (35 | (1UL << (EFI_BITS_PER_LONG - 1)))
 
 typedef unsigned long efi_status_t;
 typedef u64 efi_physical_addr_t;
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 99619f53a9..47245049ab 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -145,6 +145,9 @@ extern void *efi_bounce_buffer;
 #define EFI_LOADER_BOUNCE_BUFFER_SIZE (64 * 1024 * 1024)
 #endif
 
+/* Convert EFI status code to string */
+const char *efi_status_to_str(efi_status_t r);
+
 /* Convert strings from normal C strings to uEFI strings */
 static inline void ascii2unicode(u16 *unicode, const char *ascii)
 {
diff --git a/lib/efi_loader/efi_image_loader.c 
b/lib/efi_loader/efi_image_loader.c
index bc8e04d6d9..c1d09c8806 100644
--- a/lib/efi_loader/efi_image_loader.c
+++ b/lib/efi_loader/efi_image_loader.c
@@ -18,6 +18,82 @@ DECLARE_GLOBAL_DATA_PTR;
 const efi_guid_t efi_guid_device_path = DEVICE_PATH_GUID;
 const efi_guid_t efi_guid_loaded_image = LOADED_IMAGE_GUID;
 
+const char *efi_status_to_str(efi_status_t r)
+{
+       switch (r) {
+       case EFI_SUCCESS:
+               return "EFI_SUCCESS";
+       case EFI_LOAD_ERROR:
+               return "EFI_LOAD_ERROR";
+       case EFI_INVALID_PARAMETER:
+               return "EFI_INVALID_PARAMETER";
+       case EFI_UNSUPPORTED:
+               return "EFI_UNSUPPORTED";
+       case EFI_BAD_BUFFER_SIZE:
+               return "EFI_BAD_BUFFER_SIZE";
+       case EFI_BUFFER_TOO_SMALL:
+               return "EFI_BUFFER_TOO_SMALL";
+       case EFI_NOT_READY:
+               return "EFI_NOT_READY";
+       case EFI_DEVICE_ERROR:
+               return "EFI_DEVICE_ERROR";
+       case EFI_WRITE_PROTECTED:
+               return "EFI_WRITE_PROTECTED";
+       case EFI_OUT_OF_RESOURCES:
+               return "EFI_OUT_OF_RESOURCES";
+       case EFI_VOLUME_CORRUPTED:
+               return "EFI_VOLUME_CORRUPTED";
+       case EFI_VOLUME_FULL:
+               return "EFI_VOLUME_FULL";
+       case EFI_NO_MEDIA:
+               return "EFI_NO_MEDIA";
+       case EFI_MEDIA_CHANGED:
+               return "EFI_MEDIA_CHANGED";
+       case EFI_NOT_FOUND:
+               return "EFI_NOT_FOUND";
+       case EFI_ACCESS_DENIED:
+               return "EFI_ACCESS_DENIED";
+       case EFI_NO_RESPONSE:
+               return "EFI_NO_RESPONSE";
+       case EFI_NO_MAPPING:
+               return "EFI_NO_MAPPING";
+       case EFI_TIMEOUT:
+               return "EFI_TIMEOUT";
+       case EFI_NOT_STARTED:
+               return "EFI_NOT_STARTED";
+       case EFI_ALREADY_STARTED:
+               return "EFI_ALREADY_STARTED";
+       case EFI_ABORTED:
+               return "EFI_ABORTED";
+       case EFI_ICMP_ERROR:
+               return "EFI_ICMP_ERROR";
+       case EFI_TFTP_ERROR:
+               return "EFI_TFTP_ERROR";
+       case EFI_PROTOCOL_ERROR:
+               return "EFI_PROTOCOL_ERROR";
+       case EFI_INCOMPATIBLE_VERSION:
+               return "EFI_INCOMPATIBLE_VERSION";
+       case EFI_SECURITY_VIOLATION:
+               return "EFI_SECURITY_VIOLATION";
+       case EFI_CRC_ERROR:
+               return "EFI_CRC_ERROR";
+       case EFI_END_OF_MEDIA:
+               return "EFI_END_OF_MEDIA";
+       case EFI_END_OF_FILE:
+               return "EFI_END_OF_FILE";
+       case EFI_INVALID_LANGUAGE:
+               return "EFI_INVALID_LANGUAGE";
+       case EFI_COMPROMISED_DATA:
+               return "EFI_COMPROMISED_DATA";
+       case EFI_IP_ADDRESS_CONFLICT:
+               return "EFI_IP_ADDRESS_CONFLICT";
+       case EFI_HTTP_ERROR:
+               return "EFI_HTTP_ERROR";
+       default:
+               return "Unknown EFI status code";
+       }
+}
+
 efi_status_t EFIAPI efi_return_handle(void *handle, efi_guid_t *protocol,
                        void **protocol_interface, void *agent_handle,
                        void *controller_handle, uint32_t attributes)
-- 
2.11.0

_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to