mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-23 21:54:27 +02:00
MdeModulePkg: Placed Core Pool functions into MemoryPoolLib.
This commit is contained in:
parent
28c1dbe5f2
commit
241d60775b
@ -85,6 +85,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/DebugAgentLib.h>
|
#include <Library/DebugAgentLib.h>
|
||||||
#include <Library/CpuExceptionHandlerLib.h>
|
#include <Library/CpuExceptionHandlerLib.h>
|
||||||
#include <Library/CpuArchLib.h>
|
#include <Library/CpuArchLib.h>
|
||||||
|
#include <Library/MemoryPoolLib.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
// attributes for reserved memory before it is promoted to system memory
|
// attributes for reserved memory before it is promoted to system memory
|
||||||
@ -272,15 +273,6 @@ extern LOADED_IMAGE_PRIVATE_DATA * mCurrentImage;
|
|||||||
// Service Initialization Functions
|
// Service Initialization Functions
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
|
||||||
Called to initialize the pool.
|
|
||||||
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
CoreInitializePool (
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
CoreSetMemoryTypeInformationRange (
|
CoreSetMemoryTypeInformationRange (
|
||||||
IN EFI_PHYSICAL_ADDRESS Start,
|
IN EFI_PHYSICAL_ADDRESS Start,
|
||||||
@ -1240,80 +1232,6 @@ CoreGetMemoryMap (
|
|||||||
OUT UINT32 *DescriptorVersion
|
OUT UINT32 *DescriptorVersion
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
Allocate pool of a particular type.
|
|
||||||
|
|
||||||
@param PoolType Type of pool to allocate
|
|
||||||
@param Size The amount of pool to allocate
|
|
||||||
@param Buffer The address to return a pointer to the allocated
|
|
||||||
pool
|
|
||||||
|
|
||||||
@retval EFI_INVALID_PARAMETER PoolType not valid or Buffer is NULL
|
|
||||||
@retval EFI_OUT_OF_RESOURCES Size exceeds max pool size or allocation failed.
|
|
||||||
@retval EFI_SUCCESS Pool successfully allocated.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
CoreAllocatePool (
|
|
||||||
IN EFI_MEMORY_TYPE PoolType,
|
|
||||||
IN UINTN Size,
|
|
||||||
OUT VOID **Buffer
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Allocate pool of a particular type.
|
|
||||||
|
|
||||||
@param PoolType Type of pool to allocate
|
|
||||||
@param Size The amount of pool to allocate
|
|
||||||
@param Buffer The address to return a pointer to the allocated
|
|
||||||
pool
|
|
||||||
|
|
||||||
@retval EFI_INVALID_PARAMETER PoolType not valid or Buffer is NULL
|
|
||||||
@retval EFI_OUT_OF_RESOURCES Size exceeds max pool size or allocation failed.
|
|
||||||
@retval EFI_SUCCESS Pool successfully allocated.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
CoreInternalAllocatePool (
|
|
||||||
IN EFI_MEMORY_TYPE PoolType,
|
|
||||||
IN UINTN Size,
|
|
||||||
OUT VOID **Buffer
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Frees pool.
|
|
||||||
|
|
||||||
@param Buffer The allocated pool entry to free
|
|
||||||
|
|
||||||
@retval EFI_INVALID_PARAMETER Buffer is not a valid value.
|
|
||||||
@retval EFI_SUCCESS Pool successfully freed.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
CoreFreePool (
|
|
||||||
IN VOID *Buffer
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
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.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
CoreInternalFreePool (
|
|
||||||
IN VOID *Buffer,
|
|
||||||
OUT EFI_MEMORY_TYPE *PoolType OPTIONAL
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Loads an EFI image into memory and returns a handle to the image.
|
Loads an EFI image into memory and returns a handle to the image.
|
||||||
|
|
||||||
|
@ -44,7 +44,6 @@
|
|||||||
Hand/Handle.h
|
Hand/Handle.h
|
||||||
Gcd/Gcd.c
|
Gcd/Gcd.c
|
||||||
Gcd/Gcd.h
|
Gcd/Gcd.h
|
||||||
Mem/Pool.c
|
|
||||||
Mem/Page.c
|
Mem/Page.c
|
||||||
Mem/MemData.c
|
Mem/MemData.c
|
||||||
Mem/Imem.h
|
Mem/Imem.h
|
||||||
@ -103,6 +102,7 @@
|
|||||||
PcdLib
|
PcdLib
|
||||||
ImagePropertiesRecordLib
|
ImagePropertiesRecordLib
|
||||||
CpuArchLib
|
CpuArchLib
|
||||||
|
MemoryPoolLib
|
||||||
|
|
||||||
[Guids]
|
[Guids]
|
||||||
gEfiEventMemoryMapChangeGuid ## PRODUCES ## Event
|
gEfiEventMemoryMapChangeGuid ## PRODUCES ## Event
|
||||||
|
@ -9,22 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _IMEM_H_
|
#ifndef _IMEM_H_
|
||||||
#define _IMEM_H_
|
#define _IMEM_H_
|
||||||
|
|
||||||
//
|
|
||||||
// +---------------------------------------------------+
|
|
||||||
// | 0..(EfiMaxMemoryType - 1) - Normal memory type |
|
|
||||||
// +---------------------------------------------------+
|
|
||||||
// | EfiMaxMemoryType..0x6FFFFFFF - Invalid |
|
|
||||||
// +---------------------------------------------------+
|
|
||||||
// | 0x70000000..0x7FFFFFFF - OEM reserved |
|
|
||||||
// +---------------------------------------------------+
|
|
||||||
// | 0x80000000..0xFFFFFFFF - OS reserved |
|
|
||||||
// +---------------------------------------------------+
|
|
||||||
//
|
|
||||||
#define MEMORY_TYPE_OS_RESERVED_MIN 0x80000000
|
|
||||||
#define MEMORY_TYPE_OS_RESERVED_MAX 0xFFFFFFFF
|
|
||||||
#define MEMORY_TYPE_OEM_RESERVED_MIN 0x70000000
|
|
||||||
#define MEMORY_TYPE_OEM_RESERVED_MAX 0x7FFFFFFF
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// MEMORY_MAP_ENTRY
|
// MEMORY_MAP_ENTRY
|
||||||
//
|
//
|
||||||
@ -80,41 +64,6 @@ CoreFreePoolPages (
|
|||||||
IN UINTN NumberOfPages
|
IN UINTN NumberOfPages
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
Internal function to allocate pool of a particular type.
|
|
||||||
Caller must have the memory lock held
|
|
||||||
|
|
||||||
@param PoolType Type of pool to allocate
|
|
||||||
@param Size The amount of pool to allocate
|
|
||||||
@param NeedGuard Flag to indicate Guard page is needed or not
|
|
||||||
|
|
||||||
@return The allocate pool, or NULL
|
|
||||||
|
|
||||||
**/
|
|
||||||
VOID *
|
|
||||||
CoreAllocatePoolI (
|
|
||||||
IN EFI_MEMORY_TYPE PoolType,
|
|
||||||
IN UINTN Size,
|
|
||||||
IN BOOLEAN NeedGuard
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Internal function to free a pool entry.
|
|
||||||
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.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
CoreFreePoolI (
|
|
||||||
IN VOID *Buffer,
|
|
||||||
OUT EFI_MEMORY_TYPE *PoolType OPTIONAL
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Enter critical section by gaining lock on gMemoryLock.
|
Enter critical section by gaining lock on gMemoryLock.
|
||||||
|
|
||||||
|
@ -46,9 +46,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "ProcessorBind.h"
|
#include "ProcessorBind.h"
|
||||||
#include "Uefi/UefiMultiPhase.h"
|
#include "Uefi/UefiMultiPhase.h"
|
||||||
|
|
||||||
#define MEMORY_TYPE_OS_RESERVED_MIN 0x80000000
|
|
||||||
#define MEMORY_TYPE_OEM_RESERVED_MIN 0x70000000
|
|
||||||
|
|
||||||
#define PREVIOUS_MEMORY_DESCRIPTOR(MemoryDescriptor, Size) \
|
#define PREVIOUS_MEMORY_DESCRIPTOR(MemoryDescriptor, Size) \
|
||||||
((EFI_MEMORY_DESCRIPTOR *)((UINT8 *)(MemoryDescriptor) - (Size)))
|
((EFI_MEMORY_DESCRIPTOR *)((UINT8 *)(MemoryDescriptor) - (Size)))
|
||||||
|
|
||||||
|
146
MdeModulePkg/Include/Library/MemoryPoolLib.h
Normal file
146
MdeModulePkg/Include/Library/MemoryPoolLib.h
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
/** @file
|
||||||
|
UEFI Memory pool management functions.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _MEMORY_POOL_LIB_H_
|
||||||
|
#define _MEMORY_POOL_LIB_H_
|
||||||
|
|
||||||
|
//
|
||||||
|
// +---------------------------------------------------+
|
||||||
|
// | 0..(EfiMaxMemoryType - 1) - Normal memory type |
|
||||||
|
// +---------------------------------------------------+
|
||||||
|
// | EfiMaxMemoryType..0x6FFFFFFF - Invalid |
|
||||||
|
// +---------------------------------------------------+
|
||||||
|
// | 0x70000000..0x7FFFFFFF - OEM reserved |
|
||||||
|
// +---------------------------------------------------+
|
||||||
|
// | 0x80000000..0xFFFFFFFF - OS reserved |
|
||||||
|
// +---------------------------------------------------+
|
||||||
|
//
|
||||||
|
#define MEMORY_TYPE_OS_RESERVED_MIN 0x80000000
|
||||||
|
#define MEMORY_TYPE_OS_RESERVED_MAX 0xFFFFFFFF
|
||||||
|
#define MEMORY_TYPE_OEM_RESERVED_MIN 0x70000000
|
||||||
|
#define MEMORY_TYPE_OEM_RESERVED_MAX 0x7FFFFFFF
|
||||||
|
|
||||||
|
/**
|
||||||
|
Called to initialize the pool.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
CoreInitializePool (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Allocate pool of a particular type.
|
||||||
|
|
||||||
|
@param PoolType Type of pool to allocate
|
||||||
|
@param Size The amount of pool to allocate
|
||||||
|
@param Buffer The address to return a pointer to the allocated
|
||||||
|
pool
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER PoolType not valid or Buffer is NULL
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Size exceeds max pool size or allocation failed.
|
||||||
|
@retval EFI_SUCCESS Pool successfully allocated.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
CoreInternalAllocatePool (
|
||||||
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
|
IN UINTN Size,
|
||||||
|
OUT VOID **Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Allocate pool of a particular type.
|
||||||
|
|
||||||
|
@param PoolType Type of pool to allocate
|
||||||
|
@param Size The amount of pool to allocate
|
||||||
|
@param Buffer The address to return a pointer to the allocated
|
||||||
|
pool
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER PoolType not valid or Buffer is NULL
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Size exceeds max pool size or allocation failed.
|
||||||
|
@retval EFI_SUCCESS Pool successfully allocated.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
CoreAllocatePool (
|
||||||
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
|
IN UINTN Size,
|
||||||
|
OUT VOID **Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Internal function to allocate pool of a particular type.
|
||||||
|
Caller must have the memory lock held
|
||||||
|
|
||||||
|
@param PoolType Type of pool to allocate
|
||||||
|
@param Size The amount of pool to allocate
|
||||||
|
@param NeedGuard Flag to indicate Guard page is needed or not
|
||||||
|
|
||||||
|
@return The allocate pool, or NULL
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
CoreAllocatePoolI (
|
||||||
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
|
IN UINTN Size,
|
||||||
|
IN BOOLEAN NeedGuard
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
CoreInternalFreePool (
|
||||||
|
IN VOID *Buffer,
|
||||||
|
OUT EFI_MEMORY_TYPE *PoolType OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Frees pool.
|
||||||
|
|
||||||
|
@param Buffer The allocated pool entry to free
|
||||||
|
|
||||||
|
@retval EFI_INVALID_PARAMETER Buffer is not a valid value.
|
||||||
|
@retval EFI_SUCCESS Pool successfully freed.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
CoreFreePool (
|
||||||
|
IN VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Internal function to free a pool entry.
|
||||||
|
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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
CoreFreePoolI (
|
||||||
|
IN VOID *Buffer,
|
||||||
|
OUT EFI_MEMORY_TYPE *PoolType OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
9
MdeModulePkg/Library/MemoryPoolLib/InternalPool.c
Normal file
9
MdeModulePkg/Library/MemoryPoolLib/InternalPool.c
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/** @file
|
||||||
|
DXE Core functions necessary for pool management functions.
|
||||||
|
|
||||||
|
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
|
||||||
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
317
MdeModulePkg/Library/MemoryPoolLib/InternalPool.h
Normal file
317
MdeModulePkg/Library/MemoryPoolLib/InternalPool.h
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
/** @file
|
||||||
|
DXE Core functions necessary for pool management functions.
|
||||||
|
|
||||||
|
Copyright (c) 2024, Mikhail Krichanov. All rights reserved.
|
||||||
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _INTERNAL_POOL_H_
|
||||||
|
#define _INTERNAL_POOL_H_
|
||||||
|
|
||||||
|
extern BOOLEAN mOnGuarding;
|
||||||
|
extern EFI_LOCK gMemoryLock;
|
||||||
|
|
||||||
|
#define GUARD_HEAP_TYPE_FREED BIT4
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check to see if the pool at the given address should be guarded or not.
|
||||||
|
|
||||||
|
@param[in] MemoryType Pool type to check.
|
||||||
|
|
||||||
|
|
||||||
|
@return TRUE The given type of pool should be guarded.
|
||||||
|
@return FALSE The given type of pool should not be guarded.
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
IsPoolTypeToGuard (
|
||||||
|
IN EFI_MEMORY_TYPE MemoryType
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initialize a basic mutual exclusion lock. Each lock
|
||||||
|
provides mutual exclusion access at it's task priority
|
||||||
|
level. Since there is no-premption (at any TPL) or
|
||||||
|
multiprocessor support, acquiring the lock only consists
|
||||||
|
of raising to the locks TPL.
|
||||||
|
|
||||||
|
@param Lock The EFI_LOCK structure to initialize
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Lock Owned.
|
||||||
|
@retval EFI_ACCESS_DENIED Reentrant Lock Acquisition, Lock not Owned.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
CoreAcquireLockOrFail (
|
||||||
|
IN EFI_LOCK *Lock
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Releases ownership of the mutual exclusion lock, and
|
||||||
|
restores the previous task priority level.
|
||||||
|
|
||||||
|
@param Lock The lock to release
|
||||||
|
|
||||||
|
@return Lock unowned
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
CoreReleaseLock (
|
||||||
|
IN EFI_LOCK *Lock
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Update memory profile information.
|
||||||
|
|
||||||
|
@param CallerAddress Address of caller who call Allocate or Free.
|
||||||
|
@param Action This Allocate or Free action.
|
||||||
|
@param MemoryType Memory type.
|
||||||
|
EfiMaxMemoryType means the MemoryType is unknown.
|
||||||
|
@param Size Buffer size.
|
||||||
|
@param Buffer Buffer address.
|
||||||
|
@param ActionString String for memory profile action.
|
||||||
|
Only needed for user defined allocate action.
|
||||||
|
|
||||||
|
@return EFI_SUCCESS Memory profile is updated.
|
||||||
|
@return EFI_UNSUPPORTED Memory profile is unsupported,
|
||||||
|
or memory profile for the image is not required,
|
||||||
|
or memory profile for the memory type is not required.
|
||||||
|
@return EFI_ACCESS_DENIED It is during memory profile data getting.
|
||||||
|
@return EFI_ABORTED Memory profile recording is not enabled.
|
||||||
|
@return EFI_OUT_OF_RESOURCES No enough resource to update memory profile for allocate action.
|
||||||
|
@return EFI_NOT_FOUND No matched allocate info found for free action.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
CoreUpdateProfile (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS CallerAddress,
|
||||||
|
IN MEMORY_PROFILE_ACTION Action,
|
||||||
|
IN EFI_MEMORY_TYPE MemoryType,
|
||||||
|
IN UINTN Size, // Valid for AllocatePages/FreePages/AllocatePool
|
||||||
|
IN VOID *Buffer,
|
||||||
|
IN CHAR8 *ActionString OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Install MemoryAttributesTable on memory allocation.
|
||||||
|
|
||||||
|
@param[in] MemoryType EFI memory type.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
InstallMemoryAttributesTableOnMemoryAllocation (
|
||||||
|
IN EFI_MEMORY_TYPE MemoryType
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Internal function. Used by the pool functions to allocate pages
|
||||||
|
to back pool allocation requests.
|
||||||
|
|
||||||
|
@param PoolType The type of memory for the new pool pages
|
||||||
|
@param NumberOfPages No of pages to allocate
|
||||||
|
@param Alignment Bits to align.
|
||||||
|
@param NeedGuard Flag to indicate Guard page is needed or not
|
||||||
|
|
||||||
|
@return The allocated memory, or NULL
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
CoreAllocatePoolPages (
|
||||||
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
|
IN UINTN NumberOfPages,
|
||||||
|
IN UINTN Alignment,
|
||||||
|
IN BOOLEAN NeedGuard
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Exit critical section by releasing lock on gMemoryLock.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
CoreReleaseMemoryLock (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set head Guard and tail Guard for the given memory range.
|
||||||
|
|
||||||
|
@param[in] Memory Base address of memory to set guard for.
|
||||||
|
@param[in] NumberOfPages Memory size in pages.
|
||||||
|
|
||||||
|
@return VOID.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
SetGuardForMemory (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINTN NumberOfPages
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Manage memory permission attributes on a memory range, according to the
|
||||||
|
configured DXE memory protection policy.
|
||||||
|
|
||||||
|
@param OldType The old memory type of the range
|
||||||
|
@param NewType The new memory type of the range
|
||||||
|
@param Memory The base address of the range
|
||||||
|
@param Length The size of the range (in bytes)
|
||||||
|
|
||||||
|
@return EFI_SUCCESS If the the CPU arch protocol is not installed yet
|
||||||
|
@return EFI_SUCCESS If no DXE memory protection policy has been configured
|
||||||
|
@return EFI_SUCCESS If OldType and NewType use the same permission attributes
|
||||||
|
@return other Return value of gCpu->SetMemoryAttributes()
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ApplyMemoryProtectionPolicy (
|
||||||
|
IN EFI_MEMORY_TYPE OldType,
|
||||||
|
IN EFI_MEMORY_TYPE NewType,
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINT64 Length
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check to see if the heap guard is enabled for page and/or pool allocation.
|
||||||
|
|
||||||
|
@param[in] GuardType Specify the sub-type(s) of Heap Guard.
|
||||||
|
|
||||||
|
@return TRUE/FALSE.
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
IsHeapGuardEnabled (
|
||||||
|
UINT8 GuardType
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Adjust the pool head position to make sure the Guard page is adjavent to
|
||||||
|
pool tail or pool head.
|
||||||
|
|
||||||
|
@param[in] Memory Base address of memory allocated.
|
||||||
|
@param[in] NoPages Number of pages actually allocated.
|
||||||
|
@param[in] Size Size of memory requested.
|
||||||
|
(plus pool head/tail overhead)
|
||||||
|
|
||||||
|
@return Address of pool head.
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
AdjustPoolHeadA (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINTN NoPages,
|
||||||
|
IN UINTN Size
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Raising to the task priority level of the mutual exclusion
|
||||||
|
lock, and then acquires ownership of the lock.
|
||||||
|
|
||||||
|
@param Lock The lock to acquire
|
||||||
|
|
||||||
|
@return Lock owned
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
CoreAcquireLock (
|
||||||
|
IN EFI_LOCK *Lock
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Enter critical section by gaining lock on gMemoryLock.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
CoreAcquireMemoryLock (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Internal function. Frees pool pages allocated via AllocatePoolPages ()
|
||||||
|
|
||||||
|
@param Memory The base address to free
|
||||||
|
@param NumberOfPages The number of pages to free
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
CoreFreePoolPages (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINTN NumberOfPages
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Record freed pages as well as mark them as not-present, if enabled.
|
||||||
|
|
||||||
|
@param[in] BaseAddress Base address of just freed pages.
|
||||||
|
@param[in] Pages Number of freed pages.
|
||||||
|
|
||||||
|
@return VOID.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
GuardFreedPagesChecked (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
|
IN UINTN Pages
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Adjust the start address and number of pages to free according to Guard.
|
||||||
|
|
||||||
|
The purpose of this function is to keep the shared Guard page with adjacent
|
||||||
|
memory block if it's still in guard, or free it if no more sharing. Another
|
||||||
|
is to reserve pages as Guard pages in partial page free situation.
|
||||||
|
|
||||||
|
@param[in,out] Memory Base address of memory to free.
|
||||||
|
@param[in,out] NumberOfPages Size of memory to free.
|
||||||
|
|
||||||
|
@return VOID.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
AdjustMemoryF (
|
||||||
|
IN OUT EFI_PHYSICAL_ADDRESS *Memory,
|
||||||
|
IN OUT UINTN *NumberOfPages
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Unset head Guard and tail Guard for the given memory range.
|
||||||
|
|
||||||
|
@param[in] Memory Base address of memory to unset guard for.
|
||||||
|
@param[in] NumberOfPages Memory size in pages.
|
||||||
|
|
||||||
|
@return VOID.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
UnsetGuardForMemory (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINTN NumberOfPages
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check to see if the page at the given address is guarded or not.
|
||||||
|
|
||||||
|
@param[in] Address The address to check for.
|
||||||
|
|
||||||
|
@return TRUE The page at Address is guarded.
|
||||||
|
@return FALSE The page at Address is not guarded.
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
EFIAPI
|
||||||
|
IsMemoryGuarded (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Address
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get the page base address according to pool head address.
|
||||||
|
|
||||||
|
@param[in] Memory Head address of pool to free.
|
||||||
|
@param[in] NoPages Number of pages actually allocated.
|
||||||
|
@param[in] Size Size of memory requested.
|
||||||
|
(plus pool head/tail overhead)
|
||||||
|
|
||||||
|
@return Address of pool head.
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
AdjustPoolHeadF (
|
||||||
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
|
IN UINTN NoPages,
|
||||||
|
IN UINTN Size
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
39
MdeModulePkg/Library/MemoryPoolLib/MemoryPoolLib.inf
Normal file
39
MdeModulePkg/Library/MemoryPoolLib/MemoryPoolLib.inf
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
## @file
|
||||||
|
# UEFI Memory pool management functions.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010005
|
||||||
|
BASE_NAME = MemoryPoolLib
|
||||||
|
FILE_GUID = 084a3534-da19-435e-8eeb-be08237ed403
|
||||||
|
MODULE_TYPE = DXE_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
LIBRARY_CLASS = MemoryPoolLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
|
||||||
|
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||||
|
#
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
InternalPool.c
|
||||||
|
InternalPool.h
|
||||||
|
Pool.c
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
BaseLib
|
||||||
|
DebugLib
|
||||||
|
PcdLib
|
||||||
|
UefiBootServicesTableLib
|
||||||
|
UefiLib
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gEfiMdeModulePkgTokenSpaceGuid.PcdHeapGuardPropertyMask ## CONSUMES
|
@ -6,9 +6,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include "DxeMain.h"
|
#include <Guid/MemoryProfile.h>
|
||||||
#include "Imem.h"
|
|
||||||
#include "HeapGuard.h"
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/MemoryPoolLib.h>
|
||||||
|
#include <Library/PcdLib.h>
|
||||||
|
#include <Library/UefiLib.h>
|
||||||
|
|
||||||
|
#include "InternalPool.h"
|
||||||
|
|
||||||
STATIC EFI_LOCK mPoolMemoryLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY);
|
STATIC EFI_LOCK mPoolMemoryLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY);
|
||||||
|
|
||||||
@ -137,6 +142,7 @@ CoreInitializePool (
|
|||||||
@return Pointer of Corresponding pool head.
|
@return Pointer of Corresponding pool head.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
STATIC
|
||||||
POOL *
|
POOL *
|
||||||
LookupPoolHead (
|
LookupPoolHead (
|
||||||
IN EFI_MEMORY_TYPE MemoryType
|
IN EFI_MEMORY_TYPE MemoryType
|
@ -143,6 +143,7 @@
|
|||||||
MicrocodeLib|UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf
|
MicrocodeLib|UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf
|
||||||
MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
|
MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
|
||||||
CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf
|
CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf
|
||||||
|
MemoryPoolLib|MdeModulePkg/Library/MemoryPoolLib/MemoryPoolLib.inf
|
||||||
|
|
||||||
[LibraryClasses.IA32.DXE_CORE]
|
[LibraryClasses.IA32.DXE_CORE]
|
||||||
CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf
|
CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf
|
||||||
@ -379,6 +380,7 @@
|
|||||||
MdeModulePkg/Library/DxeCoreDxeServicesTableLib/DxeCoreDxeServicesTableLib.inf
|
MdeModulePkg/Library/DxeCoreDxeServicesTableLib/DxeCoreDxeServicesTableLib.inf
|
||||||
MdeModulePkg/Library/DxeCoreUefiBootServicesTableLib/DxeCoreUefiBootServicesTableLib.inf
|
MdeModulePkg/Library/DxeCoreUefiBootServicesTableLib/DxeCoreUefiBootServicesTableLib.inf
|
||||||
MdeModulePkg/Library/DxeCoreUefiRuntimeServicesTableLib/DxeCoreUefiRuntimeServicesTableLib.inf
|
MdeModulePkg/Library/DxeCoreUefiRuntimeServicesTableLib/DxeCoreUefiRuntimeServicesTableLib.inf
|
||||||
|
MdeModulePkg/Library/MemoryPoolLib/MemoryPoolLib.inf
|
||||||
|
|
||||||
MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
|
MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
|
||||||
MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf
|
MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf
|
||||||
|
Loading…
x
Reference in New Issue
Block a user