[PATCH] efi_loader: Omit memory with "no-map" when returning memory map.

Kristian Amlie kristian.amlie at northern.tech
Fri Aug 27 09:55:05 CEST 2021


efi_reserve_memory() states that memory marked with "no-map" shall not
be accessed by the UEFI payload. Make sure efi_get_memory_map() honors
this.

This helps the case when booting vexpress_ca9x4 under QEMU. Because
the kernel wants to use an address in the lowest 128MiB of the range,
but this range is reserved with "no-map", the kernel complains that it
can not allocate the low memory it needs. In reality the actual usable
memory starts much higher, which is reflected correctly in the memory
map after this fix.

Signed-off-by: Kristian Amlie <kristian.amlie at northern.tech>
---
 lib/efi_loader/efi_memory.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
index f4acbee4f9..7f8543143a 100644
--- a/lib/efi_loader/efi_memory.c
+++ b/lib/efi_loader/efi_memory.c
@@ -646,8 +646,16 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
 
 	provided_map_size = *memory_map_size;
 
-	list_for_each(lhandle, &efi_mem)
+	list_for_each(lhandle, &efi_mem) {
+		struct efi_mem_list *lmem;
+
+		lmem = list_entry(lhandle, struct efi_mem_list, link);
+
+		if (lmem->desc.type == EFI_RESERVED_MEMORY_TYPE)
+			continue;
+
 		map_entries++;
+	}
 
 	map_size = map_entries * sizeof(struct efi_mem_desc);
 
@@ -672,6 +680,10 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
 		struct efi_mem_list *lmem;
 
 		lmem = list_entry(lhandle, struct efi_mem_list, link);
+
+		if (lmem->desc.type == EFI_RESERVED_MEMORY_TYPE)
+			continue;
+
 		*memory_map = lmem->desc;
 		memory_map--;
 	}
-- 
2.17.1



More information about the U-Boot mailing list