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# 18import Section 19from GenFdsGlobalVariable import GenFdsGlobalVariable 20import subprocess 21from Ffs import Ffs 22import Common.LongFilePathOs as os 23from CommonDataClass.FdfClass import DataSectionClassObject 24from Common.Misc import PeImageClass 25from Common.LongFilePathSupport import CopyLongFilePath 26 27## generate data section 28# 29# 30class 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