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