1## @file 2# process APRIORI file data and generate PEI/DXE APRIORI file 3# 4# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> 5# 6# This program and the accompanying materials 7# are licensed and made available under the terms and conditions of the BSD License 8# which accompanies this distribution. The full text of the license may be found at 9# http://opensource.org/licenses/bsd-license.php 10# 11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13# 14 15## 16# Import Modules 17# 18from struct import * 19import Common.LongFilePathOs as os 20import StringIO 21import FfsFileStatement 22from GenFdsGlobalVariable import GenFdsGlobalVariable 23from CommonDataClass.FdfClass import AprioriSectionClassObject 24from Common.String import * 25from Common.Misc import SaveFileOnChange,PathClass 26from Common import EdkLogger 27from Common.BuildToolError import * 28 29## process APRIORI file data and generate PEI/DXE APRIORI file 30# 31# 32class AprioriSection (AprioriSectionClassObject): 33 ## The constructor 34 # 35 # @param self The object pointer 36 # 37 def __init__(self): 38 AprioriSectionClassObject.__init__(self) 39 self.AprioriType = "" 40 41 ## GenFfs() method 42 # 43 # Generate FFS for APRIORI file 44 # 45 # @param self The object pointer 46 # @param FvName for whom apriori file generated 47 # @param Dict dictionary contains macro and its value 48 # @retval string Generated file name 49 # 50 def GenFfs (self, FvName, Dict = {}): 51 DXE_GUID = "FC510EE7-FFDC-11D4-BD41-0080C73C8881" 52 PEI_GUID = "1B45CC0A-156A-428A-AF62-49864DA0E6E6" 53 Buffer = StringIO.StringIO('') 54 AprioriFileGuid = DXE_GUID 55 if self.AprioriType == "PEI": 56 AprioriFileGuid = PEI_GUID 57 OutputAprFilePath = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, \ 58 GenFdsGlobalVariable.FfsDir,\ 59 AprioriFileGuid + FvName) 60 if not os.path.exists(OutputAprFilePath) : 61 os.makedirs(OutputAprFilePath) 62 63 OutputAprFileName = os.path.join( OutputAprFilePath, \ 64 AprioriFileGuid + FvName + '.Apri' ) 65 AprFfsFileName = os.path.join (OutputAprFilePath,\ 66 AprioriFileGuid + FvName + '.Ffs') 67 68 Dict.update(self.DefineVarDict) 69 for FfsObj in self.FfsList : 70 Guid = "" 71 if isinstance(FfsObj, FfsFileStatement.FileStatement): 72 Guid = FfsObj.NameGuid 73 else: 74 InfFileName = NormPath(FfsObj.InfFileName) 75 Arch = FfsObj.GetCurrentArch() 76 77 if Arch != None: 78 Dict['$(ARCH)'] = Arch 79 InfFileName = GenFdsGlobalVariable.MacroExtend(InfFileName, Dict, Arch) 80 81 if Arch != None: 82 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] 83 Guid = Inf.Guid 84 85 else: 86 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), 'COMMON', GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] 87 Guid = Inf.Guid 88 89 self.BinFileList = Inf.Module.Binaries 90 if self.BinFileList == []: 91 EdkLogger.error("GenFds", RESOURCE_NOT_AVAILABLE, 92 "INF %s not found in build ARCH %s!" \ 93 % (InfFileName, GenFdsGlobalVariable.ArchList)) 94 95 96 GuidPart = Guid.split('-') 97 Buffer.write(pack('I', long(GuidPart[0], 16))) 98 Buffer.write(pack('H', int(GuidPart[1], 16))) 99 Buffer.write(pack('H', int(GuidPart[2], 16))) 100 101 for Num in range(2): 102 Char = GuidPart[3][Num*2:Num*2+2] 103 Buffer.write(pack('B', int(Char, 16))) 104 105 for Num in range(6): 106 Char = GuidPart[4][Num*2:Num*2+2] 107 Buffer.write(pack('B', int(Char, 16))) 108 109 SaveFileOnChange(OutputAprFileName, Buffer.getvalue()) 110 111 RawSectionFileName = os.path.join( OutputAprFilePath, \ 112 AprioriFileGuid + FvName + '.raw' ) 113 GenFdsGlobalVariable.GenerateSection(RawSectionFileName, [OutputAprFileName], 'EFI_SECTION_RAW') 114 GenFdsGlobalVariable.GenerateFfs(AprFfsFileName, [RawSectionFileName], 115 'EFI_FV_FILETYPE_FREEFORM', AprioriFileGuid) 116 117 return AprFfsFileName 118 119