[efi] Add efi_strerror()
authorMichael Brown <mcb30@etherboot.org>
Wed, 19 Nov 2008 03:45:44 +0000 (19:45 -0800)
committerMichael Brown <mcb30@etherboot.org>
Wed, 19 Nov 2008 19:22:49 +0000 (19:22 +0000)
EFI_STATUS is defined as an INTN, which maps to UINT32 (i.e. unsigned
int) on i386 and UINT64 (i.e. unsigned long) on x86_64.  This would
require a cast each time the error status is printed.

Add efi_strerror() to avoid this ickiness and simultaneously enable
prettier reporting of EFI status codes.

src/image/efi_image.c
src/include/gpxe/efi/efi.h
src/interface/efi/efi_console.c
src/interface/efi/efi_io.c
src/interface/efi/efi_pci.c
src/interface/efi/efi_snp.c
src/interface/efi/efi_strerror.c [new file with mode: 0644]
src/interface/efi/efi_timer.c
src/interface/efi/efi_umalloc.c

index 5992b62..ae95deb 100644 (file)
@@ -43,16 +43,16 @@ static int efi_image_exec ( struct image *image ) {
                                       user_to_virt ( image->data, 0 ),
                                       image->len, &handle ) ) != 0 ) {
                /* Not an EFI image */
-               DBGC ( image, "EFIIMAGE %p could not load: %x\n",
-                      image, efirc );
+               DBGC ( image, "EFIIMAGE %p could not load: %s\n",
+                      image, efi_strerror ( efirc ) );
                return -ENOEXEC;
        }
 
        /* Start the image */
        if ( ( efirc = bs->StartImage ( handle, &exit_data_size,
                                        &exit_data ) ) != 0 ) {
-               DBGC ( image, "EFIIMAGE %p returned with status %x\n",
-                      image, efirc );
+               DBGC ( image, "EFIIMAGE %p returned with status %s\n",
+                      image, efi_strerror ( efirc ) );
                goto done;
        }
 
@@ -81,8 +81,8 @@ static int efi_image_load ( struct image *image ) {
                                       user_to_virt ( image->data, 0 ),
                                       image->len, &handle ) ) != 0 ) {
                /* Not an EFI image */
-               DBGC ( image, "EFIIMAGE %p could not load: %x\n",
-                      image, efirc );
+               DBGC ( image, "EFIIMAGE %p could not load: %s\n",
+                      image, efi_strerror ( efirc ) );
                return -ENOEXEC;
        }
 
