Update GenFv tool to create PI compliant FvImage that may contain the Fv extension...
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 25 Feb 2009 06:23:18 +0000 (06:23 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 25 Feb 2009 06:23:18 +0000 (06:23 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1501 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenFv/GenFv.c
Source/C/GenFv/GenFvInternalLib.c
Source/C/GenFv/GenFvInternalLib.h

index f2aa378..637de7d 100644 (file)
@@ -134,7 +134,10 @@ Returns:
                         Logfile is the output fv map file name. if it is not\n\\r
                         given, the FvName.map will be the default map file name\n"); \r
   fprintf (stdout, "  -g Guid, --capguid GuidValue\n\\r
-                        GuidValue is one specific capsule or fv vendor guid value.\n\\r
+                        GuidValue is one specific capsule or fv file system guid value.\n\\r
+                        Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
+  fprintf (stdout, "  --FvnameGuid\n\\r
+                        GuidValue is the Fv Name Guid value.\n\\r
                         Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
   fprintf (stdout, "  --capflag CapFlag\n\\r
                         Capsule Reset Flag can be PersistAcrossReset,\n\\r
@@ -238,7 +241,7 @@ Returns:
        //\r
        // Set the default FvGuid\r
        //\r
-       memcpy (&mFvDataInfo.FvGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
+       memcpy (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
    \r
   //\r
   // Parse command line\r
@@ -428,9 +431,24 @@ Returns:
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_GUID_STRING, argv[1]);\r
         return EFI_ABORTED;\r
       }\r
-      memcpy (&mFvDataInfo.FvGuid, &mCapDataInfo.CapGuid, sizeof (EFI_GUID));\r
+      memcpy (&mFvDataInfo.FvFileSystemGuid, &mCapDataInfo.CapGuid, sizeof (EFI_GUID));\r
       DebugMsg (NULL, 0, 9, "Capsule Guid", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
-      DebugMsg (NULL, 0, 9, "FV Guid", "%s = %s", EFI_FV_GUID_STRING, argv[1]);\r
+      DebugMsg (NULL, 0, 9, "FV Guid", "%s = %s", EFI_FV_FILESYSTEMGUID_STRING, argv[1]);\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue; \r
+    }\r
+\r
+    if (stricmp (argv[0], "--FvnameGuid") == 0) {\r
+      //\r
+      // Get Fv Name Guid\r
+      //\r
+      Status = StringToGuid (argv[1], &mFvDataInfo.FvNameGuid);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_GUID_STRING, argv[1]);\r
+        return EFI_ABORTED;\r
+      }\r
+      DebugMsg (NULL, 0, 9, "FV Name Guid", "%s = %s", EFI_FV_NAMEGUID_STRING, argv[1]);\r
       argc -= 2;\r
       argv += 2;\r
       continue; \r
index d73f3cd..3b35983 100644 (file)
@@ -211,27 +211,38 @@ Returns:
   }\r
 \r
   //\r
-  // Read the FV Guid\r
+  // Read the FV File System Guid\r
   //\r
-  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_GUID_STRING, 0, Value);\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_FILESYSTEMGUID_STRING, 0, Value);\r
   if (Status == EFI_SUCCESS) {\r
     //\r
     // Get the guid value\r
     //\r
-    StringToGuid (Value, &FvInfo->FvGuid);\r
+    StringToGuid (Value, &FvInfo->FvFileSystemGuid);\r
+  }\r
+\r
+  //\r
+  // Read the FV Name Guid\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_NAMEGUID_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    //\r
+    // Get the guid value\r
+    //\r
+    StringToGuid (Value, &FvInfo->FvNameGuid);\r
+    DebugMsg (NULL, 0, 9, "FV Name Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
+                FvInfo->FvNameGuid.Data1,\r
+                FvInfo->FvNameGuid.Data2,\r
+                FvInfo->FvNameGuid.Data3,\r
+                FvInfo->FvNameGuid.Data4[0],\r
+                FvInfo->FvNameGuid.Data4[1],\r
+                FvInfo->FvNameGuid.Data4[2],\r
+                FvInfo->FvNameGuid.Data4[3],\r
+                FvInfo->FvNameGuid.Data4[4],\r
+                FvInfo->FvNameGuid.Data4[5],\r
+                FvInfo->FvNameGuid.Data4[6],\r
+                FvInfo->FvNameGuid.Data4[7]);\r
   }\r
