]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py
BaseTools: Append FILE_GUID to BaseName.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / ValidCheckingInfoObject.py
CommitLineData
82a6a960
BF
1# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
2# This program and the accompanying materials\r
3# are licensed and made available under the terms and conditions of the BSD License\r
4# which accompanies this distribution. The full text of the license may be found at\r
5# http://opensource.org/licenses/bsd-license.php\r
6#\r
7# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
8# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
9\r
10#\r
11# This file is used to collect the Variable checking information\r
12#\r
13\r
14# #\r
15# Import Modules\r
16#\r
17import os\r
18from Common.RangeExpression import RangeExpression\r
19from Common.Misc import *\r
20from StringIO import StringIO\r
21from struct import pack\r
22\r
23class VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER(object):\r
24 def __init__(self):\r
25 self.var_check_info = []\r
26 \r
27 def push_back(self, var_check_tab):\r
28 for tab in self.var_check_info:\r
29 if tab.equal(var_check_tab):\r
30 tab.merge(var_check_tab)\r
31 break\r
32 else:\r
33 self.var_check_info.append(var_check_tab)\r
34 \r
35 def dump(self, dest, Phase):\r
36 \r
37 FormatMap = {}\r
38 FormatMap[1] = "=B"\r
39 FormatMap[2] = "=H"\r
40 FormatMap[4] = "=L"\r
41 FormatMap[8] = "=Q"\r
42 \r
43 if not os.path.isabs(dest):\r
44 return\r
45 if not os.path.exists(dest):\r
46 os.mkdir(dest)\r
47 BinFileName = "PcdVarCheck.bin"\r
48 BinFilePath = os.path.join(dest, BinFileName)\r
49 Buffer = ''\r
50 index = 0\r
51 for var_check_tab in self.var_check_info:\r
52 index += 1\r
53 realLength = 0\r
54 realLength += 32\r
55 Name = var_check_tab.Name[1:-1]\r
56 NameChars = Name.split(",")\r
57 realLength += len(NameChars)\r
58 if (index < len(self.var_check_info) and realLength % 4) or (index == len(self.var_check_info) and len(var_check_tab.validtab) > 0 and realLength % 4):\r
59 realLength += (4 - (realLength % 4))\r
60 itemIndex = 0\r
61 for item in var_check_tab.validtab:\r
62 itemIndex += 1\r
63 realLength += 5\r
64 for v_data in item.data:\r
65 if type(v_data) == type(1):\r
66 realLength += item.StorageWidth\r
67 else:\r
68 realLength += item.StorageWidth\r
69 realLength += item.StorageWidth\r
70 if (index == len(self.var_check_info)) :\r
71 if (itemIndex < len(var_check_tab.validtab)) and realLength % 4:\r
72 realLength += (4 - (realLength % 4))\r
73 else:\r
74 if realLength % 4:\r
75 realLength += (4 - (realLength % 4))\r
76 var_check_tab.Length = realLength\r
77 realLength = 0\r
78 index = 0\r
79 for var_check_tab in self.var_check_info:\r
80 index += 1\r
81\r
82 b = pack("=H", var_check_tab.Revision)\r
83 Buffer += b\r
84 realLength += 2\r
85\r
86 b = pack("=H", var_check_tab.HeaderLength)\r
87 Buffer += b\r
88 realLength += 2\r
89\r
90 b = pack("=L", var_check_tab.Length)\r
91 Buffer += b\r
92 realLength += 4\r
93\r
94 b = pack("=B", var_check_tab.Type)\r
95 Buffer += b\r
96 realLength += 1\r
97\r
98 for i in range(0, 3):\r
99 b = pack("=B", var_check_tab.Reserved)\r
100 Buffer += b\r
101 realLength += 1\r
102\r
103 b = pack("=L", var_check_tab.Attributes)\r
104 Buffer += b\r
105 realLength += 4\r
106\r
107 Guid = var_check_tab.Guid\r
108 b = pack('=LHHBBBBBBBB',\r
109 Guid[0],\r
110 Guid[1],\r
111 Guid[2],\r
112 Guid[3],\r
113 Guid[4],\r
114 Guid[5],\r
115 Guid[6],\r
116 Guid[7],\r
117 Guid[8],\r
118 Guid[9],\r
119 Guid[10],\r
120 )\r
121 Buffer += b\r
122 realLength += 16\r
123\r
124 Name = var_check_tab.Name[1:-1]\r
125 NameChars = Name.split(",")\r
126 for NameChar in NameChars:\r
127 NameCharNum = int(NameChar, 16)\r
128 b = pack("=B", NameCharNum)\r
129 Buffer += b\r
130 realLength += 1\r
131\r
132 if (index < len(self.var_check_info) and realLength % 4) or (index == len(self.var_check_info) and len(var_check_tab.validtab) > 0 and realLength % 4):\r
133 for i in range(4 - (realLength % 4)):\r
134 b = pack("=B", var_check_tab.pad)\r
135 Buffer += b\r
136 realLength += 1\r
137 itemIndex = 0\r
138 for item in var_check_tab.validtab:\r
139 itemIndex += 1\r
140\r
141 b = pack("=B", item.Type)\r
142 Buffer += b\r
143 realLength += 1\r
144\r
145 b = pack("=B", item.Length)\r
146 Buffer += b\r
147 realLength += 1\r
148\r
149 b = pack("=H", int(item.VarOffset, 16))\r
150 Buffer += b\r
151 realLength += 2\r
152\r
153 b = pack("=B", item.StorageWidth)\r
154 Buffer += b\r
155 realLength += 1\r
156 \r
157 for v_data in item.data:\r
158 if type(v_data) == type(1):\r
159 b = pack(FormatMap[item.StorageWidth], v_data)\r
160 Buffer += b\r
161 realLength += item.StorageWidth\r
162 else:\r
163 b = pack(FormatMap[item.StorageWidth], v_data[0])\r
164 Buffer += b\r
165 realLength += item.StorageWidth\r
166 b = pack(FormatMap[item.StorageWidth], v_data[1])\r
167 Buffer += b\r
168 realLength += item.StorageWidth\r
169\r
170 if (index == len(self.var_check_info)) :\r
171 if (itemIndex < len(var_check_tab.validtab)) and realLength % 4:\r
172 for i in range(4 - (realLength % 4)):\r
173 b = pack("=B", var_check_tab.pad)\r
174 Buffer += b\r
175 realLength += 1\r
176 else:\r
177 if realLength % 4:\r
178 for i in range(4 - (realLength % 4)):\r
179 b = pack("=B", var_check_tab.pad)\r
180 Buffer += b\r
181 realLength += 1\r
182 \r
183 DbFile = StringIO()\r
184 if Phase == 'DXE' and os.path.exists(BinFilePath):\r
185 BinFile = open(BinFilePath, "rb")\r
186 BinBuffer = BinFile.read()\r
187 BinFile.close()\r
188 BinBufferSize = len(BinBuffer)\r
189 if (BinBufferSize % 4):\r
190 for i in range(4 - (BinBufferSize % 4)):\r
191 b = pack("=B", VAR_CHECK_PCD_VARIABLE_TAB.pad)\r
192 BinBuffer += b\r
193 Buffer = BinBuffer + Buffer\r
194 DbFile.write(Buffer)\r
195 SaveFileOnChange(BinFilePath, DbFile.getvalue(), True)\r
196 \r
197\r
198class VAR_CHECK_PCD_VARIABLE_TAB(object):\r
199 pad = 0xDA\r
200 def __init__(self, TokenSpaceGuid, PcdCName):\r
201 self.Revision = 0x0001\r
202 self.HeaderLength = 0\r
203 self.Length = 0 # Length include this header\r
204 self.Type = 0\r
205 self.Reserved = 0\r
206 self.Attributes = 0x00000000\r
207 self.Guid = eval("[" + TokenSpaceGuid.replace("{", "").replace("}", "") + "]")\r
208 self.Name = PcdCName\r
209 self.validtab = []\r
210\r
211 def UpdateSize(self):\r
212 self.HeaderLength = 32 + len(self.Name.split(","))\r
213 self.Length = 32 + len(self.Name.split(",")) + self.GetValidTabLen()\r
214 \r
215 def GetValidTabLen(self):\r
216 validtablen = 0\r
217 for item in self.validtab:\r
218 validtablen += item.Length \r
219 return validtablen \r
220 \r
221 def SetAttributes(self, attributes):\r
222 self.Attributes = attributes\r
223 \r
224 def push_back(self, valid_obj):\r
225 if valid_obj is not None:\r
226 self.validtab.append(valid_obj)\r
227 \r
228 def equal(self, varchecktab):\r
229 if self.Guid == varchecktab.Guid and self.Name == varchecktab.Name:\r
230 return True\r
231 else:\r
232 return False\r
233 \r
234 def merge(self, varchecktab):\r
235 for validobj in varchecktab.validtab:\r
236 if validobj in self.validtab:\r
237 continue\r
238 self.validtab.append(validobj)\r
239 self.UpdateSize()\r
240\r
241\r
242class VAR_CHECK_PCD_VALID_OBJ(object):\r
243 def __init__(self, VarOffset, data, PcdDataType):\r
244 self.Type = 1\r
245 self.Length = 0 # Length include this header\r
246 self.VarOffset = VarOffset\r
247 self.StorageWidth = 0\r
248 self.PcdDataType = PcdDataType.strip()\r
249 self.rawdata = data\r
250 self.data = set()\r
251 self.ValidData = True\r
252 self.updateStorageWidth()\r
253 def updateStorageWidth(self):\r
254 if self.PcdDataType == "UINT8" or self.PcdDataType == "BOOLEAN":\r
255 self.StorageWidth = 1\r
256 elif self.PcdDataType == "UINT16":\r
257 self.StorageWidth = 2\r
258 elif self.PcdDataType == "UINT32":\r
259 self.StorageWidth = 4\r
260 elif self.PcdDataType == "UINT64":\r
261 self.StorageWidth = 8\r
262 else:\r
263 self.StorageWidth = 0\r
264 self.ValidData = False\r
265 \r
266 def __eq__(self, validObj): \r
267 if self.VarOffset == validObj.VarOffset:\r
268 return True\r
269 else:\r
270 return False\r
271 \r
272class VAR_CHECK_PCD_VALID_LIST(VAR_CHECK_PCD_VALID_OBJ):\r
273 def __init__(self, VarOffset, validlist, PcdDataType):\r
274 super(VAR_CHECK_PCD_VALID_LIST, self).__init__(VarOffset, validlist, PcdDataType)\r
275 self.Type = 1\r
276 self.update_data()\r
277 self.update_size()\r
278 def update_data(self):\r
279 valid_num_list = []\r
280 data_list = []\r
281 for item in self.rawdata:\r
282 valid_num_list.extend(item.split(','))\r
283 \r
284 for valid_num in valid_num_list:\r
285 valid_num = valid_num.strip()\r
286\r
287 if valid_num.startswith('0x') or valid_num.startswith('0X'):\r
288 data_list.append(int(valid_num, 16))\r
289 else:\r
290 data_list.append(int(valid_num))\r
291\r
292 \r
293 self.data = set(data_list)\r
294 \r
295 def update_size(self):\r
296 self.Length = 5 + len(self.data) * self.StorageWidth\r
297 \r
298 \r
299class VAR_CHECK_PCD_VALID_RANGE(VAR_CHECK_PCD_VALID_OBJ):\r
300 def __init__(self, VarOffset, validrange, PcdDataType):\r
301 super(VAR_CHECK_PCD_VALID_RANGE, self).__init__(VarOffset, validrange, PcdDataType)\r
302 self.Type = 2\r
303 self.update_data()\r
304 self.update_size()\r
305 def update_data(self):\r
306 RangeExpr = ""\r
307 data_list = []\r
308 i = 0\r
309 for item in self.rawdata:\r
310 if i == 0:\r
311 RangeExpr = "( " + item + " )"\r
312 else:\r
313 RangeExpr = RangeExpr + "OR ( " + item + " )"\r
314 range_result = RangeExpression(RangeExpr, self.PcdDataType)(True)\r
315 for rangelist in range_result:\r
316 for obj in rangelist.pop():\r
317 data_list.append((obj.start, obj.end))\r
318 self.data = set(data_list)\r
319 \r
320 def update_size(self):\r
321 self.Length = 5 + len(self.data) * 2 * self.StorageWidth\r
322 \r
323\r
324class VAR_VALID_OBJECT_FACTORY(object):\r
325 def __init__(self):\r
326 pass\r
327 @staticmethod\r
328 def Get_valid_object(PcdClass, VarOffset):\r
329 if PcdClass.validateranges:\r
330 return VAR_CHECK_PCD_VALID_RANGE(VarOffset, PcdClass.validateranges, PcdClass.DatumType)\r
331 if PcdClass.validlists:\r
332 return VAR_CHECK_PCD_VALID_LIST(VarOffset, PcdClass.validlists, PcdClass.DatumType)\r
333 else:\r
334 return None\r
335\r
336if __name__ == "__main__":\r
337 class TestObj(object):\r
338 def __init__(self, number1):\r
339 self.number_1 = number1\r
340 def __eq__(self, testobj):\r
341 if self.number_1 == testobj.number_1:\r
342 return True\r
343 else:\r
344 return False\r
345 test1 = TestObj(1)\r
346 test2 = TestObj(2)\r
347 \r
348 testarr = [test1, test2]\r
349 print TestObj(2) in testarr\r
350 print TestObj(2) == test2\r
351 \r