]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/Fd.py
9c43a62cc3d053502640d8b33111f98a703f2ffb
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Fd.py
1 ## @file
2 # process FD generation
3 #
4 # Copyright (c) 2007 - 2018, 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 from __future__ import absolute_import
19 from . import Region
20 from . import Fv
21 import Common.LongFilePathOs as os
22 from io import BytesIO
23 import sys
24 from struct import *
25 from .GenFdsGlobalVariable import GenFdsGlobalVariable
26 from CommonDataClass.FdfClass import FDClassObject
27 from Common import EdkLogger
28 from Common.BuildToolError import *
29 from Common.Misc import SaveFileOnChange
30 from Common.DataType import BINARY_FILE_TYPE_FV
31
32 ## generate FD
33 #
34 #
35 class FD(FDClassObject):
36 ## The constructor
37 #
38 # @param self The object pointer
39 #
40 def __init__(self):
41 FDClassObject.__init__(self)
42
43 ## GenFd() method
44 #
45 # Generate FD
46 #
47 # @retval string Generated FD file name
48 #
49 def GenFd (self, Flag = False):
50 if self.FdUiName.upper() + 'fd' in GenFdsGlobalVariable.ImageBinDict:
51 return GenFdsGlobalVariable.ImageBinDict[self.FdUiName.upper() + 'fd']
52
53 #
54 # Print Information
55 #
56 FdFileName = os.path.join(GenFdsGlobalVariable.FvDir, self.FdUiName + '.fd')
57 if not Flag:
58 GenFdsGlobalVariable.InfLogger("\nFd File Name:%s (%s)" %(self.FdUiName, FdFileName))
59
60 Offset = 0x00
61 for item in self.BlockSizeList:
62 Offset = Offset + item[0] * item[1]
63 if Offset != self.Size:
64 EdkLogger.error("GenFds", GENFDS_ERROR, 'FD %s Size not consistent with block array' % self.FdUiName)
65 GenFdsGlobalVariable.VerboseLogger('Following Fv will be add to Fd !!!')
66 for FvObj in GenFdsGlobalVariable.FdfParser.Profile.FvDict:
67 GenFdsGlobalVariable.VerboseLogger(FvObj)
68
69 HasCapsuleRegion = False
70 for RegionObj in self.RegionList:
71 if RegionObj.RegionType == 'CAPSULE':
72 HasCapsuleRegion = True
73 break
74 if HasCapsuleRegion:
75 TempFdBuffer = BytesIO('')
76 PreviousRegionStart = -1
77 PreviousRegionSize = 1
78
79 for RegionObj in self.RegionList :
80 if RegionObj.RegionType == 'CAPSULE':
81 continue
82 if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart:
83 pass
84 elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize):
85 pass
86 elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize:
87 if not Flag:
88 GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize)))
89 PadRegion = Region.Region()
90 PadRegion.Offset = PreviousRegionStart + PreviousRegionSize
91 PadRegion.Size = RegionObj.Offset - PadRegion.Offset
92 if not Flag:
93 PadRegion.AddToBuffer(TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFdsGlobalVariable.ImageBinDict, self.DefineVarDict)
94 PreviousRegionStart = RegionObj.Offset
95 PreviousRegionSize = RegionObj.Size
96 #
97 # Call each region's AddToBuffer function
98 #
99 if PreviousRegionSize > self.Size:
100 pass
101 GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')
102 RegionObj.AddToBuffer (TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFdsGlobalVariable.ImageBinDict, self.DefineVarDict)
103
104 FdBuffer = BytesIO('')
105 PreviousRegionStart = -1
106 PreviousRegionSize = 1
107 for RegionObj in self.RegionList :
108 if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart:
109 EdkLogger.error("GenFds", GENFDS_ERROR,
110 'Region offset 0x%X in wrong order with Region starting from 0x%X, size 0x%X\nRegions in FDF must have offsets appear in ascending order.'\
111 % (RegionObj.Offset, PreviousRegionStart, PreviousRegionSize))
112 elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize):
113 EdkLogger.error("GenFds", GENFDS_ERROR,
114 'Region offset 0x%X overlaps with Region starting from 0x%X, size 0x%X' \
115 % (RegionObj.Offset, PreviousRegionStart, PreviousRegionSize))
116 elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize:
117 if not Flag:
118 GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize)))
119 PadRegion = Region.Region()
120 PadRegion.Offset = PreviousRegionStart + PreviousRegionSize
121 PadRegion.Size = RegionObj.Offset - PadRegion.Offset
122 if not Flag:
123 PadRegion.AddToBuffer(FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFdsGlobalVariable.ImageBinDict, self.DefineVarDict)
124 PreviousRegionStart = RegionObj.Offset
125 PreviousRegionSize = RegionObj.Size
126 #
127 # Verify current region fits within allocated FD section Size
128 #
129 if PreviousRegionStart + PreviousRegionSize > self.Size:
130 EdkLogger.error("GenFds", GENFDS_ERROR,
131 'FD %s size too small to fit region with offset 0x%X and size 0x%X'
132 % (self.FdUiName, PreviousRegionStart, PreviousRegionSize))
133 #
134 # Call each region's AddToBuffer function
135 #
136 GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')
137 RegionObj.AddToBuffer (FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFdsGlobalVariable.ImageBinDict, self.DefineVarDict, Flag=Flag)
138 #
139 # Write the buffer contents to Fd file
140 #
141 GenFdsGlobalVariable.VerboseLogger('Write the buffer contents to Fd file')
142 if not Flag:
143 SaveFileOnChange(FdFileName, FdBuffer.getvalue())
144 FdBuffer.close()
145 GenFdsGlobalVariable.ImageBinDict[self.FdUiName.upper() + 'fd'] = FdFileName
146 return FdFileName
147
148 ## generate flash map file
149 #
150 # @param self The object pointer
151 #
152 def GenFlashMap (self):
153 pass
154
155
156
157
158
159
160
161