46 OUT EFI_PHYSICAL_ADDRESS *VariableStoreBase
49 VARIABLE_STORE_HEADER *VariableStore;
50 UINT32 VariableStoreLength;
51 BOOLEAN FullyInitializeStore;
52 UINT32 HwErrStorageSize;
54 FullyInitializeStore = TRUE;
56 VariableStoreLength = PcdGet32 (PcdVariableStoreSize);
57 ASSERT (
sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength);
62 if (PcdGet64 (PcdEmuVariableNvStoreReserved) == 0) {
63 VariableStore = (VARIABLE_STORE_HEADER *)AllocateRuntimePool (VariableStoreLength);
64 if (VariableStore == NULL) {
65 return EFI_OUT_OF_RESOURCES;
74 (VARIABLE_STORE_HEADER *)(VOID *)(UINTN)
75 PcdGet64 (PcdEmuVariableNvStoreReserved);
76 if ((VariableStore->Size == VariableStoreLength) &&
77 (
CompareGuid (&VariableStore->Signature, &gEfiAuthenticatedVariableGuid) ||
78 CompareGuid (&VariableStore->Signature, &gEfiVariableGuid)) &&
79 (VariableStore->Format == VARIABLE_STORE_FORMATTED) &&
80 (VariableStore->State == VARIABLE_STORE_HEALTHY))
84 "Variable Store reserved at %p appears to be valid\n",
87 FullyInitializeStore = FALSE;
91 if (FullyInitializeStore) {
92 SetMem (VariableStore, VariableStoreLength, 0xff);
96 CopyGuid (&VariableStore->Signature, &gEfiAuthenticatedVariableGuid);
97 VariableStore->Size = VariableStoreLength;
98 VariableStore->Format = VARIABLE_STORE_FORMATTED;
99 VariableStore->State = VARIABLE_STORE_HEALTHY;
100 VariableStore->Reserved = 0;
101 VariableStore->Reserved1 = 0;
104 *VariableStoreBase = (EFI_PHYSICAL_ADDRESS)(UINTN)VariableStore;
106 HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize);
114 ASSERT (HwErrStorageSize < (VariableStoreLength -
sizeof (VARIABLE_STORE_HEADER)));
135 OUT EFI_PHYSICAL_ADDRESS *VariableStoreBase
138 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
139 VARIABLE_STORE_HEADER *VariableStore;
140 UINT32 VariableStoreLength;
141 EFI_HOB_GUID_TYPE *GuidHob;
142 EFI_PHYSICAL_ADDRESS NvStorageBase;
143 UINT8 *NvStorageData;
144 UINT32 NvStorageSize;
145 FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *FtwLastWriteData;
148 UINT32 HwErrStorageSize;
149 UINT32 MaxUserNvVariableSpaceSize;
150 UINT32 BoottimeReservedNvVariableSpaceSize;
160 NvStorageSize = PcdGet32 (PcdFlashNvStorageVariableSize);
161 NvStorageData = AllocateRuntimeZeroPool (NvStorageSize);
162 if (NvStorageData == NULL) {
163 return EFI_OUT_OF_RESOURCES;
167 ASSERT (NvStorageBase != 0);
172 CopyMem (NvStorageData, (UINT8 *)(UINTN)NvStorageBase, NvStorageSize);
178 if (EFI_ERROR (Status)) {
183 if (GuidHob != NULL) {
184 FtwLastWriteData = (FAULT_TOLERANT_WRITE_LAST_WRITE_DATA *)GET_GUID_HOB_DATA (GuidHob);
185 if (FtwLastWriteData->TargetAddress == NvStorageBase) {
186 DEBUG ((DEBUG_INFO,
"Variable: NV storage is backed up in spare block: 0x%x\n", (UINTN)FtwLastWriteData->SpareAddress));
190 CopyMem (NvStorageData, (UINT8 *)(UINTN)(FtwLastWriteData->SpareAddress), NvStorageSize);
191 }
else if ((FtwLastWriteData->TargetAddress > NvStorageBase) &&
192 (FtwLastWriteData->TargetAddress < (NvStorageBase + NvStorageSize)))
197 BackUpOffset = (UINT32)(FtwLastWriteData->TargetAddress - NvStorageBase);
198 BackUpSize = NvStorageSize - BackUpOffset;
199 DEBUG ((DEBUG_INFO,
"Variable: High partial NV storage from offset: %x is backed up in spare block: 0x%x\n", BackUpOffset, (UINTN)FtwLastWriteData->SpareAddress));
203 CopyMem (NvStorageData + BackUpOffset, (UINT8 *)(UINTN)FtwLastWriteData->SpareAddress, BackUpSize);
208 FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)NvStorageData;
213 if ((FvHeader->Signature != EFI_FVH_SIGNATURE) || (!
CompareGuid (&gEfiSystemNvDataFvGuid, &FvHeader->FileSystemGuid))) {
214 FreePool (NvStorageData);
215 DEBUG ((DEBUG_ERROR,
"Firmware Volume for Variable Store is corrupted\n"));
216 return EFI_VOLUME_CORRUPTED;
219 VariableStore = (VARIABLE_STORE_HEADER *)((UINTN)FvHeader + FvHeader->HeaderLength);
220 VariableStoreLength = NvStorageSize - FvHeader->HeaderLength;
221 ASSERT (
sizeof (VARIABLE_STORE_HEADER) <= VariableStoreLength);
222 ASSERT (VariableStore->Size == VariableStoreLength);
228 FreePool (NvStorageData);
229 DEBUG ((DEBUG_ERROR,
"Variable Store header is corrupted\n"));
230 return EFI_VOLUME_CORRUPTED;
235 *VariableStoreBase = (EFI_PHYSICAL_ADDRESS)(UINTN)VariableStore;
237 HwErrStorageSize = PcdGet32 (PcdHwErrStorageSize);
238 MaxUserNvVariableSpaceSize = PcdGet32 (PcdMaxUserNvVariableSpaceSize);
239 BoottimeReservedNvVariableSpaceSize = PcdGet32 (PcdBoottimeReservedNvVariableSpaceSize);
247 ASSERT (HwErrStorageSize < (VariableStoreLength -
sizeof (VARIABLE_STORE_HEADER)));
252 ASSERT (MaxUserNvVariableSpaceSize < (VariableStoreLength -
sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize));
257 ASSERT (BoottimeReservedNvVariableSpaceSize < (VariableStoreLength -
sizeof (VARIABLE_STORE_HEADER) - HwErrStorageSize));
265 "Variable driver common space: 0x%x 0x%x 0x%x\n",
292 VARIABLE_HEADER *Variable;
293 VARIABLE_HEADER *NextVariable;
294 EFI_PHYSICAL_ADDRESS VariableStoreBase;
298 if (PcdGetBool (PcdEmuVariableNvModeEnable)) {
300 if (EFI_ERROR (Status)) {
305 DEBUG ((DEBUG_INFO,
"Variable driver will work at emulated non-volatile variable mode!\n"));
308 if (EFI_ERROR (Status)) {
328 VariableSize = (UINTN)NextVariable - (UINTN)Variable;
329 if ((Variable->Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {
335 Variable = NextVariable;