• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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