PageRenderTime 51ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/edk2/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py

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