Yonghong: Below logic is incorrect. Index is the byte offset, not date type offset. So, you should set Index = sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER) as the first value, and use the below statement to access it.
(((EFI_FIRMWARE_VOLUME_EXT_ENTRY *)(ExtHeader + Index)) ==> (((EFI_FIRMWARE_VOLUME_EXT_ENTRY *)((UIN8 *) ExtHeader + Index)) Thanks Liming >-----Original Message----- >From: Zhu, Yonghong >Sent: Friday, September 29, 2017 1:20 PM >To: edk2-devel@lists.01.org >Cc: Feng, YunhuaX <yunhuax.f...@intel.com>; Gao, Liming ><liming....@intel.com> >Subject: [Patch V2] BaseTools: PI 1.6 to support FV extended header contain >FV used size > >From: Yunhua Feng <yunhuax.f...@intel.com> > >Per PI 1.6 we added an FV Extended Header entry that would contain the >size of the FV that was in use. > >Cc: Liming Gao <liming....@intel.com> >Cc: Yonghong Zhu <yonghong....@intel.com> >Contributed-under: TianoCore Contribution Agreement 1.1 >Signed-off-by: Yunhua Feng <yunhuax.f...@intel.com> >--- > BaseTools/Source/C/GenFv/GenFvInternalLib.c | 19 >++++++++++++++++--- > BaseTools/Source/C/Include/Common/PiFirmwareVolume.h | 6 ++++++ > BaseTools/Source/Python/GenFds/FdfParser.py | 2 +- > BaseTools/Source/Python/GenFds/Fv.py | 17 ++++++++++++++++- > 4 files changed, 39 insertions(+), 5 deletions(-) > >diff --git a/BaseTools/Source/C/GenFv/GenFvInternalLib.c >b/BaseTools/Source/C/GenFv/GenFvInternalLib.c >index 01c862e..6a91858 100644 >--- a/BaseTools/Source/C/GenFv/GenFvInternalLib.c >+++ b/BaseTools/Source/C/GenFv/GenFvInternalLib.c >@@ -42,10 +42,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY >KIND, EITHER EXPRESS OR IMPLIED. > #define ARMT_UNCONDITIONAL_JUMP_INSTRUCTION 0xEB000000 > #define ARM64_UNCONDITIONAL_JUMP_INSTRUCTION 0x14000000 > > BOOLEAN mArm = FALSE; > STATIC UINT32 MaxFfsAlignment = 0; >+BOOLEAN VtfFileFlag = FALSE; > > EFI_GUID mEfiFirmwareVolumeTopFileGuid = >EFI_FFS_VOLUME_TOP_FILE_GUID; > EFI_GUID mFileGuidArray [MAX_NUMBER_OF_FILES_IN_FV]; > EFI_GUID mZeroGuid = {0x0, 0x0, 0x0, {0x0, 0x0, > 0x0, 0x0, 0x0, >0x0, 0x0, 0x0}}; > EFI_GUID mDefaultCapsuleGuid = {0x3B6686BD, 0x0D76, 0x4030, >{ 0xB7, 0x0E, 0xB5, 0x51, 0x9E, 0x2F, 0xC5, 0xA0 }}; >@@ -598,11 +599,13 @@ Returns: > { > EFI_FFS_FILE_HEADER *PadFile; > UINTN PadFileSize; > UINT32 NextFfsHeaderSize; > UINT32 CurFfsHeaderSize; >- >+ UINT32 Index; >+ >+ Index = 0; > CurFfsHeaderSize = sizeof (EFI_FFS_FILE_HEADER); > // > // Verify input parameters. > // > if (FvImage == NULL) { >@@ -703,10 +706,22 @@ Returns: > > if (ExtHeader != NULL) { > // > // Copy Fv Extension Header and Set Fv Extension header offset > // >+ if (ExtHeader->ExtHeaderSize > sizeof >(EFI_FIRMWARE_VOLUME_EXT_HEADER)) { >+ for (Index = 1; Index <= ExtHeader->ExtHeaderSize - >sizeof(EFI_FIRMWARE_VOLUME_EXT_HEADER);) { >+ if (((EFI_FIRMWARE_VOLUME_EXT_ENTRY *)(ExtHeader + Index)) -> >ExtEntryType == EFI_FV_EXT_TYPE_USED_SIZE_TYPE) { >+ if (VtfFileFlag) { >+ ((EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE >*)(ExtHeader + Index))->UsedSize = mFvTotalSize; >+ } else { >+ ((EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE >*)(ExtHeader + Index))->UsedSize = mFvTakenSize; >+ } >+ Index += ((EFI_FIRMWARE_VOLUME_EXT_ENTRY *)(ExtHeader + Index)) >-> ExtEntrySize; >+ } >+ } >+ } > memcpy ((UINT8 *)PadFile + CurFfsHeaderSize, ExtHeader, ExtHeader- >>ExtHeaderSize); > ((EFI_FIRMWARE_VOLUME_HEADER *) FvImage->FileImage)- >>ExtHeaderOffset = (UINT16) ((UINTN) ((UINT8 *)PadFile + CurFfsHeaderSize) >- (UINTN) FvImage->FileImage); > // > // Make next file start at QWord Boundry > // >@@ -3057,16 +3072,14 @@ Returns: > UINTN FfsFileSize; > UINTN FvExtendHeaderSize; > UINT32 FfsAlignment; > UINT32 FfsHeaderSize; > EFI_FFS_FILE_HEADER FfsHeader; >- BOOLEAN VtfFileFlag; > UINTN VtfFileSize; > > FvExtendHeaderSize = 0; > VtfFileSize = 0; >- VtfFileFlag = FALSE; > fpin = NULL; > Index = 0; > > // > // Compute size for easy access later >diff --git a/BaseTools/Source/C/Include/Common/PiFirmwareVolume.h >b/BaseTools/Source/C/Include/Common/PiFirmwareVolume.h >index b5c2b03..c3089e8 100644 >--- a/BaseTools/Source/C/Include/Common/PiFirmwareVolume.h >+++ b/BaseTools/Source/C/Include/Common/PiFirmwareVolume.h >@@ -152,6 +152,12 @@ typedef struct { > // > // UINT8 Data[1]; > // > } EFI_FIRMWARE_VOLUME_EXT_ENTRY_GUID_TYPE; > >+#define EFI_FV_EXT_TYPE_USED_SIZE_TYPE 0x03 >+typedef struct { >+ EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr; >+ UINT32 UsedSize; >+} EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE; >+ > #endif >diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py >b/BaseTools/Source/Python/GenFds/FdfParser.py >index 499d0a6..b95afc7 100644 >--- a/BaseTools/Source/Python/GenFds/FdfParser.py >+++ b/BaseTools/Source/Python/GenFds/FdfParser.py >@@ -2309,11 +2309,11 @@ class FdfParser: > if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \ > "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", >"WRITE_ENABLED_CAP", \ > "WRITE_DISABLED_CAP", "WRITE_STATUS", >"READ_ENABLED_CAP", \ > "READ_DISABLED_CAP", "READ_STATUS", > "READ_LOCK_CAP", \ > "READ_LOCK_STATUS", "WRITE_LOCK_CAP", >"WRITE_LOCK_STATUS", \ >- "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT"): >+ "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", >"FvUsedSizeEnable"): > self.__UndoToken() > return False > > if not self.__IsToken( "="): > raise Warning("expected '='", self.FileName, > self.CurrentLineNumber) >diff --git a/BaseTools/Source/Python/GenFds/Fv.py >b/BaseTools/Source/Python/GenFds/Fv.py >index 4b03adc..45f6696 100644 >--- a/BaseTools/Source/Python/GenFds/Fv.py >+++ b/BaseTools/Source/Python/GenFds/Fv.py >@@ -49,10 +49,11 @@ class FV (FvClassObject): > self.FvAddressFileName = None > self.CapsuleName = None > self.FvBaseAddress = None > self.FvForceRebase = None > self.FvRegionInFD = None >+ self.UsedSizeEnable = False > > ## AddToBuffer() > # > # Generate Fv and add it to the Buffer > # >@@ -305,10 +306,14 @@ class FV (FvClassObject): > self.FvInfFile.writelines("EFI_ERASE_POLARITY = " + \ > ' %s' %ErasePloarity + \ > T_CHAR_LF) > if not (self.FvAttributeDict == None): > for FvAttribute in self.FvAttributeDict.keys() : >+ if FvAttribute == "FvUsedSizeEnable": >+ if self.FvAttributeDict[FvAttribute].upper() in ('TRUE', >'1') : >+ self.UsedSizeEnable = True >+ continue > self.FvInfFile.writelines("EFI_" + \ > FvAttribute + \ > ' = ' + \ > self.FvAttributeDict[FvAttribute] + > \ > T_CHAR_LF ) >@@ -320,16 +325,26 @@ class FV (FvClassObject): > > # > # Generate FV extension header file > # > if self.FvNameGuid == None or self.FvNameGuid == '': >- if len(self.FvExtEntryType) > 0: >+ if len(self.FvExtEntryType) > 0 or self.UsedSizeEnable: > GenFdsGlobalVariable.ErrorLogger("FV Extension Header Entries >declared for %s with no FvNameGuid declaration." % (self.UiFvName)) > > if self.FvNameGuid <> None and self.FvNameGuid <> '': > TotalSize = 16 + 4 > Buffer = '' >+ if self.UsedSizeEnable: >+ TotalSize += (4 + 4) >+ ## define EFI_FV_EXT_TYPE_USED_SIZE_TYPE 0x03 >+ #typedef struct >+ # { >+ # EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr; >+ # UINT32 UsedSize; >+ # } EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE; >+ Buffer += pack('HHL', 8, 3, 0) >+ > if self.FvNameString == 'TRUE': > # > # Create EXT entry for FV UI name > # This GUID is used: A67DF1FA-8DE8-4E98-AF09-4BDF2EFFBC7C > # >-- >2.6.1.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel