]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/MemoryAllocationLib.c
MdeModulePkg/CapsuleLib: Follow UEFI 22.2.3 to process FMP.
[mirror_edk2.git] / MdeModulePkg / Library / PiSmmCoreMemoryAllocationLib / MemoryAllocationLib.c
index 892ba0a040c9eb6fdce0167a0ce95d5a420232be..bd2146892495656a8b179d1969e4522644852c26 100644 (file)
@@ -1,5 +1,6 @@
 /** @file\r
-  Support routines for memory allocation routines based on SMM Core internal functions.\r
+  Support routines for memory allocation routines based on SMM Core internal functions,\r
+  with memory profile support.\r
   \r
   The PI System Management Mode Core Interface Specification only allows the use\r
   of EfiRuntimeServicesCode and EfiRuntimeServicesData memory types for memory \r
@@ -10,7 +11,7 @@
   In addition, allocation for the Reserved memory types are not supported and will \r
   always return NULL.\r
 \r
-  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials                          \r
   are licensed and made available under the terms and conditions of the BSD License         \r
   which accompanies this distribution.  The full text of the license may be found at        \r
 \r
 #include <PiSmm.h>\r
 \r
-#include <Protocol/SmmAccess2.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/DebugLib.h>\r
 #include "PiSmmCoreMemoryAllocationServices.h"\r
 \r
+#include <Library/MemoryProfileLib.h>\r
+\r
 EFI_SMRAM_DESCRIPTOR  *mSmmCoreMemoryAllocLibSmramRanges    = NULL;\r
 UINTN                 mSmmCoreMemoryAllocLibSmramRangeCount = 0;\r
 \r
@@ -38,7 +40,7 @@ UINTN                 mSmmCoreMemoryAllocLibSmramRangeCount = 0;
 \r
   @param[in]  Buffer   The pointer to the buffer to be checked.\r
 \r
-  @retval     TURE     The buffer is in SMRAM ranges.\r
+  @retval     TRUE     The buffer is in SMRAM ranges.\r
   @retval     FALSE    The buffer is out of SMRAM ranges.\r
 **/\r
 BOOLEAN\r
@@ -111,7 +113,20 @@ AllocatePages (
   IN UINTN  Pages\r
   )\r
 {\r
-  return InternalAllocatePages (EfiRuntimeServicesData, Pages);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalAllocatePages (EfiRuntimeServicesData, Pages);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_PAGES,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      EFI_PAGES_TO_SIZE(Pages),\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -133,7 +148,20 @@ AllocateRuntimePages (
   IN UINTN  Pages\r
   )\r
 {\r
-  return InternalAllocatePages (EfiRuntimeServicesData, Pages);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalAllocatePages (EfiRuntimeServicesData, Pages);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_PAGES,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      EFI_PAGES_TO_SIZE(Pages),\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -312,7 +340,20 @@ AllocateAlignedPages (
   IN UINTN  Alignment\r
   )\r
 {\r
-  return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alignment);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alignment);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_PAGES,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      EFI_PAGES_TO_SIZE(Pages),\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -340,7 +381,20 @@ AllocateAlignedRuntimePages (
   IN UINTN  Alignment\r
   )\r
 {\r
-  return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alignment);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alignment);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_RUNTIME_PAGES,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      EFI_PAGES_TO_SIZE(Pages),\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -463,7 +517,20 @@ AllocatePool (
   IN UINTN  AllocationSize\r
   )\r
 {\r
-  return InternalAllocatePool (EfiRuntimeServicesData, AllocationSize);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalAllocatePool (EfiRuntimeServicesData, AllocationSize);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_POOL,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      AllocationSize,\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -484,7 +551,20 @@ AllocateRuntimePool (
   IN UINTN  AllocationSize\r
   )\r
 {\r
-  return InternalAllocatePool (EfiRuntimeServicesData, AllocationSize);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalAllocatePool (EfiRuntimeServicesData, AllocationSize);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_POOL,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      AllocationSize,\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -556,7 +636,20 @@ AllocateZeroPool (
   IN UINTN  AllocationSize\r
   )\r
 {\r
-  return InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationSize);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationSize);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ZERO_POOL,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      AllocationSize,\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -578,7 +671,20 @@ AllocateRuntimeZeroPool (
   IN UINTN  AllocationSize\r
   )\r
 {\r
-  return InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationSize);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationSize);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_ZERO_POOL,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      AllocationSize,\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -663,7 +769,20 @@ AllocateCopyPool (
   IN CONST VOID  *Buffer\r
   )\r
 {\r
-  return InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer);\r
+  VOID  *NewBuffer;\r
+\r
+  NewBuffer = InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer);\r
+  if (NewBuffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_COPY_POOL,\r
+      EfiRuntimeServicesData,\r
+      NewBuffer,\r
+      AllocationSize,\r
+      NULL\r
+      );\r
+  }\r
+  return NewBuffer;\r
 }\r
 \r
 /**\r
@@ -690,7 +809,20 @@ AllocateRuntimeCopyPool (
   IN CONST VOID  *Buffer\r
   )\r
 {\r
-  return InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer);\r
+  VOID  *NewBuffer;\r
+\r
+  NewBuffer = InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer);\r
+  if (NewBuffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_COPY_POOL,\r
+      EfiRuntimeServicesData,\r
+      NewBuffer,\r
+      AllocationSize,\r
+      NULL\r
+      );\r
+  }\r
+  return NewBuffer;\r
 }\r
 \r
 /**\r
@@ -789,7 +921,20 @@ ReallocatePool (
   IN VOID   *OldBuffer  OPTIONAL\r
   )\r
 {\r
-  return InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewSize, OldBuffer);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewSize, OldBuffer);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_REALLOCATE_POOL,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      NewSize,\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -821,7 +966,20 @@ ReallocateRuntimePool (
   IN VOID   *OldBuffer  OPTIONAL\r
   )\r
 {\r
-  return InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewSize, OldBuffer);\r
+  VOID  *Buffer;\r
+\r
+  Buffer = InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewSize, OldBuffer);\r
+  if (Buffer != NULL) {\r
+    MemoryProfileLibRecord (\r
+      (PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS(0),\r
+      MEMORY_PROFILE_ACTION_LIB_REALLOCATE_RUNTIME_POOL,\r
+      EfiRuntimeServicesData,\r
+      Buffer,\r
+      NewSize,\r
+      NULL\r
+      );\r
+  }\r
+  return Buffer;\r
 }\r
 \r
 /**\r
@@ -919,11 +1077,11 @@ PiSmmCoreMemoryAllocationLibConstructor (
   //\r
   SmmInitializeMemoryServices (SmmCorePrivate->SmramRangeCount, SmmCorePrivate->SmramRanges);\r
 \r
-  mSmmCoreMemoryAllocLibSmramRangeCount = SmmCorePrivate->FullSmramRangeCount;\r
+  mSmmCoreMemoryAllocLibSmramRangeCount = SmmCorePrivate->SmramRangeCount;\r
   Size = mSmmCoreMemoryAllocLibSmramRangeCount * sizeof (EFI_SMRAM_DESCRIPTOR);\r
   mSmmCoreMemoryAllocLibSmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocatePool (Size);\r
   ASSERT (mSmmCoreMemoryAllocLibSmramRanges != NULL);\r
-  CopyMem (mSmmCoreMemoryAllocLibSmramRanges, SmmCorePrivate->FullSmramRanges, Size);\r
+  CopyMem (mSmmCoreMemoryAllocLibSmramRanges, SmmCorePrivate->SmramRanges, Size);\r
 \r
   return EFI_SUCCESS;\r
 }\r