Layers on top of Firmware Block protocol to produce a file abstraction\r
of FV based files.\r
\r
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "DxeMain.h"\r
#include "FwVolDriver.h"\r
\r
-\r
//\r
// Protocol notify related globals\r
//\r
-VOID *gEfiFwVolBlockNotifyReg;\r
-EFI_EVENT gEfiFwVolBlockEvent;\r
+VOID *gEfiFwVolBlockNotifyReg;\r
+EFI_EVENT gEfiFwVolBlockEvent;\r
\r
-FV_DEVICE mFvDevice = {\r
+FV_DEVICE mFvDevice = {\r
FV2_DEVICE_SIGNATURE,\r
NULL,\r
NULL,\r
FvReadFile,\r
FvReadFileSection,\r
FvWriteFile,\r
- FvGetNextFile, \r
- sizeof (UINTN),\r
+ FvGetNextFile,\r
+ sizeof (UINTN),\r
NULL,\r
FvGetVolumeInfo,\r
FvSetVolumeInfo\r
NULL,\r
NULL,\r
NULL,\r
- { NULL, NULL },\r
+ { NULL, NULL},\r
0,\r
0,\r
FALSE,\r
FALSE\r
};\r
\r
-\r
//\r
// FFS helper functions\r
//\r
+\r
/**\r
- Read data from Firmware Block by FVB protocol Read. \r
+ Read data from Firmware Block by FVB protocol Read.\r
The data may cross the multi block ranges.\r
\r
@param Fvb The FW_VOL_BLOCK_PROTOCOL instance from which to read data.\r
**/\r
EFI_STATUS\r
ReadFvbData (\r
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb,\r
- IN OUT EFI_LBA *StartLba,\r
- IN OUT UINTN *Offset,\r
- IN UINTN DataSize,\r
- OUT UINT8 *Data\r
+ IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb,\r
+ IN OUT EFI_LBA *StartLba,\r
+ IN OUT UINTN *Offset,\r
+ IN UINTN DataSize,\r
+ OUT UINT8 *Data\r
)\r
{\r
- UINTN BlockSize;\r
- UINTN NumberOfBlocks;\r
- UINTN BlockIndex;\r
- UINTN ReadDataSize;\r
- EFI_STATUS Status;\r
- \r
+ UINTN BlockSize;\r
+ UINTN NumberOfBlocks;\r
+ UINTN BlockIndex;\r
+ UINTN ReadDataSize;\r
+ EFI_STATUS Status;\r
+\r
//\r
// Try read data in current block\r
//\r
BlockIndex = 0;\r
ReadDataSize = DataSize;\r
- Status = Fvb->Read (Fvb, *StartLba, *Offset, &ReadDataSize, Data);\r
+ Status = Fvb->Read (Fvb, *StartLba, *Offset, &ReadDataSize, Data);\r
if (Status == EFI_SUCCESS) {\r
- *Offset += DataSize;\r
+ *Offset += DataSize;\r
return EFI_SUCCESS;\r
} else if (Status != EFI_BAD_BUFFER_SIZE) {\r
//\r
//\r
return Status;\r
}\r
- \r
+\r
//\r
// Data crosses the blocks, read data from next block\r
//\r
//\r
// Read data from the crossing blocks\r
//\r
- BlockIndex = 0; \r
+ BlockIndex = 0;\r
while (BlockIndex < NumberOfBlocks && DataSize >= BlockSize) {\r
Status = Fvb->Read (Fvb, *StartLba + BlockIndex, 0, &BlockSize, Data);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- Data += BlockSize;\r
+\r
+ Data += BlockSize;\r
DataSize -= BlockSize;\r
- BlockIndex ++;\r
+ BlockIndex++;\r
}\r
- \r
+\r
//\r
// Data doesn't exceed the current block range.\r
//\r
if (DataSize < BlockSize) {\r
break;\r
}\r
- \r
+\r
//\r
// Data must be got from the next block range.\r
//\r
*StartLba += NumberOfBlocks;\r
}\r
- \r
+\r
//\r
// read the remaining data\r
//\r
return Status;\r
}\r
}\r
- \r
+\r
//\r
// Update Lba and Offset used by the following read.\r
//\r
*StartLba += BlockIndex;\r
- *Offset = DataSize;\r
+ *Offset = DataSize;\r
\r
return EFI_SUCCESS;\r
}\r
**/\r
EFI_STATUS\r
GetFwVolHeader (\r
- IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb,\r
- OUT EFI_FIRMWARE_VOLUME_HEADER **FwVolHeader\r
+ IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb,\r
+ OUT EFI_FIRMWARE_VOLUME_HEADER **FwVolHeader\r
)\r
{\r
EFI_STATUS Status;\r
EFI_LBA StartLba;\r
UINTN Offset;\r
UINT8 *Buffer;\r
- \r
+\r
//\r
// Read the standard FV header\r
//\r
- StartLba = 0;\r
- Offset = 0;\r
+ StartLba = 0;\r
+ Offset = 0;\r
FvhLength = sizeof (EFI_FIRMWARE_VOLUME_HEADER);\r
- Status = ReadFvbData (Fvb, &StartLba, &Offset, FvhLength, (UINT8 *)&TempFvh);\r
+ Status = ReadFvbData (Fvb, &StartLba, &Offset, FvhLength, (UINT8 *)&TempFvh);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
// understand it...\r
//\r
if ((!CompareGuid (&TempFvh.FileSystemGuid, &gEfiFirmwareFileSystem2Guid)) &&\r
- (!CompareGuid (&TempFvh.FileSystemGuid, &gEfiFirmwareFileSystem3Guid))) {\r
+ (!CompareGuid (&TempFvh.FileSystemGuid, &gEfiFirmwareFileSystem3Guid)))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
// Read the rest of the header\r
//\r
FvhLength = TempFvh.HeaderLength - sizeof (EFI_FIRMWARE_VOLUME_HEADER);\r
- Buffer = (UINT8 *)*FwVolHeader + sizeof (EFI_FIRMWARE_VOLUME_HEADER);\r
- Status = ReadFvbData (Fvb, &StartLba, &Offset, FvhLength, Buffer);\r
+ Buffer = (UINT8 *)*FwVolHeader + sizeof (EFI_FIRMWARE_VOLUME_HEADER);\r
+ Status = ReadFvbData (Fvb, &StartLba, &Offset, FvhLength, Buffer);\r
if (EFI_ERROR (Status)) {\r
//\r
// Read failed so free buffer\r
return Status;\r
}\r
\r
-\r
-\r
/**\r
Free FvDevice resource when error happens\r
\r
IN FV_DEVICE *FvDevice\r
)\r
{\r
- FFS_FILE_LIST_ENTRY *FfsFileEntry;\r
- LIST_ENTRY *NextEntry;\r
+ FFS_FILE_LIST_ENTRY *FfsFileEntry;\r
+ LIST_ENTRY *NextEntry;\r
\r
//\r
// Free File List Entry\r
\r
CoreFreePool (FfsFileEntry);\r
\r
- FfsFileEntry = (FFS_FILE_LIST_ENTRY *) NextEntry;\r
+ FfsFileEntry = (FFS_FILE_LIST_ENTRY *)NextEntry;\r
}\r
\r
if (!FvDevice->IsMemoryMapped) {\r
return;\r
}\r
\r
-\r
-\r
/**\r
Check if an FV is consistent and allocate cache for it.\r
\r
IN OUT FV_DEVICE *FvDevice\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;\r
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
- EFI_FIRMWARE_VOLUME_EXT_HEADER *FwVolExtHeader;\r
- EFI_FVB_ATTRIBUTES_2 FvbAttributes;\r
- EFI_FV_BLOCK_MAP_ENTRY *BlockMap;\r
- FFS_FILE_LIST_ENTRY *FfsFileEntry;\r
- EFI_FFS_FILE_HEADER *FfsHeader;\r
- UINT8 *CacheLocation;\r
- UINTN LbaOffset;\r
- UINTN HeaderSize;\r
- UINTN Index;\r
- EFI_LBA LbaIndex;\r
- UINTN Size;\r
- EFI_FFS_FILE_STATE FileState;\r
- UINT8 *TopFvAddress;\r
- UINTN TestLength;\r
- EFI_PHYSICAL_ADDRESS PhysicalAddress;\r
- BOOLEAN FileCached;\r
- UINTN WholeFileSize;\r
- EFI_FFS_FILE_HEADER *CacheFfsHeader;\r
-\r
- FileCached = FALSE;\r
+ EFI_STATUS Status;\r
+ EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
+ EFI_FIRMWARE_VOLUME_EXT_HEADER *FwVolExtHeader;\r
+ EFI_FVB_ATTRIBUTES_2 FvbAttributes;\r
+ EFI_FV_BLOCK_MAP_ENTRY *BlockMap;\r
+ FFS_FILE_LIST_ENTRY *FfsFileEntry;\r
+ EFI_FFS_FILE_HEADER *FfsHeader;\r
+ UINT8 *CacheLocation;\r
+ UINTN Index;\r
+ EFI_LBA LbaIndex;\r
+ UINTN Size;\r
+ EFI_FFS_FILE_STATE FileState;\r
+ UINT8 *TopFvAddress;\r
+ UINTN TestLength;\r
+ EFI_PHYSICAL_ADDRESS PhysicalAddress;\r
+ BOOLEAN FileCached;\r
+ UINTN WholeFileSize;\r
+ EFI_FFS_FILE_HEADER *CacheFfsHeader;\r
+\r
+ FileCached = FALSE;\r
CacheFfsHeader = NULL;\r
\r
- Fvb = FvDevice->Fvb;\r
+ Fvb = FvDevice->Fvb;\r
FwVolHeader = FvDevice->FwVolHeader;\r
\r
Status = Fvb->GetAttributes (Fvb, &FvbAttributes);\r
return Status;\r
}\r
\r
- //\r
- // Size is the size of the FV minus the head. We have already allocated\r
- // the header to check to make sure the volume is valid\r
- //\r
- Size = (UINTN)(FwVolHeader->FvLength - FwVolHeader->HeaderLength);\r
+ Size = (UINTN)FwVolHeader->FvLength;\r
if ((FvbAttributes & EFI_FVB2_MEMORY_MAPPED) != 0) {\r
FvDevice->IsMemoryMapped = TRUE;\r
\r
//\r
// Don't cache memory mapped FV really.\r
//\r
- FvDevice->CachedFv = (UINT8 *) (UINTN) (PhysicalAddress + FwVolHeader->HeaderLength);\r
+ FvDevice->CachedFv = (UINT8 *)(UINTN)PhysicalAddress;\r
} else {\r
FvDevice->IsMemoryMapped = FALSE;\r
- FvDevice->CachedFv = AllocatePool (Size);\r
+ FvDevice->CachedFv = AllocatePool (Size);\r
\r
if (FvDevice->CachedFv == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
//\r
- // Remember a pointer to the end fo the CachedFv\r
+ // Remember a pointer to the end of the CachedFv\r
//\r
FvDevice->EndOfCachedFv = FvDevice->CachedFv + Size;\r
\r
if (!FvDevice->IsMemoryMapped) {\r
//\r
- // Copy FV minus header into memory using the block map we have all ready\r
- // read into memory.\r
+ // Copy FV into memory using the block map.\r
//\r
- BlockMap = FwVolHeader->BlockMap;\r
+ BlockMap = FwVolHeader->BlockMap;\r
CacheLocation = FvDevice->CachedFv;\r
- LbaIndex = 0;\r
- LbaOffset = 0;\r
- HeaderSize = FwVolHeader->HeaderLength;\r
+ LbaIndex = 0;\r
while ((BlockMap->NumBlocks != 0) || (BlockMap->Length != 0)) {\r
- Index = 0;\r
- Size = BlockMap->Length;\r
- if (HeaderSize > 0) {\r
- //\r
- // Skip header size\r
- //\r
- for (; Index < BlockMap->NumBlocks && HeaderSize >= BlockMap->Length; Index ++) {\r
- HeaderSize -= BlockMap->Length;\r
- LbaIndex ++;\r
- }\r
-\r
- //\r
- // Check whether FvHeader is crossing the multi block range.\r
- //\r
- if (Index >= BlockMap->NumBlocks) {\r
- BlockMap++;\r
- continue;\r
- } else if (HeaderSize > 0) {\r
- LbaOffset = HeaderSize;\r
- Size = BlockMap->Length - HeaderSize;\r
- HeaderSize = 0;\r
- }\r
- }\r
- \r
//\r
- // read the FV data \r
+ // read the FV data\r
//\r
- for (; Index < BlockMap->NumBlocks; Index ++) {\r
- Status = Fvb->Read (Fvb,\r
+ Size = BlockMap->Length;\r
+ for (Index = 0; Index < BlockMap->NumBlocks; Index++) {\r
+ Status = Fvb->Read (\r
+ Fvb,\r
LbaIndex,\r
- LbaOffset,\r
+ 0,\r
&Size,\r
CacheLocation\r
);\r
}\r
\r
LbaIndex++;\r
- CacheLocation += Size;\r
-\r
- //\r
- // After we skip Fv Header always read from start of block\r
- //\r
- LbaOffset = 0;\r
- Size = BlockMap->Length;\r
+ CacheLocation += BlockMap->Length;\r
}\r
\r
BlockMap++;\r
FvDevice->ErasePolarity = 0;\r
}\r
\r
-\r
//\r
// go through the whole FV cache, check the consistence of the FV.\r
// Make a linked list of all the Ffs file headers\r
//\r
// Searching for files starts on an 8 byte aligned boundary after the end of the Extended Header if it exists.\r
//\r
- FwVolExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *) (FvDevice->CachedFv + (FwVolHeader->ExtHeaderOffset - FwVolHeader->HeaderLength));\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolExtHeader + FwVolExtHeader->ExtHeaderSize);\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) ALIGN_POINTER (FfsHeader, 8);\r
+ FwVolExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(FvDevice->CachedFv + FwVolHeader->ExtHeaderOffset);\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolExtHeader + FwVolExtHeader->ExtHeaderSize);\r
} else {\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) (FvDevice->CachedFv);\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)(FvDevice->CachedFv + FwVolHeader->HeaderLength);\r
}\r
- TopFvAddress = FvDevice->EndOfCachedFv;\r
- while (((UINTN) FfsHeader >= (UINTN) FvDevice->CachedFv) && ((UINTN) FfsHeader <= (UINTN) ((UINTN) TopFvAddress - sizeof (EFI_FFS_FILE_HEADER)))) {\r
\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)ALIGN_POINTER (FfsHeader, 8);\r
+ TopFvAddress = FvDevice->EndOfCachedFv;\r
+ while (((UINTN)FfsHeader >= (UINTN)FvDevice->CachedFv) && ((UINTN)FfsHeader <= (UINTN)((UINTN)TopFvAddress - sizeof (EFI_FFS_FILE_HEADER)))) {\r
if (FileCached) {\r
CoreFreePool (CacheFfsHeader);\r
FileCached = FALSE;\r
}\r
\r
- TestLength = TopFvAddress - ((UINT8 *) FfsHeader);\r
+ TestLength = TopFvAddress - ((UINT8 *)FfsHeader);\r
if (TestLength > sizeof (EFI_FFS_FILE_HEADER)) {\r
TestLength = sizeof (EFI_FFS_FILE_HEADER);\r
}\r
\r
if (!IsValidFfsHeader (FvDevice->ErasePolarity, FfsHeader, &FileState)) {\r
if ((FileState == EFI_FILE_HEADER_INVALID) ||\r
- (FileState == EFI_FILE_HEADER_CONSTRUCTION)) {\r
+ (FileState == EFI_FILE_HEADER_CONSTRUCTION))\r
+ {\r
if (IS_FFS_FILE2 (FfsHeader)) {\r
if (!FvDevice->IsFfs3Fv) {\r
- DEBUG ((EFI_D_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &FfsHeader->Name));\r
+ DEBUG ((DEBUG_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &FfsHeader->Name));\r
}\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER2));\r
+\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsHeader + sizeof (EFI_FFS_FILE_HEADER2));\r
} else {\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER));\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsHeader + sizeof (EFI_FFS_FILE_HEADER));\r
}\r
+\r
continue;\r
} else {\r
//\r
// Here is to cache FFS file to memory buffer for following checksum calculating.\r
// And then, the cached file buffer can be also used for FvReadFile.\r
//\r
- WholeFileSize = IS_FFS_FILE2 (CacheFfsHeader) ? FFS_FILE2_SIZE (CacheFfsHeader): FFS_FILE_SIZE (CacheFfsHeader);\r
+ WholeFileSize = IS_FFS_FILE2 (CacheFfsHeader) ? FFS_FILE2_SIZE (CacheFfsHeader) : FFS_FILE_SIZE (CacheFfsHeader);\r
CacheFfsHeader = AllocateCopyPool (WholeFileSize, CacheFfsHeader);\r
if (CacheFfsHeader == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
}\r
+\r
FileCached = TRUE;\r
}\r
}\r
if (IS_FFS_FILE2 (CacheFfsHeader)) {\r
ASSERT (FFS_FILE2_SIZE (CacheFfsHeader) > 0x00FFFFFF);\r
if (!FvDevice->IsFfs3Fv) {\r
- DEBUG ((EFI_D_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &CacheFfsHeader->Name));\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsHeader + FFS_FILE2_SIZE (CacheFfsHeader));\r
+ DEBUG ((DEBUG_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &CacheFfsHeader->Name));\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsHeader + FFS_FILE2_SIZE (CacheFfsHeader));\r
//\r
- // Adjust pointer to the next 8-byte aligned boundry.\r
+ // Adjust pointer to the next 8-byte aligned boundary.\r
//\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) (((UINTN) FfsHeader + 7) & ~0x07);\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)(((UINTN)FfsHeader + 7) & ~0x07);\r
continue;\r
}\r
}\r
goto Done;\r
}\r
\r
- FfsFileEntry->FfsHeader = CacheFfsHeader;\r
+ FfsFileEntry->FfsHeader = CacheFfsHeader;\r
FfsFileEntry->FileCached = FileCached;\r
- FileCached = FALSE;\r
+ FileCached = FALSE;\r
InsertTailList (&FvDevice->FfsFileListHeader, &FfsFileEntry->Link);\r
}\r
\r
if (IS_FFS_FILE2 (CacheFfsHeader)) {\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsHeader + FFS_FILE2_SIZE (CacheFfsHeader));\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsHeader + FFS_FILE2_SIZE (CacheFfsHeader));\r
} else {\r
- FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsHeader + FFS_FILE_SIZE (CacheFfsHeader));\r
+ FfsHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsHeader + FFS_FILE_SIZE (CacheFfsHeader));\r
}\r
\r
//\r
- // Adjust pointer to the next 8-byte aligned boundry.\r
+ // Adjust pointer to the next 8-byte aligned boundary.\r
//\r
FfsHeader = (EFI_FFS_FILE_HEADER *)(((UINTN)FfsHeader + 7) & ~0x07);\r
-\r
}\r
\r
Done:\r
CoreFreePool (CacheFfsHeader);\r
FileCached = FALSE;\r
}\r
+\r
FreeFvDeviceResource (FvDevice);\r
}\r
\r
return Status;\r
}\r
\r
-\r
-\r
/**\r
This notification function is invoked when an instance of the\r
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL is produced. It layers an instance of the\r
EFI_FIRMWARE_VOLUME2_PROTOCOL on the same handle. This is the function where\r
the actual initialization of the EFI_FIRMWARE_VOLUME2_PROTOCOL is done.\r
\r
- @param Event The event that occured\r
+ @param Event The event that occurred\r
@param Context For EFI compatiblity. Not used.\r
\r
**/\r
VOID\r
EFIAPI\r
NotifyFwVolBlock (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- EFI_HANDLE Handle;\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;\r
- EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
- FV_DEVICE *FvDevice;\r
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
+ EFI_HANDLE Handle;\r
+ EFI_STATUS Status;\r
+ UINTN BufferSize;\r
+ EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;\r
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
+ FV_DEVICE *FvDevice;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
+\r
//\r
// Examine all new handles\r
//\r
- for (;;) {\r
+ for ( ; ;) {\r
//\r
// Get the next handle\r
//\r
BufferSize = sizeof (Handle);\r
- Status = CoreLocateHandle (\r
- ByRegisterNotify,\r
- NULL,\r
- gEfiFwVolBlockNotifyReg,\r
- &BufferSize,\r
- &Handle\r
- );\r
+ Status = CoreLocateHandle (\r
+ ByRegisterNotify,\r
+ NULL,\r
+ gEfiFwVolBlockNotifyReg,\r
+ &BufferSize,\r
+ &Handle\r
+ );\r
\r
//\r
// If not found, we're done\r
if (EFI_ERROR (Status)) {\r
continue;\r
}\r
+\r
ASSERT (FwVolHeader != NULL);\r
\r
if (!VerifyFvHeaderChecksum (FwVolHeader)) {\r
//\r
FvDevice->Fvb = Fvb;\r
}\r
-\r
} else {\r
//\r
// No FwVol protocol on the handle so create a new one\r
FvDevice->FwVolHeader = FwVolHeader;\r
FvDevice->IsFfs3Fv = CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid);\r
FvDevice->Fv.ParentHandle = Fvb->ParentHandle;\r
+ //\r
+ // Inherit the authentication status from FVB.\r
+ //\r
+ FvDevice->AuthenticationStatus = GetFvbAuthenticationStatus (Fvb);\r
\r
- if (Fvb->ParentHandle != NULL) {\r
- //\r
- // Inherit the authentication status from FVB.\r
- //\r
- FvDevice->AuthenticationStatus = GetFvbAuthenticationStatus (Fvb);\r
- }\r
- \r
if (!EFI_ERROR (FvCheck (FvDevice))) {\r
//\r
// Install an New FV protocol on the existing handle\r
//\r
Status = CoreInstallProtocolInterface (\r
- &Handle,\r
- &gEfiFirmwareVolume2ProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &FvDevice->Fv\r
- );\r
+ &Handle,\r
+ &gEfiFirmwareVolume2ProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ &FvDevice->Fv\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
} else {\r
//\r
return;\r
}\r
\r
-\r
-\r
/**\r
This routine is the driver initialization entry point. It registers\r
a notification function. This notification function are responsible\r
EFI_STATUS\r
EFIAPI\r
FwVolDriverInit (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
gEfiFwVolBlockEvent = EfiCreateProtocolNotifyEvent (\r
);\r
return EFI_SUCCESS;\r
}\r
-\r
-\r