return SmmInternalFreePagesEx (Memory, NumberOfPages, FALSE);\r
}\r
\r
+/**\r
+ Check whether the input range is in memory map.\r
+\r
+ @param Memory Base address of memory being inputed.\r
+ @param NumberOfPages The number of pages.\r
+\r
+ @retval TRUE In memory map.\r
+ @retval FALSE Not in memory map.\r
+\r
+**/\r
+BOOLEAN\r
+InMemMap (\r
+ IN EFI_PHYSICAL_ADDRESS Memory,\r
+ IN UINTN NumberOfPages\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ MEMORY_MAP *Entry;\r
+ EFI_PHYSICAL_ADDRESS Last;\r
+\r
+ Last = Memory + EFI_PAGES_TO_SIZE (NumberOfPages) - 1;\r
+\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->Start <= Memory) && (Entry->End >= Last)) {\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
/**\r
Frees previous allocated pages.\r
\r
EFI_STATUS Status;\r
BOOLEAN IsGuarded;\r
\r
+ if (!InMemMap(Memory, NumberOfPages)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
IsGuarded = IsHeapGuardEnabled () && IsMemoryGuarded (Memory);\r
Status = SmmInternalFreePages (Memory, NumberOfPages, IsGuarded);\r
if (!EFI_ERROR (Status)) {\r