The ID mapping routines on virtual platforms simply map the entire
address space as device memory, and then punch some holes for regions
that need to be mapped cacheable. On virtual platforms hosted on CPUs
that support a large physical address range, this may result in a lot
of overhead, i.e., 4 KB of page tables for each 512 GB of address
space, which quickly adds up (i.e. 2 MB for the architectural maximum
of 48 bits).

Since there may be a platform specific limit to the size of the (I)PA
space that is not reflected by CPU id registers, restrict the range of
the ID mapping to gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize bits,
since we cannot manipulate mappings above that limit anwyay (because
they are not covered by GCD). This allows the PCD to be set by platforms
whose (I)PA space has a fixed limit.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
---
 ArmVirtPkg/Library/ArmVirtPlatformLib/ArmVirtPlatformLib.inf | 1 +
 ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c              | 4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/ArmVirtPkg/Library/ArmVirtPlatformLib/ArmVirtPlatformLib.inf 
b/ArmVirtPkg/Library/ArmVirtPlatformLib/ArmVirtPlatformLib.inf
index 22ee3625c37a..3cb3fb1f3aea 100644
--- a/ArmVirtPkg/Library/ArmVirtPlatformLib/ArmVirtPlatformLib.inf
+++ b/ArmVirtPkg/Library/ArmVirtPlatformLib/ArmVirtPlatformLib.inf
@@ -61,3 +61,4 @@ [FixedPcd]
   gArmTokenSpaceGuid.PcdArmPrimaryCore
   gArmTokenSpaceGuid.PcdFdBaseAddress
   gArmTokenSpaceGuid.PcdFdSize
+  gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize
diff --git a/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c 
b/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c
index 530f7d608e0b..e5536ecd8e28 100644
--- a/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c
+++ b/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c
@@ -97,7 +97,9 @@ ArmPlatformGetVirtualMemoryMap (
   // Peripheral space after DRAM
   VirtualMemoryTable[2].PhysicalBase = VirtualMemoryTable[0].Length + 
VirtualMemoryTable[1].Length;
   VirtualMemoryTable[2].VirtualBase  = VirtualMemoryTable[2].PhysicalBase;
-  VirtualMemoryTable[2].Length       = ArmGetPhysAddrTop () - 
VirtualMemoryTable[2].PhysicalBase;
+  VirtualMemoryTable[2].Length       = MIN (1ULL << FixedPcdGet8 
(PcdPrePiCpuMemorySize),
+                                         ArmGetPhysAddrTop ()) -
+                                       VirtualMemoryTable[2].PhysicalBase;
   VirtualMemoryTable[2].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
 
   // Remap the FD region as normal executable memory
-- 
1.9.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to