public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Gao, Liming" <liming.gao@intel.com>
To: "Zhu, Yonghong" <yonghong.zhu@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Feng, YunhuaX" <yunhuax.feng@intel.com>
Subject: Re: [Patch V2] BaseTools: PI 1.6 to support FV extended header contain FV used size
Date: Fri, 29 Sep 2017 07:20:14 +0000	[thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E1668AD@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <1506662392-7460-1-git-send-email-yonghong.zhu@intel.com>

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.feng@intel.com>; Gao, Liming
><liming.gao@intel.com>
>Subject: [Patch V2] BaseTools: PI 1.6 to support FV extended header contain
>FV used size
>
>From: Yunhua Feng <yunhuax.feng@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.gao@intel.com>
>Cc: Yonghong Zhu <yonghong.zhu@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Yunhua Feng <yunhuax.feng@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



      reply	other threads:[~2017-09-29  7:17 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-29  5:19 [Patch V2] BaseTools: PI 1.6 to support FV extended header contain FV used size Yonghong Zhu
2017-09-29  7:20 ` Gao, Liming [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E1668AD@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox