)\r
{\r
ReclaimForOS ();\r
+ if (FeaturePcdGet (PcdVariableCollectStatistics)) {\r
+ gBS->InstallConfigurationTable (&gEfiVariableGuid, gVariableInfo);\r
+ }\r
}\r
\r
\r
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol;\r
EFI_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol;\r
EFI_PHYSICAL_ADDRESS NvStorageVariableBase;\r
+ EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;\r
+ EFI_PHYSICAL_ADDRESS BaseAddress;\r
+ UINT64 Length;\r
+ EFI_PHYSICAL_ADDRESS VariableStoreBase;\r
+ UINT64 VariableStoreLength;\r
\r
//\r
// Ensure FTW protocol is installed.\r
return ;\r
}\r
mVariableModuleGlobal->FvbInstance = FvbProtocol;\r
+\r
+ //\r
+ // Mark the variable storage region of the FLASH as RUNTIME.\r
+ //\r
+ VariableStoreBase = mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase;\r
+ VariableStoreLength = ((VARIABLE_STORE_HEADER *)(UINTN)VariableStoreBase)->Size;\r
+ BaseAddress = VariableStoreBase & (~EFI_PAGE_MASK);\r
+ Length = VariableStoreLength + (VariableStoreBase - BaseAddress);\r
+ Length = (Length + EFI_PAGE_SIZE - 1) & (~EFI_PAGE_MASK);\r
+\r
+ Status = gDS->GetMemorySpaceDescriptor (BaseAddress, &GcdDescriptor);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_WARN, "Variable driver failed to add EFI_MEMORY_RUNTIME attribute to Flash.\n"));\r
+ } else {\r
+ Status = gDS->SetMemorySpaceAttributes (\r
+ BaseAddress,\r
+ Length,\r
+ GcdDescriptor.Attributes | EFI_MEMORY_RUNTIME\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_WARN, "Variable driver failed to add EFI_MEMORY_RUNTIME attribute to Flash.\n"));\r
+ }\r
+ }\r
\r
Status = VariableWriteServiceInitialize ();\r
ASSERT_EFI_ERROR (Status);\r
&ReadyToBootEvent\r
);\r
\r
- if (FeaturePcdGet (PcdVariableCollectStatistics)) {\r
- gBS->InstallConfigurationTable (&gEfiVariableGuid, gVariableInfo);\r
- }\r
return EFI_SUCCESS;\r
}\r
\r