Update Fv tool to support FvMap feature.
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 3 Aug 2007 03:49:24 +0000 (03:49 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 3 Aug 2007 03:49:24 +0000 (03:49 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@497 7335b38e-4728-0410-8992-fb3ffe349368

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

index a19ba87..f07c86a 100644 (file)
@@ -233,11 +233,6 @@ Returns:
     Error (NULL, 0, 0, NULL, "%s is invaild paramter!", argv[0]);\r
     return STATUS_ERROR;\r
   }\r
-  \r
-  if (OutFileName == NULL) {\r
-    Error (NULL, 0, 0, NULL, "No output file name is specified.");\r
-    goto Finish;\r
-  }\r
 \r
   //\r
   // Read the INF file image\r
@@ -275,6 +270,15 @@ Returns:
       goto Finish;\r
     }\r
     \r
+    if (OutFileName == NULL && CapInfo.CapName[0] != '\0') {\r
+      OutFileName = CapInfo.CapName;\r
+    }\r
+    \r
+    if (OutFileName == NULL) {\r
+      Error (NULL, 0, 0, NULL, "Output file name is not specified.");\r
+      goto Finish;\r
+    }\r
+        \r
     //\r
     // Calculate the size of capsule image.\r
     //\r
@@ -469,6 +473,17 @@ Returns:
     }\r
   }\r
 \r
+  //\r
+  // Read Capsule File name\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FILE_NAME_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    //\r
+    // Get output file name\r
+    //\r
+    strcpy (CapInfo->CapName, Value); \r
+  }\r
+\r
   //\r
   // Read the Capsule FileImage\r
   //\r
