
If a reserved memory node in the device tree has the property no-map, remove it from the UEFI memory map provided by GetMemoryMap().
Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de --- cmd/bootefi.c | 34 ++++++++++++++++++++++++++++------ include/efi.h | 3 +++ lib/efi_loader/efi_memory.c | 7 +++++-- 3 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 40d5ef2b3a..f173105251 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -135,12 +135,29 @@ done: return ret; }
-static void efi_reserve_memory(u64 addr, u64 size) +/** + * efi_reserve_memory() - add reserved memory to memory map + * + * @addr: start address of the reserved memory range + * @size: size of the reserved memory range + * @nomap: indicates that the memory range shall be hidden from the memory + * map + */ +static void efi_reserve_memory(u64 addr, u64 size, bool nomap) { + int type; + efi_uintn_t ret; + /* Convert from sandbox address space. */ addr = (uintptr_t)map_sysmem(addr, 0); - if (efi_add_memory_map(addr, size, - EFI_RESERVED_MEMORY_TYPE) != EFI_SUCCESS) + + if (nomap) + type = EFI_NO_MAP_MEMORY; + else + type = EFI_RESERVED_MEMORY_TYPE; + + ret = efi_add_memory_map(addr, size, type); + if (ret != EFI_SUCCESS) log_err("Reserved memory mapping failed addr %llx size %llx\n", addr, size); } @@ -166,7 +183,7 @@ static void efi_carve_out_dt_rsv(void *fdt) for (i = 0; i < nr_rsv; i++) { if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0) continue; - efi_reserve_memory(addr, size); + efi_reserve_memory(addr, size, false); }
/* process reserved-memory */ @@ -186,8 +203,13 @@ static void efi_carve_out_dt_rsv(void *fdt) * a size instead of a reg property. */ if (fdt_addr != FDT_ADDR_T_NONE && - fdtdec_get_is_enabled(fdt, subnode)) - efi_reserve_memory(fdt_addr, fdt_size); + fdtdec_get_is_enabled(fdt, subnode)) { + bool nomap; + + nomap = !!fdt_getprop(fdt, subnode, "no-map", + NULL); + efi_reserve_memory(fdt_addr, fdt_size, nomap); + } subnode = fdt_next_subnode(fdt, subnode); } } diff --git a/include/efi.h b/include/efi.h index f986aad877..50190021ef 100644 --- a/include/efi.h +++ b/include/efi.h @@ -181,6 +181,9 @@ enum efi_mem_type {
EFI_MAX_MEMORY_TYPE, EFI_TABLE_END, /* For efi_build_mem_table() */ + + /* Memory that shall not be mapped */ + EFI_NO_MAP_MEMORY, };
/* Attribute values */ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c index 7be756e370..d156b9533c 100644 --- a/lib/efi_loader/efi_memory.c +++ b/lib/efi_loader/efi_memory.c @@ -251,7 +251,7 @@ static efi_status_t efi_add_memory_map_pg(u64 start, u64 pages, EFI_PRINT("%s: 0x%llx 0x%llx %d %s\n", __func__, start, pages, memory_type, overlap_only_ram ? "yes" : "no");
- if (memory_type >= EFI_MAX_MEMORY_TYPE) + if (memory_type >= EFI_MAX_MEMORY_TYPE && memory_type != EFI_NO_MAP_MEMORY) return EFI_INVALID_PARAMETER;
if (!pages) @@ -327,7 +327,10 @@ static efi_status_t efi_add_memory_map_pg(u64 start, u64 pages, }
/* Add our new map */ - list_add_tail(&newlist->link, &efi_mem); + if (memory_type == EFI_NO_MAP_MEMORY) + free(newlist); + else + list_add_tail(&newlist->link, &efi_mem);
/* And make sure memory is listed in descending order */ efi_mem_sort(); -- 2.28.0