public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Yonghong Zhu <yonghong.zhu@intel.com>
To: edk2-devel@lists.01.org
Cc: Yunhua Feng <yunhuax.feng@intel.com>, Liming Gao <liming.gao@intel.com>
Subject: [Patch] BaseTools: PI 1.6 to support FV extended header contain FV used size
Date: Thu, 28 Sep 2017 16:21:37 +0800	[thread overview]
Message-ID: <1506586897-15388-1-git-send-email-yonghong.zhu@intel.com> (raw)

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/GenFv/GenFvInternalLib.h          |  3 ++-
 BaseTools/Source/C/Include/Common/PiFirmwareVolume.h |  6 ++++++
 BaseTools/Source/Python/GenFds/FdfParser.py          |  2 +-
 BaseTools/Source/Python/GenFds/Fv.py                 | 20 +++++++++++++++++++-
 5 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/BaseTools/Source/C/GenFv/GenFvInternalLib.c b/BaseTools/Source/C/GenFv/GenFvInternalLib.c
index 01c862e..5b219b3 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,10 +599,11 @@ Returns:
 {
   EFI_FFS_FILE_HEADER *PadFile;
   UINTN               PadFileSize;
   UINT32              NextFfsHeaderSize;
   UINT32              CurFfsHeaderSize;
+  EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE *FvUsedSize;
 
   CurFfsHeaderSize = sizeof (EFI_FFS_FILE_HEADER);
   //
   // Verify input parameters.
   //
@@ -703,10 +705,25 @@ Returns:
 
   if (ExtHeader != NULL) {
     //
     // Copy Fv Extension Header and Set Fv Extension header offset
     //
+    if (ExtHeader->ExtHeaderSize > sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER)) {
+      FvUsedSize = malloc(sizeof(EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE));
+      if (FvUsedSize == NULL) {
+        return EFI_OUT_OF_RESOURCES;
+      }
+      memcpy(FvUsedSize, ExtHeader + 1, sizeof(EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE));
+      if (FvUsedSize->Hdr.ExtEntryType == EFI_FV_EXT_TYPE_USED_SIZE_TYPE) {
+        if (VtfFileFlag) {
+          FvUsedSize->UsedSize = mFvTotalSize;
+        } else {
+          FvUsedSize->UsedSize = mFvTakenSize;
+        }
+        memcpy(ExtHeader + 1, FvUsedSize, sizeof(EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE));
+      }
+     }
     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 +3074,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/GenFv/GenFvInternalLib.h b/BaseTools/Source/C/GenFv/GenFvInternalLib.h
index f039fa4..9b1abe7 100644
--- a/BaseTools/Source/C/GenFv/GenFvInternalLib.h
+++ b/BaseTools/Source/C/GenFv/GenFvInternalLib.h
@@ -1,10 +1,10 @@
 /** @file
 This file contains describes the public interfaces to the GenFvImage Library.
 The basic purpose of the library is to create Firmware Volume images.
   
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials                          
 are licensed and made available under the terms and conditions of the BSD License         
 which accompanies this distribution.  The full text of the license may be found at        
 http://opensource.org/licenses/bsd-license.php                                            
                                                                                           
@@ -256,10 +256,11 @@ extern FV_INFO    mFvDataInfo;
 extern CAP_INFO   mCapDataInfo;
 extern EFI_GUID   mEfiFirmwareFileSystem2Guid;
 extern EFI_GUID   mEfiFirmwareFileSystem3Guid;
 extern UINT32     mFvTotalSize;
 extern UINT32     mFvTakenSize;
+extern BOOLEAN    VtfFileFlag;
 
 extern EFI_PHYSICAL_ADDRESS mFvBaseAddress[];
 extern UINT32               mFvBaseAddressNumber;
 //
 // Local function prototypes
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..9d4196c 100644
--- a/BaseTools/Source/Python/GenFds/Fv.py
+++ b/BaseTools/Source/Python/GenFds/Fv.py
@@ -49,10 +49,14 @@ class FV (FvClassObject):
         self.FvAddressFileName = None
         self.CapsuleName = None
         self.FvBaseAddress = None
         self.FvForceRebase = None
         self.FvRegionInFD = None
+        self.ExtEntryType = 0x3
+        self.ExtEntrySize = 8
+        self.UsedSize = 0
+        self.UsedSizeEnable = False
         
     ## AddToBuffer()
     #
     #   Generate Fv and add it to the Buffer
     #
@@ -305,10 +309,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 +328,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', (self.ExtEntrySize), (self.ExtEntryType), (self.UsedSize))
+
             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-28  8:18 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-28  8:21 Yonghong Zhu [this message]
2017-09-28 10:43 ` [Patch] BaseTools: PI 1.6 to support FV extended header contain FV used size Gao, Liming

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=1506586897-15388-1-git-send-email-yonghong.zhu@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