index cd35f68..8c9f789 100644 (file)
@@ -90,4 +90,6 @@ struct efi_protocol {
 extern EFI_HANDLE efi_image_handle;
 extern EFI_SYSTEM_TABLE *efi_systab;
 
+extern const char * efi_strerror ( EFI_STATUS efirc );
+
 #endif /* _EFI_H */
index df774e4..b78de61 100644 (file)
@@ -224,7 +224,8 @@ static int efi_getchar ( void ) {
 
        /* Read key from real EFI console */
        if ( ( efirc = conin->ReadKeyStroke ( conin, &key ) ) != 0 ) {
-               DBG ( "EFI could not read keystroke: %x\n", efirc );
+               DBG ( "EFI could not read keystroke: %s\n",
+                     efi_strerror ( efirc ) );
                return 0;
        }
        DBG2 ( "EFI read key stroke with unicode %04x scancode %04x\n",
index ef21213..e11f9bf 100644 (file)
@@ -86,7 +86,8 @@ unsigned long long efi_ioread ( volatile void *io_addr, size_t size ) {
        if ( ( efirc = read ( cpu_io, efi_width ( size ),
                              ( intptr_t ) io_addr, 1,
                              ( void * ) &data ) ) != 0 ) {
-               DBG ( "EFI I/O read at %p failed: %x\n", io_addr, efirc );
+               DBG ( "EFI I/O read at %p failed: %s\n",
+                     io_addr, efi_strerror ( efirc ) );
                return -1ULL;
        }
 
@@ -111,7 +112,8 @@ void efi_iowrite ( unsigned long long data, volatile void *io_addr,
        if ( ( efirc = write ( cpu_io, efi_width ( size ),
                               ( intptr_t ) io_addr, 1,
                               ( void * ) &data ) ) != 0 ) {
-               DBG ( "EFI I/O write at %p failed: %x\n", io_addr, efirc );
+               DBG ( "EFI I/O write at %p failed: %s\n",
+                     io_addr, efi_strerror ( efirc ) );
        }
 }
 
@@ -134,8 +136,8 @@ void efi_ioreads ( volatile void *io_addr, void *data,
        if ( ( efirc = read ( cpu_io, efi_width ( size ),
                              ( intptr_t ) io_addr, count,
                              ( void * ) data ) ) != 0 ) {
-               DBG ( "EFI I/O string read at %p failed: %x\n",
-                     io_addr, efirc );
+               DBG ( "EFI I/O string read at %p failed: %s\n",
+                     io_addr, efi_strerror ( efirc ) );
        }
 }
 
@@ -158,8 +160,8 @@ void efi_iowrites ( volatile void *io_addr, const void *data,
        if ( ( efirc = write ( cpu_io, efi_width ( size ),
                               ( intptr_t ) io_addr, count,
                               ( void * ) data ) ) != 0 ) {
-               DBG ( "EFI I/O write at %p failed: %x\n",
-                     io_addr, efirc );
+               DBG ( "EFI I/O write at %p failed: %s\n",
+                     io_addr, efi_strerror ( efirc ) );
        }
 }
 
index 308a538..f87b540 100644 (file)
@@ -46,9 +46,9 @@ int efipci_read ( struct pci_device *pci, unsigned long location,
                                          efipci_address ( pci, location ), 1,
                                          value ) ) != 0 ) {
                DBG ( "EFIPCI config read from %02x:%02x.%x offset %02lx "
-                     "failed: %x\n", pci->bus, PCI_SLOT ( pci->devfn ),
+                     "failed: %s\n", pci->bus, PCI_SLOT ( pci->devfn ),
                      PCI_FUNC ( pci->devfn ), EFIPCI_OFFSET ( location ),
-                     efirc );
+                     efi_strerror ( efirc ) );
                return -EIO;
        }
 
@@ -63,9 +63,9 @@ int efipci_write ( struct pci_device *pci, unsigned long location,
                                           efipci_address ( pci, location ), 1,
                                           &value ) ) != 0 ) {
                DBG ( "EFIPCI config write to %02x:%02x.%x offset %02lx "
-                     "failed: %x\n", pci->bus, PCI_SLOT ( pci->devfn ),
+                     "failed: %s\n", pci->bus, PCI_SLOT ( pci->devfn ),
                      PCI_FUNC ( pci->devfn ), EFIPCI_OFFSET ( location ),
-                     efirc );
+                     efi_strerror ( efirc ) );
                return -EIO;
        }
 
index a3494cc..6256aee 100644 (file)
@@ -737,7 +737,8 @@ efi_snp_netdev ( EFI_DRIVER_BINDING_PROTOCOL *driver, EFI_HANDLE device ) {
        if ( ( efirc = u.pci->GetLocation ( u.pci, &pci_segment, &pci_bus,
                                            &pci_dev, &pci_fn ) ) != 0 ) {
                DBGC ( driver, "SNPDRV %p device %p could not get PCI "
-                      "location: %x\n", driver, device, efirc );
+                      "location: %s\n",
+                      driver, device, efi_strerror ( efirc ) );
                goto out_no_pci_location;
        }
        DBGCP ( driver, "SNPDRV %p device %p is PCI %04x:%02x:%02x.%x\n",
@@ -786,7 +787,7 @@ efi_snp_snpdev ( EFI_DRIVER_BINDING_PROTOCOL *driver, EFI_HANDLE device ) {
                                          device,
                                          EFI_OPEN_PROTOCOL_GET_PROTOCOL))!=0){
                DBGC ( driver, "SNPDRV %p device %p could not locate SNP: "
-                      "%x\n", driver, device, efirc );
+                      "%s\n", driver, device, efi_strerror ( efirc ) );
                return NULL;
        }
 
