]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Xml/XmlParser.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Xml / XmlParser.py
CommitLineData
4234283c
LG
1## @file\r
2# This file is used to parse a xml file of .PKG file\r
3#\r
f7496d71 4# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 5#\r
2e351cbe 6# SPDX-License-Identifier: BSD-2-Clause-Patent\r
4234283c
LG
7#\r
8\r
9'''\r
10XmlParser\r
11'''\r
12\r
13##\r
14# Import Modules\r
15#\r
16import re\r
17\r
18from Library.Xml.XmlRoutines import XmlNode\r
19from Library.Xml.XmlRoutines import CreateXmlElement\r
20from Library.Xml.XmlRoutines import XmlList\r
21from Library.Xml.XmlRoutines import XmlParseFile\r
22from Core.DistributionPackageClass import DistributionPackageClass\r
23from Object.POM.ModuleObject import DepexObject\r
24from Library.ParserValidate import IsValidInfMoudleType\r
25from Library.ParserValidate import IsValidInstallPath\r
26from Library.Misc import IsEqualList\r
27from Library.Misc import Sdict\r
28\r
29from Logger.StringTable import ERR_XML_INVALID_VARIABLENAME\r
30from Logger.StringTable import ERR_XML_INVALID_LIB_SUPMODLIST\r
31from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPARCHLIST\r
32from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPMODLIST\r
33from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPMODLIST_NOT_LIB\r
34from Logger.StringTable import ERR_FILE_NAME_INVALIDE\r
4234283c
LG
35from Logger.ToolError import PARSER_ERROR\r
36from Logger.ToolError import FORMAT_INVALID\r
37\r
38from Xml.CommonXml import DistributionPackageHeaderXml\r
39from Xml.CommonXml import MiscellaneousFileXml\r
40from Xml.CommonXml import UserExtensionsXml\r
41from Xml.XmlParserMisc import ConvertVariableName\r
42from Xml.XmlParserMisc import IsRequiredItemListNull\r
43from Xml.ModuleSurfaceAreaXml import ModuleSurfaceAreaXml\r
44from Xml.PackageSurfaceAreaXml import PackageSurfaceAreaXml\r
45\r
46import Logger.Log as Logger\r
47\r
48##\r
49# DistributionPackageXml\r
50#\r
51class DistributionPackageXml(object):\r
52 def __init__(self):\r
53 self.DistP = DistributionPackageClass()\r
54 self.Pkg = ''\r
55\r
56 ## ValidateDistributionPackage\r
57 #\r
58 # Check if any required item is missing in DistributionPackage\r
59 #\r
60 def ValidateDistributionPackage(self):\r
61 XmlTreeLevel = ['DistributionPackage']\r
62 if self.DistP:\r
63 #\r
64 # Check DistributionPackage -> DistributionHeader\r
65 #\r
66 XmlTreeLevel = ['DistributionPackage', '']\r
67 CheckDict = {'DistributionHeader':self.DistP.Header }\r
68 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
69\r
70 if self.DistP.Header:\r
71 DpHeader = self.DistP.Header\r
72 XmlTreeLevel = ['DistributionPackage', 'DistributionHeader']\r
73 CheckDict = Sdict()\r
421ccda3
HC
74 if DpHeader.GetAbstract():\r
75 DPAbstract = DpHeader.GetAbstract()[0][1]\r
76 else:\r
77 DPAbstract = ''\r
78 if DpHeader.GetCopyright():\r
79 DPCopyright = DpHeader.GetCopyright()[0][1]\r
80 else:\r
81 DPCopyright = ''\r
82 if DpHeader.GetLicense():\r
83 DPLicense = DpHeader.GetLicense()[0][1]\r
84 else:\r
85 DPLicense = ''\r
f7496d71 86\r
4234283c
LG
87 CheckDict['Name'] = DpHeader.GetName()\r
88 CheckDict['GUID'] = DpHeader.GetGuid()\r
89 CheckDict['Version'] = DpHeader.GetVersion()\r
421ccda3
HC
90 CheckDict['Copyright'] = DPCopyright\r
91 CheckDict['License'] = DPLicense\r
92 CheckDict['Abstract'] = DPAbstract\r
4234283c
LG
93 CheckDict['Vendor'] = DpHeader.GetVendor()\r
94 CheckDict['Date'] = DpHeader.GetDate()\r
95 CheckDict['XmlSpecification'] = DpHeader.GetXmlSpecification()\r
96\r
97 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
98 else:\r
99 XmlTreeLevel = ['DistributionPackage', 'DistributionHeader']\r
ccaa7754 100 CheckDict = CheckDict = {'DistributionHeader': '', }\r
4234283c
LG
101 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
102\r
103 #\r
104 # Check Each Package\r
105 #\r
106 for Key in self.DistP.PackageSurfaceArea:\r
107 ValidatePackageSurfaceArea(self.DistP.PackageSurfaceArea[Key])\r
108\r
109 #\r
110 # Check Each Module\r
111 #\r
112 for Key in self.DistP.ModuleSurfaceArea:\r
113 ValidateMS(self.DistP.ModuleSurfaceArea[Key], ['DistributionPackage', 'ModuleSurfaceArea'])\r
114\r
115 #\r
f7496d71 116 # Check Each Tool\r
4234283c
LG
117 #\r
118 if self.DistP.Tools:\r
119 XmlTreeLevel = ['DistributionPackage', 'Tools', 'Header']\r
ccaa7754 120 CheckDict = {'Name': self.DistP.Tools.GetName(), }\r
4234283c
LG
121 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
122\r
123 if not self.DistP.Tools.GetFileList():\r
124 XmlTreeLevel = ['DistributionPackage', 'Tools']\r
ccaa7754 125 CheckDict = {'FileName': None, }\r
4234283c
LG
126 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
127 for Item in self.DistP.Tools.GetFileList():\r
128 XmlTreeLevel = ['DistributionPackage', 'Tools']\r
ccaa7754 129 CheckDict = {'FileName': Item.GetURI(), }\r
4234283c
LG
130 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
131\r
132 #\r
133 # Check Each Misc File\r
134 #\r
135 if self.DistP.MiscellaneousFiles:\r
136 XmlTreeLevel = ['DistributionPackage', 'MiscellaneousFiles', 'Header']\r
ccaa7754 137 CheckDict = {'Name': self.DistP.MiscellaneousFiles.GetName(), }\r
4234283c
LG
138 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
139\r
140 if not self.DistP.MiscellaneousFiles.GetFileList():\r
141 XmlTreeLevel = ['DistributionPackage', 'MiscellaneousFiles']\r
ccaa7754 142 CheckDict = {'FileName': None, }\r
4234283c
LG
143 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
144 for Item in self.DistP.MiscellaneousFiles.GetFileList():\r
145 XmlTreeLevel = ['DistributionPackage', 'MiscellaneousFiles']\r
ccaa7754 146 CheckDict = {'FileName': Item.GetURI(), }\r
4234283c
LG
147 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
148\r
149 #\r
150 # Check Each Distribution Level User Extension\r
151 #\r
152 for Item in self.DistP.UserExtensions:\r
153 XmlTreeLevel = ['DistributionPackage', 'UserExtensions']\r
ccaa7754 154 CheckDict = {'UserId': Item.GetUserID(), }\r
4234283c
LG
155 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
156\r
157\r
158 def FromXml(self, Filename=None):\r
4231a819 159 if Filename is not None:\r
4234283c
LG
160 self.DistP = DistributionPackageClass()\r
161 #\r
162 # Load to XML\r
163 #\r
164 self.Pkg = XmlParseFile(Filename)\r
165\r
166 #\r
167 # Parse Header information\r
168 #\r
169 Tmp = DistributionPackageHeaderXml()\r
170 DistributionPackageHeader = \\r
171 Tmp.FromXml(XmlNode(self.Pkg, '/DistributionPackage/DistributionHeader'), 'DistributionHeader')\r
172 self.DistP.Header = DistributionPackageHeader\r
173 #\r
174 # Parse each PackageSurfaceArea\r
175 #\r
176 for Item in XmlList(self.Pkg, '/DistributionPackage/PackageSurfaceArea'):\r
177 Psa = PackageSurfaceAreaXml()\r
178 Package = Psa.FromXml(Item, 'PackageSurfaceArea')\r
179 self.DistP.PackageSurfaceArea[(Package.GetGuid(), \\r
180 Package.GetVersion(), \\r
181 Package.GetPackagePath())] = \\r
182 Package\r
183 #\r
184 # Parse each ModuleSurfaceArea\r
185 #\r
186 for Item in XmlList(self.Pkg, '/DistributionPackage/ModuleSurfaceArea'):\r
187 Msa = ModuleSurfaceAreaXml()\r
188 Module = Msa.FromXml(Item, 'ModuleSurfaceArea', True)\r
d0acc87a
LG
189 ModuleKey = (Module.GetGuid(), Module.GetVersion(), Module.GetName(), Module.GetModulePath())\r
190 self.DistP.ModuleSurfaceArea[ModuleKey] = Module\r
191\r
f7496d71 192 #\r
4234283c
LG
193 # Parse Tools\r
194 #\r
195 Tmp = MiscellaneousFileXml()\r
196 self.DistP.Tools = Tmp.FromXml2(XmlNode(self.Pkg, '/DistributionPackage/Tools'), 'Tools')\r
197\r
198 #\r
199 # Parse MiscFiles\r
200 #\r
201 Tmp = MiscellaneousFileXml()\r
202 self.DistP.MiscellaneousFiles = \\r
203 Tmp.FromXml2(XmlNode(self.Pkg, \\r
204 '/DistributionPackage/MiscellaneousFiles'), \\r
205 'MiscellaneousFiles')\r
206\r
207 #\r
208 # Parse UserExtensions\r
209 #\r
210 for Item in XmlList(self.Pkg, '/DistributionPackage/UserExtensions'):\r
211 Tmp = UserExtensionsXml()\r
212 self.DistP.UserExtensions.append(Tmp.FromXml2(Item, 'UserExtensions'))\r
213\r
214 #\r
215 # Check Required Items for XML\r
216 #\r
217 self.ValidateDistributionPackage()\r
218\r
219 return self.DistP\r
220\r
221 def ToXml(self, DistP):\r
222 if self.DistP:\r
223 pass\r
4231a819 224 if DistP is not None:\r
4234283c
LG
225 #\r
226 # Parse DistributionPackageHeader\r
227 #\r
228 Attrs = [['xmlns', 'http://www.uefi.org/2011/1.1'],\r
229 ['xmlns:xsi', 'http:/www.w3.org/2001/XMLSchema-instance'],\r
230 ]\r
231 Root = CreateXmlElement('DistributionPackage', '', [], Attrs)\r
232\r
233 Tmp = DistributionPackageHeaderXml()\r
234 Root.appendChild(Tmp.ToXml(DistP.Header, 'DistributionHeader'))\r
235 #\r
236 # Parse each PackageSurfaceArea\r
237 #\r
238 for Package in DistP.PackageSurfaceArea.values():\r
239 Psa = PackageSurfaceAreaXml()\r
240 DomPackage = Psa.ToXml(Package)\r
241 Root.appendChild(DomPackage)\r
242 #\r
243 # Parse each ModuleSurfaceArea\r
244 #\r
245 for Module in DistP.ModuleSurfaceArea.values():\r
246 Msa = ModuleSurfaceAreaXml()\r
247 DomModule = Msa.ToXml(Module)\r
248 Root.appendChild(DomModule)\r
f7496d71 249 #\r
4234283c
LG
250 # Parse Tools\r
251 #\r
252 Tmp = MiscellaneousFileXml()\r
253 ToolNode = Tmp.ToXml2(DistP.Tools, 'Tools')\r
254 if ToolNode is not None:\r
255 Root.appendChild(ToolNode)\r
256 #\r
257 # Parse MiscFiles\r
258 #\r
259 Tmp = MiscellaneousFileXml()\r
260 MiscFileNode = Tmp.ToXml2(DistP.MiscellaneousFiles,\r
261 'MiscellaneousFiles')\r
262 if MiscFileNode is not None:\r
263 Root.appendChild(MiscFileNode)\r
264\r
265 XmlContent = Root.toprettyxml(indent=' ')\r
266\r
267\r
268 #\r
269 # Remove empty element\r
270 #\r
271 XmlContent = re.sub(r'[\s\r\n]*<[^<>=]*/>', '', XmlContent)\r
272\r
273 #\r
274 # Remove empty help text element\r
275 #\r
276 XmlContent = re.sub(r'[\s\r\n]*<HelpText Lang="en-US"/>', '',\r
277 XmlContent)\r
278\r
279 #\r
280 # Remove SupArchList="COMMON" or "common"\r
281 #\r
282 XmlContent = \\r
283 re.sub(r'[\s\r\n]*SupArchList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*COMMON'\r
284 '[\s\r\n]*"', '', XmlContent)\r
285 XmlContent = \\r
286 re.sub(r'[\s\r\n]*SupArchList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*common'\r
287 '[\s\r\n]*"', '', XmlContent)\r
288 #\r
289 # Remove <SupArchList> COMMON </SupArchList>\r
290 #\r
291 XmlContent = \\r
292 re.sub(r'[\s\r\n]*<SupArchList>[\s\r\n]*COMMON[\s\r\n]*'\r
293 '</SupArchList>[\s\r\n]*', '', XmlContent)\r
294\r
295 #\r
296 # Remove <SupArchList> common </SupArchList>\r
297 #\r
298 XmlContent = \\r
299 re.sub(r'[\s\r\n]*<SupArchList>[\s\r\n]*'\r
300 'common[\s\r\n]*</SupArchList>[\s\r\n]*', '', XmlContent)\r
301\r
302 #\r
303 # Remove SupModList="COMMON" or "common"\r
f7496d71 304 #\r
4234283c
LG
305 XmlContent = \\r
306 re.sub(r'[\s\r\n]*SupModList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*COMMON'\r
307 '[\s\r\n]*"', '', XmlContent)\r
308 XmlContent = \\r
309 re.sub(r'[\s\r\n]*SupModList[\s\r\n]*=[\s\r\n]*"[\s\r\n]*common'\r
310 '[\s\r\n]*"', '', XmlContent)\r
311\r
312 return XmlContent\r
313\r
314 return ''\r
315\r
316## ValidateMS\r
317#\r
318# Check if any required item is missing in ModuleSurfaceArea\r
319#\r
320# @param Module: The ModuleSurfaceArea to be checked\r
f7496d71 321# @param XmlTreeLevel: The top level of Module\r
4234283c
LG
322#\r
323def ValidateMS(Module, TopXmlTreeLevel):\r
324 ValidateMS1(Module, TopXmlTreeLevel)\r
325 ValidateMS2(Module, TopXmlTreeLevel)\r
326 ValidateMS3(Module, TopXmlTreeLevel)\r
327\r
328## ValidateMS1\r
329#\r
330# Check if any required item is missing in ModuleSurfaceArea\r
331#\r
332# @param Module: The ModuleSurfaceArea to be checked\r
f7496d71 333# @param XmlTreeLevel: The top level of Module\r
4234283c
LG
334#\r
335def ValidateMS1(Module, TopXmlTreeLevel):\r
336 #\r
337 # Check Guids -> GuidCName\r
338 #\r
339 XmlTreeLevel = TopXmlTreeLevel + ['Guids']\r
340 for Item in Module.GetGuidList():\r
4231a819 341 if Item is None:\r
4234283c
LG
342 CheckDict = {'GuidCName':''}\r
343 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
344\r
345 XmlTreeLevel = TopXmlTreeLevel + ['Guids', 'GuidCName']\r
346 for Item in Module.GetGuidList():\r
347 CheckDict = {'CName':Item.GetCName(),\r
348 'GuidType':Item.GetGuidTypeList(),\r
349 'Usage':Item.GetUsage()}\r
350 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
351\r
352 if Item.GetVariableName():\r
353 Result = ConvertVariableName(Item.GetVariableName())\r
354 if Result is None:\r
355 Msg = "->".join(Node for Node in XmlTreeLevel)\r
356 ErrorMsg = ERR_XML_INVALID_VARIABLENAME % (Item.GetVariableName(), Item.GetCName(), Msg)\r
357 Logger.Error('\nUPT', PARSER_ERROR, ErrorMsg, RaiseError=True)\r
358 else:\r
359 Item.SetVariableName(Result)\r
360\r
361 #\r
362 # Check Protocols -> Protocol\r
363 #\r
364 XmlTreeLevel = TopXmlTreeLevel + ['Protocols']\r
365 for Item in Module.GetProtocolList():\r
4231a819 366 if Item is None:\r
4234283c
LG
367 CheckDict = {'Protocol':''}\r
368 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
369\r
370 XmlTreeLevel = TopXmlTreeLevel + ['Protocols', 'Protocol']\r
371 for Item in Module.GetProtocolList():\r
372 CheckDict = {'CName':Item.GetCName(),\r
373 'Usage':Item.GetUsage()}\r
374 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
375\r
376 #\r
377 # Check PPIs -> Ppi\r
378 #\r
379 XmlTreeLevel = TopXmlTreeLevel + ['PPIs']\r
380 for Item in Module.GetPpiList():\r
4231a819 381 if Item is None:\r
4234283c
LG
382 CheckDict = {'Ppi':''}\r
383 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
384\r
385 XmlTreeLevel = TopXmlTreeLevel + ['PPIs', 'Ppi']\r
386 for Item in Module.GetPpiList():\r
387 CheckDict = {'CName':Item.GetCName(),\r
388 'Usage':Item.GetUsage()}\r
389 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
390\r
391 #\r
392 # Check PcdCoded -> Entry\r
393 #\r
394 XmlTreeLevel = TopXmlTreeLevel + ['PcdCoded']\r
395 for Item in Module.GetPcdList():\r
4231a819 396 if Item is None:\r
4234283c
LG
397 CheckDict = {'PcdEntry':''}\r
398 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
399\r
400 XmlTreeLevel = TopXmlTreeLevel + ['PcdCoded', 'PcdEntry']\r
401 for Item in Module.GetPcdList():\r
402 CheckDict = {'TokenSpaceGuidCname':Item.GetTokenSpaceGuidCName(),\r
403 'CName':Item.GetCName(),\r
404 'PcdUsage':Item.GetValidUsage(),\r
405 'PcdItemType':Item.GetItemType()}\r
406 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
407\r
408 #\r
409 # Check Externs -> Extern\r
410 #\r
411 XmlTreeLevel = TopXmlTreeLevel + ['Externs']\r
412 for Item in Module.GetExternList():\r
4231a819 413 if Item is None:\r
4234283c
LG
414 CheckDict = {'Extern':''}\r
415 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
416\r
417 #\r
f7496d71 418 # If SupArchList is used to identify different EntryPoint, UnloadImage, Constructor/Destructor elements and\r
4234283c 419 # that SupArchList does not match ModuleSurfaceArea.ModuleProperties:SupArchList, the tool must exit gracefully,\r
f7496d71
LG
420 # informing the user that the EDK II Build system does not support different EntryPoint, UnloadImage,\r
421 # Constructor or Destructor elements based on Architecture type. Two SupArchList attributes are considered\r
4234283c
LG
422 # identical if it lists the same CPU architectures in any order.\r
423 #\r
424 for Item in Module.GetExternList():\r
425 if len(Item.SupArchList) > 0:\r
426 if not IsEqualList(Item.SupArchList, Module.SupArchList):\r
427 Logger.Error('\nUPT',\r
428 PARSER_ERROR,\r
429 ERR_XML_INVALID_EXTERN_SUPARCHLIST % (str(Item.SupArchList), str(Module.SupArchList)),\r
430 RaiseError=True)\r
431\r
432 #\r
433 # Check DistributionPackage -> ModuleSurfaceArea -> UserExtensions\r
434 #\r
435 XmlTreeLevel = TopXmlTreeLevel + ['UserExtensions']\r
436 for Item in Module.GetUserExtensionList():\r
437 CheckDict = {'UserId':Item.GetUserID(), 'Identifier':Item.GetIdentifier()}\r
438 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
439\r
440 #\r
441 # Check DistributionPackage -> PackageSurfaceArea -> MiscellaneousFiles -> Filename\r
442 #\r
443 XmlTreeLevel = TopXmlTreeLevel + ['MiscellaneousFiles']\r
444 for Item in Module.GetMiscFileList():\r
445 if not Item.GetFileList():\r
ccaa7754 446 CheckDict = {'Filename': '', }\r
4234283c
LG
447 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
448 for File in Item.GetFileList():\r
ccaa7754 449 CheckDict = {'Filename': File.GetURI(), }\r
4234283c
LG
450\r
451## ValidateMS2\r
452#\r
453# Check if any required item is missing in ModuleSurfaceArea\r
454#\r
455# @param Module: The ModuleSurfaceArea to be checked\r
f7496d71 456# @param XmlTreeLevel: The top level of Module\r
4234283c
LG
457#\r
458def ValidateMS2(Module, TopXmlTreeLevel):\r
459 #\r
460 # Check Header\r
461 #\r
462 XmlTreeLevel = TopXmlTreeLevel + ['Header']\r
463 CheckDict = Sdict()\r
464 CheckDict['Name'] = Module.GetName()\r
465 CheckDict['BaseName'] = Module.GetBaseName()\r
466 CheckDict['GUID'] = Module.GetGuid()\r
467 CheckDict['Version'] = Module.GetVersion()\r
468 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
469\r
470 #\r
471 # Check ModuleProperties\r
472 #\r
473 XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties']\r
474 CheckDict = {'ModuleType':Module.GetModuleType(),\r
475 'Path':Module.GetModulePath()}\r
476 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
477\r
478 if not IsValidInstallPath(Module.GetModulePath()):\r
479 Logger.Error("UPT", FORMAT_INVALID, ERR_FILE_NAME_INVALIDE % Module.GetModulePath())\r
480\r
481 #\r
f7496d71 482 # Check ModuleProperties->BootMode\r
4234283c
LG
483 #\r
484 XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['BootMode']\r
485 for Item in Module.GetBootModeList():\r
486 CheckDict = {'Usage':Item.GetUsage(),\r
487 'SupportedBootModes':Item.GetSupportedBootModes()}\r
488 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
489\r
490 #\r
f7496d71 491 # Check ModuleProperties->Event\r
4234283c
LG
492 #\r
493 XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['Event']\r
494 for Item in Module.GetEventList():\r
495 CheckDict = {'Usage':Item.GetUsage(),\r
496 'EventType':Item.GetEventType()}\r
497 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
498\r
499 #\r
f7496d71 500 # Check ModuleProperties->Hob\r
4234283c
LG
501 #\r
502 XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['HOB']\r
503 for Item in Module.GetHobList():\r
504 CheckDict = {'Usage':Item.GetUsage(),\r
505 'HobType':Item.GetHobType()}\r
506 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
507\r
508 #\r
f7496d71
LG
509 # The UDP Specification supports the module type of UEFI_RUNTIME_DRIVER, which is not present in the EDK II INF\r
510 # File Specification v. 1.23, so UPT must perform the following translation that include the generation of a\r
4234283c
LG
511 # [Depex] section.\r
512 #\r
513 if Module.ModuleType == "UEFI_RUNTIME_DRIVER":\r
514 Module.ModuleType = "DXE_RUNTIME_DRIVER"\r
515 DxeObj = DepexObject()\r
516 DxeObj.SetDepex("gEfiBdsArchProtocolGuid AND \ngEfiCpuArchProtocolGuid AND\n" + \\r
517 "gEfiMetronomeArchProtocolGuid AND \ngEfiMonotonicCounterArchProtocolGuid AND\n" + \\r
518 "gEfiRealTimeClockArchProtocolGuid AND \ngEfiResetArchProtocolGuid AND\n" + \\r
519 "gEfiRuntimeArchProtocolGuid AND \ngEfiSecurityArchProtocolGuid AND\n" + \\r
520 "gEfiTimerArchProtocolGuid AND \ngEfiVariableWriteArchProtocolGuid AND\n" + \\r
521 "gEfiVariableArchProtocolGuid AND \ngEfiWatchdogTimerArchProtocolGuid")\r
522 DxeObj.SetModuleType(['DXE_RUNTIME_DRIVER'])\r
523 Module.PeiDepex = []\r
524 Module.DxeDepex = []\r
525 Module.SmmDepex = []\r
526 Module.DxeDepex.append(DxeObj)\r
527\r
528 #\r
529 # Check LibraryClassDefinitions -> LibraryClass\r
530 #\r
531 XmlTreeLevel = TopXmlTreeLevel + ['LibraryClassDefinitions']\r
532 for Item in Module.GetLibraryClassList():\r
4231a819 533 if Item is None:\r
4234283c
LG
534 CheckDict = {'LibraryClass':''}\r
535 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
536\r
537 XmlTreeLevel = TopXmlTreeLevel + ['LibraryClassDefinitions', 'LibraryClass']\r
538\r
539 IsLibraryModule = False\r
540 LibrarySupModList = []\r
541 for Item in Module.GetLibraryClassList():\r
542 CheckDict = {'Keyword':Item.GetLibraryClass(),\r
543 'Usage':Item.GetUsage()}\r
544 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
545 #\r
f7496d71 546 # If the LibraryClass:SupModList is not "UNDEFINED" the LIBRARY_CLASS entry must have the list\r
4234283c
LG
547 # appended using the format:\r
548 # LIBRARY_CLASS = <ClassName> ["|" <Edk2ModuleTypeList>]\r
549 #\r
550 # Edk2ModuleTypeList ::= <ModuleType> [" " <ModuleType>]{0,}\r
551 # <ModuleTypes> ::= {"BASE"} {"SEC"} {"PEI_CORE"} {"PEIM"}\r
552 # {"DXE_CORE"} {"DXE_DRIVER"} {"SMM_CORE"}\r
553 # {"DXE_SMM_DRIVER"} {"DXE_RUNTIME_DRIVER"}\r
554 # {"DXE_SAL_DRIVER"} {"UEFI_DRIVER"}\r
555 # {"UEFI_APPLICATION"} {"USER_DEFINED"}\r
556 #\r
557 if len(Item.SupModuleList) > 0:\r
558 for SupModule in Item.SupModuleList:\r
559 if not IsValidInfMoudleType(SupModule):\r
560 Logger.Error('\nUPT',\r
561 PARSER_ERROR,\r
562 ERR_XML_INVALID_LIB_SUPMODLIST % (Item.LibraryClass, str(SupModule)),\r
563 RaiseError=True)\r
564\r
565 if Item.Usage == 'PRODUCES' or Item.Usage == 'SOMETIMES_PRODUCES':\r
566 IsLibraryModule = True\r
567 LibrarySupModList = Item.SupModuleList\r
568\r
569\r
570 #\r
f7496d71
LG
571 # For Library modules (indicated by a LIBRARY_CLASS statement in the [Defines] section)\r
572 # If the SupModList attribute of the CONSTRUCTOR or DESTRUCTOR element does not match the Supported Module\r
573 # Types listed after "LIBRARY_CLASS = <Keyword> |", the tool should gracefully exit with an error message\r
574 # stating that there is a conflict in the module types the CONSTRUCTOR/DESTRUCTOR is to be used with and\r
4234283c
LG
575 # the Module types this Library supports.\r
576 #\r
577 if IsLibraryModule:\r
578 for Item in Module.GetExternList():\r
579 if Item.Constructor or Item.Destructor:\r
580 if hasattr(Item, 'SupModList') and len(Item.SupModList) > 0 and \\r
581 not IsEqualList(Item.SupModList, LibrarySupModList):\r
582 Logger.Error('\nUPT',\r
583 PARSER_ERROR,\r
584 ERR_XML_INVALID_EXTERN_SUPMODLIST % (str(Item.SupModList), str(LibrarySupModList)),\r
585 RaiseError=True)\r
586\r
587 #\r
f7496d71
LG
588 # If the module is not a library module, the MODULE_TYPE listed in the ModuleSurfaceArea.Header must match the\r
589 # SupModList attribute. If these conditions cannot be met, the tool must exit gracefully, informing the user\r
4234283c 590 # that the EDK II Build system does not currently support the features required by this Module.\r
f7496d71 591 #\r
4234283c
LG
592 if not IsLibraryModule:\r
593 for Item in Module.GetExternList():\r
594 if hasattr(Item, 'SupModList') and len(Item.SupModList) > 0 and \\r
595 not IsEqualList(Item.SupModList, [Module.ModuleType]):\r
596 Logger.Error('\nUPT',\r
597 PARSER_ERROR,\r
598 ERR_XML_INVALID_EXTERN_SUPMODLIST_NOT_LIB % (str(Module.ModuleType), str(Item.SupModList)),\r
599 RaiseError=True)\r
600 #\r
601 # Check SourceFiles\r
602 #\r
603 XmlTreeLevel = TopXmlTreeLevel + ['SourceFiles']\r
604 for Item in Module.GetSourceFileList():\r
4231a819 605 if Item is None:\r
4234283c
LG
606 CheckDict = {'Filename':''}\r
607 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
608\r
609 XmlTreeLevel = TopXmlTreeLevel + ['SourceFiles']\r
610 for Item in Module.GetSourceFileList():\r
611 CheckDict = {'Filename':Item.GetSourceFile()}\r
612 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
613\r
614 for ItemCount in range(len(Module.GetBinaryFileList())):\r
615 Item = Module.GetBinaryFileList()[ItemCount]\r
616 if Item and len(Item.FileNamList) > 0 and Item.FileNamList[0].FileType == 'FREEFORM':\r
617 Item.FileNamList[0].FileType = 'SUBTYPE_GUID'\r
618 Module.GetBinaryFileList()[ItemCount] = Item\r
4234283c
LG
619\r
620## ValidateMS3\r
621#\r
622# Check if any required item is missing in ModuleSurfaceArea\r
623#\r
624# @param Module: The ModuleSurfaceArea to be checked\r
f7496d71 625# @param XmlTreeLevel: The top level of Module\r
4234283c
LG
626#\r
627def ValidateMS3(Module, TopXmlTreeLevel):\r
628 #\r
629 # Check PackageDependencies -> Package\r
630 #\r
631 XmlTreeLevel = TopXmlTreeLevel + ['PackageDependencies']\r
632 for Item in Module.GetPackageDependencyList():\r
4231a819 633 if Item is None:\r
4234283c
LG
634 CheckDict = {'Package':''}\r
635 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
636\r
637 XmlTreeLevel = TopXmlTreeLevel + ['PackageDependencies', 'Package']\r
638 for Item in Module.GetPackageDependencyList():\r
639 CheckDict = {'GUID':Item.GetGuid()}\r
640 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
641\r
642 #\r
643 # Check BinaryFiles -> BinaryFile\r
644 #\r
645 for Item in Module.GetBinaryFileList():\r
4231a819 646 if Item is None:\r
4234283c
LG
647 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles']\r
648 CheckDict = {'BinaryFile':''}\r
649 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
650 if not Item.GetFileNameList():\r
651 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile']\r
652 CheckDict = {'Filename':''}\r
653 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
654\r
655 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile']\r
656 for File in Item.GetFileNameList():\r
657 CheckDict = {'Filename':File.GetFilename(),\r
658 'FileType':File.GetFileType()}\r
659 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
660 for AsBuilt in Item.GetAsBuiltList():\r
661 #\r
662 # Check LibInstance\r
f7496d71 663 #\r
4234283c
LG
664 if len(AsBuilt.LibraryInstancesList) == 1 and not AsBuilt.LibraryInstancesList[0]:\r
665 CheckDict = {'GUID':''}\r
666 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'LibraryInstances']\r
667 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
f7496d71 668\r
4234283c
LG
669 for LibItem in AsBuilt.LibraryInstancesList:\r
670 CheckDict = {'Guid':LibItem.Guid,\r
671 'Version':LibItem.Version}\r
672 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'LibraryInstances']\r
673 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
674\r
675 #\r
676 # Check PatchPcd\r
677 #\r
678 for PatchPcdItem in AsBuilt.PatchPcdList:\r
679 CheckDict = {'TokenSpaceGuidValue':PatchPcdItem.TokenSpaceGuidValue,\r
680 'PcdCName':PatchPcdItem.PcdCName,\r
681 'Token':PatchPcdItem.Token,\r
682 'DatumType':PatchPcdItem.DatumType,\r
683 'Value':PatchPcdItem.DefaultValue,\r
684 'Offset':PatchPcdItem.Offset}\r
685 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'PatchPcdValue']\r
686 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
687 #\r
688 # Check PcdError\r
689 #\r
690 for PcdErrorItem in PatchPcdItem.PcdErrorsList:\r
691 CheckDict = {'ErrorNumber':PcdErrorItem.ErrorNumber}\r
692 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt',\r
693 'PatchPcdValue', 'PcdError']\r
694 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
695 #\r
696 # Check PcdEx\r
697 #\r
698 for PcdExItem in AsBuilt.PcdExValueList:\r
699 CheckDict = {'TokenSpaceGuidValue':PcdExItem.TokenSpaceGuidValue,\r
700 'Token':PcdExItem.Token,\r
421ccda3 701 'DatumType':PcdExItem.DatumType}\r
4234283c
LG
702 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'PcdExValue']\r
703 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
704 #\r
705 # Check PcdError\r
706 #\r
707 for PcdErrorItem in PcdExItem.PcdErrorsList:\r
708 CheckDict = {'ErrorNumber':PcdErrorItem.ErrorNumber}\r
709 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt',\r
710 'PcdExValue', 'PcdError']\r
711 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
712 #\r
713 # Check SmmDepex\r
714 #\r
715 XmlTreeLevel = TopXmlTreeLevel + ['SmmDepex']\r
716 for Item in Module.GetSmmDepex():\r
717 CheckDict = {'Expression':Item.GetDepex()}\r
718 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
719\r
720 #\r
721 # Check PeiDepex\r
722 #\r
723 XmlTreeLevel = TopXmlTreeLevel + ['PeiDepex']\r
724 for Item in Module.GetPeiDepex():\r
725 CheckDict = {'Expression':Item.GetDepex()}\r
726 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
727\r
728 #\r
729 # Check DxeDepex\r
730 #\r
731 XmlTreeLevel = TopXmlTreeLevel + ['DxeDepex']\r
732 for Item in Module.GetDxeDepex():\r
733 CheckDict = {'Expression':Item.GetDepex()}\r
734 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
735\r
736 #\r
737 # Check <UserExtensions>\r
738 #\r
739 XmlTreeLevel = TopXmlTreeLevel + ['UserExtensions']\r
740 for Item in Module.GetUserExtensionList():\r
741 CheckDict = {'UserId':Item.GetUserID(), 'Identifier':Item.GetIdentifier()}\r
742 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
743\r
744## ValidatePS1\r
745#\r
746# ValidatePS1\r
747#\r
748def ValidatePS1(Package):\r
749 #\r
750 # Check DistributionPackage -> PackageSurfaceArea -> Header\r
751 #\r
752 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'Header']\r
753 CheckDict = Sdict()\r
754 CheckDict['Name'] = Package.GetName()\r
755 CheckDict['BaseName'] = Package.GetBaseName()\r
756 CheckDict['GUID'] = Package.GetGuid()\r
757 CheckDict['Version'] = Package.GetVersion()\r
758 CheckDict['PackagePath'] = Package.GetPackagePath()\r
759\r
760 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
761 if not IsValidInstallPath(Package.GetPackagePath()):\r
762 Logger.Error("UPT", FORMAT_INVALID, ERR_FILE_NAME_INVALIDE % Package.GetPackagePath())\r
763\r
764 #\r
765 # Check DistributionPackage -> PackageSurfaceArea -> ClonedFrom\r
766 #\r
767 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'ClonedFrom']\r
768 for Item in Package.GetClonedFromList():\r
4231a819 769 if Item is None:\r
4234283c
LG
770 CheckDict = Sdict()\r
771 CheckDict['GUID'] = ''\r
772 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
773 CheckDict = Sdict()\r
774 CheckDict['GUID'] = Item.GetPackageGuid()\r
775 CheckDict['Version'] = Item.GetPackageVersion()\r
776\r
777 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
778\r
779 #\r
780 # Check DistributionPackage -> PackageSurfaceArea -> LibraryClassDeclarations -> LibraryClass\r
781 #\r
782 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'LibraryClassDeclarations']\r
783 for Item in Package.GetLibraryClassList():\r
4231a819 784 if Item is None:\r
4234283c
LG
785 CheckDict = {'LibraryClass':''}\r
786 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
787\r
788 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'LibraryClassDeclarations', 'LibraryClass']\r
789 for Item in Package.GetLibraryClassList():\r
790 CheckDict = {'Keyword':Item.GetLibraryClass(),\r
791 'HeaderFile':Item.GetIncludeHeader()}\r
792 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
793\r
794 #\r
795 # Check DistributionPackage -> PackageSurfaceArea -> IndustryStandardIncludes -> IndustryStandardHeader\r
796 #\r
797 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'IndustryStandardIncludes']\r
798 for Item in Package.GetStandardIncludeFileList():\r
4231a819 799 if Item is None:\r
4234283c
LG
800 CheckDict = {'IndustryStandardHeader':''}\r
801 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
802\r
803 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'IndustryStandardIncludes', 'IndustryStandardHeader']\r
804 for Item in Package.GetStandardIncludeFileList():\r
805 CheckDict = {'HeaderFile':Item.GetFilePath()}\r
806 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
807\r
808 #\r
809 # Check DistributionPackage -> PackageSurfaceArea -> PackageIncludes -> PackageHeader\r
810 #\r
811 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PackageIncludes']\r
812 for Item in Package.GetPackageIncludeFileList():\r
4231a819 813 if Item is None:\r
4234283c
LG
814 CheckDict = {'PackageHeader':''}\r
815 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
816\r
817 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PackageIncludes', 'PackageHeader']\r
818 for Item in Package.GetPackageIncludeFileList():\r
819 CheckDict = {'HeaderFile':Item.GetFilePath()}\r
820 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
821\r
822## ValidatePS2\r
823#\r
824# ValidatePS2\r
825#\r
826def ValidatePS2(Package):\r
827 #\r
828 # Check DistributionPackage -> PackageSurfaceArea -> Modules -> ModuleSurfaceArea\r
829 #\r
830 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'Modules', 'ModuleSurfaceArea']\r
831 for Item in Package.GetModuleDict().values():\r
832 ValidateMS(Item, XmlTreeLevel)\r
833\r
834 #\r
835 # Check DistributionPackage -> PackageSurfaceArea -> GuidDeclarations Entry\r
836 #\r
837 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'GuidDeclarations']\r
838 for Item in Package.GetGuidList():\r
4231a819 839 if Item is None:\r
4234283c
LG
840 CheckDict = {'Entry':''}\r
841 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
842\r
843 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'GuidDeclarations', 'Entry']\r
844 for Item in Package.GetGuidList():\r
845 CheckDict = {'CName':Item.GetCName(),\r
846 'GuidValue':Item.GetGuid()}\r
847 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
848\r
849 #\r
850 # Check DistributionPackage -> PackageSurfaceArea -> ProtocolDeclarations -> Entry\r
851 #\r
852 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'ProtocolDeclarations']\r
853 for Item in Package.GetProtocolList():\r
4231a819 854 if Item is None:\r
4234283c
LG
855 CheckDict = {'Entry':''}\r
856 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
857\r
858 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'ProtocolDeclarations', 'Entry']\r
859 for Item in Package.GetProtocolList():\r
860 CheckDict = {'CName':Item.GetCName(),\r
861 'GuidValue':Item.GetGuid()}\r
862 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
863\r
864 #\r
865 # Check DistributionPackage -> PackageSurfaceArea -> PpiDeclarations -> Entry\r
866 #\r
867 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PpiDeclarations']\r
868 for Item in Package.GetPpiList():\r
4231a819 869 if Item is None:\r
4234283c
LG
870 CheckDict = {'Entry':''}\r
871 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
872\r
873 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PpiDeclarations', 'Entry']\r
874 for Item in Package.GetPpiList():\r
875 CheckDict = {'CName':Item.GetCName(),\r
876 'GuidValue':Item.GetGuid()}\r
877 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
878\r
879 #\r
880 # Check DistributionPackage -> PackageSurfaceArea -> PcdDeclarations -> Entry\r
881 #\r
882 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PcdDeclarations']\r
883 for Item in Package.GetPcdList():\r
4231a819 884 if Item is None:\r
4234283c
LG
885 CheckDict = {'PcdEntry':''}\r
886 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
887\r
888 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'PcdDeclarations', 'PcdEntry']\r
889 for Item in Package.GetPcdList():\r
890 CheckDict = {'TokenSpaceGuidCname':Item.GetTokenSpaceGuidCName(),\r
891 'Token':Item.GetToken(),\r
892 'CName':Item.GetCName(),\r
893 'DatumType':Item.GetDatumType(),\r
894 'ValidUsage':Item.GetValidUsage(),\r
895 'DefaultValue':Item.GetDefaultValue()}\r
896 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
897\r
898 #\r
899 # Check DistributionPackage -> PackageSurfaceArea -> UserExtensions\r
900 #\r
901 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'UserExtensions']\r
902 for Item in Package.GetUserExtensionList():\r
903 CheckDict = {'UserId':Item.GetUserID(), 'Identifier':Item.GetIdentifier()}\r
904 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
905\r
906 #\r
907 # Check DistributionPackage -> PackageSurfaceArea -> MiscellaneousFiles -> Filename\r
908 #\r
909 XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'MiscellaneousFiles']\r
910 for Item in Package.GetMiscFileList():\r
911 if not Item.GetFileList():\r
ccaa7754 912 CheckDict = {'Filename': '', }\r
4234283c
LG
913 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
914 for File in Item.GetFileList():\r
ccaa7754 915 CheckDict = {'Filename': File.GetURI(), }\r
4234283c
LG
916 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
917\r
918## ValidatePackageSurfaceArea\r
919#\r
920# Check if any required item is missing in PackageSurfaceArea\r
921#\r
f7496d71 922# @param Package: The PackageSurfaceArea to be checked\r
4234283c
LG
923#\r
924def ValidatePackageSurfaceArea(Package):\r
925 ValidatePS1(Package)\r
926 ValidatePS2(Package)\r