From 23491d5cc2c8e732c779f7e30db12a62a2a816c3 Mon Sep 17 00:00:00 2001 From: lzeng14 Date: Thu, 27 Oct 2011 10:46:50 +0000 Subject: Add core FFS3 support, FwVolDxe and SectionExtraction. Signed-off-by: lzeng14 Reviewed-by: lgao4 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12585 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/FirmwareVolume/FwVolDxe/Ffs.c | 57 ++++++++-------------- 1 file changed, 20 insertions(+), 37 deletions(-) (limited to 'IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/Ffs.c') diff --git a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/Ffs.c b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/Ffs.c index 1e3c839e27..12508b4335 100644 --- a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/Ffs.c +++ b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/Ffs.c @@ -239,7 +239,11 @@ VerifyHeaderChecksum ( { UINT8 HeaderChecksum; - HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER)); + if (IS_FFS_FILE2 (FfsHeader)) { + HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER2)); + } else { + HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER)); + } HeaderChecksum = (UINT8) (HeaderChecksum - FfsHeader->State - FfsHeader->IntegrityCheck.Checksum.File); if (HeaderChecksum == 0) { @@ -265,18 +269,19 @@ VerifyFileChecksum ( { UINT8 FileChecksum; EFI_FV_FILE_ATTRIBUTES Attributes; - UINT32 FileSize; Attributes = FfsHeader->Attributes; if ((Attributes & FFS_ATTRIB_CHECKSUM) != 0) { - FileSize = *(UINT32 *) FfsHeader->Size & 0x00FFFFFF; - // // Check checksum of FFS data // - FileChecksum = CalculateSum8 ((UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER), FileSize - sizeof (EFI_FFS_FILE_HEADER)); + if (IS_FFS_FILE2 (FfsHeader)) { + FileChecksum = CalculateSum8 ((UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER2), FFS_FILE2_SIZE (FfsHeader) - sizeof (EFI_FFS_FILE_HEADER2)); + } else { + FileChecksum = CalculateSum8 ((UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER), FFS_FILE_SIZE (FfsHeader) - sizeof (EFI_FFS_FILE_HEADER)); + } FileChecksum = (UINT8) (FileChecksum + FfsHeader->IntegrityCheck.Checksum.File); if (FileChecksum == 0) { @@ -388,10 +393,18 @@ GetNextPossibleFileHeader ( // // Skip this header // - return (EFI_PHYSICAL_ADDRESS) (UINTN) FfsHeader + sizeof (EFI_FFS_FILE_HEADER); + if (IS_FFS_FILE2 (FfsHeader)) { + return (EFI_PHYSICAL_ADDRESS) (UINTN) FfsHeader + sizeof (EFI_FFS_FILE_HEADER2); + } else { + return (EFI_PHYSICAL_ADDRESS) (UINTN) FfsHeader + sizeof (EFI_FFS_FILE_HEADER); + } } - FileLength = *(UINT32 *) FfsHeader->Size & 0x00FFFFFF; + if (IS_FFS_FILE2 (FfsHeader)) { + FileLength = FFS_FILE2_SIZE (FfsHeader); + } else { + FileLength = FFS_FILE_SIZE (FfsHeader); + } // // Since FileLength is not multiple of 8, we need skip some bytes @@ -593,33 +606,3 @@ IsValidFFSFile ( return TRUE; } -/** - Locate the first file in FV. - - @param FvDevice Cached FV image. - @param FirstFile Points to the got first FFS file header. - - @retval EFI_NOT_FOUND No FFS file is found in FV. - @retval EFI_SUCCESS The first FFS file is got. - -**/ -EFI_STATUS -FvLocateFirstFile ( - IN FV_DEVICE *FvDevice, - OUT EFI_FFS_FILE_HEADER **FirstFile - ) -{ - FFS_FILE_LIST_ENTRY *TmpFileList; - LIST_ENTRY *Link; - - Link = FvDevice->FfsFileListHeader.ForwardLink; - - if (Link == &FvDevice->FfsFileListHeader) { - return EFI_NOT_FOUND; - } - - TmpFileList = (FFS_FILE_LIST_ENTRY *) Link; - *FirstFile = (EFI_FFS_FILE_HEADER *) TmpFileList->FfsHeader; - - return EFI_SUCCESS; -} -- cgit v1.2.3