+++ /dev/null
-/** @file\r
-\r
- Copyright (c) 2014 - 2015, 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 <Library/PcdLib.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