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