]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmVirtPkg/ArmVirtPlatformLib: reduce ID map size to GCD region size
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 24 Nov 2015 07:44:41 +0000 (07:44 +0000)
committerabiesheuvel <abiesheuvel@Edk2>
Tue, 24 Nov 2015 07:44:41 +0000 (07:44 +0000)
The ID mapping routines on virtual platforms simply map the entire
hardware supported physical 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.
This makes sense by itself, since we cannot manipulate mappings above
that limit anwyay (because they are not covered by GCD), and it allows
the PCD be set to a lower value by platforms whose (I)PA space is
smaller than the hardware supported maximum.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Wei Huang <wei@redhat.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18929 6f19259b-4bc3-4df7-8a09-765794883524

ArmVirtPkg/Library/ArmVirtPlatformLib/ArmVirtPlatformLib.inf
ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c

index 22ee3625c37ae7719d7d9d20e00dd6fb8bc3a702..3cb3fb1f3aeac728f63aa1b59e3d76efb59e0169 100644 (file)
@@ -61,3 +61,4 @@
   gArmTokenSpaceGuid.PcdArmPrimaryCore\r
   gArmTokenSpaceGuid.PcdFdBaseAddress\r
   gArmTokenSpaceGuid.PcdFdSize\r
+  gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize\r
index 530f7d608e0b589fd780728157cd8404a2533247..e5536ecd8e286a7d93319a785e12f2db6c60ed3a 100644 (file)
@@ -97,7 +97,9 @@ ArmPlatformGetVirtualMemoryMap (
   // Peripheral space after DRAM\r
   VirtualMemoryTable[2].PhysicalBase = VirtualMemoryTable[0].Length + VirtualMemoryTable[1].Length;\r
   VirtualMemoryTable[2].VirtualBase  = VirtualMemoryTable[2].PhysicalBase;\r
-  VirtualMemoryTable[2].Length       = ArmGetPhysAddrTop () - VirtualMemoryTable[2].PhysicalBase;\r
+  VirtualMemoryTable[2].Length       = MIN (1ULL << FixedPcdGet8 (PcdPrePiCpuMemorySize),\r
+                                         ArmGetPhysAddrTop ()) -\r
+                                       VirtualMemoryTable[2].PhysicalBase;\r
   VirtualMemoryTable[2].Attributes   = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;\r
 \r
   // Remap the FD region as normal executable memory\r