[U-Boot] [PATCH] efi_loader: Reserve unaccessible memory

Alexander Graf agraf at suse.de
Thu Nov 29 23:47:51 UTC 2018


On some systems, not all RAM may be usable within U-Boot. Maybe the
memory maps are incomplete, maybe it's used as workaround for broken
DMA. But whatever the reason may be, a platform can say that it does
not wish to have its RAM accessed above a certain address by defining
board_get_usable_ram_top().

In the efi_loader world, we ignored that hint, mostly because very few
boards actually have real restrictions around this.

So let's honor the board's wish to not access high addresses during
boot time. The best way to do so is by indicating the respective pages
as "allocated by firmware". That way, Operating Systems will still
use the pages after boot, but before boot no allocation will use them.

Reported-by: Baruch Siach <baruch at tkos.co.il>
Signed-off-by: Alexander Graf <agraf at suse.de>
---
 include/common.h            | 11 +++++++++++
 lib/efi_loader/efi_memory.c |  9 +++++++++
 2 files changed, 20 insertions(+)

diff --git a/include/common.h b/include/common.h
index 3f69943887..8f295c2f30 100644
--- a/include/common.h
+++ b/include/common.h
@@ -106,6 +106,17 @@ int mdm_init(void);
 void board_show_dram(phys_size_t size);
 
 /**
+ * Get the uppermost pointer that is valid to access
+ *
+ * Some systems may not map all of their address space. This function allows
+ * boards to indicate what their highest support pointer value is for DRAM
+ * access.
+ *
+ * @param total_size	Size of U-Boot (unused?)
+ */
+ulong board_get_usable_ram_top(ulong total_size);
+
+/**
  * arch_fixup_fdt() - Write arch-specific information to fdt
  *
  * Defined in arch/$(ARCH)/lib/bootm-fdt.c
diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
index f225a9028c..2f13bf8a75 100644
--- a/lib/efi_loader/efi_memory.c
+++ b/lib/efi_loader/efi_memory.c
@@ -551,6 +551,7 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
 
 __weak void efi_add_known_memory(void)
 {
+	u64 ram_top = board_get_usable_ram_top(0) & ~EFI_PAGE_MASK;
 	int i;
 
 	/* Add RAM */
@@ -570,6 +571,14 @@ __weak void efi_add_known_memory(void)
 			efi_add_memory_map(ram_start, pages,
 					   EFI_CONVENTIONAL_MEMORY, false);
 		}
+
+		/* Reserve memory above ram_top, as that may not be mapped */
+		if ((ram_top >= ram_start) && (ram_top < ram_end)) {
+			pages = (ram_end - ram_top) >> EFI_PAGE_SHIFT;
+
+			efi_add_memory_map(ram_top, pages,
+					   EFI_BOOT_SERVICES_DATA, true);
+		}
 	}
 }
 
-- 
2.12.3



More information about the U-Boot mailing list