efi_loader: Change return type of efi_add_memory_map()
authorBryan O'Donoghue <pure.logic@nexus-software.ie>
Mon, 15 Jul 2019 11:00:39 +0000 (12:00 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 16 Jul 2019 22:17:17 +0000 (22:17 +0000)
We currently have some inconsistent use of efi_add_memory_map()
throughout the code. In particular the return value of efi_add_memory_map()
is not interpreted the same way by various users in the codebase.

This patch does the following:

- Changes efi_add_memory_map() to return efi_status_t.
- Adds a method description to efi_add_memory_map().
- Changes efi_add_memory_map() to return EFI_SUCCESS
- Returns non-zero for error in efi_add_memory_map()
- Updates efi_allocate_pages() to new efi_add_memory_map()
- Updates efi_free_pages() to new efi_add_memory_map()
- Updates efi_carve_out_dt_rsv() to new efi_add_memory_map()
- Updates efi_add_runtime_mmio()  to new efi_add_memory_map()

Fixes: 5d00995c361c ("efi_loader: Implement memory allocation and map")
Fixes: 74c16acce30b ("efi_loader: Don't allocate from memory holes")
Suggested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Cc: Alexander Graf <agraf@csgraf.de>
Signed-off-by: Bryan O'Donoghue <pure.logic@nexus-software.ie>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
cmd/bootefi.c
include/efi_loader.h
lib/efi_loader/efi_memory.c
lib/efi_loader/efi_runtime.c

index c19256e00dc9bff711e45d5dd65311a736c27dbe..04d3e3e4a72edf7330be6bb5ebf503c53a4bcad4 100644 (file)
@@ -169,8 +169,8 @@ static void efi_carve_out_dt_rsv(void *fdt)
 
                pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
                addr &= ~EFI_PAGE_MASK;
-               if (!efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
-                                       false))
+               if (efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
+                                      false) != EFI_SUCCESS)
                        printf("FDT memrsv map %d: Failed to add to map\n", i);
        }
 }
index db4763fc9b768924d53c90bafd5d1ae4f72ab2d7..6cc6a3835c9976021ddda2cbd4b4613b8a75e741 100644 (file)
@@ -476,8 +476,8 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
                                efi_uintn_t *descriptor_size,
                                uint32_t *descriptor_version);
 /* Adds a range into the EFI memory map */
-uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
-                           bool overlap_only_ram);
+efi_status_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
+                               bool overlap_only_ram);
 /* Called by board init to initialize the EFI drivers */
 efi_status_t efi_driver_init(void);
 /* Called by board init to initialize the EFI memory map */
index 27379381e874c36a671d776b433d05d0c949ae28..4c0216b1d245a1a8914d34a6f3c83a7093adab05 100644 (file)
@@ -223,8 +223,17 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map,
        return EFI_CARVE_LOOP_AGAIN;
 }
 
-uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
-                           bool overlap_only_ram)
+/**
+ * efi_add_memory_map() - add memory area to the memory map
+ *
+ * @start:             start address, must be a multiple of EFI_PAGE_SIZE
+ * @pages:             number of pages to add
+ * @memory_type:       type of memory added
+ * @overlap_only_ram:  the memory area must overlap existing
+ * Return:             status code
+ */
+efi_status_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
+                               bool overlap_only_ram)
 {
        struct list_head *lhandle;
        struct efi_mem_list *newlist;
@@ -239,7 +248,7 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
                return EFI_INVALID_PARAMETER;
 
        if (!pages)
-               return start;
+               return EFI_SUCCESS;
 
        ++efi_memory_map_key;
        newlist = calloc(1, sizeof(*newlist));
@@ -277,7 +286,7 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
                                 * The user requested to only have RAM overlaps,
                                 * but we hit a non-RAM region. Error out.
                                 */
-                               return 0;
+                               return EFI_NO_MAPPING;
                        case EFI_CARVE_NO_OVERLAP:
                                /* Just ignore this list entry */
                                break;
@@ -307,7 +316,7 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
                 * The payload wanted to have RAM overlaps, but we overlapped
                 * with an unallocated region. Error out.
                 */
-               return 0;
+               return EFI_NO_MAPPING;
        }
 
        /* Add our new map */
@@ -326,7 +335,7 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
                }
        }
 
-       return start;
+       return EFI_SUCCESS;
 }
 
 /**
@@ -455,7 +464,7 @@ efi_status_t efi_allocate_pages(int type, int memory_type,
        }
 
        /* Reserve that map in our memory maps */
-       if (efi_add_memory_map(addr, pages, memory_type, true) != addr)
+       if (efi_add_memory_map(addr, pages, memory_type, true) != EFI_SUCCESS)
                /* Map would overlap, bail out */
                return  EFI_OUT_OF_RESOURCES;
 
@@ -487,7 +496,6 @@ void *efi_alloc(uint64_t len, int memory_type)
  */
 efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
 {
-       uint64_t r = 0;
        efi_status_t ret;
 
        ret = efi_check_allocated(memory, true);
@@ -501,13 +509,13 @@ efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
                return EFI_INVALID_PARAMETER;
        }
 
-       r = efi_add_memory_map(memory, pages, EFI_CONVENTIONAL_MEMORY, false);
+       ret = efi_add_memory_map(memory, pages, EFI_CONVENTIONAL_MEMORY, false);
        /* Merging of adjacent free regions is missing */
 
-       if (r == memory)
-               return EFI_SUCCESS;
+       if (ret != EFI_SUCCESS)
+               return EFI_NOT_FOUND;
 
-       return EFI_NOT_FOUND;
+       return ret;
 }
 
 /**
index 9f4ba2f9772da98a728c2b669cf1039df9266316..8b56ab0207cebaa50b5eafea4cc66e904f0d455f 100644 (file)
@@ -694,10 +694,10 @@ efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len)
        struct efi_runtime_mmio_list *newmmio;
        u64 pages = (len + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
        uint64_t addr = *(uintptr_t *)mmio_ptr;
-       uint64_t retaddr;
+       efi_status_t ret;
 
-       retaddr = efi_add_memory_map(addr, pages, EFI_MMAP_IO, false);
-       if (retaddr != addr)
+       ret = efi_add_memory_map(addr, pages, EFI_MMAP_IO, false);
+       if (ret != EFI_SUCCESS)
                return EFI_OUT_OF_RESOURCES;
 
        newmmio = calloc(1, sizeof(*newmmio));