def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf = None, Dict = {}): # # Prepare the parameter of GenSection # if FfsInf != None: self.Alignment = FfsInf.__ExtendMacro__(self.Alignment) self.StringData = FfsInf.__ExtendMacro__(self.StringData) self.FileName = FfsInf.__ExtendMacro__(self.FileName) OutputFile = os.path.join(OutputPath, ModuleName + 'SEC' + SecNum + Ffs.SectionSuffix.get('UI')) if self.StringData != None : NameString = self.StringData elif self.FileName != None: FileNameStr = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FileName) FileNameStr = GenFdsGlobalVariable.MacroExtend(FileNameStr, Dict) FileObj = open(FileNameStr, 'r') NameString = FileObj.read() NameString = '\"' + NameString + "\"" FileObj.close() else: NameString = '' GenFdsGlobalVariable.GenerateSection(OutputFile, None, 'EFI_SECTION_USER_INTERFACE', Ui=NameString) OutputFileList = [] OutputFileList.append(OutputFile) return OutputFileList, self.Alignment
def GenerateGuidXRefFile(BuildDb, ArchList): GuidXRefFileName = os.path.join(GenFdsGlobalVariable.FvDir, "Guid.xref") GuidXRefFile = StringIO.StringIO('') GuidDict = {} for Arch in ArchList: PlatformDataBase = BuildDb.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] for ModuleFile in PlatformDataBase.Modules: Module = BuildDb.BuildObject[ModuleFile, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] GuidXRefFile.write("%s %s\n" % (Module.Guid, Module.BaseName)) for key, item in Module.Protocols.items(): GuidDict[key] = item for key, item in Module.Guids.items(): GuidDict[key] = item for key, item in Module.Ppis.items(): GuidDict[key] = item # Append GUIDs, Protocols, and PPIs to the Xref file GuidXRefFile.write("\n") for key, item in GuidDict.items(): GuidXRefFile.write("%s %s\n" % (GuidStructureStringToGuidString(item).upper(), key)) if GuidXRefFile.getvalue(): SaveFileOnChange(GuidXRefFileName, GuidXRefFile.getvalue(), False) GenFdsGlobalVariable.InfLogger("\nGUID cross reference file can be found at %s" % GuidXRefFileName) elif os.path.exists(GuidXRefFileName): os.remove(GuidXRefFileName) GuidXRefFile.close() GenFdsGlobalVariable.InfLogger("\nGUID cross reference file can be found at %s" % GuidXRefFileName)
def GenCapsule(self): if self.UiCapsuleName.upper() + 'cap' in GenFds.ImageBinDict.keys(): return GenFds.ImageBinDict[self.UiCapsuleName.upper() + 'cap'] GenFdsGlobalVariable.InfLogger("\nGenerate %s Capsule" % self.UiCapsuleName) CapInfFile = self.GenCapInf() CapInfFile.writelines("[files]" + T_CHAR_LF) CapFileList = [] for CapsuleDataObj in self.CapsuleDataList: CapsuleDataObj.CapsuleName = self.CapsuleName FileName = CapsuleDataObj.GenCapsuleSubItem() CapsuleDataObj.CapsuleName = None CapFileList.append(FileName) CapInfFile.writelines("EFI_FILE_NAME = " + \ FileName + \ T_CHAR_LF) SaveFileOnChange(self.CapInfFileName, CapInfFile.getvalue(), False) CapInfFile.close() # # Call GenFv tool to generate capsule # CapOutputFile = os.path.join(GenFdsGlobalVariable.FvDir, self.UiCapsuleName) CapOutputFile = CapOutputFile + '.Cap' GenFdsGlobalVariable.GenerateFirmwareVolume(CapOutputFile, [self.CapInfFileName], Capsule=True, FfsList=CapFileList) GenFdsGlobalVariable.VerboseLogger( "\nGenerate %s Capsule Successfully" % self.UiCapsuleName) GenFdsGlobalVariable.SharpCounter = 0 GenFds.ImageBinDict[self.UiCapsuleName.upper() + 'cap'] = CapOutputFile return CapOutputFile
def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf=None, Dict={}, IsMakefile = False): # # Prepare the parameter of GenSection # if FfsInf is not None: self.Alignment = FfsInf.__ExtendMacro__(self.Alignment) self.BuildNum = FfsInf.__ExtendMacro__(self.BuildNum) self.StringData = FfsInf.__ExtendMacro__(self.StringData) self.FileName = FfsInf.__ExtendMacro__(self.FileName) OutputFile = os.path.join(OutputPath, ModuleName + SUP_MODULE_SEC + SecNum + Ffs.SectionSuffix.get('VERSION')) OutputFile = os.path.normpath(OutputFile) # Get String Data StringData = '' if self.StringData is not None: StringData = self.StringData elif self.FileName is not None: FileNameStr = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FileName) FileNameStr = GenFdsGlobalVariable.MacroExtend(FileNameStr, Dict) FileObj = open(FileNameStr, 'r') StringData = FileObj.read() StringData = '"' + StringData + '"' FileObj.close() else: StringData = '' GenFdsGlobalVariable.GenerateSection(OutputFile, [], 'EFI_SECTION_VERSION', Ver=StringData, BuildNumber=self.BuildNum, IsMakefile=IsMakefile) OutputFileList = [] OutputFileList.append(OutputFile) return OutputFileList, self.Alignment
def __GenComplexFileFfs__(self, Rule, InputFile, Alignments): if Rule.NameGuid != None and Rule.NameGuid.startswith('PCD('): PcdValue = GenFdsGlobalVariable.GetPcdValue(Rule.NameGuid) if len(PcdValue) == 0: EdkLogger.error("GenFds", GENFDS_ERROR, '%s NOT defined.' \ % (Rule.NameGuid)) if PcdValue.startswith('{'): PcdValue = GuidStructureByteArrayToGuidString(PcdValue) RegistryGuidStr = PcdValue if len(RegistryGuidStr) == 0: EdkLogger.error("GenFds", GENFDS_ERROR, 'GUID value for %s in wrong format.' \ % (Rule.NameGuid)) self.ModuleGuid = RegistryGuidStr FfsOutput = os.path.join(self.OutputPath, self.ModuleGuid + '.ffs') GenFdsGlobalVariable.GenerateFfs( FfsOutput, InputFile, Ffs.Ffs.FdfFvFileTypeToFileType[Rule.FvFileType], self.ModuleGuid, Fixed=Rule.Fixed, CheckSum=Rule.CheckSum, Align=Rule.Alignment, SectionAlign=Alignments) return FfsOutput
def __GenSimpleFileFfs__(self, Rule, InputFileList): FfsOutput = self.OutputPath + \ os.sep + \ self.__ExtendMacro__(Rule.NameGuid) + \ '.ffs' GenFdsGlobalVariable.VerboseLogger(self.__ExtendMacro__(Rule.NameGuid)) InputSection = [] SectionAlignments = [] for InputFile in InputFileList: InputSection.append(InputFile) SectionAlignments.append(Rule.SectAlignment) if Rule.NameGuid != None and Rule.NameGuid.startswith('PCD('): PcdValue = GenFdsGlobalVariable.GetPcdValue(Rule.NameGuid) if len(PcdValue) == 0: EdkLogger.error("GenFds", GENFDS_ERROR, '%s NOT defined.' \ % (Rule.NameGuid)) if PcdValue.startswith('{'): PcdValue = GuidStructureByteArrayToGuidString(PcdValue) RegistryGuidStr = PcdValue if len(RegistryGuidStr) == 0: EdkLogger.error("GenFds", GENFDS_ERROR, 'GUID value for %s in wrong format.' \ % (Rule.NameGuid)) self.ModuleGuid = RegistryGuidStr GenFdsGlobalVariable.GenerateFfs(FfsOutput, InputSection, Ffs.Ffs.FdfFvFileTypeToFileType[Rule.FvFileType], self.ModuleGuid, Fixed=Rule.Fixed, CheckSum=Rule.CheckSum, Align=Rule.Alignment, SectionAlign=SectionAlignments ) return FfsOutput
def GetFileList(FfsInf, FileType, FileExtension, Dict = {}): if FileType in Section.SectFileType.keys() : IsSect = True else : IsSect = False if FileExtension != None: Suffix = FileExtension elif IsSect : Suffix = Section.SectionType.get(FileType) else: Suffix = Section.BinFileType.get(FileType) if FfsInf == None: EdkLogger.error("GenFds", GENFDS_ERROR, 'Inf File does not exist!') FileList = [] if FileType != None: for File in FfsInf.BinFileList: if File.Arch == "COMMON" or FfsInf.CurrentArch == File.Arch: if File.Type == FileType or (int(FfsInf.PiSpecVersion, 16) >= 0x0001000A \ and FileType == 'DXE_DPEX'and File.Type == 'SMM_DEPEX') \ or (FileType == 'TE'and File.Type == 'PE32'): if '*' in FfsInf.TargetOverrideList or File.Target == '*' or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []: FileList.append(FfsInf.PatchEfiFile(File.Path, File.Type)) else: GenFdsGlobalVariable.InfLogger ("\nBuild Target \'%s\' of File %s is not in the Scope of %s specified by INF %s in FDF" %(File.Target, File.File, FfsInf.TargetOverrideList, FfsInf.InfFileName)) else: GenFdsGlobalVariable.VerboseLogger ("\nFile Type \'%s\' of File %s in %s is not same with file type \'%s\' from Rule in FDF" %(File.Type, File.File, FfsInf.InfFileName, FileType)) else: GenFdsGlobalVariable.InfLogger ("\nCurrent ARCH \'%s\' of File %s is not in the Support Arch Scope of %s specified by INF %s in FDF" %(FfsInf.CurrentArch, File.File, File.Arch, FfsInf.InfFileName)) if Suffix != None and os.path.exists(FfsInf.EfiOutputPath): # # Get Makefile path and time stamp # MakefileDir = FfsInf.EfiOutputPath[:-len('OUTPUT')] Makefile = os.path.join(MakefileDir, 'Makefile') if not os.path.exists(Makefile): Makefile = os.path.join(MakefileDir, 'GNUmakefile') if os.path.exists(Makefile): # Update to search files with suffix in all sub-dirs. Tuple = os.walk(FfsInf.EfiOutputPath) for Dirpath, Dirnames, Filenames in Tuple: for F in Filenames: if os.path.splitext(F)[1] == Suffix: FullName = os.path.join(Dirpath, F) if os.path.getmtime(FullName) > os.path.getmtime(Makefile): FileList.append(FullName) if not FileList: SuffixMap = FfsInf.GetFinalTargetSuffixMap() if Suffix in SuffixMap: FileList.extend(SuffixMap[Suffix]) #Process the file lists is alphabetical for a same section type if len (FileList) > 1: FileList.sort() return FileList, IsSect
def GenFd(OutputDir, FdfParser, WorkSpace, ArchList): GenFdsGlobalVariable.SetDir('', FdfParser, WorkSpace, ArchList) GenFdsGlobalVariable.VerboseLogger( " Generate all Fd images and their required FV and Capsule images!" ) if GenFds.OnlyGenerateThisCap is not None and GenFds.OnlyGenerateThisCap.upper( ) in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict: CapsuleObj = GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict[ GenFds.OnlyGenerateThisCap.upper()] if CapsuleObj is not None: CapsuleObj.GenCapsule() return if GenFds.OnlyGenerateThisFd is not None and GenFds.OnlyGenerateThisFd.upper( ) in GenFdsGlobalVariable.FdfParser.Profile.FdDict: FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[ GenFds.OnlyGenerateThisFd.upper()] if FdObj is not None: FdObj.GenFd() return elif GenFds.OnlyGenerateThisFd is None and GenFds.OnlyGenerateThisFv is None: for FdObj in GenFdsGlobalVariable.FdfParser.Profile.FdDict.values( ): FdObj.GenFd() GenFdsGlobalVariable.VerboseLogger("\n Generate other FV images! ") if GenFds.OnlyGenerateThisFv is not None and GenFds.OnlyGenerateThisFv.upper( ) in GenFdsGlobalVariable.FdfParser.Profile.FvDict: FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict[ GenFds.OnlyGenerateThisFv.upper()] if FvObj is not None: Buffer = BytesIO() FvObj.AddToBuffer(Buffer) Buffer.close() return elif GenFds.OnlyGenerateThisFv is None: for FvObj in GenFdsGlobalVariable.FdfParser.Profile.FvDict.values( ): Buffer = BytesIO('') FvObj.AddToBuffer(Buffer) Buffer.close() if GenFds.OnlyGenerateThisFv is None and GenFds.OnlyGenerateThisFd is None and GenFds.OnlyGenerateThisCap is None: if GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict != {}: GenFdsGlobalVariable.VerboseLogger( "\n Generate other Capsule images!") for CapsuleObj in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.values( ): CapsuleObj.GenCapsule() if GenFdsGlobalVariable.FdfParser.Profile.OptRomDict != {}: GenFdsGlobalVariable.VerboseLogger( "\n Generate all Option ROM!") for OptRomObj in GenFdsGlobalVariable.FdfParser.Profile.OptRomDict.values( ): OptRomObj.AddToBuffer(None)
def GetCurrentArch(self): TargetArchList = GenFdsGlobalVariable.ArchList PlatformArchList = self.__GetPlatformArchList__() CurArchList = TargetArchList if PlatformArchList != []: CurArchList = list(set(TargetArchList) & set(PlatformArchList)) GenFdsGlobalVariable.VerboseLogger( "Valid target architecture(s) is : " + " ".join(CurArchList)) ArchList = [] if self.KeyStringList != []: for Key in self.KeyStringList: Key = GenFdsGlobalVariable.MacroExtend(Key) Target, Tag, Arch = Key.split('_') if Arch in CurArchList: ArchList.append(Arch) if Target not in self.TargetOverrideList: self.TargetOverrideList.append(Target) else: ArchList = CurArchList UseArchList = TargetArchList if self.UseArch != None: UseArchList = [] UseArchList.append(self.UseArch) ArchList = list(set(UseArchList) & set(ArchList)) self.InfFileName = NormPath(self.InfFileName) if len(PlatformArchList) == 0: self.InDsc = False PathClassObj = PathClass(self.InfFileName, GenFdsGlobalVariable.WorkSpaceDir) ErrorCode, ErrorInfo = PathClassObj.Validate(".inf") if ErrorCode != 0: EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) if len(ArchList) == 1: Arch = ArchList[0] return Arch elif len(ArchList) > 1: if len(PlatformArchList) == 0: EdkLogger.error( "GenFds", GENFDS_ERROR, "GenFds command line option has multiple ARCHs %s. Not able to determine which ARCH is valid for Module %s !" % (str(ArchList), self.InfFileName)) else: EdkLogger.error( "GenFds", GENFDS_ERROR, "Module built under multiple ARCHs %s. Not able to determine which output to put into flash for Module %s !" % (str(ArchList), self.InfFileName)) else: EdkLogger.error("GenFds", GENFDS_ERROR, "Module %s appears under ARCH %s in platform %s, but current deduced ARCH is %s, so NO build output could be put into flash." \ % (self.InfFileName, str(PlatformArchList), GenFdsGlobalVariable.ActivePlatform, str(set (UseArchList) & set (TargetArchList))))
def __ExtendMacro__ (self, String): MacroDict = { '$(INF_OUTPUT)' : self.EfiOutputPath, '$(MODULE_NAME)' : self.BaseName, '$(BUILD_NUMBER)': self.BuildNum, '$(INF_VERSION)' : self.VersionString, '$(NAMED_GUID)' : self.ModuleGuid } String = GenFdsGlobalVariable.MacroExtend(String, MacroDict) String = GenFdsGlobalVariable.MacroExtend(String, self.MacroDict) return String
def DisplayFvSpaceInfo(FdfParser): FvSpaceInfoList = [] MaxFvNameLength = 0 for FvName in FdfParser.Profile.FvDict: if len(FvName) > MaxFvNameLength: MaxFvNameLength = len(FvName) FvSpaceInfoFileName = os.path.join(GenFdsGlobalVariable.FvDir, FvName.upper() + '.Fv.map') if os.path.exists(FvSpaceInfoFileName): FileLinesList = linecache.getlines(FvSpaceInfoFileName) TotalFound = False Total = '' UsedFound = False Used = '' FreeFound = False Free = '' for Line in FileLinesList: NameValue = Line.split('=') if len(NameValue) == 2: if NameValue[0].strip() == 'EFI_FV_TOTAL_SIZE': TotalFound = True Total = NameValue[1].strip() if NameValue[0].strip() == 'EFI_FV_TAKEN_SIZE': UsedFound = True Used = NameValue[1].strip() if NameValue[0].strip() == 'EFI_FV_SPACE_SIZE': FreeFound = True Free = NameValue[1].strip() if TotalFound and UsedFound and FreeFound: FvSpaceInfoList.append((FvName, Total, Used, Free)) GenFdsGlobalVariable.QuietLogger( '\nFV Space Information' ) # VBox: We want this info in -quiet builds too. for FvSpaceInfo in FvSpaceInfoList: Name = FvSpaceInfo[0] TotalSizeValue = long(FvSpaceInfo[1], 0) UsedSizeValue = long(FvSpaceInfo[2], 0) FreeSizeValue = long(FvSpaceInfo[3], 0) if UsedSizeValue == TotalSizeValue: Percentage = '100' else: Percentage = str( (UsedSizeValue + 0.0) / TotalSizeValue)[0:4].lstrip('0.') GenFdsGlobalVariable.QuietLogger(Name + ' ' + '[' + Percentage + '%Full] ' + str(TotalSizeValue) + ' total, ' + str(UsedSizeValue) + ' used, ' + str(FreeSizeValue) + ' free') # VBox: Same as above.
def GetFileList(FfsInf, FileType, FileExtension, Dict={}): if FileType in Section.SectFileType.keys(): IsSect = True else: IsSect = False if FileExtension != None: Suffix = FileExtension elif IsSect: Suffix = Section.SectionType.get(FileType) else: Suffix = Section.BinFileType.get(FileType) if FfsInf == None: EdkLogger.error("GenFds", GENFDS_ERROR, 'Inf File does not exist!') FileList = [] if FileType != None: for File in FfsInf.BinFileList: if File.Arch == "COMMON" or FfsInf.CurrentArch == File.Arch: if File.Type == FileType or ( int(FfsInf.PiSpecVersion, 16) >= 0x0001000A and FileType == 'DXE_DPEX' and File.Type == 'SMM_DEPEX'): if '*' in FfsInf.TargetOverrideList or File.Target == '*' or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []: FileList.append(File.Path) else: GenFdsGlobalVariable.InfLogger( "\nBuild Target \'%s\' of File %s is not in the Scope of %s specified by INF %s in FDF" % (File.Target, File.File, FfsInf.TargetOverrideList, FfsInf.InfFileName)) else: GenFdsGlobalVariable.VerboseLogger( "\nFile Type \'%s\' of File %s in %s is not same with file type \'%s\' from Rule in FDF" % (File.Type, File.File, FfsInf.InfFileName, FileType)) else: GenFdsGlobalVariable.InfLogger( "\nCurrent ARCH \'%s\' of File %s is not in the Support Arch Scope of %s specified by INF %s in FDF" % (FfsInf.CurrentArch, File.File, File.Arch, FfsInf.InfFileName)) if Suffix != None: SuffixMap = FfsInf.GetFinalTargetSuffixMap() if Suffix in SuffixMap: FileList.extend(SuffixMap[Suffix]) #Process the file lists is alphabetical for a same section type if len(FileList) > 1: FileList.sort() return FileList, IsSect
def __GetRule__(self): CurrentArchList = [] if self.CurrentArch == None: CurrentArchList = ['common'] else: CurrentArchList.append(self.CurrentArch) for CurrentArch in CurrentArchList: RuleName = 'RULE' + \ '.' + \ CurrentArch.upper() + \ '.' + \ self.ModuleType.upper() if self.Rule != None: RuleName = RuleName + \ '.' + \ self.Rule.upper() Rule = GenFdsGlobalVariable.FdfParser.Profile.RuleDict.get( RuleName) if Rule != None: GenFdsGlobalVariable.VerboseLogger( "Want To Find Rule Name is : " + RuleName) return Rule RuleName = 'RULE' + \ '.' + \ 'COMMON' + \ '.' + \ self.ModuleType.upper() if self.Rule != None: RuleName = RuleName + \ '.' + \ self.Rule.upper() GenFdsGlobalVariable.VerboseLogger( 'Trying to apply common rule %s for INF %s' % (RuleName, self.InfFileName)) Rule = GenFdsGlobalVariable.FdfParser.Profile.RuleDict.get(RuleName) if Rule != None: GenFdsGlobalVariable.VerboseLogger("Want To Find Rule Name is : " + RuleName) return Rule if Rule == None: EdkLogger.error("GenFds", GENFDS_ERROR, 'Don\'t Find common rule %s for INF %s' \ % (RuleName, self.InfFileName))
def GenFfs(self, Dict={}): if self.FileName != None: self.FileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro( self.FileName) return self.FileName
def GenFfs(self, IsMakefile=False): # # Parse Inf file get Module related information # self.__InfParse__() self.__GetOptRomParams() # # Get the rule of how to generate Ffs file # Rule = self.__GetRule__() GenFdsGlobalVariable.VerboseLogger( "Packing binaries from inf file : %s" % self.InfFileName) #FileType = Ffs.Ffs.ModuleTypeToFileType[Rule.ModuleType] # # For the rule only has simpleFile # if isinstance(Rule, RuleSimpleFile.RuleSimpleFile): EfiOutputList = self.__GenSimpleFileSection__( Rule, IsMakefile=IsMakefile) return EfiOutputList # # For Rule has ComplexFile # elif isinstance(Rule, RuleComplexFile.RuleComplexFile): EfiOutputList = self.__GenComplexFileSection__( Rule, IsMakefile=IsMakefile) return EfiOutputList
def GenFfs(self, Dict={}, IsMakefile=False): if self.FileName is not None: self.FileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro( self.FileName) return self.FileName
def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf = None, Dict = {}): if FfsInf != None: self.CompType = FfsInf.__ExtendMacro__(self.CompType) self.Alignment = FfsInf.__ExtendMacro__(self.Alignment) SectFiles = tuple() Index = 0 for Sect in self.SectionList: Index = Index + 1 SecIndex = '%s.%d' %(SecNum, Index) ReturnSectList, AlignValue = Sect.GenSection(OutputPath, ModuleName, SecIndex, KeyStringList, FfsInf, Dict) if ReturnSectList != []: for FileData in ReturnSectList: SectFiles += (FileData,) OutputFile = OutputPath + \ os.sep + \ ModuleName + \ 'SEC' + \ SecNum + \ Ffs.SectionSuffix['COMPRESS'] OutputFile = os.path.normpath(OutputFile) GenFdsGlobalVariable.GenerateSection(OutputFile, SectFiles, Section.Section.SectionType['COMPRESS'], CompressionType=self.CompTypeDict[self.CompType]) OutputFileList = [] OutputFileList.append(OutputFile) return OutputFileList, self.Alignment
def __GetOptRomParams(self): if self.OverrideAttribs == None: self.OverrideAttribs = OptionRom.OverrideAttribs() if self.OverrideAttribs.NeedCompress == None: self.OverrideAttribs.NeedCompress = self.OptRomDefs.get( 'PCI_COMPRESS') if self.OverrideAttribs.NeedCompress is not None: if self.OverrideAttribs.NeedCompress.upper() not in ('TRUE', 'FALSE'): GenFdsGlobalVariable.ErrorLogger( "Expected TRUE/FALSE for PCI_COMPRESS: %s" % self.InfFileName) self.OverrideAttribs.NeedCompress = \ self.OverrideAttribs.NeedCompress.upper() == 'TRUE' if self.OverrideAttribs.PciVendorId == None: self.OverrideAttribs.PciVendorId = self.OptRomDefs.get( 'PCI_VENDOR_ID') if self.OverrideAttribs.PciClassCode == None: self.OverrideAttribs.PciClassCode = self.OptRomDefs.get( 'PCI_CLASS_CODE') if self.OverrideAttribs.PciDeviceId == None: self.OverrideAttribs.PciDeviceId = self.OptRomDefs.get( 'PCI_DEVICE_ID') if self.OverrideAttribs.PciRevision == None: self.OverrideAttribs.PciRevision = self.OptRomDefs.get( 'PCI_REVISION')
def GenFd (OutputDir, FdfParser, WorkSpace, ArchList): GenFdsGlobalVariable.SetDir ('', FdfParser, WorkSpace, ArchList) GenFdsGlobalVariable.VerboseLogger(" Generate all Fd images and their required FV and Capsule images!") if GenFds.OnlyGenerateThisCap != None and GenFds.OnlyGenerateThisCap.upper() in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.keys(): CapsuleObj = GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.get(GenFds.OnlyGenerateThisCap.upper()) if CapsuleObj != None: CapsuleObj.GenCapsule() return if GenFds.OnlyGenerateThisFd != None and GenFds.OnlyGenerateThisFd.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(GenFds.OnlyGenerateThisFd.upper()) if FdObj != None: FdObj.GenFd() return elif GenFds.OnlyGenerateThisFd == None and GenFds.OnlyGenerateThisFv == None: for FdName in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[FdName] FdObj.GenFd() GenFdsGlobalVariable.VerboseLogger("\n Generate other FV images! ") if GenFds.OnlyGenerateThisFv != None and GenFds.OnlyGenerateThisFv.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(GenFds.OnlyGenerateThisFv.upper()) if FvObj != None: Buffer = StringIO.StringIO() FvObj.AddToBuffer(Buffer) Buffer.close() return elif GenFds.OnlyGenerateThisFv == None: for FvName in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): Buffer = StringIO.StringIO('') FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict[FvName] FvObj.AddToBuffer(Buffer) Buffer.close() if GenFds.OnlyGenerateThisFv == None and GenFds.OnlyGenerateThisFd == None and GenFds.OnlyGenerateThisCap == None: if GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict != {}: GenFdsGlobalVariable.VerboseLogger("\n Generate other Capsule images!") for CapsuleName in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.keys(): CapsuleObj = GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict[CapsuleName] CapsuleObj.GenCapsule() if GenFdsGlobalVariable.FdfParser.Profile.OptRomDict != {}: GenFdsGlobalVariable.VerboseLogger("\n Generate all Option ROM!") for DriverName in GenFdsGlobalVariable.FdfParser.Profile.OptRomDict.keys(): OptRomObj = GenFdsGlobalVariable.FdfParser.Profile.OptRomDict[DriverName] OptRomObj.AddToBuffer(None)
def BlockNumOfRegion(self, BlockSize): if BlockSize == 0: EdkLogger.error( "GenFds", GENFDS_ERROR, "Region: %s is not in the FD address scope!" % self.Offset) BlockNum = self.Size / BlockSize GenFdsGlobalVariable.VerboseLogger("BlockNum = 0x%X" % BlockNum) return BlockNum
def GenSection(self, OutputPath, ModuleName, SecNum, keyStringList, FfsFile=None, Dict=None, IsMakefile=False): if self.ExpressionProcessed == False: self.Expression = self.Expression.replace("\n", " ").replace("\r", " ") ExpList = self.Expression.split() for Exp in ExpList: if Exp.upper() not in ('AND', 'OR', 'NOT', 'TRUE', 'FALSE', 'SOR', 'BEFORE', 'AFTER', 'END'): GuidStr = self.__FindGuidValue(Exp) if GuidStr is None: EdkLogger.error( "GenFds", RESOURCE_NOT_AVAILABLE, "Depex GUID %s could not be found in build DB! (ModuleName: %s)" % (Exp, ModuleName)) self.Expression = self.Expression.replace(Exp, GuidStr) self.Expression = self.Expression.strip() self.ExpressionProcessed = True if self.DepexType == 'PEI_DEPEX_EXP': ModuleType = 'PEIM' SecType = 'PEI_DEPEX' elif self.DepexType == 'DXE_DEPEX_EXP': ModuleType = 'DXE_DRIVER' SecType = 'DXE_DEPEX' elif self.DepexType == 'SMM_DEPEX_EXP': ModuleType = 'DXE_SMM_DRIVER' SecType = 'SMM_DEPEX' else: EdkLogger.error( "GenFds", FORMAT_INVALID, "Depex type %s is not valid for module %s" % (self.DepexType, ModuleName)) InputFile = os.path.join(OutputPath, ModuleName + 'SEC' + SecNum + '.depex') InputFile = os.path.normpath(InputFile) Depex = DependencyExpression(self.Expression, ModuleType) Depex.Generate(InputFile) OutputFile = os.path.join(OutputPath, ModuleName + 'SEC' + SecNum + '.dpx') OutputFile = os.path.normpath(OutputFile) GenFdsGlobalVariable.GenerateSection( OutputFile, [InputFile], Section.Section.SectionType.get(SecType), IsMakefile=IsMakefile) return [OutputFile], self.Alignment
def GenCapsuleSubItem(self): if self.FdName.find('.fd') == -1: if self.FdName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(self.FdName.upper()) FdFile = FdObj.GenFd() return FdFile else: FdFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FdName) return FdFile
def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf = None, Dict = {}): OutputFileList = [] if self.FvFileType != None: FileList, IsSect = Section.Section.GetFileList(FfsInf, self.FvFileType, self.FvFileExtension) if IsSect : return FileList, self.Alignment Num = SecNum for FileName in FileList: OutputFile = os.path.join(OutputPath, ModuleName + 'SEC' + Num + Ffs.SectionSuffix.get("FV_IMAGE")) GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE') OutputFileList.append(OutputFile) return OutputFileList, self.Alignment # # Generate Fv # if self.FvName != None: Buffer = StringIO.StringIO('') Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName) if Fv != None: self.Fv = Fv FvFileName = Fv.AddToBuffer(Buffer, self.FvAddr, MacroDict = Dict) if Fv.FvAlignment != None: if self.Alignment == None: self.Alignment = Fv.FvAlignment else: if GenFdsGlobalVariable.GetAlignment (Fv.FvAlignment) > GenFdsGlobalVariable.GetAlignment (self.Alignment): self.Alignment = Fv.FvAlignment else: if self.FvFileName != None: FvFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvFileName) else: EdkLogger.error("GenFds", GENFDS_ERROR, "FvImageSection Failed! %s NOT found in FDF" % self.FvName) # # Prepare the parameter of GenSection # OutputFile = os.path.join(OutputPath, ModuleName + 'SEC' + SecNum + Ffs.SectionSuffix.get("FV_IMAGE")) GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE') OutputFileList.append(OutputFile) return OutputFileList, self.Alignment
def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf = None, Dict = {}, IsMakefile = False): if FfsInf != None: self.CompType = FfsInf.__ExtendMacro__(self.CompType) self.Alignment = FfsInf.__ExtendMacro__(self.Alignment) SectFiles = tuple() Index = 0 MaxAlign = None for Sect in self.SectionList: Index = Index + 1 SecIndex = '%s.%d' %(SecNum, Index) ReturnSectList, AlignValue = Sect.GenSection(OutputPath, ModuleName, SecIndex, KeyStringList, FfsInf, Dict, IsMakefile=IsMakefile) if AlignValue != None: if MaxAlign == None: MaxAlign = AlignValue if GenFdsGlobalVariable.GetAlignment (AlignValue) > GenFdsGlobalVariable.GetAlignment (MaxAlign): MaxAlign = AlignValue if ReturnSectList != []: if AlignValue == None: AlignValue = "1" for FileData in ReturnSectList: SectFiles += (FileData,) if MaxAlign != None: if self.Alignment == None: self.Alignment = MaxAlign else: if GenFdsGlobalVariable.GetAlignment (MaxAlign) > GenFdsGlobalVariable.GetAlignment (self.Alignment): self.Alignment = MaxAlign OutputFile = OutputPath + \ os.sep + \ ModuleName + \ 'SEC' + \ SecNum + \ Ffs.SectionSuffix['COMPRESS'] OutputFile = os.path.normpath(OutputFile) GenFdsGlobalVariable.GenerateSection(OutputFile, SectFiles, Section.Section.SectionType['COMPRESS'], CompressionType=self.CompTypeDict[self.CompType], IsMakefile=IsMakefile) OutputFileList = [] OutputFileList.append(OutputFile) return OutputFileList, self.Alignment
def GenerateGuidXRefFile(BuildDb, ArchList): GuidXRefFileName = os.path.join(GenFdsGlobalVariable.FvDir, "Guid.xref") GuidXRefFile = open(GuidXRefFileName, "w+") for Arch in ArchList: PlatformDataBase = BuildDb.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch] for ModuleFile in PlatformDataBase.Modules: Module = BuildDb.BuildObject[ModuleFile, Arch] GuidXRefFile.write("%s %s\n" % (Module.Guid, Module.BaseName)) GuidXRefFile.close() GenFdsGlobalVariable.InfLogger("\nGUID cross reference file saved to %s" % GuidXRefFileName)
def BlockSizeOfRegion(self, BlockSizeList): Offset = 0x00 BlockSize = 0 for item in BlockSizeList: Offset = Offset + item[0] * item[1] GenFdsGlobalVariable.VerboseLogger("Offset = 0x%X" % Offset) GenFdsGlobalVariable.VerboseLogger("self.Offset 0x%X" % self.Offset) if self.Offset < Offset: if Offset - self.Offset < self.Size: EdkLogger.error("GenFds", GENFDS_ERROR, "Region at Offset 0x%X can NOT fit into Block array with BlockSize %X" \ % (self.Offset, item[0])) BlockSize = item[0] GenFdsGlobalVariable.VerboseLogger("BlockSize = %X" % BlockSize) return BlockSize return BlockSize
def GenFfs(self, Dict={}, FvChildAddr=[], FvParentAddr=None): # # Parse Inf file get Module related information # self.__InfParse__(Dict) # # Allow binary type module not specify override rule in FDF file. # if len(self.BinFileList) > 0 and not self.InDsc: if self.Rule == None or self.Rule == "": self.Rule = "BINARY" # # Get the rule of how to generate Ffs file # Rule = self.__GetRule__() GenFdsGlobalVariable.VerboseLogger( "Packing binaries from inf file : %s" % self.InfFileName) # # Convert Fv File Type for PI1.1 SMM driver. # if self.ModuleType == 'DXE_SMM_DRIVER' and int(self.PiSpecVersion, 16) >= 0x0001000A: if Rule.FvFileType == 'DRIVER': Rule.FvFileType = 'SMM' # # Framework SMM Driver has no SMM FV file type # if self.ModuleType == 'DXE_SMM_DRIVER' and int(self.PiSpecVersion, 16) < 0x0001000A: if Rule.FvFileType == 'SMM' or Rule.FvFileType == 'SMM_CORE': EdkLogger.error( "GenFds", FORMAT_NOT_SUPPORTED, "Framework SMM module doesn't support SMM or SMM_CORE FV file type", File=self.InfFileName) # # For the rule only has simpleFile # if isinstance(Rule, RuleSimpleFile.RuleSimpleFile): SectionOutputList = self.__GenSimpleFileSection__(Rule) FfsOutput = self.__GenSimpleFileFfs__(Rule, SectionOutputList) return FfsOutput # # For Rule has ComplexFile # elif isinstance(Rule, RuleComplexFile.RuleComplexFile): InputSectList, InputSectAlignments = self.__GenComplexFileSection__( Rule, FvChildAddr, FvParentAddr) FfsOutput = self.__GenComplexFileFfs__(Rule, InputSectList, InputSectAlignments) return FfsOutput
def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf=None, Dict={}, IsMakefile=False): # # Prepare the parameter of GenSection # if FfsInf is not None: self.Alignment = FfsInf.__ExtendMacro__(self.Alignment) self.StringData = FfsInf.__ExtendMacro__(self.StringData) self.FileName = FfsInf.__ExtendMacro__(self.FileName) OutputFile = os.path.join( OutputPath, ModuleName + SUP_MODULE_SEC + SecNum + Ffs.SectionSuffix.get(BINARY_FILE_TYPE_UI)) if self.StringData is not None: NameString = self.StringData elif self.FileName is not None: FileNameStr = GenFdsGlobalVariable.ReplaceWorkspaceMacro( self.FileName) FileNameStr = GenFdsGlobalVariable.MacroExtend(FileNameStr, Dict) FileObj = open(FileNameStr, 'r') NameString = FileObj.read() FileObj.close() else: NameString = '' GenFdsGlobalVariable.GenerateSection(OutputFile, None, 'EFI_SECTION_USER_INTERFACE', Ui=NameString, IsMakefile=IsMakefile) OutputFileList = [] OutputFileList.append(OutputFile) return OutputFileList, self.Alignment
def GenCapsuleSubItem(self): if self.FvName.find('.fv') == -1: if self.FvName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName.upper()) FdBuffer = StringIO.StringIO('') FvObj.CapsuleName = self.CapsuleName FvFile = FvObj.AddToBuffer(FdBuffer) FvObj.CapsuleName = None FdBuffer.close() return FvFile else: FvFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvName) return FvFile
def GenFfsMakefile(OutputDir, FdfParser, WorkSpace, ArchList, GlobalData): GenFdsGlobalVariable.SetEnv(FdfParser, WorkSpace, ArchList, GlobalData) for FdObj in GenFdsGlobalVariable.FdfParser.Profile.FdDict.values(): FdObj.GenFd(Flag=True) for FvObj in GenFdsGlobalVariable.FdfParser.Profile.FvDict.values(): FvObj.AddToBuffer(Buffer=None, Flag=True) if GenFdsGlobalVariable.FdfParser.Profile.OptRomDict != {}: for OptRomObj in GenFdsGlobalVariable.FdfParser.Profile.OptRomDict.values(): OptRomObj.AddToBuffer(Buffer=None, Flag=True) return GenFdsGlobalVariable.FfsCmdDict