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