On 04/08/15 09:11, Ard Biesheuvel wrote: > This updates ArmVirtualizationMemoryInitPeiLib so that the PEI memory > region, i.e., the region that is used both before and after the MMU > and caches are enabled, is invalidated by virtual address before > enabling the MMU. > > This prevents issues where data we modified with the caches and MMU > off may be shadowed by clean cachelines in system caches or in lower > level caches on other CPUs, resulting in the this data to become > invisible once we turn the MMU and caches on. > > Also reduce the size of the region to 16 MB (from 64 MB), to reduce > the potential performance hit from invalidating the entire region by > virtual address. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org> > --- > ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc > | 4 ++-- > ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.dsc > | 4 ++-- > > ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.c > | 10 ++++++++++ > > ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.inf > | 1 + > 4 files changed, 15 insertions(+), 4 deletions(-) > > diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc > b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc > index cad7353442f7..0b9a46f0197f 100644 > --- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc > +++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc > @@ -103,8 +103,8 @@ > gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase|0x4007c000 > gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize|0x4000 > > - # Size of the region used by UEFI in permanent memory (Reserved 64MB) > - gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x04000000 > + # Size of the region used by UEFI in permanent memory (Reserved 16MB) > + gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x01000000 > > # > # ARM Pcds > diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.dsc > b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.dsc > index d01b3e9c8494..71869845a857 100644 > --- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.dsc > +++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.dsc > @@ -89,8 +89,8 @@ > > gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize|0x4000 > > - # Size of the region used by UEFI in permanent memory (Reserved 64MB) > - gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x04000000 > + # Size of the region used by UEFI in permanent memory (Reserved 16MB) > + gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x01000000 > > # > # ARM Virtual Architectural Timer > diff --git > a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.c > > b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.c > index 5f6cd059c47f..8ce63b4596e2 100644 > --- > a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.c > +++ > b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.c > @@ -20,6 +20,7 @@ > #include <Library/HobLib.h> > #include <Library/MemoryAllocationLib.h> > #include <Library/PcdLib.h> > +#include <Library/CacheMaintenanceLib.h> > > VOID > BuildMemoryTypeInformationHob ( > @@ -79,6 +80,15 @@ MemoryPeim ( > PcdGet64 (PcdSystemMemorySize) > ); > > + // > + // When running under virtualization, the PI/UEFI memory region may be > + // clean but not invalidated in system caches or in lower level caches > + // on other CPUs. So invalidate the region by virtual address, to ensure > + // that the contents we put there with the caches and MMU off will still > + // be visible after turning them on. > + // > + InvalidateDataCacheRange ((VOID*)(UINTN)UefiMemoryBase, UefiMemorySize); > + > // Build Memory Allocation Hob > InitMmu (); > > diff --git > a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.inf > > b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.inf > index fcdae06de7c2..b8a19c993d91 100644 > --- > a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.inf > +++ > b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.inf > @@ -35,6 +35,7 @@ > HobLib > ArmLib > ArmPlatformLib > + CacheMaintenanceLib > > [Guids] > gEfiMemoryTypeInformationGuid >
Unfortunately, although I theoretically verified the correctness of this patch (by eyeballing), in practice 16 MB is not enough for the DXE Initial Program Load PEIM, in the QEMU build: > Loading PEIM at 0x000BFF4B160 EntryPoint=0x000BFF4B260 DxeIpl.efi > Install PPI: [LzmaCustomDecompress] > Install PPI: [EfiDxeIplPpi] > Install PPI: [EfiPeiDecompressPpi] > Customized Guided section Memory Size required is 0x90ECD0 and address > is 0xBF62B000 > AllocatePages failed: No 0x90F Pages is available. > There is only left 0x608 pages memory resource to be allocated. > Out of memory resource! > AllocatePages failed: No 0x90F Pages is available. > There is only left 0x608 pages memory resource to be allocated. > Out of memory resource! > DXE IPL Entry > > ASSERT_EFI_ERROR (Status = Not Found) > ASSERT MdeModulePkg/Core/DxeIplPeim/DxeLoad.c(399): !EFI_ERROR > (Status) If I set PcdSystemMemoryUefiRegionSize to 32MB (0x02000000) in "ArmVirtualizationQemu.dsc", then the error disappears, and then the patchset even helps the QEMU build -- I can then boot the ArmVirtualizationQemu binary on Seattle (KVM) too, not just on Mustang. (Otherwise, without the patch series, ArmVirtualizationQemu hangs on Seattle, after printing the following message: > Loading PEIM at 0x000BFF89160 EntryPoint=0x000BFF89260 CpuPei.efi ) So, the cache invalidation certainly seems beneficial for even the QEMU build, but I'm now doubting if we should decrease PcdSystemMemoryUefiRegionSize *for that build* at all. The commit message says "potential performance hit" -- I'd say until we get hard numbers or complaints that performance is bad, let's just drop the "ArmVirtualizationQemu.dsc" hunk. Even if there's some penalty, it's one time only. Thanks Laszlo ------------------------------------------------------------------------------ BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT Develop your own process in accordance with the BPMN 2 standard Learn Process modeling best practices with Bonita BPM through live exercises http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_ source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel