[U-Boot] [PATCH v2 5/9] efi_loader: correct efi_add_known_memory()

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Nov 12 17:55:24 UTC 2018


If a memory bank is not EFI_PAGE_SIZE aligned efi_add_known_memory() the
number of memory pages may be incorrectly calculated.

We have to round up the start address and to round down the end address
to determine which complete pages are provided by the memory bank.

Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
v2:
	no change
---
 lib/efi_loader/efi_memory.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
index c0277355056..490e4921cce 100644
--- a/lib/efi_loader/efi_memory.c
+++ b/lib/efi_loader/efi_memory.c
@@ -563,13 +563,21 @@ __weak void efi_add_known_memory(void)
 
 	/* Add RAM */
 	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
-		u64 ram_start = gd->bd->bi_dram[i].start;
-		u64 ram_size = gd->bd->bi_dram[i].size;
-		u64 start = (ram_start + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
-		u64 pages = (ram_size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
+		u64 ram_end, ram_start, pages;
 
-		efi_add_memory_map(start, pages, EFI_CONVENTIONAL_MEMORY,
-				   false);
+		ram_start = gd->bd->bi_dram[i].start;
+		ram_end = ram_start + gd->bd->bi_dram[i].size;
+
+		/* Remove partial pages */
+		ram_end &= ~EFI_PAGE_MASK;
+		ram_start = (ram_start + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
+
+		if (ram_end > ram_start) {
+			pages = (ram_end - ram_start) >> EFI_PAGE_SHIFT;
+
+			efi_add_memory_map(ram_start, pages,
+					   EFI_CONVENTIONAL_MEMORY, false);
+		}
 	}
 }
 
-- 
2.19.1



More information about the U-Boot mailing list