index f137414..75497d5 100644 (file)
@@ -66,7 +66,8 @@ FfsRebase (
   IN OUT  FV_INFO               *FvInfo, \r
   IN      CHAR8                 *FileName,           \r
   IN OUT  EFI_FFS_FILE_HEADER   *FfsFile,\r
-  IN      UINTN                 XipOffset\r
+  IN      UINTN                 XipOffset,\r
+  IN      FILE                  *FvMapFile\r
   );\r
 /*++\r
 \r
@@ -81,6 +82,7 @@ Arguments:
   FileName          Ffs file Name\r
   FfsFile           A pointer to Ffs file image.\r
   XipOffset         The offset address to use for rebasing the XIP file image.\r
+  FvMapFile         File pointer to FvMap file\r
 \r
 Returns:\r
 \r
@@ -259,6 +261,40 @@ Returns:
     FvInfo->BaseAddress = Value64;\r
   }\r
 \r
+  //\r
+  // Read the FV boot driver base address\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    //\r
+    // Get the base address\r
+    //\r
+    Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
+    if (EFI_ERROR (Status)) {\r
+      Error (NULL, 0, 0, EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING, "invalid value");\r
+      return EFI_ABORTED;\r
+    }\r
+\r
+    FvInfo->BootBaseAddress = Value64;\r
+  }\r
+\r
+  //\r
+  // Read the FV runtime driver base address\r
+  //\r
+  Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, 0, Value);\r
+  if (Status == EFI_SUCCESS) {\r
+    //\r
+    // Get the base address\r
+    //\r
+    Status = AsciiStringToUint64 (Value, FALSE, &Value64);\r
+    if (EFI_ERROR (Status)) {\r
+      Error (NULL, 0, 0, EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING, "invalid value");\r
+      return EFI_ABORTED;\r
+    }\r
+\r
+    FvInfo->RuntimeBaseAddress = Value64;\r
+  }\r
+\r
   //\r
   // Read the FV Guid\r
   //\r
@@ -700,7 +736,8 @@ AddFile (
   IN OUT MEMORY_FILE          *FvImage,\r
   IN FV_INFO                  *FvInfo,\r
   IN UINTN                    Index,\r
-  IN OUT EFI_FFS_FILE_HEADER  **VtfFileImage  \r
+  IN OUT EFI_FFS_FILE_HEADER  **VtfFileImage,\r
+  IN FILE                     *FvMapFile  \r
   )\r
 /*++\r
 \r
@@ -717,6 +754,7 @@ Arguments:
   Index         The file in the FvInfo file list to add.\r
   VtfFileImage  A pointer to the VTF file within the FvImage.  If this is equal\r
                 to the end of the FvImage then no VTF previously found.\r
+  FvMapFile     Pointer to FvMap File\r
 \r
 Returns:\r
 \r
@@ -843,7 +881,7 @@ Returns:
       // Rebase the PE or TE image in FileBuffer of FFS file for XIP \r
       // Rebase for the debug genfvmap tool\r
       //\r
-      FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER *) FileBuffer, (UINTN) *VtfFileImage - (UINTN) FvImage->FileImage);\r
+      FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER *) FileBuffer, (UINTN) *VtfFileImage - (UINTN) FvImage->FileImage, FvMapFile);\r
       //\r
       // copy VTF File\r
       //\r
@@ -877,7 +915,7 @@ Returns:
     // Rebase the PE or TE image in FileBuffer of FFS file for XIP. \r
     // Rebase Bs and Rt drivers for the debug genfvmap tool.\r
     //\r
-    FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER *) FileBuffer, (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage);\r
+    FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER *) FileBuffer, (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage, FvMapFile);\r
     //\r
     // Copy the file\r
     //\r
@@ -1450,9 +1488,12 @@ Returns:
   UINT8                       *FvImage;\r
   UINTN                       FvImageSize;\r
   FILE                        *FvFile;\r
+  CHAR8                       FvMapName [_MAX_PATH];\r
+  FILE                        *FvMapFile;\r
 \r
   FvBufferHeader = NULL;\r
   FvFile         = NULL;\r
+  FvMapFile      = NULL;\r
   //\r
   // Check for invalid parameter\r
   //\r
@@ -1482,6 +1523,22 @@ Returns:
   if (FvFileName == NULL && FvInfo.FvName[0] != '\0') {\r
     FvFileName = FvInfo.FvName;\r
   }\r
+\r
+  if (FvFileName == NULL) {\r
+    Error (NULL, 0, 0, NULL, "Output file name is not specified.");\r
+    return EFI_ABORTED;\r
+  }\r
+  \r
+  //\r
+  // FvMap file to record the function address of all modules in one Fvimage\r
+  //\r
+  strcpy (FvMapName, FvFileName);\r
+  strcat (FvMapName, ".map");\r
+  FvMapFile = fopen (FvMapName, "w");\r
+  if (FvMapFile == NULL) {\r
+    Error (NULL, 0, 0, FvMapName, "Can't open to be written.");\r
+    return EFI_ABORTED;\r
+  }\r
   \r
   //\r
   // Update FvImage Base Address, XipBase not same to BtBase, RtBase address.\r
@@ -1596,7 +1653,7 @@ Returns:
     //\r
     // Add the file\r
     //\r
-    Status = AddFile (&FvImageMemoryFile, &FvInfo, Index, &VtfFileImage);\r
+    Status = AddFile (&FvImageMemoryFile, &FvInfo, Index, &VtfFileImage, FvMapFile);\r
 \r
     //\r
     // Exit if error detected while adding the file\r
@@ -1652,12 +1709,7 @@ WriteFile:
   //\r
   // Write fv file\r
   //\r
-  if (FvFileName == NULL) {\r
-    FvFile = stdout;\r
-  } else {\r
-    FvFile = fopen (FvFileName, "wb");\r
-  }\r
-\r
+  FvFile = fopen (FvFileName, "wb");\r
   if (FvFile == NULL) {\r
     Error (NULL, 0, 0, FvFileName, "could not open output file");\r
     Status = EFI_ABORTED;\r
@@ -1678,6 +1730,10 @@ Finish:
   if (FvFile != NULL) {\r
     fclose (FvFile);\r
   }\r
+  \r
+  if (FvMapFile != NULL) {\r
+    fclose (FvMapFile);\r
+  }\r
 \r
   return Status;\r
 }\r
@@ -1915,7 +1971,8 @@ FfsRebase (
   IN OUT  FV_INFO               *FvInfo, \r
   IN      CHAR8                 *FileName,           \r
   IN OUT  EFI_FFS_FILE_HEADER   *FfsFile,\r
-  IN      UINTN                 XipOffset\r
+  IN      UINTN                 XipOffset,\r
+  IN      FILE                  *FvMapFile\r
   )\r
 /*++\r
 \r
@@ -1927,8 +1984,10 @@ Routine Description:
 Arguments:\r
   \r
   FvInfo            A pointer to FV_INFO struture.\r
+  FileName          Ffs File PathName\r
   FfsFile           A pointer to Ffs file image.\r
   XipOffset         The offset address to use for rebasing the XIP file image.\r
+  FvMapFile         FvMapFile to record the function address in one Fvimage\r
 \r
 Returns:\r
 \r
@@ -2206,6 +2265,11 @@ Returns:
 \r
       FfsFile->State = SavedState;\r
     }\r
+\r
+    //\r
+    // Get this module function address from ModulePeMapFile and add them into FvMap file\r
+    //\r
+    WriteMapFile (FvMapFile, FileName, ImageContext.DestinationAddress, PeHdr->OptionalHeader.AddressOfEntryPoint);\r
   }\r
 \r
   if ((Flags & 1) == 0 || (\r
@@ -2283,6 +2347,10 @@ Returns:
 \r
       FfsFile->State = SavedState;\r
     }\r
+    //\r
+    // Get this module function address from ModulePeMapFile and add them into FvMap file\r
+    //\r
+    WriteMapFile (FvMapFile, FileName, ImageContext.DestinationAddress, TEImageHeader->AddressOfEntryPoint);  \r
   }\r
  \r
   return EFI_SUCCESS;\r
@@ -2347,6 +2415,159 @@ FindApResetVectorPosition (
   \r
   return EFI_NOT_FOUND;\r
 }\r
+\r
+EFI_STATUS\r
+WriteMapFile (\r
+  IN OUT FILE                  *FvMapFile,\r
+  IN     CHAR8                 *FileName, \r
+  IN     EFI_PHYSICAL_ADDRESS  ImageBaseAddress,\r
+  IN     UINT32                AddressOfEntryPoint\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function abstracts Pe Map file information and add them into FvMap file for Debug.\r
+\r
+Arguments:\r
+\r
+  FvMapFile             A pointer to FvMap File\r
+  FileName              Ffs File PathName\r
+  ImageBaseAddress      PeImage Base Address.\r
+  AddressOfEntryPoint   EntryPoint address relative to PeBase Address\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           Added required map information.\r
+\r
+--*/\r
+{\r
+  CHAR8           PeMapFileName [_MAX_PATH];\r
+  CHAR8           *Cptr;\r
+  CHAR8           *FileGuidName;\r
+  EFI_GUID        FileGuidValue;\r
+  FILE            *PeMapFile;\r
+  CHAR8           Line [MAX_LINE_LEN];\r
+  CHAR8           KeyWord [MAX_LINE_LEN];\r
+  CHAR8                 FunctionName [MAX_LINE_LEN];\r
+  EFI_PHYSICAL_ADDRESS  FunctionAddress;\r
+  UINT32                FunctionType;\r
+  CHAR8                 FunctionTypeName [MAX_LINE_LEN];\r
+\r
+  //\r
+  // Construct Map file Name \r
+  //\r
+  strcpy (PeMapFileName, FileName);\r
+  Cptr = PeMapFileName + strlen (PeMapFileName);\r
+  while (*Cptr != '.') {\r
+    Cptr --;\r
+  }\r
+  if (*Cptr != '.') {\r
+    return EFI_NOT_FOUND;\r
+  } else {\r
+    *(Cptr + 1) = 'm';\r
+    *(Cptr + 2) = 'a';\r
+    *(Cptr + 3) = 'p';\r
+    *(Cptr + 4) = '\0';\r
+  }\r
+  //\r
+  // Open PeMapFile\r
+  //\r
+  PeMapFile = fopen (PeMapFileName, "r");\r
+  if (PeMapFile == NULL) {\r
+    // fprintf (stdout, "can't open %s file to reading\n", PeMapFileName);\r
+    return EFI_ABORTED;\r
+  }\r
+  //\r
+  // Get Module Guid from FileName\r
+  //\r
+  *Cptr = '\0';\r
+  while ((*Cptr != FILE_SEP_CHAR) && (Cptr >= PeMapFileName)) {\r
+    Cptr --;\r
+  }\r
+  if (*Cptr == FILE_SEP_CHAR) {\r
+    FileGuidName = Cptr + 1;\r
+    if (StringToGuid (FileGuidName, &FileGuidValue) != EFI_SUCCESS) {\r
+      FileGuidName = NULL;\r
+    }\r
+  }\r
+  //\r
+  // Output Functions information into Fv Map file\r
+  //\r
+  fgets (Line, MAX_LINE_LEN, PeMapFile);\r
+  sscanf (Line, "%s", KeyWord);\r
+  //\r
+  // module information output\r
+  //\r
+  if (FileGuidName != NULL) {\r
+    fprintf (FvMapFile, "%s (", KeyWord);\r
+    fprintf (FvMapFile, "BaseAddress=%08lx, ", ImageBaseAddress);\r
+    fprintf (FvMapFile, "EntryPoint=%08lx, ", ImageBaseAddress + AddressOfEntryPoint);\r
+    fprintf (FvMapFile, "GUID=%s)\n\n", FileGuidName);\r
+  } else {\r
+    fprintf (FvMapFile, "%s (", KeyWord);\r
+    fprintf (FvMapFile, "BaseAddress=%08lx, ", ImageBaseAddress);\r
+    fprintf (FvMapFile, "EntryPoint=%08lx)", ImageBaseAddress + AddressOfEntryPoint);\r
+  }\r
+\r
+  while (fgets (Line, MAX_LINE_LEN, PeMapFile) != NULL) {\r
+    //\r
+    // Skip blank line\r
+    //\r
+    if (Line[0] == 0x0a) {\r
+      FunctionType = 0;\r
+      continue;\r
+    }\r
+    //\r
+    // By Address and Static keyword\r
+    //  \r
+    if (FunctionType == 0) {\r
+      sscanf (Line, "%s", KeyWord);\r
+      if (stricmp (KeyWord, "Address") == 0) {\r
+        //\r
+        // function list\r
+        //\r
+        FunctionType = 1;\r
+        fgets (Line, MAX_LINE_LEN, PeMapFile);\r
+        continue;\r
+      } else if (stricmp (KeyWord, "Static") == 0) {\r
+        //\r
+        // static function list\r
+        //\r
+        FunctionType = 2;\r
+        fgets (Line, MAX_LINE_LEN, PeMapFile);\r
+        continue;\r
+      }\r
+    }\r
+    //\r
+    // Printf Function Information\r
+    //\r
+    if (FunctionType == 1) {\r
+      sscanf (Line, "%s %s %lx %s", KeyWord, FunctionName, &FunctionAddress, FunctionTypeName);\r
+      if (FunctionTypeName [1] == '\0' && (FunctionTypeName [0] == 'f' || FunctionTypeName [0] == 'F')) {\r
+        fprintf (FvMapFile, "  %016lx F  ", ImageBaseAddress + FunctionAddress);\r
+        fprintf (FvMapFile, "%s\n", FunctionName);\r
+    } else {\r
+        fprintf (FvMapFile, "  %016lx    ", ImageBaseAddress + FunctionAddress);\r
+        fprintf (FvMapFile, "%s\n", FunctionName);\r
+      }\r
+    } else if (FunctionType == 2) {\r
+      sscanf (Line, "%s %s %lx %s", KeyWord, FunctionName, &FunctionAddress, FunctionTypeName);\r
+      if (FunctionTypeName [1] == '\0' && (FunctionTypeName [0] == 'f' || FunctionTypeName [0] == 'F')) {\r
+        fprintf (FvMapFile, "  %016lx FS ", ImageBaseAddress + FunctionAddress);\r
+        fprintf (FvMapFile, "%s\n", FunctionName);\r
+      } else {\r
+        fprintf (FvMapFile, "  %016lx    ", ImageBaseAddress + FunctionAddress);\r
+        fprintf (FvMapFile, "%s\n", FunctionName);\r
+      }\r
+    }\r
+  }\r
+  //\r
+  // Close PeMap file\r
+  //\r
+  fprintf (FvMapFile, "\n\n");\r
+  fclose (PeMapFile);\r
   \r
-  \r
+  return EFI_SUCCESS;\r
+}\r
   
