1 ## @file 2 # process data section generation 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 # 18 import Section 19 from GenFdsGlobalVariable import GenFdsGlobalVariable 20 import subprocess 21 from Ffs import Ffs 22 import Common.LongFilePathOs as os 23 from CommonDataClass.FdfClass import DataSectionClassObject 24 from Common.Misc import PeImageClass 25 from Common.LongFilePathSupport import CopyLongFilePath 26 27 ## generate data section 28 # 29 # 30 class DataSection (DataSectionClassObject): 31 ## The constructor 32 # 33 # @param self The object pointer 34 # 35 def __init__(self): 36 DataSectionClassObject.__init__(self) 37 38 ## GenSection() method 39 # 40 # Generate compressed section 41 # 42 # @param self The object pointer 43 # @param OutputPath Where to place output file 44 # @param ModuleName Which module this section belongs to 45 # @param SecNum Index of section 46 # @param KeyStringList Filter for inputs of section generation 47 # @param FfsInf FfsInfStatement object that contains this section data 48 # @param Dict dictionary contains macro and its value 49 # @retval tuple (Generated file name list, section alignment) 50 # 51 def GenSection(self, OutputPath, ModuleName, SecNum, keyStringList, FfsFile = None, Dict = {}): 52 # 53 # Prepare the parameter of GenSection 54 # 55 if FfsFile != None: 56 self.SectFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.SectFileName) 57 self.SectFileName = GenFdsGlobalVariable.MacroExtend(self.SectFileName, Dict, FfsFile.CurrentArch) 58 else: 59 self.SectFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.SectFileName) 60 self.SectFileName = GenFdsGlobalVariable.MacroExtend(self.SectFileName, Dict) 61 62 """Check Section file exist or not !""" 63 64 if not os.path.exists(self.SectFileName): 65 self.SectFileName = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, 66 self.SectFileName) 67 68 """Copy Map file to Ffs output""" 69 Filename = GenFdsGlobalVariable.MacroExtend(self.SectFileName) 70 if Filename[(len(Filename)-4):] == '.efi': 71 MapFile = Filename.replace('.efi', '.map') 72 if os.path.exists(MapFile): 73 CopyMapFile = os.path.join(OutputPath, ModuleName + '.map') 74 if not os.path.exists(CopyMapFile) or (os.path.getmtime(MapFile) > os.path.getmtime(CopyMapFile)): 75 CopyLongFilePath(MapFile, CopyMapFile) 76 77 #Get PE Section alignment when align is set to AUTO 78 if self.Alignment == 'Auto' and self.SecType in ('TE', 'PE32'): 79 ImageObj = PeImageClass (Filename) 80 if ImageObj.SectionAlignment < 0x400: 81 self.Alignment = str (ImageObj.SectionAlignment) 82 else: 83 self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K' 84 85 NoStrip = True 86 if self.SecType in ('TE', 'PE32'): 87 if self.KeepReloc != None: 88 NoStrip = self.KeepReloc 89 90 if not NoStrip: 91 FileBeforeStrip = os.path.join(OutputPath, ModuleName + '.efi') 92 if not os.path.exists(FileBeforeStrip) or \ 93 (os.path.getmtime(self.SectFileName) > os.path.getmtime(FileBeforeStrip)): 94 CopyLongFilePath(self.SectFileName, FileBeforeStrip) 95 StrippedFile = os.path.join(OutputPath, ModuleName + '.stripped') 96 GenFdsGlobalVariable.GenerateFirmwareImage( 97 StrippedFile, 98 [GenFdsGlobalVariable.MacroExtend(self.SectFileName, Dict)], 99 Strip=True 100 ) 101 self.SectFileName = StrippedFile 102 103 if self.SecType == 'TE': 104 TeFile = os.path.join( OutputPath, ModuleName + 'Te.raw') 105 GenFdsGlobalVariable.GenerateFirmwareImage( 106 TeFile, 107 [GenFdsGlobalVariable.MacroExtend(self.SectFileName, Dict)], 108 Type='te' 109 ) 110 self.SectFileName = TeFile 111 112 OutputFile = os.path.join (OutputPath, ModuleName + 'SEC' + SecNum + Ffs.SectionSuffix.get(self.SecType)) 113 OutputFile = os.path.normpath(OutputFile) 114 115 GenFdsGlobalVariable.GenerateSection(OutputFile, [self.SectFileName], Section.Section.SectionType.get(self.SecType)) 116 FileList = [OutputFile] 117 return FileList, self.Alignment 118