MdeModulePkg DxeCore: Return memory type from internal free pool/pages

The following patch for MemoryAttributesTable will need the memory type.
And CoreUpdateProfile() can also use the memory type for check.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
Star Zeng
2016-04-11 11:00:47 +08:00
parent 2bfac751a7
commit 925f0d1ae1
5 changed files with 34 additions and 59 deletions

View File

@@ -112,6 +112,7 @@ CoreAllocatePoolI (
Caller must have the memory lock held
@param Buffer The allocated pool entry to free
@param PoolType Pointer to pool type
@retval EFI_INVALID_PARAMETER Buffer not valid
@retval EFI_SUCCESS Buffer successfully freed.
@@ -119,7 +120,8 @@ CoreAllocatePoolI (
**/
EFI_STATUS
CoreFreePoolI (
IN VOID *Buffer
IN VOID *Buffer,
OUT EFI_MEMORY_TYPE *PoolType OPTIONAL
);

View File

@@ -1,7 +1,7 @@
/** @file
Support routines for UEFI memory profile.
Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -730,7 +730,7 @@ UnregisterMemoryProfileImage (
//
// Use CoreInternalFreePool() that will not update profile for this FreePool action.
//
CoreInternalFreePool (DriverInfoData);
CoreInternalFreePool (DriverInfoData, NULL);
}
return TRUE;
@@ -1083,7 +1083,7 @@ CoreUpdateProfileFree (
//
// Use CoreInternalFreePool() that will not update profile for this FreePool action.
//
CoreInternalFreePool (AllocInfoData);
CoreInternalFreePool (AllocInfoData, NULL);
return TRUE;
}

View File

@@ -1345,6 +1345,7 @@ CoreAllocatePages (
@param Memory Base address of memory being freed
@param NumberOfPages The number of pages to free
@param MemoryType Pointer to memory type
@retval EFI_NOT_FOUND Could not find the entry that covers the range
@retval EFI_INVALID_PARAMETER Address not aligned
@@ -1355,7 +1356,8 @@ EFI_STATUS
EFIAPI
CoreInternalFreePages (
IN EFI_PHYSICAL_ADDRESS Memory,
IN UINTN NumberOfPages
IN UINTN NumberOfPages,
OUT EFI_MEMORY_TYPE *MemoryType OPTIONAL
)
{
EFI_STATUS Status;
@@ -1403,6 +1405,10 @@ CoreInternalFreePages (
NumberOfPages += EFI_SIZE_TO_PAGES (Alignment) - 1;
NumberOfPages &= ~(EFI_SIZE_TO_PAGES (Alignment) - 1);
if (MemoryType != NULL) {
*MemoryType = Entry->Type;
}
Status = CoreConvertPages (Memory, NumberOfPages, EfiConventionalMemory);
if (EFI_ERROR (Status)) {
@@ -1432,9 +1438,10 @@ CoreFreePages (
IN UINTN NumberOfPages
)
{
EFI_STATUS Status;
EFI_STATUS Status;
EFI_MEMORY_TYPE MemoryType;
Status = CoreInternalFreePages (Memory, NumberOfPages);
Status = CoreInternalFreePages (Memory, NumberOfPages, &MemoryType);
if (!EFI_ERROR (Status)) {
CoreUpdateProfile ((EFI_PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS (0), MemoryProfileActionFreePages, (EFI_MEMORY_TYPE) 0, EFI_PAGES_TO_SIZE (NumberOfPages), (VOID *) (UINTN) Memory);
}

View File

@@ -459,6 +459,7 @@ Done:
Frees pool.
@param Buffer The allocated pool entry to free
@param PoolType Pointer to pool type
@retval EFI_INVALID_PARAMETER Buffer is not a valid value.
@retval EFI_SUCCESS Pool successfully freed.
@@ -467,7 +468,8 @@ Done:
EFI_STATUS
EFIAPI
CoreInternalFreePool (
IN VOID *Buffer
IN VOID *Buffer,
OUT EFI_MEMORY_TYPE *PoolType OPTIONAL
)
{
EFI_STATUS Status;
@@ -477,7 +479,7 @@ CoreInternalFreePool (
}
CoreAcquireMemoryLock ();
Status = CoreFreePoolI (Buffer);
Status = CoreFreePoolI (Buffer, PoolType);
CoreReleaseMemoryLock ();
return Status;
}
@@ -497,9 +499,10 @@ CoreFreePool (
IN VOID *Buffer
)
{
EFI_STATUS Status;
EFI_STATUS Status;
EFI_MEMORY_TYPE PoolType;
Status = CoreInternalFreePool (Buffer);
Status = CoreInternalFreePool (Buffer, &PoolType);
if (!EFI_ERROR (Status)) {
CoreUpdateProfile ((EFI_PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS (0), MemoryProfileActionFreePool, (EFI_MEMORY_TYPE) 0, 0, Buffer);
}
@@ -511,6 +514,7 @@ CoreFreePool (
Caller must have the memory lock held
@param Buffer The allocated pool entry to free
@param PoolType Pointer to pool type
@retval EFI_INVALID_PARAMETER Buffer not valid
@retval EFI_SUCCESS Buffer successfully freed.
@@ -518,7 +522,8 @@ CoreFreePool (
**/
EFI_STATUS
CoreFreePoolI (
IN VOID *Buffer
IN VOID *Buffer,
OUT EFI_MEMORY_TYPE *PoolType OPTIONAL
)
{
POOL *Pool;
@@ -583,6 +588,10 @@ CoreFreePoolI (
Granularity = DEFAULT_PAGE_ALLOCATION;
}
if (PoolType != NULL) {
*PoolType = Head->Type;
}
//
// Determine the pool list
//
@@ -667,7 +676,7 @@ CoreFreePoolI (
//
if (((UINT32) Pool->MemoryType >= MEMORY_TYPE_OEM_RESERVED_MIN) && Pool->Used == 0) {
RemoveEntryList (&Pool->Link);
CoreFreePoolI (Pool);
CoreFreePoolI (Pool, NULL);
}
return EFI_SUCCESS;