X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BaseTools%2FSource%2FC%2FGenFw%2FGenFw.c;h=7976bec60a4b3c04e01e3521c7a27a60f69b6510;hp=9ffc4c5b0155800e3e0a927c25f2fc93cdad0f51;hb=c6a14de3ef30291918f3b15436cf6a75db413eea;hpb=06b4573598f803d37b4b95c1c8c2ca69fc03ea3a diff --git a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/GenFw.c index 9ffc4c5b01..7976bec60a 100644 --- a/BaseTools/Source/C/GenFw/GenFw.c +++ b/BaseTools/Source/C/GenFw/GenFw.c @@ -1,7 +1,7 @@ /** @file Converts a pe32+ image to an FW, Te image type, or other specific image. -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
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 @@ -92,6 +92,7 @@ CHAR8 *mInImageName; UINT32 mImageTimeStamp = 0; UINT32 mImageSize = 0; UINT32 mOutImageType = FW_DUMMY_IMAGE; +BOOLEAN mIsConvertXip = FALSE; STATIC @@ -168,7 +169,7 @@ Returns: // // Copyright declaration // - fprintf (stdout, "Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.\n\n"); + fprintf (stdout, "Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.\n\n"); // // Details Option @@ -181,6 +182,7 @@ Returns: PEI_CORE, PEIM, DXE_CORE, DXE_DRIVER, UEFI_APPLICATION,\n\ SEC, DXE_SAL_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER,\n\ DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER,\n\ + MM_STANDALONE, MM_CORE_STANDALONE,\n\ PIC_PEIM, RELOCATABLE_PEIM, BS_DRIVER, RT_DRIVER,\n\ APPLICATION, SAL_RT_DRIVER to support all module types\n\ It can only be used together with --keepexceptiontable,\n\ @@ -240,7 +242,7 @@ Returns: If it is combined with other action options, the later\n\ input action option will override the previous one.\n"); fprintf (stdout, " -a NUM, --align NUM NUM is one HEX or DEC format alignment value.\n\ - This option is only used together with -j option.\n"); + This option is only used together with -j option.\n"); fprintf (stdout, " -p NUM, --pad NUM NUM is one HEX or DEC format padding value.\n\ This option is only used together with -j option.\n"); fprintf (stdout, " --keepexceptiontable Don't clear exception table.\n\ @@ -488,7 +490,7 @@ SetHiiResourceHeader ( } // - // Now it ought to be resource Data and update its OffsetToData value + // Now it ought to be resource Data and update its OffsetToData value // if (!ResourceDirectoryEntry->u2.s.DataIsDirectory) { ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (HiiBinData + ResourceDirectoryEntry->u2.OffsetToData); @@ -499,7 +501,7 @@ SetHiiResourceHeader ( } ResourceDirectoryEntry++; } - + return; } @@ -528,7 +530,7 @@ GetPeCoffHeader ( return NULL; } } - + return PeHdr; } @@ -553,7 +555,7 @@ PeCoffConvertImageToXip ( if (PeHdr == NULL) { return; } - + if (PeHdr->Pe32.OptionalHeader.SectionAlignment != PeHdr->Pe32.OptionalHeader.FileAlignment) { // // The only reason to expand zero fill sections is to make them compatible with XIP images. @@ -664,11 +666,13 @@ PeCoffConvertImageToXip ( free (*FileBuffer); *FileLength = XipLength; *FileBuffer = XipFile; + + mIsConvertXip = TRUE; } UINT8 * CreateHiiResouceSectionHeader ( - UINT32 *pSectionHeaderSize, + UINT32 *pSectionHeaderSize, UINT32 HiiDataSize ) /*++ @@ -701,8 +705,8 @@ Returns: // Calculate the total size for the resource header (include Type, Name and Language) // then allocate memory for the resource header. // - HiiSectionHeaderSize = 3 * (sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY)) - + 3 * (sizeof (UINT16) + 3 * sizeof (CHAR16)) + HiiSectionHeaderSize = 3 * (sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY)) + + 3 * (sizeof (UINT16) + 3 * sizeof (CHAR16)) + sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY); HiiSectionHeader = malloc (HiiSectionHeaderSize); if (HiiSectionHeader == NULL) { @@ -713,7 +717,7 @@ Returns: HiiSectionOffset = 0; // - // Create Type entry + // Create Type entry // ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiSectionHeader + HiiSectionOffset); HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY); @@ -873,7 +877,7 @@ Returns: if (ImageContext.RelocationsStripped) { Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName); - return Status; + return Status; } // @@ -886,8 +890,8 @@ Returns: // SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ( (UINTN) ImgHdr + - sizeof (UINT32) + - sizeof (EFI_IMAGE_FILE_HEADER) + + sizeof (UINT32) + + sizeof (EFI_IMAGE_FILE_HEADER) + ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader ); @@ -953,7 +957,7 @@ Returns: if (ImageContext.RelocationsStripped) { Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName); - return Status; + return Status; } // @@ -992,15 +996,15 @@ Returns: // SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ( (UINTN) ImgHdr + - sizeof (UINT32) + - sizeof (EFI_IMAGE_FILE_HEADER) + + sizeof (UINT32) + + sizeof (EFI_IMAGE_FILE_HEADER) + ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader ); for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) { CopyMem ( - FileBuffer + SectionHeader->PointerToRawData, - (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), + FileBuffer + SectionHeader->PointerToRawData, + (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), SectionHeader->SizeOfRawData ); } @@ -2009,7 +2013,9 @@ Returns: stricmp (ModuleType, "DXE_DRIVER") == 0 || stricmp (ModuleType, "DXE_SMM_DRIVER") == 0 || stricmp (ModuleType, "UEFI_DRIVER") == 0 || - stricmp (ModuleType, "SMM_CORE") == 0) { + stricmp (ModuleType, "SMM_CORE") == 0 || + stricmp (ModuleType, "MM_STANDALONE") == 0 || + stricmp (ModuleType, "MM_CORE_STANDALONE") == 0) { Type = EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER; VerboseMsg ("Efi Image subsystem type is efi boot service driver."); @@ -2180,7 +2186,7 @@ Returns: goto Finish; } } - + if (NegativeAddr) { // // Set Base Address to a negative value. @@ -2528,7 +2534,7 @@ Returns: (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress == 0) && \ (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size == 0)) { // - // PeImage can be loaded into memory, but it has no relocation section. + // PeImage can be loaded into memory, but it has no relocation section. // Fix TeImage Header to set VA of relocation data directory to not zero, the size is still zero. // if (Optional32 != NULL) { @@ -2710,7 +2716,7 @@ Finish: } } } - + if (InputFileBuffer != NULL) { free (InputFileBuffer); } @@ -2729,7 +2735,7 @@ Finish: ReportFileName = (CHAR8 *) malloc (FileLen + 1); if (ReportFileName != NULL) { strcpy (ReportFileName, OutImageName); - strcpy (ReportFileName + (FileLen - 4), ".txt"); + strcpy (ReportFileName + (FileLen - 4), ".txt"); ReportFile = fopen (LongFilePath (ReportFileName), "w+"); if (ReportFile != NULL) { fprintf (ReportFile, "MODULE_SIZE = %u\n", (unsigned) mImageSize); @@ -2770,6 +2776,7 @@ Returns: { UINT32 Index; UINT32 DebugDirectoryEntryRva; + UINT32 DebugDirectoryEntrySize; UINT32 DebugDirectoryEntryFileOffset; UINT32 ExportDirectoryEntryRva; UINT32 ExportDirectoryEntryFileOffset; @@ -2781,12 +2788,14 @@ Returns: EFI_IMAGE_OPTIONAL_HEADER64 *Optional64Hdr; EFI_IMAGE_SECTION_HEADER *SectionHeader; EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry; - UINT32 *NewTimeStamp; + EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY *RsdsEntry; + UINT32 *NewTimeStamp; // // Init variable. // DebugDirectoryEntryRva = 0; + DebugDirectoryEntrySize = 0; ExportDirectoryEntryRva = 0; ResourceDirectoryEntryRva = 0; DebugDirectoryEntryFileOffset = 0; @@ -2809,6 +2818,7 @@ Returns: // Resource Directory entry need to review. // Optional32Hdr = (EFI_IMAGE_OPTIONAL_HEADER32 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER)); + Optional64Hdr = (EFI_IMAGE_OPTIONAL_HEADER64 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER)); if (Optional32Hdr->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) { SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) Optional32Hdr + FileHdr->SizeOfOptionalHeader); if (Optional32Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXPORT && \ @@ -2822,13 +2832,13 @@ Returns: if (Optional32Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG && \ Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size != 0) { DebugDirectoryEntryRva = Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress; + DebugDirectoryEntrySize = Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size; if (ZeroDebugFlag) { Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = 0; Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress = 0; } } } else { - Optional64Hdr = (EFI_IMAGE_OPTIONAL_HEADER64 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER)); SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) Optional64Hdr + FileHdr->SizeOfOptionalHeader); if (Optional64Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXPORT && \ Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 0) { @@ -2841,6 +2851,7 @@ Returns: if (Optional64Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG && \ Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size != 0) { DebugDirectoryEntryRva = Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress; + DebugDirectoryEntrySize = Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size; if (ZeroDebugFlag) { Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = 0; Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress = 0; @@ -2886,11 +2897,30 @@ Returns: if (DebugDirectoryEntryFileOffset != 0) { DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) (FileBuffer + DebugDirectoryEntryFileOffset); - DebugEntry->TimeDateStamp = 0; - mImageTimeStamp = 0; - if (ZeroDebugFlag) { - memset (FileBuffer + DebugEntry->FileOffset, 0, DebugEntry->SizeOfData); - memset (DebugEntry, 0, sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY)); + Index = 0; + for (Index=0; Index < DebugDirectoryEntrySize / sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); Index ++, DebugEntry ++) { + DebugEntry->TimeDateStamp = 0; + if (mIsConvertXip) { + DebugEntry->FileOffset = DebugEntry->RVA; + } + if (ZeroDebugFlag || DebugEntry->Type != EFI_IMAGE_DEBUG_TYPE_CODEVIEW) { + memset (FileBuffer + DebugEntry->FileOffset, 0, DebugEntry->SizeOfData); + memset (DebugEntry, 0, sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY)); + } + if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) { + RsdsEntry = (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY *) (FileBuffer + DebugEntry->FileOffset); + if (RsdsEntry->Signature == CODEVIEW_SIGNATURE_MTOC) { + // MTOC sets DebugDirectoryEntrySize to size of the .debug section, so fix it. + if (!ZeroDebugFlag) { + if (Optional32Hdr->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) { + Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); + } else { + Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); + } + } + break; + } + } } } @@ -2938,7 +2968,7 @@ Returns: EFI_IMAGE_OPTIONAL_HEADER64 *Optional64Hdr; EFI_IMAGE_SECTION_HEADER *SectionHeader; UINT32 *NewTimeStamp; - + // // Init variable. // @@ -3158,7 +3188,7 @@ Returns: { CHAR8 Line[MAX_LINE_LEN]; CHAR8 *cptr; - unsigned ScannedData = 0; + int ScannedData = 0; Line[MAX_LINE_LEN - 1] = 0; while (1) {