return Count;\r
}\r
\r
-/**\r
- Dump Smm memory map entry.\r
-**/\r
-VOID\r
-DumpSmmMemoryMapEntry (\r
- VOID\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- MEMORY_MAP *Entry;\r
- EFI_PHYSICAL_ADDRESS Last;\r
-\r
- Last = 0;\r
- DEBUG ((DEBUG_INFO, "DumpSmmMemoryMapEntry:\n"));\r
- Link = gMemoryMap.ForwardLink;\r
- while (Link != &gMemoryMap) {\r
- Entry = CR (Link, MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);\r
- Link = Link->ForwardLink;\r
-\r
- if ((Last != 0) && (Last != (UINT64)-1)) {\r
- if (Last + 1 != Entry->Start) {\r
- Last = (UINT64)-1;\r
- } else {\r
- Last = Entry->End;\r
- }\r
- } else if (Last == 0) {\r
- Last = Entry->End;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO, "Entry (Link - 0x%x)\n", &Entry->Link));\r
- DEBUG ((DEBUG_INFO, " Signature - 0x%x\n", Entry->Signature));\r
- DEBUG ((DEBUG_INFO, " Link.ForwardLink - 0x%x\n", Entry->Link.ForwardLink));\r
- DEBUG ((DEBUG_INFO, " Link.BackLink - 0x%x\n", Entry->Link.BackLink));\r
- DEBUG ((DEBUG_INFO, " Type - 0x%x\n", Entry->Type));\r
- DEBUG ((DEBUG_INFO, " Start - 0x%016lx\n", Entry->Start));\r
- DEBUG ((DEBUG_INFO, " End - 0x%016lx\n", Entry->End));\r
- }\r
-\r
- ASSERT (Last != (UINT64)-1);\r
-}\r
-\r
-/**\r
- Dump Smm memory map.\r
-**/\r
-VOID\r
-DumpSmmMemoryMap (\r
- VOID\r
- )\r
-{\r
- LIST_ENTRY *Node;\r
- FREE_PAGE_LIST *Pages;\r
-\r
- DEBUG ((DEBUG_INFO, "DumpSmmMemoryMap\n"));\r
-\r
- Pages = NULL;\r
- Node = mSmmMemoryMap.ForwardLink;\r
- while (Node != &mSmmMemoryMap) {\r
- Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);\r
- DEBUG ((DEBUG_INFO, "Pages - 0x%x\n", Pages));\r
- DEBUG ((DEBUG_INFO, "Pages->NumberOfPages - 0x%x\n", Pages->NumberOfPages));\r
- Node = Node->ForwardLink;\r
- }\r
-}\r
\r
-/**\r
- Check if a Smm base~length is in Smm memory map.\r
-\r
- @param[in] Base The base address of Smm memory to be checked.\r
- @param[in] Length THe length of Smm memory to be checked.\r
-\r
- @retval TRUE Smm base~length is in smm memory map.\r
- @retval FALSE Smm base~length is in smm memory map.\r
-**/\r
-BOOLEAN\r
-SmmMemoryMapConsistencyCheckRange (\r
- IN EFI_PHYSICAL_ADDRESS Base,\r
- IN UINTN Length\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- MEMORY_MAP *Entry;\r
- BOOLEAN Result;\r
-\r
- Result = FALSE;\r
- Link = gMemoryMap.ForwardLink;\r
- while (Link != &gMemoryMap) {\r
- Entry = CR (Link, MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE);\r
- Link = Link->ForwardLink;\r
-\r
- if (Entry->Type != EfiConventionalMemory) {\r
- continue;\r
- }\r
- if (Entry->Start == Base && Entry->End == Base + Length - 1) {\r
- Result = TRUE;\r
- break;\r
- }\r
- }\r
-\r
- return Result;\r
-}\r
-\r
-/**\r
- Check the consistency of Smm memory map.\r
-**/\r
-VOID\r
-SmmMemoryMapConsistencyCheck (\r
- VOID\r
- )\r
-{\r
- LIST_ENTRY *Node;\r
- FREE_PAGE_LIST *Pages;\r
- BOOLEAN Result;\r
-\r
- Pages = NULL;\r
- Node = mSmmMemoryMap.ForwardLink;\r
- while (Node != &mSmmMemoryMap) {\r
- Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);\r
- Result = SmmMemoryMapConsistencyCheckRange ((EFI_PHYSICAL_ADDRESS)(UINTN)Pages, (UINTN)EFI_PAGES_TO_SIZE(Pages->NumberOfPages));\r
- ASSERT (Result);\r
- Node = Node->ForwardLink;\r
- }\r
-}\r
\r
/**\r
Internal Function. Allocate n pages from given free page node.\r