]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/Fd.py
BaseTools: use set instead of list for a variable to be used with in
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Fd.py
CommitLineData
30fdf114
LG
1## @file\r
2# process FD generation\r
3#\r
66d00b4d 4# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
30fdf114 5#\r
40d841f6 6# This program and the accompanying materials\r
30fdf114
LG
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15##\r
16# Import Modules\r
17#\r
18import Region\r
19import Fv\r
1be2ed90 20import Common.LongFilePathOs as os\r
30fdf114
LG
21import StringIO\r
22import sys\r
23from struct import *\r
24from GenFdsGlobalVariable import GenFdsGlobalVariable\r
25from CommonDataClass.FdfClass import FDClassObject\r
26from Common import EdkLogger\r
27from Common.BuildToolError import *\r
28from Common.Misc import SaveFileOnChange\r
fd171542 29from GenFds import GenFds\r
30fdf114
LG
30\r
31## generate FD\r
32#\r
33#\r
34class FD(FDClassObject):\r
35 ## The constructor\r
36 #\r
37 # @param self The object pointer\r
38 #\r
39 def __init__(self):\r
40 FDClassObject.__init__(self)\r
41\r
42 ## GenFd() method\r
43 #\r
44 # Generate FD\r
45 #\r
30fdf114
LG
46 # @retval string Generated FD file name\r
47 #\r
37de70b7 48 def GenFd (self, Flag = False):\r
fd171542 49 if self.FdUiName.upper() + 'fd' in GenFds.ImageBinDict.keys():\r
50 return GenFds.ImageBinDict[self.FdUiName.upper() + 'fd']\r
51\r
30fdf114
LG
52 #\r
53 # Print Information\r
54 #\r
c82fc2b5 55 FdFileName = os.path.join(GenFdsGlobalVariable.FvDir, self.FdUiName + '.fd')\r
37de70b7
YZ
56 if not Flag:\r
57 GenFdsGlobalVariable.InfLogger("\nFd File Name:%s (%s)" %(self.FdUiName, FdFileName))\r
c82fc2b5 58\r
30fdf114
LG
59 Offset = 0x00\r
60 for item in self.BlockSizeList:\r
61 Offset = Offset + item[0] * item[1]\r
62 if Offset != self.Size:\r
63 EdkLogger.error("GenFds", GENFDS_ERROR, 'FD %s Size not consistent with block array' % self.FdUiName)\r
64 GenFdsGlobalVariable.VerboseLogger('Following Fv will be add to Fd !!!')\r
65 for FvObj in GenFdsGlobalVariable.FdfParser.Profile.FvDict:\r
66 GenFdsGlobalVariable.VerboseLogger(FvObj)\r
67\r
68 GenFdsGlobalVariable.VerboseLogger('################### Gen VTF ####################')\r
69 self.GenVtfFile()\r
70\r
66d00b4d
YZ
71 HasCapsuleRegion = False\r
72 for RegionObj in self.RegionList:\r
b303ea72 73 if RegionObj.RegionType == 'CAPSULE':\r
66d00b4d
YZ
74 HasCapsuleRegion = True\r
75 break\r
76 if HasCapsuleRegion:\r
77 TempFdBuffer = StringIO.StringIO('')\r
78 PreviousRegionStart = -1\r
79 PreviousRegionSize = 1\r
80\r
81 for RegionObj in self.RegionList :\r
82 if RegionObj.RegionType == 'CAPSULE':\r
83 continue\r
84 if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart:\r
85 pass\r
86 elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize):\r
87 pass\r
88 elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize:\r
37de70b7
YZ
89 if not Flag:\r
90 GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize)))\r
66d00b4d
YZ
91 PadRegion = Region.Region()\r
92 PadRegion.Offset = PreviousRegionStart + PreviousRegionSize\r
93 PadRegion.Size = RegionObj.Offset - PadRegion.Offset\r
37de70b7
YZ
94 if not Flag:\r
95 PadRegion.AddToBuffer(TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r
66d00b4d
YZ
96 PreviousRegionStart = RegionObj.Offset\r
97 PreviousRegionSize = RegionObj.Size\r
98 #\r
99 # Call each region's AddToBuffer function\r
100 #\r
101 if PreviousRegionSize > self.Size:\r
102 pass\r
103 GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')\r
104 RegionObj.AddToBuffer (TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r
b303ea72 105 \r
30fdf114
LG
106 FdBuffer = StringIO.StringIO('')\r
107 PreviousRegionStart = -1\r
108 PreviousRegionSize = 1\r
109 for RegionObj in self.RegionList :\r
110 if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart:\r
111 EdkLogger.error("GenFds", GENFDS_ERROR,\r
112 '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.'\\r
113 % (RegionObj.Offset, PreviousRegionStart, PreviousRegionSize))\r
114 elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize):\r
115 EdkLogger.error("GenFds", GENFDS_ERROR,\r
116 'Region offset 0x%X overlaps with Region starting from 0x%X, size 0x%X' \\r
117 % (RegionObj.Offset, PreviousRegionStart, PreviousRegionSize))\r
118 elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize:\r
37de70b7
YZ
119 if not Flag:\r
120 GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize)))\r
30fdf114
LG
121 PadRegion = Region.Region()\r
122 PadRegion.Offset = PreviousRegionStart + PreviousRegionSize\r
123 PadRegion.Size = RegionObj.Offset - PadRegion.Offset\r
37de70b7
YZ
124 if not Flag:\r
125 PadRegion.AddToBuffer(FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r
30fdf114
LG
126 PreviousRegionStart = RegionObj.Offset\r
127 PreviousRegionSize = RegionObj.Size\r
128 #\r
4afd3d04
LG
129 # Verify current region fits within allocated FD section Size\r
130 #\r
131 if PreviousRegionStart + PreviousRegionSize > self.Size:\r
132 EdkLogger.error("GenFds", GENFDS_ERROR,\r
133 'FD %s size too small to fit region with offset 0x%X and size 0x%X'\r
134 % (self.FdUiName, PreviousRegionStart, PreviousRegionSize))\r
135 #\r
30fdf114
LG
136 # Call each region's AddToBuffer function\r
137 #\r
30fdf114 138 GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')\r
37de70b7 139 RegionObj.AddToBuffer (FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict,Flag=Flag)\r
30fdf114 140 #\r
30fdf114
LG
141 # Write the buffer contents to Fd file\r
142 #\r
143 GenFdsGlobalVariable.VerboseLogger('Write the buffer contents to Fd file')\r
37de70b7
YZ
144 if not Flag:\r
145 SaveFileOnChange(FdFileName, FdBuffer.getvalue())\r
146 FdBuffer.close()\r
fd171542 147 GenFds.ImageBinDict[self.FdUiName.upper() + 'fd'] = FdFileName\r
30fdf114
LG
148 return FdFileName\r
149\r
150 ## generate VTF\r
151 #\r
152 # @param self The object pointer\r
153 #\r
154 def GenVtfFile (self) :\r
155 #\r
156 # Get this Fd's all Fv name\r
157 #\r
158 FvAddDict ={}\r
159 FvList = []\r
160 for RegionObj in self.RegionList:\r
161 if RegionObj.RegionType == 'FV':\r
162 if len(RegionObj.RegionDataList) == 1:\r
163 RegionData = RegionObj.RegionDataList[0]\r
164 FvList.append(RegionData.upper())\r
165 FvAddDict[RegionData.upper()] = (int(self.BaseAddress,16) + \\r
166 RegionObj.Offset, RegionObj.Size)\r
167 else:\r
168 Offset = RegionObj.Offset\r
169 for RegionData in RegionObj.RegionDataList:\r
170 FvList.append(RegionData.upper())\r
171 FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(RegionData.upper())\r
172 if len(FvObj.BlockSizeList) < 1:\r
173 EdkLogger.error("GenFds", GENFDS_ERROR,\r
174 'FV.%s must point out FVs blocksize and Fv BlockNum' \\r
175 % FvObj.UiFvName)\r
176 else:\r
177 Size = 0\r
178 for blockStatement in FvObj.BlockSizeList:\r
179 Size = Size + blockStatement[0] * blockStatement[1]\r
180 FvAddDict[RegionData.upper()] = (int(self.BaseAddress,16) + \\r
181 Offset, Size)\r
182 Offset = Offset + Size\r
183 #\r
184 # Check whether this Fd need VTF\r
185 #\r
186 Flag = False\r
187 for VtfObj in GenFdsGlobalVariable.FdfParser.Profile.VtfList:\r
188 compLocList = VtfObj.GetFvList()\r
189 if set(compLocList).issubset(FvList):\r
190 Flag = True\r
191 break\r
192 if Flag == True:\r
193 self.vtfRawDict = VtfObj.GenVtf(FvAddDict)\r
194\r
195 ## generate flash map file\r
196 #\r
197 # @param self The object pointer\r
198 #\r
199 def GenFlashMap (self):\r
200 pass\r
201\r
202\r
203\r
204\r
205\r
206\r
207\r
208\r