]> git.proxmox.com Git - mirror_edk2.git/commitdiff
EdkCompatibilityPkg: Add UEFI memory and SMRAM profile support.
authorStar Zeng <star.zeng@intel.com>
Wed, 12 Nov 2014 03:30:11 +0000 (03:30 +0000)
committerlzeng14 <lzeng14@Edk2>
Wed, 12 Nov 2014 03:30:11 +0000 (03:30 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16336 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/BootScriptSaveOnS3SaveStateThunk/BootScriptSaveOnS3SaveStateThunk.inf
EdkCompatibilityPkg/Compatibility/BootScriptSaveOnS3SaveStateThunk/ScriptSave.c
EdkCompatibilityPkg/Compatibility/BootScriptSaveOnS3SaveStateThunk/ScriptSave.h
EdkCompatibilityPkg/Compatibility/SmmBaseHelper/SmmBaseHelper.c
EdkCompatibilityPkg/Compatibility/SmmBaseHelper/SmmBaseHelper.inf
EdkCompatibilityPkg/Compatibility/SmmBaseHelper/SmramProfileRecord.c [new file with mode: 0644]

index e449308d4462b5c17dc77ee0cf109c6b02b7a1ab..def1ff0bebd8fb824da12941c7d70fa162fa8c9d 100644 (file)
@@ -4,7 +4,7 @@
 #  Intel's Framework Boot Script Save Protocol is replaced by S3 Save State Protocol in PI.\r
 #  This module produces Framework Boot Script Save protocol by consuming PI S3 Save State protocol\r
 #  \r
-#  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
   PcdLib\r
   DxeServicesLib\r
   CacheMaintenanceLib\r
+  BaseMemoryLib\r
+  DevicePathLib\r
+  UefiLib\r
 \r
 [Protocols]\r
   gEfiBootScriptSaveProtocolGuid          ## PRODUCES\r
   gEfiS3SaveStateProtocolGuid             ## CONSUMES\r
 \r
+[Guids]\r
+  gEdkiiMemoryProfileGuid\r
+\r
 [Pcd]\r
   gEfiEdkCompatibilityPkgTokenSpaceGuid.BootScriptThunkDataPtr\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdMemoryProfilePropertyMask\r
 \r
 [Depex]\r
   gEfiS3SaveStateProtocolGuid\r
index 84881ea6f5899b78cba7f78ce577a6204f3a6b97..4d1013caf00e02ad33d8f7413e8927bb140945e5 100644 (file)
@@ -2,7 +2,7 @@
   Implementation for S3 Boot Script Save thunk driver.\r
   This thunk driver consumes PI S3SaveState protocol to produce framework S3BootScriptSave Protocol \r
   \r
-  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2014, 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
@@ -791,6 +791,47 @@ BootScriptCloseTable (
   return EFI_UNSUPPORTED;\r
 }\r
 \r
+/**\r
+  Register image to memory profile.\r
+\r
+  @param FileName       File name of the image.\r
+  @param ImageBase      Image base address.\r
+  @param ImageSize      Image size.\r
+  @param FileType       File type of the image.\r
+\r
+**/\r
+VOID\r
+RegisterMemoryProfileImage (\r
+  IN EFI_GUID                       *FileName,\r
+  IN PHYSICAL_ADDRESS               ImageBase,\r
+  IN UINT64                         ImageSize,\r
+  IN EFI_FV_FILETYPE                FileType\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EDKII_MEMORY_PROFILE_PROTOCOL     *ProfileProtocol;\r
+  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FilePath;\r
+  UINT8                             TempBuffer[sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH) + sizeof (EFI_DEVICE_PATH_PROTOCOL)];\r
+\r
+  if ((PcdGet8 (PcdMemoryProfilePropertyMask) & BIT0) != 0) {\r
+\r
+    FilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)TempBuffer;\r
+    Status = gBS->LocateProtocol (&gEdkiiMemoryProfileGuid, NULL, (VOID **) &ProfileProtocol);\r
+    if (!EFI_ERROR (Status)) {\r
+      EfiInitializeFwVolDevicepathNode (FilePath, FileName);\r
+      SetDevicePathEndNode (FilePath + 1);\r
+\r
+      Status = ProfileProtocol->RegisterImage (\r
+                                  ProfileProtocol,\r
+                                  (EFI_DEVICE_PATH_PROTOCOL *) FilePath,\r
+                                  ImageBase,\r
+                                  ImageSize,\r
+                                  FileType\r
+                                  );\r
+    }\r
+  }\r
+}\r
+\r
 /**\r
   This routine is entry point of ScriptSave driver.\r
 \r
@@ -893,6 +934,14 @@ InitializeScriptSaveOnS3SaveState (
     // Flush the instruction cache so the image data is written before we execute it\r
     //\r
     InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);\r
+\r
+    RegisterMemoryProfileImage (\r
+      &gEfiCallerIdGuid,\r
+      ImageContext.ImageAddress,\r
+      ImageContext.ImageSize,\r
+      EFI_FV_FILETYPE_DRIVER\r
+    );\r
+\r
     Status = ((EFI_IMAGE_ENTRY_POINT)(UINTN)(ImageContext.EntryPoint)) (NewImageHandle, SystemTable);\r
     ASSERT_EFI_ERROR (Status);\r
 \r
index b98e83a21460cf1f434880804b152d503cfa4033..cac7b0b85c1fafb5fbbcf42cfe2c05de8459c472 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Header file for S3 Boot Script Saver thunk driver.\r
 \r
-  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2014, 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
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/DxeServicesLib.h>\r
 #include <Library/CacheMaintenanceLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/UefiLib.h>\r
 \r
 #include <Guid/BootScriptThunkData.h>\r
+#include <Guid/MemoryProfile.h>\r
 \r
 #include <IndustryStandard/SmBus.h>\r
 \r
index a2d89eaa213e6333be068190ee72996775a5fa06..2b94e4d877dcb79e18f05f7db926a73b2aa8d7f5 100644 (file)
@@ -34,6 +34,7 @@
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/SynchronizationLib.h>\r
 #include <Library/CpuLib.h>\r
+#include <Library/PcdLib.h>\r
 #include <Guid/SmmBaseThunkCommunication.h>\r
 #include <Protocol/SmmBaseHelperReady.h>\r
 #include <Protocol/SmmCpu.h>\r
 #include <Protocol/SmmReadyToLock.h>\r
 #include <Protocol/SmmAccess2.h>\r
 \r
+/**\r
+  Register SMM image to SMRAM profile.\r
+\r
+  @param[in] FilePath           File path of the image.\r
+  @param[in] ImageBuffer        Image base address.\r
+  @param[in] NumberOfPage       Number of page.\r
+\r
+  @retval TRUE                  Register success.\r
+  @retval FALSE                 Register fail.\r
+\r
+**/\r
+BOOLEAN\r
+RegisterSmramProfileImage (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *FilePath,\r
+  IN PHYSICAL_ADDRESS           ImageBuffer,\r
+  IN UINTN                      NumberOfPage\r
+  );\r
+\r
+/**\r
+  Unregister SMM image from SMRAM profile.\r
+\r
+  @param[in] FilePath           File path of the image.\r
+  @param[in] ImageBuffer        Image base address.\r
+  @param[in] NumberOfPage       Number of page.\r
+\r
+  @retval TRUE                  Unregister success.\r
+  @retval FALSE                 Unregister fail.\r
+\r
+**/\r
+BOOLEAN\r
+UnregisterSmramProfileImage (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *FilePath,\r
+  IN PHYSICAL_ADDRESS           ImageBuffer,\r
+  IN UINTN                      NumberOfPage\r
+  );\r
+\r
 ///\r
 /// Structure for tracking paired information of registered Framework SMI handler\r
 /// and correpsonding dispatch handle for SMI handler thunk.\r
