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