From 7427dd3fc0288a96704b4f98336d7f3ad0cd52ac Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Mon, 17 Jul 2023 14:21:15 +0530 Subject: [PATCH] OvmfPkg/RiscVVirt: Check "no-map" and mark EfiReservedMemoryType OpenSBI now marks PMP regions with "no-map" attribute. So, remove the workaround and add the ReservedMemory only when no-map is set so that it follows DT spec. Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Jordan Justen Cc: Gerd Hoffmann Cc: Andrei Warkentin Signed-off-by: Sunil V L Reviewed-by: Ranbir Singh --- OvmfPkg/RiscVVirt/Sec/Memory.c | 37 ++++++++++++++++------------------ 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/OvmfPkg/RiscVVirt/Sec/Memory.c b/OvmfPkg/RiscVVirt/Sec/Memory.c index aad71ee5dc..7c6d920bd2 100644 --- a/OvmfPkg/RiscVVirt/Sec/Memory.c +++ b/OvmfPkg/RiscVVirt/Sec/Memory.c @@ -141,21 +141,10 @@ GetNumCells ( /** Mark reserved memory ranges in the EFI memory map - The M-mode firmware ranges should not be used by the - EDK2/OS. These ranges are passed via device tree using reserved - memory nodes. Parse the DT and mark those ranges as of - type EfiReservedMemoryType. - - NOTE: Device Tree spec section 3.5.4 says reserved memory regions - without no-map property should be installed as EfiBootServicesData. - As per UEFI spec, memory of type EfiBootServicesData can be used - by the OS after ExitBootServices(). - This is not an issue for DT since OS can parse the DT also along - with EFI memory map and avoid using these ranges. But with ACPI, - there is no such mechanisms possible. - Since EDK2 needs to support both DT and ACPI, we are deviating - from the DT spec and marking all reserved memory ranges as - EfiReservedMemoryType itself irrespective of no-map. + * As per DT spec v0.4 Section 3.5.4, + * "Reserved regions with the no-map property must be listed in the + * memory map with type EfiReservedMemoryType. All other reserved + * regions must be listed with type EfiBootServicesData." @param FdtPointer Pointer to FDT @@ -228,11 +217,19 @@ AddReservedMemoryMap ( Size )); - BuildMemoryAllocationHob ( - Addr, - Size, - EfiReservedMemoryType - ); + if (fdt_getprop (FdtPointer, SubNode, "no-map", &Len)) { + BuildMemoryAllocationHob ( + Addr, + Size, + EfiReservedMemoryType + ); + } else { + BuildMemoryAllocationHob ( + Addr, + Size, + EfiBootServicesData + ); + } } } }