11LIST_ENTRY mSmmPoolLists[SmmPoolTypeMax][MAX_POOL_INDEX];
33 return SmmPoolTypeCode;
35 return SmmPoolTypeData;
37 return SmmPoolTypeMax;
56 UINTN SmmPoolTypeIndex;
62 for (SmmPoolTypeIndex = 0; SmmPoolTypeIndex < SmmPoolTypeMax; SmmPoolTypeIndex++) {
63 for (Index = 0; Index <
ARRAY_SIZE (mSmmPoolLists[SmmPoolTypeIndex]); Index++) {
69 &gLoadFixedAddressConfigurationTableGuid,
70 (
VOID **)&LMFAConfigurationTable
72 if (!EFI_ERROR (Status) && (LMFAConfigurationTable !=
NULL)) {
73 gLoadModuleAtFixAddressSmramBase = LMFAConfigurationTable->
SmramBase;
80 for (Index = 0; Index < SmramRangeCount; Index++) {
81 if ((SmramRanges[Index].RegionState & (EFI_ALLOCATED | EFI_NEEDS_TESTING | EFI_NEEDS_ECC_INITIALIZATION)) != 0) {
86 SmramRanges[Index].CpuStart,
87 SmramRanges[Index].PhysicalSize,
89 SmramRanges[Index].RegionState
96 for (Index = 0; Index < SmramRangeCount; Index++) {
97 if ((SmramRanges[Index].RegionState & (EFI_ALLOCATED | EFI_NEEDS_TESTING | EFI_NEEDS_ECC_INITIALIZATION)) == 0) {
102 SmramRanges[Index].CpuStart,
103 SmramRanges[Index].PhysicalSize,
105 SmramRanges[Index].RegionState
132 SMM_POOL_TYPE SmmPoolType;
137 ASSERT (PoolIndex <= MAX_POOL_INDEX);
140 if (PoolIndex == MAX_POOL_INDEX) {
148 if (EFI_ERROR (Status)) {
149 return EFI_OUT_OF_RESOURCES;
153 }
else if (!
IsListEmpty (&mSmmPoolLists[SmmPoolType][PoolIndex])) {
158 if (!EFI_ERROR (Status)) {
159 Hdr->Header.Signature = 0;
160 Hdr->Header.Size >>= 1;
161 Hdr->Header.Available =
TRUE;
162 Hdr->Header.Type = 0;
163 Tail = HEAD_TO_TAIL (&Hdr->Header);
166 InsertHeadList (&mSmmPoolLists[SmmPoolType][PoolIndex], &Hdr->Link);
171 if (!EFI_ERROR (Status)) {
172 Hdr->Header.Signature = POOL_HEAD_SIGNATURE;
173 Hdr->Header.Size = MIN_POOL_SIZE << PoolIndex;
174 Hdr->Header.Available =
FALSE;
175 Hdr->Header.Type = PoolType;
176 Tail = HEAD_TO_TAIL (&Hdr->Header);
177 Tail->Signature = POOL_TAIL_SIGNATURE;
178 Tail->Size = Hdr->Header.Size;
202 SMM_POOL_TYPE SmmPoolType;
204 ASSERT ((FreePoolHdr->Header.Size & (FreePoolHdr->Header.Size - 1)) == 0);
205 ASSERT (((
UINTN)FreePoolHdr & (FreePoolHdr->Header.Size - 1)) == 0);
206 ASSERT (FreePoolHdr->Header.Size >= MIN_POOL_SIZE);
210 PoolIndex = (
UINTN)(
HighBitSet32 ((UINT32)FreePoolHdr->Header.Size) - MIN_POOL_SHIFT);
211 FreePoolHdr->Header.Signature = 0;
212 FreePoolHdr->Header.Available =
TRUE;
213 FreePoolHdr->Header.Type = 0;
214 if (PoolTail !=
NULL) {
215 PoolTail->Signature = 0;
219 ASSERT (PoolIndex < MAX_POOL_INDEX);
220 InsertHeadList (&mSmmPoolLists[SmmPoolType][PoolIndex], &FreePoolHdr->Link);
260 return EFI_INVALID_PARAMETER;
264 HasPoolTail = !(NeedGuard &&
265 ((
PcdGet8 (PcdHeapGuardPropertyMask) & BIT7) == 0));
270 Size += POOL_OVERHEAD;
271 if ((Size > MAX_POOL_SIZE) || NeedGuard) {
284 if (EFI_ERROR (Status)) {
298 PoolHdr->Signature = POOL_HEAD_SIGNATURE;
300 PoolHdr->Available =
FALSE;
301 PoolHdr->Type = PoolType;
304 PoolTail = HEAD_TO_TAIL (PoolHdr);
305 PoolTail->Signature = POOL_TAIL_SIGNATURE;
306 PoolTail->Size = PoolHdr->Size;
309 *Buffer = PoolHdr + 1;
313 Size = (Size + MIN_POOL_SIZE - 1) >> MIN_POOL_SHIFT;
315 if ((Size & (Size - 1)) != 0) {
320 if (!EFI_ERROR (Status)) {
321 *Buffer = &FreePoolHdr->Header + 1;
351 if (!EFI_ERROR (Status)) {
354 MemoryProfileActionAllocatePool,
383 BOOLEAN MemoryGuarded;
385 if (Buffer ==
NULL) {
386 return EFI_INVALID_PARAMETER;
390 ASSERT (FreePoolHdr->Header.Signature == POOL_HEAD_SIGNATURE);
391 ASSERT (!FreePoolHdr->Header.Available);
392 if (FreePoolHdr->Header.Signature != POOL_HEAD_SIGNATURE) {
393 return EFI_INVALID_PARAMETER;
398 HasPoolTail = !(MemoryGuarded &&
399 ((
PcdGet8 (PcdHeapGuardPropertyMask) & BIT7) == 0));
402 PoolTail = HEAD_TO_TAIL (&FreePoolHdr->Header);
403 ASSERT (PoolTail->Signature == POOL_TAIL_SIGNATURE);
404 ASSERT (FreePoolHdr->Header.Size == PoolTail->Size);
405 if (PoolTail->Signature != POOL_TAIL_SIGNATURE) {
406 return EFI_INVALID_PARAMETER;
409 if (FreePoolHdr->Header.Size != PoolTail->Size) {
410 return EFI_INVALID_PARAMETER;
425 if (FreePoolHdr->Header.Size > MAX_POOL_SIZE) {
426 ASSERT (((
UINTN)FreePoolHdr & EFI_PAGE_MASK) == 0);
427 ASSERT ((FreePoolHdr->Header.Size & EFI_PAGE_MASK) == 0);
456 if (!EFI_ERROR (Status)) {
459 MemoryProfileActionFreePool,
BOOLEAN EFIAPI IsListEmpty(IN CONST LIST_ENTRY *ListHead)
LIST_ENTRY *EFIAPI InsertHeadList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
LIST_ENTRY *EFIAPI GetFirstNode(IN CONST LIST_ENTRY *List)
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
INTN EFIAPI HighBitSet32(IN UINT32 Operand)
VOID * AdjustPoolHeadF(IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NoPages, IN UINTN Size)
BOOLEAN IsHeapGuardEnabled(UINT8 GuardType)
BOOLEAN IsPoolTypeToGuard(IN EFI_MEMORY_TYPE MemoryType)
BOOLEAN EFIAPI IsMemoryGuarded(IN EFI_PHYSICAL_ADDRESS Address)
VOID * AdjustPoolHeadA(IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NoPages, IN UINTN Size)
EFI_STATUS EFIAPI SmmInternalAllocatePages(IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN NumberOfPages, OUT EFI_PHYSICAL_ADDRESS *Memory, IN BOOLEAN NeedGuard)
EFI_STATUS EFIAPI SmmInternalFreePages(IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NumberOfPages, IN BOOLEAN IsGuarded)
VOID SmmAddMemoryRegion(IN EFI_PHYSICAL_ADDRESS MemBase, IN UINT64 MemLength, IN EFI_MEMORY_TYPE Type, IN UINT64 Attributes)
EFI_STATUS EFIAPI SmmInternalFreePool(IN VOID *Buffer)
EFI_STATUS EFIAPI SmmInternalAllocatePool(IN EFI_MEMORY_TYPE PoolType, IN UINTN Size, OUT VOID **Buffer)
EFI_STATUS EFIAPI SmmFreePool(IN VOID *Buffer)
STATIC EFI_STATUS InternalFreePoolByIndex(IN FREE_POOL_HEADER *FreePoolHdr, IN POOL_TAIL *PoolTail OPTIONAL)
EFI_STATUS EFIAPI SmmAllocatePool(IN EFI_MEMORY_TYPE PoolType, IN UINTN Size, OUT VOID **Buffer)
EFI_STATUS InternalAllocPoolByIndex(IN EFI_MEMORY_TYPE PoolType, IN UINTN PoolIndex, OUT FREE_POOL_HEADER **FreePoolHdr)
SMM_POOL_TYPE UefiMemoryTypeToSmmPoolType(IN EFI_MEMORY_TYPE MemoryType)
VOID SmmInitializeMemoryServices(IN UINTN SmramRangeCount, IN EFI_SMRAM_DESCRIPTOR *SmramRanges)
#define RETURN_ADDRESS(L)
#define ARRAY_SIZE(Array)
#define GLOBAL_REMOVE_IF_UNREFERENCED
#define BASE_CR(Record, TYPE, Field)
#define PcdGet8(TokenName)
BOOLEAN VerifyMemoryGuard(IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINTN NumberOfPages)
EFI_STATUS EFIAPI SmmCoreUpdateProfile(IN PHYSICAL_ADDRESS CallerAddress, IN MEMORY_PROFILE_ACTION Action, IN EFI_MEMORY_TYPE MemoryType, IN UINTN Size, IN VOID *Buffer, IN CHAR8 *ActionString OPTIONAL)
UINT64 EFI_PHYSICAL_ADDRESS
#define EFI_PAGES_TO_SIZE(Pages)
#define EFI_SIZE_TO_PAGES(Size)
EFI_STATUS EFIAPI EfiGetSystemConfigurationTable(IN EFI_GUID *TableGuid, OUT VOID **Table)
EFI_PHYSICAL_ADDRESS SmramBase
SMRAM base address. The build tool assigns an offset relative to the SMRAM base for a SMM driver.