\ No newline at end of file
index a74de6f..1256697 100644 (file)
@@ -58,6 +58,11 @@ Abstract:
 #define FILE_SEP_STRING "\\"\r
 #endif\r
 \r
+//\r
+// the maximum number of char in one line \r
+//\r
+#define MAX_LINE_LEN                    0x200\r
+\r
 //\r
 // The maximum number of block map entries supported by the library\r
 //\r
@@ -89,6 +94,8 @@ Abstract:
 #define EFI_CAPSULE_HEADER_SIZE_STRING    "EFI_CAPSULE_HEADER_SIZE"\r
 #define EFI_CAPSULE_FLAGS_STRING          "EFI_CAPSULE_FLAGS"\r
 #define EFI_CAPSULE_VERSION_STRING        "EFI_CAPSULE_VERSION"\r
+#define EFI_FV_BOOT_DRIVER_BASE_ADDRESS_STRING    "EFI_BOOT_DRIVER_BASE_ADDRESS"\r
+#define EFI_FV_RUNTIME_DRIVER_BASE_ADDRESS_STRING "EFI_RUNTIME_DRIVER_BASE_ADDRESS"\r
 \r
 //\r
 // Attributes section\r
@@ -231,6 +238,7 @@ typedef struct {
   UINT32                  HeaderSize;\r
   UINT32                  Flags;\r
   UINT32                  Version;\r
+  CHAR8                   CapName[_MAX_PATH];\r
   CHAR8                   CapFiles[MAX_NUMBER_OF_FILES_IN_CAP][_MAX_PATH];\r
 } CAP_INFO;\r
 \r