Sync EDKII BaseTools to BaseTools project r1928
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10234 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -24,6 +24,8 @@ Abstract:
|
||||
#ifndef __GNUC__
|
||||
#include <windows.h>
|
||||
#include <io.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -1034,14 +1036,20 @@ WriteSections(
|
||||
- (SecOffset - SecShdr->sh_addr);
|
||||
break;
|
||||
default:
|
||||
Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));
|
||||
Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));
|
||||
}
|
||||
} else if (Ehdr->e_machine == EM_ARM) {
|
||||
switch (ELF32_R_TYPE(Rel->r_info)) {
|
||||
case R_ARM_RBASE: // No relocation - no action required
|
||||
case R_ARM_PC24: // PC-relative relocations don't require modification
|
||||
case R_ARM_XPC25: // PC-relative relocations don't require modification
|
||||
|
||||
// Thease are all PC-relative relocations and don't require modification
|
||||
case R_ARM_PC24:
|
||||
case R_ARM_XPC25:
|
||||
case R_ARM_THM_PC22:
|
||||
case R_ARM_THM_JUMP19:
|
||||
case R_ARM_CALL:
|
||||
break;
|
||||
|
||||
case R_ARM_ABS32:
|
||||
case R_ARM_RABS32:
|
||||
//
|
||||
@@ -1050,7 +1058,7 @@ WriteSections(
|
||||
*(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + CoffSectionsOffset[Sym->st_shndx];
|
||||
break;
|
||||
default:
|
||||
Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));
|
||||
Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1124,7 +1132,7 @@ GetPhdrByIndex (
|
||||
|
||||
|
||||
VOID
|
||||
WriteRelocations(
|
||||
WriteRelocations (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
@@ -1164,13 +1172,18 @@ WriteRelocations(
|
||||
EFI_IMAGE_REL_BASED_HIGHLOW);
|
||||
break;
|
||||
default:
|
||||
Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));
|
||||
Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));
|
||||
}
|
||||
} else if (Ehdr->e_machine == EM_ARM) {
|
||||
switch (ELF32_R_TYPE(Rel->r_info)) {
|
||||
case R_ARM_RBASE:
|
||||
case R_ARM_RBASE: // No relocation - no action required
|
||||
|
||||
// Thease are all PC-relative relocations and don't require modification
|
||||
case R_ARM_PC24:
|
||||
case R_ARM_XPC25:
|
||||
case R_ARM_THM_PC22:
|
||||
case R_ARM_THM_JUMP19:
|
||||
case R_ARM_CALL:
|
||||
break;
|
||||
case R_ARM_ABS32:
|
||||
case R_ARM_RABS32:
|
||||
@@ -1180,8 +1193,9 @@ WriteRelocations(
|
||||
EFI_IMAGE_REL_BASED_HIGHLOW
|
||||
);
|
||||
break;
|
||||
default:
|
||||
Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));
|
||||
|
||||
default:
|
||||
Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));
|
||||
}
|
||||
} else {
|
||||
Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) Ehdr->e_machine);
|
||||
@@ -1217,6 +1231,9 @@ WriteRelocations(
|
||||
case DT_RELENT:
|
||||
RelElementSize = Dyn->d_un.d_val;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
Dyn++;
|
||||
}
|
||||
@@ -1226,7 +1243,13 @@ WriteRelocations(
|
||||
|
||||
for (K = 0; K < RelSize; K += RelElementSize) {
|
||||
|
||||
Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);
|
||||
if (DynamicSegment->p_paddr == 0) {
|
||||
// This seems to be how it works on armcc???? Have the email in to find out?
|
||||
Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);
|
||||
} else {
|
||||
// This is how it reads in the ELF specification
|
||||
Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + RelOffset + K);
|
||||
}
|
||||
|
||||
switch (ELF32_R_TYPE (Rel->r_info)) {
|
||||
case R_ARM_RBASE:
|
||||
@@ -1242,7 +1265,8 @@ WriteRelocations(
|
||||
CoffAddFixup (CoffSectionsOffset[ELF32_R_SYM (Rel->r_info)] + (Rel->r_offset - TargetSegment->p_vaddr), EFI_IMAGE_REL_BASED_HIGHLOW);
|
||||
break;
|
||||
default:
|
||||
Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type.", mInImageName);
|
||||
Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info));
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1993,6 +2017,9 @@ Returns:
|
||||
FILE *ReportFile;
|
||||
CHAR8 *ReportFileName;
|
||||
UINTN FileLen;
|
||||
time_t InputFileTime;
|
||||
time_t OutputFileTime;
|
||||
struct stat Stat_Buf;
|
||||
|
||||
SetUtilityName (UTILITY_NAME);
|
||||
|
||||
@@ -2038,6 +2065,8 @@ Returns:
|
||||
HiiSectionHeader = NULL;
|
||||
NewBaseAddress = 0;
|
||||
NegativeAddr = FALSE;
|
||||
InputFileTime = 0;
|
||||
OutputFileTime = 0;
|
||||
|
||||
if (argc == 1) {
|
||||
Error (NULL, 0, 1001, "Missing options", "No input options.");
|
||||
@@ -2434,6 +2463,14 @@ Returns:
|
||||
if (OutImageName != NULL) {
|
||||
fpOut = fopen (OutImageName, "rb");
|
||||
if (fpOut != NULL) {
|
||||
//
|
||||
// Get Output file time stamp
|
||||
//
|
||||
fstat(fileno (fpOut), &Stat_Buf);
|
||||
OutputFileTime = Stat_Buf.st_mtime;
|
||||
//
|
||||
// Get Output file data
|
||||
//
|
||||
OutputFileLength = _filelength (fileno (fpOut));
|
||||
OutputFileBuffer = malloc (OutputFileLength);
|
||||
if (OutputFileBuffer == NULL) {
|
||||
@@ -2460,6 +2497,14 @@ Returns:
|
||||
Error (NULL, 0, 0001, "Error opening file", mInImageName);
|
||||
goto Finish;
|
||||
}
|
||||
//
|
||||
// Get Iutput file time stamp
|
||||
//
|
||||
fstat(fileno (fpIn), &Stat_Buf);
|
||||
InputFileTime = Stat_Buf.st_mtime;
|
||||
//
|
||||
// Get Input file data
|
||||
//
|
||||
InputFileLength = _filelength (fileno (fpIn));
|
||||
InputFileBuffer = malloc (InputFileLength);
|
||||
if (InputFileBuffer == NULL) {
|
||||
@@ -3467,6 +3512,27 @@ Returns:
|
||||
FileLength = FileLength + sizeof (EFI_TE_IMAGE_HEADER);
|
||||
memcpy (FileBuffer, &TEImageHeader, sizeof (EFI_TE_IMAGE_HEADER));
|
||||
VerboseMsg ("the size of output file is %u bytes", (unsigned) (FileLength));
|
||||
} else {
|
||||
|
||||
//
|
||||
// Following codes are to fix the objcopy's issue:
|
||||
// objcopy in binutil 2.50.18 will set PE image's charactices to "RELOC_STRIPPED" if image has no ".reloc" section
|
||||
// It cause issue for EFI image which has no ".reloc" sections.
|
||||
// Following codes will be removed when objcopy in binutil fix this problem for PE image.
|
||||
//
|
||||
if ((PeHdr->Pe32.FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0) {
|
||||
if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
|
||||
Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->Pe32.OptionalHeader;
|
||||
if (Optional32->ImageBase == 0) {
|
||||
PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED;
|
||||
}
|
||||
} else if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
|
||||
Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *)&PeHdr->Pe32.OptionalHeader;
|
||||
if (Optional64->ImageBase == 0) {
|
||||
PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WriteFile:
|
||||
@@ -3487,7 +3553,10 @@ WriteFile:
|
||||
VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);
|
||||
}
|
||||
} else {
|
||||
if ((FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) {
|
||||
if ((OutputFileTime < InputFileTime) || (FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) {
|
||||
//
|
||||
// Update File when File is changed or File is old.
|
||||
//
|
||||
fpOut = fopen (OutImageName, "wb");
|
||||
if (fpOut == NULL) {
|
||||
Error (NULL, 0, 0001, "Error opening output file", OutImageName);
|
||||
|
@@ -597,6 +597,8 @@ typedef struct {
|
||||
#define R_ARM_GOTPC 25 /* Add PC-relative GOT table address. */
|
||||
#define R_ARM_GOT32 26 /* Add PC-relative GOT offset. */
|
||||
#define R_ARM_PLT32 27 /* Add PC-relative PLT offset. */
|
||||
#define R_ARM_CALL 28
|
||||
#define R_ARM_THM_JUMP19 51
|
||||
#define R_ARM_GNU_VTENTRY 100
|
||||
#define R_ARM_GNU_VTINHERIT 101
|
||||
#define R_ARM_RSBREL32 250
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# Create makefile for MS nmake and GNU make
|
||||
#
|
||||
# Copyright (c) 2007, Intel Corporation
|
||||
# Copyright (c) 2007 - 2010, 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
|
||||
@@ -26,7 +26,7 @@ from BuildEngine import *
|
||||
import Common.GlobalData as GlobalData
|
||||
|
||||
## Regular expression for finding header file inclusions
|
||||
gIncludePattern = re.compile(r"^[ \t]*#[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<][ \t]*)([\w.\\/]+)(?:[ \t]*[\">])", re.MULTILINE|re.UNICODE)
|
||||
gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<]?[ \t]*)([\w.\\/]+)(?:[ \t]*[\">]?)", re.MULTILINE|re.UNICODE)
|
||||
|
||||
## Regular expression for matching macro used in header file inclusion
|
||||
gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE)
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# This file is used to define each component of DSC file
|
||||
#
|
||||
# Copyright (c) 2007 ~ 2008, Intel Corporation
|
||||
# Copyright (c) 2007 - 2010, 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
|
||||
@@ -989,10 +989,14 @@ class Dsc(DscObject):
|
||||
#
|
||||
elif PreviousIf[2] in (MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, Model):
|
||||
List = PreviousIf[0].split(' ')
|
||||
Value1 = List[0]
|
||||
Value2 = List[1]
|
||||
Value3 = List[2]
|
||||
Value3 = SplitString(Value3)
|
||||
Value1, Value2, Value3 = '', '==', '0'
|
||||
if len(List) == 3:
|
||||
Value1 = List[0]
|
||||
Value2 = List[1]
|
||||
Value3 = List[2]
|
||||
Value3 = SplitString(Value3)
|
||||
if len(List) == 1:
|
||||
Value1 = List[0]
|
||||
Model = PreviousIf[2]
|
||||
self.TblDsc.Insert(Model, Value1, Value2, Value3, ArchList, BelongsToItem, self.FileID, PreviousIf[1], StartColumn, EndLine, EndColumn, Enabled)
|
||||
#
|
||||
|
@@ -1760,8 +1760,8 @@ class FdfParser(object):
|
||||
if not self.__GetNextHexNumber():
|
||||
raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
if len(self.__Token) > 4:
|
||||
raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)
|
||||
if len(self.__Token) > 18:
|
||||
raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
DataString = self.__Token
|
||||
DataString += ","
|
||||
@@ -1792,8 +1792,8 @@ class FdfParser(object):
|
||||
if not self.__GetNextHexNumber():
|
||||
raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
if len(self.__Token) > 4:
|
||||
raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)
|
||||
if len(self.__Token) > 18:
|
||||
raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
DataString = self.__Token
|
||||
DataString += ","
|
||||
|
@@ -291,17 +291,17 @@ def QueryInfItem(Table, Model, BelongsToItem):
|
||||
# @retval truple() A truple structure as (Family, ToolChain, Flag)
|
||||
#
|
||||
def GetBuildOption(String, File, LineNo = -1):
|
||||
(Family, ToolChain, Flag) = ('', '', '')
|
||||
if String.find(TAB_EQUAL_SPLIT) < 0:
|
||||
RaiseParserError(String, 'BuildOptions', File, '[<Family>:]<ToolFlag>=Flag', LineNo)
|
||||
(Family, ToolChain, Flag) = ('', '', '')
|
||||
List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1)
|
||||
if List[0].find(':') > -1:
|
||||
Family = List[0][ : List[0].find(':')].strip()
|
||||
ToolChain = List[0][List[0].find(':') + 1 : ].strip()
|
||||
else:
|
||||
ToolChain = List[0].strip()
|
||||
Flag = List[1].strip()
|
||||
|
||||
List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1)
|
||||
if List[0].find(':') > -1:
|
||||
Family = List[0][ : List[0].find(':')].strip()
|
||||
ToolChain = List[0][List[0].find(':') + 1 : ].strip()
|
||||
else:
|
||||
ToolChain = List[0].strip()
|
||||
Flag = List[1].strip()
|
||||
return (Family, ToolChain, Flag)
|
||||
|
||||
## Get Library Class
|
||||
|
@@ -1787,19 +1787,27 @@ class FdfParser:
|
||||
if not self.__GetNextHexNumber():
|
||||
raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
if len(self.__Token) > 4:
|
||||
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
|
||||
if len(self.__Token) > 18:
|
||||
raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
DataString = self.__Token
|
||||
DataString += ","
|
||||
# convert hex string value to byte hex string array
|
||||
AllString = self.__Token
|
||||
AllStrLen = len (AllString)
|
||||
DataString = ""
|
||||
while AllStrLen > 4:
|
||||
DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","
|
||||
AllStrLen = AllStrLen - 2
|
||||
DataString = DataString + AllString[:AllStrLen] + ","
|
||||
|
||||
while self.__IsToken(","):
|
||||
if not self.__GetNextHexNumber():
|
||||
raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)
|
||||
if len(self.__Token) > 4:
|
||||
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
|
||||
DataString += self.__Token
|
||||
DataString += ","
|
||||
# byte value array
|
||||
if len (self.__Token) <= 4:
|
||||
while self.__IsToken(","):
|
||||
if not self.__GetNextHexNumber():
|
||||
raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)
|
||||
if len(self.__Token) > 4:
|
||||
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
|
||||
DataString += self.__Token
|
||||
DataString += ","
|
||||
|
||||
if not self.__IsToken( "}"):
|
||||
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)
|
||||
@@ -1819,18 +1827,27 @@ class FdfParser:
|
||||
if not self.__GetNextHexNumber():
|
||||
raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
if len(self.__Token) > 4:
|
||||
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
|
||||
if len(self.__Token) > 18:
|
||||
raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
DataString = self.__Token
|
||||
DataString += ","
|
||||
# convert hex string value to byte hex string array
|
||||
AllString = self.__Token
|
||||
AllStrLen = len (AllString)
|
||||
DataString = ""
|
||||
while AllStrLen > 4:
|
||||
DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","
|
||||
AllStrLen = AllStrLen - 2
|
||||
DataString = DataString + AllString[:AllStrLen] + ","
|
||||
|
||||
while self.__IsToken(","):
|
||||
self.__GetNextHexNumber()
|
||||
if len(self.__Token) > 4:
|
||||
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
|
||||
DataString += self.__Token
|
||||
DataString += ","
|
||||
# byte value array
|
||||
if len (self.__Token) <= 4:
|
||||
while self.__IsToken(","):
|
||||
if not self.__GetNextHexNumber():
|
||||
raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)
|
||||
if len(self.__Token) > 4:
|
||||
raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)
|
||||
DataString += self.__Token
|
||||
DataString += ","
|
||||
|
||||
if not self.__IsToken( "}"):
|
||||
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)
|
||||
|
@@ -221,7 +221,7 @@ class LibraryReport(object):
|
||||
EdkIILibInfo += " C = " + LibConstructor
|
||||
LibDestructor = " ".join(LibraryItem[3])
|
||||
if LibDestructor:
|
||||
EdkIILibInfo += " D = " + LibConstructor
|
||||
EdkIILibInfo += " D = " + LibDestructor
|
||||
LibDepex = " ".join(LibraryItem[4])
|
||||
if LibDepex:
|
||||
EdkIILibInfo += " Depex = " + LibDepex
|
||||
@@ -255,7 +255,8 @@ class DepexReport(object):
|
||||
ModuleType = M.ModuleType
|
||||
if not ModuleType:
|
||||
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")
|
||||
if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE"]:
|
||||
|
||||
if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE", "SMM_CORE", "UEFI_APPLICATION"]:
|
||||
return
|
||||
|
||||
for Source in M.SourceFileList:
|
||||
@@ -404,17 +405,18 @@ class ModuleReport(object):
|
||||
self.Size = 0
|
||||
self.BuildTimeStamp = None
|
||||
self.DriverType = ""
|
||||
ModuleType = M.ModuleType
|
||||
if not ModuleType:
|
||||
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")
|
||||
#
|
||||
# If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"
|
||||
#
|
||||
if ModuleType == "DXE_SMM_DRIVER":
|
||||
PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")
|
||||
if int(PiSpec, 0) >= 0x0001000A:
|
||||
ModuleType = "SMM_DRIVER"
|
||||
self.DriverType = gDriverTypeMap.get(ModuleType, "")
|
||||
if not M.IsLibrary:
|
||||
ModuleType = M.ModuleType
|
||||
if not ModuleType:
|
||||
ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")
|
||||
#
|
||||
# If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"
|
||||
#
|
||||
if ModuleType == "DXE_SMM_DRIVER":
|
||||
PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")
|
||||
if int(PiSpec, 0) >= 0x0001000A:
|
||||
ModuleType = "SMM_DRIVER"
|
||||
self.DriverType = gDriverTypeMap.get(ModuleType, "0x2 (FREE_FORM)")
|
||||
self.UefiSpecVersion = M.Module.Specification.get("UEFI_SPECIFICATION_VERSION", "")
|
||||
self.PiSpecVersion = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "")
|
||||
self.PciDeviceId = M.Module.Defines.get("PCI_DEVICE_ID", "")
|
||||
@@ -1310,9 +1312,11 @@ class PlatformReport(object):
|
||||
|
||||
self.ModuleReportList = []
|
||||
if MaList != None:
|
||||
self._IsModuleBuild = True
|
||||
for Ma in MaList:
|
||||
self.ModuleReportList.append(ModuleReport(Ma, ReportType))
|
||||
else:
|
||||
self._IsModuleBuild = False
|
||||
for Pa in Wa.AutoGenObjectList:
|
||||
for ModuleKey in Pa.Platform.Modules:
|
||||
self.ModuleReportList.append(ModuleReport(Pa.Platform.Modules[ModuleKey].M, ReportType))
|
||||
@@ -1343,18 +1347,20 @@ class PlatformReport(object):
|
||||
FileWrite(File, "Build Duration: %s" % BuildDuration)
|
||||
FileWrite(File, "Report Content: %s" % ", ".join(ReportType))
|
||||
|
||||
if "PCD" in ReportType:
|
||||
self.PcdReport.GenerateReport(File, None)
|
||||
|
||||
if "FLASH" in ReportType:
|
||||
for FdReportListItem in self.FdReportList:
|
||||
FdReportListItem.GenerateReport(File)
|
||||
if not self._IsModuleBuild:
|
||||
if "PCD" in ReportType:
|
||||
self.PcdReport.GenerateReport(File, None)
|
||||
|
||||
if "FLASH" in ReportType:
|
||||
for FdReportListItem in self.FdReportList:
|
||||
FdReportListItem.GenerateReport(File)
|
||||
|
||||
for ModuleReportItem in self.ModuleReportList:
|
||||
ModuleReportItem.GenerateReport(File, self.PcdReport, self.PredictionReport, ReportType)
|
||||
|
||||
if "EXECUTION_ORDER" in ReportType:
|
||||
self.PredictionReport.GenerateReport(File, None)
|
||||
if not self._IsModuleBuild:
|
||||
if "EXECUTION_ORDER" in ReportType:
|
||||
self.PredictionReport.GenerateReport(File, None)
|
||||
|
||||
## BuildReport class
|
||||
#
|
||||
@@ -1422,7 +1428,7 @@ class BuildReport(object):
|
||||
EdkLogger.error("BuildReport", CODE_ERROR, "Unknown fatal error when generating build report", ExtraData=self.ReportFile, RaiseError=False)
|
||||
EdkLogger.quiet("(Python %s on %s\n%s)" % (platform.python_version(), sys.platform, traceback.format_exc()))
|
||||
File.close()
|
||||
|
||||
|
||||
# This acts like the main() function for the script, unless it is 'import'ed into another script.
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
|
@@ -1090,9 +1090,10 @@ class Build():
|
||||
|
||||
## Collect MAP information of all FVs
|
||||
#
|
||||
def _CollectFvMapBuffer (self, MapBuffer, Wa):
|
||||
def _CollectFvMapBuffer (self, MapBuffer, Wa, ModuleList):
|
||||
if self.Fdf != '':
|
||||
# First get the XIP base address for FV map file.
|
||||
GuidPattern = re.compile("[-a-fA-F0-9]+")
|
||||
for FvName in Wa.FdfProfile.FvDict.keys():
|
||||
FvMapBuffer = os.path.join(Wa.FvDir, FvName + '.Fv.map')
|
||||
if not os.path.exists(FvMapBuffer):
|
||||
@@ -1103,7 +1104,16 @@ class Build():
|
||||
FvMap.readline()
|
||||
FvMap.readline()
|
||||
FvMap.readline()
|
||||
MapBuffer.write(FvMap.read())
|
||||
for Line in FvMap:
|
||||
MatchGuid = GuidPattern.match(Line)
|
||||
if MatchGuid != None:
|
||||
#
|
||||
# Replace GUID with module name
|
||||
#
|
||||
GuidString = MatchGuid.group()
|
||||
if GuidString.upper() in ModuleList:
|
||||
Line = Line.replace(GuidString, ModuleList[GuidString.upper()].Name)
|
||||
MapBuffer.write('%s' % (Line))
|
||||
FvMap.close()
|
||||
|
||||
## Collect MAP information of all modules
|
||||
@@ -1124,7 +1134,8 @@ class Build():
|
||||
IsIpfPlatform = False
|
||||
if 'IPF' in self.ArchList:
|
||||
IsIpfPlatform = True
|
||||
for Module in ModuleList:
|
||||
for ModuleGuid in ModuleList:
|
||||
Module = ModuleList[ModuleGuid]
|
||||
GlobalData.gProcessingFile = "%s [%s, %s, %s]" % (Module.MetaFile, Module.Arch, Module.ToolChain, Module.BuildTarget)
|
||||
|
||||
OutputImageFile = ''
|
||||
@@ -1259,7 +1270,8 @@ class Build():
|
||||
#
|
||||
SaveFileOnChange(MapFilePath, MapBuffer.getvalue(), False)
|
||||
MapBuffer.close()
|
||||
sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath))
|
||||
if self.LoadFixAddress != 0:
|
||||
sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath))
|
||||
sys.stdout.flush()
|
||||
|
||||
## Build active platform for different build targets and different tool chains
|
||||
@@ -1286,7 +1298,7 @@ class Build():
|
||||
self._Build(self.Target, Wa)
|
||||
|
||||
# Create MAP file when Load Fix Address is enabled.
|
||||
if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:
|
||||
if self.Target in ["", "all", "fds"]:
|
||||
for Arch in self.ArchList:
|
||||
#
|
||||
# Check whether the set fix address is above 4G for 32bit image.
|
||||
@@ -1296,19 +1308,20 @@ class Build():
|
||||
#
|
||||
# Get Module List
|
||||
#
|
||||
ModuleList = []
|
||||
ModuleList = {}
|
||||
for Pa in Wa.AutoGenObjectList:
|
||||
for Ma in Pa.ModuleAutoGenList:
|
||||
if Ma == None:
|
||||
continue
|
||||
if not Ma.IsLibrary:
|
||||
ModuleList.append (Ma)
|
||||
ModuleList[Ma.Guid.upper()] = Ma
|
||||
|
||||
MapBuffer = StringIO('')
|
||||
#
|
||||
# Rebase module to the preferred memory address before GenFds
|
||||
#
|
||||
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
|
||||
if self.LoadFixAddress != 0:
|
||||
#
|
||||
# Rebase module to the preferred memory address before GenFds
|
||||
#
|
||||
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
|
||||
if self.Fdf != '':
|
||||
#
|
||||
# create FDS again for the updated EFI image
|
||||
@@ -1317,7 +1330,7 @@ class Build():
|
||||
#
|
||||
# Create MAP file for all platform FVs after GenFds.
|
||||
#
|
||||
self._CollectFvMapBuffer(MapBuffer, Wa)
|
||||
self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)
|
||||
#
|
||||
# Save MAP buffer into MAP file.
|
||||
#
|
||||
@@ -1367,7 +1380,7 @@ class Build():
|
||||
ExtraData=self.ModuleFile
|
||||
)
|
||||
# Create MAP file when Load Fix Address is enabled.
|
||||
if self.LoadFixAddress != 0 and self.Target == "fds" and self.Fdf != '':
|
||||
if self.Target == "fds" and self.Fdf != '':
|
||||
for Arch in self.ArchList:
|
||||
#
|
||||
# Check whether the set fix address is above 4G for 32bit image.
|
||||
@@ -1377,27 +1390,28 @@ class Build():
|
||||
#
|
||||
# Get Module List
|
||||
#
|
||||
ModuleList = []
|
||||
ModuleList = {}
|
||||
for Pa in Wa.AutoGenObjectList:
|
||||
for Ma in Pa.ModuleAutoGenList:
|
||||
if Ma == None:
|
||||
continue
|
||||
if not Ma.IsLibrary:
|
||||
ModuleList.append (Ma)
|
||||
ModuleList[Ma.Guid.upper()] = Ma
|
||||
|
||||
MapBuffer = StringIO('')
|
||||
#
|
||||
# Rebase module to the preferred memory address before GenFds
|
||||
#
|
||||
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
|
||||
#
|
||||
# create FDS again for the updated EFI image
|
||||
#
|
||||
self._Build("fds", Wa)
|
||||
if self.LoadFixAddress != 0:
|
||||
#
|
||||
# Rebase module to the preferred memory address before GenFds
|
||||
#
|
||||
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
|
||||
#
|
||||
# create FDS again for the updated EFI image
|
||||
#
|
||||
self._Build("fds", Wa)
|
||||
#
|
||||
# Create MAP file for all platform FVs after GenFds.
|
||||
#
|
||||
self._CollectFvMapBuffer(MapBuffer, Wa)
|
||||
self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)
|
||||
#
|
||||
# Save MAP buffer into MAP file.
|
||||
#
|
||||
@@ -1483,7 +1497,7 @@ class Build():
|
||||
EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)
|
||||
|
||||
# Create MAP file when Load Fix Address is enabled.
|
||||
if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:
|
||||
if self.Target in ["", "all", "fds"]:
|
||||
for Arch in self.ArchList:
|
||||
#
|
||||
# Check whether the set fix address is above 4G for 32bit image.
|
||||
@@ -1493,30 +1507,31 @@ class Build():
|
||||
#
|
||||
# Get Module List
|
||||
#
|
||||
ModuleList = []
|
||||
ModuleList = {}
|
||||
for Pa in Wa.AutoGenObjectList:
|
||||
for Ma in Pa.ModuleAutoGenList:
|
||||
if Ma == None:
|
||||
continue
|
||||
if not Ma.IsLibrary:
|
||||
ModuleList.append (Ma)
|
||||
ModuleList[Ma.Guid.upper()] = Ma
|
||||
#
|
||||
# Rebase module to the preferred memory address before GenFds
|
||||
#
|
||||
MapBuffer = StringIO('')
|
||||
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
|
||||
if self.LoadFixAddress != 0:
|
||||
self._CollectModuleMapBuffer(MapBuffer, ModuleList)
|
||||
|
||||
# Generate FD image if there's a FDF file found
|
||||
if self.Fdf != '' and self.Target in ["", "all", "fds"]:
|
||||
LaunchCommand(Wa.BuildCommand + ["fds"], Wa.MakeFileDir)
|
||||
|
||||
# Create MAP file for all platform FV after GenFds
|
||||
if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:
|
||||
if self.Target in ["", "all", "fds"]:
|
||||
if self.Fdf != '':
|
||||
#
|
||||
# Create MAP file for all platform FVs after GenFds.
|
||||
#
|
||||
self._CollectFvMapBuffer(MapBuffer, Wa)
|
||||
self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)
|
||||
#
|
||||
# Save MAP buffer into MAP file.
|
||||
#
|
||||
|
Reference in New Issue
Block a user