From: Alexander Graf Date: Mon, 11 Apr 2016 21:51:02 +0000 (+0200) Subject: efi_loader: Expose ascending efi memory map X-Git-Tag: v2016.05-rc2~26 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=cee752fa8dcf3b589baf7141011675a0c3f2ded6;p=u-boot efi_loader: Expose ascending efi memory map The EFI memory map does not need to be in a strict order, but 32bit grub2 does expect it to be ascending. If it's not, it may try to allocate memory inside the U-Boot data memory region. We already sort the memory map in descending order, so let's just reverse it when we pass it to a payload. Signed-off-by: Alexander Graf Tested-by: Andreas Färber --- diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c index 8a1e249430..df995858ed 100644 --- a/lib/efi_loader/efi_memory.c +++ b/lib/efi_loader/efi_memory.c @@ -286,10 +286,13 @@ efi_status_t efi_get_memory_map(unsigned long *memory_map_size, uint32_t *descriptor_version) { ulong map_size = 0; + int map_entries = 0; struct list_head *lhandle; list_for_each(lhandle, &efi_mem) - map_size += sizeof(struct efi_mem_desc); + map_entries++; + + map_size = map_entries * sizeof(struct efi_mem_desc); *memory_map_size = map_size; @@ -301,12 +304,14 @@ efi_status_t efi_get_memory_map(unsigned long *memory_map_size, /* Copy list into array */ if (memory_map) { + /* Return the list in ascending order */ + memory_map = &memory_map[map_entries - 1]; list_for_each(lhandle, &efi_mem) { struct efi_mem_list *lmem; lmem = list_entry(lhandle, struct efi_mem_list, link); *memory_map = lmem->desc; - memory_map++; + memory_map--; } }