]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/Region.py
2 # process FD Region generation
4 # Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
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
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.
19 from GenFdsGlobalVariable
import GenFdsGlobalVariable
21 from CommonDataClass
.FdfClass
import RegionClassObject
24 from Common
import EdkLogger
25 from Common
.BuildToolError
import *
30 class Region(RegionClassObject
):
34 # @param self The object pointer
37 RegionClassObject
.__init
__(self
)
42 # Add region data to the Buffer
44 # @param self The object pointer
45 # @param Buffer The buffer generated region data will be put
46 # @param BaseAddress base address of region
47 # @param BlockSize block size of region
48 # @param BlockNum How many blocks in region
49 # @param ErasePolarity Flash erase polarity
50 # @param VtfDict VTF objects
51 # @param MacroDict macro value pair
52 # @retval string Generated FV file path
55 def AddToBuffer(self
, Buffer
, BaseAddress
, BlockSizeList
, ErasePolarity
, ImageBinDict
, vtfDict
= None, MacroDict
= {}):
57 GenFdsGlobalVariable
.InfLogger('\nGenerate Region at Offset 0x%X' % self
.Offset
)
58 GenFdsGlobalVariable
.InfLogger(" Region Size = 0x%X" %Size
)
59 GenFdsGlobalVariable
.SharpCounter
= 0
61 if self
.RegionType
== 'FV':
65 RegionBlockSize
= self
.BlockSizeOfRegion(BlockSizeList
)
66 RegionBlockNum
= self
.BlockNumOfRegion(RegionBlockSize
)
68 self
.FvAddress
= int(BaseAddress
, 16) + self
.Offset
69 FvBaseAddress
= '0x%X' %self
.FvAddress
71 for RegionData
in self
.RegionDataList
:
73 if RegionData
.endswith(".fv"):
74 RegionData
= GenFdsGlobalVariable
.MacroExtend(RegionData
, MacroDict
)
75 GenFdsGlobalVariable
.InfLogger(' Region FV File Name = .fv : %s'%RegionData
)
76 if RegionData
[1] != ':' :
77 RegionData
= os
.path
.join (GenFdsGlobalVariable
.WorkSpaceDir
, RegionData
)
78 if not os
.path
.exists(RegionData
):
79 EdkLogger
.error("GenFds", FILE_NOT_FOUND
, ExtraData
=RegionData
)
82 elif RegionData
.upper() + 'fv' in ImageBinDict
.keys():
83 GenFdsGlobalVariable
.InfLogger(' Region Name = FV')
84 FileName
= ImageBinDict
[RegionData
.upper() + 'fv']
90 if RegionData
.upper() in GenFdsGlobalVariable
.FdfParser
.Profile
.FvDict
.keys():
91 FvObj
= GenFdsGlobalVariable
.FdfParser
.Profile
.FvDict
.get(RegionData
.upper())
94 GenFdsGlobalVariable
.InfLogger(' Region Name = FV')
98 BlockSize
= RegionBlockSize
99 BlockNum
= RegionBlockNum
100 if FvObj
.BlockSizeList
!= []:
101 if FvObj
.BlockSizeList
[0][0] != None:
102 BlockSize
= FvObj
.BlockSizeList
[0][0]
103 if FvObj
.BlockSizeList
[0][1] != None:
104 BlockNum
= FvObj
.BlockSizeList
[0][1]
105 self
.FvAddress
= self
.FvAddress
+ FvOffset
106 FvAlignValue
= self
.GetFvAlignValue(FvObj
.FvAlignment
)
107 if self
.FvAddress
% FvAlignValue
!= 0:
108 EdkLogger
.error("GenFds", GENFDS_ERROR
,
109 "FV (%s) is NOT %s Aligned!" % (FvObj
.UiFvName
, FvObj
.FvAlignment
))
110 FvBuffer
= StringIO
.StringIO('')
111 FvBaseAddress
= '0x%X' %self
.FvAddress
112 FvObj
.AddToBuffer(FvBuffer
, FvBaseAddress
, BlockSize
, BlockNum
, ErasePolarity
, vtfDict
)
113 if FvBuffer
.len > Size
:
115 EdkLogger
.error("GenFds", GENFDS_ERROR
,
116 "Size of FV (%s) is larger than Region Size 0x%X specified." % (RegionData
, Size
))
118 # Put the generated image into FD buffer.
120 Buffer
.write(FvBuffer
.getvalue())
122 FvOffset
= FvOffset
+ FvBuffer
.len
123 Size
= Size
- FvBuffer
.len
126 EdkLogger
.error("GenFds", GENFDS_ERROR
, "FV (%s) is NOT described in FDF file!" % (RegionData
))
128 # Add the exist Fv image into FD buffer
131 FileLength
= os
.stat(FileName
)[ST_SIZE
]
132 if FileLength
> Size
:
133 EdkLogger
.error("GenFds", GENFDS_ERROR
,
134 "Size of FV File (%s) is larger than Region Size 0x%X specified." \
135 % (RegionData
, Size
))
136 BinFile
= open (FileName
, 'r+b')
137 Buffer
.write(BinFile
.read())
139 Size
= Size
- FileLength
141 # Pad the left buffer
144 if (ErasePolarity
== '1') :
148 for i
in range(0, Size
):
149 Buffer
.write(pack('B', PadData
))
151 if self
.RegionType
== 'CAPSULE':
153 # Get Capsule from Capsule Dict
155 for RegionData
in self
.RegionDataList
:
156 if RegionData
.endswith(".cap"):
157 RegionData
= GenFdsGlobalVariable
.MacroExtend(RegionData
, MacroDict
)
158 GenFdsGlobalVariable
.InfLogger(' Region CAPSULE Image Name = .cap : %s'%RegionData
)
159 if RegionData
[1] != ':' :
160 RegionData
= os
.path
.join (GenFdsGlobalVariable
.WorkSpaceDir
, RegionData
)
161 if not os
.path
.exists(RegionData
):
162 EdkLogger
.error("GenFds", FILE_NOT_FOUND
, ExtraData
=RegionData
)
164 FileName
= RegionData
165 elif RegionData
.upper() + 'cap' in ImageBinDict
.keys():
166 GenFdsGlobalVariable
.InfLogger(' Region Name = CAPSULE')
167 FileName
= ImageBinDict
[RegionData
.upper() + 'cap']
170 # Generate Capsule image and Put it into FD buffer
173 if RegionData
.upper() in GenFdsGlobalVariable
.FdfParser
.Profile
.CapsuleDict
.keys():
174 CapsuleObj
= GenFdsGlobalVariable
.FdfParser
.Profile
.CapsuleDict
[RegionData
.upper()]
176 if CapsuleObj
!= None :
177 CapsuleObj
.CapsuleName
= RegionData
.upper()
178 GenFdsGlobalVariable
.InfLogger(' Region Name = CAPSULE')
180 # Call GenFv tool to generate Capsule Image
182 FileName
= CapsuleObj
.GenCapsule()
183 CapsuleObj
.CapsuleName
= None
185 EdkLogger
.error("GenFds", GENFDS_ERROR
, "Capsule (%s) is NOT described in FDF file!" % (RegionData
))
188 # Add the capsule image into FD buffer
190 FileLength
= os
.stat(FileName
)[ST_SIZE
]
191 if FileLength
> Size
:
192 EdkLogger
.error("GenFds", GENFDS_ERROR
,
193 "Size 0x%X of Capsule File (%s) is larger than Region Size 0x%X specified." \
194 % (FileLength
, RegionData
, Size
))
195 BinFile
= open (FileName
, 'r+b')
196 Buffer
.write(BinFile
.read())
198 Size
= Size
- FileLength
200 # Pad the left buffer
203 if (ErasePolarity
== '1') :
207 for i
in range(0, Size
):
208 Buffer
.write(pack('B', PadData
))
210 if self
.RegionType
== 'FILE':
211 for RegionData
in self
.RegionDataList
:
212 RegionData
= GenFdsGlobalVariable
.MacroExtend(RegionData
, MacroDict
)
213 if RegionData
[1] != ':' :
214 RegionData
= os
.path
.join (GenFdsGlobalVariable
.WorkSpaceDir
, RegionData
)
215 if not os
.path
.exists(RegionData
):
216 EdkLogger
.error("GenFds", FILE_NOT_FOUND
, ExtraData
=RegionData
)
218 # Add the file image into FD buffer
220 FileLength
= os
.stat(RegionData
)[ST_SIZE
]
221 if FileLength
> Size
:
222 EdkLogger
.error("GenFds", GENFDS_ERROR
,
223 "Size of File (%s) is larger than Region Size 0x%X specified." \
224 % (RegionData
, Size
))
225 GenFdsGlobalVariable
.InfLogger(' Region File Name = %s'%RegionData
)
226 BinFile
= open (RegionData
, 'r+b')
227 Buffer
.write(BinFile
.read())
229 Size
= Size
- FileLength
231 # Pad the left buffer
234 if (ErasePolarity
== '1') :
238 for i
in range(0, Size
):
239 Buffer
.write(pack('B', PadData
))
241 if self
.RegionType
== 'DATA' :
242 GenFdsGlobalVariable
.InfLogger(' Region Name = DATA')
244 for RegionData
in self
.RegionDataList
:
245 Data
= RegionData
.split(',')
246 DataSize
= DataSize
+ len(Data
)
248 EdkLogger
.error("GenFds", GENFDS_ERROR
, "Size of DATA is larger than Region Size ")
251 Buffer
.write(pack('B', int(item
, 16)))
252 Size
= Size
- DataSize
254 # Pad the left buffer
257 if (ErasePolarity
== '1') :
261 for i
in range(0, Size
):
262 Buffer
.write(pack('B', PadData
))
264 if self
.RegionType
== None:
265 GenFdsGlobalVariable
.InfLogger(' Region Name = None')
266 if (ErasePolarity
== '1') :
270 for i
in range(0, Size
):
271 Buffer
.write(pack('B', PadData
))
273 def GetFvAlignValue(self
, Str
):
276 Str
= Str
.strip().upper()
277 if Str
.endswith('K'):
280 elif Str
.endswith('M'):
283 elif Str
.endswith('G'):
284 Granu
= 1024*1024*1024
289 AlignValue
= int(Str
)*Granu
291 ## BlockSizeOfRegion()
293 # @param BlockSizeList List of block information
294 # @retval int Block size of region
296 def BlockSizeOfRegion(self
, BlockSizeList
):
299 for item
in BlockSizeList
:
300 Offset
= Offset
+ item
[0] * item
[1]
301 GenFdsGlobalVariable
.VerboseLogger ("Offset = 0x%X" %Offset
)
302 GenFdsGlobalVariable
.VerboseLogger ("self.Offset 0x%X" %self
.Offset
)
304 if self
.Offset
< Offset
:
305 if Offset
- self
.Offset
< self
.Size
:
306 EdkLogger
.error("GenFds", GENFDS_ERROR
,
307 "Region at Offset 0x%X can NOT fit into Block array with BlockSize %X" \
308 % (self
.Offset
, item
[0]))
310 GenFdsGlobalVariable
.VerboseLogger ("BlockSize = %X" %BlockSize
)
314 ## BlockNumOfRegion()
316 # @param BlockSize block size of region
317 # @retval int Block number of region
319 def BlockNumOfRegion (self
, BlockSize
):
321 EdkLogger
.error("GenFds", GENFDS_ERROR
, "Region: %s is not in the FD address scope!" % self
.Offset
)
322 BlockNum
= self
.Size
/ BlockSize
323 GenFdsGlobalVariable
.VerboseLogger ("BlockNum = 0x%X" %BlockNum
)