12#define TRUNCATE_TO_PAGES(a) ((a) >> EFI_PAGE_SHIFT)
20#define MEMORY_MAP_SIGNATURE SIGNATURE_32('m','m','a','p')
33#define MAX_MAP_DEPTH 6
43UINTN mFreeMapStack = 0;
114 if (!EFI_ERROR (Status)) {
120 for (Index = 0; Index < RUNTIME_PAGE_ALLOCATION_GRANULARITY /
sizeof (
MEMORY_MAP); Index++) {
121 FreeDescriptorEntries[Index].Signature = MEMORY_MAP_SIGNATURE;
153 if (mFreeMapStack != 0) {
181 Entry->FromStack =
FALSE;
220 Entry->FromStack =
TRUE;
222 Entry->Signature = MEMORY_MAP_SIGNATURE;
224 Entry->Start = Start;
244 Entry->Link.ForwardLink =
NULL;
246 if (!Entry->FromStack) {
282 Link = gMemoryMap.ForwardLink;
283 while (Link != &gMemoryMap) {
284 Entry =
CR (Link,
MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);
285 Link = Link->ForwardLink;
297 if (Entry->Start > End) {
298 if ((Entry->Start == End + 1) && (Entry->Type == Type)) {
299 Entry->Start = Start;
314 if ((Entry->Start <= Start) && (Entry->End >= End)) {
315 if (Entry->Type != Type) {
316 if (Entry->Start < Start) {
337 if (Entry->End > End) {
361 Entry->Start = Start;
368 NextLink = Entry->Link.ForwardLink;
369 if (NextLink != &gMemoryMap) {
370 NextEntry =
CR (NextLink,
MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);
377 if ((Entry->Type == NextEntry->Type) && (Entry->End + 1 == NextEntry->Start)) {
378 Entry->End = NextEntry->End;
383 PreviousLink = Entry->Link.BackLink;
384 if (PreviousLink != &gMemoryMap) {
385 PreviousEntry =
CR (PreviousLink,
MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);
392 if ((PreviousEntry->Type == Entry->Type) && (PreviousEntry->End + 1 == Entry->Start)) {
393 PreviousEntry->End = Entry->End;
413 Link = gMemoryMap.BackLink;
414 if (Link != &gMemoryMap) {
415 Entry =
CR (Link,
MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);
416 if ((Entry->End + 1 == Start) && (Entry->Type == Type)) {
447 Link = gMemoryMap.ForwardLink;
448 while (Link != &gMemoryMap) {
449 Link = Link->ForwardLink;
477 Top = TRUNCATE_TO_PAGES (MaxAddress + 1 - (
UINTN)Pages);
478 if (Top > Pages->NumberOfPages) {
479 Top = Pages->NumberOfPages;
482 Bottom = Top - NumberOfPages;
484 if (Top < Pages->NumberOfPages) {
486 Node->NumberOfPages = Pages->NumberOfPages - Top;
491 Pages->NumberOfPages = Bottom;
519 for (Node = FreePageList->BackLink; Node != FreePageList; Node = Node->BackLink) {
521 if ((Pages->NumberOfPages >= NumberOfPages) &&
552 if ((Address & EFI_PAGE_MASK) != 0) {
557 for (Node = FreePageList->BackLink; Node != FreePageList; Node = Node->BackLink) {
559 if ((
UINTN)Pages <= Address) {
596 IN BOOLEAN AddRegion,
600 UINTN RequestedAddress;
605 return EFI_INVALID_PARAMETER;
608 if (NumberOfPages > TRUNCATE_TO_PAGES ((
UINTN)-1) + 1) {
609 return EFI_OUT_OF_RESOURCES;
615 RequestedAddress = (
UINTN)*Memory;
618 RequestedAddress = (
UINTN)(-1);
627 if (*Memory == (
UINTN)-1) {
628 return EFI_OUT_OF_RESOURCES;
640 if (*Memory == (
UINTN)-1) {
641 return EFI_OUT_OF_RESOURCES;
651 if (*Memory != RequestedAddress) {
652 return EFI_NOT_FOUND;
657 return EFI_INVALID_PARAMETER;
745 if (!EFI_ERROR (Status)) {
748 MemoryProfileActionAllocatePages,
776 TRUNCATE_TO_PAGES ((
UINTN)Next - (
UINTN)First) >= First->NumberOfPages
779 if (TRUNCATE_TO_PAGES ((
UINTN)Next - (
UINTN)First) == First->NumberOfPages) {
780 First->NumberOfPages += Next->NumberOfPages;
810 if (((Memory & EFI_PAGE_MASK) != 0) || (Memory == 0) || (NumberOfPages == 0)) {
811 return EFI_INVALID_PARAMETER;
815 Node = mSmmMemoryMap.ForwardLink;
816 while (Node != &mSmmMemoryMap) {
818 if (Memory < (
UINTN)Pages) {
822 Node = Node->ForwardLink;
825 if ((Node != &mSmmMemoryMap) &&
828 return EFI_INVALID_PARAMETER;
831 if (Node->BackLink != &mSmmMemoryMap) {
834 return EFI_INVALID_PARAMETER;
839 Pages->NumberOfPages = NumberOfPages;
842 if (Pages->Link.BackLink != &mSmmMemoryMap) {
848 if (Node != &mSmmMemoryMap) {
912 Link = gMemoryMap.ForwardLink;
913 while (Link != &gMemoryMap) {
914 Entry =
CR (Link,
MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);
915 Link = Link->ForwardLink;
917 if ((Entry->Start <= Memory) && (Entry->End >= Last)) {
946 if (!
InMemMap (Memory, NumberOfPages)) {
947 return EFI_NOT_FOUND;
952 if (!EFI_ERROR (Status)) {
955 MemoryProfileActionFreePages,
983 UINTN AlignedMemBase;
988 if ((Attributes & (EFI_ALLOCATED | EFI_NEEDS_TESTING | EFI_NEEDS_ECC_INITIALIZATION)) != 0) {
994 DEBUG ((DEBUG_INFO,
"SmmAddMemoryRegion\n"));
995 DEBUG ((DEBUG_INFO,
" MemBase - 0x%lx\n", MemBase));
996 DEBUG ((DEBUG_INFO,
" MemLength - 0x%lx\n", MemLength));
997 DEBUG ((DEBUG_INFO,
" Type - 0x%x\n", Type));
998 DEBUG ((DEBUG_INFO,
" Attributes - 0x%lx\n", Attributes));
1003 AlignedMemBase = (
UINTN)(MemBase + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
1004 MemLength -= AlignedMemBase - MemBase;
1051 OUT UINT32 *DescriptorVersion
1067 Size +=
sizeof (UINT64) - (Size %
sizeof (UINT64));
1069 if (DescriptorSize !=
NULL) {
1070 *DescriptorSize = Size;
1073 if (DescriptorVersion !=
NULL) {
1078 BufferSize = Size * Count;
1079 if (*MemoryMapSize < BufferSize) {
1080 *MemoryMapSize = BufferSize;
1081 return EFI_BUFFER_TOO_SMALL;
1084 *MemoryMapSize = BufferSize;
1085 if (MemoryMap ==
NULL) {
1086 return EFI_INVALID_PARAMETER;
1089 ZeroMem (MemoryMap, BufferSize);
1090 Link = gMemoryMap.ForwardLink;
1091 while (Link != &gMemoryMap) {
1092 Entry =
CR (Link,
MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);
1093 Link = Link->ForwardLink;
1095 MemoryMap->Type = Entry->Type;
1096 MemoryMap->PhysicalStart = Entry->Start;
1097 MemoryMap->NumberOfPages =
RShiftU64 (Entry->End - Entry->Start + 1, EFI_PAGE_SHIFT);
1099 MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size);
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 RemoveEntryList(IN CONST LIST_ENTRY *Entry)
UINT64 EFIAPI RShiftU64(IN UINT64 Operand, IN UINTN Count)
#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
BOOLEAN IsHeapGuardEnabled(UINT8 GuardType)
BOOLEAN EFIAPI IsMemoryGuarded(IN EFI_PHYSICAL_ADDRESS Address)
BOOLEAN IsPageTypeToGuard(IN EFI_MEMORY_TYPE MemoryType, IN EFI_ALLOCATE_TYPE AllocateType)
VOID CoreFreeMemoryMapStack(VOID)
LIST_ENTRY mFreeMemoryMapEntryList
MEMORY_MAP * AllocateMemoryMapEntry(VOID)
MEMORY_MAP mMapStack[MAX_MAP_DEPTH]
UINTN InternalAllocAddress(IN OUT LIST_ENTRY *FreePageList, IN UINTN NumberOfPages, IN UINTN Address)
EFI_STATUS EFIAPI SmmFreePages(IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NumberOfPages)
BOOLEAN InMemMap(IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NumberOfPages)
UINTN InternalAllocPagesOnOneNode(IN OUT FREE_PAGE_LIST *Pages, IN UINTN NumberOfPages, IN UINTN MaxAddress)
EFI_STATUS SmmInternalFreePagesEx(IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NumberOfPages, IN BOOLEAN AddRegion)
VOID ConvertSmmMemoryMapEntry(IN EFI_MEMORY_TYPE Type, IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NumberOfPages, IN BOOLEAN AddRegion)
VOID RemoveOldEntry(IN MEMORY_MAP *Entry)
FREE_PAGE_LIST * InternalMergeNodes(IN FREE_PAGE_LIST *First)
UINTN InternalAllocMaxAddress(IN OUT LIST_ENTRY *FreePageList, IN UINTN NumberOfPages, IN UINTN MaxAddress)
VOID InsertNewEntry(IN LIST_ENTRY *Link, IN UINT64 Start, IN UINT64 End, IN EFI_MEMORY_TYPE Type, IN BOOLEAN Next, IN BOOLEAN AddRegion)
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 SmmInternalAllocatePagesEx(IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN NumberOfPages, OUT EFI_PHYSICAL_ADDRESS *Memory, IN BOOLEAN AddRegion, IN BOOLEAN NeedGuard)
EFI_STATUS EFIAPI SmmAllocatePages(IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN NumberOfPages, OUT EFI_PHYSICAL_ADDRESS *Memory)
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)
UINTN GetSmmMemoryMapEntryCount(VOID)
EFI_STATUS EFIAPI SmmCoreGetMemoryMap(IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion)
#define RETURN_ADDRESS(L)
#define BASE_CR(Record, TYPE, Field)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
#define CR(Record, TYPE, Field, TestSignature)
BOOLEAN VerifyMemoryGuard(IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINTN NumberOfPages)
UINTN InternalAllocMaxAddressWithGuard(IN OUT LIST_ENTRY *FreePageList, IN UINTN NumberOfPages, IN UINTN MaxAddress, IN EFI_MEMORY_TYPE MemoryType)
EFI_STATUS SmmInternalFreePagesExWithGuard(IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NumberOfPages, IN BOOLEAN AddRegion)
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)
#define EFI_MEMORY_DESCRIPTOR_VERSION