1## @file
2# process FV image 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
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            for FileName in FileList:
64                OutputFile = os.path.join(OutputPath, ModuleName + 'SEC' + Num + Ffs.SectionSuffix.get("FV_IMAGE"))
65                GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE')
66                OutputFileList.append(OutputFile)
67            return OutputFileList, self.Alignment
68        #
69        # Generate Fv
70        #
71        if self.FvName != None:
72            Buffer = StringIO.StringIO('')
73            Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName)
74            if Fv != None:
75                self.Fv = Fv
76                FvFileName = Fv.AddToBuffer(Buffer, self.FvAddr, MacroDict = Dict)
77                if Fv.FvAlignment != None:
78                    if self.Alignment == None:
79                        self.Alignment = Fv.FvAlignment
80                    else:
81                        if GenFdsGlobalVariable.GetAlignment (Fv.FvAlignment) > GenFdsGlobalVariable.GetAlignment (self.Alignment):
82                            self.Alignment = Fv.FvAlignment
83            else:
84                if self.FvFileName != None:
85                    FvFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvFileName)
86                else:
87                    EdkLogger.error("GenFds", GENFDS_ERROR, "FvImageSection Failed! %s NOT found in FDF" % self.FvName)
88
89            #
90            # Prepare the parameter of GenSection
91            #
92            OutputFile = os.path.join(OutputPath, ModuleName + 'SEC' + SecNum + Ffs.SectionSuffix.get("FV_IMAGE"))
93            GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE')
94            OutputFileList.append(OutputFile)
95
96            return OutputFileList, self.Alignment
97