]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/Page.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / Page.c
index 3699af7424584c33afd383b82c72c56610a7c5ab..1f05bddcc0b80336dcb530d723c984cc96d77976 100644 (file)
@@ -2,13 +2,7 @@
   SMM Memory page management functions.\r
 \r
   Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials are licensed and made available\r
-  under the terms and conditions of the BSD License which accompanies this\r
-  distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -451,128 +445,7 @@ GetSmmMemoryMapEntryCount (
   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
@@ -983,6 +856,41 @@ SmmInternalFreePages (
   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
@@ -1004,6 +912,10 @@ SmmFreePages (
   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