#include "Variable.h"\r
#include "AuthService.h"\r
\r
-extern VARIABLE_STORE_HEADER *mNvVariableCache;\r
-extern VARIABLE_INFO_ENTRY *gVariableInfo;\r
-EFI_HANDLE mHandle = NULL;\r
-EFI_EVENT mVirtualAddressChangeEvent = NULL;\r
-EFI_EVENT mFtwRegistration = NULL;\r
+extern VARIABLE_STORE_HEADER *mNvVariableCache;\r
+extern VARIABLE_INFO_ENTRY *gVariableInfo;\r
+EFI_HANDLE mHandle = NULL;\r
+EFI_EVENT mVirtualAddressChangeEvent = NULL;\r
+EFI_EVENT mFtwRegistration = NULL;\r
+extern BOOLEAN mEndOfDxe;\r
+EDKII_VARIABLE_LOCK_PROTOCOL mVariableLock = { VariableLockRequestToLock };\r
\r
/**\r
Return TRUE if ExitBootServices () has been called.\r
VOID *Context\r
)\r
{\r
+ //\r
+ // Set the End Of DXE bit in case the EFI_END_OF_DXE_EVENT_GROUP_GUID event is not signaled.\r
+ //\r
+ mEndOfDxe = TRUE;\r
ReclaimForOS ();\r
if (FeaturePcdGet (PcdVariableCollectStatistics)) {\r
gBS->InstallConfigurationTable (&gEfiAuthenticatedVariableGuid, gVariableInfo);\r
}\r
}\r
\r
+/**\r
+ Notification function of EFI_END_OF_DXE_EVENT_GROUP_GUID event group.\r
+\r
+ This is a notification function registered on EFI_END_OF_DXE_EVENT_GROUP_GUID event group.\r
+\r
+ @param Event Event whose notification function is being invoked.\r
+ @param Context Pointer to the notification function's context.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+OnEndOfDxe (\r
+ EFI_EVENT Event,\r
+ VOID *Context\r
+ )\r
+{\r
+ mEndOfDxe = TRUE;\r
+}\r
\r
/**\r
Fault Tolerant Write protocol notification event handler.\r
{\r
EFI_STATUS Status;\r
EFI_EVENT ReadyToBootEvent;\r
+ EFI_EVENT EndOfDxeEvent;\r
\r
Status = VariableCommonInitialize ();\r
ASSERT_EFI_ERROR (Status);\r
\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &mHandle,\r
+ &gEdkiiVariableLockProtocolGuid,\r
+ &mVariableLock,\r
+ NULL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
SystemTable->RuntimeServices->GetVariable = VariableServiceGetVariable;\r
SystemTable->RuntimeServices->GetNextVariableName = VariableServiceGetNextVariableName;\r
SystemTable->RuntimeServices->SetVariable = VariableServiceSetVariable;\r
NULL,\r
&ReadyToBootEvent\r
);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Register the event handling function to set the End Of DXE flag.\r
+ //\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_NOTIFY,\r
+ OnEndOfDxe,\r
+ NULL,\r
+ &gEfiEndOfDxeEventGroupGuid,\r
+ &EndOfDxeEvent\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
\r
return EFI_SUCCESS;\r
}\r