From bb52ec2d6b76b043cd70f277887519f09f36b55a Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Tue, 28 Feb 2017 12:13:10 +0000 Subject: [PATCH] ArmPkg/UncachedMemoryAllocationLib: restore mapping attributes after free In order to play nice with platforms that use strict memory permission policies, restore the original mapping attributes when freeing uncached allocations. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel Reviewed-by: Leif Lindholm --- .../UncachedMemoryAllocationLib.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c index f6c692f9a4..cd13a7da92 100644 --- a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c +++ b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c @@ -42,11 +42,6 @@ UncachedInternalAllocateAlignedPages ( -// -// Assume all of memory has the same cache attributes, unless we do our magic -// -UINT64 gAttributes; - typedef struct { EFI_PHYSICAL_ADDRESS Base; VOID *Allocation; @@ -54,6 +49,7 @@ typedef struct { EFI_MEMORY_TYPE MemoryType; BOOLEAN Allocated; LIST_ENTRY Link; + UINT64 Attributes; } FREE_PAGE_NODE; STATIC LIST_ENTRY mPageList = INITIALIZE_LIST_HEAD_VARIABLE (mPageList); @@ -153,10 +149,7 @@ AllocatePagesFromList ( } Status = gDS->GetMemorySpaceDescriptor (Memory, &Descriptor); - if (!EFI_ERROR (Status)) { - // We are making an assumption that all of memory has the same default attributes - gAttributes = Descriptor.Attributes; - } else { + if (EFI_ERROR (Status)) { gBS->FreePages (Memory, Pages); return Status; } @@ -181,6 +174,7 @@ AllocatePagesFromList ( NewNode->Pages = Pages; NewNode->Allocated = TRUE; NewNode->MemoryType = MemoryType; + NewNode->Attributes = Descriptor.Attributes; InsertTailList (&mPageList, &NewNode->Link); @@ -266,6 +260,10 @@ UncachedMemoryAllocationLibDestructor ( // We only free the non-allocated buffer if (OldNode->Allocated == FALSE) { gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)OldNode->Base, OldNode->Pages); + + gDS->SetMemorySpaceAttributes ((EFI_PHYSICAL_ADDRESS)(UINTN)OldNode->Base, + EFI_PAGES_TO_SIZE (OldNode->Pages), OldNode->Attributes); + RemoveEntryList (&OldNode->Link); FreePool (OldNode); } -- 2.39.2