Fix one bug in GenFv tool when add pad file.
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 3 Apr 2008 02:35:26 +0000 (02:35 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 3 Apr 2008 02:35:26 +0000 (02:35 +0000)
Add the option in GenFw tool not to zero exception table and remove the extra zero pending.

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1112 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenFv/GenFvInternalLib.c
Source/C/GenFw/GenFw.c

index 1634338..420542a 100644 (file)
@@ -610,7 +610,7 @@ Returns:
   //\r
   // Verify that we have enough space (including the padding\r
   //\r
-  if ((UINTN) (PadFile + PadFileSize) >= (UINTN) FvImage->Eof) {\r
+  if (((UINTN)PadFile + PadFileSize) >= (UINTN) FvImage->Eof) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
   //\r
index 8754b3d..e29fcb2 100644 (file)
@@ -207,6 +207,8 @@ Returns:
                         date scope is 1970-1-1 0:0:0 ~ 2038-1-19 3:14:07\n");\r
   fprintf (stdout, "  -m, --mcifile         Convert input microcode txt file to microcode bin file.\n");\r
   fprintf (stdout, "  -j, --join            Combine multi microcode bin files to one file.\n");\r
+  fprintf (stdout, "  --keepexceptiontable  Don't clear exception table.\n");\r
+  fprintf (stdout, "  --keepzeropending     Don't strip zero pending of .reloc.\n");\r
   fprintf (stdout, "  -a NUM, --align NUM   NUM is one HEX or DEC format alignment value.\n");\r
   fprintf (stdout, "  -p NUM, --pad NUM     NUM is one HEX or DEC format padding value.\n");\r
   fprintf (stdout, "  -v, --verbose         Turn on verbose output with informational messages.\n");\r
@@ -1017,6 +1019,8 @@ Returns:
   UNWIND_INFO       *UnwindInfo;\r
   STATUS            Status;\r
   BOOLEAN           ReplaceFlag;\r
+  BOOLEAN           KeepExceptionTableFlag;\r
+  BOOLEAN           KeepZeroPendingFlag;\r
   UINT64            LogLevel;\r
   EFI_TE_IMAGE_HEADER          TEImageHeader;\r
   EFI_TE_IMAGE_HEADER          *TeHdr;\r
@@ -1053,6 +1057,8 @@ Returns:
   CheckSum          = 0;\r
   ReplaceFlag       = FALSE;\r
   LogLevel          = 0;\r
+  KeepExceptionTableFlag = FALSE;\r
+  KeepZeroPendingFlag    = FALSE;\r
 \r
   if (argc == 1) {\r
     Error (NULL, 0, 1001, "Missing options", "No input options.");\r
@@ -1157,6 +1163,20 @@ Returns:
       continue;\r
     }\r
 \r
+    if (stricmp (argv[0], "--keepexceptiontable") == 0) {\r
+      KeepExceptionTableFlag = TRUE;\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
+\r
+    if (stricmp (argv[0], "--keepzeropending") == 0) {\r
+      KeepZeroPendingFlag = TRUE;\r
+      argc --;\r
+      argv ++;\r
+      continue;\r
+    }\r
+\r
     if ((stricmp (argv[0], "-m") == 0) || (stricmp (argv[0], "--mcifile") == 0)) {\r
       OutImageType = FW_MCI_IMAGE;\r
       argc --;\r
@@ -1912,13 +1932,23 @@ Returns:
     //\r
     // Zero .pdata section data.\r
     //\r
-    if (Optional32->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION &&\r
+    if (!KeepExceptionTableFlag && Optional32->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION &&\r
         Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress != 0 && \r
         Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size != 0) {\r
       SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
       for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
         if (SectionHeader->VirtualAddress == Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress) {\r
+          //\r
+          // Zero .pdata Section data\r
+          //\r
           memset (FileBuffer + SectionHeader->PointerToRawData, 0, SectionHeader->SizeOfRawData);\r
+          //\r
+          // Zero .pdata Section header name\r
+          //\r
+          memset (SectionHeader->Name, 0, sizeof (SectionHeader->Name));\r
+          //\r
+          // Zero Execption Table\r
+          //\r
           Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress = 0;\r
           Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size           = 0;\r
           DebugMsg (NULL, 0, 9, "Zero the .pdata section for PE image", NULL);\r
@@ -1930,7 +1960,7 @@ Returns:
     //\r
     // Strip zero padding at the end of the .reloc section \r
     //\r
-    if (Optional32->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
+    if (!KeepZeroPendingFlag && Optional32->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
       if (Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size != 0) {\r
         SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
         for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
@@ -1997,7 +2027,7 @@ Returns:
     // Zero the .pdata section for X64 machine and don't check the Debug Directory is empty\r
     // For Itaninum and X64 Image, remove .pdata section.\r
     //\r
-    if (PeHdr->FileHeader.Machine == IMAGE_FILE_MACHINE_X64 || PeHdr->FileHeader.Machine == IMAGE_FILE_MACHINE_IA64) {\r
+    if (!KeepExceptionTableFlag && PeHdr->FileHeader.Machine == IMAGE_FILE_MACHINE_X64 || PeHdr->FileHeader.Machine == IMAGE_FILE_MACHINE_IA64) {\r
       if (Optional64->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION &&\r
           Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress != 0 && \r
           Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size != 0) {\r
@@ -2005,6 +2035,11 @@ Returns:
         SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
         for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
           if (SectionHeader->VirtualAddress == Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress) {\r
+            //\r
+            // Zero .pdata Section header name\r
+            //\r
+            memset (SectionHeader->Name, 0, sizeof (SectionHeader->Name));\r
+\r
             RuntimeFunction = (RUNTIME_FUNCTION *)(FileBuffer + SectionHeader->PointerToRawData);\r
             for (Index1 = 0; Index1 < Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size / sizeof (RUNTIME_FUNCTION); Index1++, RuntimeFunction++) {\r
               SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
@@ -2019,6 +2054,9 @@ Returns:
               }\r
               memset (RuntimeFunction, 0, sizeof (RUNTIME_FUNCTION));\r
             }\r
+            //\r
+            // Zero Execption Table\r
+            //\r
             Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size = 0;\r
             Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress = 0;\r
             DebugMsg (NULL, 0, 9, "Zero the .pdata section if the machine type is X64 for PE32+ image", NULL);\r
@@ -2031,7 +2069,7 @@ Returns:
     //\r
     // Strip zero padding at the end of the .reloc section \r
     //\r
-    if (Optional64->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
+    if (!KeepZeroPendingFlag && Optional64->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
       if (Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size != 0) {\r
         SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
         for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {\r