It is implied that the memory returned from UncachedMemoryAllocationLib should have cache cleaned. So we clean and invalidate memory range after changing memory attribute to uncached.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Heyi Guo <[email protected]> Cc: Leif Lindholm <[email protected]> Cc: Ard Biesheuvel <[email protected]> --- .../Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c | 3 +++ .../UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf | 1 + 2 files changed, 4 insertions(+) diff --git a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c index b859f63..3242579 100644 --- a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c +++ b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c @@ -25,6 +25,7 @@ #include <Library/PcdLib.h> #include <Library/ArmLib.h> #include <Library/DxeServicesTableLib.h> +#include <Library/CacheMaintenanceLib.h> VOID * UncachedInternalAllocatePages ( @@ -165,6 +166,8 @@ AllocatePagesFromList ( return Status; } + WriteBackInvalidateDataCacheRange ((VOID *)(UINTN)Memory, EFI_PAGES_TO_SIZE (Pages)); + NewNode = AllocatePool (sizeof (FREE_PAGE_NODE)); if (NewNode == NULL) { ASSERT (FALSE); diff --git a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf index 0a0b6cb..d7a0f2f 100644 --- a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf +++ b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf @@ -38,6 +38,7 @@ MemoryAllocationLib PcdLib DxeServicesTableLib + CacheMaintenanceLib [Pcd] gArmTokenSpaceGuid.PcdArmFreeUncachedMemorySizeThreshold -- 2.6.2 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