@@ -694,11 +731,13 @@ LoadImage (
     mFrameworkSmst->NumberOfCpus          = mNumberOfProcessors;\r
     mFrameworkSmst->CurrentlyExecutingCpu = gSmst->CurrentlyExecutingCpu;\r
 \r
+    RegisterSmramProfileImage (FilePath, DstBuffer, PageCount);\r
     Status = gBS->StartImage (*ImageHandle, NULL, NULL);\r
     if (EFI_ERROR (Status)) {\r
       mLoadPe32Image->UnLoadPeImage (mLoadPe32Image, *ImageHandle);\r
       *ImageHandle = NULL;\r
       FreePages ((VOID *)(UINTN)DstBuffer, PageCount);\r
+      UnregisterSmramProfileImage (FilePath, DstBuffer, PageCount);\r
     }\r
   }\r
 \r
index f988c138fe83de9a2f5bf1253d6a04e12582f688..8e967dc2cb38b2f71118fc5cfaa41837b56f5e33 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 #  Component description file for SMM Base Helper SMM driver.\r
 #\r
-#  Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
@@ -30,6 +30,7 @@
 \r
 [Sources]\r
   SmmBaseHelper.c\r
+  SmramProfileRecord.c\r
 \r
 [Sources.Ia32]\r
   PageFaultHandler.c\r
   MemoryAllocationLib\r
   SynchronizationLib\r
   CpuLib\r
