mirror of https://github.com/acidanthera/audk.git
Remove allocate aligned pool services.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5696 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
e6bcee8713
commit
dd1245006f
|
@ -383,241 +383,6 @@ FreePool (
|
|||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimePool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfieservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimeZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfieservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimeCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiReservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Frees a buffer that was previously allocated with one of the aligned pool allocation functions
|
||||
in the Memory Allocation Library.
|
||||
|
||||
Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
|
||||
aligned pool allocation services of the Memory Allocation Library.
|
||||
If Buffer was not allocated with an aligned pool allocation function in the Memory Allocation
|
||||
Library, then ASSERT().
|
||||
|
||||
@param Buffer Pointer to the buffer to free.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FreeAlignedPool (
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Frees buffer that were previously allocated with one of the
|
||||
memory allocation functions in the Memory Allocation Library.
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#
|
||||
|
||||
[Sources.common]
|
||||
MemoryAllocationLibInternals.h
|
||||
MemoryAllocationLib.c
|
||||
|
||||
|
||||
|
|
|
@ -21,8 +21,6 @@
|
|||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
#include "MemoryAllocationLibInternals.h"
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of a certain memory type.
|
||||
|
||||
|
@ -668,415 +666,6 @@ FreePool (
|
|||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates a buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory at the specified alignment remaining
|
||||
to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two. If Alignment is zero, then byte alignment is used.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *RawAddress;
|
||||
UINTN AlignedAddress;
|
||||
UINTN AlignmentMask;
|
||||
UINTN OverAllocationSize;
|
||||
UINTN RealAllocationSize;
|
||||
VOID **FreePointer;
|
||||
|
||||
//
|
||||
// Alignment must be a power of two or zero.
|
||||
//
|
||||
ASSERT ((Alignment & (Alignment - 1)) == 0);
|
||||
|
||||
if (Alignment == 0) {
|
||||
AlignmentMask = Alignment;
|
||||
} else {
|
||||
AlignmentMask = Alignment - 1;
|
||||
}
|
||||
//
|
||||
// Calculate the extra memory size, over-allocate memory pool and get the aligned memory address.
|
||||
//
|
||||
OverAllocationSize = sizeof (RawAddress) + AlignmentMask;
|
||||
RealAllocationSize = AllocationSize + OverAllocationSize;
|
||||
//
|
||||
// Make sure that AllocationSize plus OverAllocationSize does not overflow.
|
||||
//
|
||||
ASSERT (RealAllocationSize > AllocationSize);
|
||||
|
||||
RawAddress = InternalAllocatePool (PoolType, RealAllocationSize);
|
||||
if (RawAddress == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
AlignedAddress = ((UINTN) RawAddress + OverAllocationSize) & ~AlignmentMask;
|
||||
//
|
||||
// Save the original memory address just before the aligned address.
|
||||
//
|
||||
FreePointer = (VOID **)(AlignedAddress - sizeof (RawAddress));
|
||||
*FreePointer = RawAddress;
|
||||
|
||||
return (VOID *) AlignedAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedPool (EfiBootServicesData, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimePool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedPool (EfiRuntimeServicesData, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfieservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedPool (EfiReservedMemoryType, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment, clears the buffer with zeros, and returns a pointer to the allocated
|
||||
buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there is not
|
||||
enough memory at the specified alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedZeroPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *Memory;
|
||||
Memory = InternalAllocateAlignedPool (PoolType, AllocationSize, Alignment);
|
||||
if (Memory != NULL) {
|
||||
Memory = ZeroMem (Memory, AllocationSize);
|
||||
}
|
||||
return Memory;
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedZeroPool (EfiBootServicesData, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimeZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedZeroPool (EfiRuntimeServicesData, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfieservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedZeroPool (EfiReservedMemoryType, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory at the specified alignment remaining
|
||||
to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedCopyPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *Memory;
|
||||
|
||||
ASSERT (Buffer != NULL);
|
||||
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1));
|
||||
|
||||
Memory = InternalAllocateAlignedPool (PoolType, AllocationSize, Alignment);
|
||||
if (Memory != NULL) {
|
||||
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
||||
}
|
||||
return Memory;
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedCopyPool (EfiBootServicesData, AllocationSize, Buffer, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimeCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiReservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedCopyPool (EfiReservedMemoryType, AllocationSize, Buffer, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Frees a buffer that was previously allocated with one of the aligned pool allocation functions
|
||||
in the Memory Allocation Library.
|
||||
|
||||
Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
|
||||
aligned pool allocation services of the Memory Allocation Library.
|
||||
If Buffer was not allocated with an aligned pool allocation function in the Memory Allocation
|
||||
Library, then ASSERT().
|
||||
|
||||
@param Buffer Pointer to the buffer to free.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FreeAlignedPool (
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
VOID *RawAddress;
|
||||
VOID **FreePointer;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Get the pre-saved original address in the over-allocate pool.
|
||||
//
|
||||
FreePointer = (VOID **)((UINTN) Buffer - sizeof (RawAddress));
|
||||
RawAddress = *FreePointer;
|
||||
|
||||
Status = gBS->FreePool (RawAddress);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
/**
|
||||
Frees buffer that were previously allocated with one of the
|
||||
|
|
|
@ -1,205 +0,0 @@
|
|||
/** @file
|
||||
Internal include file of DXE Memory Allocation Library.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. 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
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __DXE_MEMORY_ALLOCATION_LIB_INTERNALS_H__
|
||||
#define __DXE_MEMORY_ALLOCATION_LIB_INTERNALS_H__
|
||||
|
||||
#include <PiDxe.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of a certain memory type.
|
||||
|
||||
Allocates the number of 4KB pages of a certain memory type and returns a pointer to the allocated
|
||||
buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL is returned.
|
||||
If there is not enough memory remaining to satisfy the request, then NULL is returned.
|
||||
|
||||
@param MemoryType The type of memory to allocate.
|
||||
@param Pages The number of 4 KB pages to allocate.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocatePages (
|
||||
IN EFI_MEMORY_TYPE MemoryType,
|
||||
IN UINTN Pages
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of a certain memory type at a specified alignment.
|
||||
|
||||
Allocates the number of 4KB pages specified by Pages of a certain memory type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is returned.
|
||||
If there is not enough memory at the specified alignment remaining to satisfy the request, then
|
||||
NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param MemoryType The type of memory to allocate.
|
||||
@param Pages The number of 4 KB pages to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedPages (
|
||||
IN EFI_MEMORY_TYPE MemoryType,
|
||||
IN UINTN Pages,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates a buffer of a certain pool type.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type and returns a
|
||||
pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
|
||||
returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
|
||||
|
||||
@param MemoryType The type of memory to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocatePool (
|
||||
IN EFI_MEMORY_TYPE MemoryType,
|
||||
IN UINTN AllocationSize
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of a certian pool type.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certian pool type, clears the buffer
|
||||
with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory remaining to satisfy the request,
|
||||
then NULL is returned.
|
||||
|
||||
@param PoolType The type of memory to allocate.
|
||||
@param AllocationSize The number of bytes to allocate and zero.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateZeroPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize
|
||||
);
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of a certian pool type.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certian pool type, copies
|
||||
AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory remaining to satisfy the request, then NULL is returned.
|
||||
If Buffer is NULL, then ASSERT().
|
||||
If AllocationSize is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate and zero.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateCopyPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates a buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory at the specified alignment remaining
|
||||
to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two. If Alignment is zero, then byte alignment is used.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment, clears the buffer with zeros, and returns a pointer to the allocated
|
||||
buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there is not
|
||||
enough memory at the specified alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedZeroPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory at the specified alignment remaining
|
||||
to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedCopyPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
#endif
|
|
@ -22,7 +22,6 @@
|
|||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
#include "MemoryAllocationLibInternals.h"
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of a certain memory type.
|
||||
|
@ -650,432 +649,6 @@ FreePool (
|
|||
//
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates a buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory at the specified alignment remaining
|
||||
to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two. If Alignment is zero, then byte alignment is used.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *RawAddress;
|
||||
UINTN AlignedAddress;
|
||||
UINTN AlignmentMask;
|
||||
|
||||
//
|
||||
// Alignment must be a power of two or zero.
|
||||
//
|
||||
ASSERT ((Alignment & (Alignment - 1)) == 0);
|
||||
|
||||
if (Alignment == 0) {
|
||||
AlignmentMask = Alignment;
|
||||
} else {
|
||||
AlignmentMask = Alignment - 1;
|
||||
}
|
||||
//
|
||||
// Make sure that AllocationSize plus AlignmentMask does not overflow.
|
||||
//
|
||||
ASSERT (AllocationSize <= (MAX_ADDRESS - AlignmentMask));
|
||||
|
||||
RawAddress = InternalAllocatePool (PoolType, AllocationSize + AlignmentMask);
|
||||
|
||||
AlignedAddress = ((UINTN) RawAddress + AlignmentMask) & ~AlignmentMask;
|
||||
|
||||
return (VOID *) AlignedAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *RawAddress;
|
||||
UINTN AlignedAddress;
|
||||
UINTN AlignmentMask;
|
||||
|
||||
//
|
||||
// Alignment must be a power of two or zero.
|
||||
//
|
||||
ASSERT ((Alignment & (Alignment - 1)) == 0);
|
||||
|
||||
if (Alignment == 0) {
|
||||
AlignmentMask = Alignment;
|
||||
} else {
|
||||
AlignmentMask = Alignment - 1;
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure that AllocationSize plus AlignmentMask does not overflow.
|
||||
//
|
||||
ASSERT (AllocationSize <= (MAX_ADDRESS - AlignmentMask));
|
||||
|
||||
RawAddress = AllocatePool (AllocationSize + AlignmentMask);
|
||||
|
||||
AlignedAddress = ((UINTN) RawAddress + AlignmentMask) & ~AlignmentMask;
|
||||
|
||||
return (VOID *) AlignedAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimePool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedPool (EfiRuntimeServicesData, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates a buffer of type EfieservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedPool (EfiReservedMemoryType, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment, clears the buffer with zeros, and returns a pointer to the allocated
|
||||
buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there is not
|
||||
enough memory at the specified alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedZeroPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *Memory;
|
||||
|
||||
Memory = InternalAllocateAlignedPool (PoolType, AllocationSize, Alignment);
|
||||
if (Memory != NULL) {
|
||||
Memory = ZeroMem (Memory, AllocationSize);
|
||||
}
|
||||
return Memory;
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *Memory;
|
||||
|
||||
Memory = AllocateAlignedPool (AllocationSize, Alignment);
|
||||
if (Memory != NULL) {
|
||||
Memory = ZeroMem (Memory, AllocationSize);
|
||||
}
|
||||
return Memory;
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimeZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedZeroPool (EfiRuntimeServicesData, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of type EfieservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfieservedMemoryType with an
|
||||
alignment specified by Alignment, clears the buffer with zeros, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory at the specified alignment remaining to satisfy the request, then NULL is
|
||||
returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedZeroPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedZeroPool (EfiReservedMemoryType, AllocationSize, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory at the specified alignment remaining
|
||||
to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedCopyPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *Memory;
|
||||
|
||||
ASSERT (Buffer != NULL);
|
||||
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1));
|
||||
|
||||
Memory = InternalAllocateAlignedPool (PoolType, AllocationSize, Alignment);
|
||||
if (Memory != NULL) {
|
||||
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
||||
}
|
||||
return Memory;
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiBootServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiBootServicesData type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
VOID *Memory;
|
||||
|
||||
ASSERT (Buffer != NULL);
|
||||
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1));
|
||||
|
||||
Memory = AllocateAlignedPool (AllocationSize, Alignment);
|
||||
if (Memory != NULL) {
|
||||
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
||||
}
|
||||
return Memory;
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiRuntimeServicesData at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedRuntimeCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of type EfiReservedMemoryType at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType type with an
|
||||
alignment specified by Alignment. The allocated buffer is returned. If AllocationSize is 0,
|
||||
then a valid buffer of 0 size is returned. If there is not enough memory at the specified
|
||||
alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
EFIAPI
|
||||
AllocateAlignedReservedCopyPool (
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
)
|
||||
{
|
||||
return InternalAllocateAlignedCopyPool (EfiReservedMemoryType, AllocationSize, Buffer, Alignment);
|
||||
}
|
||||
|
||||
/**
|
||||
Frees a buffer that was previously allocated with one of the aligned pool allocation functions
|
||||
in the Memory Allocation Library.
|
||||
|
||||
Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
|
||||
aligned pool allocation services of the Memory Allocation Library.
|
||||
If Buffer was not allocated with an aligned pool allocation function in the Memory Allocation
|
||||
Library, then ASSERT().
|
||||
|
||||
@param Buffer Pointer to the buffer to free.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FreeAlignedPool (
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
//
|
||||
// PEI phase does not support to free pool, so leave it as NOP.
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Frees buffer that were previously allocated with one of the
|
||||
|
|
|
@ -1,198 +0,0 @@
|
|||
/** @file
|
||||
Internal include file of PEI Memory Allocation Library.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation<BR>
|
||||
All rights reserved. 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
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __PEI_MEMORY_ALLOCATION_LIB_INTERNALS_H__
|
||||
#define __PEI_MEMORY_ALLOCATION_LIB_INTERNALS_H__
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of a certain memory type.
|
||||
|
||||
Allocates the number of 4KB pages of a certain memory type and returns a pointer to the allocated
|
||||
buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL is returned.
|
||||
If there is not enough memory remaining to satisfy the request, then NULL is returned.
|
||||
|
||||
@param MemoryType The type of memory to allocate.
|
||||
@param Pages The number of 4 KB pages to allocate.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocatePages (
|
||||
IN EFI_MEMORY_TYPE MemoryType,
|
||||
IN UINTN Pages
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates one or more 4KB pages of a certain memory type at a specified alignment.
|
||||
|
||||
Allocates the number of 4KB pages specified by Pages of a certain memory type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is returned.
|
||||
If there is not enough memory at the specified alignment remaining to satisfy the request, then
|
||||
NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param MemoryType The type of memory to allocate.
|
||||
@param Pages The number of 4 KB pages to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedPages (
|
||||
IN EFI_MEMORY_TYPE MemoryType,
|
||||
IN UINTN Pages,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates a buffer of a certain pool type.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type and returns a
|
||||
pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
|
||||
returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
|
||||
|
||||
@param MemoryType The type of memory to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocatePool (
|
||||
IN EFI_MEMORY_TYPE MemoryType,
|
||||
IN UINTN AllocationSize
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of a certian pool type.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certian pool type, clears the buffer
|
||||
with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory remaining to satisfy the request,
|
||||
then NULL is returned.
|
||||
|
||||
@param PoolType The type of memory to allocate.
|
||||
@param AllocationSize The number of bytes to allocate and zero.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateZeroPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize
|
||||
);
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of a certian pool type.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certian pool type, copies
|
||||
AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the
|
||||
allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there
|
||||
is not enough memory remaining to satisfy the request, then NULL is returned.
|
||||
If Buffer is NULL, then ASSERT().
|
||||
If AllocationSize is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate and zero.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateCopyPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates a buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory at the specified alignment remaining
|
||||
to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two. If Alignment is zero, then byte alignment is used.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Allocates and zeros a buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment, clears the buffer with zeros, and returns a pointer to the allocated
|
||||
buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there is not
|
||||
enough memory at the specified alignment remaining to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedZeroPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
/**
|
||||
Copies a buffer to an allocated buffer of a certain pool type at a specified alignment.
|
||||
|
||||
Allocates the number bytes specified by AllocationSize of a certain pool type with an alignment
|
||||
specified by Alignment. The allocated buffer is returned. If AllocationSize is 0, then a valid
|
||||
buffer of 0 size is returned. If there is not enough memory at the specified alignment remaining
|
||||
to satisfy the request, then NULL is returned.
|
||||
If Alignment is not a power of two and Alignment is not zero, then ASSERT().
|
||||
|
||||
@param PoolType The type of pool to allocate.
|
||||
@param AllocationSize The number of bytes to allocate.
|
||||
@param Buffer The buffer to copy to the allocated buffer.
|
||||
@param Alignment The requested alignment of the allocation. Must be a power of two.
|
||||
If Alignment is zero, then byte alignment is used.
|
||||
|
||||
@return A pointer to the allocated buffer or NULL if allocation fails.
|
||||
|
||||
**/
|
||||
VOID *
|
||||
InternalAllocateAlignedCopyPool (
|
||||
IN EFI_MEMORY_TYPE PoolType,
|
||||
IN UINTN AllocationSize,
|
||||
IN CONST VOID *Buffer,
|
||||
IN UINTN Alignment
|
||||
);
|
||||
|
||||
#endif
|
|
@ -31,10 +31,8 @@
|
|||
#
|
||||
|
||||
[Sources.common]
|
||||
MemoryAllocationLibInternals.h
|
||||
MemoryAllocationLib.c
|
||||
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
|
||||
|
|
Loading…
Reference in New Issue