]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/Fd.py
Sync tool code to BuildTools project r1739.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Fd.py
CommitLineData
30fdf114
LG
1## @file\r
2# process FD generation\r
3#\r
4# Copyright (c) 2007, Intel Corporation\r
5#\r
6# All rights reserved. This program and the accompanying materials\r
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
20import os\r
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
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
74 continue\r
75 if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart:\r
76 pass\r
77 elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize):\r
78 pass\r
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
91 pass\r
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
116 # Call each region's AddToBuffer function\r
117 #\r
118 if PreviousRegionSize > self.Size:\r
119 EdkLogger.error("GenFds", GENFDS_ERROR, 'FD %s size too small' % self.FdUiName)\r
120 GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')\r
fd171542 121 RegionObj.AddToBuffer (FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r
30fdf114
LG
122 #\r
123 # Create a empty Fd file\r
124 #\r
125 GenFdsGlobalVariable.VerboseLogger ('Create an empty Fd file')\r
fd171542 126 FdFileName = os.path.join(GenFdsGlobalVariable.FvDir,self.FdUiName + '.fd')\r
30fdf114
LG
127 #\r
128 # Write the buffer contents to Fd file\r
129 #\r
130 GenFdsGlobalVariable.VerboseLogger('Write the buffer contents to Fd file')\r
131 SaveFileOnChange(FdFileName, FdBuffer.getvalue())\r
30fdf114 132 FdBuffer.close();\r
fd171542 133 GenFds.ImageBinDict[self.FdUiName.upper() + 'fd'] = FdFileName\r
30fdf114
LG
134 return FdFileName\r
135\r
136 ## generate VTF\r
137 #\r
138 # @param self The object pointer\r
139 #\r
140 def GenVtfFile (self) :\r
141 #\r
142 # Get this Fd's all Fv name\r
143 #\r
144 FvAddDict ={}\r
145 FvList = []\r
146 for RegionObj in self.RegionList:\r
147 if RegionObj.RegionType == 'FV':\r
148 if len(RegionObj.RegionDataList) == 1:\r
149 RegionData = RegionObj.RegionDataList[0]\r
150 FvList.append(RegionData.upper())\r
151 FvAddDict[RegionData.upper()] = (int(self.BaseAddress,16) + \\r
152 RegionObj.Offset, RegionObj.Size)\r
153 else:\r
154 Offset = RegionObj.Offset\r
155 for RegionData in RegionObj.RegionDataList:\r
156 FvList.append(RegionData.upper())\r
157 FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(RegionData.upper())\r
158 if len(FvObj.BlockSizeList) < 1:\r
159 EdkLogger.error("GenFds", GENFDS_ERROR,\r
160 'FV.%s must point out FVs blocksize and Fv BlockNum' \\r
161 % FvObj.UiFvName)\r
162 else:\r
163 Size = 0\r
164 for blockStatement in FvObj.BlockSizeList:\r
165 Size = Size + blockStatement[0] * blockStatement[1]\r
166 FvAddDict[RegionData.upper()] = (int(self.BaseAddress,16) + \\r
167 Offset, Size)\r
168 Offset = Offset + Size\r
169 #\r
170 # Check whether this Fd need VTF\r
171 #\r
172 Flag = False\r
173 for VtfObj in GenFdsGlobalVariable.FdfParser.Profile.VtfList:\r
174 compLocList = VtfObj.GetFvList()\r
175 if set(compLocList).issubset(FvList):\r
176 Flag = True\r
177 break\r
178 if Flag == True:\r
179 self.vtfRawDict = VtfObj.GenVtf(FvAddDict)\r
180\r
181 ## generate flash map file\r
182 #\r
183 # @param self The object pointer\r
184 #\r
185 def GenFlashMap (self):\r
186 pass\r
187\r
188\r
189\r
190\r
191\r
192\r
193\r
194\r