@@ -869,8 +870,8 @@ efi_snp_driver_start ( EFI_DRIVER_BINDING_PROTOCOL *driver,
        if ( ( efirc = bs->CreateEvent ( EVT_NOTIFY_WAIT, TPL_NOTIFY,
                                         efi_snp_wait_for_packet, snpdev,
                                         &snpdev->snp.WaitForPacket ) ) != 0 ){
-               DBGC ( snpdev, "SNPDEV %p could not create event: %x\n",
-                      snpdev, efirc );
+               DBGC ( snpdev, "SNPDEV %p could not create event: %s\n",
+                      snpdev, efi_strerror ( efirc ) );
                goto err_create_event;
        }
 
@@ -882,8 +883,8 @@ efi_snp_driver_start ( EFI_DRIVER_BINDING_PROTOCOL *driver,
        if ( ( efirc = bs->InstallProtocolInterface ( &device,
                                &efi_simple_network_protocol_guid,
                                EFI_NATIVE_INTERFACE, &snpdev->snp ) ) != 0 ) {
-               DBGC ( snpdev, "SNPDEV %p could not install protocol: %x\n",
-                      snpdev, efirc );
+               DBGC ( snpdev, "SNPDEV %p could not install protocol: %s\n",
+                      snpdev, efi_strerror ( efirc ) );
                goto err_install_protocol_interface;
        }
 
@@ -970,7 +971,7 @@ int efi_snp_install ( void ) {
                                        EFI_NATIVE_INTERFACE,
                                        driver ) ) != 0 ) {
                DBGC ( driver, "SNPDRV %p could not install driver binding: "
-                      "%x\n", driver, efirc );
+                      "%s\n", driver, efi_strerror ( efirc ) );
                return EFIRC_TO_RC ( efirc );
        }
 
diff --git a/src/interface/efi/efi_strerror.c b/src/interface/efi/efi_strerror.c
new file mode 100644 (file)
index 0000000..adfeaed
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <gpxe/efi/efi.h>
+
+/** @file
+ *
+ * gPXE error message formatting for EFI
+ *
+ */
+
+/**
+ * Format EFI status code
+ *
+ * @v efirc            EFI status code
+ * @v efi_strerror     EFI status code string
+ */
+const char * efi_strerror ( EFI_STATUS efirc ) {
+       static char errbuf[32];
+
+       if ( ! efirc )
+               return "No error";
+
+       snprintf ( errbuf, sizeof ( errbuf ), "Error %lld",
+                  ( unsigned long long ) ( efirc ^ MAX_BIT ) );
+       return errbuf;
+}
index 6621177..d1ba43a 100644 (file)
@@ -53,8 +53,8 @@ static void efi_udelay ( unsigned long usecs ) {
        EFI_STATUS efirc;
 
        if ( ( efirc = bs->Stall ( usecs ) ) != 0 ) {
-               DBG ( "EFI could not delay for %ldus: %x\n",
-                     usecs, efirc );
+               DBG ( "EFI could not delay for %ldus: %s\n",
+                     usecs, efi_strerror ( efirc ) );
                /* Probably screwed */
        }
 }
@@ -71,7 +71,8 @@ static unsigned long efi_currticks ( void ) {
        /* Read CPU timer 0 (TSC) */
        if ( ( efirc = cpu_arch->GetTimerValue ( cpu_arch, 0, &time,
                                                 NULL ) ) != 0 ) {
-               DBG ( "EFI could not read CPU timer: %x\n", efirc );
+               DBG ( "EFI could not read CPU timer: %s\n",
+                     efi_strerror ( efirc ) );
                /* Probably screwed */
                return -1UL;
        }
index 531a1c3..4de3789 100644 (file)
@@ -56,8 +56,8 @@ static userptr_t efi_urealloc ( userptr_t old_ptr, size_t new_size ) {
                                                   EfiBootServicesData,
                                                   new_pages,
                                                   &phys_addr ) ) != 0 ) {
-                       DBG ( "EFI could not allocate %d pages: %x\n",
-                             new_pages, efirc );
+                       DBG ( "EFI could not allocate %d pages: %s\n",
+                             new_pages, efi_strerror ( efirc ) );
                        return UNULL;
                }
                assert ( phys_addr != 0 );
@@ -81,8 +81,8 @@ static userptr_t efi_urealloc ( userptr_t old_ptr, size_t new_size ) {
                old_pages = ( EFI_SIZE_TO_PAGES ( old_size ) + 1 );
                phys_addr = user_to_phys ( old_ptr, -EFI_PAGE_SIZE );
                if ( ( efirc = bs->FreePages ( phys_addr, old_pages ) ) != 0 ){
-                       DBG ( "EFI could not free %d pages at %llx: %x\n",
-                             old_pages, phys_addr, efirc );
+                       DBG ( "EFI could not free %d pages at %llx: %s\n",
+                             old_pages, phys_addr, efi_strerror ( efirc ) );
                        /* Not fatal; we have leaked memory but successfully
                         * allocated (if asked to do so).
                         */