]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - SecurityPkg/Tcg/TcgSmm/TcgSmm.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / SecurityPkg / Tcg / TcgSmm / TcgSmm.c
... / ...
CommitLineData
1/** @file\r
2 It updates TPM items in ACPI table and registers SMI callback\r
3 functions for physical presence and ClearMemory.\r
4\r
5 Caution: This module requires additional review when modified.\r
6 This driver will have external input - variable and ACPINvs data in SMM mode.\r
7 This external input must be validated carefully to avoid security issue.\r
8\r
9 PhysicalPresenceCallback() and MemoryClearCallback() will receive untrusted input and do some check.\r
10\r
11Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
12SPDX-License-Identifier: BSD-2-Clause-Patent\r
13\r
14**/\r
15\r
16#include "TcgSmm.h"\r
17\r
18EFI_SMM_VARIABLE_PROTOCOL *mSmmVariable;\r
19TCG_NVS *mTcgNvs;\r
20\r
21/**\r
22 Software SMI callback for TPM physical presence which is called from ACPI method.\r
23\r
24 Caution: This function may receive untrusted input.\r
25 Variable and ACPINvs are external input, so this function will validate\r
26 its data structure to be valid value.\r
27\r
28 @param[in] DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister().\r
29 @param[in] Context Points to an optional handler context which was specified when the\r
30 handler was registered.\r
31 @param[in, out] CommBuffer A pointer to a collection of data in memory that will\r
32 be conveyed from a non-SMM environment into an SMM environment.\r
33 @param[in, out] CommBufferSize The size of the CommBuffer.\r
34\r
35 @retval EFI_SUCCESS The interrupt was handled successfully.\r
36\r
37**/\r
38EFI_STATUS\r
39EFIAPI\r
40PhysicalPresenceCallback (\r
41 IN EFI_HANDLE DispatchHandle,\r
42 IN CONST VOID *Context,\r
43 IN OUT VOID *CommBuffer,\r
44 IN OUT UINTN *CommBufferSize\r
45 )\r
46{\r
47 EFI_STATUS Status;\r
48 UINTN DataSize;\r
49 EFI_PHYSICAL_PRESENCE PpData;\r
50 EFI_PHYSICAL_PRESENCE_FLAGS Flags;\r
51 BOOLEAN RequestConfirmed;\r
52\r
53 //\r
54 // Get the Physical Presence variable\r
55 //\r
56 DataSize = sizeof (EFI_PHYSICAL_PRESENCE);\r
57 Status = mSmmVariable->SmmGetVariable (\r
58 PHYSICAL_PRESENCE_VARIABLE,\r
59 &gEfiPhysicalPresenceGuid,\r
60 NULL,\r
61 &DataSize,\r
62 &PpData\r
63 );\r
64\r
65 DEBUG ((DEBUG_INFO, "[TPM] PP callback, Parameter = %x\n", mTcgNvs->PhysicalPresence.Parameter));\r
66 if (mTcgNvs->PhysicalPresence.Parameter == ACPI_FUNCTION_RETURN_REQUEST_RESPONSE_TO_OS) {\r
67 if (EFI_ERROR (Status)) {\r
68 mTcgNvs->PhysicalPresence.ReturnCode = PP_RETURN_TPM_OPERATION_RESPONSE_FAILURE;\r
69 mTcgNvs->PhysicalPresence.LastRequest = 0;\r
70 mTcgNvs->PhysicalPresence.Response = 0;\r
71 DEBUG ((DEBUG_ERROR, "[TPM] Get PP variable failure! Status = %r\n", Status));\r
72 return EFI_SUCCESS;\r
73 }\r
74\r
75 mTcgNvs->PhysicalPresence.ReturnCode = PP_RETURN_TPM_OPERATION_RESPONSE_SUCCESS;\r
76 mTcgNvs->PhysicalPresence.LastRequest = PpData.LastPPRequest;\r
77 mTcgNvs->PhysicalPresence.Response = PpData.PPResponse;\r
78 } else if ( (mTcgNvs->PhysicalPresence.Parameter == ACPI_FUNCTION_SUBMIT_REQUEST_TO_BIOS)\r
79 || (mTcgNvs->PhysicalPresence.Parameter == ACPI_FUNCTION_SUBMIT_REQUEST_TO_BIOS_2))\r
80 {\r
81 if (EFI_ERROR (Status)) {\r
82 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;\r
83 DEBUG ((DEBUG_ERROR, "[TPM] Get PP variable failure! Status = %r\n", Status));\r
84 return EFI_SUCCESS;\r
85 }\r
86\r
87 if (mTcgNvs->PhysicalPresence.Request == PHYSICAL_PRESENCE_SET_OPERATOR_AUTH) {\r
88 //\r
89 // This command requires UI to prompt user for Auth data.\r
90 //\r
91 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED;\r
92 return EFI_SUCCESS;\r
93 }\r
94\r
95 if (PpData.PPRequest != mTcgNvs->PhysicalPresence.Request) {\r
96 PpData.PPRequest = (UINT8)mTcgNvs->PhysicalPresence.Request;\r
97 DataSize = sizeof (EFI_PHYSICAL_PRESENCE);\r
98 Status = mSmmVariable->SmmSetVariable (\r
99 PHYSICAL_PRESENCE_VARIABLE,\r
100 &gEfiPhysicalPresenceGuid,\r
101 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
102 DataSize,\r
103 &PpData\r
104 );\r
105 }\r
106\r
107 if (EFI_ERROR (Status)) {\r
108 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;\r
109 return EFI_SUCCESS;\r
110 }\r
111\r
112 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS;\r
113\r
114 if (mTcgNvs->PhysicalPresence.Request >= TCG_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
115 DataSize = sizeof (EFI_PHYSICAL_PRESENCE_FLAGS);\r
116 Status = mSmmVariable->SmmGetVariable (\r
117 PHYSICAL_PRESENCE_FLAGS_VARIABLE,\r
118 &gEfiPhysicalPresenceGuid,\r
119 NULL,\r
120 &DataSize,\r
121 &Flags\r
122 );\r
123 if (EFI_ERROR (Status)) {\r
124 Flags.PPFlags = TCG_BIOS_TPM_MANAGEMENT_FLAG_NO_PPI_PROVISION;\r
125 }\r
126\r
127 mTcgNvs->PhysicalPresence.ReturnCode = TcgPpVendorLibSubmitRequestToPreOSFunction (mTcgNvs->PhysicalPresence.Request, Flags.PPFlags);\r
128 }\r
129 } else if (mTcgNvs->PhysicalPresence.Parameter == ACPI_FUNCTION_GET_USER_CONFIRMATION_STATUS_FOR_REQUEST) {\r
130 if (EFI_ERROR (Status)) {\r
131 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_GET_USER_CONFIRMATION_BLOCKED_BY_BIOS_CONFIGURATION;\r
132 DEBUG ((DEBUG_ERROR, "[TPM] Get PP variable failure! Status = %r\n", Status));\r
133 return EFI_SUCCESS;\r
134 }\r
135\r
136 //\r
137 // Get the Physical Presence flags\r
138 //\r
139 DataSize = sizeof (EFI_PHYSICAL_PRESENCE_FLAGS);\r
140 Status = mSmmVariable->SmmGetVariable (\r
141 PHYSICAL_PRESENCE_FLAGS_VARIABLE,\r
142 &gEfiPhysicalPresenceGuid,\r
143 NULL,\r
144 &DataSize,\r
145 &Flags\r
146 );\r
147 if (EFI_ERROR (Status)) {\r
148 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_GET_USER_CONFIRMATION_BLOCKED_BY_BIOS_CONFIGURATION;\r
149 DEBUG ((DEBUG_ERROR, "[TPM] Get PP flags failure! Status = %r\n", Status));\r
150 return EFI_SUCCESS;\r
151 }\r
152\r
153 RequestConfirmed = FALSE;\r
154\r
155 switch (mTcgNvs->PPRequestUserConfirm) {\r
156 case PHYSICAL_PRESENCE_ENABLE:\r
157 case PHYSICAL_PRESENCE_DISABLE:\r
158 case PHYSICAL_PRESENCE_ACTIVATE:\r
159 case PHYSICAL_PRESENCE_DEACTIVATE:\r
160 case PHYSICAL_PRESENCE_ENABLE_ACTIVATE:\r
161 case PHYSICAL_PRESENCE_DEACTIVATE_DISABLE:\r
162 case PHYSICAL_PRESENCE_SET_OWNER_INSTALL_TRUE:\r
163 case PHYSICAL_PRESENCE_SET_OWNER_INSTALL_FALSE:\r
164 case PHYSICAL_PRESENCE_ENABLE_ACTIVATE_OWNER_TRUE:\r
165 case PHYSICAL_PRESENCE_DEACTIVATE_DISABLE_OWNER_FALSE:\r
166 if ((Flags.PPFlags & TCG_BIOS_TPM_MANAGEMENT_FLAG_NO_PPI_PROVISION) != 0) {\r
167 RequestConfirmed = TRUE;\r
168 }\r
169\r
170 break;\r
171\r
172 case PHYSICAL_PRESENCE_CLEAR:\r
173 case PHYSICAL_PRESENCE_ENABLE_ACTIVATE_CLEAR:\r
174 if ((Flags.PPFlags & TCG_BIOS_TPM_MANAGEMENT_FLAG_NO_PPI_CLEAR) != 0) {\r
175 RequestConfirmed = TRUE;\r
176 }\r
177\r
178 break;\r
179\r
180 case PHYSICAL_PRESENCE_DEFERRED_PP_UNOWNERED_FIELD_UPGRADE:\r
181 if ((Flags.PPFlags & TCG_BIOS_TPM_MANAGEMENT_FLAG_NO_PPI_MAINTENANCE) != 0) {\r
182 RequestConfirmed = TRUE;\r
183 }\r
184\r
185 break;\r
186\r
187 case PHYSICAL_PRESENCE_ENABLE_ACTIVATE_CLEAR_ENABLE_ACTIVATE:\r
188 case PHYSICAL_PRESENCE_CLEAR_ENABLE_ACTIVATE:\r
189 if (((Flags.PPFlags & TCG_BIOS_TPM_MANAGEMENT_FLAG_NO_PPI_CLEAR) != 0) && ((Flags.PPFlags & TCG_BIOS_TPM_MANAGEMENT_FLAG_NO_PPI_PROVISION) != 0)) {\r
190 RequestConfirmed = TRUE;\r
191 }\r
192\r
193 break;\r
194\r
195 case PHYSICAL_PRESENCE_SET_NO_PPI_PROVISION_FALSE:\r
196 case PHYSICAL_PRESENCE_SET_NO_PPI_CLEAR_FALSE:\r
197 case PHYSICAL_PRESENCE_SET_NO_PPI_MAINTENANCE_FALSE:\r
198 case PHYSICAL_PRESENCE_NO_ACTION:\r
199 RequestConfirmed = TRUE;\r
200 break;\r
201\r
202 case PHYSICAL_PRESENCE_SET_OPERATOR_AUTH:\r
203 //\r
204 // This command requires UI to prompt user for Auth data\r
205 //\r
206 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_GET_USER_CONFIRMATION_NOT_IMPLEMENTED;\r
207 return EFI_SUCCESS;\r
208 default:\r
209 break;\r
210 }\r
211\r
212 if (RequestConfirmed) {\r
213 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_GET_USER_CONFIRMATION_ALLOWED_AND_PPUSER_NOT_REQUIRED;\r
214 } else {\r
215 mTcgNvs->PhysicalPresence.ReturnCode = TCG_PP_GET_USER_CONFIRMATION_ALLOWED_AND_PPUSER_REQUIRED;\r
216 }\r
217\r
218 if (mTcgNvs->PhysicalPresence.Request >= TCG_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
219 mTcgNvs->PhysicalPresence.ReturnCode = TcgPpVendorLibGetUserConfirmationStatusFunction (mTcgNvs->PhysicalPresence.Request, Flags.PPFlags);\r
220 }\r
221 }\r
222\r
223 return EFI_SUCCESS;\r
224}\r
225\r
226/**\r
227 Software SMI callback for MemoryClear which is called from ACPI method.\r
228\r
229 Caution: This function may receive untrusted input.\r
230 Variable and ACPINvs are external input, so this function will validate\r
231 its data structure to be valid value.\r
232\r
233 @param[in] DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister().\r
234 @param[in] Context Points to an optional handler context which was specified when the\r
235 handler was registered.\r
236 @param[in, out] CommBuffer A pointer to a collection of data in memory that will\r
237 be conveyed from a non-SMM environment into an SMM environment.\r
238 @param[in, out] CommBufferSize The size of the CommBuffer.\r
239\r
240 @retval EFI_SUCCESS The interrupt was handled successfully.\r
241\r
242**/\r
243EFI_STATUS\r
244EFIAPI\r
245MemoryClearCallback (\r
246 IN EFI_HANDLE DispatchHandle,\r
247 IN CONST VOID *Context,\r
248 IN OUT VOID *CommBuffer,\r
249 IN OUT UINTN *CommBufferSize\r
250 )\r
251{\r
252 EFI_STATUS Status;\r
253 UINTN DataSize;\r
254 UINT8 MorControl;\r
255\r
256 mTcgNvs->MemoryClear.ReturnCode = MOR_REQUEST_SUCCESS;\r
257 if (mTcgNvs->MemoryClear.Parameter == ACPI_FUNCTION_DSM_MEMORY_CLEAR_INTERFACE) {\r
258 MorControl = (UINT8)mTcgNvs->MemoryClear.Request;\r
259 } else if (mTcgNvs->MemoryClear.Parameter == ACPI_FUNCTION_PTS_CLEAR_MOR_BIT) {\r
260 DataSize = sizeof (UINT8);\r
261 Status = mSmmVariable->SmmGetVariable (\r
262 MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME,\r
263 &gEfiMemoryOverwriteControlDataGuid,\r
264 NULL,\r
265 &DataSize,\r
266 &MorControl\r
267 );\r
268 if (EFI_ERROR (Status)) {\r
269 mTcgNvs->MemoryClear.ReturnCode = MOR_REQUEST_GENERAL_FAILURE;\r
270 DEBUG ((DEBUG_ERROR, "[TPM] Get MOR variable failure! Status = %r\n", Status));\r
271 return EFI_SUCCESS;\r
272 }\r
273\r
274 if (MOR_CLEAR_MEMORY_VALUE (MorControl) == 0x0) {\r
275 return EFI_SUCCESS;\r
276 }\r
277\r
278 MorControl &= ~MOR_CLEAR_MEMORY_BIT_MASK;\r
279 } else {\r
280 mTcgNvs->MemoryClear.ReturnCode = MOR_REQUEST_GENERAL_FAILURE;\r
281 DEBUG ((DEBUG_ERROR, "[TPM] MOR Parameter error! Parameter = %x\n", mTcgNvs->MemoryClear.Parameter));\r
282 return EFI_SUCCESS;\r
283 }\r
284\r
285 DataSize = sizeof (UINT8);\r
286 Status = mSmmVariable->SmmSetVariable (\r
287 MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME,\r
288 &gEfiMemoryOverwriteControlDataGuid,\r
289 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
290 DataSize,\r
291 &MorControl\r
292 );\r
293 if (EFI_ERROR (Status)) {\r
294 mTcgNvs->MemoryClear.ReturnCode = MOR_REQUEST_GENERAL_FAILURE;\r
295 DEBUG ((DEBUG_ERROR, "[TPM] Set MOR variable failure! Status = %r\n", Status));\r
296 }\r
297\r
298 return EFI_SUCCESS;\r
299}\r
300\r
301/**\r
302 Find the operation region in TCG ACPI table by given Name and Size,\r
303 and initialize it if the region is found.\r
304\r
305 @param[in, out] Table The TPM item in ACPI table.\r
306 @param[in] Name The name string to find in TPM table.\r
307 @param[in] Size The size of the region to find.\r
308\r
309 @return The allocated address for the found region.\r
310\r
311**/\r
312VOID *\r
313AssignOpRegion (\r
314 EFI_ACPI_DESCRIPTION_HEADER *Table,\r
315 UINT32 Name,\r
316 UINT16 Size\r
317 )\r
318{\r
319 EFI_STATUS Status;\r
320 AML_OP_REGION_32_8 *OpRegion;\r
321 EFI_PHYSICAL_ADDRESS MemoryAddress;\r
322\r
323 MemoryAddress = SIZE_4GB - 1;\r
324\r
325 //\r
326 // Patch some pointers for the ASL code before loading the SSDT.\r
327 //\r
328 for (OpRegion = (AML_OP_REGION_32_8 *)(Table + 1);\r
329 OpRegion <= (AML_OP_REGION_32_8 *)((UINT8 *)Table + Table->Length);\r
330 OpRegion = (AML_OP_REGION_32_8 *)((UINT8 *)OpRegion + 1))\r
331 {\r
332 if ((OpRegion->OpRegionOp == AML_EXT_REGION_OP) &&\r
333 (OpRegion->NameString == Name) &&\r
334 (OpRegion->DWordPrefix == AML_DWORD_PREFIX) &&\r
335 (OpRegion->BytePrefix == AML_BYTE_PREFIX))\r
336 {\r
337 Status = gBS->AllocatePages (AllocateMaxAddress, EfiACPIMemoryNVS, EFI_SIZE_TO_PAGES (Size), &MemoryAddress);\r
338 ASSERT_EFI_ERROR (Status);\r
339 ZeroMem ((VOID *)(UINTN)MemoryAddress, Size);\r
340 OpRegion->RegionOffset = (UINT32)(UINTN)MemoryAddress;\r
341 OpRegion->RegionLen = (UINT8)Size;\r
342 break;\r
343 }\r
344 }\r
345\r
346 return (VOID *)(UINTN)MemoryAddress;\r
347}\r
348\r
349/**\r
350 Initialize and publish TPM items in ACPI table.\r
351\r
352 @retval EFI_SUCCESS The TCG ACPI table is published successfully.\r
353 @retval Others The TCG ACPI table is not published.\r
354\r
355**/\r
356EFI_STATUS\r
357PublishAcpiTable (\r
358 VOID\r
359 )\r
360{\r
361 EFI_STATUS Status;\r
362 EFI_ACPI_TABLE_PROTOCOL *AcpiTable;\r
363 UINTN TableKey;\r
364 EFI_ACPI_DESCRIPTION_HEADER *Table;\r
365 UINTN TableSize;\r
366\r
367 Status = GetSectionFromFv (\r
368 &gEfiCallerIdGuid,\r
369 EFI_SECTION_RAW,\r
370 0,\r
371 (VOID **)&Table,\r
372 &TableSize\r
373 );\r
374 ASSERT_EFI_ERROR (Status);\r
375\r
376 //\r
377 // Measure to PCR[0] with event EV_POST_CODE ACPI DATA\r
378 //\r
379 TpmMeasureAndLogData (\r
380 0,\r
381 EV_POST_CODE,\r
382 EV_POSTCODE_INFO_ACPI_DATA,\r
383 ACPI_DATA_LEN,\r
384 Table,\r
385 TableSize\r
386 );\r
387\r
388 ASSERT (Table->OemTableId == SIGNATURE_64 ('T', 'c', 'g', 'T', 'a', 'b', 'l', 'e'));\r
389 CopyMem (Table->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (Table->OemId));\r
390 mTcgNvs = AssignOpRegion (Table, SIGNATURE_32 ('T', 'N', 'V', 'S'), (UINT16)sizeof (TCG_NVS));\r
391 ASSERT (mTcgNvs != NULL);\r
392\r
393 //\r
394 // Publish the TPM ACPI table\r
395 //\r
396 Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTable);\r
397 ASSERT_EFI_ERROR (Status);\r
398\r
399 TableKey = 0;\r
400 Status = AcpiTable->InstallAcpiTable (\r
401 AcpiTable,\r
402 Table,\r
403 TableSize,\r
404 &TableKey\r
405 );\r
406 ASSERT_EFI_ERROR (Status);\r
407\r
408 return Status;\r
409}\r
410\r
411/**\r
412 The driver's entry point.\r
413\r
414 It install callbacks for TPM physical presence and MemoryClear, and locate\r
415 SMM variable to be used in the callback function.\r
416\r
417 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
418 @param[in] SystemTable A pointer to the EFI System Table.\r
419\r
420 @retval EFI_SUCCESS The entry point is executed successfully.\r
421 @retval Others Some error occurs when executing this entry point.\r
422\r
423**/\r
424EFI_STATUS\r
425EFIAPI\r
426InitializeTcgSmm (\r
427 IN EFI_HANDLE ImageHandle,\r
428 IN EFI_SYSTEM_TABLE *SystemTable\r
429 )\r
430{\r
431 EFI_STATUS Status;\r
432 EFI_SMM_SW_DISPATCH2_PROTOCOL *SwDispatch;\r
433 EFI_SMM_SW_REGISTER_CONTEXT SwContext;\r
434 EFI_HANDLE SwHandle;\r
435\r
436 if (!CompareGuid (PcdGetPtr (PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceTpm12Guid)) {\r
437 DEBUG ((DEBUG_ERROR, "No TPM12 instance required!\n"));\r
438 return EFI_UNSUPPORTED;\r
439 }\r
440\r
441 Status = PublishAcpiTable ();\r
442 ASSERT_EFI_ERROR (Status);\r
443\r
444 //\r
445 // Get the Sw dispatch protocol and register SMI callback functions.\r
446 //\r
447 Status = gSmst->SmmLocateProtocol (&gEfiSmmSwDispatch2ProtocolGuid, NULL, (VOID **)&SwDispatch);\r
448 ASSERT_EFI_ERROR (Status);\r
449 SwContext.SwSmiInputValue = (UINTN)-1;\r
450 Status = SwDispatch->Register (SwDispatch, PhysicalPresenceCallback, &SwContext, &SwHandle);\r
451 ASSERT_EFI_ERROR (Status);\r
452 if (EFI_ERROR (Status)) {\r
453 return Status;\r
454 }\r
455\r
456 mTcgNvs->PhysicalPresence.SoftwareSmi = (UINT8)SwContext.SwSmiInputValue;\r
457\r
458 SwContext.SwSmiInputValue = (UINTN)-1;\r
459 Status = SwDispatch->Register (SwDispatch, MemoryClearCallback, &SwContext, &SwHandle);\r
460 ASSERT_EFI_ERROR (Status);\r
461 if (EFI_ERROR (Status)) {\r
462 return Status;\r
463 }\r
464\r
465 mTcgNvs->MemoryClear.SoftwareSmi = (UINT8)SwContext.SwSmiInputValue;\r
466\r
467 //\r
468 // Locate SmmVariableProtocol.\r
469 //\r
470 Status = gSmst->SmmLocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **)&mSmmVariable);\r
471 ASSERT_EFI_ERROR (Status);\r
472\r
473 return EFI_SUCCESS;\r
474}\r