+  PcdLib\r
 \r
 [Guids]\r
   gEfiSmmBaseThunkCommunicationGuid\r
+  gEdkiiMemoryProfileGuid\r
 \r
 [Protocols]\r
   gEfiSmmBaseHelperReadyProtocolGuid     # PROTOCOL ALWAYS_PRODUCED\r
   gEfiLoadPeImageProtocolGuid            # PROTOCOL ALWAYS_CONSUMED\r
   gEfiSmmReadyToLockProtocolGuid         # PROTOCOL ALWAYS_CONSUMED\r
   gEfiSmmAccess2ProtocolGuid             # PROTOCOL ALWAYS_CONSUMED\r
+  gEfiSmmCommunicationProtocolGuid\r
+\r
+[Pcd]\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdMemoryProfilePropertyMask\r
 \r
 [Depex]\r
   gEfiSmmCpuProtocolGuid AND\r
diff --git a/EdkCompatibilityPkg/Compatibility/SmmBaseHelper/SmramProfileRecord.c b/EdkCompatibilityPkg/Compatibility/SmmBaseHelper/SmramProfileRecord.c
new file mode 100644 (file)
index 0000000..84eba48
--- /dev/null
@@ -0,0 +1,171 @@
+/** @file\r
+\r
+  Copyright (c) 2014, 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
+  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
+\r
+**/\r
+\r
+#include <PiSmm.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/SmmServicesTableLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Protocol/SmmCommunication.h>\r
+\r
+#include <Guid/MemoryProfile.h>\r
+\r
+EFI_SMM_COMMUNICATION_PROTOCOL *mSmmCommunication = NULL;\r
+\r
+/**\r
+  Get the GUID file name from the file path.\r
+\r
+  @param FilePath  File path.\r
+\r
+  @return The GUID file name from the file path.\r
+\r
+**/\r
+EFI_GUID *\r
+GetFileNameFromFilePath (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *FilePath\r
+  )\r
+{\r
+  MEDIA_FW_VOL_FILEPATH_DEVICE_PATH     *ThisFilePath;\r
+\r
+  ThisFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) FilePath;\r
+  while (!IsDevicePathEnd (ThisFilePath)) {\r
+    if ((DevicePathType (ThisFilePath) == MEDIA_DEVICE_PATH) && (DevicePathSubType (ThisFilePath) == MEDIA_PIWG_FW_FILE_DP)) {\r
+      return &ThisFilePath->FvFileName;\r
+    }\r
+    ThisFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) NextDevicePathNode (ThisFilePath);\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+/**\r
+  Register SMM image to SMRAM profile.\r
+\r
+  @param[in] FilePath           File path of the image.\r
+  @param[in] ImageBuffer        Image base address.\r
+  @param[in] NumberOfPage       Number of page.\r
+\r
+  @retval TRUE                  Register success.\r
+  @retval FALSE                 Register fail.\r
+\r
+**/\r
+BOOLEAN\r
+RegisterSmramProfileImage (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *FilePath,\r
+  IN PHYSICAL_ADDRESS           ImageBuffer,\r
+  IN UINTN                      NumberOfPage\r
+  )\r
+{\r
+  EFI_GUID                                      *FileName;\r
+  EFI_STATUS                                    Status;\r
+  UINTN                                         CommSize;\r
+  UINT8                                         CommBuffer[sizeof (EFI_GUID) + sizeof (UINTN) + sizeof (SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE)];\r
+  EFI_SMM_COMMUNICATE_HEADER                    *CommHeader;\r
+  SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE        *CommRegisterImage;\r
+\r
+  if ((PcdGet8 (PcdMemoryProfilePropertyMask) & BIT1) == 0) {\r
+    return FALSE;\r
+  }\r
+\r
+  FileName = GetFileNameFromFilePath (FilePath);\r
+\r
+  if (mSmmCommunication == NULL) {\r
+    Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **) &mSmmCommunication);\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
+  CommHeader = (EFI_SMM_COMMUNICATE_HEADER *) &CommBuffer[0];\r
+  CopyMem (&CommHeader->HeaderGuid, &gEdkiiMemoryProfileGuid, sizeof (gEdkiiMemoryProfileGuid));\r
+  CommHeader->MessageLength = sizeof (SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE);\r
+\r
+  CommRegisterImage = (SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
+  CommRegisterImage->Header.Command      = SMRAM_PROFILE_COMMAND_REGISTER_IMAGE;\r
+  CommRegisterImage->Header.DataLength   = sizeof (*CommRegisterImage);\r
+  CommRegisterImage->Header.ReturnStatus = (UINT64)-1;\r
+  CopyMem (&CommRegisterImage->FileName, FileName, sizeof(EFI_GUID));\r
+  CommRegisterImage->ImageBuffer         = ImageBuffer;\r
+  CommRegisterImage->NumberOfPage        = NumberOfPage;\r
+\r
+  CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;\r
+  Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (CommRegisterImage->Header.ReturnStatus != 0) {\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
+/**\r
+  Unregister SMM image from SMRAM profile.\r
+\r
+  @param[in] FilePath           File path of the image.\r
+  @param[in] ImageBuffer        Image base address.\r
+  @param[in] NumberOfPage       Number of page.\r
+\r
+  @retval TRUE                  Unregister success.\r
+  @retval FALSE                 Unregister fail.\r
+\r
+**/\r
+BOOLEAN\r
+UnregisterSmramProfileImage (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *FilePath,\r
+  IN PHYSICAL_ADDRESS           ImageBuffer,\r
+  IN UINTN                      NumberOfPage\r
+  )\r
+{\r
+  EFI_GUID                                      *FileName;\r
+  EFI_STATUS                                    Status;\r
+  UINTN                                         CommSize;\r
+  UINT8                                         CommBuffer[sizeof (EFI_GUID) + sizeof (UINTN) + sizeof (SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE)];\r
+  EFI_SMM_COMMUNICATE_HEADER                    *CommHeader;\r
+  SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE      *CommUnregisterImage;\r
+\r
+  if ((PcdGet8 (PcdMemoryProfilePropertyMask) & BIT1) == 0) {\r
+    return FALSE;\r
+  }\r
+\r
+  FileName = GetFileNameFromFilePath (FilePath);\r
+\r
+  if (mSmmCommunication == NULL) {\r
+    Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **) &mSmmCommunication);\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
+  CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
+  CopyMem (&CommHeader->HeaderGuid, &gEdkiiMemoryProfileGuid, sizeof(gEdkiiMemoryProfileGuid));\r
+  CommHeader->MessageLength = sizeof(SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE);\r
+\r
+  CommUnregisterImage = (SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
+  CommUnregisterImage->Header.Command      = SMRAM_PROFILE_COMMAND_UNREGISTER_IMAGE;\r
+  CommUnregisterImage->Header.DataLength   = sizeof (*CommUnregisterImage);\r
+  CommUnregisterImage->Header.ReturnStatus = (UINT64)-1;\r
+  CopyMem (&CommUnregisterImage->FileName, FileName, sizeof(EFI_GUID));\r
+  CommUnregisterImage->ImageBuffer         = ImageBuffer;\r
+  CommUnregisterImage->NumberOfPage        = NumberOfPage;\r
+\r
+  CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;\r
+  Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (CommUnregisterImage->Header.ReturnStatus != 0) {\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+}\r