• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1## @file
2# process FV image section generation
3#
4#  Copyright (c) 2007 - 2016, 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
19import StringIO
20from Ffs import Ffs
21import subprocess
22from GenFdsGlobalVariable import GenFdsGlobalVariable
23import Common.LongFilePathOs as os
24from CommonDataClass.FdfClass import FvImageSectionClassObject
25from Common import EdkLogger
26from Common.BuildToolError import *
27
28## generate FV image section
29#
30#
31class FvImageSection(FvImageSectionClassObject):
32
33    ## The constructor
34    #
35    #   @param  self        The object pointer
36    #
37    def __init__(self):
38        FvImageSectionClassObject.__init__(self)
39
40    ## GenSection() method
41    #
42    #   Generate FV image section
43    #
44    #   @param  self        The object pointer
45    #   @param  OutputPath  Where to place output file
46    #   @param  ModuleName  Which module this section belongs to
47    #   @param  SecNum      Index of section
48    #   @param  KeyStringList  Filter for inputs of section generation
49    #   @param  FfsInf      FfsInfStatement object that contains this section data
50    #   @param  Dict        dictionary contains macro and its value
51    #   @retval tuple       (Generated file name, section alignment)
52    #
53    def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf = None, Dict = {}):
54
55        OutputFileList = []
56        if self.FvFileType != None:
57            FileList, IsSect = Section.Section.GetFileList(FfsInf, self.FvFileType, self.FvFileExtension)
58            if IsSect :
59                return FileList, self.Alignment
60
61            Num = SecNum
62
63            MaxFvAlignment = 0
64            for FvFileName in FileList:
65                FvAlignmentValue = 0
66                if os.path.isfile(FvFileName):
67                    FvFileObj = open (FvFileName,'rb')
68                    FvFileObj.seek(0)
69                    # PI FvHeader is 0x48 byte
70                    FvHeaderBuffer = FvFileObj.read(0x48)
71                    # FV alignment position.
72                    FvAlignmentValue = 1 << (ord (FvHeaderBuffer[0x2E]) & 0x1F)
73                    FvFileObj.close()
74                if FvAlignmentValue > MaxFvAlignment:
75                    MaxFvAlignment = FvAlignmentValue
76
77                OutputFile = os.path.join(OutputPath, ModuleName + 'SEC' + Num + Ffs.SectionSuffix.get("FV_IMAGE"))
78                GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE')
79                OutputFileList.append(OutputFile)
80
81            # MaxFvAlignment is larger than or equal to 1K
82            if MaxFvAlignment >= 0x400:
83                if MaxFvAlignment >= 0x10000:
84                    #The max alignment supported by FFS is 64K.
85                    self.Alignment = "64K"
86                else:
87                    self.Alignment = str (MaxFvAlignment / 0x400) + "K"
88            else:
89                # MaxFvAlignment is less than 1K
90                self.Alignment = str (MaxFvAlignment)
91
92            return OutputFileList, self.Alignment
93        #
94        # Generate Fv
95        #
96        if self.FvName != None:
97            Buffer = StringIO.StringIO('')
98            Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName)
99            if Fv != None:
100                self.Fv = Fv
101                FvFileName = Fv.AddToBuffer(Buffer, self.FvAddr, MacroDict = Dict)
102                if Fv.FvAlignment != None:
103                    if self.Alignment == None:
104                        self.Alignment = Fv.FvAlignment
105                    else:
106                        if GenFdsGlobalVariable.GetAlignment (Fv.FvAlignment) > GenFdsGlobalVariable.GetAlignment (self.Alignment):
107                            self.Alignment = Fv.FvAlignment
108            else:
109                if self.FvFileName != None:
110                    FvFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvFileName)
111                    if os.path.isfile(FvFileName):
112                        FvFileObj = open (FvFileName,'rb')
113                        FvFileObj.seek(0)
114                        # PI FvHeader is 0x48 byte
115                        FvHeaderBuffer = FvFileObj.read(0x48)
116                        # FV alignment position.
117                        FvAlignmentValue = 1 << (ord (FvHeaderBuffer[0x2E]) & 0x1F)
118                        # FvAlignmentValue is larger than or equal to 1K
119                        if FvAlignmentValue >= 0x400:
120                            if FvAlignmentValue >= 0x10000:
121                                #The max alignment supported by FFS is 64K.
122                                self.Alignment = "64K"
123                            else:
124                                self.Alignment = str (FvAlignmentValue / 0x400) + "K"
125                        else:
126                            # FvAlignmentValue is less than 1K
127                            self.Alignment = str (FvAlignmentValue)
128                        FvFileObj.close()
129                else:
130                    EdkLogger.error("GenFds", GENFDS_ERROR, "FvImageSection Failed! %s NOT found in FDF" % self.FvName)
131
132            #
133            # Prepare the parameter of GenSection
134            #
135            OutputFile = os.path.join(OutputPath, ModuleName + 'SEC' + SecNum + Ffs.SectionSuffix.get("FV_IMAGE"))
136            GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE')
137            OutputFileList.append(OutputFile)
138
139            return OutputFileList, self.Alignment
140