]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/SmmBaseHelper/SmramProfileRecord.c
EdkCompatibilityPkg SmmBaseHelper: Unregister profile image correctly.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / SmmBaseHelper / SmramProfileRecord.c
CommitLineData
09fc7dbb
SZ
1/** @file\r
2\r
071586ee 3 Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
09fc7dbb
SZ
4 This program and the accompanying materials \r
5 are licensed and made available under the terms and conditions of the BSD License \r
6 which accompanies this distribution. The full text of the license may be found at \r
7 http://opensource.org/licenses/bsd-license.php. \r
8\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12**/\r
13\r
14#include <PiSmm.h>\r
15\r
16#include <Library/BaseLib.h>\r
17#include <Library/MemoryAllocationLib.h>\r
18#include <Library/UefiBootServicesTableLib.h>\r
19#include <Library/SmmServicesTableLib.h>\r
20#include <Library/DevicePathLib.h>\r
21#include <Library/BaseMemoryLib.h>\r
22#include <Library/DebugLib.h>\r
071586ee 23#include <Library/PcdLib.h>\r
09fc7dbb
SZ
24#include <Protocol/SmmCommunication.h>\r
25\r
26#include <Guid/MemoryProfile.h>\r
27\r
28EFI_SMM_COMMUNICATION_PROTOCOL *mSmmCommunication = NULL;\r
29\r
30/**\r
31 Get the GUID file name from the file path.\r
32\r
33 @param FilePath File path.\r
34\r
35 @return The GUID file name from the file path.\r
36\r
37**/\r
38EFI_GUID *\r
39GetFileNameFromFilePath (\r
40 IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
41 )\r
42{\r
43 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *ThisFilePath;\r
44\r
45 ThisFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) FilePath;\r
46 while (!IsDevicePathEnd (ThisFilePath)) {\r
47 if ((DevicePathType (ThisFilePath) == MEDIA_DEVICE_PATH) && (DevicePathSubType (ThisFilePath) == MEDIA_PIWG_FW_FILE_DP)) {\r
48 return &ThisFilePath->FvFileName;\r
49 }\r
50 ThisFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) NextDevicePathNode (ThisFilePath);\r
51 }\r
52\r
53 return NULL;\r
54}\r
55\r
56/**\r
57 Register SMM image to SMRAM profile.\r
58\r
59 @param[in] FilePath File path of the image.\r
60 @param[in] ImageBuffer Image base address.\r
61 @param[in] NumberOfPage Number of page.\r
62\r
63 @retval TRUE Register success.\r
64 @retval FALSE Register fail.\r
65\r
66**/\r
67BOOLEAN\r
68RegisterSmramProfileImage (\r
69 IN EFI_DEVICE_PATH_PROTOCOL *FilePath,\r
70 IN PHYSICAL_ADDRESS ImageBuffer,\r
71 IN UINTN NumberOfPage\r
72 )\r
73{\r
74 EFI_GUID *FileName;\r
75 EFI_STATUS Status;\r
76 UINTN CommSize;\r
77 UINT8 CommBuffer[sizeof (EFI_GUID) + sizeof (UINTN) + sizeof (SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE)];\r
78 EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
79 SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE *CommRegisterImage;\r
80\r
81 if ((PcdGet8 (PcdMemoryProfilePropertyMask) & BIT1) == 0) {\r
82 return FALSE;\r
83 }\r
84\r
85 FileName = GetFileNameFromFilePath (FilePath);\r
86\r
87 if (mSmmCommunication == NULL) {\r
88 Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **) &mSmmCommunication);\r
89 ASSERT_EFI_ERROR (Status);\r
90 }\r
91\r
92 CommHeader = (EFI_SMM_COMMUNICATE_HEADER *) &CommBuffer[0];\r
93 CopyMem (&CommHeader->HeaderGuid, &gEdkiiMemoryProfileGuid, sizeof (gEdkiiMemoryProfileGuid));\r
94 CommHeader->MessageLength = sizeof (SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE);\r
95\r
96 CommRegisterImage = (SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
97 CommRegisterImage->Header.Command = SMRAM_PROFILE_COMMAND_REGISTER_IMAGE;\r
98 CommRegisterImage->Header.DataLength = sizeof (*CommRegisterImage);\r
99 CommRegisterImage->Header.ReturnStatus = (UINT64)-1;\r
100 CopyMem (&CommRegisterImage->FileName, FileName, sizeof(EFI_GUID));\r
101 CommRegisterImage->ImageBuffer = ImageBuffer;\r
102 CommRegisterImage->NumberOfPage = NumberOfPage;\r
103\r
104 CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;\r
105 Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
106 ASSERT_EFI_ERROR (Status);\r
107\r
108 if (CommRegisterImage->Header.ReturnStatus != 0) {\r
109 return FALSE;\r
110 }\r
111\r
112 return TRUE;\r
113}\r
114\r
115/**\r
116 Unregister SMM image from SMRAM profile.\r
117\r
118 @param[in] FilePath File path of the image.\r
119 @param[in] ImageBuffer Image base address.\r
120 @param[in] NumberOfPage Number of page.\r
121\r
122 @retval TRUE Unregister success.\r
123 @retval FALSE Unregister fail.\r
124\r
125**/\r
126BOOLEAN\r
127UnregisterSmramProfileImage (\r
128 IN EFI_DEVICE_PATH_PROTOCOL *FilePath,\r
129 IN PHYSICAL_ADDRESS ImageBuffer,\r
130 IN UINTN NumberOfPage\r
131 )\r
132{\r
133 EFI_GUID *FileName;\r
134 EFI_STATUS Status;\r
135 UINTN CommSize;\r
136 UINT8 CommBuffer[sizeof (EFI_GUID) + sizeof (UINTN) + sizeof (SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE)];\r
137 EFI_SMM_COMMUNICATE_HEADER *CommHeader;\r
138 SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE *CommUnregisterImage;\r
139\r
140 if ((PcdGet8 (PcdMemoryProfilePropertyMask) & BIT1) == 0) {\r
141 return FALSE;\r
142 }\r
143\r
144 FileName = GetFileNameFromFilePath (FilePath);\r
145\r
146 if (mSmmCommunication == NULL) {\r
147 Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **) &mSmmCommunication);\r
148 ASSERT_EFI_ERROR (Status);\r
149 }\r
150\r
151 CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];\r
152 CopyMem (&CommHeader->HeaderGuid, &gEdkiiMemoryProfileGuid, sizeof(gEdkiiMemoryProfileGuid));\r
153 CommHeader->MessageLength = sizeof(SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE);\r
154\r
155 CommUnregisterImage = (SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];\r
156 CommUnregisterImage->Header.Command = SMRAM_PROFILE_COMMAND_UNREGISTER_IMAGE;\r
157 CommUnregisterImage->Header.DataLength = sizeof (*CommUnregisterImage);\r
158 CommUnregisterImage->Header.ReturnStatus = (UINT64)-1;\r
159 CopyMem (&CommUnregisterImage->FileName, FileName, sizeof(EFI_GUID));\r
160 CommUnregisterImage->ImageBuffer = ImageBuffer;\r
161 CommUnregisterImage->NumberOfPage = NumberOfPage;\r
162\r
163 CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;\r
164 Status = mSmmCommunication->Communicate (mSmmCommunication, CommBuffer, &CommSize);\r
165 ASSERT_EFI_ERROR (Status);\r
166\r
167 if (CommUnregisterImage->Header.ReturnStatus != 0) {\r
168 return FALSE;\r
169 }\r
170\r
171 return TRUE;\r
172}\r