-  DebugMsg (NULL, 0, 9, "FV File Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
-                FvInfo->FvGuid.Data1,\r
-                FvInfo->FvGuid.Data2,\r
-                FvInfo->FvGuid.Data3,\r
-                FvInfo->FvGuid.Data4[0],\r
-                FvInfo->FvGuid.Data4[1],\r
-                FvInfo->FvGuid.Data4[2],\r
-                FvInfo->FvGuid.Data4[3],\r
-                FvInfo->FvGuid.Data4[4],\r
-                FvInfo->FvGuid.Data4[5],\r
-                FvInfo->FvGuid.Data4[6],\r
-                FvInfo->FvGuid.Data4[7]);\r
 \r
   //\r
   // Read the FV file name\r
@@ -499,7 +510,8 @@ Returns:
 EFI_STATUS\r
 AddPadFile (\r
   IN OUT MEMORY_FILE  *FvImage,\r
-  IN UINT32           DataAlignment\r
+  IN UINT32           DataAlignment,\r
+  IN EFI_FIRMWARE_VOLUME_EXT_HEADER *ExtHeader\r
   )\r
 /*++\r
 \r
@@ -513,6 +525,7 @@ Arguments:
   FvImage         The memory image of the FV to add it to.  The current offset\r
                   must be valid.\r
   DataAlignment   The data alignment of the next FFS file.\r
+  ExtHeader       PI FvExtHeader Optional \r
 \r
 Returns:\r
 \r
@@ -536,7 +549,7 @@ Returns:
   //\r
   // Check if a pad file is necessary\r
   //\r
-  if (((UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + sizeof (EFI_FFS_FILE_HEADER)) % DataAlignment == 0) {\r
+  if ((ExtHeader == NULL) && (((UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + sizeof (EFI_FFS_FILE_HEADER)) % DataAlignment == 0)) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -548,8 +561,14 @@ Returns:
   //\r
   // Verify that we have enough space for the file header\r
   //\r
-  if ((UINTN) (PadFile + sizeof (EFI_FFS_FILE_HEADER)) >= (UINTN) FvImage->Eof) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+  if (ExtHeader != NULL) {\r
+    if ((UINTN) (PadFile + sizeof (EFI_FFS_FILE_HEADER) + ExtHeader->ExtHeaderSize) >= (UINTN) FvImage->Eof) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }    \r
+  } else {\r
+    if ((UINTN) (PadFile + sizeof (EFI_FFS_FILE_HEADER)) >= (UINTN) FvImage->Eof) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
   }\r
 \r
   //\r
@@ -565,7 +584,11 @@ Returns:
   // This is the earliest possible valid offset (current plus pad file header\r
   // plus the next file header)\r
   //\r
-  PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2);\r
+  if (ExtHeader != NULL) {\r
+    PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2) + ExtHeader->ExtHeaderSize;\r
+  } else {\r
+    PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2);\r
+  }\r
 \r
   //\r
   // Add whatever it takes to get to the next aligned address\r
@@ -597,20 +620,24 @@ Returns:
   PadFile->IntegrityCheck.Checksum.File   = 0;\r
   PadFile->State                          = 0;\r
   PadFile->IntegrityCheck.Checksum.Header = CalculateChecksum8 ((UINT8 *) PadFile, sizeof (EFI_FFS_FILE_HEADER));\r
-  if (PadFile->Attributes & FFS_ATTRIB_CHECKSUM) {\r
-    PadFile->IntegrityCheck.Checksum.File = CalculateChecksum8 ((UINT8 *) PadFile, PadFileSize);\r
-  } else {\r
-    PadFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
-  }\r
+  PadFile->IntegrityCheck.Checksum.File   = FFS_FIXED_CHECKSUM;\r
 \r
   PadFile->State = EFI_FILE_HEADER_CONSTRUCTION | EFI_FILE_HEADER_VALID | EFI_FILE_DATA_VALID;\r
   UpdateFfsFileState (\r
     (EFI_FFS_FILE_HEADER *) PadFile,\r
     (EFI_FIRMWARE_VOLUME_HEADER *) FvImage->FileImage\r
     );\r
+  \r
+  if (ExtHeader != NULL) {\r
+    //\r
+    // Copy Fv Extension Header and Set Fv Extension header offset\r
+    //\r
+    memcpy (PadFile + 1, ExtHeader, ExtHeader->ExtHeaderSize);\r
+    ((EFI_FIRMWARE_VOLUME_HEADER *) FvImage->FileImage)->ExtHeaderOffset = (UINT16) ((UINTN) (PadFile + 1) - (UINTN) FvImage->FileImage);\r
+  }\r
 \r
   //\r
-  // Verify that we have enough space (including the padding\r
+  // Verify that we have enough space (including the padding)\r
   //\r
   if (((UINTN)PadFile + PadFileSize) >= (UINTN) FvImage->Eof) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -1070,7 +1097,7 @@ Returns:
   //\r
   // Add pad file if necessary\r
   //\r
-  Status = AddPadFile (FvImage, 1 << CurrentFileAlignment);\r
+  Status = AddPadFile (FvImage, 1 << CurrentFileAlignment, NULL);\r
   if (EFI_ERROR (Status)) {\r
     Error (NULL, 0, 4002, "Resource", "FV space is full, could not add pad file for data alignment property.");\r
     free (FileBuffer);\r
@@ -1174,11 +1201,7 @@ Returns:
   PadFile->IntegrityCheck.Checksum.File   = 0;\r
   PadFile->State                          = 0;\r
   PadFile->IntegrityCheck.Checksum.Header = CalculateChecksum8 ((UINT8 *) PadFile, sizeof (EFI_FFS_FILE_HEADER));\r
-  if (PadFile->Attributes & FFS_ATTRIB_CHECKSUM) {\r
-    PadFile->IntegrityCheck.Checksum.File = CalculateChecksum8 ((UINT8 *) PadFile, FileSize);\r
-  } else {\r
-    PadFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
-  }\r
+  PadFile->IntegrityCheck.Checksum.File   = FFS_FIXED_CHECKSUM;\r
 \r
   PadFile->State = EFI_FILE_HEADER_CONSTRUCTION | EFI_FILE_HEADER_VALID | EFI_FILE_DATA_VALID;\r
 \r
@@ -1665,6 +1688,7 @@ Returns:
   FILE                        *FvFile;\r
   CHAR8                       FvMapName [_MAX_PATH];\r
   FILE                        *FvMapFile;\r
+  EFI_FIRMWARE_VOLUME_EXT_HEADER FvExtHeader;\r
 \r
   FvBufferHeader = NULL;\r
   FvFile         = NULL;\r
@@ -1704,10 +1728,26 @@ Returns:
     Error (NULL, 0, 1001, "Missing required argument", "Block Size");\r
     return EFI_ABORTED;\r
   }\r
-\r
-  if (CompareGuid (&mFvDataInfo.FvGuid, &mEfiFirmwareFileSystem2Guid) == 0) {\r
+  \r
+  //\r
+  // Debug message Fv File System Guid\r
+  //\r
+  DebugMsg (NULL, 0, 9, "FV File System Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
+                mFvDataInfo.FvFileSystemGuid.Data1,\r
+                mFvDataInfo.FvFileSystemGuid.Data2,\r
+                mFvDataInfo.FvFileSystemGuid.Data3,\r
+                mFvDataInfo.FvFileSystemGuid.Data4[0],\r
+                mFvDataInfo.FvFileSystemGuid.Data4[1],\r
+                mFvDataInfo.FvFileSystemGuid.Data4[2],\r
+                mFvDataInfo.FvFileSystemGuid.Data4[3],\r
+                mFvDataInfo.FvFileSystemGuid.Data4[4],\r
+                mFvDataInfo.FvFileSystemGuid.Data4[5],\r
+                mFvDataInfo.FvFileSystemGuid.Data4[6],\r
+                mFvDataInfo.FvFileSystemGuid.Data4[7]);\r
+\r
+  if (CompareGuid (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid) == 0) {\r
     mFvDataInfo.IsPiFvImage = TRUE;\r
-  } \r
+  }\r
 \r
   //\r
   // FvMap file to log the function address of all modules in one Fvimage\r
@@ -1783,9 +1823,9 @@ Returns:
   memset (FvHeader->ZeroVector, 0, 16);\r
 \r
   //\r
-  // Copy the FFS GUID\r
+  // Copy the Fv file system GUID\r
   //\r
-  memcpy (&FvHeader->FileSystemGuid, &mFvDataInfo.FvGuid, sizeof (EFI_GUID));\r
+  memcpy (&FvHeader->FileSystemGuid, &mFvDataInfo.FvFileSystemGuid, sizeof (EFI_GUID));\r
 \r
   FvHeader->FvLength        = FvImageSize;\r
   FvHeader->Signature       = EFI_FVH_SIGNATURE;\r
@@ -1864,6 +1904,20 @@ Returns:
     fprintf (FvMapFile, " = 0x%x\n\n", mFvTotalSize - mFvTakenSize);\r
   }\r
 \r
+  //\r
+  // Set PI FV extension header\r
+  //\r
+  if (CompareGuid (&mFvDataInfo.FvNameGuid, &mZeroGuid) != 0) {\r
+    memcpy (&FvExtHeader.FvName, &mFvDataInfo.FvNameGuid, sizeof (EFI_GUID));\r
+    FvExtHeader.ExtHeaderSize = sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER);\r
+    AddPadFile (&FvImageMemoryFile, 8, &FvExtHeader);\r
+    //\r
+    // Fv Extension header change update Fv Header Check sum\r
+    //\r
+    FvHeader->Checksum      = 0;\r
+    FvHeader->Checksum      = CalculateChecksum16 ((UINT16 *) FvHeader, FvHeader->HeaderLength / sizeof (UINT16));\r
+  }\r
+\r
   //\r
   // Add files to FV\r
   //\r
@@ -2081,6 +2135,14 @@ Returns:
       break;\r
     }\r
   }\r
+  \r
+  //\r
+  // Calculate PI extension header\r
+  //\r
+  if (CompareGuid (&mFvDataInfo.FvNameGuid, &mZeroGuid) != 0) {\r
+    CurrentOffset += sizeof (EFI_FFS_FILE_HEADER) + sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER);\r
+    CurrentOffset = (CurrentOffset + 7) & (~7);\r
+  }\r
 \r
   //\r
   // Accumlate every FFS file size.\r
index effbc92..71a6788 100644 (file)
@@ -77,7 +77,8 @@ Abstract:
 #define EFI_NUM_BLOCKS_STRING             "EFI_NUM_BLOCKS"\r
 #define EFI_BLOCK_SIZE_STRING             "EFI_BLOCK_SIZE"\r
 #define EFI_GUID_STRING                   "EFI_GUID"\r
-#define EFI_FV_GUID_STRING                "EFI_FV_GUID"\r
+#define EFI_FV_FILESYSTEMGUID_STRING      "EFI_FV_GUID"\r
+#define EFI_FV_NAMEGUID_STRING            "EFI_FVNAME_GUID" \r
 #define EFI_CAPSULE_GUID_STRING           "EFI_CAPSULE_GUID"\r
 #define EFI_CAPSULE_HEADER_SIZE_STRING    "EFI_CAPSULE_HEADER_SIZE"\r
 #define EFI_CAPSULE_FLAGS_STRING          "EFI_CAPSULE_FLAGS"\r
@@ -223,7 +224,8 @@ typedef struct {
   EFI_PHYSICAL_ADDRESS    BaseAddress;\r
   EFI_PHYSICAL_ADDRESS    BootBaseAddress;\r
   EFI_PHYSICAL_ADDRESS    RuntimeBaseAddress;  \r
-  EFI_GUID                FvGuid;\r
+  EFI_GUID                FvFileSystemGuid;\r
+  EFI_GUID                FvNameGuid;\r
   UINTN                   Size;\r
   EFI_FVB_ATTRIBUTES      FvAttributes;\r
   CHAR8                   FvName[_MAX_PATH];\r