]>
Commit | Line | Data |
---|---|---|
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 | |
28 | EFI_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 | |
38 | EFI_GUID *\r | |
39 | GetFileNameFromFilePath (\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 | |
67 | BOOLEAN\r | |
68 | RegisterSmramProfileImage (\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 | |
126 | BOOLEAN\r | |
127 | UnregisterSmramProfileImage (\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 |