]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: PI 1.6 to support FV extended header contain FV used size
authorYunhua Feng <yunhuax.feng@intel.com>
Wed, 27 Sep 2017 13:09:34 +0000 (21:09 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Tue, 3 Oct 2017 00:18:15 +0000 (08:18 +0800)
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>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/C/GenFv/GenFvInternalLib.c
BaseTools/Source/C/Include/Common/PiFirmwareVolume.h
BaseTools/Source/Python/GenFds/FdfParser.py
BaseTools/Source/Python/GenFds/Fv.py

index 01c862e89a393d74b8e004b4cce661fe22f2b9fa..2b80e7919ba250c3ce1d4de6a5f13ad790787855 100644 (file)
@@ -44,6 +44,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 BOOLEAN mArm = FALSE;\r
 STATIC UINT32   MaxFfsAlignment = 0;\r
+BOOLEAN VtfFileFlag = FALSE;\r
 \r
 EFI_GUID  mEfiFirmwareVolumeTopFileGuid       = EFI_FFS_VOLUME_TOP_FILE_GUID;\r
 EFI_GUID  mFileGuidArray [MAX_NUMBER_OF_FILES_IN_FV];\r
@@ -600,7 +601,9 @@ Returns:
   UINTN               PadFileSize;\r
   UINT32              NextFfsHeaderSize;\r
   UINT32              CurFfsHeaderSize;\r
+  UINT32              Index;\r
 \r
+  Index = 0;\r
   CurFfsHeaderSize = sizeof (EFI_FFS_FILE_HEADER);\r
   //\r
   // Verify input parameters.\r
@@ -705,6 +708,19 @@ Returns:
     //\r
     // Copy Fv Extension Header and Set Fv Extension header offset\r
     //\r
+    if (ExtHeader->ExtHeaderSize > sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER)) {\r
+      for (Index = sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER); Index < ExtHeader->ExtHeaderSize;) {\r
+        if (((EFI_FIRMWARE_VOLUME_EXT_ENTRY *)((UINT8 *)ExtHeader + Index))-> ExtEntryType == EFI_FV_EXT_TYPE_USED_SIZE_TYPE) {\r
+          if (VtfFileFlag) {\r
+            ((EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE *)((UINT8 *)ExtHeader + Index))->UsedSize = mFvTotalSize;\r
+          } else {\r
+            ((EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE *)((UINT8 *)ExtHeader + Index))->UsedSize = mFvTakenSize;\r
+          }\r
+          break;\r
+        }\r
+        Index += ((EFI_FIRMWARE_VOLUME_EXT_ENTRY *)((UINT8 *)ExtHeader + Index))-> ExtEntrySize;\r
+      }\r
+    }\r
     memcpy ((UINT8 *)PadFile + CurFfsHeaderSize, ExtHeader, ExtHeader->ExtHeaderSize);\r
     ((EFI_FIRMWARE_VOLUME_HEADER *) FvImage->FileImage)->ExtHeaderOffset = (UINT16) ((UINTN) ((UINT8 *)PadFile + CurFfsHeaderSize) - (UINTN) FvImage->FileImage);\r
          //\r
@@ -3059,12 +3075,10 @@ Returns:
   UINT32              FfsAlignment;\r
   UINT32              FfsHeaderSize;\r
   EFI_FFS_FILE_HEADER FfsHeader;\r
-  BOOLEAN             VtfFileFlag;\r
   UINTN               VtfFileSize;\r
   \r
   FvExtendHeaderSize = 0;\r
   VtfFileSize = 0;\r
-  VtfFileFlag = FALSE;\r
   fpin  = NULL;\r
   Index = 0;\r
 \r
index b5c2b038443f37c182d4a061cad318bb11db5af8..c3089e8b70d0cfee45d53467327a86b40ebed845 100644 (file)
@@ -154,4 +154,10 @@ typedef struct {
   //\r
 } EFI_FIRMWARE_VOLUME_EXT_ENTRY_GUID_TYPE;\r
 \r
+#define EFI_FV_EXT_TYPE_USED_SIZE_TYPE 0x03\r
+typedef struct {\r
+  EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr;\r
+  UINT32 UsedSize;\r
+} EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE;\r
+\r
 #endif\r
index 499d0a6f053c407210a279a931cbb8af68c3d21b..b95afc778362f1f2d43efe19205e2992481c8d22 100644 (file)
@@ -2311,7 +2311,7 @@ class FdfParser:
                            "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \\r
                            "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \\r
                            "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \\r
-                           "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT"):\r
+                           "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", "FvUsedSizeEnable"):\r
                 self.__UndoToken()\r
                 return False\r
 \r
index 4b03adc1c83a88063c4e3b11af0cf6d8af30b96c..45f6696a5fd74a8be1c42b41dc3063996705ae2e 100644 (file)
@@ -51,6 +51,7 @@ class FV (FvClassObject):
         self.FvBaseAddress = None\r
         self.FvForceRebase = None\r
         self.FvRegionInFD = None\r
+        self.UsedSizeEnable = False\r
         \r
     ## AddToBuffer()\r
     #\r
@@ -307,6 +308,10 @@ class FV (FvClassObject):
                                           T_CHAR_LF)\r
         if not (self.FvAttributeDict == None):\r
             for FvAttribute in self.FvAttributeDict.keys() :\r
+                if FvAttribute == "FvUsedSizeEnable":\r
+                    if self.FvAttributeDict[FvAttribute].upper() in ('TRUE', '1') :\r
+                        self.UsedSizeEnable = True\r
+                    continue\r
                 self.FvInfFile.writelines("EFI_"            + \\r
                                           FvAttribute       + \\r
                                           ' = '             + \\r
@@ -322,12 +327,22 @@ class FV (FvClassObject):
         # Generate FV extension header file\r
         #\r
         if self.FvNameGuid == None or self.FvNameGuid == '':\r
-            if len(self.FvExtEntryType) > 0:\r
+            if len(self.FvExtEntryType) > 0 or self.UsedSizeEnable:\r
                 GenFdsGlobalVariable.ErrorLogger("FV Extension Header Entries declared for %s with no FvNameGuid declaration." % (self.UiFvName))\r
         \r
         if self.FvNameGuid <> None and self.FvNameGuid <> '':\r
             TotalSize = 16 + 4\r
             Buffer = ''\r
+            if self.UsedSizeEnable:\r
+                TotalSize += (4 + 4)\r
+                ## define EFI_FV_EXT_TYPE_USED_SIZE_TYPE 0x03\r
+                #typedef  struct\r
+                # {\r
+                #    EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr;\r
+                #    UINT32 UsedSize;\r
+                # } EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE;\r
+                Buffer += pack('HHL', 8, 3, 0)\r
+\r
             if self.FvNameString == 'TRUE':\r
                 #\r
                 # Create EXT entry for FV UI name\r