Sync tool code to BuildTools project r1783.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9623 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
lgao4
2009-12-29 06:16:53 +00:00
parent 4661d5df04
commit a709adfaf0
88 changed files with 2038 additions and 732 deletions

View File

@@ -77,6 +77,7 @@ Abstract:
#define FW_MERGE_IMAGE 8
#define FW_RELOC_STRIPEED_IMAGE 9
#define FW_HII_PACKAGE_LIST_RCIMAGE 10
#define FW_HII_PACKAGE_LIST_BINIMAGE 11
#define DUMP_TE_HEADER 0x11
@@ -198,10 +199,10 @@ Returns:
fprintf (stdout, " -o FileName, --outputfile FileName\n\
File will be created to store the ouput content.\n");
fprintf (stdout, " -e EFI_FILETYPE, --efiImage EFI_FILETYPE\n\
Create Efi Image. EFI_FILETYPE is one of BASE, SEC,\n\
Create Efi Image. EFI_FILETYPE is one of BASE,SMM_CORE,\n\
PEI_CORE, PEIM, DXE_CORE, DXE_DRIVER, UEFI_APPLICATION,\n\
DXE_SAL_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER, \n\
DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER, \n\
SEC, DXE_SAL_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER,\n\
DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER,\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\
@@ -235,7 +236,7 @@ Returns:
except for -o, -r option. It is a action option.\n\
If it is combined with other action options, the later\n\
input action option will override the previous one.\n");;
fprintf (stdout, " -l, --stripped Relocation info stripped from the input PE or TE image.\n\
fprintf (stdout, " -l, --stripped Strip off the relocation info from PE or TE image.\n\
It can't be combined with other action options\n\
except for -o, -r option. It is a action option.\n\
If it is combined with other action options, the later\n\
@@ -272,7 +273,7 @@ Returns:
If more input files are specified,\n\
the last input file will be as the output file.\n");
fprintf (stdout, " -g HiiPackageListGuid, --hiiguid HiiPackageListGuid\n\
HiiListPackageGuidGuid is from the module guid.\n\
Guid is used to specify hii package list guid.\n\
Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n\
If not specified, the first Form FormSet guid is used.\n");
fprintf (stdout, " --hiipackage Combine all input binary hii pacakges into \n\
@@ -281,6 +282,12 @@ Returns:
except for -o option. It is a action option.\n\
If it is combined with other action options, the later\n\
input action option will override the previous one.\n");
fprintf (stdout, " --hiibinpackage Combine all input binary hii pacakges into \n\
a single package list as the binary resource section.\n\
It can't be combined with other action options\n\
except for -o option. It is a action option.\n\
If it is combined with other action options, the later\n\
input action option will override the previous one.\n");
fprintf (stdout, " -v, --verbose Turn on verbose output with informational messages.\n");
fprintf (stdout, " -q, --quiet Disable all messages except key message and fatal error\n");
fprintf (stdout, " -d, --debug level Enable debug messages, at input debug level.\n");
@@ -501,12 +508,6 @@ UINT32 DataOffset;
UINT32 HiiRsrcOffset;
UINT32 RelocOffset;
//
// HiiBinData
//
UINT8* HiiBinData = NULL;
UINT32 HiiBinSize = 0;
EFI_IMAGE_BASE_RELOCATION *CoffBaseRel;
UINT16 *CoffEntryRel;
@@ -628,122 +629,60 @@ CreateSectionHeader(
}
VOID
GetBinaryHiiData (
CHAR8 *RcString,
UINT32 Size,
SetHiiResourceHeader (
UINT8 *HiiBinData,
UINT32 OffsetToFile
)
{
unsigned Data16;
UINT32 HiiBinOffset;
UINT32 Index;
EFI_IMAGE_RESOURCE_DIRECTORY *ResourceDirectory;
EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *ResourceDirectoryEntry;
EFI_IMAGE_RESOURCE_DIRECTORY_STRING *ResourceDirectoryString;
EFI_IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry;
Index = 0;
while (Index < Size && *RcString != '\0' && *RcString != '{') {
RcString ++;
Index ++;
}
if (*RcString == '\0' || Index == Size) {
return;
}
//
// Skip '{' character
// Skip space and ',' character
//
RcString ++;
Index ++;
while (Index < Size && *RcString != '\0' && (isspace (*RcString) || *RcString == ',')){
RcString ++;
Index ++;
}
//
// '}' end character
//
if (*RcString == '}' || Index == Size) {
return;
}
HiiBinOffset = 0;
HiiBinSize = 0x1000;
HiiBinData = (UINT8 *) malloc (HiiBinSize);
if (HiiBinData == NULL) {
return;
}
memset (HiiBinData, 0, HiiBinSize);
//
// Fill Resource section entry
//
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiBinData + HiiBinOffset);
HiiBinOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY);
ResourceDirectory->NumberOfNamedEntries = 1;
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiBinData);
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);
for (Index = 0; Index < ResourceDirectory->NumberOfNamedEntries; Index ++) {
if (ResourceDirectoryEntry->u1.s.NameIsString) {
ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (HiiBinData + ResourceDirectoryEntry->u1.s.NameOffset);
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (HiiBinData + HiiBinOffset);
HiiBinOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY);
ResourceDirectoryEntry->u1.s.NameIsString = 1;
ResourceDirectoryEntry->u1.s.NameOffset = HiiBinOffset;
if (ResourceDirectoryString->Length == 3 &&
ResourceDirectoryString->String[0] == L'H' &&
ResourceDirectoryString->String[1] == L'I' &&
ResourceDirectoryString->String[2] == L'I') {
//
// Resource Type "HII" found
//
if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {
//
// Move to next level - resource Name
//
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiBinData + ResourceDirectoryEntry->u2.s.OffsetToDirectory);
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);
ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (HiiBinData + HiiBinOffset);
ResourceDirectoryString->Length = 3;
ResourceDirectoryString->String[0] =L'H';
ResourceDirectoryString->String[1] =L'I';
ResourceDirectoryString->String[2] =L'I';
HiiBinOffset = HiiBinOffset + sizeof (ResourceDirectoryString->Length) + ResourceDirectoryString->Length * sizeof (ResourceDirectoryString->String[0]);
if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {
//
// Move to next level - resource Language
//
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiBinData + ResourceDirectoryEntry->u2.s.OffsetToDirectory);
ResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (ResourceDirectory + 1);
}
}
ResourceDirectoryEntry->u2.OffsetToData = HiiBinOffset;
ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (HiiBinData + HiiBinOffset);
HiiBinOffset += sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY);
ResourceDataEntry->OffsetToData = OffsetToFile + HiiBinOffset;
while (sscanf (RcString, "0x%X", &Data16) != EOF) {
//
// Convert the string data to the binary data.
//
*(UINT16 *)(HiiBinData + HiiBinOffset) = (UINT16) Data16;
HiiBinOffset += 2;
//
// Jump to the next data.
//
RcString = RcString + 2 + 4;
Index = Index + 2 + 4;
//
// Skip space and ',' character
//
while (Index < Size && *RcString != '\0' && (isspace (*RcString) || *RcString == ',')){
RcString ++;
Index ++;
}
//
// '}' end character
//
if (*RcString == '}'|| Index == Size) {
break;
}
//
// Check BinBuffer size
//
if (HiiBinOffset >= HiiBinSize) {
HiiBinSize += 0x1000;
HiiBinData = (UINT8 *) realloc (HiiBinData, HiiBinSize);
//
// Memory allocation is failure.
//
if (HiiBinData == NULL) {
HiiBinSize = 0;
break;
//
// 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);
ResourceDataEntry->OffsetToData = ResourceDataEntry->OffsetToData + OffsetToFile;
break;
}
}
}
}
if (HiiBinData != NULL) {
HiiBinSize = HiiBinOffset;
ResourceDataEntry->Size = HiiBinSize + OffsetToFile - ResourceDataEntry->OffsetToData;
ResourceDirectoryEntry++;
}
return;
@@ -867,10 +806,11 @@ ScanSections(
Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment.");
}
}
GetBinaryHiiData ((CHAR8*)Ehdr + shdr->sh_offset, shdr->sh_size, HiiRsrcOffset);
if (HiiBinSize != 0) {
CoffOffset += HiiBinSize;
if (shdr->sh_size != 0) {
CoffSectionsOffset[i] = CoffOffset;
CoffOffset += shdr->sh_size;
CoffOffset = CoffAlign(CoffOffset);
SetHiiResourceHeader ((UINT8*) Ehdr + shdr->sh_offset, HiiRsrcOffset);
}
break;
}
@@ -972,13 +912,8 @@ ScanSections(
EFI_IMAGE_SCN_CNT_INITIALIZED_DATA
| EFI_IMAGE_SCN_MEM_READ);
NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = HiiBinSize;
NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = RelocOffset - HiiRsrcOffset;
NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = HiiRsrcOffset;
memcpy(CoffFile + HiiRsrcOffset, HiiBinData, HiiBinSize);
free (HiiBinData);
HiiBinData = NULL;
HiiBinSize = 0;
} else {
// Don't make a section of size 0.
NtHdr->Pe32.FileHeader.NumberOfSections--;
@@ -1398,6 +1333,7 @@ ConvertElf (
//
WriteSections(IsTextShdr);
WriteSections(IsDataShdr);
WriteSections(IsHiiRsrcShdr);
VerboseMsg ("Write and relocate sections.");
//
@@ -1430,6 +1366,279 @@ ConvertElf (
}
}
EFI_IMAGE_OPTIONAL_HEADER_UNION *
GetPeCoffHeader (
void *Data
)
{
EFI_IMAGE_DOS_HEADER *DosHdr;
EFI_IMAGE_OPTIONAL_HEADER_UNION *PeHdr;
//
// Read the dos & pe hdrs of the image
//
DosHdr = (EFI_IMAGE_DOS_HEADER *)Data;
if (DosHdr->e_magic != EFI_IMAGE_DOS_SIGNATURE) {
// NO DOS header, check for PE/COFF header
PeHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(Data);
if (PeHdr->Pe32.Signature != EFI_IMAGE_NT_SIGNATURE) {
return NULL;
}
} else {
PeHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(((UINT8 *)Data) + DosHdr->e_lfanew);
if (PeHdr->Pe32.Signature != EFI_IMAGE_NT_SIGNATURE) {
return NULL;
}
}
return PeHdr;
}
void
PeCoffConvertImageToXip (
UINT8 **FileBuffer,
UINT32 *FileLength
)
{
EFI_IMAGE_OPTIONAL_HEADER_UNION *PeHdr;
EFI_IMAGE_OPTIONAL_HEADER_UNION *NewPeHdr;
EFI_IMAGE_SECTION_HEADER *SectionHeader;
UINTN TotalNecessaryFileSize;
UINTN SectionSize;
UINT8 *XipFile;
UINT32 XipLength;
UINTN Index;
UINTN FirstSectionOffset;
BOOLEAN ConversionNeeded;
PeHdr = GetPeCoffHeader ((void *) *FileBuffer);
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.
// If SectionAlignment is not equal to FileAlginment then it is not an XIP type image.
//
return;
}
//
// Calculate size of XIP file, and determine if the conversion is needed.
//
ConversionNeeded = FALSE;
XipLength = 0;
FirstSectionOffset = *FileLength;
TotalNecessaryFileSize = 0;
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);
for (Index = 0; Index < PeHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {
SectionSize = MAX (SectionHeader->Misc.VirtualSize, SectionHeader->SizeOfRawData);
TotalNecessaryFileSize += SectionSize;
if (SectionSize > 0) {
FirstSectionOffset = MIN (FirstSectionOffset, SectionHeader->VirtualAddress);
XipLength = MAX (XipLength, SectionHeader->VirtualAddress + SectionSize);
if (SectionHeader->VirtualAddress != SectionHeader->PointerToRawData) {
ConversionNeeded = TRUE;
}
}
if (SectionHeader->Misc.VirtualSize > SectionHeader->SizeOfRawData) {
ConversionNeeded = TRUE;
}
}
if (FirstSectionOffset < PeHdr->Pe32.OptionalHeader.SizeOfHeaders) {
//
// If one of the sections should be loaded to an offset overlapping with
// the executable header, then it cannot be made into an XIP image.
//
VerboseMsg ("PE/COFF conversion to XIP is impossible due to overlap");
VerboseMsg ("of section data with the executable header.");
return;
}
if (FirstSectionOffset == *FileLength) {
//
// If we never found a section with a non-zero size, then we
// skip the conversion.
//
return;
}
TotalNecessaryFileSize += FirstSectionOffset;
if (!ConversionNeeded) {
return;
}
if (XipLength > (2 * TotalNecessaryFileSize)) {
VerboseMsg ("PE/COFF conversion to XIP appears to be larger than necessary.");
VerboseMsg ("The image linking process may have left unused memory ranges.");
}
if (PeHdr->Pe32.FileHeader.PointerToSymbolTable != 0) {
//
// This field is obsolete and should be zero
//
PeHdr->Pe32.FileHeader.PointerToSymbolTable = 0;
}
//
// Allocate the extra space that we need to grow the image
//
XipFile = malloc (XipLength);
memset (XipFile, 0, XipLength);
//
// Copy the file headers
//
memcpy (XipFile, *FileBuffer, PeHdr->Pe32.OptionalHeader.SizeOfHeaders);
NewPeHdr = GetPeCoffHeader ((void *)XipFile);
if (NewPeHdr == NULL) {
free (XipFile);
return;
}
//
// Copy the section data over to the appropriate XIP offsets
//
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(NewPeHdr->Pe32.OptionalHeader) + NewPeHdr->Pe32.FileHeader.SizeOfOptionalHeader);
for (Index = 0; Index < PeHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {
if (SectionHeader->SizeOfRawData > 0) {
memcpy (
XipFile + SectionHeader->VirtualAddress,
*FileBuffer + SectionHeader->PointerToRawData,
SectionHeader->SizeOfRawData
);
}
SectionHeader->SizeOfRawData = SectionHeader->Misc.VirtualSize;
SectionHeader->PointerToRawData = SectionHeader->VirtualAddress;
}
free (*FileBuffer);
*FileLength = XipLength;
*FileBuffer = XipFile;
}
UINT8 *
CreateHiiResouceSectionHeader (
UINT32 *pSectionHeaderSize,
UINT32 HiiDataSize
)
/*++
Routine Description:
Create COFF resource section header
Arguments:
pSectionHeaderSize - Pointer to section header size.
HiiDataSize - Size of the total HII data in section.
Returns:
The created section header buffer.
--*/
{
UINT32 HiiSectionHeaderSize;
UINT32 HiiSectionOffset;
UINT8 *HiiSectionHeader;
EFI_IMAGE_RESOURCE_DIRECTORY *ResourceDirectory;
EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *TypeResourceDirectoryEntry;
EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *NameResourceDirectoryEntry;
EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *LanguageResourceDirectoryEntry;
EFI_IMAGE_RESOURCE_DIRECTORY_STRING *ResourceDirectoryString;
EFI_IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry;
//
// 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))
+ sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY);
HiiSectionHeader = malloc (HiiSectionHeaderSize);
memset (HiiSectionHeader, 0, HiiSectionHeaderSize);
HiiSectionOffset = 0;
//
// Create Type entry
//
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiSectionHeader + HiiSectionOffset);
HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY);
ResourceDirectory->NumberOfNamedEntries = 1;
TypeResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (HiiSectionHeader + HiiSectionOffset);
HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY);
TypeResourceDirectoryEntry->u1.s.NameIsString = 1;
TypeResourceDirectoryEntry->u2.s.DataIsDirectory = 1;
TypeResourceDirectoryEntry->u2.s.OffsetToDirectory = HiiSectionOffset;
//
// Create Name entry
//
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiSectionHeader + HiiSectionOffset);
HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY);
ResourceDirectory->NumberOfNamedEntries = 1;
NameResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (HiiSectionHeader + HiiSectionOffset);
HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY);
NameResourceDirectoryEntry->u1.s.NameIsString = 1;
NameResourceDirectoryEntry->u2.s.DataIsDirectory = 1;
NameResourceDirectoryEntry->u2.s.OffsetToDirectory = HiiSectionOffset;
//
// Create Language entry
//
ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiSectionHeader + HiiSectionOffset);
HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY);
ResourceDirectory->NumberOfNamedEntries = 1;
LanguageResourceDirectoryEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *) (HiiSectionHeader + HiiSectionOffset);
HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY);
LanguageResourceDirectoryEntry->u1.s.NameIsString = 1;
//
// Create string entry for Type
//
TypeResourceDirectoryEntry->u1.s.NameOffset = HiiSectionOffset;
ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (HiiSectionHeader + HiiSectionOffset);
ResourceDirectoryString->Length = 3;
ResourceDirectoryString->String[0] = L'H';
ResourceDirectoryString->String[1] = L'I';
ResourceDirectoryString->String[2] = L'I';
HiiSectionOffset = HiiSectionOffset + sizeof (ResourceDirectoryString->Length) + ResourceDirectoryString->Length * sizeof (ResourceDirectoryString->String[0]);
//
// Create string entry for Name
//
NameResourceDirectoryEntry->u1.s.NameOffset = HiiSectionOffset;
ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (HiiSectionHeader + HiiSectionOffset);
ResourceDirectoryString->Length = 3;
ResourceDirectoryString->String[0] = L'E';
ResourceDirectoryString->String[1] = L'F';
ResourceDirectoryString->String[2] = L'I';
HiiSectionOffset = HiiSectionOffset + sizeof (ResourceDirectoryString->Length) + ResourceDirectoryString->Length * sizeof (ResourceDirectoryString->String[0]);
//
// Create string entry for Language
//
LanguageResourceDirectoryEntry->u1.s.NameOffset = HiiSectionOffset;
ResourceDirectoryString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *) (HiiSectionHeader + HiiSectionOffset);
ResourceDirectoryString->Length = 3;
ResourceDirectoryString->String[0] = L'B';
ResourceDirectoryString->String[1] = L'I';
ResourceDirectoryString->String[2] = L'N';
HiiSectionOffset = HiiSectionOffset + sizeof (ResourceDirectoryString->Length) + ResourceDirectoryString->Length * sizeof (ResourceDirectoryString->String[0]);
//
// Create Leaf data
//
LanguageResourceDirectoryEntry->u2.OffsetToData = HiiSectionOffset;
ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (HiiSectionHeader + HiiSectionOffset);
HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY);
ResourceDataEntry->OffsetToData = HiiSectionOffset;
ResourceDataEntry->Size = HiiDataSize;
*pSectionHeaderSize = HiiSectionHeaderSize;
return HiiSectionHeader;
}
int
main (
int argc,
@@ -1501,6 +1710,8 @@ Returns:
EFI_IFR_FORM_SET IfrFormSet;
UINT8 NumberOfFormPacakge;
EFI_HII_PACKAGE_HEADER EndPackage;
UINT32 HiiSectionHeaderSize;
UINT8 *HiiSectionHeader;
SetUtilityName (UTILITY_NAME);
@@ -1539,6 +1750,8 @@ Returns:
EndPackage.Length = sizeof (EFI_HII_PACKAGE_HEADER);
EndPackage.Type = EFI_HII_PACKAGE_END;
memset (&HiiPackageListGuid, 0, sizeof (HiiPackageListGuid));
HiiSectionHeaderSize = 0;
HiiSectionHeader = NULL;
if (argc == 1) {
Error (NULL, 0, 1001, "Missing options", "No input options.");
@@ -1748,6 +1961,13 @@ Returns:
continue;
}
if (stricmp (argv[0], "--hiibinpackage") == 0) {
OutImageType = FW_HII_PACKAGE_LIST_BINIMAGE;
argc --;
argv ++;
continue;
}
if (argv[0][0] == '-') {
Error (NULL, 0, 1000, "Unknown option", argv[0]);
goto Finish;
@@ -1819,6 +2039,11 @@ Returns:
goto Finish;
}
if ((OutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) && ReplaceFlag) {
Error (NULL, 0, 1002, "Conflicting option", "-r replace option cannot be used with --hiibinpackage merge files option.");
goto Finish;
}
//
// Input image file
//
@@ -1862,6 +2087,9 @@ Returns:
case FW_HII_PACKAGE_LIST_RCIMAGE:
VerboseMsg ("Combine the input multi hii bin packages to one text pacakge list RC file.");
break;
case FW_HII_PACKAGE_LIST_BINIMAGE:
VerboseMsg ("Combine the input multi hii bin packages to one binary pacakge list file.");
break;
default:
break;
}
@@ -1903,9 +2131,9 @@ Returns:
}
//
// Combine multi binary HII package files to a single text package list RC file.
// Combine multi binary HII package files.
//
if (OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) {
if (OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE || OutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) {
//
// Get hii package list lenght
//
@@ -1970,37 +2198,64 @@ Returns:
HiiPackageDataPointer = HiiPackageDataPointer + FileLength;
}
memcpy (HiiPackageDataPointer, &EndPackage, sizeof (EndPackage));
//
// write the hii package into the binary package list file with the resource section header
//
if (OutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) {
//
// Create the resource section header
//
HiiSectionHeader = CreateHiiResouceSectionHeader (&HiiSectionHeaderSize, HiiPackageListHeader.PackageLength);
//
// Wrtie section header and HiiData into File.
//
fwrite (HiiSectionHeader, 1, HiiSectionHeaderSize, fpOut);
fwrite (HiiPackageListBuffer, 1, HiiPackageListHeader.PackageLength, fpOut);
//
// Free allocated resources.
//
free (HiiSectionHeader);
free (HiiPackageListBuffer);
//
// Done successfully
//
goto Finish;
}
//
// write the hii package into the text package list rc file.
//
for (Index = 0; gHiiPackageRCFileHeader[Index] != NULL; Index++) {
fprintf (fpOut, "%s\n", gHiiPackageRCFileHeader[Index]);
}
fprintf (fpOut, "\n%d %s\n{", HII_RESOURCE_SECTION_INDEX, HII_RESOURCE_SECTION_NAME);
if (OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) {
for (Index = 0; gHiiPackageRCFileHeader[Index] != NULL; Index++) {
fprintf (fpOut, "%s\n", gHiiPackageRCFileHeader[Index]);
}
fprintf (fpOut, "\n%d %s\n{", HII_RESOURCE_SECTION_INDEX, HII_RESOURCE_SECTION_NAME);
HiiPackageDataPointer = HiiPackageListBuffer;
for (Index = 0; Index + 2 < HiiPackageListHeader.PackageLength; Index += 2) {
HiiPackageDataPointer = HiiPackageListBuffer;
for (Index = 0; Index + 2 < HiiPackageListHeader.PackageLength; Index += 2) {
if (Index % 16 == 0) {
fprintf (fpOut, "\n ");
}
fprintf (fpOut, " 0x%04X,", *(UINT16 *) HiiPackageDataPointer);
HiiPackageDataPointer += 2;
}
if (Index % 16 == 0) {
fprintf (fpOut, "\n ");
}
fprintf (fpOut, " 0x%04X,", *(UINT16 *) HiiPackageDataPointer);
HiiPackageDataPointer += 2;
if ((Index + 2) == HiiPackageListHeader.PackageLength) {
fprintf (fpOut, " 0x%04X\n}\n", *(UINT16 *) HiiPackageDataPointer);
}
if ((Index + 1) == HiiPackageListHeader.PackageLength) {
fprintf (fpOut, " 0x%04X\n}\n", *(UINT8 *) HiiPackageDataPointer);
}
free (HiiPackageListBuffer);
//
// Done successfully
//
goto Finish;
}
if (Index % 16 == 0) {
fprintf (fpOut, "\n ");
}
if ((Index + 2) == HiiPackageListHeader.PackageLength) {
fprintf (fpOut, " 0x%04X\n}\n", *(UINT16 *) HiiPackageDataPointer);
}
if ((Index + 1) == HiiPackageListHeader.PackageLength) {
fprintf (fpOut, " 0x%04X\n}\n", *(UINT8 *) HiiPackageDataPointer);
}
free (HiiPackageListBuffer);
//
// Done successfully
//
goto Finish;
}
//
@@ -2271,7 +2526,6 @@ Returns:
stricmp (ModuleType, "DXE_DRIVER") == 0 ||
stricmp (ModuleType, "DXE_SMM_DRIVER") == 0 ||
stricmp (ModuleType, "UEFI_DRIVER") == 0 ||
stricmp (ModuleType, "SMM_DRIVER") == 0 ||
stricmp (ModuleType, "SMM_CORE") == 0) {
Type = EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
VerboseMsg ("Efi Image subsystem type is efi boot service driver.");
@@ -2305,6 +2559,12 @@ Returns:
VerboseMsg ("Convert the input ELF Image to Pe Image");
ConvertElf(&FileBuffer, &FileLength);
}
//
// Make sure File Offsets and Virtual Offsets are the same in the image so it is XIP
// XIP == eXecute In Place
//
PeCoffConvertImageToXip (&FileBuffer, &FileLength);
//
// Remove reloc section from PE or TE image
@@ -2771,7 +3031,37 @@ Returns:
TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = Optional64->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);
}
}
//
// Fill HII section data
//
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);
for (Index = 0; Index < PeHdr->Pe32.FileHeader.NumberOfSections; Index++) {
if (stricmp ((char *)SectionHeader[Index].Name, ".hii") == 0) {
//
// Update resource section header offset
//
SetHiiResourceHeader ((UINT8*) FileBuffer + SectionHeader[Index].PointerToRawData, SectionHeader[Index].VirtualAddress);
//
// Update resource section name
//
strcpy((char *) SectionHeader[Index].Name, ".rsrc");
//
// Update resource data directory.
//
if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->Pe32.OptionalHeader;
Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = SectionHeader[Index].VirtualAddress;
Optional32->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = SectionHeader[Index].Misc.VirtualSize;
} else if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *)&PeHdr->Pe32.OptionalHeader;
Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = SectionHeader[Index].VirtualAddress;
Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = SectionHeader[Index].Misc.VirtualSize;
}
break;
}
}
//
// Zero ExceptionTable Xdata
//
@@ -3311,7 +3601,7 @@ Returns:
//
// strip space
//
for (cptr = Line; *cptr && isspace(*cptr); cptr++) {
for (cptr = Line; *cptr && isspace((int)*cptr); cptr++) {
}
// Skip Blank Lines and Comment Lines
@@ -3326,14 +3616,14 @@ Returns:
// DD XXXXXXXXX
// DD XXXXXXXXX
//
if ((tolower(cptr[0]) == 'd') && (tolower(cptr[1]) == 'd') && isspace (cptr[2])) {
if ((tolower((int)cptr[0]) == 'd') && (tolower((int)cptr[1]) == 'd') && isspace ((int)cptr[2])) {
//
// Skip blanks and look for a hex digit
//
cptr += 3;
for (; *cptr && isspace(*cptr); cptr++) {
for (; *cptr && isspace((int)*cptr); cptr++) {
}
if (isxdigit (*cptr)) {
if (isxdigit ((int)*cptr)) {
if (sscanf (cptr, "%X", &ScannedData) != 1) {
return STATUS_ERROR;
}